From 934762954b691371da905ffebf3aa6adf7dac98b Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Thu, 17 Nov 2011 21:30:51 -0800 Subject: [PATCH 001/846] 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 005/846] 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 002/846] 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 003/846] 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 004/846] 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 006/846] 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 007/846] 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 008/846] 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 009/846] 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 010/846] 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 011/846] 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 012/846] 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 013/846] 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 014/846] 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 015/846] 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 016/846] 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 017/846] 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 018/846] 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 019/846] 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 020/846] 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 021/846] 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 022/846] 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 023/846] 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 024/846] 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 025/846] 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 026/846] 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 027/846] 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 028/846] 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 029/846] 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 030/846] 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 031/846] 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 032/846] 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 033/846] 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 034/846] 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 035/846] 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 036/846] 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 037/846] 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 038/846] 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 039/846] 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 040/846] 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 041/846] 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 042/846] 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 043/846] 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 044/846] 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 045/846] 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 046/846] 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 047/846] 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 048/846] 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 049/846] 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 050/846] 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 051/846] 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 052/846] 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 053/846] 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 054/846] 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 055/846] 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 056/846] 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 057/846] 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 058/846] 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 059/846] 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 060/846] 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 061/846] 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 062/846] 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 063/846] 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 064/846] 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 065/846] 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 066/846] 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 067/846] 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 068/846] 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 069/846] 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 070/846] --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 071/846] 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 072/846] 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 073/846] 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 074/846] 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 075/846] 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 171/846] 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 172/846] 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 173/846] 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 174/846] 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 175/846] 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 176/846] 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 177/846] 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 c3caa248b392c62c07942b4fce32856d287783eb Mon Sep 17 00:00:00 2001 From: oveddan Date: Mon, 15 Dec 2014 23:24:35 -0500 Subject: [PATCH 178/846] 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 179/846] 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 cd956e5b6b73548fd4331caaf96c7781fc2b7149 Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Mon, 19 Jan 2015 12:13:16 -0800 Subject: [PATCH 180/846] 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 ec7b2fe1b2107960bd3982b7f82c281c0141b544 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Tue, 3 Feb 2015 17:54:28 -0800 Subject: [PATCH 181/846] 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

    -
    - © 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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�qkjc17_3HHY1>^1n}nis7Fx!_EMO6H!9s?NvDEz2-HD|l=< z@=>*@Mm}He7-*zVHn8yR0;p3Vl_pRych6yUwv5EDZ<)AiW#`xs^v5=B1;h9IHbUq| zE*~InoT}LHn(2;Dx#hzA?Smw`t|CU!fy!Q*$3Y@$h|%CTyB?XB*H7NX7|z0z&HJlJF=aKoJgP%IOs|E(Lv>W$ zOz1WXSzKM#GVM5c7D1^Jz<5QKU^XrpZh^6^BDwK4~6xurfAbVb1 ziPlt`K|d8cC%?;I^g2B%WSzH=E;dr&xl51eV>=|bb@;mKPe5-K9L*oJ=Tf;zxYcd- zlifp?ak;iWkQtx;{#@2|6X;W+Yx;Q&f8;~{ublP#;|D)cx+&tZs5 z&XE16gHTzm%8BX0L(xbqbegcs{Ht$BBXOV+?@IWO1Mv-!i}RGCkW1%1w-F{-vqqMV zmUc|Duog0mM$)fB1#8cQil$<9r|+cGCn5JWp%1;9yhIFbJBELql$gA#=5}#E_7d7q zKQtn5T{i3$&c=968>>w|LopP)ake9hAYUOx(}(ha;2=AxVomRIZGvr}A&O0Sqq_R< z$}tq@)-I=~^ZC96shv>6d(|%{D0XP4rTt~!#z+gyjK_M}RakyCu7aC#$JPrW64Fb7 z1QtM;(L%B@ZNFOhfWsvh#Xhd2RNY{L^|*EecB+Ed)(VYmEDZ$lNE6cKaQpauly~V_ zC%A7~={$*$7FPY2UdA~8?A_l)#)Oe0Ecac5eG{l6Jk_XD5%Vy^_9@>wxsD=E>;Py; zjxS>FZ0_cq^soBaEwdJ~CGJGqO3d9SCy`^9M{u?nEQR-K+4s3Vm@0euw8=_gNR;e; zhF0Kbg7j;iG2K~yx7$B4m7Q#IM9E0FQ~4 zSwe+5zHmzVSLx=G&GEYAX`ltS$r${qt~ z5s4d^&62#DdU>KMT1|&myOvi?uO@!FliZ5LT~D!b9--* zXZ0&+?pLSx8S+yK}U%CH>Idql53Ss4Pgg=&Gy@q%pj1E|`Jjm4mLezZ?eyh0h?6 z%rWn_1{zPia!gQF<^TMPqPF(S_y56tU}$VGVpH>SvH7J(_(G*@G$RA~a>T|xfBB6k zu1cQIDCluBBpP|fv(-K%}{Fafv!NZ}Mb+wR4Xm78M&_q7J^ohyiR775zh`O2vZJBc<| z1MevcpbC&2C;eHW{lWQ?^Jy~5xaw?pU$vj^GU2!#Cn6vpPJ1pmVYdwvO5^`X1^1QI9kj6iAhWuj>L^WBfrn9S=F4&_93rrjr`v!x&|Kr}gkbaoXf_Qbx0! z+A01Xr2{KKa0O-5^r73brUe(UsK3uAuW|-qL=ac>D14qBF>AK6cUp18?Vr%KT%40a zbxhVmu8e#9So+L%A+?sTOK7=f-j^{o5}v4XBv?Ad-rUb=Gar7lSPFB?^1!;Ls}8Dg zk(SC&(A{qbZ7{~#;_6nstX1Tu-t*;zJwt$qh=rOS%$tsv#(`f%tO7N@K=A02bBlgi zTf)hG<)10OSvhfQ{wUB%A{6LTGs7flgIv$xz>tDS{@I0U$thwX>uV`j3dXTiEcMObdkMiy3&yQs!u6B;~E+ zT)NXFno~xDhT@sWmY>xl2);zr4hbcOijVo!a;OR63L;}fujI|hbos6NZx?)STRa=l z+%KGLN4Rhy7s(8{viGY)vPlt+(bY-t@?4*n7&SnHL2%FAKuBMed93jLG@eDtPc5$G zHhj6daw#j|<34$!F$Qwyx2l@iA!@R_U^l)euFS;h0XfGxB7GH7a(7N>xgQTc8M~Dw z(Mc|%`J&{5eP;$WxyA5WapEf5OVz|MTE+B5e>#kf=95>s&*rQmu2m_xRGkd&Ec{LT z`aAI`g@_Uwyzg}8SC|J6rHlb?d@UxtCs-dqmhkM=n@|JCjdD zE?>8I2_92|n$HrBaGw0Hv4z5urTE>*vT-Mye-D^aJoai`Nm4?6_o{@t_Let80qxxh+N7ZaR`A-PD6h02H%&^l}M*tktb^>H3Vi{KY-fHdWFECyb zr!lcT`D#}h$_OTiJ4ablFP^LfwGnP@zjtuo zK)*TedFTET4ybMqX$ukkZtA1nJbB&a=b2V?Cz~%})%;xTgfh#(`M@A}J#-rN>nRl^ zx>O@fw6(smtPqN|^#rO}tk>&@IRScrKNFR41p=Ii09*K-gRcl<%@BS#c}wPmi9Z^K zxe%%sVUqmrbGW^VO5m8so3=_sX8jA?CYY)$R@Y*t zvT$h#1{3MBdF$`(^AB;RpncxRMWshfPj7o>sluj+?nZ=$imU$kM-wjJ+0|MlnPxAL zsA?Y5#BA(-d(Ib8oNuM=^b-!8db8e|5`At5g+)4yK`(f)NzqEa?EIZ zOF)UDtpxpV-aoj++Zg164G#B~6mi65CCbTZ=~9&=I`LZ0oc0(cK+xr;DclK1sI&>i z@5!gfY}&0Hjl{H(xMC8d4q*3^dx=>Z zn8B+O=LE5j|l9&9j`xwK0e<7zjUWl z@A6tP8RSH4-AopQJ{p}xO1YX1LS}zoaOH3d5KpU7<1?5VCa3b>*%w(dNHQbrUS7~g z-aLJUB{Lfc2@G-}rYWH&N`Go+3E(wo&V@YJC>tuWlo23Yvh>Md#+vk=oX)cE|U4QWiT;MQ4+QFUWE6s*kL%YzXWHWEQnA z{EC8;F3O2K5@*{BJ7TW#EVwpJ(8%>B*sr1UAqYHv&oB=48Kfyt1LnVP@HExb( zmw0f(A_68g9+^f|92Ft{Em6S=+ftv?48Z^It#d+-5Z8NJs$F^Hanslp%=>-XJfA){ zfR!f&nm56~bUzJJ{M%=EThW|~HhJ1vR#)bgp3AY%>k{h&)jvV`p6BNu8il5+j6nNv zJncYxE8_WcOIeVs^sma93F;k$1{?mBiti28BKm|F1n`1g#$VOmYAzTeVB6 zA)$lxsyEpiIJF(dx|02%we5jXk~+*9155IF`>)ROxgpEOaj1V~vAGl6q$|td z_1g8Y>I;Nw`GS5W*X#YmmN%hiOBnE>ygnB8+wsHFei$EJ_1ptLuZz#$ej6XyQb_`q zQ5evEsF8etHULddz)M0tCbn|X)N2ojuV#H(;*y_GdHf05f1*__H(m3O91WW;(oL5( zUJJobW2mK6D`qa5m48c*^(-W9MJGiKhT3&P#&dgWC9n;YK|itNEVzp$H6a3PdBO>= zoiGH4E^7MBZyYs6)npjr;t_5G!YeE^M|bF{{=B>`HkZkB_COAKo*#rw@4$YPo==6hzvVCT#6ylK{5x|o+uJ5GVGw1sto+oHF8D=D zv=`1e<9#@LcP%Q-LpzhsFL>Xd!iE0)ew<9$!_Hh2Urc2w^IjA+1W)X^=h*`zO#4kx zRE67~)qLd);~ikUoQh#9RC|Yr2(0fGM9_L`mO-yM-d$2L??(rJ99$&$&_bH#@};g! zeQqaFXlC2M>ZO{7w4~~|foeo1bipAoKyi=Z_eq;>FoJ36?xbkxd?9mO@{@Mv+-o|t#)C3ZH%>g~G;1YW)pyhu%@*J}KJ=0L!sJ<6 z+o03~q}(|EpxiDWu~GS9X)S9!Ex-fa!6IW)WvqZ?*joZVuzBq>&l!NMRlm-KCYET! zgc!1Iaka+RY66;4hZR1FRtSeJqsO6rc6>qN=NCZT>kS-}J%Vn4YFobm-n(l{7<09O zDpg*QVl-Y5y!P?7aJVj!8SY6@83eeB`Nk)jMh|yW+NRt4MC1kG94|FjHK0#CXwB{b zms+%nv+FmXsgdy=2eNVdHnecbHO|olx=zgb>wk;{9WqGb=QbiW4O%e*5QF=zsO^ z>POIw!nfE>S5@@rYz-6}=RdY6)*U6YFgDled(ObER{t4u&Supz_m!N2KnwHQEQjZ? z;AIr6(dKW=S1JBvcK9kn-$QIrwaMh+!KJ{Uek?(#UlrWTJ~cnzc1AAu-^W?>bsQdv zmBxF;(WixB_9N_W2RDZ(?wDXsY=@|NDI7A_=K%b>db@^0@;02hV8NySVn5?-aw&P^ z&Q&0z*WY#e)t9voC1ZzS6?GZ^7b%<-2mIGUywZJyz(^T)p)y@K4bnqKbzq+H! zKdR3Q!l^ZHN-Rm#7_L+o#CJ+{aO_KfYAz%%#2K9dpGL?*zAsrVC=tKzck16oq--y^}dQIvsuoOwhe)=d@=5sA} zSO*4{k0}l=?55Z?&W1nfc6O90kVxfZuo?? z`4i4eIMtpq`;YNp(Foviie0~_NjkwhBj)!0(Aw@$?S5DoBn`H_TTK$I|LtKu1{d3W ztT-WWLdGLfKLV17eqP$S9|SCmjQJ10De+Z6xx`ZF#l=_an#adxy<#3~x$?x!*l^Nh z-JayJ+Zt#Z?^E#Nj*|*gH*X~Y9M-`#eYUowjR8=0@}$*IXgZUo2@Fak`S z#qjv~c@bM%fLLAj^QwV<3&YZi_dwUb}_ap`w0>DnlWA*)UN3Lf7@PnQAG;M9bNWb}-M|`e{--HzE}E*xIj8gc z3^gf_g!Y?A0Y2!r_OD6c;!caPHRB3b9}zwM3A`H0A{g5vS`N(fVvvux`U>DhFx)_3 zA5cR_SWUt%Ku}0Ik2lPpvMIfzUz|EAax9uL9wbLndtFvoh=9x3;q<_qvIhxUVIVSP zF8|`UZ;)RCFE>4SxdHr9eSCc?<24IUPW}eEyYsP$EdsN0;Zr#-SWdtbc^1?9xpcQFnN0u`O_SEOMVV?)Odd>9iR+4Ioj4la>KS1#U{_|4x0(v3EZtskB@U9c>S z8-DuKX*rCj$N2r$?IJS(kbGsAn6J~;JBdP}IlQR+r=N9x&2r<}BL_B#TU`Qwk9Rj2EU!YSHatD&Y$o%YBv)y<>z3IE#ou?ZB|2A2vvAbpS0LZ z*J;44JM=I-p6QRaN}0#E|BwDaIBsuqn?2!h>3x3L!8`3zM7ti*>-gC)Vmu8mTof^1 z?3XAD?!lvR9fl*U8DD$u)_(onqGP_hF0$>PKj3d)*Djz$Z#N~2Qb|y~k;r!pbf2x- zvQpnm$?0&&1UKR5#EGCfR9ublQ)Gs__p(nKj2&@%K3`6v>vCfl97-Ccl)z1RiBPD< zN8RXr!yYQ56-r^;5o$U7W^Z;pbmU{4AmwXKQ&G{HXKwtfyB@k4Vg~0phsCo>B}{Pa z^ln(%K$ZnvZxq?(b#_L`55d1y0_J6ndj^}@m5m8>VX_;(0EPT?#r*qwaTg-&84OxK zz!OmtP6PpUjSc#LLqHh}Uu^4jl)G;Xy!b_bRp^Pl+u#po_+;0D6%?Tu2=e+t77=xm z5YTa1Fqw)uHmN(A--Loc1DO%Uj6FCw=EiFu!6TvD&*#3+$NzUIw7*po4zVe5y;dj`9?`oUuK%kYpDaC2c~Je@-}y4YmVHq#_`9+uK0@|Vorsix7I9UDr&3xRf| zznR_I{(a-LB5>&|s?SMjf4(5s7QfdGt`p$8xR{ww8sVCsS9<@~_n3XiwFRH#J#^bv z78FO*Ei~TH(>U{sEbh6**3L_BvC3gVvTv!)j~(6f(1oog*oN5u_GiY8&!89woMd|h zo55ai6ZtH9tym8Z7-{JPdgg1Koj$~ZMZ-DnG-61p8cHwo_*b{4W@9l)H~v8VE?>3Y z+pWoFrVVY?_G!d*g_R8~Lf(t)?vJp-cK^`=9%CuQi)z4(9b$7A4F>*18L%pWB3VH) zY%T5*>)rW)nGOfqm&R{c6cGRrliQP(%i(0-z_8-aTm4O;69plev5NS+H5t)IM!Iok zc}PFWkc(;E=ZBL18sIzK@pUVt5~+oNShN1l&bjTdQL^oPVzd!4hSR?v5%As!T@X?b zg=YmW5WAAAd>b8r(Ikp?QMWw-+8J%4ytcULHfh#a_$}ttRG1~=Gq@op)7H`KxExO< z*PjmCmxgnkFtZMjs%Qy#t%*Y4<1Me{3PQISr+8iL`x@&E&)+hvb~9pa7*A|uG(&s? z3{YuO?Kjj`kCG(`A2pQv8Y4tA#zWZV&lmld(@y4c1=pK%V zF;tJ)KUgc2yWzEw*T5yiir-SxITam^;Btj;nlDSJkmMs(iXDBYfj^<#?W{Iood5PI zsX_aUYKC@XoXo8EKfse+8SD{ijZxE>10X)5X$`0+S`HOku%yq<#?RX4nD>6n0e4pM z(93g+gLee5RGMAoXPA*f-{RiB^nbP5SX!@kG%n0qOnV@p+QxK^<@RggVU!^aO-Q*j zPiOc_yx|T`2D7)A23CPMFfU1{9`-~UT3%i}$jB87T?$Nt$ju5=j}5p~hqc(X94f4K z@Lb2~k8OIaEU1S@tMmOtA~)86c2;o#q@lv;144Ovh?M5e?nnMnCz(e2@xpd}pq`dM z3&SW8uQLlEE{z=xQ*LN>zTb@93Z*3lhy<>8-+f>~8S(DjpBP6a1d_S*LMXcHH2tn0 zAyso$NsbYc*RKBTdIY^Uvs9#UDVW=U?}nWuZs)6OI{Z+b!nvUMHjy{0Semu!gBd|0 zBgnDHx`-5WA*75ldxTvxu%kNPk_C~W8`#{@MjwG?^zMFggg(n#oIxQ!lpdMm0z2sR zq9?($Z>%Vxq=F&;=I8OFTE8ZABV$GE4ojRRlx*H^M>lRa%f)ZV=b&6N?f&FRJ7r$8T z(s!t~e|vtZb?zJS*|V~N`Ga!qHf(brSxECFlk+L@FdmqJp&_0a+{@gX1@oT*=*U+l z={Fu0%h)hWJ&udS;7q;XY|S}AvNSUbk%nhJ82tG1;|FB-YpFWbQ5C}$1!?ktuPNF< zNs>NazZ$Z}WF_*IO4SXk41SO-DZgwoGq3EGF4hnrZbf|ifKURJsFPx_IDB161xnaX zqyPqe?61Z~GL!bh)Jur-P~NGQTTv@nKW4aAHiqo#e#F6F%4!bTD*lW?1@-bq>n!F| zV-(n8nKM=B;-CMw+G+r`Kut8}9(gTsupcHwI(H`~6MM)t?RIKSm|6R!+t^&Q=|~Eb zH9MA_w)l*O{;%}p-HNX1@_V5IDf3$roNXk^pHYR$e{N#b zD_cExe_|9Bi3Lk}9pHOf#gn=zjFxIHM;nZMm#5A$bjOzXZG$zNy$|wUf9FV$^1vUv zw2gxsZb~_84>sn*Q(M)3Dq9*${O5Zg^sn)ludjCooaXUGfs9~ucil^dBS>}mbvdK^ zu2k1+lrp^4(rGMsXbQkHKZ@ZY4^uNE|GI_wwG(2qBCrx~N#A2MSZ3+4gtuH%C{RmD zfKbaqmTr1WC z21ITG7C`fxwb0BzzDOOG;NF>2Pu;_!unoG1M|zXqnaqM?eDZzZ#j#}S2(sM&)OcjK zrTNp~oIKP~-qH{%W%EML{mo*d*CjbNpZSrc=Z-#i$hTFn`&WFr3^EQp-<8^UlrIKJ6RH?R|(TX4MV?}#%RN+#_7(nHZ3wPpTR z+9-K(bm`Wy)1y|jZGqU$iN4P)lEm6$BNSx+bZ-4ag*a&v2p^I8jnjlwB#z|4FT2?Y zI)zkp&+8E56D1G>u8(i$XX1#IFwR*B`M+3#=OA5c8{?+m5h@ouHzGe>mg7iRaLGhV z>7*HbBYd2AF|G(NS3;b{ zm`UHOI4rP>f!D>iDax{*72X(uxF<@CjlRd6b_JC;&2YEB7&V=S_)^(k87o7tQQ30|bx9tV_$pZ!!xP{~n38a&F%wY(Z-C``JC;$XiW;Z!z5BJvR*bpU9W_erD5(dLP$e~8HZV9E=Q69?N~HVf zzKW#NR~o+Ob99tQ(t7Uc1LMu4KL5KulNY%S_SNmG%xK=80Orn#U2Z*wFqOMvYmG7P zBOb=MVUaBKxU0=Sx9caN@=oSltO7YXxt`CzIAh~adXa+=o0Zg&rm_ub8F!$J*02;c zL;2UgRVd}#hjn13uMhnI@OtRqN*QxNgdL%s->Au7gE(H^@ko|+oGA<%eXz(jqRZ&O z#qLsLyG-tm2+k8h5t`F>QxTzSaM8jN7@BhphYEP>Y@V343PmVSLJ6mh$%l_ewADP> zrMKu1El?}a!&57sli{LQbxn@BEsl4jc?^?9*=gz?|i_|BW!%f~-;+gMYn? zi}VA=?N@rdqinnYs4u1Mq9ia<;_IeGl+lohpPsY)&&}~FC)z)(+}{^k0%zWD-4`z( zdxJmTJ3f#3&j*e#Ki^(!kUvF08paZ{qf63k^6D8|RnW&3@%++Lv+qcx3Ep;gaXD0v z-XkRLlT{PHLs!uMXr4b8+>`N_6R2K3)?l8lx5=FQkCb%)C|cv`qA&_MgL?cXKdQ)@ zjvW@q{H)?sg;M!J=`ab{!6Bf=xj2pYzDq<`X_y<81xVI&#i4jF5I5?bHK4l8XDl*SD-fE%J}=FQ3SR-Ta`@L zw$YoSEE1xK?x8KSY9P1WK6i$Gg3i_t+u?bcMEkzWJ#)b*j-ql^&ACH#FsagEaMen| z0xJfNy*H!?KCB?sA)By3&ftxFQ*U-AxX4fmjKICW>o%GwoR6Q8o+DA9B!qO5)@DRJ z50y%z#4#R*37qv!_y0}EHV9Noy-Hbw+-cdNeP_$LT1>fm>SjsPvUH4YXfieK1~9xD z4c`6vpb(FM8?>4|ER1sn2jDf_GOuz2+Vi#$LZ{R9>G z@w5SdlWvS;Oc1UVs=%HrerU)rz}wWg#Y}`wf^Lok$W}f4_Sb0n*SOep3UglzD`{aa zHrehp(6n4y-iO#VDvH~O`9_bU4dj^g!8`lRSD2HX$=aHr&N|ecq5j}+npT(P5R;7u zrH>y#B{qWF(cZmct?&n}61o-Zjq6NtXPnQus!Nc9@{Du;9;CR>uI(ppl5n16`V8|M1H5#VFUKRD z8x>-AHqi>fXt&ll@i}R(Fzj}2SdkHFu38Vr_k&1-cu<7=u?#iEBl-}tEF0etHZEb zBr-Bdj>Jbz8GpKK3R5sM>IQ1hw}9vx=f%Uxh3%d3QWb&<;uoPT;%OIb-=F_l>duFf z_Md?@fma3aC*81l(Crj;q`jP=P-akNZcgymN|upqA(qHvqCDHnC`{Y>Z%DMqaQuYw z=4vDkXo0^UV*|#Y*W`;kHa?m(Nhpr1fHo?)-O;R8#@Nf^ypOb zLK^3b8{cBImzafbWGL=)bEcr{bXL`-qp5oI`o|iNL7Z)a#IcP3N?x(VtRA&Nfuz&TF09|9~RA7Jz zI01XL4u1KsVRZM8Qm6PWU&dKJhqGaeVEf8!-Z<xB#$v@- z`UM*?S0KKVf*3nKYG=^Su^r^vh61^JwC>C;rcZCgHWorg$LAY+^Mit@bdD;0fEa&O z16QJ{+G5DOU~N7DTmZr}ONXiU4_*iKEWAf9=ksP|R0JxPd4a=KP?DKlEF*p)6|8P< zrdy0xZ2ON5H{5DUqT(kb6OhC0o5(Upja99Bfj!XY5hSF;Ob>UVKAiN$i5ZJli%%U= zjANH(q4bHe^e8**v~H@{^egRnaZ0(lPgXw4WviaMJ-3zABvXc1o%ZO1{bb!A9~?fQ zZKastinZX^>bH0z+#IaK+hq}j{Z?=lza)=ZJs_|^Btv3U91qU)KD9uKegrlVsSI%^ zwu4-H?}7wOwLskJgI38W(%El%2{eMBvihy*UA5Y2Fb||@+WpOS=D<_zrPv1U;tR3$ zjL=w``{t^i)a9QS=7^Hx7I8H0eoi%bKNEK?XKw5}vRA1l4!2*LC5^lS=j0?DftC@O zSQ7hly1c}~nqX`~>8RB5MsT2=Ub_0yNxs+Cuj?c5v~=NiGX9J4$l$@x)x=ya`!?LZ zb&u1x@Bzu1(RWW~!)`Kbt#KW3D@Q^I?^|GdHJU~XvUTdK=7j_U$`v111<)cu}@H!+f^vD1{q7~A}_xZnOA_x7lcj~UC6{M z3SjcZ_y0fnLOJ=R$fS_djYxuN3MFS-kXgrQnFIE;vb|+)l_8W2eXN|UDW}H!@6L-B zrPuv;jvgMKZ+DV*yjS?j9++X7uB_0HBff(~n{N=aosohU4Ok-l8W3P&ho92+S8+}Q z`x9KLD?qymPU0$NYtm7O@9Wd=5DQeR&+}LaI7odx!_&#RY#`~!8v!alsC)KTntvd6 zNq3uqawuoAv=BGl0LvEK#Wlp^HKHBjGL96-MZ?X5hDOvIo|}Y^hz87gpuY17VGl77 zEe_F@*Pzs$>+;=)fCL21?`xhNay~x@E`Nv&2Me{v3T@*G>WVS$I`U&}?dy8LzL zIY7C~V~teY=^QS``S2Uj#QIi_yTgo8C;tyP1?2V+Fj_B}*_@7jM_lG^TeKX8e)rR@ z#~HoR#nTo&m#RT3zPiKejXSdgP@Jp&)R`+qC@UE7^vE&@$zxH7@P#{dQYzyHp{I#- z!+c<&M;1ku-|zY<#M{wx6~}OTb)GdVOk=>+J9q?Xs|{C>GDC+!rCZpk6k*z$`Rj>B z-n|A?Hp)Xn5TaGR>&E7l^7Bhe4JCLm5C&QUaZcuNs|}RQM=sa=M zG8UL{gDm4<`dqLZ_QbMJ-V03NoDVk~oHU&`Nt?oXsvmRY1Q)xdU!4F1s~mbG^jIAB z+`n7#!s_H49hlvNf3Ce)8=T8^ACyWjCuYsAnoVWk)^6dx#^l%iZE$pbD-?vUc;28* zEERV2x4cVGll4-{ODP_BSn~trzR*h>VIyjD5_~Rx(F6Q#rmT%5khzkPn(1CsX|vzV zWvlblZ>{cOv6fDtx}kzu7QV!sC-4NuPY8t*o$~rh@3nBtigl-9eFCYBiO-wbYzfxs zh04#wXFPni&CgUX?NnEf5bh*tNQ8~f7uXeIgU-iRC);0?vtc zMQp8SCehZ5>Hn=K|7&O&#Y37hkrRks50nBMBMm@>->Srt3@64cbm!J#VQa8jTa8^v z9@$*VR)||O%n%dX;x1T`=(XoFGYlv`C}Rlt(@fPei}uc3R_YErli&-OY9md*1QnA^ z$(NceBWJ}31$+_h{QQuhQ-|bc!g0n$hGNPTCqX0`+Z@0RzEIZ38hbyaH!Yjl*)P}w z(`0P1*I|>Y@R1kp>AtsMqYGu}y$*>NT)%l-;e1j59AK}({5-x8g{Pe1pHbPfqUxXv zDaM>|`lo>PAB&5s`?aq_-RqEVM1;6H@-)pw-|kJqfs{q^BGyHC^G)<95qv`(cVoqk zmn7Lj^yDudN@9UYFD7s3U?+ZpBc%-lbPY8Ovnd#y)!K{kV-wmEPORP5IN_5r_Ahc3 zCQ6)iQu$tC*iT_=VCm8}RR@PYSTfm?x!R>CO{*sMs$GYWul`f2=fY#w=h_X<eMV(Q9!aka@a3aA#$0}KEXbK9x@-srJKASiBc~s&-?!%X zFx1~x1$fN zyYyD5E-J#_@6pe(|07HF7cJ5lIEu=x`tyrrQc~8+Gv4_xw6gA9$gbN>DJk7WNm8g_ z!6gQR&{}7#7T#AZJXk|$@f`^>#Dj<(jQv;0J8`1eKt-`lAy=8lsP)Nc1YY)G*LlTY zpS|=?#w|U;;&eb1{GBwt~F?!A}9APTlAkDdO{-UlFtdML_YnB^~Qz^ zKqn(3_{Vzg-aj~)OjcvMlc0@t{^w^5=gy%ofLA20^U!~Dn%~%-lNd>p?y8skq3HC9UejKkV;dBQ zb^B~if?;To|MZ$WZ%vl(?U1ZfEu2NcT*8kbE^n>agLRPo)e z6uNxjAWmS2+w=KDsJAr`RWSpht}a|Kb;qEuzObbmt?R8d+6qaSZo=&PxYb~Z1pAq5 zu*e#yJ~n4sPo|iBkkSEC$Dc;x<}p^}_*PQb4}7=e41~*uQ;(w$%2-hu-3?-Cv*EVC z?x@i%k+zHXxROBq$SO+6rJX}TI}Qp_GMPjV^81MEB;B}1d1CI9@L@wBUT&nrU{)7Q zqS+Kp!8X$e)+qhQL~Z!3_(LUsxVi3b2_=n~bUDOS!S?oxF6O)5M2BacPpfm}kxUJd z<6V_V8a@ss;|cpQiqw-$SXEZZUXN6(Dsz^C^AVYK?vj0>qa=@~XyGypBR|>?>4bT^ z2Ljg?`e0k& zYyI_l_5N#XAFpH>ce{pix1Q(Emi<@0UiquD#a-TdV<2?CKHB!HpBHW0tBL4`ygyoB zaE3W^YvPDgv=+qkwOuhssf^r5P8rvVIlkO{&8uB7M)XuXZ~7)Ka?7_m!eV`0U;W;q*j}Zlsf6Lg^4bJ@pIU0RGJX;uK3gxnGsf zk}(OVC$q@Dj0n4lNa1s`sXFcAf6&u26buO`sM0hFXc@xpPO1gr)i+z33p_fYU(HFr zoql}_oZJgSTK5CC?2XEWmFW-%ujx34nf<*KXBA#kxA}kM`Ao0EyMMxoKVDIyYAd5s z&w=9OAlKU(^M9tN2Q_0HOS_R_nYrP+EnpdWrXaPalQuo0VnuqlPU}FZkN&yS!&-s3 z$kpC?-}<85wV!UeF1I{$I?5p@Q|#^hWL{S-;5d*Pdu$C;bC$;@N1SK5}V<4l6s#6F0nQFJ7bQTl>5xVjjN#er!acH^L3<{5e#hEVC{#9~tKdso1z? zo^m#(Hc^&}-n8IlB21C3m$A`(SgJ>eV1fnE$9aTv>^lMYKF_`&WBkA<6H)cI% zt39}G6MeSI*UYGomVNd^V72v0IEOk9%`0U;!=dOMH;rD^dQ|7SB@f7{@){>k6$81} zzF)GgI$L3?jYBBqz3^#oMvsMN_sB8xS_peo&AiqduZZ&=j0whWXw~6*JXb8>qg35% zq@>ObY-kaLpg?WqrzM_2^0uUFT^mwn;5VG}LcjhC=EU(;uM#XiUPklO4u(j<+ot_2 z`q;0X$)Xk>#=fT*Vmao>!qWs9D)_2j$l(Q&(*_H{BKM*w;5u4i<>r>wTin2qJU-q+ zfZKwUKd`{ip~<_k^3#b;P(&u~s}=NieE}Vy0VNSmH#@ZG?qn~Rfzt#L`mfGd?GNaj z)C0ANa0rWuxe4Oo?%qXkg5>0qbRh%Qhh8?ZFhbMx%@9oQzF=c4;H?TZbfBaU5nd#v z3PWiu7V|rve-PrgIM1Rg=5HmOniLvpOuF06^JfX_slNU;_85kxLb)L=bv2L~wmC_2 z&VMMMdfmX(sNnnjj#Rq7%cfPo;3bay1m^>PcjfC+uh!ot9^p`DHFiOJ+r0(sTbO6R z&O;y`!;MymHy|9?Kw^9eT#M z5pE*l4MIK}uEc_z$W>~UGJ>)Ybd~5SM1rXoy~_+R4TpA9z@{u#v#I7v>pm5N5b3X; z1WipULbrg2HOzJqM2;fg6#bLzJR(1ThjF`-kU&rq=!wu|WwmouhQ+>lniU}2=cC4(5 zoaggf(GEjk#L%J4Y;!+rI){!YUBhPV@5-8?^-M?(j-bxSsCGT+Enm@dzB>H_19*h{ zp^EGn*J5qHSc^o$H($LY+55JOi+80A{19S~J;nnj-Ud>$X2ON1MStp5PfPo($nHpv`OqUE1&$QNr8rhcON8tOP}MukrpN zgz-bDhNVq5uOfNog!^W^w222M#!K(%A3_Cy@UsO|N+@}Pi)84!A z>%%`W$3LlAQ>{kO42PP6T&sz>fbjDYinoAn_OKh+8FnXch>>e*UZ?D(&f8{!j zb(qN`dgj(EUKE6xb!cn9w(VCQ9V?F*-zL@Q=YD*9Gi&iN5pN`QCicL1)qj_3n$@@(W?4vAzD_n zp2zvUwQD?eCKbADxwY7O9oje~m#@~goUv6quG30l=3(mSq2<uD3&*dFZum z%=g7bUQvC^>=YeX7aY66j#wiDJENVIkZ2b4mq$}QiTW{FM3BTtz- z4H)i9F@5#cA;sdF-*!&n*9YoNID5E%8gD?5CgLUNDMdW6dixUwFV#}Kgv^koD!dh* z@CgAfxJv%veeeQfqHFF*A@8eP;H**R9 zSWm_nW)n;oVNf1VF@?;Kx(mGsOVIZxjPe!b$zmQzSUl}M{MfcW9Z)!3JX*mG8!66o zS++4mT?gyI-LUIx?IcwcDslFmyvO z=~@^^@!|Lf_T!t_l;@AhBmYor*8EXsP3?toeyHEgcV*t+bx&c}=Rc{}{8?tb#^r<{ zUA{ln(@*UJyPCr6uDO*8`Y44VtJhO-TRQQ95|62)J-zhi1Nr>pG886|Kt@R(W~mlG z{^hBoT|aSBKqxQ(;WnP*jkG{LLQTAnsiPfVf*lyO0gx1d%J$fb2x=Mfw z&%9pK_+-g?0d#x|b+N7y?^%1RsIwM0sbJr$ye%^r6}TM|JY;e$F#Yi|K3?a64S$S2 zOu11k5g*L_{(V*YN%=c}t zgXYqtt*?pis^1~hgcq98q1j0b;(;b;10`Ot5JN*u@F796PcFnrBf^X5Tw_4N5dSF% z2#t!gNqc`;mOU!))RBoW0?wbXFBlp|%onv%b#C72xJ0IfUw-TY|8&y|F=1SP_$HI^ z!OSoP_objVMEnpYW~9f<1Nh@d#Sa;R;wJH$!bf$l3d?n_5N{L?yc zGX>1U@xqduoEmyEjKkrjl>0-xE^Plcn1MI8m$?)+iEYBV%GK7K+Ur& znn?MI^i<|a{c9L{aC~4IxZ{trR>T8Mpc&$YdoG|i0+a-qqHF~l^l*UKjt%a7=;V(( zwe=KCEU>g2&66iH1Mb_-jY4p%P@b9fEm56@B)*eJQmASYgs#T`1&jzAg@!xLp|ssD z%}n^%dOt45P9w`dD?6gQKX_%1KT_5o(glr8#LMO2f>_B7kTb78(1WQbaYv6*YvN83 znaq0EvpS7iA@H=UTNA@=oxY$280U~b7F}`)`%oTDlKWcQp zPeDZw4!8H$Kiy@Ik1~n#=Xv~#UHoayx-V&bx8onWfjj;c{j$=_8WZAau*#G!oSpM~teL1vzZAqO?b-1mmU|dHC zTW|f!x8wEkRSWz2ivGH$JQc@@M|&S-_rCS)AFt38A^~M;A(tq#fsUQ zx^jMzF$Y=MsCvJv#>||@zt^nkm&n#@)||(6D2^PWonL4Y#7Q{X)#MnEg5eIt>x^VO zBYeg@ULQTbcBs-E?VpE)n>a=F>hbGKE5E+JE-B~X`AB;TJ#119?H{?lvVDAX^mw(c zemNWmx2D0w6~}(-uV2^&cCxiN6_O$*jc;{ztBbbvXdf}RtX7R>Z$wzl8?2~oyD)aH zLE9UX5A)VEjBcnwqE*=R@IcLr<8l7LGsn+;?x^qo)esTlg(!mTgg8qZ#d5k1o8im7;|Wo0KN#58kbS*u1V^^6)yMW0bXEb)ay__{p^uELAR-)e*7$_3m7 z5HkVdngopd;77#&a_Ye16?cu<1ckxzg&g_)o%?!~6ER2Gs!;d45DHVD%nFU+i>gwy ziP0E(LiGk{UR9&3aVFg-oXsrbHkC{Z!^ct#H4-Rl68VC%qyuj9;m}V>5yrp$Ix+y_ z6@KX9T{LpUT#>bpg$kqDfDEf(?|G@9# zkfU?%E{dSp~*W75@Gvc0b(o5uWP#)9m<5Jzo7G+ea3jc$#IY|LapnMT2;K zUlI;41(CIQs_CQ0g`Tkj*#r*fuhU_Xl>0hBt!lL}#5kRVjt#u9eS)%q_n&mklGuNS zHnnC_r|==-e>sbIiI#}sySRwMvHppH9>2$6J1`|7vzmb2VU8;J&tXQ!bwnTx#BmWk zurNi6;`(Aa3>`G-H&1b{;1H_9^KFN0T;KnjxkY3dSw!(5HFa#Gw~iPhj49CLO3!3P z!5)dVg63ug*qyH5wgWohyk5P%Uitc~^~34aj~V06|AXy3-a7xsCi*qM3mFOlnD4!6 ze@`k=o5o*P<{VLH=f>V<_|wU{C{eSrWqiKXp-znV;j({fk-D80;4$8Z+xVRI{@jOJ zgtg53=lc`B&KXs6XC3Z$eSOBKZZbpN^>&KM8npoPS(mR4IVRM4O+Wi0s7ckU`DQaYk_rBq5m`GB`!G!J2@jS1gT!&^6Ce4-A92qZ5$^pvA9oiXMum3Cx+1kQYGRD0VCI4 zeeJ&};q5`*0sEGm#Mjwgaf!>le*J zT<=fE2lJT=nm`i3pz?b>?u3#5aJb%P{KG+x8HPV<#H)(fLYZ6)fn5J|ygK)#>1H>L z12)NaHS-zQgScp9bOz7OgWbp<8;buCbWB{Oj=n@f3ND9oRu31cfP0vD($n`ApTbw1 zAxS{2)CibqZiszc{y2~AH2gT{4Z(%E4@xDY;5;DQZ$Z3*=n4_!8br~-;?YMN}>NL2^kM8-nl9 z5hN|#?AK*S>2^UgzH3(sZKG&yP}qKgMZ{QeL8YVqG`WVaAme6>*j6=bv_#E1iK~9W z7+0nSWOY2v4H(@5{rUh7oX3_9Uu^yO>Ow#-Cg41Z8v_)N1ZrIR#c!UwRn6L0sP)tl zwS?h%>?&Ea1Oj%@9w6AwprOWkd)ND2$A3m0fu|qey=+F)oQC3DS==1wI4_N&7?afd z)~<1GnUC=uG2WvlFrN3!-LuB5tT|>-0`RAbB2Z>S+=%Ly?#${@hbSuzj?a@L%2&%? z&{^ek#(Ttjg5c+a9scdXF3<$GhepxZ}^|_m1(7`AN5@cGZ3|=++u3Oi~A|4)I z8mf5O89Vp!y7~(qn}$RN1xrTZZzXA zT$B49wA7B;KjAlS3J>t`24F`eh=(0-ewpw&-u$?}89f06i&hSf$yb~%y>m4_;K3s{ z6q&t^B2a}bd+B&&_)R<6El~=FvXS0CFHAwI!S;I#pWNQEH`=WT2jRl|G9qw~KaV6L zDnN!S8Q&GbhfKL8#k!kD(Q=Rs0sV9^69@x41JpuK9H?Vi@8Fq2&1l~l$-b6*;jJ&+?DM1jWvf+-?KA+E5m6J90&Ia-WOhNKAcZl zopxu+;YJybgo zt_Z>pIM5Pu<1Ph0k`o|D5;;VO++8Vv=FlTrb+rRV=LF}2T-Ga4cnE!6a;@)|4}CN zP|t^V0O1Fsf;)~2kdw^;(vU2aaKmjvBfC3#M6cyK7ZcNP%={L|+v0E-Wsstm5!9#+ zrZ5E`<1-w&kiQIIwdNZ&@7Oe#W{+sv%Z_w|BfIyJ^V9IBo`0Bz&so4t=(^=)M=x!8 zEG~_&#UL>azzyL#KJaP)x-+~Q2^6*d(4II>i%Bhr#c}Q#g23t9SAwj4Tm!OMyzdx? zeSE_ZUq??L*G8?f$3`ILX}Dr6VNCFLw7;(DjsAMQKF(=uG*8lo>40a}9}jqD-9T5} zG<()@%j2$JK{!L=?RyE9M7s4kJhpE@hzR!Dd=Bv&4y}A1-{|UnzN2!DmMJ_0DU}o7 zv$ICEsr8=Ow50O+uKp+>y?RA!QN3jZ6{b6krwx&_vYi!F1r3z*QOJ7rZ2eO2sgtX; zvu!CV7>IFYGTE+8WX7yuI5rc3CI@r)pKoKSk*r%umB~0;%NO7Nvb|@ zr^g7BPkYtY`p`w%&ex^R4>dxdzTk_a5r3cz?^9i|fCXFJf%ANXu-#7cV|v&k3Ae{7 ztZ%AU?3ub9xi#cVf-G<+<)CiXfDUEetS3-AcJNf9CH`TE=H7*VJg$qeT0k~MYoG}d za8b1X5>0S(wv1K#^XYd?-J-c!<$=1nBbq7aLvhE&$4mfb!6v@rV; zkCgTJ#~nD&1RUp0ZnccX5=*ym%h9~?hVGKW)zA3&aSG`sG=}^kT((W12a*YD?46pA zNU>T#n$pA)ZZ6y$e`Lknlh%iI>pW`0H_(nsxjF=?r7s9Pn9@x(UvfugaicGWo^oT> ze$6qn7fgNWR<3B`?+sqwa8iahOnCzbsjfdXydUHX2=^jdMb8K3vO_A=+>x6vILtjl zP{Bbj-d>F!mv7^!@naZ2%XM4)5bjIS+aP$flhw3!?~5il$2@=2YE%z&48=#7)< zE6)u|aBb!%fct>=H$_fdk9d?ILuNFH4kH!5C)cBf zp~SBPa_6lCzmXGCM33lo-Nk~VKVoH$w7Wi8BmdqwTH1g&2_Sja;zNdNp%~-*p99JE z+nivuT3;JkZ<0A0a^U<$E)W!rntl*}@aAW(ca|A$|G0Z|yp40FOx^eqi&TT_5gDV% zRFTRll>d@S=X}IFZo)lwFkD@x@r)L@@(75%@W2k9?2-6?(;Tg+{A7*cAr7DjucVFH zB52>`z3S)Zl}3=2pQ5@A&E-CC!4&LtSEbs(yy$H~7tPVT2@OnmF%7oIpG<5s{H@Gp zaGnV`USH^Tmp=vMG28|d!Xpg26Emg%TcEJpp!rkOWXGRU1pNVcTfpoV=n=hwn`=DT zqt(RR9DicPkhhvOAq8t^qCiD$ma_OJ2;)mI?;b&CYIF?d;6t^}gZ~h1fv0Y6kY0)) z{vfTyFwO-fzP{KFL+9D0B0W#U7$3uJ5N{-+j!76hGP}w5CfvJx1$v>DkJ`Nb5K#O5 zHCbQYHD%(s!`{S)q_w4j>jicVSPzi!}QFKdfd9`vjalNZO zJ)e%MrRHc^E#^j2x<$1fGhS+_s#debNJd;pCNrYd7CQ5_d^+Y30&%Cqg;3*u>oH#QW*an|2xIg#RX!s@#;p`0)z8`Fm zuEU+Z3x_%C5Mtp1teDEa1GH|NtI2k(?^r85fsG}M-05jMgBx0;|gng(`)kyr!A31?F- zq%GCj?X7cIM6E>Kv!_LcAv*AL(ED^^)pK}8= z?^|Y#J8&K!uIu;paIHw8XztiQl0YsOH@V%Vna_IoxnAw~1L#+ED{2ANa zav`3wRc4L<0SY%QUnvyLP7l1>6e)&8ha^qThAAfkeR?xL`b0XwZ%#+)*ijdp%U!8E z)jXl~*K3BpPpr6&!);t0xN`++qu^?`xl)tN8%LWd3eRm52|mG|vC6C|1$oKQLG(PL zwSX&ewN+*vhEJdeo1oF&=Z->5WX|ZfnO-5`u9y40?Qz82!35pWfuzGF_JSBMTj3C~&^FKL&>Dffl!2LPM{V0*#<46cl&vBofaEtr!@B1JCGPPB1 zMMKiRx@Jv7jNcUqR|mqa0nI6>cOOS_CxO08l7bxi<)1Gwbp$FxZRiobasZVF-0kCL zo_vPj{^*yY&79-?9>pXhLuh0yJw2->y3k9Z47{8iyAg8`o!ok6-!e;$0*c|Bm$FlY zMj?AG`97|@Y7Y88*4W3@V#l!H5w-8NUyXL-kkcV7)^pisoF>As`M4$-Lmb&Edqt0t zt)k`3w)Kp2MCWxWM)XH+TgKMKmLIKs5a~}b&87qjS}OS!fWFwGsUb+3sRdJ?<&zN zY990OCGDcjNWC=XiOg2&6OET4n8c+HE1a__v%wiF#%g)G)J??tVvkt@7y2CoRb^h$ zQ=xObVS`b`-mu{5sLy`O^8$~vXoo(HBNfiQrL%+|V+$qxm|vHCm0$oz93KTj3``UW z$SpvE^@guiiyd8DIOPpe^AsiKu>R=kd`0d?s!6a(231&TM8l8^5s)~G+=i|=x9Grh zGb?XzIvuAx3$MB1+ub8|Jg)6_~pV)UwnYn5siCxf+H-OfjP%!VXJhUQj|wKtrq_BGiVFJ_ii&5*aw3r$IX? zAXhW=(+qCX_Zk7e&kdvo^ zh?b9mT2^{{30{$>fnCTfdL`{iL;Vaz{-WXxZ=VN?$8563N$W&a1^GmwS%BmL8PHJh>08+zpfDXbZvbbr3@a!W+Z$3QVFy-gz=Yp@-{-)R$1dK1{XGK+bb!UypV zW4b%lB^q$Os0)_M_)|l=?(XdYx7uc8Yw7=|J9oUZHOrVlIaZ)o z!tdtDYFo_5ox*w+6>{M{IA*A!=fBS7kGIy;*vS-j=4>r^NLux+VpHk%W_EOjh~7r__iYl3bHg|eN=nz#Gjk46`+Ls! zUPr&^@%6?2JLkEA%jt0!Z!NrXTj4H@kugT(VC3{uLl2{?IWG(*gW$dj1pVaZx!TQ4 z!hJ3{^Zxo`e~3A+uv405d=PSC8i{w$(R$GF;%26j`xdqJYK3Onp{FjTWqR{JrHf54 zh7!AIe|@yquk!^++g@8@M@&tNogD|i9DZrag*MbOB;f#4k(17%ciuD*EczIPXbZ{+ zZ3iP`1n)$B-VPGHvEW|xd6*cGVkus)qPlT^D{*QISnohkwCCTw0dFTrftx|ilR$ad z8Hg8NLyQF^r9R^fa>j+xGo~J>wjcyOM6e6qU|~5J5q1T)-l)f+CYz@u?RgN9CnIH; zIihV%AK}@I!@<;d3Qui<<_MuUjCjIw>o9l|hD8#7hjTF_Cd}jWP*yUZV`A0>u{qQ{ z2|us-4a=+J38@*m(S&xBvkyczEv-r9c{ zos?KjOG$G+Fd2UQ4?)-%ckJzstM)dsY5rI3uioy+efWz1A(%)$fW~vGB!;~%KyQ@P zeB5@0mTv9x*Hk7vVAq$G zZQkOk?5GFH24LRtwk$#nwj*v09P{{wY21$7P8fE@#T}=&f`k*q3r|mFN0%G*UgQi? z!l{z~PE`aBy}H;)g?7#ncjGx+F)WbT?W#jGio~ux`pMn9+>&w0-P^6`$i#;)`NJ`| z<8h>fC;Q&6g6!f6^eO&ZW4vjTR4U^h-iR_xJFpMK)d*!!&q5@GgYYYu%hZeTKY`H& zM46CXe<;Ui$G?v7#b?oOoI%*rZRo!-v*M1~RBT|DS)hDD9r1N-U$-3TbvRSfDdDfj zshpC5k-q^8es;lF3|!!s)?DoiJTIc{KMa)Z?|i+prOi239lU(y+4aI>*#*7Jp}%t{ zkYNxnFU|A?TJP25*8WS*f+cr1KudC=S>TTA{czC8Zmw{e3>I`i!4)t&m0g=u#OgD# z&DQ1?TD@&VYf-HiAwWR$9DXz2H7a8tIdYDSk>l_2`HtW3x+a;sCofg|C>Xh)>pn+D z&5C?ijS(^E&se3FyBM>Lcc;wRGSSnuM2c31ufApWR@aNHY?bZsT+!R1tEj%k%$Bb> zBJ)bh&cCkqE*{8uU7~w^{Cc(RufH}19lu&X7yCw+%u7f=NBTW7PbS_tkD=wqHQVdg z$4fT~lySBH{-TzcudE|D*>c9#>xe_N9>lBV^#Zn9&)j-xjq+cB*Z+ZGy}a}SE}g~1CuKaL9Y%U^hWc~$@xn@t=-XwH{ee1 zWSV(>ASrM^X4swLYw!4c?!tQ%`9Qm2_)tmjQL~Fr-DnDCrsZx9 zxwwE5Hs%X7(L#u~5yHn}&_dwjiOIN855w76qKr=XAy#8w&iIMrH>G?h1lMJmJ?@Kz z1b*#xIWyG3duFbi0K;$z8?Nb3y^XMC>1UvMOEJin&JB(oxG@Amw zQ@ow-e)h5DG)kKh`)|m-Sm^$esT?yz)l^4!- z!ocuE8y7OtM>6@oK26|GW_@h=7D{m%`KZJ^e%M^#3^v|ChBz@!9;obClZqR!Z*ahz2OdQce zdtG3qVGM(IHycBi=#1vlGHCQ*HaA)?-GK5lb!c73PKWN^o6L;VGJ^s#U8gvB8IiQ~AmV*P0Z#ztsk~OOSw& zaYG5T7&50JZB}JWR9%XyjVGnu)d_>d@pVBq%MrscDchKr!5)A2IPGfSKPfO#7EdU1@c7Z$iK zWmN7<8CEL7@&YJS`&>6q@<4d71470i1^zKEjP%gqp-c3Nc91z{5cb?YfilSQ|Gwam z)4>|sxZ4zHn&plEkMR=Tjwp4a(CwOW{VV|K*R|{Ij;Nvp?t!+LYX~(O#FZNDe+p{6 zUb9BZZf?9qblakjbVsJ_<}?{ThNJa_d%8}q%#`|kqgd+alFRMxxC z8hclh;~e|hBX3L|`6#WI^3L(D&zd<$Z=+IU?L)9&+KiO*l{1Xv3-hnTA=-={SD(Dd z-mbM$=uh|h;+Q8{t4c=8w)Kiv6Ngj}FMl0PfgfKhGQ7@?pC4QHkB^?)t%`95i2W25 zrS)I6=Au}g$8|r>ZhrUso~_5diC0uVqM=~NG1K$w3*vRH!P9!i)t5AS%oZas$*be_ z99Q{Cvdx%P$o2%0XN}g!%vqoH9{JY#J1DJUjo&8`=uK6P6!vr*K21RcTheD7eQ<)ZVP**4@#hUQK3lQbNkk2k4q^)v=UmAh#Ys;Pj|w(x$Q5Q;4fIRTi;mii zQ){R}vE`rLzNukYYzF?odv7BpZbC%x$&*Z~(2Np)YLC=gQO9>vz3--?T$h^tpIT#y zX56MLMK~rjgeesZ2|}Q4V_>lzI{ue!WX)QX5eXs&xgo< zESSc6a+3dLEGA=_#=lCA-kuBzSjIx{zI7dA83w)^Be`sjXe8m_?oR{3#KFftP6K}h z)nVvcNgor*)mwzBF`k6#xB2^>U}pA z<+=xd)Kn}&5YJ7JOYpF3W62B#IV-@L)d>=MLT^48W2JYt*bo^QW`sLiOYK{}entD} zo2V^%&MmiSudh#THCxZnGGm#Pjw^GHh>=J*u6C{Mibv6;FvQL>&B#ThD1-Z`klvU^ z@n){kdRB@UBaZ*6N!-$@tEXVK8d-ZeHOJYv{6G0;k*)D zmtITz)UBPpa#X9UcVnfa$qgs*PEpxg+{}%MCnZK|wONMi0X+qCFbnir*R{5*T{x1* z^a#y7&4c2mmgtM@ZPu2r7GIw&x0yY*+C=|o@#~e1+Z($eCwG`uPcM}9Mp>UP806!b zi`Sq%6I;%r3hZ;GZ$eFuns~Cs9mmE?W&MjLQit&q1{%j-6A4`RHgB@UH*h?^|1_Q^ zAMja=UG5Hg^1=^#-S6s_0URHu(sRgsjJvDoH$}_~H+BnZ=qQISd z`;3kbg@0}T^svqLNZg5!&p?5Dz*BtlAy*;3F86ToxtO|ZL(!;S``n2ucmnlnbBN^%1kHN zSpy7F1}p+Rgcjx!_kG^g3p;*&!*UX4zrJ~ApY0Rncmt@hDm{|9AY-H)h8^a-Sd|=? z(`zn>1&{LK@?s%(Fin|WU~v{oTomRqt&bp>L}MX49>-$!*w}^>MZqU8}YMv)O4Iyf2DG^Nny8o&c7-EQ`nYZ}ngXX*Awlf^w4^pbKgBI`JO1h4N9mY>7?7=<-TlyK^sL^hMelL`x2?L{c6l*;DKyLasAC(IBA~VNKko;!_k109eI?u8uOq;DkfP#RB}can zhOND>Rc%tmD~;uDTUDGQJxf8AEvm9_Er@rk)+>AP#N-jl%TC}7GxbjTe-fi!X3R2ZSLbyX+xti!hXSoR8Ku8j_kXa9P1?HM|KyN`qrm)g(>u-> z%Sa)Pl{{t{G!(An&Nfh$w>vJt5HJgGy+Y}Z)%=@2ei(v434fW2@O>#DG68SDqLz>6 zVk>Z<2D>W`s(N()+YM00$2Hu6@%v5w?aA$7D zHbpQ2(GB*h+!1^-@->9p7WHH+GHu-Yip5lvX?Mi&1~C;TjzC3WFfHIp?u45-t=b*A zDf^gPTej~nnnQ(Ln|%3UZny08&0umXpyR^+YW_w(Y`H?PPZ`L2EBF`8ML_vWm4D=nI8i?=; zu-l@(+3=fp7O?>H2!CpQ>o4UvZvnTp@K`{XQHm6vTVNq!P>f#49fd5_hF)n5Saui` zSoA%YbvuKoXjbv});4b94GxpS424G+Y_BhGzXE?40Wnd;aVSrDS!oDeLl?b^j#eHW zB;JzcQ`s>BDc#$;mjA`gIq#|LXyHN9gnAXF8p6xclse1cmMgiVk(J)i>j_&kgJa_j zY?vz#5Lm-rQ^@SF4-t%Iw@F%(9Pgl|Z}6HNNj^@rYn8FANs7}A5UVid#O+hmsok(v zm|^+<`b6`~w}r<}SVd_*%fp~ucqMnXtK<>AIx>T0H*Pa0h!nD~rge_#H#dwpWg9Uw zqgsw8uGI#6r@c(GMV@QcW%k!=JJuL^^(HcByy6{~uS}mqhb*Sr+@nUeIWxv6mb}h{ zsL+bPJi3Pvx?12U-c`1Y8JXj}PBPed|EzfLwIeI!(`vR>`Ra;SZyBv+^{d&iV$9a& zV9LMHXr|WuU*pt*>FRV|T@8@EvbD(8xz8)BwOI{yq4~Y`chu+35c3=(a*oWHXVfW} z67RzRkcQSHj*3iRvFbXnGh2>|eYQgGCwIME?#i`W3yRF=3~3nHoz^XH3QYW~A%hg^8s5F<38{f6%5TBb4#v>2xa;&^je@)Cw};zLA@vEtG(`aj5B-^bn((a4OZE=BV564EL79S{!}sPXOymyx zexz&=07ZGWxZueR+%6C4;h_(!Ld|keBRrOlNyUpNP59GC*_8_eGfRa)AOG0&jHN=Y z(fWs=9AM~72pjtSra{2|`3Zcu1ho%}xy?QC9qnwqP%8R(0&u^~h9v&VhcV`|&;t>xJ53bV;{0p{1`u9%f#&7^MtUtet3%0SgxLGi=2^j!n6f@!ZT}(0(|A|e~7OV4H%Gz#}98ss|u^s(bTrFJbu<6|M?hj6~5J2u^ab>crU$NTxOlaE(`jROwPtcAD2 zTF0{}0~a<-KEN{G2geW390|48Z@d8ME$U>ZY&ig4Z1h?SKGHrKt29{lo&on^v4ki2 z@UscetbH6ie5vdt1f_xaA)d%tA)x8U|5$D5gr{sDA$%NgKrU+5KyY>bB6-AL^-Xl9 zCBJ@fFMT~utLo1-r8KWu>wvIRzj?z0X4Ynkc+ruYq8X0MXH~OC(BR|PLyVnV&2{=O zg&J+EF(YDzp#6&Z{pOjEYYd1+PFKu9=tw8FY#$%3ZS8ffT#Pc}Y=YcgEw^6VucY}( z&5!wYuw6&{)emvDEwa}!3*z?c*NYKht*RaWMeR@h^BCiN_&@$%FX=I(_1D%??UILI z^%*=X?sY_C-)kSU#u3lVdHz>LX&%EdW=$A}oaTNC;5z60Nxwa|LkHxo_NmDQ#d(fy z5LJ`=#&ynK`yNNwuBvZq3U*2_*|t}2k$S3LFXD|H=s%j*ULiNeSiOGz+D`vHV{0>! zd$!ls`u569v~!ZbwmOeqcMBd!^t`o0@3|#;0%knplm)|vB2Jx6=J%w%IK*j$qj>H9 z7R!!TH2L$9BfK4!w!3~XQ{a2j$#3!0^6E^d>qHtF*8HbnTEYP=&}i`XpPHmEh)5kh zeFhV+p%`JFY@U^*KJ3c^aufQY41+~Vfr&DScRcWBMM-Ie*P)ACh_0XW@XU$(O{va= zg`Jd`2IpgkpV#E({?dw#4L?98MygIb+h)t7 z+jwW2$Rr=l5nr4NShg+Cz7Y;m88Tg)1^i?qGAQbAQ_3+PBGtlSq9Tm!|n=(IOv*YpcfdxebAe2d3ZzpUT+RmGPlvWJN3} z@HGD+{L~+-7jR!68s+QC_;k{|!k8i+NKQcF3%P@|gwoIkK3wn5cJfWEhXx_>;I6D5 z+oIs$u*Nn!-uIcOa*AZ1lN7#qpv2TUzHr3=wV=>bi<)E#;#{{kOZS(5qZ1i^*8pZT=tUwD~^pnIZMh9{3M2P~4xYtxMh z2M>ieWFZW@?+?n3^BaO+YmFUOI;`p#5DT;zUQ<=H2`&XsHEVn$Rv>}TWH-+ZW1HL> zQ&8jMF-m>M14EF)b)e&uK{0?-iJ8|_k=!vIOVy|`KZ93GWwFQeCgQj^Hv#G>71tq4 z?S`b=fs}QKSmJ|87zb~1H+y7cTB5v@^f4o-9lKfEiG$q;H570UFY|2U)#i4}W$P{D z)!R|)>1ShJ`*MriUM;%MyGT1%9Io`cJMC+}qekYIvGv%puElm~=PW^H-NqhSv$SyB z{2X)N=lCq+dId|%ZRWLp$^O=y!E=vmdF#Dm&WQaAU8@;2X3M>IX+QGy$~XIZ-vOe@Jw#W4mTzU zDSTE7VnIBJCl^2vPy&CRiy-4^_~4T=e11kWwXzE{9Qwac{8aBO08_A=D_*&O%OEYuq2h4&vi2VRQ z4JzU~l#FZUYZLgp*$^>2X-4n*7TEL(uMsY1ZD5zJ&BMqmp2>&iJwa!z|6fBm=E*&r zd=wL#H`3z|E4hVu>e9T>8=!ZzzO)N$M_*e?`S^1P1f)-)ZR7bDPXVQy6jRt}_@us# zNS-F78G_Q;E_?ynv7em&_~#S1pFWT^(wDJ0zLF>*4O`7hZrbN8T+Urz9ZVj%td844 zFBv}2)g!@&f8vcKU>AWu@ic7_;iV3Z=2m*8OuNW6ZFT^k^gILbs`#xMqZrqGeb!|J zr;I?vg20DET5kAKjtvx7qQ}3Fz2G<5s*iNScnBEJa2g!vWWIe5w=~Fig5w?pK@ngP z4~uIADuO3AV)O-6|S8w;3vYB%i+Z&-XnQb`6Ypb{Ort@F;mnQJ@zc- z8?4|n&r8OL95c`H!oB9a^#i>6<$^Mi_t91qF?PY_2Fy}_y8Y}wNU16*a7Jd$pqpb5 z_a0d8Bk1dRY-3CvDAD2w6jMx*4PQ0PLrtye>BK@s z6QmG9$HzF7!G$6zOrG-CXVIS$klQZC@pI0%3Pl4>72NuD&RP8&pPqAMjEHPmvm*GQ z=iH;mRw-uW83YPs30Jv&Vpkb;Ub4+>GkQ_8W(B!Bhu65+fc`c7#8J?84~QxLAt~aC zvbwau703jE+8e1s7vBonpST-ckXul$w_fiaKUWj3Kak_k;IVHYwR>)+U!9*oa9mAl z7H26JG=bDO{!N%QKF>KWsClDbKfdOccZ*x@{D@C-Ld|&@PPaR^ z$A1%)<=!B*d)3ozg>UR?K~uTsH1S)rKQ%t@A6&Gnmv(^zBDwFsDRo3EWQTyWccHM^ zV0Xqe5An^#3o$|r6SsI`2!>Ph?%Ic7g~t!DNPYfIsUup=DVAoy0qgru3&#DW*|`mB zWakfW1hULpytWk|uaB?K>jf#||D{lUVK?3V|D~jOz2MUPw!%z?%Xm|_Dubksd{a5( zX)iHJ9A)+V2D%!Rh<{P?SRx*v!HbqHz&S+XRnQln4$578(;)e9Rpj_c7j(U+KXeMN z8XiATBys+M9Df9AEkO^n31%M{P6=`oH#kzqxL|-eO^JxWi;et%DHwwUlrjE&Pc0uT z@?ot*p~fI=z>cpm17~Xo*Vxz@1){CPNj!j)`TU!pPB8B5cRK*H8-4TW&`62hQFfFl zYtggg{wlfOYfN6V))pu@{JT;|w@1JgcoKmE4^7}hd^58K|NSTZGtXO7{z@Rn^7w&U zJnbe8E4a(nov>m z6cOzVW7l)}+O8=o8LzxjM3Z?Zp2u+=s4e{%T8P&&+D@7f&1zSAfN6CALVVY>KTep(e`h;b zs}5s#&=yG&nkE)}ao8(!gb*X}sBvW|@OCphh0_R#gM9mT{V}(V_d$AzUm^vSR#GXn z75~HVypbwXJx)P5z2S^_G1riy-FbSQyBQ)*xa049Tx)>o-q!_kFc0d?e4)U*nHkL% zssL)6t?`kY(FAV@LLU!illO3ZB~i}^O8-Axclo=7AfoX+k%0F@?{NMnw&{IH}aXyJk)DSm8Ef;YNR=wWi2kf8-L5%MZ~y zKWq^}E1!G=Q&-V5aUppU7tw*t)qlNR>w9LN6DZ{pP zP$wg;HS?lDsjFR+rqLeT$8n|h(eu@-(@OgK>#x`G43PbqR+_4K6x^> zY`xm6ksn01c6>3v;2E!$QTaJ)&Pls5cM#l!Yh9(nhh5Mq8TH+pFq-X9Y zl)4>KGu^h!6Yh&h`~b2oK9(@LdeE7dZ6U%$Vqh2a!(Yh#ZfHnPv!n9!{`4lNg;B~>9mD&A4s&GC(tu%=K0GtI`6-CFJUtEr~98Lj>Z(USdiYW#>x44 zVYoYu4-RQ5_r?8(@mS+>a}kTBV%*(uy<->H$toTgn$d23mGJ1RtE^{H?b~zrT;RNg zy9f`tLif|u(Nh(>bO1{#Jn7u!axWXk-B~;Zjs+6D$I&8{|8eSw9Q_ie2czTetX1A^ z)?&jgi#IoNX_@TGul$HG%J5f&HWiY$SL4n$a8HAmt!#eCQimy;;AzB6+ky}tQ2rrA zTY%Z258P9%V)A25oN3%9$1)|I?uIms%Af7S<*vB!6BA@CF@aUI*UQV^#nqdyzfL{1PWx7)^Csh>r*So_j=}tabiQG{u3Fe<>?2}~np2&V$Mpb@ zLqKCz(LeINSBwz@_I$r{-!GN5M!Vv1CG4q&{taq8)7OFLw1 z=a1O0a11!YSo@p)i$~B8{f;YP8k1<&IO4q@X614@gUbAyV@Q|=Ji#SJGsmuvw!4k%l3L@XPuyrzkYojU$T=;C*`ZftH)L%vK=LsQqfj=+HEhp>uNbeRR;4|-g*-XpDoNUMcONcJ;M<81YStF2&VVVlzcW3$bAtU8d5Ic{_tj zT8N!tcbH?~;rgOsfDhhrM{2%)3q34XmB8}e;{v~)3%@_Fb>=U(nqRx(eSToyVVobf zZ}|K?|J`3Wg%G~SCLY`$LE;YK1mXc6UqCL%iQmZaIQI~(=jpC9>)l<8NYr>?JbKW14>Z%8F6=iY6j=rTW2S`Cdat<3FigTX<~|@SFM?0(KaZz3RF(Q z={@|?@gj!r>)O1K2{8#HU^iN_7sJEOusazcB_;x=4;w%sfz;Rr+{Xm7y}|s{kcP{Y zLLLV<=r+r)==#w0ScM9flI!lz*T@^1b_{}z43RzDcTooJ;b#=O#~tca9^n82+Jxdk zq&gk+-QOm<1O!kYX{=CJ3G?hUDWEegVCMn>PzPx75G|M4SBLw6pq^AOG>! ztAD)O)@e08ezt@zlKr|?dSU$+{;ySRsxQtv^|R4(cl>;P^w(ei@sVe>pha(at>4oW zR*}S`dXL=Vh~rU9rf%s~HsnN&u%KFu_L|7~w1SGt-sX&~DfX+?>{QwKe8&({>ugv0 zHE4Un7MSN2JHc*3*+9TGR(`g=MQz(5(7E+$^e&^zxn;Sqs`h-vx zMX8#-@_Z9_dX+m~Gi3jXP3#(a614k?5LP&O#51oDLr^)@;GX?^RiJew%Ro%X4M76# zw2ZSC0zI*cmNz(3D@4Z_!pcq-6Utz9^fB{wWhe_!piJ#ILAOdu%ghc;0fN?jt^nMI zR!du<6m7FNeduI~iIfa4?Xv>TrHBKMb1E;twILKfAB9j%9&QsV#iiF>;o<`3kmZ z3fu5Xb@DbXun($;)H5mE3f4a03fPOUD|1;THcERE2C07_Qup>K&Qn(aatE_VAN6bT z-3f>)z7uf%9>ZqpG_Uq&0*T=74A6-0jzkS5J-*$1_F%c@n0R+zl>m%FkqCxo*dqLPFZ5Yapn+h>9&cg_+h2b}5gqi@3y&VJ zI!VOcOrhO-QntLE!~aQh9umiY49!G;d|nd1e+{d6HU~NB|0esqyQdKXJ?X2tmG1%_ zPqPS^0y}z`>8)knny~qOz=@b7VD&faz9nYZ3a1CydNhJN@RR~i8h7H+V&})HhO-OS zS^53>c}z$0IfTC~`&0bo=n%&}j(f3=&Mw0EaV~II-Yw|lXy!N31K9d7e%-|4Q93F> zxt2I$MV!v5SRIDf!iVNq>Mge>?q!18;(v|Ebivs^UYsY$%Z`*`DAQ0)gH@RbewsMG z1QKFD41y4U2uZ|u@B7o_u?#O`Pe7!2p^9l`M^4tI-5R3{?4{k7O1#%Gnnmv zmOB1%<+>aM^&n5})VFHZkpE51ni3VPYSw08E26L~h5Z3z)dHO6dhj>r*hR-f0cx2>H$?)sL{uaUcF_)4~!&G zl|7tG+_8_dscg~-YV4oy)9LTu@BQz;-@Fz6nmp|9-=FV&{{4>qeZBRYV`5;FSsjTA z{Uj$dJz~7)Nk>fId%XXi`}_0j!oPp>M*aQw-~0Rb-$#q>cz^DLE@X2*op!?Q^sGYR zcV(AIdZ;#uPHa6-(QezNtl4X}7>ORRgM{sDz|AH`k*b{y*~u0=7-OE|@s&uj+7{XC z_7>#~A9kR}mh}&tzPx>pwTI#KcY80z(w~j}i_XR$V_r$I{Sfq>!ky`J^gGFrA&u`Q zhiA7dx}hCg-B_ECb8|y6p##{hFvBmy4s)I^bKDWQpM`;NZRd~gCYEW0AS0)u$V5QM znH!@A*N;n8@?f)J4J@?FK4wyYDOr0cc849_UNRlOPEVY9GfX%2RJh{JYp@-fu*aJ+7k7;% zx7gO&9BFt#kcbueBYZGx^v68LO}od2b!F6=e{niqp9z=}hN<5epUkk?#6tmA@?lkaTV`*H5GsaPsT^>- zEixmfumv2s?JXdBoK*;q1!#*_UdV{rX#ayR&*ul!!G>JuHW2c9LF~^n{p;8^19w*2$8Q+Zh`@@!vuf0WSx(Vj z#?y?AAyo%={Ba)FdAcc}&!=pfcuyk?aSiDJ<+ddCi4AUkP5d#AOBeqel; z9X5NF8DKASz^6*%sUVJg^Rs|zkUf3Vl1C2EDU%-u>w&f;>}2R`TEF!kC(pd)mkwjg ztV2yM$8U4Mx)d=o%JKVl1&m{{gpAmd7z3H{(v=^`pTrS7_hJWJzi1gd@X7Q7tf2?2 zb3(Imi#*Nb@w5W~Wdh0wlo=>PP^MtCPJl$^Ws?cANshFXC*R>ac?pOwHQiu|!e@UlIs1IA!cN1)C? z9fCRqg~tgPkqnD}8x-p`Yj5A9?FlG(FKbjA{9(=dLh~L&zR6K(ARN`9G^!!>WaaO)sF$8N*uC ztPc;weeNUM2?7n;ry#}Eb+T`-p3!>dX_n`Ol~AeE5$%L6+N($VsG8AQQps+271Gii zbBsDvSL7pO($B68dKw;~X)VgvMJd7f<0c{$t;ns-+D5jDmLuYNH_=3$S3D(m9?Hm; z$K7ho$eLly%9x|#5JbyJ&f_{waG#Mas^!>fwk<;M7nCfnXv78rA7TH?!)aMSrzuv}39>p_1g&j!rYo>@BjtwtjW3P0>K@$=nM&8#~k1 zo?rgXdTOnbl*7ZU-M8$V+B*+{70Pj8`5MCqnzrL#oI6GsdH+7JRu`b+?5QkOHhvC~ z>UIzU_jthlaUI;bCq;aZ7gg^7;^9%`+epLZiJYMfQfgD5nD>T6)PLfJ;!qgE&K}-b zLuljJIItjilZ2Sm*p}+RFR%Ef;oU;1^-!LsnJ|q2LX8{y7C#QT+VFS7&M*yLGn)ED+*-3yzs=#!$00Vx;+=KBD)1dE4nyS*o60Gv zak8IjJve;Gt21C;UsP@Qn&0hhgG2gq|BeL0X{2Lg+(?m~ z66@{-b{;K9VuDpJLa+>O{6qXYUU7mDdMXz2fLhA|bRCzc(+s>rgeet08`y>S=z%Z{ zA1gEVs|qg%r|wE6qW7mHebx!m8{wHHbT}*Ow7&6ao%$Hm51}VY89pX@2ws2u!?GjN z4BUO}b{X`Hsvj~zg(sIMa)woVWeNTASt)q?#7_96)T@;)u(OA;G7#EKgXfu=8U+x_ z5IE4NG0qPeFk^*aU3MHgQ&$*1RaE^DZm}pk22Xehl8E?+kaUC~or*=-5xM>ppE}Cr z`BZjfB;74z=L+W@nxf8tT)78k;`li8hp{qxh?>u~;1D=&OAU)O%>5B5ipS1dFhAgd zrU5zod=YWyPgm>WMa!yY&0ZJOi2rHXk?Y{jomMq#Ug7-d>RAqngv%2-!|Fs567&e9 zyR@ia2=31z*Tv3!tjw#$)~bE9?N{r+x;n|VkB?)0#%=p$oQu7*_WDb-Uw`%X`q&uX zydCF#P4V}C{?A{`@%MG9ukZi(kB`6ppTGLY$LsXE8NdF||M_+Ne~7=1dwsmlaa8Be zkLwWrz3YtzPjAQf>(%ph4MK(vV28TUH-p-__Pxb^gx@=gWwST6OG_ zfRAh3)WUVR?hw7Q&D?Bt%FI$gwSG%(nN8c9`6+ zt$nm=TeKIGqIjM^#BPM(>GHQYhSiI$ReS43P#?vJq_J;VV9b=thC$-N4?yO;N_=M6y6> zk{!mWWUO6lM?8y2{|k6|gZIHE$dpj!98`wkW~8d`<~!W;Vi)tDubtYG^uuuAZ=t9EAmV zYC6Pf8dE;3ZYp-n=gz(DANBis+xD7?`%q)FgWN!Yv86uq#Dt;K_8}B-;(?iho1>?8 z$h)lbLOg)Hu?kd)pis1rSi~+$bOXC8Ve>{cvNW%tuWH=F+nE}>22}(<-VDFqrr!CR zdg^;oe-kh9hYKkry%d1?5Pu(hecy+aonKJ;TC_*vjz8c!T$k1Sx$gvpD+%j2d5KN9 zo-`g~L$1jAQ6C&elLp8AdLhcdt~|5WcjLjP#Z53b)-X!YsvkZ(MDZb4lRKg0^Uc%| zHTryoPmhT_2On0(XP5^;@u3PlJwfWIuT?WUf$~LL+%s3=y6D%3BM>acqYz}`5xUQl z+I>Du;$ax9!R`~)|QYWyYW>*+C;cR5omRYw2AxNHm`!FU!4})vF7pN-d<7x{pnhs zzk1R|t!H~3=MzoJCV5;bS`Uqlj-Z#5#!HJPUVpv%UmyJ!=fAEx=WEjh`HU&{RB=LN zMkV2FqcT~sfsS)@8n~v~{yf`)AwFk6{Oq&lxe$$D-I^x$h%rtr7ivuUE+&svozKk} z5qlG?`%+?#{k+v-Z+(8ozQg-{2JUJ#AkdR|Tp4i<;@PtzGv-Pzj6K(+@f&hQ&cFJ{ zU;Rt?){d+3+4Sv;XqQ`@O5J*LK6=LvunX*@5l%gthfVcpzp%4@j=$cb=i#2so{smO z{gz{j5`lOGWeZY1p5pJm&7cPzPuYOOc<2m&Y>oZS;D$N}+OP7w@~^u&EoCJ2rdW zgteca19pTjxmbdi=v;|l!*{3Ugxk|fgW&O5Lc5_ur+2dOqAAajNKuo|ehB`ujs_5) zuMmG;WA^KFYloq$WXr^(!;J^YaQOUc!W+Hg0k0wwMLN)w@Fh*VaEs#O=9fayYR_8% zt^$;kcnYA{P$lE=H+#ZRE~3cZgwdTQdeamgj-pkBFeFp4s8d=!GIG5Rtr^AwuETY? zkCTFMQY|MQPG&0d4+1ifb0T_UsW()s4|?}zZtTQ{OzI1x>TZ6%PsU?Re(-XE0%(dL ztrmYezaj$?XutAxU_5h%f&1|NvEToF-1H(8(f$xR*7Mc=5KPkXaoH9hlgD_J4{`+L z%s_=doL_ROckBW?aRUPEY+;UA4o@N9e9X)qC;xSx%8t}bSE*xXyG|V$2IA-S<3ELb zWD^NKLmSJ6v*N&lL(cR5wSZUFT$lT#(FDOvK|Gp~L|$|Q=Vj_>?WIl^Wjs!fZD#AX zgq>mI_^J!qKnSLaT6`h}ecQc(hCoRtql|a}n}#MR^E?+G7tR8W$iKb0L#BxkaN`I#M@AME7Oo|JxxYh-kijP#f2+v{UHIxlKS{`TwFcKr8f zA0NG`Kg!nzPM6-VxmiA5JdTXB?h*a`Z*fh**kiVwtwf88Y*`^46n))QyBV2tW=<$E z>7_^97AtxThi+Bd=M-E~Nxew|s$W>2f zobjk=CECm*oY&-$(K>o#oHa^4bbP3~ce4WQqV z^v3egd*9A7Lf{**bHgX_@8%gIL2rcPAHqXM{D>)vi+@N{K*5*SaPxcuG2-7>VtrJR z*`qYhG+o|*aj7>_2E3T*HJ?PNX{XV3*^!g{L1=>;#=tg3;1fq9tTT=edCCPm^*WW* z!}W$r>*uMXHBb^yesCA~;eAS1p01BvJ^KLk;)hI~ zilS8hrIRWv8CwbxD7bYpgmF3!W#eWx>m7jtEw&&A+WRE|sSrd1jdKa(zck?6laPti9 zrue6+BQbjWK$NLrMYA-#5cBn01AK5-M0&n};ePw%Xyq9W>2TouuN=grxc#`(5SI<1| zT$y8J7X2eLx!ifZ?OOD?znTbL?ecdk1&b!OylU;YvdkGvXpj-dR|;x^*wV6$Ca?s~ zOA%-JEgK{#7`OODRc`K&co9$H-NdV3OLcFpouW#eP5(vYddN7lzmPk6P{EFsI};ec z&MU{Zz1pE`seS7oEkC|?X=je?=L$CQdXHXtb&`y1dS%cK8{1k0b5!R?ZoPgr^*ZLx zU69MulL&Vk$wtC`Uv8GO$P%1;aVS<}KD-@`*A9%VqfdapHCSfez77Cs3z6|m&{peT zRpx!RSezXqt_%8|JV?IQ#4>aCw_XSaF(I~FwXYFIc*fd$Q=mrzqj2P4)?%`zx^Ht4!G4D<)a^!*#@Z>LNdTF4Qb|ZhQ&h zJe|CA00&Sq=W(g^V`D2|JWSQ)?jA3QQw34W%=??yLCJm`cW{570y{zmEJZ4_`&(Il zQ@v=jv9K68+VHjX3cSo=#~4vz!nNabI%RZkHlW9xcuF0ET?n@~z69~)ft);CH+^9B zw+)Ag9p|CyASi&V2MHEsNAMm~2*#S`dKuF|4;}=VsOm=C^=|muj>M42+Zg^$X88XF 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 b4fae164001589cbf96bec0f5e4659a812924c35 Mon Sep 17 00:00:00 2001 From: "Rico Sta. Cruz" Date: Sun, 7 Jun 2015 19:06:00 +0800 Subject: [PATCH 189/846] 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 190/846] 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 191/846] 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 192/846] 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 193/846] 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 194/846] 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 195/846] 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 196/846] 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 197/846] 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 198/846] 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 b325391d04b54c02fd65fa28b49f35db7a8374f3 Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sun, 5 Jul 2015 20:35:58 +0200 Subject: [PATCH 199/846] 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 ee695d9b7ced2bb8a3ee7d66d69677ca0ef4144f Mon Sep 17 00:00:00 2001 From: Joshua Appelman Date: Sun, 5 Jul 2015 23:45:42 +0200 Subject: [PATCH 200/846] 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 31f3e80cdce09707f3b6035b9314ebe3e08b5179 Mon Sep 17 00:00:00 2001 From: "Rico Sta. Cruz" Date: Mon, 6 Jul 2015 17:51:11 +0800 Subject: [PATCH 201/846] 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 66df628bed1ce4bcfe4e3419f5320fa373cb68b7 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 10 Jul 2015 12:41:12 -0700 Subject: [PATCH 202/846] 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 203/846] 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 204/846] 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 205/846] 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 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%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 14adc4f4709147207784574d96b212b1be3bc2d2 Mon Sep 17 00:00:00 2001 From: Ryan Tablada Date: Mon, 3 Aug 2015 12:22:41 -0500 Subject: [PATCH 206/846] 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 207/846] 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 19e90aa8ec41e027def9fd98f62a3b6aa435032e Mon Sep 17 00:00:00 2001 From: Hugo Giraudel Date: Wed, 14 Oct 2015 09:36:28 +0200 Subject: [PATCH 208/846] 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 209/846] 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 210/846] 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 5892b69ecfca26b016cb48b4671a194899588c03 Mon Sep 17 00:00:00 2001 From: Fagner Brack Date: Mon, 14 Dec 2015 20:03:28 -0200 Subject: [PATCH 211/846] 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 2a91194f74ba09a4cf345b6accce2abac91b473a Mon Sep 17 00:00:00 2001 From: Michiel de Jong Date: Thu, 10 Sep 2015 08:22:30 +0200 Subject: [PATCH 212/846] Add section about ES6 arrow functions --- index.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/index.md b/index.md index eb2a7b19d0..4c96c69e03 100644 --- a/index.md +++ b/index.md @@ -49,6 +49,7 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js](http://no - [Assertions](#assertions) - [Synchronous Code](#synchronous-code) - [Asynchronous Code](#asynchronous-code) +- [Arrow Functions](#arrow-functions) - [Hooks](#hooks) - [Pending Tests](#pending-tests) - [Exclusive Tests](#exclusive-tests) @@ -187,6 +188,10 @@ describe('#find()', function() { (The latter example uses [Chai as Promised](https://www.npmjs.com/package/chai-as-promised) for fluent promise assertions.) +## 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. + ## Hooks Mocha provides the hooks `before()`, `after()`, `beforeEach()`, and `afterEach()`, which can be used to set up preconditions and clean up after your tests. From 17078ba35a1b4f962da7a65645cdf04cbb8578cc Mon Sep 17 00:00:00 2001 From: Al Scott Date: Tue, 23 Feb 2016 22:21:33 -0500 Subject: [PATCH 213/846] Add information about emacs editor plugin. --- images/emacs.png | Bin 0 -> 605262 bytes index.md | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 images/emacs.png diff --git a/images/emacs.png b/images/emacs.png new file mode 100644 index 0000000000000000000000000000000000000000..ec3be76abef7b8efbb1d20259725819d23f64f4a GIT binary patch literal 605262 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∈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
    ) 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

    L-S3L^%1qUdXEqdVq#D|mgJe+!`*aCzF_ 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 literal 0 HcmV?d00001 diff --git a/index.md b/index.md index 4c96c69e03..29b5c42cb5 100644 --- a/index.md +++ b/index.md @@ -993,6 +993,10 @@ The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Pl ![Wallaby.js in Action](images/wallaby.png) +### Emacs +[Emacs](https://www.gnu.org/software/emacs/) support for running Mocha tests is available via a 3rd party package [mocha.el](https://github.com/scottaj/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) ## Examples From 6bcf44b0876ae54bb14d4bbb4f9ed7b5fdfd049e Mon Sep 17 00:00:00 2001 From: sarehag Date: Thu, 17 Mar 2016 20:20:29 +0100 Subject: [PATCH 214/846] Add specify to documentation Change as per https://github.com/mochajs/mocha/issues/1997 --- index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.md b/index.md index 4c96c69e03..7a0ea805a5 100644 --- a/index.md +++ b/index.md @@ -611,9 +611,9 @@ Mocha's "interface" system allows developers to choose their style of DSL. Moch ### BDD -The **BDD** interface provides `describe()`, `context()`, `it()`, `before()`, `after()`, `beforeEach()`, and `afterEach()`. +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. +`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()`. > All of the previous examples were written using the **BDD** interface. From 2c82705c9f9a489df456ded5c6766b70f9477816 Mon Sep 17 00:00:00 2001 From: Alexander Shepelin Date: Sat, 19 Mar 2016 17:17:23 +0300 Subject: [PATCH 215/846] Fix typo in --harmony_shipping flag description --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 4c96c69e03..63dc79b636 100644 --- a/index.md +++ b/index.md @@ -518,7 +518,7 @@ Options: --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) + --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 From 3760f0a317b42085fc28491fd0101acbbbb860c7 Mon Sep 17 00:00:00 2001 From: Erik Eng Date: Wed, 6 Apr 2016 20:54:18 +0200 Subject: [PATCH 216/846] Fix grammatical error in headline pitch --- index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.md b/index.md index 4c96c69e03..80f46a1f61 100644 --- a/index.md +++ b/index.md @@ -4,7 +4,7 @@ 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). +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) From 749667bba246620d6671be2d170bee72ecf71ce8 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 9 Apr 2016 21:31:10 -0700 Subject: [PATCH 217/846] use CC license --- _includes/footer.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/_includes/footer.html b/_includes/footer.html index 9d5c068ac4..61b4cbd296 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,3 +1,5 @@ -

    + + + + diff --git a/docs/js/anchor.js b/docs/js/anchor.js new file mode 100644 index 0000000000..a52ab7ee2e --- /dev/null +++ b/docs/js/anchor.js @@ -0,0 +1,338 @@ +/** + * AnchorJS - v3.2.2 - 2016-10-05 + * https://github.com/bryanbraun/anchorjs + * Copyright (c) 2016 Bryan Braun; Licensed MIT + */ + +/* eslint-env amd, node */ + +// https://github.com/umdjs/umd/blob/master/templates/returnExports.js +(function (root, factory) { + 'use strict'; + + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define([], factory); + } else if (typeof module === 'object' && module.exports) { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals (root is window) + root.AnchorJS = factory(); + root.anchors = new root.AnchorJS(); + } +}(this, function () { + 'use strict'; + + function AnchorJS(options) { + this.options = options || {}; + this.elements = []; + + /** + * Assigns options to the internal options object, and provides defaults. + * @param {Object} opts - Options object + */ + function _applyRemainingDefaultOptions(opts) { + opts.icon = opts.hasOwnProperty('icon') ? opts.icon : '\ue9cb'; // Accepts characters (and also URLs?), like '#', '¶', '❡', or '§'. + opts.visible = opts.hasOwnProperty('visible') ? opts.visible : 'hover'; // Also accepts 'always' & 'touch' + opts.placement = opts.hasOwnProperty('placement') ? opts.placement : 'right'; // Also accepts 'left' + opts.class = opts.hasOwnProperty('class') ? opts.class : ''; // Accepts any class name. + // Using Math.floor here will ensure the value is Number-cast and an integer. + opts.truncate = opts.hasOwnProperty('truncate') ? Math.floor(opts.truncate) : 64; // Accepts any value that can be typecast to a number. + } + + _applyRemainingDefaultOptions(this.options); + + /** + * Checks to see if this device supports touch. Uses criteria pulled from Modernizr: + * https://github.com/Modernizr/Modernizr/blob/da22eb27631fc4957f67607fe6042e85c0a84656/feature-detects/touchevents.js#L40 + * @return {Boolean} - true if the current device supports touch. + */ + this.isTouchDevice = function() { + return !!(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch); + }; + + /** + * Add anchor links to page elements. + * @param {String|Array|Nodelist} selector - A CSS selector for targeting the elements you wish to add anchor links + * to. Also accepts an array or nodeList containing the relavant elements. + * @return {this} - The AnchorJS object + */ + this.add = function(selector) { + var elements, + elsWithIds, + idList, + elementID, + i, + index, + count, + tidyText, + newTidyText, + readableID, + anchor, + visibleOptionToUse, + indexesToDrop = []; + + // We reapply options here because somebody may have overwritten the default options object when setting options. + // For example, this overwrites all options but visible: + // + // anchors.options = { visible: 'always'; } + _applyRemainingDefaultOptions(this.options); + + visibleOptionToUse = this.options.visible; + if (visibleOptionToUse === 'touch') { + visibleOptionToUse = this.isTouchDevice() ? 'always' : 'hover'; + } + + // Provide a sensible default selector, if none is given. + if (!selector) { + selector = 'h1, h2, h3, h4, h5, h6'; + } + + elements = _getElements(selector); + + if (elements.length === 0) { + return false; + } + + _addBaselineStyles(); + + // We produce a list of existing IDs so we don't generate a duplicate. + elsWithIds = document.querySelectorAll('[id]'); + idList = [].map.call(elsWithIds, function assign(el) { + return el.id; + }); + + for (i = 0; i < elements.length; i++) { + if (this.hasAnchorJSLink(elements[i])) { + indexesToDrop.push(i); + continue; + } + + if (elements[i].hasAttribute('id')) { + elementID = elements[i].getAttribute('id'); + } else { + tidyText = this.urlify(elements[i].textContent); + + // Compare our generated ID to existing IDs (and increment it if needed) + // before we add it to the page. + newTidyText = tidyText; + count = 0; + do { + if (index !== undefined) { + newTidyText = tidyText + '-' + count; + } + + index = idList.indexOf(newTidyText); + count += 1; + } while (index !== -1); + index = undefined; + idList.push(newTidyText); + + elements[i].setAttribute('id', newTidyText); + elementID = newTidyText; + } + + readableID = elementID.replace(/-/g, ' '); + + // The following code builds the following DOM structure in a more effiecient (albeit opaque) way. + // ''; + anchor = document.createElement('a'); + anchor.className = 'anchorjs-link ' + this.options.class; + anchor.href = '#' + elementID; + anchor.setAttribute('aria-label', 'Anchor link for: ' + readableID); + anchor.setAttribute('data-anchorjs-icon', this.options.icon); + + if (visibleOptionToUse === 'always') { + anchor.style.opacity = '1'; + } + + if (this.options.icon === '\ue9cb') { + anchor.style.font = '1em/1 anchorjs-icons'; + + // We set lineHeight = 1 here because the `anchorjs-icons` font family could otherwise affect the + // height of the heading. This isn't the case for icons with `placement: left`, so we restore + // line-height: inherit in that case, ensuring they remain positioned correctly. For more info, + // see https://github.com/bryanbraun/anchorjs/issues/39. + if (this.options.placement === 'left') { + anchor.style.lineHeight = 'inherit'; + } + } + + if (this.options.placement === 'left') { + anchor.style.position = 'absolute'; + anchor.style.marginLeft = '-1em'; + anchor.style.paddingRight = '0.5em'; + elements[i].insertBefore(anchor, elements[i].firstChild); + } else { // if the option provided is `right` (or anything else). + anchor.style.paddingLeft = '0.375em'; + elements[i].appendChild(anchor); + } + } + + for (i = 0; i < indexesToDrop.length; i++) { + elements.splice(indexesToDrop[i] - i, 1); + } + this.elements = this.elements.concat(elements); + + return this; + }; + + /** + * Removes all anchorjs-links from elements targed by the selector. + * @param {String|Array|Nodelist} selector - A CSS selector string targeting elements with anchor links, + * OR a nodeList / array containing the DOM elements. + * @return {this} - The AnchorJS object + */ + this.remove = function(selector) { + var index, + domAnchor, + elements = _getElements(selector); + + for (var i = 0; i < elements.length; i++) { + domAnchor = elements[i].querySelector('.anchorjs-link'); + if (domAnchor) { + // Drop the element from our main list, if it's in there. + index = this.elements.indexOf(elements[i]); + if (index !== -1) { + this.elements.splice(index, 1); + } + // Remove the anchor from the DOM. + elements[i].removeChild(domAnchor); + } + } + return this; + }; + + /** + * Removes all anchorjs links. Mostly used for tests. + */ + this.removeAll = function() { + this.remove(this.elements); + }; + + /** + * Urlify - Refine text so it makes a good ID. + * + * To do this, we remove apostrophes, replace nonsafe characters with hyphens, + * remove extra hyphens, truncate, trim hyphens, and make lowercase. + * + * @param {String} text - Any text. Usually pulled from the webpage element we are linking to. + * @return {String} - hyphen-delimited text for use in IDs and URLs. + */ + this.urlify = function(text) { + // Regex for finding the nonsafe URL characters (many need escaping): & +$,:;=?@"#{}|^~[`%!']./()*\ + var nonsafeChars = /[& +$,:;=?@"#{}|^~[`%!'\]\.\/\(\)\*\\]/g, + urlText; + + // The reason we include this _applyRemainingDefaultOptions is so urlify can be called independently, + // even after setting options. This can be useful for tests or other applications. + if (!this.options.truncate) { + _applyRemainingDefaultOptions(this.options); + } + + // Note: we trim hyphens after truncating because truncating can cause dangling hyphens. + // Example string: // " ⚡⚡ Don't forget: URL fragments should be i18n-friendly, hyphenated, short, and clean." + urlText = text.trim() // "⚡⚡ Don't forget: URL fragments should be i18n-friendly, hyphenated, short, and clean." + .replace(/\'/gi, '') // "⚡⚡ Dont forget: URL fragments should be i18n-friendly, hyphenated, short, and clean." + .replace(nonsafeChars, '-') // "⚡⚡-Dont-forget--URL-fragments-should-be-i18n-friendly--hyphenated--short--and-clean-" + .replace(/-{2,}/g, '-') // "⚡⚡-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated-short-and-clean-" + .substring(0, this.options.truncate) // "⚡⚡-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated-" + .replace(/^-+|-+$/gm, '') // "⚡⚡-Dont-forget-URL-fragments-should-be-i18n-friendly-hyphenated" + .toLowerCase(); // "⚡⚡-dont-forget-url-fragments-should-be-i18n-friendly-hyphenated" + + return urlText; + }; + + /** + * Determines if this element already has an AnchorJS link on it. + * Uses this technique: http://stackoverflow.com/a/5898748/1154642 + * @param {HTMLElemnt} el - a DOM node + * @return {Boolean} true/false + */ + this.hasAnchorJSLink = function(el) { + var hasLeftAnchor = el.firstChild && ((' ' + el.firstChild.className + ' ').indexOf(' anchorjs-link ') > -1), + hasRightAnchor = el.lastChild && ((' ' + el.lastChild.className + ' ').indexOf(' anchorjs-link ') > -1); + + return hasLeftAnchor || hasRightAnchor || false; + }; + + /** + * Turns a selector, nodeList, or array of elements into an array of elements (so we can use array methods). + * It also throws errors on any other inputs. Used to handle inputs to .add and .remove. + * @param {String|Array|Nodelist} input - A CSS selector string targeting elements with anchor links, + * OR a nodeList / array containing the DOM elements. + * @return {Array} - An array containing the elements we want. + */ + function _getElements(input) { + var elements; + if (typeof input === 'string' || input instanceof String) { + // See https://davidwalsh.name/nodelist-array for the technique transforming nodeList -> Array. + elements = [].slice.call(document.querySelectorAll(input)); + // I checked the 'input instanceof NodeList' test in IE9 and modern browsers and it worked for me. + } else if (Array.isArray(input) || input instanceof NodeList) { + elements = [].slice.call(input); + } else { + throw new Error('The selector provided to AnchorJS was invalid.'); + } + return elements; + } + + /** + * _addBaselineStyles + * Adds baseline styles to the page, used by all AnchorJS links irregardless of configuration. + */ + function _addBaselineStyles() { + // We don't want to add global baseline styles if they've been added before. + if (document.head.querySelector('style.anchorjs') !== null) { + return; + } + + var style = document.createElement('style'), + linkRule = + ' .anchorjs-link {' + + ' opacity: 0;' + + ' text-decoration: none;' + + ' -webkit-font-smoothing: antialiased;' + + ' -moz-osx-font-smoothing: grayscale;' + + ' }', + hoverRule = + ' *:hover > .anchorjs-link,' + + ' .anchorjs-link:focus {' + + ' opacity: 1;' + + ' }', + anchorjsLinkFontFace = + ' @font-face {' + + ' font-family: "anchorjs-icons";' + // Icon from icomoon; 10px wide & 10px tall; 2 empty below & 4 above + ' src: url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype");' + + ' }', + pseudoElContent = + ' [data-anchorjs-icon]::after {' + + ' content: attr(data-anchorjs-icon);' + + ' }', + firstStyleEl; + + style.className = 'anchorjs'; + style.appendChild(document.createTextNode('')); // Necessary for Webkit. + + // We place it in the head with the other style tags, if possible, so as to + // not look out of place. We insert before the others so these styles can be + // overridden if necessary. + firstStyleEl = document.head.querySelector('[rel="stylesheet"], style'); + if (firstStyleEl === undefined) { + document.head.appendChild(style); + } else { + document.head.insertBefore(style, firstStyleEl); + } + + style.sheet.insertRule(linkRule, style.sheet.cssRules.length); + style.sheet.insertRule(hoverRule, style.sheet.cssRules.length); + style.sheet.insertRule(pseudoElContent, style.sheet.cssRules.length); + style.sheet.insertRule(anchorjsLinkFontFace, style.sheet.cssRules.length); + } + } + + return AnchorJS; +})); diff --git a/docs/js/avatars.js b/docs/js/avatars.js index 58dbb7cbe3..3c60984741 100644 --- a/docs/js/avatars.js +++ b/docs/js/avatars.js @@ -16,8 +16,12 @@ } for (var i = 0; i < images.length; i += 1) { - images[i].onload = onloadHandler; - images[i].onerror = onloadHandler; + if (images[i].complete) { + counter -= 1; + } else { + images[i].onload = onloadHandler; + images[i].onerror = onloadHandler; + } } }); diff --git a/package.json b/package.json index 84dfc7e218..1902c0cfc9 100644 --- a/package.json +++ b/package.json @@ -305,7 +305,7 @@ "coveralls": "nyc report --reporter=text-lcov | coveralls", "prebuildDocs": "rm -rf docs/_dist && node scripts/docs-update-toc.js", "buildDocs": "bundle exec jekyll build --source ./docs --destination ./docs/_site --config ./docs/_config.yml --safe --drafts", - "postbuildDocs": "cp docs/_headers docs/_site/_headers && buildProduction docs/_site/index.html docs/_site/_headers --outroot docs/_dist --canonicalroot https://mochajs.org/ --optimizeimages --inlinehtmlimage 10000 --asyncscripts && cp docs/_headers docs/_dist/_headers && node scripts/netlify-headers.js >> docs/_dist/_headers", + "postbuildDocs": "buildProduction docs/_site/index.html --outroot docs/_dist --canonicalroot https://mochajs.org/ --optimizeimages --inlinehtmlimage 6800 --inlinehtmlscript 0 --asyncscripts && cp docs/_headers docs/_dist/_headers && node scripts/netlify-headers.js >> docs/_dist/_headers", "prewatchDocs": "node scripts/docs-update-toc.js", "watchDocs": "bundle exec jekyll serve --source ./docs --destination ./docs/_site --config ./docs/_config.yml --safe --drafts --watch" }, From d5a512563d0e845b57a2fed1320b120cb51a1067 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 18 Dec 2017 22:38:43 +0100 Subject: [PATCH 409/846] Be explicit about styling of screenshot images --- docs/css/style.css | 2 +- docs/index.md | 46 +++++++++++++++++++++++----------------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/css/style.css b/docs/css/style.css index 5216b4f881..164a77c542 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -164,7 +164,7 @@ pre { overflow-x: auto; } -main img:not([src*=avatar]):not([src*=badges]):not([src*=".svg"]) { +img.screenshot { display: block; margin: 30px auto; border-radius: 3px; diff --git a/docs/index.md b/docs/index.md index cd8d27c9af..69186c4d28 100644 --- a/docs/index.md +++ b/docs/index.md @@ -635,7 +635,7 @@ $ mocha 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?withoutEnlargement&resize=920,9999) +![test duration](images/reporter-spec-duration.png?withoutEnlargement&resize=920,9999){:class="screenshot"} To tweak what's considered "slow", you can use the `slow()` method: @@ -702,7 +702,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: -![string diffs](images/reporter-string-diffs.png?withoutEnlargement&resize=920,9999) +![string diffs](images/reporter-string-diffs.png?withoutEnlargement&resize=920,9999){:class="screenshot"} ## Usage @@ -1013,69 +1013,69 @@ Mocha reporters adjust to the terminal window, and always disable ANSI-escape co 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) -![spec reporter with failure](images/reporter-spec-fail.png?withoutEnlargement&resize=920,9999) +![spec reporter](images/reporter-spec.png?withoutEnlargement&resize=920,9999){:class="screenshot"} +![spec reporter with failure](images/reporter-spec-fail.png?withoutEnlargement&resize=920,9999){:class="screenshot"} ### 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. -![dot matrix reporter](images/reporter-dot.png?withoutEnlargement&resize=920,9999) +![dot matrix reporter](images/reporter-dot.png?withoutEnlargement&resize=920,9999){:class="screenshot"} ### Nyan The "nyan" reporter is exactly what you might expect: -![js nyan cat reporter](images/reporter-nyan.png?withoutEnlargement&resize=920,9999) +![js nyan cat reporter](images/reporter-nyan.png?withoutEnlargement&resize=920,9999){:class="screenshot"} ### 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](https://en.wikipedia.org/wiki/Test_Anything_Protocol) consumer. -![test anything protocol](images/reporter-tap.png?withoutEnlargement&resize=920,9999) +![test anything protocol](images/reporter-tap.png?withoutEnlargement&resize=920,9999){:class="screenshot"} ### Landing Strip The Landing Strip (`landing`) reporter is a gimmicky test reporter simulating a plane landing :) unicode ftw -![landing strip plane reporter](images/reporter-landing.png?withoutEnlargement&resize=920,9999) -![landing strip with failure](images/reporter-landing-fail.png?withoutEnlargement&resize=920,9999) +![landing strip plane reporter](images/reporter-landing.png?withoutEnlargement&resize=920,9999){:class="screenshot"} +![landing strip with failure](images/reporter-landing-fail.png?withoutEnlargement&resize=920,9999){:class="screenshot"} ### 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) +![list reporter](images/reporter-list.png?withoutEnlargement&resize=920,9999){:class="screenshot"} ### Progress The "progress" reporter implements a simple progress-bar: -![progress bar](images/reporter-progress.png?withoutEnlargement&resize=920,9999) +![progress bar](images/reporter-progress.png?withoutEnlargement&resize=920,9999){:class="screenshot"} ### 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) +![json reporter](images/reporter-json.png?withoutEnlargement&resize=920,9999){:class="screenshot"} ### 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) +![json stream reporter](images/reporter-json-stream.png?withoutEnlargement&resize=920,9999){:class="screenshot"} ### 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) +![min reporter](images/reporter-min.png?withoutEnlargement&resize=920,9999){:class="screenshot"} ### 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) +![doc reporter](images/reporter-doc.png?withoutEnlargement&resize=920,9999){:class="screenshot"} For example, suppose you have the following JavaScript: @@ -1127,7 +1127,7 @@ The "markdown" reporter generates a markdown TOC and body for your test suite. T The "HTML" reporter is currently the only browser reporter supported by Mocha, and it looks like this: -![HTML test reporter](images/reporter-html.png?withoutEnlargement&resize=920,9999) +![HTML test reporter](images/reporter-html.png?withoutEnlargement&resize=920,9999){:class="screenshot"} ### Undocumented Reporters @@ -1242,22 +1242,22 @@ $ make tm ### JetBrains -[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](https://www.jetbrains.com/) provides a [NodeJS plugin](https://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?withoutEnlargement&resize=920,9999&pngquant) +![JetBrains Mocha Runner Plugin in Action](images/jetbrains-plugin.png?withoutEnlargement&resize=920,9999&pngquant){:class="screenshot"} The plugin is titled **NodeJS**, and can be installed via **Preferences** > **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](https://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?withoutEnlargement&resize=920,9999&pngquant) +![Wallaby.js in Action](images/wallaby.png?withoutEnlargement&resize=920,9999&pngquant){:class="screenshot"} ### Emacs [Emacs](https://www.gnu.org/software/emacs/) support for running Mocha tests is available via a 3rd party package [mocha.el](https://github.com/scottaj/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) +![Emacs Mocha Runner in Action](images/emacs.png?withoutEnlargement&resize=920,9999&pngquant){:class="screenshot"} ### Mocha Sidebar (VS Code) @@ -1270,7 +1270,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) +![mocha side bar in Action](images/mocha_side_bar.png?withoutEnlargement&resize=920,9999&pngquant){:class="screenshot"} ## Examples From 8f1ded4e82b36df67b84347199adffe03fe8ffbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 18 Dec 2017 22:39:01 +0100 Subject: [PATCH 410/846] https urls where possible --- docs/index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/index.md b/docs/index.md index 69186c4d28..df89591673 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,7 +2,7 @@ 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](https://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).
    - © 2011 TJ Holowaychuk. All rights reserved. Licensed MIT + From 857e4cf06cdcbea2e7b3a3181023714574b5e2a8 Mon Sep 17 00:00:00 2001 From: Kelong Wang Date: Sat, 9 Apr 2016 21:41:21 -0700 Subject: [PATCH 218/846] Tweak suite-level timeout example to clarify usage (#19) * Eliminate trailing white spaces * Tweak suite-level timeout example to clarify usage To convey that the timeout is applied individually and not accumulated towards some total timeout. --- index.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/index.md b/index.md index cfa0d17e92..9eee6ab895 100644 --- a/index.md +++ b/index.md @@ -202,19 +202,19 @@ 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 }); ``` @@ -243,9 +243,9 @@ All "hooks" (`before()`, `after()`, `beforeEach()`, `afterEach()`) may be sync o ```js describe('Connection', function() { - var db = new Connection, - tobi = new User('tobi'), - loki = new User('loki'), + var db = new Connection, + tobi = new User('tobi'), + loki = new User('loki'), jane = new User('jane'); beforeEach(function(done) { @@ -285,11 +285,11 @@ If you need to perform asynchronous operations before any of your suites are run ```js setTimeout(function() { // do some setup - + describe('my suite', function() { // ... }); - + run(); }, 5000); ``` @@ -323,7 +323,7 @@ describe('Array', function() { ``` *Note*: All nested suites will still be executed. - + Here's an example of executing a particular test case: ```js @@ -342,7 +342,7 @@ describe('Array', function() { *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. +*Warning*: Having more than one call to `.only()` in your tests or suites may result in unexpected behavior. ## Inclusive Tests @@ -427,7 +427,7 @@ 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() { // ... }); @@ -450,7 +450,7 @@ describe('a suite of tests', function() { }); it('should take less than 500ms as well', function(done){ - setTimeout(done, 200); + setTimeout(done, 250); }); }) ``` @@ -654,7 +654,7 @@ suite('Array', function() { }); suite('#indexOf()', function() { - test('should return -1 when not present', function() { + test('should return -1 when not present', function() { assert.equal(-1, [1,2,3].indexOf(4)); }); }); @@ -990,7 +990,7 @@ The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Pl ### 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) ### Emacs From f3aaeb720d045d87526d9160a24ead0c7abccab6 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Sun, 10 Apr 2016 06:42:06 +0200 Subject: [PATCH 219/846] Use userland assertion library in code examples (#18) As pointed out by @Trott, "Node.js has locked the internal assert API and has updated documentation to encourage users to employ userland assertion libraries instead." http://git.io/v8WWl It makes sense for us to update the code examples using a userland assertion library. I chose `chai` because its assert API mimics node's `assert`, and therefore I only* needed to change the required library. --- index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.md b/index.md index 9eee6ab895..d8f19c9f9b 100644 --- a/index.md +++ b/index.md @@ -90,7 +90,7 @@ $ $EDITOR test/test.js In your editor: ```js -var assert = require('assert'); +var assert = require('chai').assert; describe('Array', function() { describe('#indexOf()', function () { it('should return -1 when the value is not present', function () { @@ -381,7 +381,7 @@ Given Mocha's use of `Function.prototype.call` and function expressions to defin Take the following example: ```js -var assert = require('assert'); +var assert = require('chai').assert; function add() { return Array.prototype.slice.call(arguments).reduce(function(prev, curr) { @@ -721,7 +721,7 @@ The `require` interface allows you to require the `describe` and friend words di var testCase = require('mocha').describe; var pre = require('mocha').before; var assertions = require('mocha').it; -var assert = require('assert'); +var assert = require('chai').assert; testCase('Array', function() { pre(function() { From 764c395ef64760f2f176033f09307348e6492f5a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 10 Apr 2016 18:55:55 -0700 Subject: [PATCH 220/846] switch to kramdown since GH will drop support (#30) * switch to kramdown since GH will drop support * fix emdash rendering issue (this was the only one I found) * use rouge for syntax highlighting; fix "makefile" formatting --- _config.yml | 4 ++-- index.md | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/_config.yml b/_config.yml index 7d22174d9e..ed1df4b6c7 100644 --- a/_config.yml +++ b/_config.yml @@ -1,8 +1,8 @@ url: http://mochajs.org -markdown: redcarpet +markdown: kramdown redcarpet: extensions: ["with_toc_data"] -highlighter: pygments +highlighter: rouge exclude: - node_modules - README.md diff --git a/index.md b/index.md index d8f19c9f9b..1408876855 100644 --- a/index.md +++ b/index.md @@ -541,7 +541,7 @@ Executes tests on changes to JavaScript in the CWD, and once initially. ### `--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 +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+. @@ -854,10 +854,10 @@ The command `mocha --reporter doc array` would yield: 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: ```makefile - test-docs: - make test REPORTER=doc \ - | cat docs/head.html - docs/tail.html \ - > docs/test.html +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. From 03865c84bb71844a4836fcc48ec77e02f606b6e0 Mon Sep 17 00:00:00 2001 From: David da Silva Date: Mon, 11 Apr 2016 03:56:15 +0200 Subject: [PATCH 221/846] Fix border bug in feature columns (#31) First column's last li's border-bottom was breaking into the following column. --- css/style.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/css/style.css b/css/style.css index 99375ed2c4..4c4447b4e5 100644 --- a/css/style.css +++ b/css/style.css @@ -126,6 +126,9 @@ ul li { 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; } ul::after { From 8b22f59a4b05db6fbc553be0e5584b0cfbe4ed97 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 10 Apr 2016 19:10:22 -0700 Subject: [PATCH 222/846] add npm logs to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 90dbb6975a..de211d7054 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ _site node_modules +npm-debug.log* From b7ffac726f1ffe3a6bc3af110b6bb5b9a79ef61a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 10 Apr 2016 19:10:31 -0700 Subject: [PATCH 223/846] add some notes to README.md --- README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/README.md b/README.md index 0be8a8dc26..538228fe67 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,26 @@ 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` +### Problems? + +#### Permissions-Related + +If `npm install` fails due to an `EACCESS` problem, try this: + +```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 From 9a265bf891827f6c08891132cf744a686925004c Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 10 Apr 2016 19:21:31 -0700 Subject: [PATCH 224/846] update footer style --- _includes/footer.html | 10 ++++++---- css/style.css | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/_includes/footer.html b/_includes/footer.html index 61b4cbd296..3f9e5cc1f3 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,5 +1,7 @@ - From 57dfe4ff2d6da287593a8978c121df8db90a3e23 Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Tue, 1 Nov 2016 21:17:36 -0500 Subject: [PATCH 250/846] Getting started run test (#58) * delete random space * run a test show users how to run a test by pointing to the local install of mocha * set up test scripts show users how to set up their npm test script to use mocha * simplify test script npm has ./node_modules/.bin in path, so calling the module works fine. --- index.md | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/index.md b/index.md index 3839636eba..ea6fdc14cc 100644 --- a/index.md +++ b/index.md @@ -84,7 +84,7 @@ $ npm install --global mocha ``` or as a development dependency for your project: - + ```sh $ npm install --save-dev mocha ``` @@ -117,6 +117,8 @@ describe('Array', function() { Back in the terminal: ```sh +$ ./node_modules/mocha/bin/mocha + Array #indexOf() ✓ should return -1 when the value is not present @@ -125,6 +127,20 @@ Back in the terminal: 1 passing (9ms) ``` +Set up a test script in package.json: + +```json +"scripts": { + "test": "mocha" + } +``` + +Then run tests with: + +```sh +$ npm test +``` + ## Assertions 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: @@ -395,7 +411,7 @@ describe('Array', 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() { // this test will not be run }); @@ -416,13 +432,13 @@ describe('Array', 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 @@ -539,11 +555,11 @@ This feature does re-run `beforeEach/afterEach` hooks but not `before/after` hoo describe('retries', function() { // Retry all tests in this suite up to 4 times this.retries(4); - + beforeEach(function () { browser.get('http://www.yahoo.com'); }); - + it('should succeed on the 3rd try', function () { // Specify this test to only retry up to 2 times this.retries(2); @@ -660,7 +676,7 @@ 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. +> 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 @@ -742,7 +758,7 @@ name. For example `--compilers coffee:coffee-script` with CoffeeScript 1.6- or #### 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. +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` From 9dd68a50d764955c7e7788701e67bb58a839f6c5 Mon Sep 17 00:00:00 2001 From: Ben Harris Date: Fri, 4 Nov 2016 10:48:10 -0500 Subject: [PATCH 251/846] increase font size use 16px for normal text and 14px with 2.0 line height for code --- css/style.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/css/style.css b/css/style.css index b271de0b5a..55f2ec81d5 100644 --- a/css/style.css +++ b/css/style.css @@ -1,5 +1,5 @@ html { - font: 14px/1.6 "Helvetica Neue", Helvetica, Arial, sans-serif; + font: 16px/1.6 "Helvetica Neue", Helvetica, Arial, sans-serif; } body { @@ -127,7 +127,8 @@ ul::after { } code { - font: 12px monaco, monospace; + font: 14px monaco, monospace; + line-height: 2.0; } pre { From bf62cd90f4a95c29170cb1f38e31b91dc5c76616 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 6 Nov 2016 10:46:54 -0800 Subject: [PATCH 252/846] decrease line-height slightgly for code --- css/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/css/style.css b/css/style.css index 55f2ec81d5..a3caa3db03 100644 --- a/css/style.css +++ b/css/style.css @@ -128,7 +128,7 @@ ul::after { code { font: 14px monaco, monospace; - line-height: 2.0; + line-height: 1.8; } pre { From 482dbe4b17acb3d01920a09ce56c4527a4ad0066 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sun, 6 Nov 2016 17:01:35 -0800 Subject: [PATCH 253/846] fix hardcoded scheme in anchor.js url --- _includes/footer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_includes/footer.html b/_includes/footer.html index 10565d1a91..0a1f43e861 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -4,7 +4,7 @@ href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License.

    Last updated: {{ site.time | date: "%c" }} - + - - + + - + - + + diff --git a/favicon.ico b/docs/favicon.ico similarity index 100% rename from favicon.ico rename to docs/favicon.ico diff --git a/images/emacs.png b/docs/images/emacs.png similarity index 100% rename from images/emacs.png rename to docs/images/emacs.png diff --git a/images/jetbrains-plugin.png b/docs/images/jetbrains-plugin.png similarity index 100% rename from images/jetbrains-plugin.png rename to docs/images/jetbrains-plugin.png diff --git a/images/reporter-doc.png b/docs/images/reporter-doc.png similarity index 100% rename from images/reporter-doc.png rename to docs/images/reporter-doc.png diff --git a/images/reporter-dot.png b/docs/images/reporter-dot.png similarity index 100% rename from images/reporter-dot.png rename to docs/images/reporter-dot.png diff --git a/images/reporter-html.png b/docs/images/reporter-html.png similarity index 100% rename from images/reporter-html.png rename to docs/images/reporter-html.png diff --git a/images/reporter-json-stream.png b/docs/images/reporter-json-stream.png similarity index 100% rename from images/reporter-json-stream.png rename to docs/images/reporter-json-stream.png diff --git a/images/reporter-json.png b/docs/images/reporter-json.png similarity index 100% rename from images/reporter-json.png rename to docs/images/reporter-json.png diff --git a/images/reporter-landing-fail.png b/docs/images/reporter-landing-fail.png similarity index 100% rename from images/reporter-landing-fail.png rename to docs/images/reporter-landing-fail.png diff --git a/images/reporter-landing.png b/docs/images/reporter-landing.png similarity index 100% rename from images/reporter-landing.png rename to docs/images/reporter-landing.png diff --git a/images/reporter-list.png b/docs/images/reporter-list.png similarity index 100% rename from images/reporter-list.png rename to docs/images/reporter-list.png diff --git a/images/reporter-min.png b/docs/images/reporter-min.png similarity index 100% rename from images/reporter-min.png rename to docs/images/reporter-min.png diff --git a/images/reporter-nyan.png b/docs/images/reporter-nyan.png similarity index 100% rename from images/reporter-nyan.png rename to docs/images/reporter-nyan.png diff --git a/images/reporter-progress.png b/docs/images/reporter-progress.png similarity index 100% rename from images/reporter-progress.png rename to docs/images/reporter-progress.png diff --git a/images/reporter-spec-duration.png b/docs/images/reporter-spec-duration.png similarity index 100% rename from images/reporter-spec-duration.png rename to docs/images/reporter-spec-duration.png diff --git a/images/reporter-spec-fail.png b/docs/images/reporter-spec-fail.png similarity index 100% rename from images/reporter-spec-fail.png rename to docs/images/reporter-spec-fail.png diff --git a/images/reporter-spec.png b/docs/images/reporter-spec.png similarity index 100% rename from images/reporter-spec.png rename to docs/images/reporter-spec.png diff --git a/images/reporter-string-diffs.png b/docs/images/reporter-string-diffs.png similarity index 100% rename from images/reporter-string-diffs.png rename to docs/images/reporter-string-diffs.png diff --git a/images/reporter-tap.png b/docs/images/reporter-tap.png similarity index 100% rename from images/reporter-tap.png rename to docs/images/reporter-tap.png diff --git a/images/wallaby.png b/docs/images/wallaby.png similarity index 100% rename from images/wallaby.png rename to docs/images/wallaby.png diff --git a/index.md b/docs/index.md similarity index 100% rename from index.md rename to docs/index.md diff --git a/docs/js/avatars.js b/docs/js/avatars.js new file mode 100644 index 0000000000..1bf3e690be --- /dev/null +++ b/docs/js/avatars.js @@ -0,0 +1,15 @@ +(function () { + 'use strict'; + // dumb thing that helps with animation of avatars + var avatars = window.avatars = function (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/docs/js/ga.js similarity index 100% rename from js/ga.js rename to docs/js/ga.js diff --git a/example/mocha.css b/example/mocha.css deleted file mode 100644 index 72f8d00f5a..0000000000 --- a/example/mocha.css +++ /dev/null @@ -1,266 +0,0 @@ -@charset "utf-8"; - -body { - margin:0; -} - -#mocha { - font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; - margin: 60px 50px; -} - -#mocha ul, -#mocha li { - margin: 0; - padding: 0; -} - -#mocha ul { - list-style: none; -} - -#mocha h1, -#mocha h2 { - margin: 0; -} - -#mocha h1 { - margin-top: 15px; - font-size: 1em; - font-weight: 200; -} - -#mocha h1 a { - text-decoration: none; - color: inherit; -} - -#mocha h1 a:hover { - text-decoration: underline; -} - -#mocha .suite .suite h1 { - margin-top: 0; - font-size: .8em; -} - -#mocha .hidden { - display: none; -} - -#mocha h2 { - font-size: 12px; - font-weight: normal; - cursor: pointer; -} - -#mocha .suite { - margin-left: 15px; -} - -#mocha .test { - margin-left: 15px; - overflow: hidden; -} - -#mocha .test.pending:hover h2::after { - content: '(pending)'; - font-family: arial, sans-serif; -} - -#mocha .test.pass.medium .duration { - background-color: #c09853; -} - -#mocha .test.pass.slow .duration { - background-color: #b94a48; -} - -#mocha .test.pass::before { - content: '✓'; - font-size: 12px; - display: block; - float: left; - margin-right: 5px; - color: #00d6b2; -} - -#mocha .test.pass .duration { - font-size: 9px; - margin-left: 5px; - padding: 2px 5px; - color: white; - -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); - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - -o-border-radius: 5px; - border-radius: 5px; -} - -#mocha .test.pass.fast .duration { - display: none; -} - -#mocha .test.pending { - color: #0b97c4; -} - -#mocha .test.pending::before { - content: '◦'; - color: #0b97c4; -} - -#mocha .test.fail { - color: #c00; -} - -#mocha .test.fail pre { - color: black; -} - -#mocha .test.fail::before { - content: '✖'; - font-size: 12px; - display: block; - float: left; - margin-right: 5px; - color: #c00; -} - -#mocha .test pre.error { - color: #c00; - max-height: 300px; - overflow: auto; -} - -#mocha .test pre { - display: block; - float: left; - clear: left; - font: 12px/1.5 monaco, monospace; - margin: 5px; - padding: 15px; - border: 1px solid #eee; - border-bottom-color: #ddd; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - -o-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: 0 1px 3px #eee; - -moz-box-shadow: 0 1px 3px #eee; - box-shadow: 0 1px 3px #eee; -} - -#mocha .test h2 { - position: relative; -} - -#mocha .test a.replay { - position: absolute; - top: 3px; - right: 0; - text-decoration: none; - vertical-align: middle; - display: block; - width: 15px; - height: 15px; - line-height: 15px; - text-align: center; - background-color: #eee; - font-size: 15px; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - -o-border-radius: 15px; - border-radius: 15px; - -webkit-transition: opacity 200ms; - -moz-transition: opacity 200ms; - -o-transition: opacity 200ms; - transition: opacity 200ms; - opacity: 0.3; - color: #888; -} - -#mocha .test:hover a.replay { - opacity: 1; -} - -#mocha-report.pass .test.fail { - display: none; -} - -#mocha-report.fail .test.pass { - display: none; -} - -#mocha-report.pending .test.pass, -#mocha-report.pending .test.fail { - display: none; -} -#mocha-report.pending .test.pass.pending { - display: block; -} - -#mocha-error { - color: #c00; - font-size: 1.5em; - font-weight: 100; - letter-spacing: 1px; -} - -#mocha-stats { - position: fixed; - top: 15px; - right: 10px; - font-size: 12px; - margin: 0; - color: #888; - z-index: 1; -} - -#mocha-stats .progress { - float: right; - padding-top: 0; -} - -#mocha-stats em { - color: black; -} - -#mocha-stats a { - text-decoration: none; - color: inherit; -} - -#mocha-stats a:hover { - border-bottom: 1px solid #eee; -} - -#mocha-stats li { - display: inline-block; - margin: 0 5px; - list-style: none; - padding-top: 11px; -} - -#mocha-stats canvas { - width: 40px; - 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 } - -@media screen and (max-device-width: 480px) { - #mocha { - margin: 60px 0; - } - - #mocha #stats { - position: absolute; - } -} diff --git a/example/mocha.js b/example/mocha.js deleted file mode 100644 index 9c34f90d66..0000000000 --- a/example/mocha.js +++ /dev/null @@ -1,5547 +0,0 @@ -;(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.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){ -/* 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 - */ -var JsDiff = (function() { - /*jshint maxparams: 5*/ - 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; - } - - 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 }]; - } - - newString = this.tokenize(newString); - oldString = this.tokenize(oldString); - - var newLen = newString.length, oldLen = oldString.length; - var maxEditLength = newLen + oldLen; - var bestPath = [{ newPos: -1, components: [] }]; - - // 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 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; - } - - var canAdd = addPath && addPath.newPos+1 < newLen; - var canRemove = removePath && 0 <= oldPos && oldPos < oldLen; - if (!canAdd && !canRemove) { - 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); - this.pushComponent(basePath.components, oldString[oldPos], undefined, true); - } else { - basePath = clonePath(addPath); - basePath.newPos++; - this.pushComponent(basePath.components, newString[basePath.newPos], true, undefined); - } - - var oldPos = this.extractCommon(basePath, newString, oldString, diagonalPath); - - 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; - }, - - 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; - } - }; - - 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(); - LineDiff.tokenize = function(value) { - return value.split(/^/m); - }; - - return { - Diff: Diff, - - 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); }, - - diffCss: function(oldStr, newStr) { return CssDiff.diff(oldStr, newStr); }, - - createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { - var ret = []; - - ret.push('Index: ' + fileName); - ret.push('==================================================================='); - ret.push('--- ' + fileName + (typeof oldHeader === 'undefined' ? '' : '\t' + oldHeader)); - ret.push('+++ ' + fileName + (typeof newHeader === 'undefined' ? '' : '\t' + newHeader)); - - 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 - - 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); - - // 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 (!oldRangeStart) { - var prev = diff[i-1]; - oldRangeStart = oldLine; - newRangeStart = newLine; - - 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'); - }, - - 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; - for ( var i = 0; i < changes.length; i++) { - change = changes[i]; - ret.push([(change.added ? 1 : change.removed ? -1 : 0), change.value]); - } - return ret; - } - }; -})(); - -if (typeof module !== 'undefined') { - module.exports = JsDiff; -} - -}); // 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(){ - 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){ - this.runnable().timeout(ms); - 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; -}; - -/** - * 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. - */ - -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`. - */ - -function F(){}; -F.prototype = Runnable.prototype; -Hook.prototype = new F; -Hook.prototype.constructor = Hook; - - -/** - * Get or set the test `err`. - * - * @param {Error} err - * @return {Error} - * @api public - */ - -Hook.prototype.error = function(err){ - if (0 == arguments.length) { - var err = this._error; - this._error = null; - return err; - } - - this._error = err; -}; - -}); // module: hook.js - -require.register("interfaces/bdd.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test') - , utils = require('../utils'); - -/** - * 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, file, mocha){ - - /** - * 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.call(suite); - suites.shift(); - return suite; - }; - - /** - * Pending describe. - */ - - 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(); - }; - - /** - * Exclusive suite. - */ - - context.describe.only = function(title, fn){ - var suite = context.describe(title, fn); - mocha.grep(suite.fullTitle()); - return suite; - }; - - /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. - */ - - context.it = context.specify = function(title, fn){ - var suite = suites[0]; - if (suite.pending) var fn = null; - var test = new Test(title, fn); - suite.addTest(test); - return test; - }; - - /** - * Exclusive test-case. - */ - - context.it.only = function(title, fn){ - var test = context.it(title, fn); - var reString = '^' + utils.escapeRegexp(test.fullTitle()) + '$'; - mocha.grep(new RegExp(reString)); - return test; - }; - - /** - * Pending test case. - */ - - context.xit = - context.xspecify = - context.it.skip = function(title){ - context.it(title); - }; - }); -}; - -}); // 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') - , utils = require('../utils'); - -/** - * 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, file, mocha){ - - /** - * 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); - return suite; - }; - - /** - * Exclusive test-case. - */ - - 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. - */ - - context.test = function(title, fn){ - var test = new Test(title, fn); - suites[0].addTest(test); - return test; - }; - - /** - * Exclusive test-case. - */ - - context.test.only = function(title, fn){ - var test = context.test(title, fn); - var reString = '^' + utils.escapeRegexp(test.fullTitle()) + '$'; - mocha.grep(new RegExp(reString)); - }; - - /** - * Pending test case. - */ - - context.test.skip = function(title){ - context.test(title); - }; - }); -}; - -}); // module: interfaces/qunit.js - -require.register("interfaces/tdd.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test') - , utils = require('../utils');; - -/** - * 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, file, mocha){ - - /** - * 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.call(suite); - suites.shift(); - return suite; - }; - - /** - * 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(); - }; - - /** - * Exclusive test-case. - */ - - 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. - */ - - context.test = function(title, fn){ - var suite = suites[0]; - if (suite.pending) var fn = null; - var test = new Test(title, fn); - suite.addTest(test); - return test; - }; - - /** - * Exclusive test-case. - */ - - context.test.only = function(title, fn){ - var test = context.test(title, fn); - var reString = '^' + utils.escapeRegexp(test.fullTitle()) + '$'; - mocha.grep(new RegExp(reString)); - }; - - /** - * Pending test case. - */ - - context.test.skip = function(title){ - context.test(title); - }; - }); -}; - -}); // 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') - , utils = require('./utils'); - -/** - * Expose `Mocha`. - */ - -exports = module.exports = Mocha; - -/** - * Expose internals. - */ - -exports.utils = 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 - * - `bail` bail on the first test failure - * - `slow` milliseconds to wait before considering a test slow - * - `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.bail(options.bail); - this.reporter(options.reporter); - if (null != options.timeout) this.timeout(options.timeout); - if (options.slow) this.slow(options.slow); -} - -/** - * Enable or disable bailing on the first failure. - * - * @param {Boolean} [bail] - * @api public - */ - -Mocha.prototype.bail = function(bail){ - if (0 == arguments.length) bail = true; - this.suite.bail(bail); - return this; -}; - -/** - * Add test `file`. - * - * @param {String} file - * @api public - */ - -Mocha.prototype.addFile = function(file){ - this.files.push(file); - return this; -}; - -/** - * Set reporter to `reporter`, defaults to "dot". - * - * @param {String|Function} reporter name or constructor - * @api public - */ - -Mocha.prototype.reporter = function(reporter){ - if ('function' == typeof reporter) { - this._reporter = reporter; - } else { - reporter = reporter || 'dot'; - try { - this._reporter = require('./reporters/' + reporter); - } catch (err) { - this._reporter = require(reporter); - } - if (!this._reporter) throw new Error('invalid reporter "' + reporter + '"'); - } - 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(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()); - }); -}; - -/** - * 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, if `re` is a string it is escaped. - * - * @param {RegExp|String} re - * @return {Mocha} - * @api public - */ - -Mocha.prototype.grep = function(re){ - this.options.grep = 'string' == typeof re - ? new RegExp(utils.escapeRegexp(re)) - : re; - return this; -}; - -/** - * Invert `.grep()` matches. - * - * @return {Mocha} - * @api public - */ - -Mocha.prototype.invert = function(){ - this.options.invert = true; - return this; -}; - -/** - * Ignore global leaks. - * - * @param {Boolean} ignore - * @return {Mocha} - * @api public - */ - -Mocha.prototype.ignoreLeaks = function(ignore){ - this.options.ignoreLeaks = !!ignore; - return this; -}; - -/** - * Enable global leak checking. - * - * @return {Mocha} - * @api public - */ - -Mocha.prototype.checkLeaks = function(){ - this.options.ignoreLeaks = false; - return this; -}; - -/** - * Enable growl support. - * - * @return {Mocha} - * @api public - */ - -Mocha.prototype.growl = function(){ - this.options.growl = true; - return this; -}; - -/** - * Ignore `globals` array or string. - * - * @param {Array|String} globals - * @return {Mocha} - * @api public - */ - -Mocha.prototype.globals = function(globals){ - this.options.globals = (this.options.globals || []).concat(globals); - return this; -}; - -/** - * Set the timeout in milliseconds. - * - * @param {Number} timeout - * @return {Mocha} - * @api public - */ - -Mocha.prototype.timeout = function(timeout){ - this.suite.timeout(timeout); - return this; -}; - -/** - * Set slowness threshold in milliseconds. - * - * @param {Number} slow - * @return {Mocha} - * @api public - */ - -Mocha.prototype.slow = function(slow){ - this.suite.slow(slow); - return this; -}; - -/** - * Makes all tests async (accepting a callback) - * - * @return {Mocha} - * @api public - */ - -Mocha.prototype.asyncOnly = function(){ - this.options.asyncOnly = true; - return this; -}; - -/** - * Run tests and invoke `fn()` when complete. - * - * @param {Function} fn - * @return {Runner} - * @api public - */ - -Mocha.prototype.run = function(fn){ - if (this.files.length) this.loadFiles(); - var suite = this.suite; - var options = this.options; - var runner = new exports.Runner(suite); - var reporter = new this._reporter(runner); - runner.ignoreLeaks = false !== options.ignoreLeaks; - 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); - return runner.run(fn); -}; - -}); // module: mocha.js - -require.register("ms.js", function(module, exports, require){ -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} options - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options){ - options = options || {}; - if ('string' == typeof val) return parse(val); - return options.long - ? long(val) - : short(val); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -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 n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'y': - return n * y; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 's': - return n * s; - case 'ms': - return n; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function short(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'; - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function long(ms) { - return plural(ms, d, 'day') - || plural(ms, h, 'hour') - || plural(ms, m, 'minute') - || plural(ms, s, 'second') - || ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(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("reporters/base.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var tty = require('browser/tty') - , diff = require('browser/diff') - , ms = require('../ms'); - -/** - * 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 || (process.env.MOCHA_COLORS !== undefined); - -/** - * Inline diffs instead of +/- - */ - -exports.inlineDiffs = false; - -/** - * 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 -}; - -/** - * Default symbol map. - */ - -exports.symbols = { - ok: '✓', - err: '✖', - dot: '․' -}; - -// With node.js on Windows: use symbols available in terminal default fonts -if ('win32' == process.platform) { - exports.symbols.ok = '\u221A'; - exports.symbols.err = '\u00D7'; - exports.symbols.dot = '.'; -} - -/** - * 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 '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[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('\u001b[?25l'); - }, - - show: function(){ - process.stdout.write('\u001b[?25h'); - }, - - deleteLine: function(){ - process.stdout.write('\u001b[2K'); - }, - - beginningOfLine: function(){ - process.stdout.write('\u001b[0G'); - }, - - CR: function(){ - exports.cursor.deleteLine(); - exports.cursor.beginningOfLine(); - } -}; - -/** - * 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 - , escape = true; - - // uncaught - if (err.uncaught) { - msg = 'Uncaught ' + msg; - } - - // explicitly show diff - if (err.showDiff && sameType(actual, expected)) { - escape = false; - err.actual = actual = stringify(actual); - err.expected = expected = stringify(expected); - } - - // actual / expected diff - if ('string' == typeof actual && 'string' == typeof expected) { - fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n'); - if (exports.inlineDiffs) { - msg = inlineDiff(err, escape); - } else { - msg = unifiedDiff(err, escape); - } - } - - // 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.stats = stats; - - 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 = test.slow() / 2; - test.speed = test.duration > test.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; - var tests; - var fmt; - - console.log(); - - // passes - fmt = color('bright pass', ' ') - + color('green', ' %d passing') - + color('light', ' (%s)'); - - console.log(fmt, - stats.passes || 0, - ms(stats.duration)); - - // pending - if (stats.pending) { - fmt = color('pending', ' ') - + color('pending', ' %d pending'); - - console.log(fmt, stats.pending); - } - - // failures - if (stats.failures) { - fmt = color('fail', ' %d failing'); - - console.error(fmt, - stats.failures); - - Base.list(this.failures); - console.error(); - } - - 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; -} - - -/** - * Returns an inline diff between 2 strings with coloured ANSI output - * - * @param {Error} Error with actual/expected - * @return {String} Diff - * @api private - */ - -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){ - 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, ' '); - return msg; -} - -/** - * Returns a unified diff between 2 strings - * - * @param {Error} Error with actual/expected - * @return {String} Diff - * @api private - */ - -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; - } - function notBlank(line) { - return line != null; - } - 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 a character diff for `err`. - * - * @param {Error} err - * @return {String} - * @api private - */ - -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){ - if (str.added) return colorLines('diff added', str.value); - if (str.removed) return colorLines('diff removed', str.value); - return str.value; - }).join(''); -} - -/** - * Returns a string with all invisible characters in plain text - * - * @param {String} line - * @return {String} - * @api private - */ -function escapeInvisibles(line) { - 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 - */ - -function colorLines(name, str) { - return str.split('\n').map(function(str){ - return color(name, str); - }).join('\n'); -} - -/** - * Stringify `obj`. - * - * @param {Mixed} obj - * @return {String} - * @api private - */ - -function stringify(obj) { - if (obj instanceof RegExp) return obj.toString(); - return JSON.stringify(obj, null, 2); -} - -/** - * Check that a / b have the same type. - * - * @param {Object} a - * @param {Object} b - * @return {Boolean} - * @api private - */ - -function sameType(a, b) { - a = Object.prototype.toString.call(a); - b = Object.prototype.toString.call(b); - return a == b; -} - -}); // 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(), utils.escape(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(), utils.escape(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', Base.symbols.dot)); - }); - - runner.on('pass', function(test){ - if (++n % width == 0) process.stdout.write('\n '); - if ('slow' == test.speed) { - 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 '); - process.stdout.write(color('fail', Base.symbols.dot)); - }); - - runner.on('end', function(){ - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -function F(){}; -F.prototype = Base.prototype; -Dot.prototype = new F; -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 = ''; - -/** - * Initialize a new `Doc` reporter. - * - * @param {Runner} runner - * @api public - */ - -function HTML(runner, root) { - 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 = root || document.getElementById('mocha'); - - if (canvas.getContext) { - var ratio = window.devicePixelRatio || 1; - canvas.style.width = canvas.width; - canvas.style.height = canvas.height; - canvas.width *= ratio; - canvas.height *= ratio; - ctx = canvas.getContext('2d'); - ctx.scale(ratio, ratio); - progress = new Progress; - } - - if (!root) return error('#mocha div missing, add it to your document'); - - // pass toggle - on(passesLink, 'click', function(){ - unhide(); - var name = /pass/.test(report.className) ? '' : ' pass'; - report.className = report.className.replace(/fail|pass/g, '') + name; - if (report.className.trim()) hideSuitesWithout('test pass'); - }); - - // failure toggle - on(failuresLink, 'click', function(){ - unhide(); - var name = /fail/.test(report.className) ? '' : ' fail'; - report.className = report.className.replace(/fail|pass/g, '') + name; - if (report.className.trim()) hideSuitesWithout('test fail'); - }); - - root.appendChild(stat); - root.appendChild(report); - - if (progress) progress.size(40); - - runner.on('suite', function(suite){ - if (suite.root) return; - - // suite - var url = '?grep=' + encodeURIComponent(suite.fullTitle()); - var el = fragment('
    • %s

    • ', url, escape(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) runner.emit('test end', 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); - - // 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, encodeURIComponent(test.fullTitle())); - } else if (test.pending) { - var el = fragment('
    • %e

    • ', test.title); - } else { - var el = fragment('
    • %e

    • ', test.title, encodeURIComponent(test.fullTitle())); - 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 - // TODO: defer - if (!test.pending) { - var h2 = el.getElementsByTagName('h2')[0]; - - on(h2, 'click', function(){ - pre.style.display = 'none' == pre.style.display - ? 'block' - : 'none'; - }); - - var pre = fragment('
      %e
      ', utils.clean(test.fn.toString())); - el.appendChild(pre); - pre.style.display = 'none'; - } - - // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. - if (stack[0]) 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; -} - -/** - * Check for suites that do not have elements - * with `classname`, and hide them. - */ - -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'; - } -} - -/** - * Unhide .hidden suites. - */ - -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'); - } -} - -/** - * 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.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){ - -/** - * 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; - } - - 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. - * - * @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('\u001b[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('\u001b[0m'); - }); - - runner.on('end', function(){ - cursor.show(); - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -function F(){}; -F.prototype = Base.prototype; -Landing.prototype = new F; -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', ' '+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){ - cursor.CR(); - console.log(color('fail', ' %d) %s'), ++n, test.fullTitle()); - }); - - runner.on('end', self.epilogue.bind(self)); -} - -/** - * Inherit from `Base.prototype`. - */ - -function F(){}; -F.prototype = Base.prototype; -List.prototype = new F; -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 - , 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\n'; - 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('\u001b[2J'); - // set cursor position - process.stdout.write('\u001b[1;3H'); - }); - - runner.on('end', this.epilogue.bind(this)); -} - -/** - * Inherit from `Base.prototype`. - */ - -function F(){}; -F.prototype = Base.prototype; -Min.prototype = new F; -Min.prototype.constructor = Min; - - -}); // module: reporters/min.js - -require.register("reporters/nyan.js", function(module, exports, require){ -/** - * Module dependencies. - */ - -var Base = require('./base') - , color = Base.color; - -/** - * Expose `Dot`. - */ - -exports = module.exports = NyanCat; - -/** - * Initialize a new `Dot` matrix test reporter. - * - * @param {Runner} runner - * @api public - */ - -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(){ - Base.cursor.hide(); - self.draw(); - }); - - runner.on('pending', function(test){ - self.draw(); - }); - - runner.on('pass', function(test){ - self.draw(); - }); - - runner.on('fail', function(test, err){ - self.draw(); - }); - - runner.on('end', function(){ - Base.cursor.show(); - for (var i = 0; i < self.numberOfLines; i++) write('\n'); - self.epilogue(); - }); -} - -/** - * Draw the nyan cat - * - * @api private - */ - -NyanCat.prototype.draw = function(){ - this.appendRainbow(); - this.drawScoreboard(); - this.drawRainbow(); - this.drawNyanCat(); - this.tick = !this.tick; -}; - -/** - * Draw the "scoreboard" showing the number - * of passes, failures and pending tests. - * - * @api private - */ - -NyanCat.prototype.drawScoreboard = function(){ - var stats = this.stats; - var colors = Base.colors; - - function draw(color, n) { - write(' '); - write('\u001b[' + color + 'm' + n + '\u001b[0m'); - write('\n'); - } - - draw(colors.green, stats.passes); - draw(colors.fail, stats.failures); - draw(colors.pending, stats.pending); - write('\n'); - - this.cursorUp(this.numberOfLines); -}; - -/** - * Append the rainbow. - * - * @api private - */ - -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(); - trajectory.push(rainbowified); - } -}; - -/** - * Draw the rainbow. - * - * @api private - */ - -NyanCat.prototype.drawRainbow = function(){ - var self = this; - - this.trajectories.forEach(function(line, index) { - write('\u001b[' + self.scoreboardWidth + 'C'); - write(line.join('')); - write('\n'); - }); - - this.cursorUp(this.numberOfLines); -}; - -/** - * Draw the nyan cat - * - * @api private - */ - -NyanCat.prototype.drawNyanCat = function() { - var self = this; - var startWidth = this.scoreboardWidth + this.trajectories[0].length; - var color = '\u001b[' + startWidth + 'C'; - var padding = ''; - - write(color); - write('_,------,'); - write('\n'); - - write(color); - padding = self.tick ? ' ' : ' '; - write('_|' + padding + '/\\_/\\ '); - write('\n'); - - write(color); - padding = self.tick ? '_' : '__'; - var tail = self.tick ? '~' : '^'; - var face; - write(tail + '|' + padding + this.face() + ' '); - write('\n'); - - write(color); - padding = self.tick ? ' ' : ' '; - write(padding + '"" "" '); - write('\n'); - - this.cursorUp(this.numberOfLines); -}; - -/** - * Draw nyan cat face. - * - * @return {String} - * @api private - */ - -NyanCat.prototype.face = function() { - var stats = this.stats; - if (stats.failures) { - return '( x .x)'; - } else if (stats.pending) { - return '( o .o)'; - } else if(stats.passes) { - return '( ^ .^)'; - } else { - return '( - .-)'; - } -} - -/** - * Move cursor up `n`. - * - * @param {Number} n - * @api private - */ - -NyanCat.prototype.cursorUp = function(n) { - write('\u001b[' + n + 'A'); -}; - -/** - * Move cursor down `n`. - * - * @param {Number} n - * @api private - */ - -NyanCat.prototype.cursorDown = function(n) { - write('\u001b[' + n + 'B'); -}; - -/** - * Generate rainbow colors. - * - * @return {Array} - * @api private - */ - -NyanCat.prototype.generateColors = function(){ - var colors = []; - - for (var i = 0; i < (6 * 7); i++) { - var pi3 = Math.floor(Math.PI / 3); - var n = (i * (1.0 / 6)); - var r = Math.floor(3 * Math.sin(n) + 3); - var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3); - var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3); - colors.push(36 * r + 6 * g + b + 16); - } - - return colors; -}; - -/** - * Apply rainbow to the given `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -NyanCat.prototype.rainbowify = function(str){ - var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length]; - this.colorIndex += 1; - return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m'; -}; - -/** - * Stdout helper. - */ - -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){ - -/** - * 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 || Base.symbols.dot; - 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('\u001b[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`. - */ - -function F(){}; -F.prototype = Base.prototype; -Progress.prototype = new F; -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', ' ' + Base.symbols.ok) - + 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)'); - 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`. - */ - -function F(){}; -F.prototype = Base.prototype; -Spec.prototype = new F; -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 - , n = 1 - , passes = 0 - , failures = 0; - - runner.on('start', function(){ - var total = runner.grepTotal(runner.suite); - 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){ - passes++; - console.log('ok %d %s', n, title(test)); - }); - - 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, ' ')); - }); - - runner.on('end', function(){ - console.log('# tests ' + (passes + failures)); - console.log('# pass ' + passes); - console.log('# fail ' + failures); - }); -} - -/** - * 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/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('pass', function(test){ - tests.push(test); - }); - - runner.on('fail', 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 - , skipped: stats.tests - stats.failures - stats.passes - , timestamp: (new Date).toUTCString() - , time: (stats.duration / 1000) || 0 - }, false)); - - tests.forEach(test); - console.log(''); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -function F(){}; -F.prototype = Base.prototype; -XUnit.prototype = new F; -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')('mocha:runnable') - , milliseconds = require('./ms'); - -/** - * 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; - -/** - * Object#toString(). - */ - -var toString = Object.prototype.toString; - -/** - * 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._slow = 75; - this.timedOut = false; -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -function F(){}; -F.prototype = EventEmitter.prototype; -Runnable.prototype = new F; -Runnable.prototype.constructor = Runnable; - - -/** - * Set & get timeout `ms`. - * - * @param {Number|String} ms - * @return {Runnable|Number} ms or self - * @api private - */ - -Runnable.prototype.timeout = function(ms){ - if (0 == arguments.length) return this._timeout; - if ('string' == typeof ms) ms = milliseconds(ms); - debug('timeout %d', ms); - this._timeout = ms; - if (this.timer) this.resetTimeout(); - return this; -}; - -/** - * Set & get slow `ms`. - * - * @param {Number|String} ms - * @return {Runnable|Number} ms or self - * @api private - */ - -Runnable.prototype.slow = function(ms){ - if (0 === arguments.length) return this._slow; - if ('string' == typeof ms) ms = milliseconds(ms); - debug('timeout %d', ms); - this._slow = ms; - 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); -}; - -/** - * Inspect the runnable void of private properties. - * - * @return {String} - * @api private - */ - -Runnable.prototype.inspect = function(){ - return JSON.stringify(this, function(key, val){ - if ('_' == key[0]) return; - if ('parent' == key) return '#'; - if ('ctx' == key) return '#'; - return val; - }, 2); -}; - -/** - * Reset the timeout. - * - * @api private - */ - -Runnable.prototype.resetTimeout = function(){ - var self = this; - var ms = this.timeout() || 1e9; - - this.clearTimeout(); - 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(err) { - if (emitted) return; - emitted = true; - self.emit('error', err || new Error('done() called multiple times')); - } - - // finished - function done(err) { - if (self.timedOut) return; - if (finished) return multiple(err); - 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 || toString.call(err) === "[object Error]") return done(err); - if (null != err) return done(new Error('done() invoked with non-Error: ' + err)); - done(); - }); - } catch (err) { - done(err); - } - return; - } - - if (this.asyncOnly) { - return done(new Error('--async-only option in use without declaring `done()`')); - } - - // 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')('mocha:runner') - , Test = require('./test') - , utils = require('./utils') - , filter = utils.filter - , keys = utils.keys; - -/** - * Non-enumerable globals. - */ - -var globals = [ - 'setTimeout', - 'clearTimeout', - 'setInterval', - 'clearInterval', - 'XMLHttpRequest', - 'Date' -]; - -/** - * 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 - * - `pending` (test) test pending - * - * @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(this.globalProps().concat(['errno'])); -} - -/** - * Wrapper for setImmediate, process.nextTick, or browser polyfill. - * - * @param {Function} fn - * @api private - */ - -Runner.immediately = global.setImmediate || process.nextTick; - -/** - * Inherit from `EventEmitter.prototype`. - */ - -function F(){}; -F.prototype = EventEmitter.prototype; -Runner.prototype = new F; -Runner.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 - */ - -Runner.prototype.grep = function(re, invert){ - debug('grep %s', re); - this._grep = re; - this._invert = invert; - 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){ - var match = self._grep.test(test.fullTitle()); - if (self._invert) match = !match; - if (match) total++; - }); - - return total; -}; - -/** - * Return a list of global properties. - * - * @return {Array} - * @api private - */ - -Runner.prototype.globalProps = function() { - var props = utils.keys(global); - - // non-enumerables - for (var i = 0; i < globals.length; ++i) { - if (~utils.indexOf(props, globals[i])) continue; - props.push(globals[i]); - } - - return props; -}; - -/** - * 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 ok = this._globals; - var globals = this.globalProps(); - var isNode = process.kill; - var leaks; - - // check length - 2 ('errno' and 'location' globals) - if (isNode && 1 == ok.length - globals.length) return; - else if (2 == ok.length - globals.length) return; - - if(this.prevGlobalsLength == globals.length) return; - this.prevGlobalsLength = globals.length; - - leaks = filterLeaks(ok, 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] - , self = this - , timer; - - function next(i) { - var hook = hooks[i]; - if (!hook) return fn(); - if (self.failures && suite.bail()) return fn(); - self.currentRunnable = hook; - - hook.ctx.currentTest = self.test; - - self.emit('hook', hook); - - 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); - if (err) return self.failHook(hook, err); - self.emit('hook end', hook); - delete hook.ctx.currentTest; - next(++i); - }); - } - - Runner.immediately(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; - - if (this.asyncOnly) test.asyncOnly = true; - - 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.slice() - , 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 - var match = self._grep.test(test.fullTitle()); - if (self._invert) match = !match; - if (!match) 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 %s', err.message); - var runnable = this.currentRunnable; - if (!runnable || '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(){}; - - function uncaught(err){ - self.uncaught(err); - } - - debug('start'); - - // callback - this.on('end', function(){ - debug('end'); - process.removeListener('uncaughtException', 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', uncaught); - - return this; -}; - -/** - * Filter leaks with the given globals flagged as `ok`. - * - * @param {Array} ok - * @param {Array} globals - * @return {Array} - * @api private - */ - -function filterLeaks(ok, globals) { - return filter(globals, function(key){ - // Firefox and Chrome exposes iframes as index inside the window object - 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; - - // 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; - - // Opera and IE expose global variables for HTML element IDs (issue #243) - 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; - }); - 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')('mocha:suite') - , milliseconds = require('./ms') - , 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; - if (parent.pending) suite.pending = true; - 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.pending = false; - this._beforeEach = []; - this._beforeAll = []; - this._afterEach = []; - this._afterAll = []; - this.root = !title; - this._timeout = 2000; - this._slow = 75; - this._bail = false; -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -function F(){}; -F.prototype = EventEmitter.prototype; -Suite.prototype = new F; -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.slow(this.slow()); - 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' == typeof ms) ms = milliseconds(ms); - debug('timeout %d', ms); - this._timeout = parseInt(ms, 10); - return this; -}; - -/** - * Set slow `ms` or short-hand such as "2s". - * - * @param {Number|String} ms - * @return {Suite|Number} for chaining - * @api private - */ - -Suite.prototype.slow = function(ms){ - if (0 === arguments.length) return this._slow; - if ('string' == typeof ms) ms = milliseconds(ms); - debug('slow %d', ms); - this._slow = ms; - 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){ - if (this.pending) return this; - var hook = new Hook('"before all" hook', fn); - hook.parent = this; - hook.timeout(this.timeout()); - hook.slow(this.slow()); - 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){ - if (this.pending) return this; - var hook = new Hook('"after all" hook', fn); - hook.parent = this; - hook.timeout(this.timeout()); - hook.slow(this.slow()); - 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){ - if (this.pending) return this; - var hook = new Hook('"before each" hook', fn); - hook.parent = this; - hook.timeout(this.timeout()); - hook.slow(this.slow()); - 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){ - if (this.pending) return this; - var hook = new Hook('"after each" hook', fn); - hook.parent = this; - hook.timeout(this.timeout()); - hook.slow(this.slow()); - 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.slow(this.slow()); - 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.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. - * - * @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`. - */ - -function F(){}; -F.prototype = Runnable.prototype; -Test.prototype = new F; -Test.prototype.constructor = Test; - - -}); // 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')('mocha: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 - * @api private - */ - -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) - * - * @param {Array} array - * @param {Function} fn - * @api private - */ - -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) - * - * @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|litcoffee|coffee.md)$/)) { - 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 whitespace = str.match(/^\n?(\s*)/)[1] - , re = new RegExp('^' + whitespace, 'gm'); - - str = str.replace(re, ''); - - return exports.trim(str); -}; - -/** - * Escape regular expression characters in `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -exports.escapeRegexp = function(str){ - return str.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&"); -}; - -/** - * Trim the given `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -exports.trim = function(str){ - return str.replace(/^\s+|\s+$/g, ''); -}; - -/** - * Parse the given `qs`. - * - * @param {String} qs - * @return {Object} - * @api private - */ - -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; - }, {}); -}; - -/** - * Highlight the given string of `js`. - * - * @param {String} js - * @return {String} - * @api private - */ - -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') -} - -/** - * Highlight the contents of tag `name`. - * - * @param {String} name - * @api private - */ - -exports.highlightTags = function(name) { - var code = document.getElementsByTagName(name); - for (var i = 0, len = code.length; i < len; ++i) { - code[i].innerHTML = highlight(code[i].innerHTML); - } -}; - -}); // module: utils.js -// The global object is "self" in Web Workers. -global = (function() { return this; })(); - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ - -var Date = global.Date; -var setTimeout = global.setTimeout; -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 = {}; - -/** - * Remove uncaughtException listener. - */ - -process.removeListener = function(e){ - if ('uncaughtException' == e) { - global.onerror = function() {}; - } -}; - -/** - * Implements uncaughtException listener. - */ - -process.on = function(e, fn){ - if ('uncaughtException' == e) { - global.onerror = function(err, url, line){ - fn(new Error(err + ' (' + url + ':' + line + ')')); - }; - } -}; - -/** - * Expose mocha. - */ - -var Mocha = global.Mocha = require('mocha'), - mocha = global.mocha = new Mocha({ reporter: 'html' }); - -var immediateQueue = [] - , immediateTimeout; - -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; - } -} - -/** - * High-performance override of Runner.immediately. - */ - -Mocha.Runner.immediately = function(callback) { - immediateQueue.push(callback); - if (!immediateTimeout) { - immediateTimeout = setTimeout(timeslice, 0); - } -}; - -/** - * Override ui to ensure that the ui functions are initialized. - * Normally this would happen in Mocha.prototype.loadFiles. - */ - -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. - */ - -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. - */ - -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.invert) mocha.invert(); - - return Mocha.prototype.run.call(mocha, function(){ - // The DOM Document is not available in Web Workers. - if (global.document) { - Mocha.utils.highlightTags('code'); - } - if (fn) fn(); - }); -}; - -/** - * Expose the process shim. - */ - -Mocha.process = process; -})(); \ No newline at end of file diff --git a/js/avatars.js b/js/avatars.js deleted file mode 100644 index 153dba24cc..0000000000 --- a/js/avatars.js +++ /dev/null @@ -1,12 +0,0 @@ -// 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/package.json b/package.json deleted file mode 100644 index 24ff16f938..0000000000 --- a/package.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "name": "mochajs.org", - "version": "1.0.0", - "description": "Mocha's gh-pages branch", - "private": true, - "scripts": { - "postinstall": "npm start postinstall", - "start": "nps --silent --config ./scripts/package-scripts.js" - }, - "repository": { - "type": "git", - "url": "https://github.com/mochajs/mochajs.github.io.git" - }, - "license": "CC-BY-4.0 AND MIT", - "bugs": { - "url": "https://github.com/mochajs/mochajs.github.io/issues" - }, - "homepage": "https://mochajs.org", - "devDependencies": { - "chalk": "^1.1.3", - "markdown-toc": "^0.13.0", - "p-s": "^3.0.1" - }, - "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 deleted file mode 100644 index fabc9aff9b..0000000000 --- a/scripts/package-scripts.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -const chalk = require('chalk'); -const join = require('path').join; - -exports.scripts = { - serve: { - script: 'bundle exec jekyll serve --safe --drafts --watch', - description: `Build site via Jekyll, watch for changes, serve at ${chalk.underline( - 'http://localhost:4000/')}` - }, - build: { - script: 'bundle exec jekyll build --safe --drafts', - description: 'Build site via Jekyll' - }, - toc: { - script: join(__dirname, 'toc.js'), - description: `Rebuild table of contents; mutates ${chalk.bold('index.md')}` - }, - postinstall: { - script: join(__dirname, 'postinstall.js'), - description: 'Displays help after installing' - } -}; diff --git a/scripts/postinstall.js b/scripts/postinstall.js deleted file mode 100755 index 8061746418..0000000000 --- a/scripts/postinstall.js +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env node - -/** - * Displays some guidance after install - */ - -'use strict'; - -const chalk = require('chalk'); -const yellow = chalk.yellow; -const bold = chalk.bold; -const hipEmoji = '\uD83D\uDC49'; -const pkg = require('../package.json'); - -console.log(`${hipEmoji} ${chalk.yellow(pkg.name)} installation: -1. Follow instructions for your platform in ${chalk.bold('README.md')}. -2. Execute ${chalk.bold('bundle install')} in this directory to install Jekyll (https://jekyllrb.com/) & its deps. -3. Execute ${chalk.bold('npm start serve')} to build, watch & serve the site. - -For more help, execute ${chalk.bold('npm start')}.`); diff --git a/scripts/toc.js b/scripts/toc.js deleted file mode 100755 index 8c25fa8f73..0000000000 --- a/scripts/toc.js +++ /dev/null @@ -1,34 +0,0 @@ -#!/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 e3c36f2383dc715e99d85ad4b7b20a20c5f1f6b0 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 6 Dec 2017 15:31:42 -0800 Subject: [PATCH 350/846] migrate mochajs.github.io into mocha; closes #2987 [ci skip] - some jekyll tweaks were needed; we can no longer consume the `github-pages` gem apparently since they added support for themes - added `markdown-toc` dev dep to build the toc - added `buildDocs` and `serveDocs` scripts - miraculously avoided monkeying with the content itself Signed-off-by: Christopher Hiller --- .gitignore | 1 + Gemfile | 3 +++ Gemfile.lock | 50 +++++++++++++++++++++++++++++++++++++++ package.json | 6 ++++- scripts/.eslintrc.yaml | 2 ++ scripts/pre-build-docs.js | 31 ++++++++++++++++++++++++ 6 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 scripts/.eslintrc.yaml create mode 100755 scripts/pre-build-docs.js diff --git a/.gitignore b/.gitignore index 8298390254..b787c0d179 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ coverage/ yarn.lock package-lock.json mocha.js +docs/_site diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000000..0aea8a9925 --- /dev/null +++ b/Gemfile @@ -0,0 +1,3 @@ + +# Added at 2017-12-05 23:01:55 -0800 by boneskull: +gem "jekyll", "~> 3.6" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000000..33a59259ef --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,50 @@ +GEM + specs: + addressable (2.5.2) + public_suffix (>= 2.0.2, < 4.0) + colorator (1.1.0) + ffi (1.9.18) + forwardable-extended (2.6.0) + jekyll (3.6.2) + addressable (~> 2.4) + colorator (~> 1.0) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 1.1) + kramdown (~> 1.14) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 3) + safe_yaml (~> 1.0) + jekyll-sass-converter (1.5.0) + sass (~> 3.4) + jekyll-watch (1.5.1) + listen (~> 3.0) + kramdown (1.14.0) + liquid (4.0.0) + listen (3.0.8) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + mercenary (0.3.6) + pathutil (0.16.0) + forwardable-extended (~> 2.6) + public_suffix (3.0.0) + rb-fsevent (0.10.2) + rb-inotify (0.9.10) + ffi (>= 0.5.0, < 2) + rouge (2.2.1) + safe_yaml (1.0.4) + sass (3.5.3) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + +PLATFORMS + ruby + +DEPENDENCIES + jekyll (~> 3.6) + +BUNDLED WITH + 1.16.0 diff --git a/package.json b/package.json index d7d2055d30..1fcbd718ed 100644 --- a/package.json +++ b/package.json @@ -303,7 +303,10 @@ "lint": "eslint . bin/*", "test": "make clean && make test", "prepublishOnly": "npm test && make clean && make mocha.js", - "coveralls": "nyc report --reporter=text-lcov | coveralls" + "coveralls": "nyc report --reporter=text-lcov | coveralls", + "prebuildDocs": "node scripts/pre-build-docs.js", + "buildDocs": "bundle exec jekyll build --source docs --destination docs/_site --layouts docs/_layouts --safe --drafts", + "serveDocs": "bundle exec jekyll serve --config docs/_config.yml --safe --drafts --watch" }, "dependencies": { "browser-stdout": "1.3.0", @@ -340,6 +343,7 @@ "karma-mocha-reporter": "^2.2.4", "karma-phantomjs-launcher": "^1.0.4", "karma-sauce-launcher": "^1.2.0", + "markdown-toc": "^1.2.0", "nyc": "^11.2.1", "rimraf": "^2.5.2", "through2": "^2.0.1", diff --git a/scripts/.eslintrc.yaml b/scripts/.eslintrc.yaml new file mode 100644 index 0000000000..1ddd632e1c --- /dev/null +++ b/scripts/.eslintrc.yaml @@ -0,0 +1,2 @@ +parserOptions: + ecmaVersion: 2017 diff --git a/scripts/pre-build-docs.js b/scripts/pre-build-docs.js new file mode 100755 index 0000000000..e4e661602e --- /dev/null +++ b/scripts/pre-build-docs.js @@ -0,0 +1,31 @@ +#!/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 docsFilepath = path.join(__dirname, '..', 'docs', 'index.md'); + +console.log('Updating TOC...'); + +fs.createReadStream(docsFilepath) + .on('error', err => { + console.log(err); + process.exit(1); + }) + .on('close', () => { + console.log('Done.'); + }) + .pipe(utils.concat( + input => fs.writeFileSync(docsFilepath, toc.insert(String(input), { + bullets: '-', + maxdepth: 2 + })))); From 709a09efd74ee4a83fbfbe0236fab3443c65cda0 Mon Sep 17 00:00:00 2001 From: 38elements <38elements@users.noreply.github.com> Date: Thu, 7 Dec 2017 09:16:51 +0900 Subject: [PATCH 351/846] remove unused code in ms module * Remove unused argument of lib/ms * Remove unnecessary comment --- lib/ms.js | 48 ++++---------------------------------------- test/unit/ms.spec.js | 21 ------------------- 2 files changed, 4 insertions(+), 65 deletions(-) diff --git a/lib/ms.js b/lib/ms.js index 9590856052..2fdcaf3242 100644 --- a/lib/ms.js +++ b/lib/ms.js @@ -13,22 +13,15 @@ var y = d * 365.25; /** * Parse or format the given `val`. * - * Options: - * - * - `long` verbose formatting [false] - * * @api public * @param {string|number} val - * @param {Object} options * @return {string|number} */ -module.exports = function (val, options) { - options = options || {}; +module.exports = function (val) { if (typeof val === 'string') { return parse(val); } - // https://github.com/mochajs/mocha/pull/1035 - return options['long'] ? longFormat(val) : shortFormat(val); + return format(val); }; /** @@ -74,13 +67,13 @@ function parse (str) { } /** - * Short format for `ms`. + * Format for `ms`. * * @api private * @param {number} ms * @return {string} */ -function shortFormat (ms) { +function format (ms) { if (ms >= d) { return Math.round(ms / d) + 'd'; } @@ -95,36 +88,3 @@ function shortFormat (ms) { } return ms + 'ms'; } - -/** - * Long format for `ms`. - * - * @api private - * @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'; -} - -/** - * 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; - } - return Math.ceil(ms / n) + ' ' + name + 's'; -} diff --git a/test/unit/ms.spec.js b/test/unit/ms.spec.js index e7b1d358be..0844391258 100644 --- a/test/unit/ms.spec.js +++ b/test/unit/ms.spec.js @@ -21,45 +21,24 @@ describe('.ms()', function () { it('should return short format', function () { expect(ms(2000)).to.equal('2s'); }); - - it('should return long format', function () { - expect(ms(2000, { long: true })).to.equal('2 seconds'); - expect(ms(1000, { long: true })).to.equal('1 second'); - expect(ms(1010, { long: true })).to.equal('1 second'); - }); }); describe('minutes representation', function () { it('should return short format', function () { expect(ms(time.minutes(1))).to.equal('1m'); }); - - it('should return long format', function () { - expect(ms(time.minutes(1), { long: true })).to.equal('1 minute'); - expect(ms(time.minutes(3), { long: true })).to.equal('3 minutes'); - }); }); describe('hours representation', function () { it('should return short format', function () { expect(ms(time.hours(1))).to.equal('1h'); }); - - it('should return long format', function () { - expect(ms(time.hours(1), { long: true })).to.equal('1 hour'); - expect(ms(time.hours(3), { long: true })).to.equal('3 hours'); - }); }); describe('days representation', function () { it('should return short format', function () { expect(ms(time.days(1))).to.equal('1d'); }); - - it('should return long format', function () { - expect(ms(time.days(1), { long: true })).to.equal('1 day'); - expect(ms(time.days(3), { long: true })).to.equal('3 days'); - }); }); describe('Getting string value', function () { From 45083862119f88586f9a2fa54f7253fe2a9641a6 Mon Sep 17 00:00:00 2001 From: Aaron Brady Date: Wed, 6 Dec 2017 17:39:53 -0800 Subject: [PATCH 352/846] fix inaccurate diff output due to post-assertion object mutation (#3075) * have Base generate the strings for error messages immediately instead of delaying until epilogue, the reason for this is that it is possible to reference objects in errors that could be mutated after the error occurs, causing the printed error message to be misleading * re-add stringify during list to appease tests, open for discussion if this is correct behavior --- lib/reporters/base.js | 24 ++++++++++++++++-------- test/reporters/list.spec.js | 22 ++++++++++++++++++++++ 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 8b68a3d51d..0ebc5e7db3 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -155,6 +155,17 @@ exports.cursor = { } }; +function showDiff (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)) { + err.actual = utils.stringify(err.actual); + err.expected = utils.stringify(err.expected); + } +} + /** * Output the given `failures` as a list. * @@ -183,8 +194,6 @@ exports.list = function (failures) { } var stack = err.stack || message; var index = message ? stack.indexOf(message) : -1; - var actual = err.actual; - var expected = err.expected; if (index === -1) { msg = message; @@ -200,12 +209,8 @@ exports.list = function (failures) { msg = 'Uncaught ' + msg; } // explicitly show diff - if (err.showDiff !== false && sameType(actual, expected) && expected !== undefined) { - if (!(utils.isString(actual) && utils.isString(expected))) { - err.actual = actual = utils.stringify(actual); - err.expected = expected = utils.stringify(expected); - } - + if (showDiff(err)) { + stringifyDiffObjs(err); fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n'); var match = message.match(/^([^:]+): expected/); msg = '\n ' + color('error message', match ? match[1] : msg); @@ -290,6 +295,9 @@ function Base (runner) { runner.on('fail', function (test, err) { stats.failures = stats.failures || 0; stats.failures++; + if (showDiff(err)) { + stringifyDiffObjs(err); + } test.err = err; failures.push(test); }); diff --git a/test/reporters/list.spec.js b/test/reporters/list.spec.js index 4b3704204d..87978de011 100644 --- a/test/reporters/list.spec.js +++ b/test/reporters/list.spec.js @@ -192,6 +192,28 @@ describe('List reporter', function () { Base.cursor = cachedCursor; }); + it('should immediately construct fail strings', function () { + var actual = { a: 'actual' }; + var expected = { a: 'expected' }; + var test = {}; + var checked = false; + var err; + runner.on = function (event, callback) { + if (!checked && event === 'fail') { + err = new Error('fake failure object with actual/expected'); + err.actual = actual; + err.expected = expected; + err.showDiff = true; + callback(test, err); + checked = true; + } + }; + List.call({epilogue: function () {}}, runner); + + process.stdout.write = stdoutWrite; + expect(typeof err.actual).to.equal('string'); + expect(typeof err.expected).to.equal('string'); + }); }); describe('on end', function () { From 2dc09bc6c7970bc5f3ea42a0e7924876f5e1f184 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 6 Dec 2017 20:00:58 -0800 Subject: [PATCH 353/846] add diff tool artifacts to .gitignore [ci skip] --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 8298390254..d922a61222 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,8 @@ coverage/ yarn.lock package-lock.json mocha.js +# artifacts from various diff tools +*_BACKUP_* +*_BASE_* +*_LOCAL_* +*_REMOTE_* From 2f8173a33812361c49a7e60a354f1ad5b66f5af4 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 6 Dec 2017 19:59:06 -0800 Subject: [PATCH 354/846] refactor "forbid pending" tests for DRY --- test/integration/options.spec.js | 84 ++++++++++---------------------- 1 file changed, 26 insertions(+), 58 deletions(-) diff --git a/test/integration/options.spec.js b/test/integration/options.spec.js index f77da38bb8..e4ecc96cd6 100644 --- a/test/integration/options.spec.js +++ b/test/integration/options.spec.js @@ -274,63 +274,28 @@ describe('options', function () { }); }); - it('fails if there are tests marked skip', function (done) { - run('options/forbid-pending/skip.js', args, function (err, res) { - if (err) { - done(err); - return; - } - assert.equal(res.code, 1); - assert.equal(res.failures[0].err.message, pendingErrorMessage); - done(); - }); - }); - - it('fails if there are pending tests', function (done) { - run('options/forbid-pending/pending.js', args, function (err, res) { - if (err) { - done(err); - return; - } - assert.equal(res.code, 1); - assert.equal(res.failures[0].err.message, pendingErrorMessage); - done(); - }); - }); - - it('fails if tests call `skip()`', function (done) { - run('options/forbid-pending/this.skip.js', args, function (err, res) { - assert(!err); - assert.equal(res.code, 1); - assert.equal(res.failures[0].err.message, pendingErrorMessage); - done(); - }); - }); - - it('fails if beforeEach calls `skip()`', function (done) { - run('options/forbid-pending/beforeEach-this.skip.js', args, function (err, res) { - assert(!err); - assert.equal(res.code, 1); - assert.equal(res.failures[0].err.message, pendingErrorMessage); - done(); - }); - }); - - it('fails if before calls `skip()`', function (done) { - run('options/forbid-pending/before-this.skip.js', args, function (err, res) { - assert(!err); - assert.equal(res.code, 1); - assert.equal(res.failures[0].err.message, pendingErrorMessage); - done(); - }); - }); + var forbidPendingFailureTests = { + 'fails if there are tests marked skip': 'skip.js', + 'fails if there are pending tests': 'pending.js', + 'fails if tests call `skip()`': 'this.skip.js', + 'fails if beforeEach calls `skip()`': 'beforeEach-this.skip.js', + 'fails if before calls `skip()`': 'before-this.skip.js', + 'fails if there are tests in suites marked skip': 'skip-suite.js' + }; - it('fails if there are tests in suites marked skip', function (done) { - run('options/forbid-pending/skip-suite.js', args, function (err, res) { - assert(!err); - assert.equal(res.code, 1); - assert.equal(res.failures[0].err.message, pendingErrorMessage); - done(); + Object.keys(forbidPendingFailureTests).forEach(function (title) { + it(title, function (done) { + run(path.join('options', 'forbid-pending', forbidPendingFailureTests[title]), + args, + function (err, res) { + if (err) { + done(err); + return; + } + assert.equal(res.code, 1); + assert.equal(res.failures[0].err.message, pendingErrorMessage); + done(); + }); }); }); }); @@ -344,7 +309,8 @@ describe('options', function () { /** * 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 {boolean} shouldExit - Expected result; `true` if Mocha should + * have force-killed the process. * @param {string} [behavior] - 'enabled' or 'disabled' * @returns {Function} */ @@ -392,7 +358,9 @@ describe('options', function () { describe('--help', function () { it('works despite the presence of mocha.opts', function (done) { directInvoke(['-h'], function (error, result) { - if (error) { return done(error); } + if (error) { + return done(error); + } expect(result.output).to.contain('Usage:'); done(); }, path.join(__dirname, 'fixtures', 'options', 'help')); From 9594ea0e115cf7c7dd7b5819ca35424cdd0003e4 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 7 Dec 2017 12:45:44 -0800 Subject: [PATCH 355/846] fix Gemfile [ci skip] Signed-off-by: Christopher Hiller --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 0aea8a9925..743d18eca7 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,3 @@ - +source "https://rubygems.org" # Added at 2017-12-05 23:01:55 -0800 by boneskull: gem "jekyll", "~> 3.6" From ce84260ce7fb4c06a812ba4427093b67103a763a Mon Sep 17 00:00:00 2001 From: Charles Merriam Date: Fri, 17 Mar 2017 11:16:25 -0700 Subject: [PATCH 356/846] Update 'Arrow Function' wording for clarity. [ci skip] (minor doc change). Saw a surprising number of issues and stack overflow questions about using arrow functions, so updated the documentation to be explicit about the lexical binding of 'this'. --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 294ba19146..45045473f7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -254,7 +254,7 @@ describe('Array', function() { ## Arrow Functions -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: +Passing [arrow functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) ("lambdas") to Mocha is discouraged. Lambdas lexically bind `this` and cannot access the Mocha context. For example, the following code will fail: ```js describe('my suite', () => { From d1cfd3e75370bfec939ea433d9b5accfd6cd5fb3 Mon Sep 17 00:00:00 2001 From: Kevin Partington Date: Wed, 6 Sep 2017 12:22:06 -0500 Subject: [PATCH 357/846] Improve description of --check-leaks option [ci skip] Also ensuring the --globals option references --check-leaks as well. --- docs/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 45045473f7..41b6a3dad2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -822,9 +822,11 @@ Enables node's debugger support, this executes your script(s) with `node debug < 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. +By using this option in conjunction with `--check-leaks`, you can specify a whitelist of known global variables that you would expect to leak into global scope. + ### `--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`. +Use this option to have Mocha check for global variables that are leaked while running tests. Specify globals that are acceptable via the `--globals` option (for example: `--check-leaks --globals jQuery,MyLib`). ### `-r, --require ` From 9695be658a59dcf979de8ac02012a2270d6b88b3 Mon Sep 17 00:00:00 2001 From: Lane Kelly Date: Sat, 14 Oct 2017 16:04:11 -0700 Subject: [PATCH 358/846] update parameter order of example assert [ci skip] --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 41b6a3dad2..b4535960a0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -108,7 +108,7 @@ 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(4)); + assert.equal([1,2,3].indexOf(4), -1); }); }); }); From 07bcd7c7642b935d21d39dbe4f4a5ab1ae7ebca0 Mon Sep 17 00:00:00 2001 From: Cube Date: Tue, 28 Nov 2017 08:44:19 -1000 Subject: [PATCH 359/846] add mocha side bar as extension for vs code [ci skip] --- docs/index.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/index.md b/docs/index.md index b4535960a0..b0feb78ff2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1230,6 +1230,21 @@ By default, `mocha` looks for the glob `./test/*.js` and `./test/*.coffee`, so y The following editor-related packages are available: +### Mocha SideBar (VS code) + +[mocha sidebar](https://marketplace.visualstudio.com/items?itemName=maty.vscode-mocha-sidebar) Mocha side bar is the most complete extension in vs code + +#### mocha side bar already supports this features +* [x] see all tests in vscode side bar menu +* [x] run tests for each level hierarchy from all tests to a single test(and each describer of course) +* [x] debug tests for each level hierarchy from all tests to a single test(and each describer of course) +* [x] auto run tests on file save +* [x] see tests results directly on the code +* [x] run/debug results directly from the code + +![Demo showing mocha menu operation](https://raw.githubusercontent.com/maty21/mocha-sidebar/master/tutorial.gif) + + ### TextMate 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: From a7ff660a7bfea5a62a67182ae8e937094d5320f8 Mon Sep 17 00:00:00 2001 From: yehiyam Date: Wed, 29 Nov 2017 06:59:50 +0200 Subject: [PATCH 360/846] Mocha Sidebar: fix wording [ci skip] --- docs/index.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/index.md b/docs/index.md index b0feb78ff2..1708cc0a88 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1230,17 +1230,17 @@ By default, `mocha` looks for the glob `./test/*.js` and `./test/*.coffee`, so y The following editor-related packages are available: -### Mocha SideBar (VS code) +### Mocha Sidebar (VS code) -[mocha sidebar](https://marketplace.visualstudio.com/items?itemName=maty.vscode-mocha-sidebar) Mocha side bar is the most complete extension in vs code +[Mocha sidebar](https://marketplace.visualstudio.com/items?itemName=maty.vscode-mocha-sidebar) is the most complete mocha extension for vs code. -#### mocha side bar already supports this features +#### mocha side bar supports the following features * [x] see all tests in vscode side bar menu -* [x] run tests for each level hierarchy from all tests to a single test(and each describer of course) -* [x] debug tests for each level hierarchy from all tests to a single test(and each describer of course) +* [x] run tests for each level hierarchy from all tests to a single test (and each describe of course) +* [x] debug tests for each level hierarchy from all tests to a single test (and each describe of course) * [x] auto run tests on file save -* [x] see tests results directly on the code -* [x] run/debug results directly from the code +* [x] see tests results directly in the code editor +* [x] run/debug results directly from the code editor ![Demo showing mocha menu operation](https://raw.githubusercontent.com/maty21/mocha-sidebar/master/tutorial.gif) From 09d79ce19bf9900d1e447a5d7ddc360aa4340971 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 8 Dec 2017 23:23:43 -0800 Subject: [PATCH 361/846] Mocha Sidebar: capitalization tweaks + remove huge gif [ci skip] Signed-off-by: Christopher Hiller --- docs/index.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/docs/index.md b/docs/index.md index 1708cc0a88..3f29430a31 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1230,20 +1230,16 @@ By default, `mocha` looks for the glob `./test/*.js` and `./test/*.coffee`, so y The following editor-related packages are available: -### Mocha Sidebar (VS code) +### Mocha Sidebar (VS Code) [Mocha sidebar](https://marketplace.visualstudio.com/items?itemName=maty.vscode-mocha-sidebar) is the most complete mocha extension for vs code. -#### mocha side bar supports the following features -* [x] see all tests in vscode side bar menu -* [x] run tests for each level hierarchy from all tests to a single test (and each describe of course) -* [x] debug tests for each level hierarchy from all tests to a single test (and each describe of course) -* [x] auto run tests on file save -* [x] see tests results directly in the code editor -* [x] run/debug results directly from the code editor - -![Demo showing mocha menu operation](https://raw.githubusercontent.com/maty21/mocha-sidebar/master/tutorial.gif) +#### Features +* [x] see all tests in VS Code sidebar menu +* [x] run & debug tests for each level hierarchy from all tests to a single test (and each describe of course) +* [x] auto run tests on file save +* [x] see tests results directly in the code editor ### TextMate From e09573f5684fc890ad3a57cf0e3b5c0d9556bc03 Mon Sep 17 00:00:00 2001 From: Jon Surrell Date: Thu, 9 Nov 2017 13:24:32 +0100 Subject: [PATCH 362/846] update node/npm requirements [ci skip] Require minimum npm 2.14.2, shipped with node 4.0.0 If node v4 is required, it's silly to require npm@1. (+1 squashed commit) Squashed commits: [796190e] Update to require "Node.js v4 or newer". Just update the documentation to remove support for node `<4`. The current version of `mocha` pulls in dependencies which use arrow functions which fail in earlier versions of node. See https://travis-ci.org/sirreal/mocha/builds/299600162, where I forked `mocha` and added tests for earlier versions. --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 3f29430a31..819061b574 100644 --- a/docs/index.md +++ b/docs/index.md @@ -89,7 +89,7 @@ or as a development dependency for your project: $ 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. +> To install Mocha v3.0.0 or newer with `npm`, you will need `npm` v2.14.2 or newer. Additionally, to run Mocha, you will need Node.js v4 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). From 42280e893d259ebebd9b33d33c874358ea9e823f Mon Sep 17 00:00:00 2001 From: Josh Soref Date: Mon, 4 Sep 2017 04:15:35 +0000 Subject: [PATCH 363/846] Fix broken nextTick test --- test/unit/throw.spec.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/test/unit/throw.spec.js b/test/unit/throw.spec.js index 68e8cd2c1d..cdcfb50637 100644 --- a/test/unit/throw.spec.js +++ b/test/unit/throw.spec.js @@ -45,16 +45,21 @@ describe('a test that throws', function () { it('should not pass if throwing async and test is async', function (done) { var test = new Test('im async and throw undefined async', function (done2) { - process.nexTick(function () { + process.nextTick(function () { throw undefined; }); }); suite.addTest(test); runner = new Runner(suite); + var uncaught = Runner.prototype.uncaught; + Runner.prototype.uncaught = function () { + Runner.prototype.uncaught = uncaught; + done(); + }; runner.on('end', function () { expect(runner.failures).to.equal(1); expect(test.state).to.equal('failed'); - done(); + expect(runner.uncaught).toBeCalled(); }); runner.run(); }); @@ -91,16 +96,21 @@ describe('a test that throws', function () { it('should not pass if throwing async and test is async', function (done) { var test = new Test('im async and throw null async', function (done2) { - process.nexTick(function () { + process.nextTick(function () { throw null; }); }); suite.addTest(test); runner = new Runner(suite); + var uncaught = Runner.prototype.uncaught; + Runner.prototype.uncaught = function () { + Runner.prototype.uncaught = uncaught; + done(); + }; runner.on('end', function () { expect(runner.failures).to.equal(1); expect(test.state).to.equal('failed'); - done(); + expect(runner.uncaught).toBeCalled(); }); runner.run(); }); From 86bc9c8a02f8c9670d9bb70ce7c546abfeb06897 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Fri, 8 Dec 2017 22:55:03 -0800 Subject: [PATCH 364/846] temporarily disable uncaughtException handler Signed-off-by: Christopher Hiller --- test/unit/throw.spec.js | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/test/unit/throw.spec.js b/test/unit/throw.spec.js index cdcfb50637..104c0d3d2a 100644 --- a/test/unit/throw.spec.js +++ b/test/unit/throw.spec.js @@ -7,11 +7,23 @@ var Test = require('../../lib/test'); var Runner = require('../../lib/runner'); describe('a test that throws', function () { - var suite, runner; + var suite; + var runner; + var uncaughtHandlers; beforeEach(function () { suite = new Suite('Suite', 'root'); runner = new Runner(suite); + + // see https://github.com/mochajs/mocha/pull/2983#issuecomment-350428522 + uncaughtHandlers = process.listeners('uncaughtException') || []; + process.removeAllListeners('uncaughtException'); + }); + + afterEach(function () { + uncaughtHandlers.forEach(function (listener) { + process.on('uncaughtException', listener); + }); }); describe('undefined', function () { @@ -51,15 +63,10 @@ describe('a test that throws', function () { }); suite.addTest(test); runner = new Runner(suite); - var uncaught = Runner.prototype.uncaught; - Runner.prototype.uncaught = function () { - Runner.prototype.uncaught = uncaught; - done(); - }; runner.on('end', function () { expect(runner.failures).to.equal(1); expect(test.state).to.equal('failed'); - expect(runner.uncaught).toBeCalled(); + done(); }); runner.run(); }); @@ -102,15 +109,10 @@ describe('a test that throws', function () { }); suite.addTest(test); runner = new Runner(suite); - var uncaught = Runner.prototype.uncaught; - Runner.prototype.uncaught = function () { - Runner.prototype.uncaught = uncaught; - done(); - }; runner.on('end', function () { expect(runner.failures).to.equal(1); expect(test.state).to.equal('failed'); - expect(runner.uncaught).toBeCalled(); + done(); }); runner.run(); }); From fcb46ac2a5d8b689297fd468e086951b765c98fb Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 9 Dec 2017 00:59:32 -0800 Subject: [PATCH 365/846] docs: formatting fix [ci skip] --- docs/index.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/index.md b/docs/index.md index 819061b574..2e2306db1c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1230,17 +1230,6 @@ By default, `mocha` looks for the glob `./test/*.js` and `./test/*.coffee`, so y The following editor-related packages are available: -### Mocha Sidebar (VS Code) - -[Mocha sidebar](https://marketplace.visualstudio.com/items?itemName=maty.vscode-mocha-sidebar) is the most complete mocha extension for vs code. - -#### Features - -* [x] see all tests in VS Code sidebar menu -* [x] run & debug tests for each level hierarchy from all tests to a single test (and each describe of course) -* [x] auto run tests on file save -* [x] see tests results directly in the code editor - ### TextMate 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: @@ -1268,6 +1257,17 @@ The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Pl ![Emacs Mocha Runner in Action](images/emacs.png) +### Mocha Sidebar (VS Code) + +[Mocha sidebar](https://marketplace.visualstudio.com/items?itemName=maty.vscode-mocha-sidebar) is the most complete mocha extension for vs code. + +#### 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) +* auto run tests on file save +* see tests results directly in the code editor + ## Examples Real live example code: From 438e394744065741714fc571b8f6bd4e0cc64c15 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 9 Dec 2017 01:05:37 -0800 Subject: [PATCH 366/846] update docs for gh pages [ci skip] --- docs/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/index.md b/docs/index.md index 2e2306db1c..0ca8713f43 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1297,3 +1297,4 @@ $ REPORTER=nyan npm test ## 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). + From 37b63de9e8800eb0d2ce49944023e5b362b25353 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 9 Dec 2017 01:07:49 -0800 Subject: [PATCH 367/846] update docs-related links in CONTRIBUTING.md [ci skip] --- .github/CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index a082699cf4..8fb9feee2b 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -75,8 +75,8 @@ Follow these steps to get going. If you are having trouble, don't be afraid to *Excellent.* Here's how: - **Handy with JavaScript?** Please check out the issues labeled [`pr-please`](https://git.io/vXYu2). -- **Can you write good (and do other stuff good too)?** Help with the documentation. See the [issues for our site](https://github.com/mochajs/mochajs.github.io/issues). -- **Design your thing?** [Our site](https://github.com/mochajs/mochajs.github.io) needs your magic touch. +- **Can you write good (and do other stuff good too)?** Help with the documentation. See the [0issues for our site](https://github.com/mochajs/mocha/issues?q=is%3Aopen+is%3Aissue+label%3Adocumentation). +- **Design your thing?** [Our site](https://github.com/mochajs/mocha/tree/master/docs) needs your magic touch. - **Know 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/mochajs/people)! From 743c8309f8270522583e3fbc297baa747ba82860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=B0=E5=85=85?= Date: Wed, 28 Jun 2017 17:51:32 +0800 Subject: [PATCH 368/846] Test: add bdd interface test case, coverage increased --- test/interfaces/bdd.spec.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/interfaces/bdd.spec.js b/test/interfaces/bdd.spec.js index f6e24d88a8..2289c12497 100644 --- a/test/interfaces/bdd.spec.js +++ b/test/interfaces/bdd.spec.js @@ -32,3 +32,11 @@ context('test suite', function () { expect(this.number).to.equal(5); }); }); + +describe('pending suite', function () { + describe.skip('this is pending suite', function () { + it('should not run', function () { + expect(1 + 1).to.equal(3); + }); + }); +}); From 3200d414c5853de15d7ae2f6d7e841c356176746 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 9 Dec 2017 02:02:22 -0800 Subject: [PATCH 369/846] add docs/ to .eslintignore --- .eslintignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintignore b/.eslintignore index de45f4f208..7988ebc2cc 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,4 @@ coverage/ mocha.js *.fixture.js +docs/ From 5fbbce999284f137332ab359be11117d265b6cb1 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Sat, 9 Dec 2017 21:41:29 -0800 Subject: [PATCH 370/846] introduce package-lock.json; closes #3025 (#3026) - update `.travis.yml` to use npm@5 caching where available - remove `.npmrc` (now unused) - remove `package-lock.json` from `.gitignore` --- .gitignore | 1 - .npmrc | 2 - .travis.yml | 3 + package-lock.json | 8318 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 8321 insertions(+), 3 deletions(-) delete mode 100644 .npmrc create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 3a84892c54..774d4379a4 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ npm-debug.log* .nyc_output/ coverage/ yarn.lock -package-lock.json mocha.js # artifacts from various diff tools *_BACKUP_* diff --git a/.npmrc b/.npmrc deleted file mode 100644 index b15cbc2c02..0000000000 --- a/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -package-lock=false - diff --git a/.travis.yml b/.travis.yml index f41ea0f70d..b093a121b7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -52,3 +52,6 @@ addons: - .karma/ - ./mocha.js sauce_connect: true +cache: + directories: + - ~/.npm diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..70161b267e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8318 @@ +{ + "name": "mocha", + "version": "4.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "JSONStream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", + "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "dev": true, + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true, + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.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 + } + } + }, + "adm-zip": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz", + "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", + "dev": true, + "requires": { + "extend": "3.0.1", + "semver": "5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", + "dev": true + } + } + }, + "ajv": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz", + "integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "json-schema-traverse": "0.3.1", + "json-stable-stringify": "1.0.1" + }, + "dependencies": { + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + } + } + }, + "ajv-keywords": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", + "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=", + "dev": true + }, + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "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 + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "archiver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", + "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", + "dev": true, + "requires": { + "archiver-utils": "1.3.0", + "async": "2.5.0", + "buffer-crc32": "0.2.13", + "glob": "7.1.2", + "lodash": "4.17.4", + "readable-stream": "2.3.3", + "tar-stream": "1.5.4", + "walkdir": "0.0.11", + "zip-stream": "1.2.0" + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "dev": true, + "requires": { + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lazystream": "1.0.0", + "lodash": "4.17.4", + "normalize-path": "2.1.1", + "readable-stream": "2.3.3" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "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.1.0" + } + }, + "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==", + "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-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "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-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "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.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "asn1.js": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", + "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "astw": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz", + "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=", + "dev": true, + "requires": { + "acorn": "4.0.13" + } + }, + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "autolinker": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "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.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "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.1.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 + } + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", + "dev": true + }, + "bl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", + "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + }, + "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" + } + } + } + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "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.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-pack": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.2.tgz", + "integrity": "sha1-+GzWzvT1MAyOY+B6TVEvZfv/RTE=", + "dev": true, + "requires": { + "JSONStream": "1.3.1", + "combine-source-map": "0.7.2", + "defined": "1.0.0", + "through2": "2.0.3", + "umd": "3.0.1" + } + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" + }, + "browserify": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-14.4.0.tgz", + "integrity": "sha1-CJo0Y69Y0OSNjNQHCz90ZU1avKk=", + "dev": true, + "requires": { + "JSONStream": "1.3.1", + "assert": "1.4.1", + "browser-pack": "6.0.2", + "browser-resolve": "1.11.2", + "browserify-zlib": "0.1.4", + "buffer": "5.0.7", + "cached-path-relative": "1.0.1", + "concat-stream": "1.5.2", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.11.1", + "defined": "1.0.0", + "deps-sort": "2.0.0", + "domain-browser": "1.1.7", + "duplexer2": "0.1.4", + "events": "1.1.1", + "glob": "7.1.2", + "has": "1.0.1", + "htmlescape": "1.1.1", + "https-browserify": "1.0.0", + "inherits": "2.0.3", + "insert-module-globals": "7.0.1", + "labeled-stream-splicer": "2.0.0", + "module-deps": "4.1.1", + "os-browserify": "0.1.2", + "parents": "1.0.1", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "read-only-stream": "2.0.0", + "readable-stream": "2.3.3", + "resolve": "1.4.0", + "shasum": "1.0.2", + "shell-quote": "1.6.1", + "stream-browserify": "2.0.1", + "stream-http": "2.7.2", + "string_decoder": "1.0.3", + "subarg": "1.0.0", + "syntax-error": "1.3.0", + "through2": "2.0.3", + "timers-browserify": "1.4.2", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4", + "xtend": "4.0.1" + }, + "dependencies": { + "buffer": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.7.tgz", + "integrity": "sha512-NeeHXWh5pCbPQCt2/6rLvXqapZfVsqw/YgRgaHpT3H9Uzgs+S0lSg5SQzouIuDvcmlQRqBe8hOO2scKCu3cxrg==", + "dev": true, + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8" + } + } + } + }, + "browserify-aes": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.8.tgz", + "integrity": "sha512-WYCMOT/PtGTlpOKFht0YJFYcPy6pLCR98CtWfzK13zoynLlBMvAdEMSRGmgnJCw2M2j/5qxBkinZQFobieM8dQ==", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "1.0.8", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "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.11.8", + "randombytes": "2.0.5" + } + }, + "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.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "requires": { + "pako": "0.2.9" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "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-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "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.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cached-path-relative": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", + "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.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": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + } + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.2", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "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.3", + "safe-buffer": "5.1.1" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "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-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "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 + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + }, + "combine-source-map": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz", + "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=", + "dev": true, + "requires": { + "convert-source-map": "1.1.3", + "inline-source-map": "0.6.2", + "lodash.memoize": "3.0.4", + "source-map": "0.5.7" + } + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + }, + "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.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "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 + }, + "compress-commons": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.0.tgz", + "integrity": "sha1-WFhwku8g03y1i68AARLJJ4/3O58=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13", + "crc32-stream": "2.0.0", + "normalize-path": "2.1.1", + "readable-stream": "2.3.3" + } + }, + "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.5.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", + "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.0.6", + "typedarray": "0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + }, + "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 + } + } + }, + "connect": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.5.tgz", + "integrity": "sha1-+43ee6B2OHfQ7J352sC0tA5yx9o=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.0.6", + "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" + } + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.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-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 + }, + "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 + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", + "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 + }, + "coveralls": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.0.tgz", + "integrity": "sha512-ZppXR9y5PraUOrf/DzHJY6gzNUhXYE3b9D43xEXs4QYZ7/Oe0Gy0CS+IPKWFfvQFXB3RG9QduaQUFehzSpGAFw==", + "dev": true, + "requires": { + "js-yaml": "3.10.0", + "lcov-parse": "0.0.10", + "log-driver": "1.2.5", + "minimist": "1.2.0", + "request": "2.83.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "crc": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz", + "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=", + "dev": true + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "dev": true, + "requires": { + "crc": "3.5.0", + "readable-stream": "2.3.3" + } + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.9" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "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.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "crypto-browserify": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", + "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.5" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "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" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "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 + }, + "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, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "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 + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "deps-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", + "dev": true, + "requires": { + "JSONStream": "1.3.1", + "shasum": "1.0.2", + "subarg": "1.0.0", + "through2": "2.0.3" + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "detective": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz", + "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=", + "dev": true, + "requires": { + "acorn": "4.0.13", + "defined": "1.0.0" + } + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.5" + } + }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "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.1", + "ent": "2.2.0", + "extend": "3.0.1", + "void-elements": "2.0.1" + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "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.3.3" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "engine.io": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", + "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", + "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "ws": "1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", + "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.2", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "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 + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.7", + "wtf-8": "1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es6-promise": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.0.5.tgz", + "integrity": "sha1-eILzCt3lskDM+n99eMVIMwlRrkI=", + "dev": true + }, + "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=" + }, + "eslint": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.8.0.tgz", + "integrity": "sha1-Ip7w41Tg5h2DfHqA/fuoJeGZgV4=", + "dev": true, + "requires": { + "ajv": "5.2.3", + "babel-code-frame": "6.26.0", + "chalk": "2.1.0", + "concat-stream": "1.6.0", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.0.0", + "eslint-scope": "3.7.1", + "espree": "3.5.1", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.5", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.0.0", + "js-yaml": "3.10.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "require-uncached": "1.0.3", + "semver": "5.3.0", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.2", + "text-table": "0.2.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + } + } + }, + "eslint-config-semistandard": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-11.0.0.tgz", + "integrity": "sha1-RO73z9/Uchnjp7gbkbVA6IC7JhU=", + "dev": true + }, + "eslint-config-standard": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", + "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", + "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", + "dev": true, + "requires": { + "debug": "2.6.9", + "resolve": "1.4.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" + } + } + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "pkg-dir": "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, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz", + "integrity": "sha512-HGYmpU9f/zJaQiKNQOVfHUh2oLWW3STBrCgH0sHTX1xtsxYlH1zjLh8FlQGEIdZSdTbUMaV36WaZ6ImXkenGxQ==", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.1", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "read-pkg-up": "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==", + "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" + } + } + } + }, + "eslint-plugin-node": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.0.tgz", + "integrity": "sha512-N9FLFwknT5LhRhjz1lmHguNss/MCwkrLCS4CjqqTZZTJaUhLRfDNK3zxSHL/Il3Aa0Mw+xY3T1gtsJrUNoJy8Q==", + "dev": true, + "requires": { + "ignore": "3.3.5", + "minimatch": "3.0.4", + "resolve": "1.4.0", + "semver": "5.3.0" + } + }, + "eslint-plugin-promise": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz", + "integrity": "sha1-ePu2/+BHIBYnVp6FpsU3OvKmj8o=", + "dev": true + }, + "eslint-plugin-standard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", + "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", + "dev": true + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "espree": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", + "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", + "dev": true, + "requires": { + "acorn": "5.1.2", + "acorn-jsx": "3.0.1" + }, + "dependencies": { + "acorn": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", + "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "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" + } + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "0.2.3", + "array-unique": "0.2.1", + "braces": "0.1.5" + }, + "dependencies": { + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "0.1.1" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "0.1.1", + "repeat-string": "0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "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.1" + } + }, + "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.2.3" + } + }, + "expect.js": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", + "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "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.1" + } + }, + "external-editor": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.5.tgz", + "integrity": "sha512-Msjo64WT5W+NhOpQXh0nOHm+n0RfU1QUwDnKYvJ8dEJ8zlwLrqXNTv5mSUTJpepf41PDJGyhueTw2vNZW+Fr/w==", + "dev": true, + "requires": { + "iconv-lite": "0.4.19", + "jschardet": "1.5.1", + "tmp": "0.0.33" + } + }, + "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" + } + }, + "extract-zip": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.5.tgz", + "integrity": "sha1-maBnNbbqIOqbcF13ms/8yHz/BEA=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "debug": "2.2.0", + "mkdirp": "0.5.0", + "yauzl": "2.4.1" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "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.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "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 + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.6.tgz", + "integrity": "sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8=", + "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, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "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.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.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "1.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.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.7.0", + "node-pre-gyp": "0.6.36" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "aproba": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "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", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "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=", + "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 + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true, + "optional": true + }, + "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 + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "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, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "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", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "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 + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz", + "integrity": "sha1-22BBEst04NR3VU6bUFsXq936t4Y=", + "dev": true, + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "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=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "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 + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "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", + "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.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "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, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", + "dev": true + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "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", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": 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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "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, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "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, + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "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 + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "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.1" + } + }, + "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.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "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.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "gray-matter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", + "integrity": "sha1-MELZrewqHe1qdwep7SOA+KF6Qw4=", + "dev": true, + "requires": { + "ansi-red": "0.1.1", + "coffee-script": "1.12.7", + "extend-shallow": "2.0.1", + "js-yaml": "3.10.0", + "toml": "2.3.3" + } + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + }, + "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.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.2.3", + "har-schema": "2.0.0" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "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.1.1" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "pinkie-promise": "2.0.1" + } + }, + "hat": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", + "integrity": "sha1-uwFKnmSzeIrtgAWRdBPU/z1QLYo=", + "dev": true + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.0.2" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + } + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", + "dev": true, + "requires": { + "agent-base": "2.1.1", + "debug": "2.6.9", + "extend": "3.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" + } + } + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "ignore": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", + "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "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.7" + } + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.0.0", + "chalk": "2.1.0", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.0.5", + "figures": "2.0.0", + "lodash": "4.17.4", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + } + }, + "insert-module-globals": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz", + "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=", + "dev": true, + "requires": { + "JSONStream": "1.3.1", + "combine-source-map": "0.7.2", + "concat-stream": "1.5.2", + "is-buffer": "1.1.5", + "lexical-scope": "1.2.0", + "process": "0.11.10", + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "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, + "requires": { + "binary-extensions": "1.10.0" + } + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "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-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "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" + } + }, + "is-my-json-valid": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "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.2.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "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==", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "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", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "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" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "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-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jschardet": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", + "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "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.11" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "karma": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", + "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", + "dev": true, + "requires": { + "bluebird": "3.5.0", + "body-parser": "1.18.2", + "chokidar": "1.7.0", + "colors": "1.1.2", + "combine-lists": "1.0.1", + "connect": "3.6.5", + "core-js": "2.5.1", + "di": "0.0.1", + "dom-serialize": "2.2.1", + "expand-braces": "0.1.2", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "http-proxy": "1.16.2", + "isbinaryfile": "3.0.2", + "lodash": "3.10.1", + "log4js": "0.6.38", + "mime": "1.4.1", + "minimatch": "3.0.4", + "optimist": "0.6.1", + "qjobs": "1.1.5", + "range-parser": "1.2.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.1", + "socket.io": "1.7.3", + "source-map": "0.5.7", + "tmp": "0.0.31", + "useragent": "2.2.1" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + } + } + }, + "karma-browserify": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/karma-browserify/-/karma-browserify-5.1.1.tgz", + "integrity": "sha1-9kLXDXdtmrO3NSbFcyq8/qJAAxk=", + "dev": true, + "requires": { + "convert-source-map": "1.1.3", + "hat": "0.0.3", + "js-string-escape": "1.0.1", + "lodash": "3.10.1", + "minimatch": "3.0.4", + "os-shim": "0.1.3" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "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==", + "dev": true, + "requires": { + "fs-access": "1.0.1", + "which": "1.3.0" + } + }, + "karma-expect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/karma-expect/-/karma-expect-1.1.3.tgz", + "integrity": "sha1-xrClb/GJA9sRr08JjMbnzxmM4nU=", + "dev": true, + "requires": { + "expect.js": "0.3.1" + } + }, + "karma-mocha": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz", + "integrity": "sha1-7qrH/8DiAetjxGdEDStpx883eL8=", + "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 + } + } + }, + "karma-mocha-reporter": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.4.tgz", + "integrity": "sha1-DJyyLCfYZND2aU3wzwHKq86QZNQ=", + "dev": true, + "requires": { + "chalk": "2.1.0", + "log-symbols": "2.1.0", + "strip-ansi": "4.0.0" + } + }, + "karma-phantomjs-launcher": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", + "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", + "dev": true, + "requires": { + "lodash": "4.17.4", + "phantomjs-prebuilt": "2.1.15" + } + }, + "karma-sauce-launcher": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/karma-sauce-launcher/-/karma-sauce-launcher-1.2.0.tgz", + "integrity": "sha512-lEhtGRGS+3Yw6JSx/vJY9iQyHNtTjcojrSwNzqNUOaDceKDu9dPZqA/kr69bUO9G2T6GKbu8AZgXqy94qo31Jg==", + "dev": true, + "requires": { + "q": "1.5.0", + "sauce-connect-launcher": "1.2.2", + "saucelabs": "1.4.0", + "wd": "1.4.1" + } + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "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" + } + }, + "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.11" + } + }, + "labeled-stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz", + "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "isarray": "0.0.1", + "stream-splicer": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "0.1.0" + } + }, + "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.3.3" + } + }, + "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 + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "lexical-scope": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz", + "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=", + "dev": true, + "requires": { + "astw": "2.2.0" + } + }, + "list-item": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", + "integrity": "sha1-DGXQDih8tmPMs8s4Sad+iewmilY=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "extend-shallow": "2.0.1", + "is-number": "2.1.0", + "repeat-string": "1.6.1" + } + }, + "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.11", + "parse-json": "2.2.0", + "pify": "2.3.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" + }, + "dependencies": { + "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 + } + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "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 + }, + "log-driver": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true + }, + "log-symbols": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.1.0.tgz", + "integrity": "sha512-zLeLrzMA1A2vRF1e/0Mo+LNINzi6jzBylHj5WqvQ/WK/5WCZt8si9SyN4p9llr/HRYvVR1AoXHRHl4WTHyQAzQ==", + "dev": true, + "requires": { + "chalk": "2.1.0" + } + }, + "log4js": { + "version": "0.6.38", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "semver": "4.3.6" + }, + "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.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "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 + } + } + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "markdown-link": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz", + "integrity": "sha1-MsXGUZmmRXMWMi0eQinRNAfIx88=", + "dev": true + }, + "markdown-toc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "dev": true, + "requires": { + "concat-stream": "1.5.2", + "diacritics-map": "0.1.0", + "gray-matter": "2.1.1", + "lazy-cache": "2.0.2", + "list-item": "1.1.1", + "markdown-link": "0.1.1", + "minimist": "1.2.0", + "mixin-deep": "1.3.0", + "object.pick": "1.3.0", + "remarkable": "1.7.1", + "repeat-string": "1.6.1", + "strip-color": "0.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + }, + "dependencies": { + "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.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "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.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mixin-deep": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.0.tgz", + "integrity": "sha512-dgaCvoh6i1nosAUBKb0l0pfJ78K8+S9fluyIR2YvAeUD/QuMahnFnF3xYty5eYXMjhGSsB0DsW6A0uAZyetoAg==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "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" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "module-deps": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", + "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", + "dev": true, + "requires": { + "JSONStream": "1.3.1", + "browser-resolve": "1.11.2", + "cached-path-relative": "1.0.1", + "concat-stream": "1.5.2", + "defined": "1.0.0", + "detective": "4.5.0", + "duplexer2": "0.1.4", + "inherits": "2.0.3", + "parents": "1.0.1", + "readable-stream": "2.3.3", + "resolve": "1.4.0", + "stream-combiner2": "1.1.1", + "subarg": "1.0.0", + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", + "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=", + "dev": true, + "optional": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.3.0", + "validate-npm-package-license": "3.0.1" + } + }, + "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.1.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 + }, + "nyc": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.2.1.tgz", + "integrity": "sha1-rYUK/p261/SXByi0suR/7Rw4chw=", + "dev": true, + "requires": { + "archy": "1.0.0", + "arrify": "1.0.1", + "caching-transform": "1.0.1", + "convert-source-map": "1.5.0", + "debug-log": "1.0.1", + "default-require-extensions": "1.0.0", + "find-cache-dir": "0.1.1", + "find-up": "2.1.0", + "foreground-child": "1.5.6", + "glob": "7.1.2", + "istanbul-lib-coverage": "1.1.1", + "istanbul-lib-hook": "1.0.7", + "istanbul-lib-instrument": "1.8.0", + "istanbul-lib-report": "1.1.1", + "istanbul-lib-source-maps": "1.2.1", + "istanbul-reports": "1.1.2", + "md5-hex": "1.3.0", + "merge-source-map": "1.0.4", + "micromatch": "2.3.11", + "mkdirp": "0.5.1", + "resolve-from": "2.0.0", + "rimraf": "2.6.1", + "signal-exit": "3.0.2", + "spawn-wrap": "1.3.8", + "test-exclude": "4.1.1", + "yargs": "8.0.2", + "yargs-parser": "5.0.0" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "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 + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "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.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.8", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "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.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caching-transform": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", + "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", + "dev": true, + "requires": { + "md5-hex": "1.3.0", + "mkdirp": "0.5.1", + "write-file-atomic": "1.3.4" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": 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, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "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.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "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", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "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=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", + "dev": true + }, + "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.1.1", + "which": "1.3.0" + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "2.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "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 + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "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.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.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=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.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.1" + } + }, + "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.2.3" + } + }, + "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" + } + }, + "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 + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "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" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "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.2" + } + }, + "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.0.2", + "signal-exit": "3.0.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "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 + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "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.1" + } + }, + "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.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "handlebars": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", + "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.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.1.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 + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.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=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "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-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "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-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.1" + } + }, + "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.1" + } + }, + "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" + } + }, + "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.2.2" + } + }, + "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-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "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" + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha1-c7+5mIhSmUFck9OKPprfeEp3qdo=", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", + "integrity": "sha1-3WYH8DB2V4/n1vKmMM8UO0m6zdw=", + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz", + "integrity": "sha1-ZvbJQhzJ7EcE928tsIS6kHiitTI=", + "dev": true, + "requires": { + "babel-generator": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.1.1", + "semver": "5.4.1" + } + }, + "istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha1-8OVfVmVf+jQiIIC3oM1HYOFAX8k=", + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "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" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", + "integrity": "sha1-pv4ay6jOCO68Y45XLilNJnAIqgw=", + "dev": true, + "requires": { + "debug": "2.6.8", + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "rimraf": "2.6.1", + "source-map": "0.5.7" + } + }, + "istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha1-D7Lj9qqZIr085F0F2KtNXo4HvU8=", + "dev": true, + "requires": { + "handlebars": "4.0.10" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "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" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": 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" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "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" + }, + "dependencies": { + "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 + } + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "md5-hex": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", + "dev": true, + "requires": { + "md5-o-matic": "0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", + "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", + "dev": true + }, + "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.1.0" + } + }, + "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.7" + } + }, + "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.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "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.1.0" + } + }, + "npm-run-path": { + "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.1" + } + }, + "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=", + "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 + }, + "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.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "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" + } + }, + "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.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://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.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "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.2.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", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha1-flT+W1zNXWYk6mJVw0c74JC4AuE=", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "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=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "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 + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "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" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "spawn-wrap": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.3.8.tgz", + "integrity": "sha1-+ip5uZDLsLsAGNymdI2INnsZ7DE=", + "dev": true, + "requires": { + "foreground-child": "1.5.6", + "mkdirp": "0.5.1", + "os-homedir": "1.0.2", + "rimraf": "2.6.1", + "signal-exit": "3.0.2", + "which": "1.3.0" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "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" + } + } + } + }, + "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.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "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=", + "dev": true + }, + "test-exclude": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", + "integrity": "sha1-TYSWSwlmsAh+zDNKLOAC09k0HiY=", + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "2.3.11", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + } + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "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 + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "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 + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "wordwrap": { + "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, + "requires": { + "string-width": "1.0.2", + "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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "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.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.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.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "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.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "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.3.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.4.0", + "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.1.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 + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + } + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "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 + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "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.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "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" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "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.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "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", + "wordwrap": "1.0.0" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "os-browserify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz", + "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ=", + "dev": true + }, + "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", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "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.6.1" + } + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "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" + } + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "requires": { + "asn1.js": "4.9.1", + "browserify-aes": "1.0.8", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "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.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "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=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "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-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.3.0" + } + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "dev": true, + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "phantomjs-prebuilt": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.15.tgz", + "integrity": "sha1-IPhugtM0nFBZF1J3RbekEeCLOQM=", + "dev": true, + "requires": { + "es6-promise": "4.0.5", + "extract-zip": "1.6.5", + "fs-extra": "1.0.0", + "hasha": "2.2.0", + "kew": "0.7.0", + "progress": "1.1.8", + "request": "2.81.0", + "request-progress": "2.0.1", + "which": "1.2.14" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "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" + } + } + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://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.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.5" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "q": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", + "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=", + "dev": true + }, + "qjobs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.1.5.tgz", + "integrity": "sha1-ZZ3p8s+NzCehSBJ28gU3cnI4LnM=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "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": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "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.2.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", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "range-parser": { + "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.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "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.3.3" + } + }, + "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.4.0", + "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.1.0", + "read-pkg": "2.0.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" + } + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "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" + } + }, + "remarkable": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.1.tgz", + "integrity": "sha1-qspJchALZqZCpjoQIcpLrBvjv/Y=", + "dev": true, + "requires": { + "argparse": "0.1.16", + "autolinker": "0.15.3" + }, + "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.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "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=", + "dev": true + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "dev": true, + "requires": { + "throttleit": "1.0.0" + } + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "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.1", + "signal-exit": "3.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "sauce-connect-launcher": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.2.2.tgz", + "integrity": "sha1-c0bMj73EQxkTI0ObBzNFH181IfI=", + "dev": true, + "requires": { + "adm-zip": "0.4.7", + "async": "2.5.0", + "https-proxy-agent": "1.0.0", + "lodash": "4.17.4", + "rimraf": "2.6.2" + } + }, + "saucelabs": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.4.0.tgz", + "integrity": "sha1-uTSpr52ih0s/QKrh/N5QpEZvXzg=", + "dev": true, + "requires": { + "https-proxy-agent": "1.0.0" + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "requires": { + "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 + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + }, + "sha.js": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", + "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "dev": true, + "requires": { + "json-stable-stringify": "0.0.1", + "sha.js": "2.4.9" + } + }, + "shebang-command": { + "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" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "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.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + } + }, + "sntp": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", + "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + }, + "socket.io": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", + "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", + "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "1.8.3", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.7.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", + "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.3", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "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 + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "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 + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "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.4", + "readable-stream": "2.3.3" + } + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.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=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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 + }, + "strip-color": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", + "integrity": "sha1-EG9l09PmotlAHKwOsM6LinArT3s=", + "dev": true + }, + "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 + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "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 + } + } + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "requires": { + "has-flag": "2.0.0" + } + }, + "syntax-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", + "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", + "dev": true, + "requires": { + "acorn": "4.0.13" + } + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "5.2.3", + "ajv-keywords": "2.1.0", + "chalk": "2.1.0", + "lodash": "4.17.4", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + } + }, + "tar-stream": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", + "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", + "dev": true, + "requires": { + "bl": "1.2.1", + "end-of-stream": "1.4.0", + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3", + "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.10" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-object-path": { + "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.2.2" + } + }, + "toml": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.3.tgz", + "integrity": "sha512-O7L5hhSQHxuufWUdcTRPfuTh3phKfAZ/dqfxZFoxPCj2RYmpaSGLEIs016FCXItQwNr08yefUB5TSjzRYnajTA==", + "dev": true + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "umd": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz", + "integrity": "sha1-iuVW4RAR9jwllnCKiDclnwGz1g4=", + "dev": true + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + }, + "underscore.string": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", + "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "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 + } + } + }, + "useragent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", + "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "dev": true, + "requires": { + "lru-cache": "2.2.4", + "tmp": "0.0.33" + }, + "dependencies": { + "lru-cache": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", + "dev": true + } + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "vargs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz", + "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=", + "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.3.0" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "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 + }, + "walkdir": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", + "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", + "dev": true + }, + "watchify": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.9.0.tgz", + "integrity": "sha1-8HX9LoqGrN6Eztum5cKgvt1SPZ4=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "browserify": "14.4.0", + "chokidar": "1.7.0", + "defined": "1.0.0", + "outpipe": "1.1.1", + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "wd": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/wd/-/wd-1.4.1.tgz", + "integrity": "sha512-C0wWd2X4SWWcyx5qxaixiZE4Vb07sl0yDfWHPeml8lDHSbmI9erE9BmTHIqOGoDxGgJ3/hkFmODQ7ZLKiF8+8Q==", + "dev": true, + "requires": { + "archiver": "1.3.0", + "async": "2.0.1", + "lodash": "4.16.2", + "mkdirp": "0.5.1", + "q": "1.4.1", + "request": "2.79.0", + "underscore.string": "3.3.4", + "vargs": "0.1.0" + }, + "dependencies": { + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "async": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz", + "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=", + "dev": true, + "requires": { + "lodash": "4.16.2" + } + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "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.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.11.0", + "is-my-json-valid": "2.16.1", + "pinkie-promise": "2.0.1" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "lodash": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz", + "integrity": "sha1-PmJtuCcEimmSgaihJSJjJs/A5lI=", + "dev": true + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3", + "uuid": "3.1.0" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.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.1.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 + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + } + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "1.0.1" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "dev": true, + "requires": { + "archiver-utils": "1.3.0", + "compress-commons": "1.2.0", + "lodash": "4.17.4", + "readable-stream": "2.3.3" + } + } + } +} From 2b5c0c58498c0efa5a31baeabd904eaf77703708 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 11 Dec 2017 20:27:42 -0800 Subject: [PATCH 371/846] update link to "help wanted" label in CONTRIBUTING.md [ci skip] Signed-off-by: Christopher Hiller --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 8fb9feee2b..f85c2178c4 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -74,7 +74,7 @@ Follow these steps to get going. If you are having trouble, don't be afraid to *Excellent.* Here's how: -- **Handy with JavaScript?** Please check out the issues labeled [`pr-please`](https://git.io/vXYu2). +- **Handy with JavaScript?** Please check out the issues labeled [`help-wanted`](https://github.com/mochajs/mocha/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+label%3Ahelp-wanted). - **Can you write good (and do other stuff good too)?** Help with the documentation. See the [0issues for our site](https://github.com/mochajs/mocha/issues?q=is%3Aopen+is%3Aissue+label%3Adocumentation). - **Design your thing?** [Our site](https://github.com/mochajs/mocha/tree/master/docs) needs your magic touch. - **Know 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. From 2988a474bc3df9d75e1401a3b2de5dee2de0ae9b Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 11 Dec 2017 20:31:43 -0800 Subject: [PATCH 372/846] attempt to fix Gitter notifications from Travis-CI [ci skip] for `mochajs/contributors` room Signed-off-by: Christopher Hiller --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b093a121b7..095c05dd7e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,7 +42,7 @@ notifications: # for gitter mochajs/mocha - secure: fUrHenYJs+pTuLtgBRoYyrlyfVekxaIGmLWq7bhUUqBj/7p5eCkQFn13LlPht0/4WWZOiPBcdTN7tKnz3Ho7ATUJhAchvOWDUgL5gtTvOzeCHbPuCvHz/VLK6hMoPdbLA45M864NDLotfHvyh62WgQaVw9iPc80eb+umaDPrYiU= # for gitter mochajs/contributors - - secure: QQ7hvFqok0kypXLSjfVLsYDpLSFMPKblUsTupLSV6aK//COZ6XnyxIa/CWvnjlbap9bIAs5azHOeS6pe+KQJr2w0K8HUqbUDX1KofaMZmK8JuD1qK1kLjV8LB+5OhHQGs1r8KvGgUf1vYGITdwOvYqE2lr10EbrkmFo7kOSLvpA= + - secure: rGMGYWBaZgEa9i997jJHKzjI8WxECqLi6BqsMhvstDq9EeTeXkZFVfz4r6G3Xugsk3tFwb/pDpiYo1OK36kA5arUJTCia51u4Wn+c7lHKcpef/vXztoyucvw6/jXdVm/FQz1jztYYbqdyAOWC2BV8gYvg5F8TpK05UGCe5R0bRA= on_success: change on_failure: always From f7d6d8b444279ab00aa6a9a698182edde297a866 Mon Sep 17 00:00:00 2001 From: ScottFreeCode Date: Wed, 12 Jul 2017 13:29:14 -0400 Subject: [PATCH 373/846] Ignore difference of newline output in diffing test --- test/integration/diffs.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/integration/diffs.spec.js b/test/integration/diffs.spec.js index 7d620e7489..88b6f69e0d 100644 --- a/test/integration/diffs.spec.js +++ b/test/integration/diffs.spec.js @@ -7,7 +7,7 @@ var fs = require('fs'); var getDiffs = helpers.getDiffs; function getExpectedOutput () { - var output = fs.readFileSync('test/integration/fixtures/diffs/output', 'UTF8'); + var output = fs.readFileSync('test/integration/fixtures/diffs/output', 'UTF8').replace(/\r\n/g, '\n'); // Diffs are delimited in file by "// DIFF" return output.split(/\s*\/\/ DIFF/).slice(1).map(function (diff) { @@ -21,7 +21,7 @@ describe('diffs', function () { before(function (done) { run('diffs/diffs.fixture.js', ['-C'], function (err, res) { expected = getExpectedOutput(); - diffs = getDiffs(res.output); + diffs = getDiffs(res.output.replace(/\r\n/g, '\n')); done(err); }); }); From 4c0df7014f31b91a2cd05312437e3e0b56af6a59 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Tue, 12 Dec 2017 08:54:13 +0200 Subject: [PATCH 374/846] return the created test in `xit` for bdd interface; closes #3142 (#3143) * Fixes https://github.com/mochajs/mocha/issues/3142 * added test cases suggested by @boneskull * fixed miswording * attempt to fix bizarre AppVeyor problem by way of npm upgrade --- appveyor.yml | 1 + lib/interfaces/bdd.js | 2 +- .../pending/skip-shorthand.fixture.js | 7 ++++++ test/integration/pending.spec.js | 13 ++++++++++ test/interfaces/bdd.spec.js | 24 +++++++++++++++++++ 5 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 test/integration/fixtures/pending/skip-shorthand.fixture.js diff --git a/appveyor.yml b/appveyor.yml index 2fe1c21c65..28da3062f1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,6 +9,7 @@ install: - set CI=true - set PATH=%APPDATA%\npm;c:\MinGW\bin;%PATH% - set PHANTOMJS_CDNURL=https://cnpmjs.org/downloads + - npm install -g npm - npm install - copy c:\MinGW\bin\mingw32-make.exe c:\MinGW\bin\make.exe matrix: diff --git a/lib/interfaces/bdd.js b/lib/interfaces/bdd.js index 33efc169a2..7a54375a94 100644 --- a/lib/interfaces/bdd.js +++ b/lib/interfaces/bdd.js @@ -102,7 +102,7 @@ module.exports = function (suite) { */ context.xit = context.xspecify = context.it.skip = function (title) { - context.it(title); + return context.it(title); }; /** diff --git a/test/integration/fixtures/pending/skip-shorthand.fixture.js b/test/integration/fixtures/pending/skip-shorthand.fixture.js new file mode 100644 index 0000000000..399dc48a65 --- /dev/null +++ b/test/integration/fixtures/pending/skip-shorthand.fixture.js @@ -0,0 +1,7 @@ +'use strict'; + +describe('pending shorthand', function () { + xit('pending spec', function () {}).timeout(0); + xspecify('pending spec', function () {}).timeout(0); + it.skip('pending spec', function () {}).timeout(0); +}); diff --git a/test/integration/pending.spec.js b/test/integration/pending.spec.js index f5a400f089..30cf61ceb2 100644 --- a/test/integration/pending.spec.js +++ b/test/integration/pending.spec.js @@ -19,6 +19,19 @@ describe('pending', function () { done(); }); }); + it('should return the test object when used via shorthand methods', function (done) { + run('pending/skip-shorthand.fixture.js', args, function (err, res) { + if (err) { + done(err); + return; + } + assert.equal(res.stats.pending, 3); + assert.equal(res.stats.passes, 0); + assert.equal(res.stats.failures, 0); + assert.equal(res.code, 0); + done(); + }); + }); }); describe('synchronous skip()', function () { diff --git a/test/interfaces/bdd.spec.js b/test/interfaces/bdd.spec.js index 2289c12497..14365dc39a 100644 --- a/test/interfaces/bdd.spec.js +++ b/test/interfaces/bdd.spec.js @@ -40,3 +40,27 @@ describe('pending suite', function () { }); }); }); + +describe('pending tests', function () { + it.skip('should not run', function () { + expect(1 + 1).to.equal(3); + }); +}); + +describe('setting timeout by appending it to test', function () { + var runningTest = it('enables users to call timeout on active tests', function () { + expect(1 + 1).to.equal(2); + }).timeout(1003); + + var skippedTest = xit('enables users to call timeout on pending tests', function () { + expect(1 + 1).to.equal(3); + }).timeout(1002); + + it('sets timeout on pending tests', function () { + expect(skippedTest._timeout).to.equal(1002); + }); + + it('sets timeout on running tests', function () { + expect(runningTest._timeout).to.equal(1003); + }); +}); From 7ceaaf22c934afcd3b39aa57d15c4324f28c1e27 Mon Sep 17 00:00:00 2001 From: Capacitor Set Date: Thu, 13 Oct 2016 09:00:16 +0200 Subject: [PATCH 375/846] Add --no-diff option (fixes mochajs/mocha#2514) --- bin/_mocha | 7 +++++++ lib/mocha.js | 15 +++++++++++++++ lib/reporters/base.js | 3 +++ test/integration/fixtures/no-diff.fixture.js | 8 ++++++++ test/integration/no-diff.spec.js | 14 ++++++++++++++ test/reporters/base.spec.js | 15 +++++++++++++++ 6 files changed, 62 insertions(+) create mode 100644 test/integration/fixtures/no-diff.fixture.js create mode 100644 test/integration/no-diff.spec.js diff --git a/bin/_mocha b/bin/_mocha index cb7b5e63ce..b3c142425c 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -90,6 +90,7 @@ program .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('--no-diff', 'do not show a diff on failure') .option('--inspect', 'activate devtools in chrome') .option('--inspect-brk', 'activate devtools in chrome and break on the first line') .option('--interfaces', 'display available interfaces') @@ -250,6 +251,12 @@ if (program.inlineDiffs) { mocha.useInlineDiffs(true); } +// --no-diff + +if (process.argv.indexOf('--no-diff') !== -1) { + mocha.hideDiff(true); +} + // --slow if (program.slow) { diff --git a/lib/mocha.js b/lib/mocha.js index 5d2ab9ac89..2484ea5be8 100644 --- a/lib/mocha.js +++ b/lib/mocha.js @@ -389,6 +389,20 @@ Mocha.prototype.useInlineDiffs = function (inlineDiffs) { return this; }; +/** + * Do not show diffs at all. + * + * @param {Boolean} hideDiff + * @return {Mocha} + * @api public + * @param {boolean} hideDiff + * @return {Mocha} + */ +Mocha.prototype.hideDiff = function (hideDiff) { + this.options.hideDiff = hideDiff !== undefined && hideDiff; + return this; +}; + /** * Set the timeout in milliseconds. * @@ -545,6 +559,7 @@ Mocha.prototype.run = function (fn) { exports.reporters.Base.useColors = options.useColors; } exports.reporters.Base.inlineDiffs = options.useInlineDiffs; + exports.reporters.Base.hideDiff = options.hideDiff; function done (failures) { if (reporter.done) { diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 0ebc5e7db3..94339f346d 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -208,7 +208,10 @@ exports.list = function (failures) { if (err.uncaught) { msg = 'Uncaught ' + msg; } + // explicitly show diff + if (exports.hideDiff !== true && err.showDiff !== false && sameType(actual, expected) && expected !== undefined) { + escape = false; if (showDiff(err)) { stringifyDiffObjs(err); fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n'); diff --git a/test/integration/fixtures/no-diff.fixture.js b/test/integration/fixtures/no-diff.fixture.js new file mode 100644 index 0000000000..22b80ae86e --- /dev/null +++ b/test/integration/fixtures/no-diff.fixture.js @@ -0,0 +1,8 @@ +'use strict'; +var assert = require('assert'); + +describe('Example test', function () { + it('should fail', function () { + assert.deepEqual([1, 2, 3], ['foo', 'bar', 'baz']); + }); +}); diff --git a/test/integration/no-diff.spec.js b/test/integration/no-diff.spec.js new file mode 100644 index 0000000000..5766abce51 --- /dev/null +++ b/test/integration/no-diff.spec.js @@ -0,0 +1,14 @@ +'use strict'; + +var helpers = require('./helpers'); +var run = helpers.runMocha; + +describe('no-diff', function () { + it('should be honoured', function (done) { + run('no-diff.fixture.js', ['--no-diff'], function (err, res) { + res.output.should.not.match(/\+ expected/); + res.output.should.not.match(/- actual/); + done(err); + }); + }); +}); diff --git a/test/reporters/base.spec.js b/test/reporters/base.spec.js index e38bdb9fa2..e9118186a7 100644 --- a/test/reporters/base.spec.js +++ b/test/reporters/base.spec.js @@ -96,6 +96,21 @@ describe('Base reporter', function () { expect(errOut).to.not.match(/- actual/); expect(errOut).to.not.match(/\+ expected/); }); + + it('should not show diffs when hideDiff is set', function () { + var err = new Assert({ actual: 'foo', expected: 'bar' }); + var errOut; + + var test = makeTest(err); + + Base.hideDiff = true; + Base.list([test]); + Base.hideDiff = false; // Revert to original value + + errOut = stdout.join('\n'); + errOut.should.not.match(/\- actual/); + errOut.should.not.match(/\+ expected/); + }); }); describe('Getting two strings', function () { From 575d83d76b97dfa426ee9f1aa436e27f9e96b283 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Mon, 11 Dec 2017 22:40:13 -0800 Subject: [PATCH 376/846] fixup no-diff tests to use expect.js for #2536 --- lib/reporters/base.js | 5 +---- test/integration/no-diff.spec.js | 30 +++++++++++++++++++++++++----- test/reporters/base.spec.js | 4 ++-- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/lib/reporters/base.js b/lib/reporters/base.js index 94339f346d..d5425c8a53 100644 --- a/lib/reporters/base.js +++ b/lib/reporters/base.js @@ -208,11 +208,8 @@ exports.list = function (failures) { if (err.uncaught) { msg = 'Uncaught ' + msg; } - // explicitly show diff - if (exports.hideDiff !== true && err.showDiff !== false && sameType(actual, expected) && expected !== undefined) { - escape = false; - if (showDiff(err)) { + if (!exports.hideDiff && showDiff(err)) { stringifyDiffObjs(err); fmt = color('error title', ' %s) %s:\n%s') + color('error stack', '\n%s\n'); var match = message.match(/^([^:]+): expected/); diff --git a/test/integration/no-diff.spec.js b/test/integration/no-diff.spec.js index 5766abce51..10bb53c2d7 100644 --- a/test/integration/no-diff.spec.js +++ b/test/integration/no-diff.spec.js @@ -4,11 +4,31 @@ var helpers = require('./helpers'); var run = helpers.runMocha; describe('no-diff', function () { - it('should be honoured', function (done) { - run('no-diff.fixture.js', ['--no-diff'], function (err, res) { - res.output.should.not.match(/\+ expected/); - res.output.should.not.match(/- actual/); - done(err); + describe('when enabled', function () { + it('should not display a diff', function (done) { + run('no-diff.fixture.js', ['--no-diff'], function (err, res) { + if (err) { + done(err); + return; + } + expect(res.output).not.to.match(/\+ expected/); + expect(res.output).not.to.match(/- actual/); + done(); + }); + }); + }); + + describe('when disabled', function () { + it('should display a diff', function (done) { + run('no-diff.fixture.js', ['--diff'], function (err, res) { + if (err) { + done(err); + return; + } + expect(res.output).to.match(/\+ expected/); + expect(res.output).to.match(/- actual/); + done(); + }); }); }); }); diff --git a/test/reporters/base.spec.js b/test/reporters/base.spec.js index e9118186a7..087aa74f6e 100644 --- a/test/reporters/base.spec.js +++ b/test/reporters/base.spec.js @@ -108,8 +108,8 @@ describe('Base reporter', function () { Base.hideDiff = false; // Revert to original value errOut = stdout.join('\n'); - errOut.should.not.match(/\- actual/); - errOut.should.not.match(/\+ expected/); + expect(errOut).to.not.match(/- actual/); + expect(errOut).to.not.match(/\+ expected/); }); }); From 6fc2d9e90c4b190811173da3e8db5f2cef45a6d4 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Wed, 13 Dec 2017 03:28:16 +0200 Subject: [PATCH 377/846] Move re variable definition in lookupFiles Utility (#3082) * move regexp definition in lookupFiles. I am using mocha programmatically, along with its utility `lookupFiles`. A regular expression must be evaluated to lookup files although it is only needed in one case where a glob is not provided. Shifting the `re` variable definition down to where it is needed will avoid this issue, also eliminate the requirement of always sending an array to the extensions parameter (although it might not be needed) * add unit tests remove commented file --- lib/utils.js | 2 +- test/node-unit/file-utils.spec.js | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/utils.js b/lib/utils.js index 2c67cdc6b6..a6a74540d9 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -476,7 +476,6 @@ exports.canonicalize = function canonicalize (value, stack, typeHint) { */ exports.lookupFiles = function lookupFiles (path, extensions, recursive) { var files = []; - var re = new RegExp('\\.(' + extensions.join('|') + ')$'); if (!exists(path)) { if (exists(path + '.js')) { @@ -514,6 +513,7 @@ exports.lookupFiles = function lookupFiles (path, extensions, recursive) { // ignore error return; } + var re = new RegExp('\\.(?:' + extensions.join('|') + ')$'); if (!stat.isFile() || !re.test(file) || basename(file)[0] === '.') { return; } diff --git a/test/node-unit/file-utils.spec.js b/test/node-unit/file-utils.spec.js index 3ff1bd4d7e..5d1c44f75c 100644 --- a/test/node-unit/file-utils.spec.js +++ b/test/node-unit/file-utils.spec.js @@ -82,6 +82,26 @@ describe('file utils', function () { .have .length(expectedLength); }); + + it('should parse extensions from extnsions parameter', function () { + var nonJsFile = tmpFile('mocha-utils-text.txt'); + fs.writeFileSync(nonJsFile, 'yippy skippy ying yang yow'); + + var res = utils.lookupFiles(tmpDir, ['txt'], false); + 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.equal(tmpFile('mocha-utils.js')); + }); + + it('should require the extensions parameter when looking up a directory', function () { + var dirLookup = function () { + return utils.lookupFiles(tmpDir, undefined, false); + }; + expect(dirLookup).to.throwError(); + }); }); describe('.files', function () { From 1d486155e37743e1ba3ea6384268911d7e922cd0 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Tue, 12 Dec 2017 17:24:37 -0800 Subject: [PATCH 378/846] use ES6 in Node-only sources; closes #3146 - rename all `.eslintrc.yaml` to `.eslintrc.yml` to be consistent Signed-off-by: Christopher Hiller --- .eslintrc.yaml => .eslintrc.yml | 8 +- bin/.eslintrc.yml | 3 + bin/_mocha | 302 +++++++++--------- bin/mocha | 22 +- bin/options.js | 10 +- docs/{.eslintrc.yaml => .eslintrc.yml} | 0 karma.conf.js | 49 ++- lib/browser/{.eslintrc.yaml => .eslintrc.yml} | 0 scripts/.eslintrc.yaml | 2 - scripts/.eslintrc.yml | 3 + scripts/dedefine.js | 10 +- test/{.eslintrc.yaml => .eslintrc.yml} | 0 12 files changed, 206 insertions(+), 203 deletions(-) rename .eslintrc.yaml => .eslintrc.yml (77%) create mode 100644 bin/.eslintrc.yml rename docs/{.eslintrc.yaml => .eslintrc.yml} (100%) rename lib/browser/{.eslintrc.yaml => .eslintrc.yml} (100%) delete mode 100644 scripts/.eslintrc.yaml create mode 100644 scripts/.eslintrc.yml rename test/{.eslintrc.yaml => .eslintrc.yml} (100%) diff --git a/.eslintrc.yaml b/.eslintrc.yml similarity index 77% rename from .eslintrc.yaml rename to .eslintrc.yml index d5673232e7..86337ec874 100644 --- a/.eslintrc.yaml +++ b/.eslintrc.yml @@ -1,11 +1,11 @@ root: true +extends: semistandard env: - node: true - browser: true + node: yes + browser: yes + es6: no parserOptions: - ecmaVersion: 5 sourceType: script -extends: semistandard rules: strict: - error diff --git a/bin/.eslintrc.yml b/bin/.eslintrc.yml new file mode 100644 index 0000000000..36e0a779be --- /dev/null +++ b/bin/.eslintrc.yml @@ -0,0 +1,3 @@ +env: + es6: true + browser: false diff --git a/bin/_mocha b/bin/_mocha index b3c142425c..19cc1c50da 100755 --- a/bin/_mocha +++ b/bin/_mocha @@ -7,52 +7,136 @@ * Module dependencies. */ -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(); +const program = require('commander'); +const path = require('path'); +const fs = require('fs'); +const resolve = path.resolve; +const exists = fs.existsSync; +const Mocha = require('../'); +const utils = Mocha.utils; +const interfaceNames = Object.keys(Mocha.interfaces); +const join = path.join; +const cwd = process.cwd(); +const getOptions = require('./options'); +const mocha = new Mocha(); /** * Save timer references to avoid Sinon interfering (see GH-237). */ -var Date = global.Date; -var setTimeout = global.setTimeout; -var setInterval = global.setInterval; -var clearTimeout = global.clearTimeout; -var clearInterval = global.clearInterval; +const Date = global.Date; +const setTimeout = global.setTimeout; +const setInterval = global.setInterval; +const clearTimeout = global.clearTimeout; +const clearInterval = global.clearInterval; + +/** + * Exits Mocha when tests + code under test has finished execution (default) + * @param {number} code - Exit code; typically # of failures + */ +const exitLater = code => { + process.on('exit', () => { + process.exit(Math.min(code, 255)); + }); +}; + +/** + * Exits Mocha when Mocha itself has finished execution, regardless of + * what the tests or code under test is doing. + * @param {number} code - Exit code; typically # of failures + */ +const exit = code => { + const clampedCode = Math.min(code, 255); + let draining = 0; + + // Eagerly set the process's exit code in case stream.write doesn't + // execute its callback before the process terminates. + process.exitCode = clampedCode; + + // 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 + const done = () => { + if (!(draining--)) { + process.exit(clampedCode); + } + }; + + const streams = [process.stdout, process.stderr]; + + streams.forEach(stream => { + // submit empty write request and wait for completion + draining += 1; + stream.write('', done); + }); + + done(); +}; + +/** + * Parse list. + */ +const list = str => str.split(/ *, */); + +/** + * Hide the cursor. + */ +const hideCursor = () => { + process.stdout.write('\u001b[?25l'); +}; + +/** + * Show the cursor. + */ +const showCursor = () => { + process.stdout.write('\u001b[?25h'); +}; + +/** + * Stop play()ing. + */ +const stop = () => { + process.stdout.write('\u001b[2K'); + clearInterval(play.timer); +}; + +/** + * Play the given array of strings. + */ +const play = (arr, interval) => { + const len = arr.length; + interval = interval || 100; + let i = 0; + + play.timer = setInterval(() => { + const str = arr[i++ % len]; + process.stdout.write(`\u001b[0G${str}`); + }, interval); +}; /** * Files. */ -var files = []; +let files = []; /** * Globals. */ -var globals = []; +let globals = []; /** * Requires. */ -var requires = []; +const requires = []; /** * Images. */ -var images = { +const images = { fail: path.join(__dirname, '..', 'images', 'error.png'), pass: path.join(__dirname, '..', 'images', 'ok.png') }; @@ -78,7 +162,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 (' + interfaceNames.join('|') + ')', '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') @@ -124,12 +208,12 @@ program._name = 'mocha'; program .command('init ') .description('initialize a client-side mocha setup at ') - .action(function (path) { - var mkdir = require('mkdirp'); + .action(path => { + const mkdir = require('mkdirp'); mkdir.sync(path); - var css = fs.readFileSync(join(__dirname, '..', 'mocha.css')); - var js = fs.readFileSync(join(__dirname, '..', 'mocha.js')); - var tmpl = fs.readFileSync(join(__dirname, '..', 'lib/template.html')); + const css = fs.readFileSync(join(__dirname, '..', 'mocha.css')); + const js = fs.readFileSync(join(__dirname, '..', 'mocha.js')); + const tmpl = fs.readFileSync(join(__dirname, '..', 'lib/template.html')); fs.writeFileSync(join(path, 'mocha.css'), css); fs.writeFileSync(join(path, 'mocha.js'), js); fs.writeFileSync(join(path, 'tests.js'), ''); @@ -139,13 +223,13 @@ program // --globals -program.on('option:globals', function (val) { +program.on('option:globals', val => { globals = globals.concat(list(val)); }); // --reporters -program.on('option:reporters', function () { +program.on('option:reporters', () => { console.log(); console.log(' dot - dot matrix'); console.log(' doc - html documentation'); @@ -166,10 +250,10 @@ program.on('option:reporters', function () { // --interfaces -program.on('option:interfaces', function () { +program.on('option:interfaces', () => { console.log(''); - interfaceNames.forEach(function (interfaceName) { - console.log(' ' + interfaceName); + interfaceNames.forEach(interfaceName => { + console.log(` ${interfaceName}`); }); console.log(''); process.exit(); @@ -179,8 +263,8 @@ program.on('option:interfaces', function () { module.paths.push(cwd, join(cwd, 'node_modules')); -program.on('option:require', function (mod) { - var abs = exists(mod) || exists(mod + '.js'); +program.on('option:require', mod => { + const abs = exists(mod) || exists(`${mod}.js`); if (abs) { mod = resolve(mod); } @@ -202,12 +286,12 @@ Error.stackTraceLimit = Infinity; // TODO: config // reporter options -var reporterOptions = {}; +const reporterOptions = {}; if (program.reporterOptions !== undefined) { - program.reporterOptions.split(',').forEach(function (opt) { - var L = opt.split('='); + program.reporterOptions.split(',').forEach(opt => { + const L = opt.split('='); if (L.length > 2 || L.length === 0) { - throw new Error("invalid reporter option '" + opt + "'"); + throw new Error(`invalid reporter option '${opt}'`); } else if (L.length === 2) { reporterOptions[L[0]] = L[1]; } else { @@ -222,14 +306,14 @@ mocha.reporter(program.reporter, reporterOptions); // load reporter -var Reporter = null; +let Reporter = null; try { - Reporter = require('../lib/reporters/' + program.reporter); + Reporter = require(`../lib/reporters/${program.reporter}`); } catch (err) { try { Reporter = require(program.reporter); } catch (err2) { - throw new Error('reporter "' + program.reporter + '" does not exist'); + throw new Error(`reporter "${program.reporter}" does not exist`); } } @@ -354,14 +438,14 @@ if (program.forbidPending) mocha.forbidPending(); // custom compiler support if (program.compilers.length > 0) { - require('util').deprecate(function () {}, + require('util').deprecate(() => {}, '"--compilers" will be removed in a future version of Mocha; see https://git.io/vdcSr for more info')(); } -var extensions = ['js']; -program.compilers.forEach(function (c) { - var idx = c.indexOf(':'); - var ext = c.slice(0, idx); - var mod = c.slice(idx + 1); +const extensions = ['js']; +program.compilers.forEach(c => { + const idx = c.indexOf(':'); + const ext = c.slice(0, idx); + let mod = c.slice(idx + 1); if (mod[0] === '.') { mod = join(process.cwd(), mod); @@ -373,7 +457,7 @@ program.compilers.forEach(function (c) { // requires -requires.forEach(function (mod) { +requires.forEach(mod => { require(mod); }); @@ -383,7 +467,7 @@ mocha.ui(program.ui); // args -var args = program.args; +const args = program.args; // default files to test/*.{js,coffee} @@ -391,13 +475,13 @@ if (!args.length) { args.push('test'); } -args.forEach(function (arg) { - var newFiles; +args.forEach(arg => { + let 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); + console.error(`Warning: Could not find any test files matching pattern: ${arg}`); return; } @@ -414,9 +498,7 @@ if (!files.length) { // resolve -files = files.map(function (path) { - return resolve(path); -}); +files = files.map(path => resolve(path)); if (program.sort) { files.sort(); @@ -424,28 +506,28 @@ if (program.sort) { // --watch -var runner; -var loadAndRun; -var purge; -var rerun; +let runner; +let loadAndRun; +let purge; +let rerun; if (program.watch) { console.log(); hideCursor(); - process.on('SIGINT', function () { + process.on('SIGINT', () => { showCursor(); console.log('\n'); process.exit(130); }); - var watchFiles = utils.files(cwd, [ 'js' ].concat(program.watchExtensions)); - var runAgain = false; + const watchFiles = utils.files(cwd, [ 'js' ].concat(program.watchExtensions)); + let runAgain = false; - loadAndRun = function loadAndRun () { + loadAndRun = () => { try { mocha.files = files; runAgain = false; - runner = mocha.run(function () { + runner = mocha.run(() => { runner = null; if (runAgain) { rerun(); @@ -456,15 +538,15 @@ if (program.watch) { } }; - purge = function purge () { - watchFiles.forEach(function (file) { + purge = () => { + watchFiles.forEach(file => { delete require.cache[file]; }); }; loadAndRun(); - rerun = function rerun () { + rerun = () => { purge(); stop(); if (!program.grep) { @@ -476,7 +558,7 @@ if (program.watch) { loadAndRun(); }; - utils.watch(watchFiles, function () { + utils.watch(watchFiles, () => { runAgain = true; if (runner) { runner.abort(); @@ -491,41 +573,7 @@ if (program.watch) { runner = mocha.run(program.exit ? exit : exitLater); } -function exitLater (code) { - process.on('exit', function () { - process.exit(Math.min(code, 255)); - }); -} - -function exit (code) { - var clampedCode = Math.min(code, 255); - - // Eagerly set the process's exit code in case stream.write doesn't - // execute its callback before the process terminates. - process.exitCode = clampedCode; - - // 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(clampedCode); - } - } - - 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 () { +process.on('SIGINT', () => { runner.abort(); // This is a hack: @@ -533,51 +581,3 @@ process.on('SIGINT', function () { // The amount of failures will be emitted as error code later runner.failures = 130; }); - -/** - * Parse list. - */ - -function list (str) { - return str.split(/ *, */); -} - -/** - * Hide the cursor. - */ - -function hideCursor () { - process.stdout.write('\u001b[?25l'); -} - -/** - * Show the cursor. - */ - -function showCursor () { - process.stdout.write('\u001b[?25h'); -} - -/** - * Stop play()ing. - */ - -function stop () { - process.stdout.write('\u001b[2K'); - clearInterval(play.timer); -} - -/** - * Play the given array of strings. - */ - -function play (arr, interval) { - var len = arr.length; - interval = interval || 100; - var i = 0; - - 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 d632fbc394..38d09fb822 100755 --- a/bin/mocha +++ b/bin/mocha @@ -7,17 +7,17 @@ * when found, before invoking the "real" _mocha(1) executable. */ -var spawn = require('child_process').spawn; -var path = require('path'); -var getOptions = require('./options'); -var args = [path.join(__dirname, '_mocha')]; +const spawn = require('child_process').spawn; +const path = require('path'); +const getOptions = require('./options'); +const 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) { - var flag = arg.split('=')[0]; +process.argv.slice(2).forEach(arg => { + const flag = arg.split('=')[0]; switch (flag) { case '-d': @@ -69,9 +69,11 @@ 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 () { +const proc = spawn(process.execPath, args, { + stdio: 'inherit' +}); +proc.on('exit', (code, signal) => { + process.on('exit', () => { if (signal) { process.kill(process.pid, signal); } else { @@ -81,7 +83,7 @@ proc.on('exit', function (code, signal) { }); // terminate children. -process.on('SIGINT', function () { +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. }); diff --git a/bin/options.js b/bin/options.js index 7ee0eca8dc..ac835bf833 100644 --- a/bin/options.js +++ b/bin/options.js @@ -4,7 +4,7 @@ * Dependencies. */ -var fs = require('fs'); +const fs = require('fs'); /** * Export `getOptions`. @@ -21,18 +21,16 @@ function getOptions () { return; } - var optsPath = process.argv.indexOf('--opts') === -1 + const optsPath = process.argv.indexOf('--opts') === -1 ? 'test/mocha.opts' : process.argv[process.argv.indexOf('--opts') + 1]; try { - var opts = fs.readFileSync(optsPath, 'utf8') + const opts = fs.readFileSync(optsPath, 'utf8') .replace(/\\\s/g, '%20') .split(/\s/) .filter(Boolean) - .map(function (value) { - return value.replace(/%20/g, ' '); - }); + .map(value => value.replace(/%20/g, ' ')); process.argv = process.argv .slice(0, 2) diff --git a/docs/.eslintrc.yaml b/docs/.eslintrc.yml similarity index 100% rename from docs/.eslintrc.yaml rename to docs/.eslintrc.yml diff --git a/karma.conf.js b/karma.conf.js index cf07b0b905..c4d752d409 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,11 +1,11 @@ 'use strict'; -var fs = require('fs'); -var path = require('path'); -var mkdirp = require('mkdirp'); -var baseBundleDirpath = path.join(__dirname, '.karma'); +const fs = require('fs'); +const path = require('path'); +const mkdirp = require('mkdirp'); +const baseBundleDirpath = path.join(__dirname, '.karma'); -var browserPlatformPairs = { +const browserPlatformPairs = { 'chrome@latest': 'Windows 8', 'MicrosoftEdge@latest': 'Windows 10', 'internet explorer@11.0': 'Windows 8.1', @@ -15,9 +15,9 @@ var browserPlatformPairs = { 'safari@latest': 'OS X 10.12' }; -module.exports = function (config) { - var bundleDirpath; - var cfg = { +module.exports = config => { + let bundleDirpath; + const cfg = { frameworks: [ 'browserify', 'expect', @@ -40,11 +40,11 @@ module.exports = function (config) { .ignore('path') .ignore('supports-color') .require(path.join(__dirname, 'node_modules', 'buffer'), {expose: 'buffer'}) - .on('bundled', function (err, content) { + .on('bundled', (err, content) => { if (!err && bundleDirpath) { // write bundle to directory for debugging fs.writeFileSync(path.join(bundleDirpath, - 'bundle.' + Date.now() + '.js'), content); + `bundle.${Date.now()}.js`), content); } }); } @@ -75,8 +75,8 @@ module.exports = function (config) { // TO RUN LOCALLY, execute: // `CI=1 SAUCE_USERNAME= SAUCE_ACCESS_KEY= BROWSER= PLATFORM= make test-browser` - var env = process.env; - var sauceConfig; + const env = process.env; + let sauceConfig; if (env.CI) { console.error('CI mode enabled'); @@ -86,8 +86,7 @@ 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, startConnect: false }; @@ -103,7 +102,7 @@ module.exports = function (config) { 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) { - var id = require('os').hostname() + ' (' + Date.now() + ')'; + const id = `${require('os').hostname()} (${Date.now()})`; sauceConfig = { build: id, tunnelIdentifier: id, @@ -128,14 +127,14 @@ module.exports = function (config) { // tests. 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 = env.MOCHA_UI; + const ui = env.MOCHA_UI; if (ui) { if (cfg.sauceLabs) { - cfg.sauceLabs.testName = 'Interface "' + ui + '" integration tests'; + cfg.sauceLabs.testName = `Interface "${ui}" integration tests`; } cfg.files = [ - 'test/browser-fixtures/' + ui + '.fixture.js', - 'test/interfaces/' + ui + '.spec.js' + `test/browser-fixtures/${ui}.fixture.js`, + `test/interfaces/${ui}.spec.js` ]; } else if (cfg.sauceLabs) { cfg.sauceLabs.testName = 'Unit Tests'; @@ -146,13 +145,13 @@ module.exports = function (config) { function addSauceTests (cfg) { cfg.reporters.push('saucelabs'); - var browsers = Object.keys(browserPlatformPairs); + const browsers = Object.keys(browserPlatformPairs); cfg.browsers = cfg.browsers.concat(browsers); - cfg.customLaunchers = browsers.reduce(function (acc, browser) { - var platform = browserPlatformPairs[browser]; - var browserParts = browser.split('@'); - var browserName = browserParts[0]; - var version = browserParts[1]; + cfg.customLaunchers = browsers.reduce((acc, browser) => { + const platform = browserPlatformPairs[browser]; + const browserParts = browser.split('@'); + const browserName = browserParts[0]; + const version = browserParts[1]; acc[browser] = { base: 'SauceLabs', browserName: browserName, diff --git a/lib/browser/.eslintrc.yaml b/lib/browser/.eslintrc.yml similarity index 100% rename from lib/browser/.eslintrc.yaml rename to lib/browser/.eslintrc.yml diff --git a/scripts/.eslintrc.yaml b/scripts/.eslintrc.yaml deleted file mode 100644 index 1ddd632e1c..0000000000 --- a/scripts/.eslintrc.yaml +++ /dev/null @@ -1,2 +0,0 @@ -parserOptions: - ecmaVersion: 2017 diff --git a/scripts/.eslintrc.yml b/scripts/.eslintrc.yml new file mode 100644 index 0000000000..36e0a779be --- /dev/null +++ b/scripts/.eslintrc.yml @@ -0,0 +1,3 @@ +env: + es6: true + browser: false diff --git a/scripts/dedefine.js b/scripts/dedefine.js index 850fde3833..cd21b623c1 100644 --- a/scripts/dedefine.js +++ b/scripts/dedefine.js @@ -5,8 +5,8 @@ * dependencies in our Browserify bundle. */ -var through = require('through2'); -var defineRx = /typeof\s+define\s*===?\s*['"]function['"]\s*&&\s*(?:define\.amd|typeof\s+define\.amd\s*===?\s*['"]object['"]\s*&&\s*define\.amd)/g; +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) @@ -15,10 +15,10 @@ function createStream () { }); } -module.exports = function (b) { - function wrap () { +module.exports = b => { + const wrap = () => { b.pipeline.get('wrap').push(createStream()); - } + }; b.on('reset', wrap); wrap(); diff --git a/test/.eslintrc.yaml b/test/.eslintrc.yml similarity index 100% rename from test/.eslintrc.yaml rename to test/.eslintrc.yml From ae7166e620a9f236e18d099fc2fb8187feab9637 Mon Sep 17 00:00:00 2001 From: Anthony Date: Wed, 13 Dec 2017 23:58:45 +0100 Subject: [PATCH 379/846] docs: Fixed link and typo (#3151) [ci skip] fixed broken links and typos, added feature links --- .github/CONTRIBUTING.md | 4 +-- docs/index.md | 56 ++++++++++++++++++++--------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index f85c2178c4..4a02037fc0 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -75,10 +75,10 @@ Follow these steps to get going. If you are having trouble, don't be afraid to *Excellent.* Here's how: - **Handy with JavaScript?** Please check out the issues labeled [`help-wanted`](https://github.com/mochajs/mocha/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+label%3Ahelp-wanted). -- **Can you write good (and do other stuff good too)?** Help with the documentation. See the [0issues for our site](https://github.com/mochajs/mocha/issues?q=is%3Aopen+is%3Aissue+label%3Adocumentation). +- **Can you write good (and do other stuff good too)?** Help with the documentation. See the [issues for our site](https://github.com/mochajs/mocha/issues?q=is%3Aopen+is%3Aissue+label%3Adocumentation). - **Design your thing?** [Our site](https://github.com/mochajs/mocha/tree/master/docs) needs your magic touch. - **Know 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/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?** If you're a seasoned Mocha user, why not help answer some questions in the [chat room](https://gitter.im/mochajs/mocha)? diff --git a/docs/index.md b/docs/index.md index 0ca8713f43..09c7cd939c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,36 +13,36 @@ Mocha is a feature-rich JavaScript test framework running on [Node.js](http://no ## Features -- browser support -- simple async support, including promises -- test coverage reporting -- string diff support -- javascript API for running tests +- [browser support](#running-mocha-in-the-browser) +- [simple async support, including promises](#asynchronous-code) +- [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 -- maps uncaught exceptions to the correct test case -- async test timeout support -- test retry 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 +- [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) +- [growl notification support](#mochaopts) +- [reports test durations](#test-duration) +- [highlights slow tests](#dot-matrix) +- [file watcher support](#min) +- [global variable leak detection](#--check-leaks) +- [optionally run tests that match a regexp](#-g---grep-pattern) +- [auto-exit to prevent "hanging" with an active loop](#--exit----no-exit) +- [easily meta-generate suites](#markdown) & [test-cases](#list) +- [mocha.opts file support](#mochaopts) +- clickable suite titles to filter test execution +- [node debugger support](#-d---debug) - 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! +- [use any assertion library you want](#assertions) +- [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) +- [TextMate bundle](#textmate) +- [and more!](https://mochajs.org) ## Table of Contents From 325fd4df9ebf05dc8fed7273fbc089bae51a82df Mon Sep 17 00:00:00 2001 From: Cube Date: Thu, 14 Dec 2017 01:34:06 +0200 Subject: [PATCH 380/846] add mocha side bar image to the static page (#3150) [ci skip] - adds png to docs for VS Code extension --- docs/images/mocha_side_bar.png | Bin 0 -> 219533 bytes docs/index.md | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 docs/images/mocha_side_bar.png diff --git a/docs/images/mocha_side_bar.png b/docs/images/mocha_side_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..56e39fe4d30a2f672146ef687aa844f7744929a6 GIT binary patch literal 219533 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
      Y_RMA4@4#qlDaCH7 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 **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) + ## Examples Real live example code: From 9b0b8cb9fea75e4cd565d6b714424d33de9cda93 Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 13 Dec 2017 21:58:22 -0800 Subject: [PATCH 381/846] fix local documentation problems; closes #3157 [ci skip] - update `Gemfile.lock` - rename `prebuild-docs.js` to `docs-update-toc.js` - fix `buildDocs` and `serveDocs` options and ensure TOC is updated - trim extra newlines from EOF in `index.md` after TOC update is run --- Gemfile.lock | 1 + package.json | 7 ++++--- scripts/{pre-build-docs.js => docs-update-toc.js} | 8 +++++--- 3 files changed, 10 insertions(+), 6 deletions(-) rename scripts/{pre-build-docs.js => docs-update-toc.js} (78%) diff --git a/Gemfile.lock b/Gemfile.lock index 33a59259ef..0844f4a345 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,4 +1,5 @@ GEM + remote: https://rubygems.org/ specs: addressable (2.5.2) public_suffix (>= 2.0.2, < 4.0) diff --git a/package.json b/package.json index 1fcbd718ed..c1161d9b74 100644 --- a/package.json +++ b/package.json @@ -304,9 +304,10 @@ "test": "make clean && make test", "prepublishOnly": "npm test && make clean && make mocha.js", "coveralls": "nyc report --reporter=text-lcov | coveralls", - "prebuildDocs": "node scripts/pre-build-docs.js", - "buildDocs": "bundle exec jekyll build --source docs --destination docs/_site --layouts docs/_layouts --safe --drafts", - "serveDocs": "bundle exec jekyll serve --config docs/_config.yml --safe --drafts --watch" + "prebuildDocs": "node scripts/docs-update-toc.js", + "buildDocs": "bundle exec jekyll build --source ./docs --destination ./docs/_site --config ./docs/_config.yml --safe --drafts", + "prewatchDocs": "node scripts/docs-update-toc.js", + "watchDocs": "bundle exec jekyll serve --source ./docs --destination ./docs/_site --config ./docs/_config.yml --safe --drafts --watch" }, "dependencies": { "browser-stdout": "1.3.0", diff --git a/scripts/pre-build-docs.js b/scripts/docs-update-toc.js similarity index 78% rename from scripts/pre-build-docs.js rename to scripts/docs-update-toc.js index e4e661602e..93da9aadca 100755 --- a/scripts/pre-build-docs.js +++ b/scripts/docs-update-toc.js @@ -24,8 +24,10 @@ fs.createReadStream(docsFilepath) .on('close', () => { console.log('Done.'); }) - .pipe(utils.concat( - input => fs.writeFileSync(docsFilepath, toc.insert(String(input), { + .pipe(utils.concat(input => { + const output = toc.insert(String(input), { bullets: '-', maxdepth: 2 - })))); + }).replace(/\n\n$/, '\n'); + return fs.writeFileSync(docsFilepath, output); + })); From 64c2bfc45177f7a83898982c9ed3fe92a8b9137f Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 13 Dec 2017 22:00:45 -0800 Subject: [PATCH 382/846] fix timeout in file-utils.spec.js --- test/node-unit/file-utils.spec.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/test/node-unit/file-utils.spec.js b/test/node-unit/file-utils.spec.js index 5d1c44f75c..f425468a26 100644 --- a/test/node-unit/file-utils.spec.js +++ b/test/node-unit/file-utils.spec.js @@ -13,10 +13,6 @@ describe('file utils', function () { var tmpFile = path.join.bind(path, tmpDir); var symlinkSupported = false; - beforeEach(function () { - this.timeout(2000); - }); - (function testSymlinkSupport () { makeTempDir(); @@ -32,6 +28,7 @@ describe('file utils', function () { }()); beforeEach(function () { + this.timeout(2000); makeTempDir(); fs.writeFileSync(tmpFile('mocha-utils.js'), 'yippy skippy ying yang yow'); From 28bfc853dd4a24e160fab39f590496128ff614f2 Mon Sep 17 00:00:00 2001 From: Anthony Date: Thu, 14 Dec 2017 00:52:37 +0100 Subject: [PATCH 383/846] Added a link to the walkthrough video --- MAINTAINERS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MAINTAINERS.md b/MAINTAINERS.md index a912b572a6..814b55e9d2 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -89,6 +89,8 @@ As maintainers, *we work together* to learn about the nature of these questions. 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*: From 33b7ea68ac2ca12322247e25c96c9bec4ec66d3a Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Wed, 13 Dec 2017 15:14:40 -0800 Subject: [PATCH 384/846] remove engines.npm from package.json; closes #3073 --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index c1161d9b74..00cea01277 100644 --- a/package.json +++ b/package.json @@ -296,8 +296,7 @@ "_mocha": "./bin/_mocha" }, "engines": { - "node": ">= 4.0.0", - "npm": ">= 2.15.11" + "node": ">= 4.0.0" }, "scripts": { "lint": "eslint . bin/*", From 78b686f3663fbe52ecd54827e5c00af0378292ba Mon Sep 17 00:00:00 2001 From: Can Oztokmak Date: Wed, 28 Dec 2016 23:11:30 +0300 Subject: [PATCH 385/846] `options.reporterOptions` are used for progress reporter Progress reporter had multiple options for configuring the reporter, but it needed the optional fields under `options` object, while those fields are provided under `options.reporterOptions`. This commit enables usage of optional fields from `reporterOptions`. --- lib/reporters/progress.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/reporters/progress.js b/lib/reporters/progress.js index 378ce38272..9d545534bc 100644 --- a/lib/reporters/progress.js +++ b/lib/reporters/progress.js @@ -39,11 +39,13 @@ function Progress (runner, options) { // default chars options = options || {}; - options.open = options.open || '['; - options.complete = options.complete || '▬'; - options.incomplete = options.incomplete || Base.symbols.dot; - options.close = options.close || ']'; - options.verbose = false; + var reporterOptions = options.reporterOptions || {}; + + options.open = reporterOptions.open || '['; + options.complete = reporterOptions.complete || '▬'; + options.incomplete = reporterOptions.incomplete || Base.symbols.dot; + options.close = reporterOptions.close || ']'; + options.verbose = reporterOptions.verbose || false; // tests started runner.on('start', function () { From 9150e34086b614605cae58d157c68532ecc6dadc Mon Sep 17 00:00:00 2001 From: Christopher Hiller Date: Thu, 21 Dec 2017 11:00:41 -0800 Subject: [PATCH 386/846] Revert "`options.reporterOptions` are used for progress reporter" This reverts commit 78b686f3663fbe52ecd54827e5c00af0378292ba. --- lib/reporters/progress.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/reporters/progress.js b/lib/reporters/progress.js index 9d545534bc..378ce38272 100644 --- a/lib/reporters/progress.js +++ b/lib/reporters/progress.js @@ -39,13 +39,11 @@ function Progress (runner, options) { // default chars options = options || {}; - var reporterOptions = options.reporterOptions || {}; - - options.open = reporterOptions.open || '['; - options.complete = reporterOptions.complete || '▬'; - options.incomplete = reporterOptions.incomplete || Base.symbols.dot; - options.close = reporterOptions.close || ']'; - options.verbose = reporterOptions.verbose || false; + options.open = options.open || '['; + options.complete = options.complete || '▬'; + options.incomplete = options.incomplete || Base.symbols.dot; + options.close = options.close || ']'; + options.verbose = false; // tests started runner.on('start', function () { From a27e54d846fed21a744d3016415231928d66dbc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Sun, 17 Dec 2017 21:32:53 +0100 Subject: [PATCH 387/846] Added assetgraph-builder post build improvement --- .gitignore | 1 + package.json | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 774d4379a4..1534ff8981 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,4 @@ mocha.js *_LOCAL_* *_REMOTE_* docs/_site +docs/_dist diff --git a/package.json b/package.json index 00cea01277..0e33233802 100644 --- a/package.json +++ b/package.json @@ -305,6 +305,7 @@ "coveralls": "nyc report --reporter=text-lcov | coveralls", "prebuildDocs": "node scripts/docs-update-toc.js", "buildDocs": "bundle exec jekyll build --source ./docs --destination ./docs/_site --config ./docs/_config.yml --safe --drafts", + "postbuildDocs": "buildProduction docs/_site/index.html --outroot docs/_dist --canonicalroot https://mochajs.org/ --optimizeimages --asyncscripts ", "prewatchDocs": "node scripts/docs-update-toc.js", "watchDocs": "bundle exec jekyll serve --source ./docs --destination ./docs/_site --config ./docs/_config.yml --safe --drafts --watch" }, @@ -322,6 +323,7 @@ }, "devDependencies": { "assert": "^1.4.1", + "assetgraph-builder": "^5.6.4", "browserify": "^14.4.0", "buffer": "^4.9.1", "coffee-script": "^1.10.0", From 960d24991c75bc084f4b51e9826993e94bf7f555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Sun, 17 Dec 2017 21:35:19 +0100 Subject: [PATCH 388/846] Switch backer and sponsor avatars from svg to raw images. Cuts 500kb avatars download away --- docs/_includes/backers.md | 2 +- docs/_includes/sponsors.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_includes/backers.md b/docs/_includes/backers.md index ccf561abfa..5b8ad63b5e 100644 --- a/docs/_includes/backers.md +++ b/docs/_includes/backers.md @@ -3,4 +3,4 @@ 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 %} +{% for i in (0..29) %}[![](//opencollective.com/mochajs/backer/{{ i }}/avatar.jpg)](https://opencollective.com/mochajs/backer/{{ i }}/website){: target="_blank" rel="noopener"}{% endfor %} diff --git a/docs/_includes/sponsors.md b/docs/_includes/sponsors.md index 5fe0c7d9c1..cd5331637c 100644 --- a/docs/_includes/sponsors.md +++ b/docs/_includes/sponsors.md @@ -3,4 +3,4 @@ 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 %} +{% for i in (0..29) %}[![](//opencollective.com/mochajs/sponsor/{{ i }}/avatar.jpg){: onload="window.avatars.sponsorLoaded()" }](https://opencollective.com/mochajs/sponsor/{{ i }}/website){: target="_blank"} {% endfor %} From 6a6d7162e729c994851cfd33e416c14fd8674bdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Sun, 17 Dec 2017 21:37:03 +0100 Subject: [PATCH 389/846] Pull normalize.css into repository for quicker local serving --- docs/_includes/head.html | 2 +- docs/css/normalize.css | 422 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 423 insertions(+), 1 deletion(-) create mode 100644 docs/css/normalize.css diff --git a/docs/_includes/head.html b/docs/_includes/head.html index 509d0b7ebf..906019b2ad 100644 --- a/docs/_includes/head.html +++ b/docs/_includes/head.html @@ -1,7 +1,7 @@ {{ page.title }} - + diff --git a/docs/css/normalize.css b/docs/css/normalize.css new file mode 100644 index 0000000000..8710595d3e --- /dev/null +++ b/docs/css/normalize.css @@ -0,0 +1,422 @@ +/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */ + +/** + * 1. Change the default font family in all browsers (opinionated). + * 2. Correct the line height in all browsers. + * 3. Prevent adjustments of font size after orientation changes in IE and iOS. + */ + +html { + font-family: sans-serif; /* 1 */ + line-height: 1.15; /* 2 */ + -ms-text-size-adjust: 100%; /* 3 */ + -webkit-text-size-adjust: 100%; /* 3 */ +} + +/** + * Remove the margin in all browsers (opinionated). + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Add the correct display in IE 9-. + * 1. Add the correct display in Edge, IE, and Firefox. + * 2. Add the correct display in IE. + */ + +article, +aside, +details, /* 1 */ +figcaption, +figure, +footer, +header, +main, /* 2 */ +menu, +nav, +section, +summary { /* 1 */ + display: block; +} + +/** + * Add the correct display in IE 9-. + */ + +audio, +canvas, +progress, +video { + display: inline-block; +} + +/** + * Add the correct display in iOS 4-7. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Add the correct display in IE 10-. + * 1. Add the correct display in IE. + */ + +template, /* 1 */ +[hidden] { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * 1. Remove the gray background on active links in IE 10. + * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. + */ + +a { + background-color: transparent; /* 1 */ + -webkit-text-decoration-skip: objects; /* 2 */ +} + +/** + * Remove the outline on focused links when they are also active or hovered + * in all browsers (opinionated). + */ + +a:active, +a:hover { + outline-width: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * 1. Remove the bottom border in Firefox 39-. + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Prevent the duplicate application of `bolder` by the next rule in Safari 6. + */ + +b, +strong { + font-weight: inherit; +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * Add the correct font style in Android 4.3-. + */ + +dfn { + font-style: italic; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Add the correct background and color in IE 9-. + */ + +mark { + background-color: #ff0; + color: #000; +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10-. + */ + +img { + border-style: none; +} + +/** + * Hide the overflow in IE. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct margin in IE 8. + */ + +figure { + margin: 1em 40px; +} + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change font properties to `inherit` in all browsers (opinionated). + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font: inherit; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Restore the font weight unset by the previous rule. + */ + +optgroup { + font-weight: bold; +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ + text-transform: none; +} + +/** + * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` + * controls in Android 4. + * 2. Correct the inability to style clickable types in iOS and Safari. + */ + +button, +html [type="button"], /* 1 */ +[type="reset"], +[type="submit"] { + -webkit-appearance: button; /* 2 */ +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Change the border, margin, and padding in all browsers (opinionated). + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Remove the default vertical scrollbar in IE. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10-. + * 2. Remove the padding in IE 10-. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding and cancel buttons in Chrome and Safari on OS X. + */ + +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Correct the text style of placeholders in Chrome, Edge, and Safari. + */ + +::-webkit-input-placeholder { + color: inherit; + opacity: 0.54; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} From 91e705eb3d67babce0ad1bb49c391a2c594f181c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Sun, 17 Dec 2017 21:38:13 +0100 Subject: [PATCH 390/846] Pull html5 shiv into local project for faster serving --- docs/_includes/head.html | 2 +- docs/js/html5shiv.min.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 docs/js/html5shiv.min.js diff --git a/docs/_includes/head.html b/docs/_includes/head.html index 906019b2ad..d145703e77 100644 --- a/docs/_includes/head.html +++ b/docs/_includes/head.html @@ -7,7 +7,7 @@ diff --git a/docs/js/html5shiv.min.js b/docs/js/html5shiv.min.js new file mode 100644 index 0000000000..d4c731ad54 --- /dev/null +++ b/docs/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?: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,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document); \ No newline at end of file From f56e411dc9bc7b29f507987558b35b313ff56f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Sun, 17 Dec 2017 21:39:09 +0100 Subject: [PATCH 391/846] Move google analytics script to footer to avoid clogging the pipes during slowstart --- docs/_includes/footer.html | 1 + docs/_includes/head.html | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_includes/footer.html b/docs/_includes/footer.html index 0a1f43e861..48cd488232 100644 --- a/docs/_includes/footer.html +++ b/docs/_includes/footer.html @@ -4,6 +4,7 @@ href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License.

      Last updated: {{ site.time | date: "%c" }} + From 363d05e42c1ce71a4af12b374b3f953f95dfe069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Sun, 17 Dec 2017 21:49:21 +0100 Subject: [PATCH 392/846] Switch header over to use local logo and drop js for animating logo and tagline on load --- docs/_includes/header.html | 11 +++- docs/css/style.css | 71 ++++++++++++--------- docs/images/mocha-logo.svg | 125 +++++++++++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+), 33 deletions(-) create mode 100644 docs/images/mocha-logo.svg diff --git a/docs/_includes/header.html b/docs/_includes/header.html index 99427f5c50..36baf2816f 100644 --- a/docs/_includes/header.html +++ b/docs/_includes/header.html @@ -1,4 +1,11 @@

      -

      -

      simple, flexible, fun

      +

      + + Mocha + +

      + +

      + simple, flexible, fun +

      diff --git a/docs/css/style.css b/docs/css/style.css index 4df465e56a..dfc018ba63 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -7,21 +7,54 @@ body { border-top: 2px solid #ddd; } -#content { - padding: 0 110px 60px 110px; +@keyframes fadein { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes slideright { + from { + transform: translateX(-45px); + } + + to { + transform: translateX(0); + } } header { padding: 140px 110px 0 110px; } -h1 { +#_header h1 { margin-left: -19px; opacity: 0; - -webkit-transition: opacity 1s; - -moz-transition: opacity 1s; - -o-transition: opacity 1s; - transition: opacity 1s; + animation: fadein 1s forwards; +} + +#tag { + color: #c29d7f; + font-weight: 100; + font-size: 30px; + margin-top: -158px; + margin-left: 185px; + margin-bottom: 125px; + letter-spacing: 2px; + + animation: fadein 1s forwards, slideright 1s forwards; +} + +#content { + padding: 0 110px 60px 110px; +} + +#tag em { + font-style: normal } #_backers a, #_sponsors a { @@ -61,30 +94,6 @@ h3 > code { font-size: 14px; } -#tag { - opacity: 0; - color: #c29d7f; - font-weight: 100; - font-size: 30px; - margin-top: -155px; - margin-left: 140px; - 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; - -o-transition: opacity 1s, margin-top 200ms, margin-bottom 200ms, margin-left 1s; - transition: opacity 1s, margin-top 200ms, margin-bottom 200ms, margin-left 1s; -} - -#tag em { - font-style: normal -} - -.onload #tag { - opacity: 1; - margin-left: 185px; -} - #content > p:first-child { font-size: 20px; font-weight: 200; diff --git a/docs/images/mocha-logo.svg b/docs/images/mocha-logo.svg new file mode 100644 index 0000000000..115b9bd6c2 --- /dev/null +++ b/docs/images/mocha-logo.svg @@ -0,0 +1,125 @@ + + + +Mocha Logoimage/svg+xmlMocha Logo08-21-2015Dick DeLeon <ddeleon@decipherinc.com>CC BY-SA 4.0mochamochajsChristopher Hiller <boneskull@boneskull.com> From 418d517496c372414ea2eecc18d68be570384779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Sun, 17 Dec 2017 21:50:22 +0100 Subject: [PATCH 393/846] Use local gitter image --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 371a729c49..34db9c5cd9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,7 +4,7 @@ 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). - [![Gitter](//badges.gitter.im/Join%20Chat.svg)](https://gitter.im/mochajs/mocha) + [![Gitter](/images/join-chat.svg)](https://gitter.im/mochajs/mocha) [![OpenCollective](//opencollective.com/mochajs/backers/badge.svg)](#backers) [![OpenCollective](//opencollective.com/mochajs/sponsors/badge.svg)](#sponsors) From 1f11c774dde7918941401746daa87c7740d81f99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Sun, 17 Dec 2017 21:51:30 +0100 Subject: [PATCH 394/846] Switch backers from js onload animation to having a default background and pop in the loaded image on top of it --- docs/_layouts/default.html | 4 +-- docs/css/style.css | 52 ++++++++++++++----------------- docs/images/backer-background.svg | 12 +++++++ docs/images/join-chat.svg | 1 + 4 files changed, 39 insertions(+), 30 deletions(-) create mode 100644 docs/images/backer-background.svg create mode 100644 docs/images/join-chat.svg diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index db3bdf76e4..1bc3d36be8 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -7,9 +7,9 @@ {% include header.html %} -
      +
      {{ content }} -
      + {% include footer.html %} diff --git a/docs/css/style.css b/docs/css/style.css index dfc018ba63..6d8f13b2ad 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -57,19 +57,36 @@ header { font-style: normal } -#_backers a, #_sponsors a { +#_backers { + display: flex; + flex-wrap: wrap; +} + +#_backers a { + margin: 3px; +} + +#_backers a img { + display: block; + width: 64px; + height: 64px; + + margin: 0; + box-shadow: none; + + background: url(/images/backer-background.svg?inline) center center no-repeat; +} + +#_sponsors a { opacity: 0; - -webkit-transition: opacity .3s; - -moz-transition: opacity .3s; - -o-transition: opacity .3s; transition: opacity .3s; } -#_backers a img, #_sponsors a img { +#_sponsors a img { max-height: 64px; } -.onload h1, #_backers.onload a, #_sponsors.onload a { +#_sponsors.onload a { opacity: 1; } @@ -112,11 +129,7 @@ ul { margin-top: 20px; padding: 0 15px; width: 100%; - -webkit-column-count: 2; - -moz-column-count: 2; column-count: 2; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; box-sizing: content-box; } @@ -126,8 +139,6 @@ ul li { list-style: none; border-bottom: 1px solid #eee; padding: 5px 0; - -webkit-column-break-inside: avoid; - -moz-column-break-inside: avoid; column-break-inside: avoid; } @@ -150,34 +161,19 @@ pre { 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; } -img { +main img:not([src*=avatar]):not([src*=badges]):not([src*=".svg"]) { margin: 30px; padding: 1px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - -o-border-radius: 3px; 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; box-shadow: 0 3px 10px #dedede, 0 1px 5px #888; max-width: 100%; } -img[src*="opencollective.com/mochajs"], img[src*=badges], img[src*=".svg"] { - margin: 0; - box-shadow: none; -} - footer { background-color: #eee; width: 100%; diff --git a/docs/images/backer-background.svg b/docs/images/backer-background.svg new file mode 100644 index 0000000000..29bd61663b --- /dev/null +++ b/docs/images/backer-background.svg @@ -0,0 +1,12 @@ + + + + + diff --git a/docs/images/join-chat.svg b/docs/images/join-chat.svg new file mode 100644 index 0000000000..0edf5f3b1e --- /dev/null +++ b/docs/images/join-chat.svg @@ -0,0 +1 @@ +gittergitterjoin chatjoin chat \ No newline at end of file From a1254388fd1666865c7f055b94eb6b05b555927a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Sun, 17 Dec 2017 22:41:05 +0100 Subject: [PATCH 395/846] Switch opencollective image listing and avatars fadein --- docs/_includes/backers.md | 2 +- docs/_includes/head.html | 1 - docs/_includes/sponsors.md | 6 ++++-- docs/css/style.css | 29 ++++++++++++----------------- docs/js/avatars.js | 28 ++++++++++++++++++---------- 5 files changed, 35 insertions(+), 31 deletions(-) diff --git a/docs/_includes/backers.md b/docs/_includes/backers.md index 5b8ad63b5e..b9c9c7d9f0 100644 --- a/docs/_includes/backers.md +++ b/docs/_includes/backers.md @@ -2,5 +2,5 @@ Find Mocha helpful? Become a [backer](https://opencollective.com/mochajs#support) and support Mocha with a monthly donation. -{: id="_backers" } +{: id="_backers" class="image-list" } {% for i in (0..29) %}[![](//opencollective.com/mochajs/backer/{{ i }}/avatar.jpg)](https://opencollective.com/mochajs/backer/{{ i }}/website){: target="_blank" rel="noopener"}{% endfor %} diff --git a/docs/_includes/head.html b/docs/_includes/head.html index d8a1a55d2b..facf54a402 100644 --- a/docs/_includes/head.html +++ b/docs/_includes/head.html @@ -9,5 +9,4 @@ - diff --git a/docs/_includes/sponsors.md b/docs/_includes/sponsors.md index cd5331637c..6f5d5a17ba 100644 --- a/docs/_includes/sponsors.md +++ b/docs/_includes/sponsors.md @@ -2,5 +2,7 @@ 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.jpg){: onload="window.avatars.sponsorLoaded()" }](https://opencollective.com/mochajs/sponsor/{{ i }}/website){: target="_blank"} {% endfor %} +{: class="image-list faded-images" } +{% for i in (0..15) %}[![](//opencollective.com/mochajs/sponsor/{{ i }}/avatar.jpg)](https://opencollective.com/mochajs/sponsor/{{ i }}/website){: target="_blank"} {% endfor %} + + diff --git a/docs/css/style.css b/docs/css/style.css index 6d8f13b2ad..2cecf29d7b 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -57,37 +57,32 @@ header { font-style: normal } -#_backers { - display: flex; - flex-wrap: wrap; +.image-list { + overflow: hidden; } -#_backers a { - margin: 3px; +.image-list a { + float: left; + margin: 6px; } -#_backers a img { +.image-list a img { display: block; - width: 64px; height: 64px; - - margin: 0; - box-shadow: none; - - background: url(/images/backer-background.svg?inline) center center no-repeat; } -#_sponsors a { +.faded-images img { opacity: 0; transition: opacity .3s; } -#_sponsors a img { - max-height: 64px; +.faded-images.is-loaded img { + opacity: 1; } -#_sponsors.onload a { - opacity: 1; +#_backers a img { + width: 64px; + background: url(/images/backer-background.svg?inline) center center no-repeat; } h2 { diff --git a/docs/js/avatars.js b/docs/js/avatars.js index 1bf3e690be..fec636bee8 100644 --- a/docs/js/avatars.js +++ b/docs/js/avatars.js @@ -1,15 +1,23 @@ (function () { 'use strict'; - // dumb thing that helps with animation of avatars - var avatars = window.avatars = function (type) { - return function avatarLoaded () { - avatars[type] = typeof avatars[type] === 'number' ? avatars[type] + 1 : 1; - if (avatars[type] === 30) { - document.getElementById(type).classList.add('onload'); + + var imageLists = document.querySelectorAll('.image-list'); + + Array.prototype.forEach.call(imageLists, function (imageList) { + var images = imageList.querySelectorAll('img'); + var counter = images.length; + + function onloadHandler() { + counter -= 1; + + if (counter === 0) { + imageList.classList.add('is-loaded'); } - }; - }; + } + + for (var i = 0; i < images.length; i += 1) { + images[i].onload = onloadHandler; + } + }); - avatars.backerLoaded = avatars('_backers'); - avatars.sponsorLoaded = avatars('_sponsors'); }()); From b5967babb15e165b72bf0e10b79f562112f105d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Sun, 17 Dec 2017 22:41:33 +0100 Subject: [PATCH 396/846] Switch google analytics to always use https, since they redirect theselves --- docs/js/ga.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/js/ga.js b/docs/js/ga.js index 6e3ff1949b..b310cf7085 100644 --- a/docs/js/ga.js +++ b/docs/js/ga.js @@ -1,7 +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'); +})(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-65024936-1', 'auto'); ga('send', 'pageview'); From 1ef231832f1b4cff3b6d9c12ce37ce41635e695f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 18 Dec 2017 00:05:04 +0100 Subject: [PATCH 397/846] Mobile friendliness --- docs/_includes/head.html | 1 + docs/css/style.css | 54 +++++++++++++++++++--------------------- docs/js/avatars.js | 1 + 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/docs/_includes/head.html b/docs/_includes/head.html index facf54a402..41dff9accd 100644 --- a/docs/_includes/head.html +++ b/docs/_includes/head.html @@ -1,5 +1,6 @@ + {{ page.title }} diff --git a/docs/css/style.css b/docs/css/style.css index 2cecf29d7b..dd41088fce 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -27,11 +27,23 @@ body { } } +header, #content { + max-width: 920px; + margin: 0 auto; + padding-left: 30px; + padding-right: 30px; +} + header { - padding: 140px 110px 0 110px; + padding-top: 20px; +} + +#content { + padding-bottom: 60px; } #_header h1 { + margin-top: 0; margin-left: -19px; opacity: 0; animation: fadein 1s forwards; @@ -49,10 +61,6 @@ header { animation: fadein 1s forwards, slideright 1s forwards; } -#content { - padding: 0 110px 60px 110px; -} - #tag em { font-style: normal } @@ -123,26 +131,17 @@ a:hover { ul { margin-top: 20px; padding: 0 15px; - width: 100%; + column-gap: 30px; column-count: 2; box-sizing: content-box; } ul li { margin-top: 5px; - margin-right: 60px; list-style: none; border-bottom: 1px solid #eee; padding: 5px 0; - column-break-inside: avoid; -} - -ul::after { - content: '.'; - height: 0; - display: block; - visibility: hidden; - clear: both; + break-inside: avoid; } code { @@ -151,7 +150,7 @@ code { } pre { - margin: 20px; + margin: 20px 0; padding: 20px; border: 1px solid #ddd; border-bottom-color: #ccc; @@ -162,8 +161,8 @@ pre { } main img:not([src*=avatar]):not([src*=badges]):not([src*=".svg"]) { - margin: 30px; - padding: 1px; + display: block; + margin: 30px auto; border-radius: 3px; box-shadow: 0 3px 10px #dedede, 0 1px 5px #888; max-width: 100%; @@ -171,7 +170,6 @@ main img:not([src*=avatar]):not([src*=badges]):not([src*=".svg"]) { footer { background-color: #eee; - width: 100%; padding: 50px 0; text-align: right; border-top: 1px solid #ddd; @@ -184,12 +182,6 @@ footer span { font-size: 0.8em; } -@media all and (max-width: 850px) { - ul li { - width: 100%; - } -} - @media all and (max-width: 600px) { #tag { margin-top: 0; @@ -197,9 +189,15 @@ footer span { margin-bottom: 0; } - .onload #tag { - margin-left: 0; + ul { + column-count: 1; + } + + pre { + padding: 10px; + margin: 20px -11px; } + } blockquote { diff --git a/docs/js/avatars.js b/docs/js/avatars.js index fec636bee8..58dbb7cbe3 100644 --- a/docs/js/avatars.js +++ b/docs/js/avatars.js @@ -17,6 +17,7 @@ for (var i = 0; i < images.length; i += 1) { images[i].onload = onloadHandler; + images[i].onerror = onloadHandler; } }); From 735994c7d91a3a2b72521611526738eb6e0034fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 18 Dec 2017 00:34:30 +0100 Subject: [PATCH 398/846] Space out badges a bit --- docs/css/style.css | 4 ++++ docs/index.md | 8 +++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/css/style.css b/docs/css/style.css index dd41088fce..5216b4f881 100644 --- a/docs/css/style.css +++ b/docs/css/style.css @@ -65,6 +65,10 @@ header { font-style: normal } +nav.badges a + a { + margin-left: 3px; +} + .image-list { overflow: hidden; } diff --git a/docs/index.md b/docs/index.md index 34db9c5cd9..98f5671590 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,9 +4,11 @@ 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). - [![Gitter](/images/join-chat.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 %} From 7f01ebd855cfb92c1b846fb090a7b4d8f5550e98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 18 Dec 2017 00:34:45 +0100 Subject: [PATCH 399/846] Add svgo and inline small enough images --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0e33233802..c563045586 100644 --- a/package.json +++ b/package.json @@ -303,9 +303,9 @@ "test": "make clean && make test", "prepublishOnly": "npm test && make clean && make mocha.js", "coveralls": "nyc report --reporter=text-lcov | coveralls", - "prebuildDocs": "node scripts/docs-update-toc.js", + "prebuildDocs": "rm -rf docs/_dist && node scripts/docs-update-toc.js", "buildDocs": "bundle exec jekyll build --source ./docs --destination ./docs/_site --config ./docs/_config.yml --safe --drafts", - "postbuildDocs": "buildProduction docs/_site/index.html --outroot docs/_dist --canonicalroot https://mochajs.org/ --optimizeimages --asyncscripts ", + "postbuildDocs": "buildProduction docs/_site/index.html --outroot docs/_dist --canonicalroot https://mochajs.org/ --optimizeimages --inlinehtmlimage 10000 --asyncscripts ", "prewatchDocs": "node scripts/docs-update-toc.js", "watchDocs": "bundle exec jekyll serve --source ./docs --destination ./docs/_site --config ./docs/_config.yml --safe --drafts --watch" }, @@ -348,6 +348,7 @@ "markdown-toc": "^1.2.0", "nyc": "^11.2.1", "rimraf": "^2.5.2", + "svgo": "^0.7.2", "through2": "^2.0.1", "watchify": "^3.7.0" }, From 829b7d1d402e933fd7092ea29e74298ba83e0d68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 18 Dec 2017 00:47:20 +0100 Subject: [PATCH 400/846] Downsize content images to maximum content width --- docs/index.md | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/index.md b/docs/index.md index 98f5671590..d145020e09 100644 --- a/docs/index.md +++ b/docs/index.md @@ -635,7 +635,7 @@ $ mocha 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) +![test duration](images/reporter-spec-duration.png?withoutEnlargement&resize=920,9999) To tweak what's considered "slow", you can use the `slow()` method: @@ -702,7 +702,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: -![string diffs](images/reporter-string-diffs.png) +![string diffs](images/reporter-string-diffs.png?withoutEnlargement&resize=920,9999) ## Usage @@ -1013,69 +1013,69 @@ Mocha reporters adjust to the terminal window, and always disable ANSI-escape co 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) -![spec reporter with failure](images/reporter-spec-fail.png) +![spec reporter](images/reporter-spec.png?withoutEnlargement&resize=920,9999) +![spec reporter with failure](images/reporter-spec-fail.png?withoutEnlargement&resize=920,9999) ### 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. -![dot matrix reporter](images/reporter-dot.png) +![dot matrix reporter](images/reporter-dot.png?withoutEnlargement&resize=920,9999) ### Nyan 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?withoutEnlargement&resize=920,9999) ### TAP 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?withoutEnlargement&resize=920,9999) ### Landing Strip 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) +![landing strip plane reporter](images/reporter-landing.png?withoutEnlargement&resize=920,9999) +![landing strip with failure](images/reporter-landing-fail.png?withoutEnlargement&resize=920,9999) ### 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) +![list reporter](images/reporter-list.png?withoutEnlargement&resize=920,9999) ### Progress The "progress" reporter implements a simple progress-bar: -![progress bar](images/reporter-progress.png) +![progress bar](images/reporter-progress.png?withoutEnlargement&resize=920,9999) ### 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 reporter](images/reporter-json.png?withoutEnlargement&resize=920,9999) ### 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) +![json stream reporter](images/reporter-json-stream.png?withoutEnlargement&resize=920,9999) ### 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) +![min reporter](images/reporter-min.png?withoutEnlargement&resize=920,9999) ### 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) +![doc reporter](images/reporter-doc.png?withoutEnlargement&resize=920,9999) For example, suppose you have the following JavaScript: @@ -1127,7 +1127,7 @@ The "markdown" reporter generates a markdown TOC and body for your test suite. T 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?withoutEnlargement&resize=920,9999) ### Undocumented Reporters @@ -1244,7 +1244,7 @@ $ make tm [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?withoutEnlargement&resize=920,9999) The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Plugins**, assuming your license allows it. @@ -1252,12 +1252,12 @@ The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Pl [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) +![Wallaby.js in Action](images/wallaby.png?withoutEnlargement&resize=920,9999) ### Emacs [Emacs](https://www.gnu.org/software/emacs/) support for running Mocha tests is available via a 3rd party package [mocha.el](https://github.com/scottaj/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) +![Emacs Mocha Runner in Action](images/emacs.png?withoutEnlargement&resize=920,9999) ### Mocha Sidebar (VS Code) @@ -1270,7 +1270,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) +![mocha side bar in Action](images/mocha_side_bar.png?withoutEnlargement&resize=920,9999) ## Examples From 906e26d8c50e48b0b8f24395508e107f45b55fc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 18 Dec 2017 14:43:26 +0100 Subject: [PATCH 401/846] Reduce color palette of largest images --- docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index d145020e09..9acce3ef58 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1257,7 +1257,7 @@ The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Pl ### Emacs [Emacs](https://www.gnu.org/software/emacs/) support for running Mocha tests is available via a 3rd party package [mocha.el](https://github.com/scottaj/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) +![Emacs Mocha Runner in Action](images/emacs.png?withoutEnlargement&resize=920,9999&pngquant) ### Mocha Sidebar (VS Code) @@ -1270,7 +1270,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) +![mocha side bar in Action](images/mocha_side_bar.png?withoutEnlargement&resize=920,9999&pngquant) ## Examples From f38f403ce6248faffe20185e75f1e9b56bb8487c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 18 Dec 2017 14:49:12 +0100 Subject: [PATCH 402/846] More screenshot image palette reduction --- docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 9acce3ef58..cd8d27c9af 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1244,7 +1244,7 @@ $ make tm [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?withoutEnlargement&resize=920,9999) +![JetBrains Mocha Runner Plugin in Action](images/jetbrains-plugin.png?withoutEnlargement&resize=920,9999&pngquant) The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Plugins**, assuming your license allows it. @@ -1252,7 +1252,7 @@ The plugin is titled **NodeJS**, and can be installed via **Preferences** > **Pl [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?withoutEnlargement&resize=920,9999) +![Wallaby.js in Action](images/wallaby.png?withoutEnlargement&resize=920,9999&pngquant) ### Emacs [Emacs](https://www.gnu.org/software/emacs/) support for running Mocha tests is available via a 3rd party package [mocha.el](https://github.com/scottaj/mocha.el). The package is available on MELPA, and can be installed via `M-x package-install mocha`. From a631f980ea6310576b83cf3b654b4443093070cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 18 Dec 2017 15:09:09 +0100 Subject: [PATCH 403/846] Add pre-browsing hints for external services --- docs/_includes/head.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/_includes/head.html b/docs/_includes/head.html index 41dff9accd..65d4b1f0cd 100644 --- a/docs/_includes/head.html +++ b/docs/_includes/head.html @@ -2,6 +2,8 @@ {{ page.title }} + + From a6519ad55613703d05f4884564018ece6708117e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 18 Dec 2017 15:17:47 +0100 Subject: [PATCH 404/846] Force https download for avatars. Leverage http2 from opencollective --- docs/_includes/sponsors.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_includes/sponsors.md b/docs/_includes/sponsors.md index 6f5d5a17ba..130589664f 100644 --- a/docs/_includes/sponsors.md +++ b/docs/_includes/sponsors.md @@ -3,6 +3,6 @@ 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). {: class="image-list faded-images" } -{% for i in (0..15) %}[![](//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.jpg)](https://opencollective.com/mochajs/sponsor/{{ i }}/website){: target="_blank"} {% endfor %} From 361a13bb4c25b31c43facca6e45616850a482abe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 18 Dec 2017 15:18:02 +0100 Subject: [PATCH 405/846] Force https download for avatars. Leverage http2 from opencollective --- docs/_includes/backers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_includes/backers.md b/docs/_includes/backers.md index b9c9c7d9f0..728e48310a 100644 --- a/docs/_includes/backers.md +++ b/docs/_includes/backers.md @@ -3,4 +3,4 @@ Find Mocha helpful? Become a [backer](https://opencollective.com/mochajs#support) and support Mocha with a monthly donation. {: id="_backers" class="image-list" } -{% for i in (0..29) %}[![](//opencollective.com/mochajs/backer/{{ i }}/avatar.jpg)](https://opencollective.com/mochajs/backer/{{ i }}/website){: target="_blank" rel="noopener"}{% endfor %} +{% 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 %} From 7fb4b5fbdbeb88b941b793c6be8c7916c18b9e1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 18 Dec 2017 15:26:54 +0100 Subject: [PATCH 406/846] Only preconnect to analytics --- docs/_includes/head.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_includes/head.html b/docs/_includes/head.html index 65d4b1f0cd..59e7895bb3 100644 --- a/docs/_includes/head.html +++ b/docs/_includes/head.html @@ -3,7 +3,7 @@ {{ page.title }} - + From a4b684dfaf5bb0c915415f32d0179aa929609c54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 18 Dec 2017 20:24:56 +0100 Subject: [PATCH 407/846] Added netlify header auto generation --- docs/_headers | 9 ++++ package.json | 2 +- scripts/netlify-headers.js | 103 +++++++++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 docs/_headers create mode 100644 scripts/netlify-headers.js diff --git a/docs/_headers b/docs/_headers new file mode 100644 index 0000000000..522acdf8ae --- /dev/null +++ b/docs/_headers @@ -0,0 +1,9 @@ +/* + X-Frame-Options: DENY + X-XSS-Protection: 1; mode=block + X-Content-Type-Options: nosniff + Strict-Transport-Security: max-age=31536000, includeSubDomains + +## Far future expires for hashed file names +/static/* + Cache-Control: max-age=31536000 diff --git a/package.json b/package.json index c563045586..84dfc7e218 100644 --- a/package.json +++ b/package.json @@ -305,7 +305,7 @@ "coveralls": "nyc report --reporter=text-lcov | coveralls", "prebuildDocs": "rm -rf docs/_dist && node scripts/docs-update-toc.js", "buildDocs": "bundle exec jekyll build --source ./docs --destination ./docs/_site --config ./docs/_config.yml --safe --drafts", - "postbuildDocs": "buildProduction docs/_site/index.html --outroot docs/_dist --canonicalroot https://mochajs.org/ --optimizeimages --inlinehtmlimage 10000 --asyncscripts ", + "postbuildDocs": "cp docs/_headers docs/_site/_headers && buildProduction docs/_site/index.html docs/_site/_headers --outroot docs/_dist --canonicalroot https://mochajs.org/ --optimizeimages --inlinehtmlimage 10000 --asyncscripts && cp docs/_headers docs/_dist/_headers && node scripts/netlify-headers.js >> docs/_dist/_headers", "prewatchDocs": "node scripts/docs-update-toc.js", "watchDocs": "bundle exec jekyll serve --source ./docs --destination ./docs/_site --config ./docs/_config.yml --safe --drafts --watch" }, diff --git a/scripts/netlify-headers.js b/scripts/netlify-headers.js new file mode 100644 index 0000000000..cc38fd3353 --- /dev/null +++ b/scripts/netlify-headers.js @@ -0,0 +1,103 @@ +var AssetGraph = require('assetgraph'); + +var headers = [ + 'Content-Security-Policy' +]; + +var resourceHintTypeMap = { + HtmlPreloadLink: 'preload', + HtmlPrefetchLink: 'prefetch', + HtmlPreconnectLink: 'preconnect', + HtmlDnsPrefetchLink: 'dns-prefetch' +}; + +function getHeaderForRelation (rel) { + let header = `Link: <${rel.href}>; rel=${resourceHintTypeMap[rel.type]}; as=${rel.as}; type=${rel.to.contentType}`; + + if (rel.crossorigin || rel.as === 'font') { + header = `${header}; crossorigin=anonymous`; + } + + return header; +} + +new AssetGraph({ root: 'docs/_dist' }) + .loadAssets('*.html') + .populate({ + followRelations: { type: 'HtmlAnchor', crossorigin: false } + }) + .queue(function (assetGraph) { + var assets = assetGraph.findAssets({ type: 'Html', isInline: false }); + + var headerMap = {}; + + assets.forEach(function (asset) { + var url = '/' + asset.url.replace(assetGraph.root, '').replace(/#.*/, '').replace('index.html', ''); + if (!headerMap[url]) { + headerMap[url] = []; + } + + headers.forEach(function (header) { + var node = asset.parseTree.querySelector('meta[http-equiv=' + header + ']'); + + if (node) { + headerMap[url].push(`${header}: ${node.getAttribute('content')}`) + + node.parentNode.removeChild(node); + asset.markDirty(); + } + }); + + var firstCssRel = asset.outgoingRelations.filter(r => { + return r.type === 'HtmlStyle' + && r.crossorigin === false + && r.href !== undefined; + })[0]; + + if (firstCssRel) { + const header = `Link: <${firstCssRel.href}>; rel=preload; as=style`; + + + headerMap[url].push(header); + } + + var resourceHintRelations = asset.outgoingRelations.filter(r => ['HtmlPreloadLink', 'HtmlPrefetchLink'].includes(r.type)); + + resourceHintRelations.forEach(rel => { + headerMap[url].push(getHeaderForRelation(rel)); + + rel.detach(); + }); + + var resourceHintRelations = asset.outgoingRelations.filter(r => ['HtmlPreconnectLink'].includes(r.type)); + + resourceHintRelations.forEach(rel => { + let header = `Link: <${rel.href}>; rel=preconnect`; + + if (rel.crossorigin) { + header = `${header}; crossorigin=anonymous`; + } + + headerMap[url].push(header); + + rel.detach(); + }); + }); + + console.log('\n## Autogenerated headers:\n') + + Object.keys(headerMap).forEach(function (url) { + console.log(url); + + var httpHeaders = headerMap[url]; + + httpHeaders.forEach(function (header) { + console.log(` ${header}`) + }); + + console.log(''); + }); + + }) + .writeAssetsToDisc({ isLoaded: true }) + .run(); From 4b188511a1101afe01c44bf4c1337585d075d5d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20M=C3=BCller?= Date: Mon, 18 Dec 2017 20:51:51 +0100 Subject: [PATCH 408/846] Externalise js bundles --- docs/_includes/footer.html | 17 +- docs/js/anchor.js | 338 +++++++++++++++++++++++++++++++++++++ docs/js/avatars.js | 8 +- package.json | 2 +- 4 files changed, 354 insertions(+), 11 deletions(-) create mode 100644 docs/js/anchor.js diff --git a/docs/_includes/footer.html b/docs/_includes/footer.html index 48cd488232..09fc3c41ca 100644 --- a/docs/_includes/footer.html +++ b/docs/_includes/footer.html @@ -4,12 +4,13 @@ href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License.

      Last updated: {{ site.time | date: "%c" }} - - -

      {{ content }}
      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 755/846] 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 756/846] 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 757/846] 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 758/846] 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 759/846] 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 760/846] 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 761/846] 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 762/846] 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 763/846] 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 764/846] 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 765/846] 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 766/846] 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 767/846] 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 768/846] 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 769/846] 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 770/846] 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 771/846] 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 772/846] 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 773/846] 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 774/846] 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 775/846] 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 776/846] 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 777/846] 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 778/846] 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 779/846] 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 780/846] 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 781/846] 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 782/846] 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 783/846] 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 784/846] 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 785/846] 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 786/846] 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 787/846] 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 788/846] 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 789/846] 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 790/846] 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 791/846] 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 792/846] 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 793/846] 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 794/846] 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 795/846] 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 796/846] 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 797/846] 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 798/846] 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 799/846] 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 800/846] 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 801/846] 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 802/846] 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 803/846] 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 804/846] 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 805/846] 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 806/846] 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 807/846] 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 808/846] 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 809/846] 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 810/846] 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 811/846] 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 812/846] 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 813/846] 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 814/846] 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 815/846] 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 816/846] 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 817/846] 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 818/846] 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 819/846] 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 820/846] 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 821/846] 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 822/846] 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 823/846] 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 824/846] 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 825/846] 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 826/846] 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 827/846] 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 828/846] 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 829/846] 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 830/846] 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 }}
      + +

      -

      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