From d1838c75bc2abbe1c52606e888398bcf06887abf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M=2E=20P=C3=A9rez?= Date: Sat, 28 Apr 2018 22:26:39 +0200 Subject: [PATCH] Move from blanket+mocha to jest (#206) - Use jest as the test runner - Remove should - Remove grunt --- .gitignore | 4 +- .npmignore | 9 +- .travis.yml | 3 +- Gruntfile.js | 28 - README.md | 4 +- __mocks__/superagent.js | 81 + __tests__/authentication-request.js | 29 + __tests__/base-request.js | 182 + __tests__/http-manager.js | 118 + {test => __tests__}/spotify-web-api.js | 1508 ++++---- __tests__/webapi-error.js | 9 + __tests__/webapi-request.js | 29 + package-lock.json | 4853 +++++++++++++++++------- package.json | 26 +- src/base-request.js | 3 + src/http-manager.js | 2 +- test/authentication-request.js | 30 - test/base-request.js | 172 - test/http-manager.js | 162 - test/webapi-error.js | 10 - test/webapi-request.js | 30 - 21 files changed, 4599 insertions(+), 2693 deletions(-) delete mode 100644 Gruntfile.js create mode 100644 __mocks__/superagent.js create mode 100644 __tests__/authentication-request.js create mode 100644 __tests__/base-request.js create mode 100644 __tests__/http-manager.js rename {test => __tests__}/spotify-web-api.js (64%) create mode 100644 __tests__/webapi-error.js create mode 100644 __tests__/webapi-request.js delete mode 100644 test/authentication-request.js delete mode 100644 test/base-request.js delete mode 100644 test/http-manager.js delete mode 100644 test/webapi-error.js delete mode 100644 test/webapi-request.js diff --git a/.gitignore b/.gitignore index a159b328..ba2a97b5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -/node_modules -coverage.html \ No newline at end of file +node_modules +coverage diff --git a/.npmignore b/.npmignore index a5673e33..ec27eeb9 100644 --- a/.npmignore +++ b/.npmignore @@ -1,5 +1,6 @@ -/node_modules +__mocks__ +__tests__ +node_modules +.coveralls.yml +.npmignore *.log -/test -Gruntfile.js -.npmignore \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index aa802acc..cb5dc6aa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,5 @@ node_js: - 'node' - '7' - '6' - - '5.11' after_success: - - npm run coveralls + - npm run travis diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 7c25a3c2..00000000 --- a/Gruntfile.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict'; - -module.exports = function(grunt) { - grunt.initConfig({ - watch: { - all: { - files: ['src/*.js', 'test/*.js'], - tasks: ['default'] - } - }, - simplemocha: { - options: { - globals: ['should'], - ignoreLeaks: false, - ui: 'bdd', - reporter: 'spec' - }, - all: { - src: ['test/*.js'] - } - } - }); - grunt.loadNpmTasks('grunt-simple-mocha'); - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-contrib-watch'); - grunt.registerTask('dev', ['simplemocha', 'watch']); - grunt.registerTask('default', ['simplemocha']); -}; diff --git a/README.md b/README.md index 4d4b4f32..0bd884d9 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ It includes helper functions to do the following: * Check if users are following a Playlist #### Player + * Get a user's available devices * Get information about the user's current playback * Transfer a user's playback @@ -77,7 +78,6 @@ It includes helper functions to do the following: * Set volume * Seek playback to a given position - All methods require authentication, which can be done using these flows: * [Client credentials flow](http://tools.ietf.org/html/rfc6749#section-4.4) (Application-only authentication) @@ -969,4 +969,4 @@ See something you think can be improved? [Open an issue](https://github.com/thel ### Running tests -You can run the unit tests executing `mocha` and get a test coverage report running `mocha -r blanket -R html-cov > coverage.html`. +You can run the unit tests executing `npm test` and get a test coverage report running `npm test -- --coverage`. diff --git a/__mocks__/superagent.js b/__mocks__/superagent.js new file mode 100644 index 00000000..09fa0379 --- /dev/null +++ b/__mocks__/superagent.js @@ -0,0 +1,81 @@ +'use strict'; + +//mock for superagent - __mocks__/superagent.js + +var mockDelay; +var mockError; +var mockResponse = { + status() { + return 200; + }, + ok() { + return true; + }, + get: jest.genMockFunction(), + toError: jest.genMockFunction() +}; + +var Request = { + put() { + return this; + }, + del() { + return this; + }, + post() { + return this; + }, + get() { + return this; + }, + send() { + return this; + }, + query() { + return this; + }, + field() { + return this; + }, + set() { + return this; + }, + accept() { + return this; + }, + timeout() { + return this; + }, + end: jest.genMockFunction().mockImplementation(function(callback) { + if (mockDelay) { + this.delayTimer = setTimeout(callback, 0, mockError, mockResponse); + return; + } + + callback(mockError, mockResponse); + }), + //expose helper methods for tests to set + __setMockDelay(boolValue) { + mockDelay = boolValue; + }, + __setMockResponse(mockRes) { + mockResponse = mockRes; + }, + __setMockError(mockErr) { + mockError = mockErr; + }, + __reset() { + this.__setMockResponse({ + status() { + return 200; + }, + ok() { + return true; + } + }); + this.__setMockError(null); + this.__setMockDelay(false); + } +}; + +module.exports = Request; diff --git a/__tests__/authentication-request.js b/__tests__/authentication-request.js new file mode 100644 index 00000000..6ef3ec38 --- /dev/null +++ b/__tests__/authentication-request.js @@ -0,0 +1,29 @@ +var AuthenticationRequest = require('../src/authentication-request'); + +describe('Create Authentication Requests', () => { + test('Should use default settings if none are supplied', () => { + var request = AuthenticationRequest.builder().build(); + + expect(request.getHost()).toBe('accounts.spotify.com'); + expect(request.getPort()).toBe(443); + expect(request.getScheme()).toBe('https'); + expect(request.getHeaders()).toBeFalsy(); + expect(request.getPath()).toBeFalsy(); + expect(request.getQueryParameters()).toBeFalsy(); + expect(request.getBodyParameters()).toBeFalsy(); + }); + + test('Can overwrite one of the default parameters', () => { + var request = AuthenticationRequest.builder() + .withHost('such.host.wow') + .build(); + + expect(request.getHost()).toBe('such.host.wow'); + expect(request.getPort()).toBe(443); + expect(request.getScheme()).toBe('https'); + expect(request.getHeaders()).toBeFalsy(); + expect(request.getPath()).toBeFalsy(); + expect(request.getQueryParameters()).toBeFalsy(); + expect(request.getBodyParameters()).toBeFalsy(); + }); +}); diff --git a/__tests__/base-request.js b/__tests__/base-request.js new file mode 100644 index 00000000..ff9f0402 --- /dev/null +++ b/__tests__/base-request.js @@ -0,0 +1,182 @@ +var Request = require('../src/base-request'); + +describe('Create Requests', () => { + test('Should create host, port, and scheme', () => { + var request = Request.builder() + .withHost('such.api.wow') + .withPort(1337) + .withScheme('http') + .build(); + + expect(request.getHost()).toBe('such.api.wow'); + expect(request.getPort()).toBe(1337); + expect(request.getScheme()).toBe('http'); + }); + + test('Should add query parameters', () => { + var request = Request.builder() + .withHost('such.api.wow') + .withPort(1337) + .withScheme('http') + .withQueryParameters({ + oneParameter: 1, + anotherParameter: true, + thirdParameter: 'hello' + }) + .build(); + + expect(request.getQueryParameters().oneParameter).toBe(1); + expect(request.getQueryParameters().anotherParameter).toBe(true); + expect(request.getQueryParameters().thirdParameter).toBe('hello'); + }); + + test('Should add query parameters (multiple calls)', () => { + var request = Request.builder() + .withHost('such.api.wow') + .withPort(1337) + .withScheme('http') + .withQueryParameters({ + oneParameter: 1, + anotherParameter: true + }) + .withQueryParameters({ + thirdParameter: 'hello' + }) + .build(); + + expect(request.getQueryParameters().oneParameter).toBe(1); + expect(request.getQueryParameters().anotherParameter).toBe(true); + expect(request.getQueryParameters().thirdParameter).toBe('hello'); + }); + + test('Should add query parameters (combine calls)', () => { + var request = Request.builder() + .withHost('such.api.wow') + .withPort(1337) + .withScheme('http') + .withQueryParameters( + { + oneParameter: 1, + anotherParameter: true + }, + { + thirdParameter: 'hello' + } + ) + .build(); + + expect(request.getQueryParameters().oneParameter).toBe(1); + expect(request.getQueryParameters().anotherParameter).toBe(true); + expect(request.getQueryParameters().thirdParameter).toBe('hello'); + }); + + test('Should add body parameters', () => { + var request = Request.builder() + .withHost('such.api.wow') + .withPort(1337) + .withScheme('http') + .withBodyParameters({ + one: 1, + two: true, + three: 'world' + }) + .build(); + + expect(request.getBodyParameters().one).toBe(1); + expect(request.getBodyParameters().two).toBe(true); + expect(request.getBodyParameters().three).toBe('world'); + }); + + test('Should add array to body parameters', () => { + var request = Request.builder() + .withHost('such.api.wow') + .withPort(1337) + .withScheme('http') + .withBodyParameters(['3VNWq8rTnQG6fM1eldSpZ0']) + .build(); + + expect(request.getBodyParameters()).toEqual(['3VNWq8rTnQG6fM1eldSpZ0']); + }); + + test('Should add header parameters', () => { + var request = Request.builder() + .withHost('such.api.wow') + .withPort(1337) + .withScheme('http') + .withHeaders({ + Authorization: 'Basic WOOP', + 'Content-Type': 'application/lol' + }) + .build(); + + expect(request.getHeaders().Authorization).toBe('Basic WOOP'); + expect(request.getHeaders()['Content-Type']).toBe('application/lol'); + }); + + test('Should add path', () => { + var request = Request.builder() + .withHost('such.api.wow') + .withPort(1337) + .withPath('/v1/users/meriosweg') + .build(); + + expect(request.getPath()).toBe('/v1/users/meriosweg'); + }); + + test('Should build URI', () => { + var request = Request.builder() + .withHost('such.api.wow') + .withScheme('https') + .withPort(1337) + .withPath('/v1/users/meriosweg') + .build(); + + expect(request.getURI()).toBe( + 'https://such.api.wow:1337/v1/users/meriosweg' + ); + }); + + test('Should construct empty query paramaters string', () => { + var request = Request.builder() + .withQueryParameters({}) + .build(); + + expect(request.getQueryParameterString()).toBeFalsy(); + }); + + test('Should construct query paramaters string for one parameter', () => { + var request = Request.builder() + .withQueryParameters({ + one: 1 + }) + .build(); + + expect(request.getQueryParameterString()).toBe('?one=1'); + }); + + test('Should construct query paramaters string for multiple parameters', () => { + var request = Request.builder() + .withQueryParameters({ + one: 1, + two: true, + three: 'world' + }) + .build(); + + expect(request.getQueryParameterString()).toBe( + '?one=1&two=true&three=world' + ); + }); + + test('Should construct query paramaters string and exclude undefined values', () => { + var request = Request.builder() + .withQueryParameters({ + one: 1, + two: undefined, + three: 'world' + }) + .build(); + + expect(request.getQueryParameterString()).toBe('?one=1&three=world'); + }); +}); diff --git a/__tests__/http-manager.js b/__tests__/http-manager.js new file mode 100644 index 00000000..179d9cd8 --- /dev/null +++ b/__tests__/http-manager.js @@ -0,0 +1,118 @@ +var Request = require('../src/base-request'); +var superagent = require('superagent'); + +describe('Make requests', () => { + afterEach(() => { + superagent.__reset(); + jest.restoreAllMocks(); + }); + + describe('GET requests', () => { + test('Should make a successful GET request', done => { + superagent.__setMockResponse({ + status: 200, + data: 'some data' + }); + + var HttpManager = require('../src/http-manager'); + var request = Request.builder() + .withHost('such.api.wow') + .withPort(1337) + .withScheme('http') + .build(); + + HttpManager.get(request, function(errorObject) { + done(errorObject); + }); + }); + + test('Should process an error GET request', done => { + superagent.__setMockError(new Error('GET request error')); + + var HttpManager = require('../src/http-manager'); + var request = Request.builder() + .withHost('such.api.wow') + .withPort(1337) + .withScheme('http') + .build(); + + HttpManager.get(request, function(errorObject) { + expect(errorObject).toBeInstanceOf(Error); + expect(errorObject.message).toBe('GET request error'); + done(); + }); + }); + + test('Should process an error GET request with an error message', done => { + superagent.__setMockError( + new Error('There is a problem in your request') + ); + + var HttpManager = require('../src/http-manager'); + var request = Request.builder() + .withHost('such.api.wow') + .withPort(1337) + .withScheme('http') + .build(); + + HttpManager.get(request, function(errorObject) { + expect(errorObject).toBeInstanceOf(Error); + expect(errorObject.message).toBe('There is a problem in your request'); + done(); + }); + }); + }); + + test('Should make a successful POST request', done => { + superagent.__setMockResponse({ + status: 200, + data: 'some data' + }); + var HttpManager = require('../src/http-manager'); + var request = Request.builder() + .withHost('such.api.wow') + .withPort(1337) + .withScheme('http') + .build(); + + HttpManager.post(request, function(errorObject) { + done(errorObject); + }); + }); + + test('Should make a successful PUT request', done => { + superagent.__setMockResponse({ + status: 200, + data: 'some data' + }); + + var HttpManager = require('../src/http-manager'); + var request = Request.builder() + .withHost('such.api.wow') + .withPort(1337) + .withScheme('http') + .build(); + + HttpManager.put(request, function(errorObject) { + done(errorObject); + }); + }); + + test('Should make a successful DELETE request', done => { + superagent.__setMockResponse({ + status: 200, + data: 'some data' + }); + + var HttpManager = require('../src/http-manager'); + var request = Request.builder() + .withHost('such.api.wow') + .withPort(1337) + .withScheme('http') + .build(); + + HttpManager.del(request, function(errorObject) { + done(errorObject); + }); + }); +}); diff --git a/test/spotify-web-api.js b/__tests__/spotify-web-api.js similarity index 64% rename from test/spotify-web-api.js rename to __tests__/spotify-web-api.js index 5edffb1d..779177d9 100644 --- a/test/spotify-web-api.js +++ b/__tests__/spotify-web-api.js @@ -2,26 +2,23 @@ var superagent = require('superagent'), HttpManager = require('../src/http-manager'), sinon = require('sinon'), SpotifyWebApi = require('../src/server'), - WebApiError = require('../src/webapi-error'), - should = require('should'); + WebApiError = require('../src/webapi-error'); ('use strict'); -describe('Spotify Web API', function() { - beforeEach(function(done) { +describe('Spotify Web API', () => { + beforeEach(done => { done(); }); - afterEach(function(done) { + afterEach(done => { if (typeof HttpManager._makeRequest.restore == 'function') { HttpManager._makeRequest.restore(); } done(); }); - this.timeout(5000); - - it('should set clientId, clientSecret and redirectUri', function() { + test('should set clientId, clientSecret and redirectUri', () => { var credentials = { clientId: 'someClientId', clientSecret: 'someClientSecret', @@ -32,25 +29,25 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(credentials); - api.getCredentials().clientId.should.equal(credentials.clientId); - api.getCredentials().clientSecret.should.equal(credentials.clientSecret); - api.getCredentials().redirectUri.should.equal(credentials.redirectUri); - api.getCredentials().accessToken.should.equal(credentials.accessToken); - api.getCredentials().refreshToken.should.equal(credentials.refreshToken); + expect(api.getCredentials().clientId).toBe(credentials.clientId); + expect(api.getCredentials().clientSecret).toBe(credentials.clientSecret); + expect(api.getCredentials().redirectUri).toBe(credentials.redirectUri); + expect(api.getCredentials().accessToken).toBe(credentials.accessToken); + expect(api.getCredentials().refreshToken).toBe(credentials.refreshToken); }); - it('should retrieve track metadata', function(done) { + test('should retrieve track metadata', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/tracks/3Qm86XLflmIXVm1wcwkgDK' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { uri: 'spotify:track:3Qm86XLflmIXVm1wcwkgDK' }, headers: { 'cache-control': 'public, max-age=7200' }, @@ -61,9 +58,9 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.getTrack('3Qm86XLflmIXVm1wcwkgDK').then( function(data) { - data.body.uri.should.equal('spotify:track:3Qm86XLflmIXVm1wcwkgDK'); - data.statusCode.should.equal(200); - data.headers['cache-control'].should.equal('public, max-age=7200'); + expect(data.body.uri).toBe('spotify:track:3Qm86XLflmIXVm1wcwkgDK'); + expect(data.statusCode).toBe(200); + expect(data.headers['cache-control']).toBe('public, max-age=7200'); done(); }, function(err) { @@ -72,18 +69,18 @@ describe('Spotify Web API', function() { ); }); - it('should retrieve error when retrieving track metadata', function(done) { + test('should retrieve error when retrieving track metadata', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/tracks/3Qm86XLflmIXVm1wcwkgDK' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(new WebApiError('Do NOT do that again!', 400)); }); @@ -93,26 +90,26 @@ describe('Spotify Web API', function() { done(new Error('Test failed!')); }, function(err) { - err.statusCode.should.equal(400); - err.message.should.equal('Do NOT do that again!'); + expect(err.statusCode).toBe(400); + expect(err.message).toBe('Do NOT do that again!'); done(); } ); }); - it('should get track for Swedish market', function(done) { + test('should get track for Swedish market', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/tracks/3Qm86XLflmIXVm1wcwkgDK' ); - options.query.market.should.equal('SE'); - should.not.exist(options.data); + expect(options.query.market).toBe('SE'); + expect(options.data).toBeFalsy(); callback(); }); @@ -127,36 +124,36 @@ describe('Spotify Web API', function() { ); }); - it('should retrieve track metadata using callback', function(done) { + test('should retrieve track metadata using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/tracks/3Qm86XLflmIXVm1wcwkgDK' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(); }); var api = new SpotifyWebApi(); api.getTrack('3Qm86XLflmIXVm1wcwkgDK', function(err, data) { - should.not.exist(err); + expect(err).toBeFalsy(); done(err); }); }); - it('should fail for non existing track id', function(done) { + test('should fail for non existing track id', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); + expect(method).toBe(superagent.get); callback(new WebApiError('non existing id', 400)); }); @@ -166,40 +163,40 @@ describe('Spotify Web API', function() { done(new Error('Should have failed')); }, function(err) { - 'non existing id'.should.equal(err.message); + expect(err.message).toBe('non existing id'); done(); } ); }); - it('should fail for non existing track id using callback', function(done) { + test('should fail for non existing track id using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); + expect(method).toBe(superagent.get); callback(new WebApiError('non existing id', 400), null); }); var api = new SpotifyWebApi(); api.getTrack('idontexist', function(err, data) { - should.not.exist(data); - should.exist(err); - 'non existing id'.should.equal(err.message); + expect(data).toBeFalsy(); + expect(err).toBeTruthy(); + expect(err.message).toBe('non existing id'); done(); }); }); - it('should fail for empty track id', function(done) { + test('should fail for empty track id', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); + expect(method).toBe(superagent.get); callback(new WebApiError('Fail', 400), null); }); @@ -209,25 +206,25 @@ describe('Spotify Web API', function() { done(new Error('Should have failed')); }, function(err) { - should.exist(err); + expect(err).toBeTruthy(); done(); } ); }); - it('should retrieve metadata for several tracks', function(done) { + test('should retrieve metadata for several tracks', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/tracks'); - options.query.ids.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/tracks'); + expect(options.query.ids).toBe( '0eGsygTp906u18L0Oimnem,1lDWb6b6ieDQ2xT7ewTC3G' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(); }); @@ -242,19 +239,19 @@ describe('Spotify Web API', function() { ); }); - it('should retrieve metadata for several tracks using callback', function(done) { + test('should retrieve metadata for several tracks using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/tracks'); - options.query.ids.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/tracks'); + expect(options.query.ids).toBe( '0eGsygTp906u18L0Oimnem,1lDWb6b6ieDQ2xT7ewTC3G' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(); }); @@ -262,24 +259,24 @@ describe('Spotify Web API', function() { api.getTracks( ['0eGsygTp906u18L0Oimnem', '1lDWb6b6ieDQ2xT7ewTC3G'], function(err, data) { - should.not.exist(err); + expect(err).toBeFalsy(); done(); } ); }); - it('should retrieve metadata for an album', function(done) { + test('should retrieve metadata for an album', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/albums/0sNOF9WDwhWunNAHPD3Baj' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { uri: 'spotify:album:0sNOF9WDwhWunNAHPD3Baj' }, statusCode: 200 @@ -289,8 +286,8 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.getAlbum('0sNOF9WDwhWunNAHPD3Baj').then( function(data) { - 'spotify:album:0sNOF9WDwhWunNAHPD3Baj'.should.equal(data.body.uri); - (200).should.equal(data.statusCode); + expect('spotify:album:0sNOF9WDwhWunNAHPD3Baj').toBe(data.body.uri); + expect(data.statusCode).toBe(200); done(); }, function(err) { @@ -299,19 +296,19 @@ describe('Spotify Web API', function() { ); }); - it('should retrieve metadata for an album for a market ', function(done) { + test('should retrieve metadata for an album for a market ', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/albums/0sNOF9WDwhWunNAHPD3Baj' ); - should.not.exist(options.data); - options.query.market.should.equal('SE'); + expect(options.data).toBeFalsy(); + expect(options.query.market).toBe('SE'); callback(null, { body: { uri: 'spotify:album:0sNOF9WDwhWunNAHPD3Baj' }, statusCode: 200 @@ -321,8 +318,8 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.getAlbum('0sNOF9WDwhWunNAHPD3Baj', { market: 'SE' }).then( function(data) { - 'spotify:album:0sNOF9WDwhWunNAHPD3Baj'.should.equal(data.body.uri); - (200).should.equal(data.statusCode); + expect('spotify:album:0sNOF9WDwhWunNAHPD3Baj').toBe(data.body.uri); + expect(data.statusCode).toBe(200); done(); }, function(err) { @@ -331,18 +328,18 @@ describe('Spotify Web API', function() { ); }); - it('should retrieve metadata for an album using callback', function(done) { + test('should retrieve metadata for an album using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/albums/0sNOF9WDwhWunNAHPD3Baj' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { uri: 'spotify:album:0sNOF9WDwhWunNAHPD3Baj' }, statusCode: 200 @@ -351,26 +348,26 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.getAlbum('0sNOF9WDwhWunNAHPD3Baj', function(err, data) { - should.not.exist(err); - 'spotify:album:0sNOF9WDwhWunNAHPD3Baj'.should.equal(data.body.uri); - (200).should.equal(data.statusCode); + expect(err).toBeFalsy(); + expect('spotify:album:0sNOF9WDwhWunNAHPD3Baj').toBe(data.body.uri); + expect(data.statusCode).toBe(200); done(); }); }); - it('should retrieve metadata for several albums', function(done) { + test('should retrieve metadata for several albums', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/albums'); - options.query.ids.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/albums'); + expect(options.query.ids).toBe( '41MnTivkwTO3UUJ8DrqEJJ,6JWc4iAiJ9FjyK0B59ABb4' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { albums: [ @@ -385,13 +382,13 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.getAlbums(['41MnTivkwTO3UUJ8DrqEJJ', '6JWc4iAiJ9FjyK0B59ABb4']).then( function(data) { - 'spotify:album:41MnTivkwTO3UUJ8DrqEJJ'.should.equal( - data.body.albums[0].uri + expect(data.body.albums[0].uri).toBe( + 'spotify:album:41MnTivkwTO3UUJ8DrqEJJ' ); - 'spotify:album:6JWc4iAiJ9FjyK0B59ABb4'.should.equal( - data.body.albums[1].uri + expect(data.body.albums[1].uri).toBe( + 'spotify:album:6JWc4iAiJ9FjyK0B59ABb4' ); - (200).should.equal(data.statusCode); + expect(data.statusCode).toBe(200); done(); }, function(err) { @@ -400,19 +397,19 @@ describe('Spotify Web API', function() { ); }); - it('should retrieve metadata for several albums using callback', function(done) { + test('should retrieve metadata for several albums using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/albums'); - options.query.ids.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/albums'); + expect(options.query.ids).toBe( '41MnTivkwTO3UUJ8DrqEJJ,6JWc4iAiJ9FjyK0B59ABb4' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { albums: [ @@ -428,31 +425,31 @@ describe('Spotify Web API', function() { api.getAlbums( ['41MnTivkwTO3UUJ8DrqEJJ', '6JWc4iAiJ9FjyK0B59ABb4'], function(err, data) { - should.not.exist(err); - 'spotify:album:41MnTivkwTO3UUJ8DrqEJJ'.should.equal( - data.body.albums[0].uri + expect(err).toBeNull(); + expect(data.body.albums[0].uri).toBe( + 'spotify:album:41MnTivkwTO3UUJ8DrqEJJ' ); - 'spotify:album:6JWc4iAiJ9FjyK0B59ABb4'.should.equal( - data.body.albums[1].uri + expect(data.body.albums[1].uri).toBe( + 'spotify:album:6JWc4iAiJ9FjyK0B59ABb4' ); - (200).should.equal(data.statusCode); + expect(data.statusCode).toBe(200); done(); } ); }); - it('should retrive metadata for an artist', function(done) { + test('should retrive metadata for an artist', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/artists/0LcJLqbBmaGUft1e9Mm8HV' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { uri: 'spotify:artist:0LcJLqbBmaGUft1e9Mm8HV' } }); @@ -461,7 +458,7 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.getArtist('0LcJLqbBmaGUft1e9Mm8HV').then( function(data) { - 'spotify:artist:0LcJLqbBmaGUft1e9Mm8HV'.should.equal(data.body.uri); + expect('spotify:artist:0LcJLqbBmaGUft1e9Mm8HV').toBe(data.body.uri); done(); }, function(err) { @@ -470,18 +467,18 @@ describe('Spotify Web API', function() { ); }); - it('should retrieve metadata for an artist using callback', function(done) { + test('should retrieve metadata for an artist using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/artists/0LcJLqbBmaGUft1e9Mm8HV' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { uri: 'spotify:artist:0LcJLqbBmaGUft1e9Mm8HV' } }); @@ -489,25 +486,25 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.getArtist('0LcJLqbBmaGUft1e9Mm8HV', function(err, data) { - should.not.exist(err); - 'spotify:artist:0LcJLqbBmaGUft1e9Mm8HV'.should.equal(data.body.uri); + expect(err).toBeFalsy(); + expect('spotify:artist:0LcJLqbBmaGUft1e9Mm8HV').toBe(data.body.uri); done(); }); }); - it('should retrieve metadata for several artists', function(done) { + test('should retrieve metadata for several artists', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/artists'); - options.query.ids.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/artists'); + expect(options.query.ids).toBe( '0oSGxfWSnnOXhD2fKuz2Gy,3dBVyJ7JuOMt4GE9607Qin' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { artists: [ @@ -522,13 +519,13 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.getArtists(['0oSGxfWSnnOXhD2fKuz2Gy', '3dBVyJ7JuOMt4GE9607Qin']).then( function(data) { - 'spotify:artist:0oSGxfWSnnOXhD2fKuz2Gy'.should.equal( - data.body.artists[0].uri + expect(data.body.artists[0].uri).toBe( + 'spotify:artist:0oSGxfWSnnOXhD2fKuz2Gy' ); - 'spotify:artist:3dBVyJ7JuOMt4GE9607Qin'.should.equal( - data.body.artists[1].uri + expect(data.body.artists[1].uri).toBe( + 'spotify:artist:3dBVyJ7JuOMt4GE9607Qin' ); - (200).should.equal(data.statusCode); + expect(data.statusCode).toBe(200); done(); }, function(err) { @@ -537,19 +534,19 @@ describe('Spotify Web API', function() { ); }); - it('should retrieve metadata for several artists using callback', function(done) { + test('should retrieve metadata for several artists using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/artists'); - options.query.ids.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/artists'); + expect(options.query.ids).toBe( '0oSGxfWSnnOXhD2fKuz2Gy,3dBVyJ7JuOMt4GE9607Qin' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { artists: [ @@ -565,35 +562,35 @@ describe('Spotify Web API', function() { api.getArtists( ['0oSGxfWSnnOXhD2fKuz2Gy', '3dBVyJ7JuOMt4GE9607Qin'], function(err, data) { - should.not.exist(err); - 'spotify:artist:0oSGxfWSnnOXhD2fKuz2Gy'.should.equal( - data.body.artists[0].uri + expect(err).toBeFalsy(); + expect(data.body.artists[0].uri).toBe( + 'spotify:artist:0oSGxfWSnnOXhD2fKuz2Gy' ); - 'spotify:artist:3dBVyJ7JuOMt4GE9607Qin'.should.equal( - data.body.artists[1].uri + expect(data.body.artists[1].uri).toBe( + 'spotify:artist:3dBVyJ7JuOMt4GE9607Qin' ); - (200).should.equal(data.statusCode); + expect(data.statusCode).toBe(200); done(); } ); }); - it('should search for an album using limit and offset', function(done) { + test('should search for an album using limit and offset', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/search/'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/search/'); + expect(options.query).toEqual({ limit: 3, offset: 2, q: 'The Best of Keane', type: 'album' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { albums: { @@ -611,11 +608,11 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.searchAlbums('The Best of Keane', { limit: 3, offset: 2 }).then( function(data) { - 'https://api.spotify.com/v1/search?query=The+Best+of+Keane&offset=2&limit=3&type=album'.should.equal( - data.body.albums.href + expect(data.body.albums.href).toBe( + 'https://api.spotify.com/v1/search?query=The+Best+of+Keane&offset=2&limit=3&type=album' ); - (200).should.equal(data.statusCode); - 'value'.should.equal(data.headers.test); + expect(data.statusCode).toBe(200); + expect('value').toBe(data.headers.test); done(); }, function(err) { @@ -625,22 +622,22 @@ describe('Spotify Web API', function() { ); }); - it('should search for an album using limit and offset using callback', function(done) { + test('should search for an album using limit and offset using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/search/'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/search/'); + expect(options.query).toEqual({ limit: 3, offset: 2, q: 'The Best of Keane', type: 'album' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { albums: { @@ -656,30 +653,30 @@ describe('Spotify Web API', function() { err, data ) { - should.not.exist(err); - 'https://api.spotify.com/v1/search?query=The+Best+of+Keane&offset=2&limit=3&type=album'.should.equal( - data.body.albums.href + expect(err).toBeFalsy(); + expect(data.body.albums.href).toBe( + 'https://api.spotify.com/v1/search?query=The+Best+of+Keane&offset=2&limit=3&type=album' ); done(); }); }); - it('should search for playlists', function(done) { + test('should search for playlists', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/search/'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/search/'); + expect(options.query).toEqual({ limit: 1, offset: 0, q: 'workout', type: 'playlist' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { playlists: { @@ -693,8 +690,8 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.searchPlaylists('workout', { limit: 1, offset: 0 }).then( function(data) { - 'https://api.spotify.com/v1/search?query=workout&offset=0&limit=1&type=playlist'.should.equal( - data.body.playlists.href + expect(data.body.playlists.href).toBe( + 'https://api.spotify.com/v1/search?query=workout&offset=0&limit=1&type=playlist' ); done(); }, @@ -705,22 +702,22 @@ describe('Spotify Web API', function() { ); }); - it('should search for an artist using limit and offset', function(done) { + test('should search for an artist using limit and offset', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/search/'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/search/'); + expect(options.query).toEqual({ limit: 5, offset: 1, q: 'David Bowie', type: 'artist' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { artists: { @@ -734,8 +731,8 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.searchArtists('David Bowie', { limit: 5, offset: 1 }).then( function(data) { - 'https://api.spotify.com/v1/search?query=David+Bowie&offset=1&limit=5&type=artist'.should.equal( - data.body.artists.href + expect(data.body.artists.href).toBe( + 'https://api.spotify.com/v1/search?query=David+Bowie&offset=1&limit=5&type=artist' ); done(); }, @@ -745,22 +742,22 @@ describe('Spotify Web API', function() { ); }); - it('should search for an artist using limit and offset using callback', function(done) { + test('should search for an artist using limit and offset using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/search/'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/search/'); + expect(options.query).toEqual({ limit: 5, offset: 1, q: 'David Bowie', type: 'artist' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { artists: { @@ -776,30 +773,30 @@ describe('Spotify Web API', function() { err, data ) { - should.not.exist(err); - 'https://api.spotify.com/v1/search?query=David+Bowie&offset=1&limit=5&type=artist'.should.equal( - data.body.artists.href + expect(err).toBeFalsy(); + expect(data.body.artists.href).toBe( + 'https://api.spotify.com/v1/search?query=David+Bowie&offset=1&limit=5&type=artist' ); done(); }); }); - it('should search for a track using limit and offset', function(done) { + test('should search for a track using limit and offset', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/search/'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/search/'); + expect(options.query).toEqual({ limit: 3, offset: 2, q: 'Mr. Brightside', type: 'track' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { tracks: { @@ -813,8 +810,8 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.searchTracks('Mr. Brightside', { limit: 3, offset: 2 }).then( function(data) { - 'https://api.spotify.com/v1/search?query=Mr.+Brightside&offset=2&limit=3&type=track'.should.equal( - data.body.tracks.href + expect(data.body.tracks.href).toBe( + 'https://api.spotify.com/v1/search?query=Mr.+Brightside&offset=2&limit=3&type=track' ); done(); }, @@ -825,22 +822,22 @@ describe('Spotify Web API', function() { ); }); - it('should search for a track using limit and offset using callback', function(done) { + test('should search for a track using limit and offset using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/search/'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/search/'); + expect(options.query).toEqual({ limit: 3, offset: 2, q: 'Mr. Brightside', type: 'track' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { tracks: { @@ -856,30 +853,30 @@ describe('Spotify Web API', function() { err, data ) { - should.not.exist(err); - 'https://api.spotify.com/v1/search?query=Mr.+Brightside&offset=2&limit=3&type=track'.should.equal( - data.body.tracks.href + expect(err).toBeFalsy(); + expect(data.body.tracks.href).toBe( + 'https://api.spotify.com/v1/search?query=Mr.+Brightside&offset=2&limit=3&type=track' ); done(); }); }); - it('should search for several types using callback', function(done) { + test('should search for several types using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/search/'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/search/'); + expect(options.query).toEqual({ limit: 3, offset: 2, q: 'Mr. Brightside', type: 'track,album' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { tracks: { @@ -896,33 +893,33 @@ describe('Spotify Web API', function() { ['track', 'album'], { limit: 3, offset: 2 }, function(err, data) { - should.not.exist(err); - 'https://api.spotify.com/v1/search?query=Mr.+Brightside&offset=2&limit=3&type=track,album'.should.equal( - data.body.tracks.href + expect(err).toBeFalsy(); + expect(data.body.tracks.href).toBe( + 'https://api.spotify.com/v1/search?query=Mr.+Brightside&offset=2&limit=3&type=track,album' ); done(); } ); }); - it('should get artists albums', function(done) { + test('should get artists albums', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/artists/0oSGxfWSnnOXhD2fKuz2Gy/albums' ); - options.query.should.eql({ + expect(options.query).toEqual({ album_type: 'album', country: 'GB', limit: 2, offset: 5 }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { href: @@ -941,8 +938,8 @@ describe('Spotify Web API', function() { }) .then( function(data) { - 'https://api.spotify.com/v1/artists/0oSGxfWSnnOXhD2fKuz2Gy/albums?offset=5&limit=2&album_type=album&market=GB'.should.equal( - data.body.href + expect(data.body.href).toBe( + 'https://api.spotify.com/v1/artists/0oSGxfWSnnOXhD2fKuz2Gy/albums?offset=5&limit=2&album_type=album&market=GB' ); done(); }, @@ -953,24 +950,24 @@ describe('Spotify Web API', function() { ); }); - it('should get artists albums using callback', function(done) { + test('should get artists albums using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/artists/0oSGxfWSnnOXhD2fKuz2Gy/albums' ); - options.query.should.eql({ + expect(options.query).toEqual({ album_type: 'album', country: 'GB', limit: 2, offset: 5 }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { href: @@ -984,31 +981,31 @@ describe('Spotify Web API', function() { '0oSGxfWSnnOXhD2fKuz2Gy', { album_type: 'album', country: 'GB', limit: 2, offset: 5 }, function(err, data) { - should.not.exist(err); - 'https://api.spotify.com/v1/artists/0oSGxfWSnnOXhD2fKuz2Gy/albums?offset=5&limit=2&album_type=album&market=GB'.should.equal( - data.body.href + expect(err).toBeFalsy(); + expect(data.body.href).toBe( + 'https://api.spotify.com/v1/artists/0oSGxfWSnnOXhD2fKuz2Gy/albums?offset=5&limit=2&album_type=album&market=GB' ); done(); } ); }); - it('should get tracks from album', function(done) { + test('should get tracks from album', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/albums/41MnTivkwTO3UUJ8DrqEJJ/tracks' ); - options.query.should.eql({ + expect(options.query).toEqual({ offset: 1, limit: 5 }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { href: @@ -1020,8 +1017,8 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.getAlbumTracks('41MnTivkwTO3UUJ8DrqEJJ', { limit: 5, offset: 1 }).then( function(data) { - 'https://api.spotify.com/v1/albums/41MnTivkwTO3UUJ8DrqEJJ/tracks?offset=1&limit=5'.should.equal( - data.body.href + expect(data.body.href).toBe( + 'https://api.spotify.com/v1/albums/41MnTivkwTO3UUJ8DrqEJJ/tracks?offset=1&limit=5' ); done(); }, @@ -1031,22 +1028,22 @@ describe('Spotify Web API', function() { ); }); - it('should get tracks from album using callback', function(done) { + test('should get tracks from album using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/albums/41MnTivkwTO3UUJ8DrqEJJ/tracks' ); - options.query.should.eql({ + expect(options.query).toEqual({ offset: 1, limit: 5 }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { href: @@ -1060,30 +1057,30 @@ describe('Spotify Web API', function() { '41MnTivkwTO3UUJ8DrqEJJ', { limit: 5, offset: 1 }, function(err, data) { - should.not.exist(err); - 'https://api.spotify.com/v1/albums/41MnTivkwTO3UUJ8DrqEJJ/tracks?offset=1&limit=5'.should.equal( - data.body.href + expect(err).toBeFalsy(); + expect(data.body.href).toEqual( + 'https://api.spotify.com/v1/albums/41MnTivkwTO3UUJ8DrqEJJ/tracks?offset=1&limit=5' ); done(); } ); }); - it('should get top tracks for artist', function(done) { + test('should get top tracks for artist', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/artists/0oSGxfWSnnOXhD2fKuz2Gy/top-tracks' ); - options.query.should.eql({ + expect(options.query).toEqual({ country: 'GB' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(); }); @@ -1099,44 +1096,44 @@ describe('Spotify Web API', function() { ); }); - it('should get top tracks for artist', function(done) { + test('should get top tracks for artist', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/artists/0oSGxfWSnnOXhD2fKuz2Gy/top-tracks' ); - options.query.should.eql({ + expect(options.query).toEqual({ country: 'GB' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(); }); var api = new SpotifyWebApi(); api.getArtistTopTracks('0oSGxfWSnnOXhD2fKuz2Gy', 'GB', function(err, data) { - should.not.exist(err); + expect(err).toBeFalsy(); done(); }); }); - it('should get similar artists', function(done) { + test('should get similar artists', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/artists/0qeei9KQnptjwb8MgkqEoy/related-artists' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { artists: [{}] @@ -1148,7 +1145,7 @@ describe('Spotify Web API', function() { api.getArtistRelatedArtists('0qeei9KQnptjwb8MgkqEoy').then( function(data) { - should.exist(data.body.artists); + expect(data.body.artists).toBeTruthy(); done(); }, function(err) { @@ -1157,18 +1154,18 @@ describe('Spotify Web API', function() { ); }); - it('should get similar artists using callback', function(done) { + test('should get similar artists using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/artists/0qeei9KQnptjwb8MgkqEoy/related-artists' ); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { artists: [{}] @@ -1179,21 +1176,21 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.getArtistRelatedArtists('0qeei9KQnptjwb8MgkqEoy', function(err, data) { - should.exist(data.body.artists); + expect(data.body.artists).toBeTruthy(); done(); }); }); - it('should get a user', function(done) { + test('should get a user', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/users/petteralexis'); - should.not.exist(options.data); + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/users/petteralexis'); + expect(options.data).toBeFalsy(); callback(null, { body: { uri: 'spotify:user:petteralexis' @@ -1205,7 +1202,7 @@ describe('Spotify Web API', function() { api.getUser('petteralexis').then( function(data) { - 'spotify:user:petteralexis'.should.equal(data.body.uri); + expect('spotify:user:petteralexis').toBe(data.body.uri); done(); }, function(err) { @@ -1214,16 +1211,16 @@ describe('Spotify Web API', function() { ); }); - it("should get a user with a '#' character and encode it properly", function(done) { + test("should get a user with a '#' character and encode it properly", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/users/%23matze23'); - should.not.exist(options.data); + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/users/%23matze23'); + expect(options.data).toBeFalsy(); callback(null, { body: { uri: 'spotify:user:%23matze23' @@ -1235,7 +1232,7 @@ describe('Spotify Web API', function() { api.getUser('#matze23').then( function(data) { - 'spotify:user:%23matze23'.should.equal(data.body.uri); + expect('spotify:user:%23matze23').toBe(data.body.uri); done(); }, function(err) { @@ -1244,16 +1241,16 @@ describe('Spotify Web API', function() { ); }); - it('should get a user using callback', function(done) { + test('should get a user using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/users/petteralexis'); - should.not.exist(options.data); + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/users/petteralexis'); + expect(options.data).toBeFalsy(); callback(null, { body: { uri: 'spotify:user:petteralexis' @@ -1264,21 +1261,23 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.getUser('petteralexis', function(err, data) { - 'spotify:user:petteralexis'.should.equal(data.body.uri); + expect('spotify:user:petteralexis').toBe(data.body.uri); done(); }); }); - it("should get the authenticated user's information", function(done) { + test("should get the authenticated user's information", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me'); - options.headers.should.eql({ Authorization: 'Bearer someAccessToken' }); + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me'); + expect(options.headers).toEqual({ + Authorization: 'Bearer someAccessToken' + }); callback(null, { body: { uri: 'spotify:user:thelinmichael' @@ -1291,21 +1290,23 @@ describe('Spotify Web API', function() { }); api.getMe().then(function(data) { - 'spotify:user:thelinmichael'.should.equal(data.body.uri); + expect('spotify:user:thelinmichael').toBe(data.body.uri); done(); }); }); - it("should get the authenticated user's information with accesstoken set on the api object", function(done) { + test("should get the authenticated user's information with accesstoken set on the api object", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me'); - options.headers.should.eql({ Authorization: 'Bearer someAccessToken' }); + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me'); + expect(options.headers).toEqual({ + Authorization: 'Bearer someAccessToken' + }); callback(null, { body: { uri: 'spotify:user:thelinmichael' @@ -1317,20 +1318,20 @@ describe('Spotify Web API', function() { api.setAccessToken('someAccessToken'); api.getMe().then(function(data) { - 'spotify:user:thelinmichael'.should.equal(data.body.uri); + expect('spotify:user:thelinmichael').toBe(data.body.uri); done(); }); }); - it('should fail if no token is provided for a request that requires an access token', function(done) { + test('should fail if no token is provided for a request that requires an access token', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me'); + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me'); if (!options.headers || !options.headers.Authorization) { callback(new WebApiError('No token', 401), null); } @@ -1343,22 +1344,22 @@ describe('Spotify Web API', function() { done(new Error('Should have failed!')); }, function(err) { - 'No token'.should.equal(err.message); - (401).should.equal(err.statusCode); + expect(err.message).toBe('No token'); + expect(err.statusCode).toBe(401); done(); } ); }); - it('should fail if no token is provided for a request that requires an access token using callback', function(done) { + test('should fail if no token is provided for a request that requires an access token using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me'); + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me'); if (!options.headers || !options.headers.Authorization) { callback(new WebApiError('No token', 401), null); } @@ -1367,25 +1368,25 @@ describe('Spotify Web API', function() { var api = new SpotifyWebApi(); api.getMe(function(err) { - 'No token'.should.equal(err.message); - (401).should.equal(err.statusCode); - should.exist(err); + expect(err.message).toBe('No token'); + expect(err.statusCode).toBe(401); + expect(err).toBeTruthy(); done(); }); }); - it('should get a users playlists', function(done) { + test('should get a users playlists', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/users/thelinmichael/playlists' ); - should.not.exist(options.query); + expect(options.query).toBeFalsy(); callback(null, { body: { items: [ @@ -1405,22 +1406,22 @@ describe('Spotify Web API', function() { api.setAccessToken('myVeryLongAccessToken'); api.getUserPlaylists('thelinmichael').then(function(data) { - (2).should.equal(data.body.items.length); - (200).should.equal(data.statusCode); + expect(2).toBe(data.body.items.length); + expect(data.statusCode).toBe(200); done(); }); }); - it('should get the current users playlists', function(done) { + test('should get the current users playlists', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me/playlists'); - should.not.exist(options.query); + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me/playlists'); + expect(options.query).toBeFalsy(); callback(null, { body: { items: [ @@ -1440,24 +1441,24 @@ describe('Spotify Web API', function() { api.setAccessToken('myVeryLongAccessToken'); api.getUserPlaylists().then(function(data) { - (2).should.equal(data.body.items.length); - (200).should.equal(data.statusCode); + expect(2).toBe(data.body.items.length); + expect(data.statusCode).toBe(200); done(); }); }); - it('should get a playlist', function(done) { + test('should get a playlist', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/users/thelinmichael/playlists/5ieJqeLJjjI8iJWaxeBLuK' ); - should.not.exist(options.query); + expect(options.query).toBeFalsy(); callback(null, { body: { uri: 'spotify:user:thelinmichael:playlist:5ieJqeLJjjI8iJWaxeBLuK' @@ -1473,15 +1474,15 @@ describe('Spotify Web API', function() { err, data ) { - 'spotify:user:thelinmichael:playlist:5ieJqeLJjjI8iJWaxeBLuK'.should.equal( - data.body.uri + expect(data.body.uri).toBe( + 'spotify:user:thelinmichael:playlist:5ieJqeLJjjI8iJWaxeBLuK' ); - (200).should.equal(data.statusCode); + expect(data.statusCode).toBe(200); done(); }); }); - it.skip('should create a playlist', function(done) { + test.skip('should create a playlist', function(done) { var api = new SpotifyWebApi(); api.setAccessToken('long-access-token'); @@ -1498,22 +1499,22 @@ describe('Spotify Web API', function() { ); }); - it('should create a private playlist using callback', function(done) { + test('should create a private playlist using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.post); - uri.should.equal( + expect(method).toBe(superagent.post); + expect(uri).toBe( 'https://api.spotify.com/v1/users/thelinmichael/playlists' ); - JSON.parse(options.data).should.eql({ + expect(JSON.parse(options.data)).toEqual({ name: 'My Cool Playlist', public: false }); - should.not.exist(options.query); + expect(options.query).toBeFalsy(); callback(null, { body: { name: 'My Cool Playlist', public: false }, statusCode: 200 @@ -1527,27 +1528,27 @@ describe('Spotify Web API', function() { 'My Cool Playlist', { public: false }, function(err, data) { - 'My Cool Playlist'.should.equal(data.body.name); - (200).should.equal(data.statusCode); + expect(data.body.name).toBe('My Cool Playlist'); + expect(data.statusCode).toBe(200); done(); } ); }); - it('should create a playlist using callback without options', function(done) { + test('should create a playlist using callback without options', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.post); - uri.should.equal( + expect(method).toBe(superagent.post); + expect(uri).toBe( 'https://api.spotify.com/v1/users/thelinmichael/playlists' ); - JSON.parse(options.data).should.eql({ name: 'My Cool Playlist' }); + expect(JSON.parse(options.data)).toEqual({ name: 'My Cool Playlist' }); callback(null, { body: { name: 'My Cool Playlist' } }); - should.not.exist(options.query); + expect(options.query).toBeFalsy(); }); var api = new SpotifyWebApi(); @@ -1560,24 +1561,24 @@ describe('Spotify Web API', function() { }); }); - it('should change playlist details', function(done) { + test('should change playlist details', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal( + expect(method).toBe(superagent.put); + expect(uri).toBe( 'https://api.spotify.com/v1/users/thelinmichael/playlists/5ieJqeLJjjI8iJWaxeBLuK' ); - JSON.parse(options.data).should.eql({ + expect(JSON.parse(options.data)).toEqual({ name: 'This is a new name for my Cool Playlist, and will become private', public: false }); callback(null, { statusCode: 200 }); - should.not.exist(options.query); + expect(options.query).toBeFalsy(); }); var api = new SpotifyWebApi(); @@ -1590,26 +1591,25 @@ describe('Spotify Web API', function() { public: false }) .then(function(data) { - (200).should.equal(data.statusCode); + expect(data.statusCode).toBe(200); done(); }); }); - it('should add tracks to playlist', function(done) { + test('should add tracks to playlist', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.post); - uri.should.equal( + expect(method).toBe(superagent.post); + expect(uri).toBe( 'https://api.spotify.com/v1/users/thelinmichael/playlists/5ieJqeLJjjI8iJWaxeBLuK/tracks' ); - should.not.exist(options.query); - JSON.parse(options.data) - ['uris'].should.be.an.instanceOf(Array) - .and.have.lengthOf(2); + expect(options.query).toBeFalsy(); + expect(JSON.parse(options.data)['uris']).toBeInstanceOf(Array); + expect(JSON.parse(options.data)['uris']).toHaveLength(2); callback(null, { body: { snapshot_id: 'aSnapshotId' }, statusCode: 201 }); }); @@ -1622,23 +1622,22 @@ describe('Spotify Web API', function() { 'spotify:track:1301WleyT98MSxVHPZCA6M' ]) .then(function(data) { - (201).should.equal(data.statusCode); + expect(201).toBe(data.statusCode); done(); }); }); - it('should add tracks to playlist with specified index', function(done) { + test('should add tracks to playlist with specified index', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.post); - JSON.parse(options.data) - ['uris'].should.be.an.instanceOf(Array) - .and.have.lengthOf(2); - options.query.should.eql({ + expect(method).toBe(superagent.post); + expect(JSON.parse(options.data)['uris']).toBeInstanceOf(Array); + expect(JSON.parse(options.data)['uris']).toHaveLength(2); + expect(options.query).toEqual({ position: 10 }); callback(null, { body: { snapshot_id: 'aSnapshotId' }, statusCode: 201 }); @@ -1664,19 +1663,21 @@ describe('Spotify Web API', function() { }); }); - it("should get user's top artists", function(done) { + test("should get user's top artists", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me/top/artists'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me/top/artists'); + expect(options.query).toEqual({ limit: 5 }); - options.headers.should.eql({ Authorization: 'Bearer someAccessToken' }); + expect(options.headers).toEqual({ + Authorization: 'Bearer someAccessToken' + }); callback(null, { body: { items: [] @@ -1689,24 +1690,26 @@ describe('Spotify Web API', function() { }); api.getMyTopArtists({ limit: 5 }).then(function(data) { - should.exist(data.body.items); + expect(data.body.items).toBeTruthy(); done(); }); }); - it("should get user's top tracks", function(done) { + test("should get user's top tracks", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me/top/tracks'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me/top/tracks'); + expect(options.query).toEqual({ limit: 5 }); - options.headers.should.eql({ Authorization: 'Bearer someAccessToken' }); + expect(options.headers).toEqual({ + Authorization: 'Bearer someAccessToken' + }); callback(null, { body: { items: [] @@ -1719,24 +1722,26 @@ describe('Spotify Web API', function() { }); api.getMyTopTracks({ limit: 5 }).then(function(data) { - should.exist(data.body.items); + expect(data.body.items).toBeTruthy(); done(); }); }); - it("should get user's recently played tracks:", function(done) { + test("should get user's recently played tracks:", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me/player/recently-played'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me/player/recently-played'); + expect(options.query).toEqual({ limit: 5 }); - options.headers.should.eql({ Authorization: 'Bearer someAccessToken' }); + expect(options.headers).toEqual({ + Authorization: 'Bearer someAccessToken' + }); callback(null, { body: { items: [] @@ -1749,21 +1754,23 @@ describe('Spotify Web API', function() { }); api.getMyRecentlyPlayedTracks({ limit: 5 }).then(function(data) { - should.exist(data.body.items); + expect(data.body.items).toBeTruthy(); done(); }); }); - it("should get user's devices:", function(done) { + test("should get user's devices:", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me/player/devices'); - options.headers.should.eql({ Authorization: 'Bearer someAccessToken' }); + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me/player/devices'); + expect(options.headers).toEqual({ + Authorization: 'Bearer someAccessToken' + }); callback(null, { body: { devices: [] @@ -1776,24 +1783,26 @@ describe('Spotify Web API', function() { }); api.getMyDevices().then(function(data) { - should.exist(data.body.devices); + expect(data.body.devices).toBeTruthy(); done(); }); }); - it("should get user's current playback status:", function(done) { + test("should get user's current playback status:", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me/player'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me/player'); + expect(options.query).toEqual({ market: 'GB' }); - options.headers.should.eql({ Authorization: 'Bearer someAccessToken' }); + expect(options.headers).toEqual({ + Authorization: 'Bearer someAccessToken' + }); callback(null, { body: { device: {} @@ -1806,25 +1815,25 @@ describe('Spotify Web API', function() { }); api.getMyCurrentPlaybackState({ market: 'GB' }).then(function(data) { - should.exist(data.body.device); + expect(data.body.device).toBeTruthy(); done(); }); }); - it("should transfer the user's playback", function(done) { + test("should transfer the user's playback", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal('https://api.spotify.com/v1/me/player'); - JSON.parse(options.data).should.eql({ + expect(method).toBe(superagent.put); + expect(uri).toBe('https://api.spotify.com/v1/me/player'); + expect(JSON.parse(options.data)).toEqual({ device_ids: ['deviceId'], play: true }); - should.not.exist(options.query); + expect(options.query).toBeFalsy(); callback(); }); @@ -1850,16 +1859,16 @@ describe('Spotify Web API', function() { ); }); - it("should resume the user's playback", function(done) { + test("should resume the user's playback", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal('https://api.spotify.com/v1/me/player/play'); - should.not.exist(options.query); + expect(method).toBe(superagent.put); + expect(uri).toBe('https://api.spotify.com/v1/me/player/play'); + expect(options.query).toBeFalsy(); callback(); }); @@ -1880,17 +1889,17 @@ describe('Spotify Web API', function() { ); }); - it("should resume the user's playback with options", function(done) { + test("should resume the user's playback with options", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal('https://api.spotify.com/v1/me/player/play'); - options.query.should.eql({ device_id: 'my_device_id' }); - JSON.parse(options.data).should.eql({ + expect(method).toBe(superagent.put); + expect(uri).toBe('https://api.spotify.com/v1/me/player/play'); + expect(options.query).toEqual({ device_id: 'my_device_id' }); + expect(JSON.parse(options.data)).toEqual({ context_uri: 'my_context', offset: { position: 5 @@ -1922,16 +1931,16 @@ describe('Spotify Web API', function() { ); }); - it("should pause the user's playback", function(done) { + test("should pause the user's playback", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal('https://api.spotify.com/v1/me/player/pause'); - should.not.exist(options.query); + expect(method).toBe(superagent.put); + expect(uri).toBe('https://api.spotify.com/v1/me/player/pause'); + expect(options.query).toBeFalsy(); callback(); }); @@ -1952,16 +1961,16 @@ describe('Spotify Web API', function() { ); }); - it("should pause the user's playback with options", function(done) { + test("should pause the user's playback with options", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal('https://api.spotify.com/v1/me/player/pause'); - options.query.should.eql({ device_id: 'my_device_id' }); + expect(method).toBe(superagent.put); + expect(uri).toBe('https://api.spotify.com/v1/me/player/pause'); + expect(options.query).toEqual({ device_id: 'my_device_id' }); callback(); }); @@ -1982,16 +1991,16 @@ describe('Spotify Web API', function() { ); }); - it("should skip the user's playback to next track", function(done) { + test("should skip the user's playback to next track", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.post); - uri.should.equal('https://api.spotify.com/v1/me/player/next'); - should.not.exist(options.query); + expect(method).toBe(superagent.post); + expect(uri).toBe('https://api.spotify.com/v1/me/player/next'); + expect(options.query).toBeFalsy(); callback(); }); @@ -2012,16 +2021,16 @@ describe('Spotify Web API', function() { ); }); - it("should skip the user's playback to previous track", function(done) { + test("should skip the user's playback to previous track", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.post); - uri.should.equal('https://api.spotify.com/v1/me/player/previous'); - should.not.exist(options.query); + expect(method).toBe(superagent.post); + expect(uri).toBe('https://api.spotify.com/v1/me/player/previous'); + expect(options.query).toBeFalsy(); callback(); }); @@ -2042,17 +2051,17 @@ describe('Spotify Web API', function() { ); }); - it("should set the user's playback repeat mode", function(done) { + test("should set the user's playback repeat mode", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal('https://api.spotify.com/v1/me/player/repeat'); - should.exist(options.query); - should.not.exist(options.body); + expect(method).toBe(superagent.put); + expect(uri).toBe('https://api.spotify.com/v1/me/player/repeat'); + expect(options.query).toBeTruthy(); + expect(options.body).toBeFalsy(); callback(); }); @@ -2073,17 +2082,17 @@ describe('Spotify Web API', function() { ); }); - it("should set the user's playback shuffle mode", function(done) { + test("should set the user's playback shuffle mode", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal('https://api.spotify.com/v1/me/player/shuffle'); - should.exist(options.query); - should.not.exist(options.body); + expect(method).toBe(superagent.put); + expect(uri).toBe('https://api.spotify.com/v1/me/player/shuffle'); + expect(options.query).toBeTruthy(); + expect(options.body).toBeFalsy(); callback(); }); @@ -2104,20 +2113,20 @@ describe('Spotify Web API', function() { ); }); - it("should set the user's playback volume", function(done) { + test("should set the user's playback volume", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal('https://api.spotify.com/v1/me/player/volume'); - options.query.should.eql({ + expect(method).toBe(superagent.put); + expect(uri).toBe('https://api.spotify.com/v1/me/player/volume'); + expect(options.query).toEqual({ volume_percent: 80, device_id: 'my_device_id' }); - should.not.exist(options.body); + expect(options.body).toBeFalsy(); callback(); }); @@ -2138,17 +2147,17 @@ describe('Spotify Web API', function() { ); }); - it('should seek', function(done) { + test('should seek', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal('https://api.spotify.com/v1/me/player/seek'); - options.query.should.eql({ position_ms: 2000 }); - should.not.exist(options.body); + expect(method).toBe(superagent.put); + expect(uri).toBe('https://api.spotify.com/v1/me/player/seek'); + expect(options.query).toEqual({ position_ms: 2000 }); + expect(options.body).toBeFalsy(); callback(); }); @@ -2169,20 +2178,20 @@ describe('Spotify Web API', function() { ); }); - it('should seek on a certain device', function(done) { + test('should seek on a certain device', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal('https://api.spotify.com/v1/me/player/seek'); - options.query.should.eql({ + expect(method).toBe(superagent.put); + expect(uri).toBe('https://api.spotify.com/v1/me/player/seek'); + expect(options.query).toEqual({ position_ms: 2000, device_id: 'my_device_id' }); - should.not.exist(options.body); + expect(options.body).toBeFalsy(); callback(); }); @@ -2203,7 +2212,7 @@ describe('Spotify Web API', function() { ); }); - it.skip('should retrieve an access token using the client credentials flow', function(done) { + test.skip('should retrieve an access token using the client credentials flow', function(done) { var clientId = 'someClientId', clientSecret = 'someClientSecret'; @@ -2214,9 +2223,9 @@ describe('Spotify Web API', function() { api.clientCredentialsGrant().then( function(data) { - 'Bearer'.should.equal(data['token_type']); - (3600).should.equal(data['expires_in']); - should.exist(data['access_token']); + expect('Bearer').toBe(data['token_type']); + expect(3600).toBe(data['expires_in']); + expect(data['access_token']).toBeTruthy(); done(); }, function(err) { @@ -2225,7 +2234,7 @@ describe('Spotify Web API', function() { ); }); - it.skip('should retrieve an access token with scopes', function(done) { + test.skip('should retrieve an access token with scopes', function(done) { var clientId = 'fcecfc79122e4cd299473677a17cbd4d', clientSecret = 'f6338737c9bb4bc9a71924cb2940adss'; @@ -2243,9 +2252,9 @@ describe('Spotify Web API', function() { .then( function(data) { console.log(data); - 'Bearer'.should.equal(data['token_type']); - (3600).should.equal(data['expires_in']); - should.exist(data['access_token']); + expect('Bearer').toBe(data['token_type']); + expect(3600).toBe(data['expires_in']); + expect(data['access_token']).toBeTruthy(); done(); }, function(err) { @@ -2254,7 +2263,7 @@ describe('Spotify Web API', function() { ); }); - it.skip('should retrieve an access token using the authorization code flow', function(done) { + test.skip('should retrieve an access token using the authorization code flow', function(done) { var credentials = { clientId: 'someClientId', clientSecret: 'someClientSecret', @@ -2265,10 +2274,10 @@ describe('Spotify Web API', function() { api.authorizationCodeGrant('mySuperLongCode').then( function(data) { - 'Bearer'.should.equal(data['token_type']); - (3600).should.equal(data['expires_in']); - should.exist(data['access_token']); - should.exist(data['refresh_token']); + expect('Bearer').toBe(data['token_type']); + expect(3600).toBe(data['expires_in']); + expect(data['access_token']).toBeTruthy(); + expect(data['refresh_token']).toBeTruthy(); done(); }, function(err) { @@ -2278,21 +2287,21 @@ describe('Spotify Web API', function() { ); }); - it('should refresh an access token', function(done) { + test('should refresh an access token', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.post); - uri.should.equal('https://accounts.spotify.com/api/token'); - options.data.should.eql({ + expect(method).toBe(superagent.post); + expect(uri).toBe('https://accounts.spotify.com/api/token'); + expect(options.data).toEqual({ grant_type: 'refresh_token', refresh_token: 'someLongRefreshToken' }); - should.not.exist(options.query); - options.headers.should.eql({ + expect(options.query).toBeFalsy(); + expect(options.headers).toEqual({ Authorization: 'Basic c29tZUNsaWVudElkOnNvbWVDbGllbnRTZWNyZXQ=' }); callback(null, { @@ -2320,7 +2329,7 @@ describe('Spotify Web API', function() { }); }); - it('should create authorization URL', function() { + test('should create authorization URL', () => { var scopes = ['user-read-private', 'user-read-email'], redirectUri = 'https://example.com/callback', clientId = '5fe01282e44241328a84e7c5cc169165', @@ -2333,12 +2342,12 @@ describe('Spotify Web API', function() { }); var authorizeURL = api.createAuthorizeURL(scopes, state, showDialog); - 'https://accounts.spotify.com/authorize?client_id=5fe01282e44241328a84e7c5cc169165&response_type=code&redirect_uri=https://example.com/callback&scope=user-read-private%20user-read-email&state=some-state-of-my-choice&show_dialog=true'.should.equal( - authorizeURL + expect(authorizeURL).toBe( + 'https://accounts.spotify.com/authorize?client_id=5fe01282e44241328a84e7c5cc169165&response_type=code&redirect_uri=https://example.com/callback&scope=user-read-private%20user-read-email&state=some-state-of-my-choice&show_dialog=true' ); }); - it('should ignore entire show_dialog param if it is not included', function() { + test('should ignore entire show_dialog param if it is not included', () => { var scopes = ['user-read-private', 'user-read-email'], redirectUri = 'https://example.com/callback', clientId = '5fe01282e44241328a84e7c5cc169165', @@ -2350,34 +2359,34 @@ describe('Spotify Web API', function() { }); var authorizeURL = api.createAuthorizeURL(scopes, state); - 'https://accounts.spotify.com/authorize?client_id=5fe01282e44241328a84e7c5cc169165&response_type=code&redirect_uri=https://example.com/callback&scope=user-read-private%20user-read-email&state=some-state-of-my-choice'.should.equal( - authorizeURL + expect(authorizeURL).toBe( + 'https://accounts.spotify.com/authorize?client_id=5fe01282e44241328a84e7c5cc169165&response_type=code&redirect_uri=https://example.com/callback&scope=user-read-private%20user-read-email&state=some-state-of-my-choice' ); }); - it('should set, get and reset credentials successfully', function() { + test('should set, get and reset credentials successfully', () => { var api = new SpotifyWebApi({ clientId: 'myClientId', clientSecret: 'myClientSecret' }); - api.getClientId().should.equal('myClientId'); - api.getClientSecret().should.equal('myClientSecret'); + expect(api.getClientId()).toBe('myClientId'); + expect(api.getClientSecret()).toBe('myClientSecret'); api.resetClientId(); - should.not.exist(api.getClientId()); + expect(api.getClientId()).toBeFalsy(); api.setClientId('woopwoop'); - api.getClientId().should.equal('woopwoop'); + expect(api.getClientId()).toBe('woopwoop'); api.resetClientSecret(); - should.not.exist(api.getClientSecret()); + expect(api.getClientSecret()).toBeFalsy(); api.setClientSecret('aNewClientSecret'); - api.getClientSecret().should.equal('aNewClientSecret'); + expect(api.getClientSecret()).toBe('aNewClientSecret'); }); - it.skip('should get tracks in a playlist', function(done) { + test.skip('should get tracks in a playlist', function(done) { var accessToken = 'myAccessToken'; var api = new SpotifyWebApi({ @@ -2397,7 +2406,7 @@ describe('Spotify Web API', function() { ); }); - it.skip('should get tracks in a playlist with fields option', function(done) { + test.skip('should get tracks in a playlist with fields option', function(done) { var accessToken = 'myAccessToken'; var api = new SpotifyWebApi({ @@ -2409,8 +2418,8 @@ describe('Spotify Web API', function() { }) .then( function(data) { - should.exist(data.items); - should.not.exist(data.href); + expect(data.items).toBeTruthy(); + expect(data.href).toBeFalsy(); done(); }, function(err) { @@ -2421,7 +2430,7 @@ describe('Spotify Web API', function() { }); /* Run this test with a valid access token with the user-library-read scope */ - it.skip('should get tracks in the users library', function(done) { + test.skip('should get tracks in the users library', function(done) { var accessToken = 'myAccessToken'; var api = new SpotifyWebApi({ @@ -2447,7 +2456,7 @@ describe('Spotify Web API', function() { }); /* Run this test with a valid access token with the user-library-read scope */ - it.skip('should determine if a track is in the users library', function(done) { + test.skip('should determine if a track is in the users library', function(done) { var accessToken = 'myAccessToken'; var api = new SpotifyWebApi({ @@ -2455,9 +2464,9 @@ describe('Spotify Web API', function() { }); api.containsMySavedTracks(['5ybJm6GczjQOgTqmJ0BomP']).then( function(data) { - Object.prototype.toString.call(data).should.equal('[object Array]'); - data.length.should.equal(1); - data[0].should.equal(false); + expect(Object.prototype.toString.call(data)).toBe('[object Array]'); + expect(data.length).toBe(1); + expect(data[0]).toBe(false); done(); }, function(err) { @@ -2467,17 +2476,17 @@ describe('Spotify Web API', function() { ); }); - it('should remove tracks in the users library', function(done) { + test('should remove tracks in the users library', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.del); - JSON.parse(options.data).should.eql(['3VNWq8rTnQG6fM1eldSpZ0']); - uri.should.equal('https://api.spotify.com/v1/me/tracks'); - should.not.exist(options.query); + expect(method).toBe(superagent.del); + expect(JSON.parse(options.data)).toEqual(['3VNWq8rTnQG6fM1eldSpZ0']); + expect(uri).toBe('https://api.spotify.com/v1/me/tracks'); + expect(options.query).toBeFalsy(); callback(); }); @@ -2498,17 +2507,17 @@ describe('Spotify Web API', function() { ); }); - it('should remove albums in the users library', function(done) { + test('should remove albums in the users library', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.del); - JSON.parse(options.data).should.eql(['27cZdqrQiKt3IT00338dws']); - uri.should.equal('https://api.spotify.com/v1/me/albums'); - should.not.exist(options.query); + expect(method).toBe(superagent.del); + expect(JSON.parse(options.data)).toEqual(['27cZdqrQiKt3IT00338dws']); + expect(uri).toBe('https://api.spotify.com/v1/me/albums'); + expect(options.query).toBeFalsy(); callback(); }); @@ -2529,18 +2538,18 @@ describe('Spotify Web API', function() { ); }); - it('should add albums to the users library', function(done) { + test('should add albums to the users library', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - JSON.parse(options.data).should.eql(['27cZdqrQiKt3IT00338dws']); - uri.should.equal('https://api.spotify.com/v1/me/albums'); - should.not.exist(options.query); - options.headers.Authorization.should.equal('Bearer myAccessToken'); + expect(method).toBe(superagent.put); + expect(JSON.parse(options.data)).toEqual(['27cZdqrQiKt3IT00338dws']); + expect(uri).toBe('https://api.spotify.com/v1/me/albums'); + expect(options.query).toBeFalsy(); + expect(options.headers.Authorization).toBe('Bearer myAccessToken'); callback(); }); @@ -2561,18 +2570,18 @@ describe('Spotify Web API', function() { ); }); - it('should get albums in the users library', function(done) { + test('should get albums in the users library', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me/albums'); - options.headers.Authorization.should.equal('Bearer myAccessToken'); - options.query.limit.should.equal(2); - options.query.offset.should.equal(1); + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me/albums'); + expect(options.headers.Authorization).toBe('Bearer myAccessToken'); + expect(options.query.limit).toBe(2); + expect(options.query.offset).toBe(1); callback(null, { body: { href: 'https://api.spotify.com/v1/me/albums?offset=1&limit=2', @@ -2596,10 +2605,10 @@ describe('Spotify Web API', function() { }) .then( function(data) { - data.body.href.should.equal( + expect(data.body.href).toBe( 'https://api.spotify.com/v1/me/albums?offset=1&limit=2' ); - data.body.items[0]['added_at'].should.equal('2014-07-08T18:18:33Z'); + expect(data.body.items[0]['added_at']).toBe('2014-07-08T18:18:33Z'); done(); }, function(err) { @@ -2609,17 +2618,17 @@ describe('Spotify Web API', function() { ); }); - it('should determine if an album is in the users library', function(done) { + test('should determine if an album is in the users library', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me/albums/contains'); - options.headers.Authorization.should.equal('Bearer myAccessToken'); - options.query.ids.should.equal('27cZdqrQiKt3IT00338dws'); + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me/albums/contains'); + expect(options.headers.Authorization).toBe('Bearer myAccessToken'); + expect(options.query.ids).toBe('27cZdqrQiKt3IT00338dws'); callback(null, { body: [true] }); }); @@ -2630,11 +2639,11 @@ describe('Spotify Web API', function() { }); api.containsMySavedAlbums(['27cZdqrQiKt3IT00338dws']).then( function(data) { - Object.prototype.toString - .call(data.body) - .should.equal('[object Array]'); - data.body.length.should.equal(1); - data.body[0].should.equal(true); + expect(Object.prototype.toString.call(data.body)).toBe( + '[object Array]' + ); + expect(data.body.length).toBe(1); + expect(data.body[0]).toBe(true); done(); }, function(err) { @@ -2644,17 +2653,17 @@ describe('Spotify Web API', function() { ); }); - it('should follow a playlist', function(done) { + test('should follow a playlist', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - JSON.parse(options.data).should.eql({ public: false }); - should.not.exist(options.query); - uri.should.equal( + expect(method).toBe(superagent.put); + expect(JSON.parse(options.data)).toEqual({ public: false }); + expect(options.query).toBeFalsy(); + expect(uri).toBe( 'https://api.spotify.com/v1/users/jmperezperez/playlists/7p9EIC2KW0NNkTEOnTUZJl/followers' ); callback(); @@ -2681,17 +2690,17 @@ describe('Spotify Web API', function() { ); }); - it('should unfollow a playlist', function(done) { + test('should unfollow a playlist', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.del); - should.not.exist(options.data); - should.not.exist(options.query); - uri.should.equal( + expect(method).toBe(superagent.del); + expect(options.data).toBeFalsy(); + expect(options.query).toBeFalsy(); + expect(uri).toBe( 'https://api.spotify.com/v1/users/jmperezperez/playlists/7p9EIC2KW0NNkTEOnTUZJl/followers' ); callback(); @@ -2714,20 +2723,20 @@ describe('Spotify Web API', function() { ); }); - it('should follow several users', function(done) { + test('should follow several users', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal('https://api.spotify.com/v1/me/following'); - options.query.should.eql({ + expect(method).toBe(superagent.put); + expect(uri).toBe('https://api.spotify.com/v1/me/following'); + expect(options.query).toEqual({ type: 'user', ids: 'thelinmichael,wizzler' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(); }); @@ -2748,20 +2757,20 @@ describe('Spotify Web API', function() { ); }); - it('should follow several users using callback', function(done) { + test('should follow several users using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal('https://api.spotify.com/v1/me/following'); - options.query.should.eql({ + expect(method).toBe(superagent.put); + expect(uri).toBe('https://api.spotify.com/v1/me/following'); + expect(options.query).toEqual({ type: 'user', ids: 'thelinmichael,wizzler' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(); }); @@ -2772,25 +2781,25 @@ describe('Spotify Web API', function() { }); api.followUsers(['thelinmichael', 'wizzler'], function(err, data) { - should.not.exist(err); + expect(err).toBeFalsy(); done(); }); }); - it('should follow several artists', function(done) { + test('should follow several artists', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal('https://api.spotify.com/v1/me/following'); - options.query.should.eql({ + expect(method).toBe(superagent.put); + expect(uri).toBe('https://api.spotify.com/v1/me/following'); + expect(options.query).toEqual({ type: 'artist', ids: '137W8MRPWKqSmrBGDBFSop' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(); }); @@ -2811,20 +2820,20 @@ describe('Spotify Web API', function() { ); }); - it('should follow several artists using callback', function(done) { + test('should follow several artists using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal('https://api.spotify.com/v1/me/following'); - options.query.should.eql({ + expect(method).toBe(superagent.put); + expect(uri).toBe('https://api.spotify.com/v1/me/following'); + expect(options.query).toEqual({ type: 'artist', ids: '137W8MRPWKqSmrBGDBFSop' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(); }); @@ -2839,20 +2848,20 @@ describe('Spotify Web API', function() { }); }); - it('should unfollow several users', function(done) { + test('should unfollow several users', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.del); - uri.should.equal('https://api.spotify.com/v1/me/following'); - options.query.should.eql({ + expect(method).toBe(superagent.del); + expect(uri).toBe('https://api.spotify.com/v1/me/following'); + expect(options.query).toEqual({ type: 'user', ids: 'thelinmichael,wizzler' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(); }); @@ -2873,20 +2882,20 @@ describe('Spotify Web API', function() { ); }); - it('should unfollow several users using callback', function(done) { + test('should unfollow several users using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.del); - uri.should.equal('https://api.spotify.com/v1/me/following'); - options.query.should.eql({ + expect(method).toBe(superagent.del); + expect(uri).toBe('https://api.spotify.com/v1/me/following'); + expect(options.query).toEqual({ type: 'user', ids: 'thelinmichael,wizzler' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(); }); @@ -2901,20 +2910,20 @@ describe('Spotify Web API', function() { }); }); - it('should unfollow several artists', function(done) { + test('should unfollow several artists', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.del); - uri.should.equal('https://api.spotify.com/v1/me/following'); - options.query.should.eql({ + expect(method).toBe(superagent.del); + expect(uri).toBe('https://api.spotify.com/v1/me/following'); + expect(options.query).toEqual({ type: 'artist', ids: '137W8MRPWKqSmrBGDBFSop' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(); }); @@ -2935,20 +2944,20 @@ describe('Spotify Web API', function() { ); }); - it('should unfollow several artists using callback', function(done) { + test('should unfollow several artists using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.del); - uri.should.equal('https://api.spotify.com/v1/me/following'); - options.query.should.eql({ + expect(method).toBe(superagent.del); + expect(uri).toBe('https://api.spotify.com/v1/me/following'); + expect(options.query).toEqual({ type: 'artist', ids: '137W8MRPWKqSmrBGDBFSop' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { statusCode: 200 }); }); @@ -2959,25 +2968,25 @@ describe('Spotify Web API', function() { }); api.unfollowArtists(['137W8MRPWKqSmrBGDBFSop'], function(err, data) { - (200).should.equal(data.statusCode); + expect(data.statusCode).toBe(200); done(); }); }); - it('should check whether the current user follows several other users', function(done) { + test('should check whether the current user follows several other users', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me/following/contains'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me/following/contains'); + expect(options.query).toEqual({ type: 'user', ids: 'thelinmichael,wizzler' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: [true, false] }); }); @@ -2989,9 +2998,7 @@ describe('Spotify Web API', function() { api.isFollowingUsers(['thelinmichael', 'wizzler']).then( function(data) { - data.body.should.be.an.instanceOf(Array).and.have.lengthOf(2); - data.body[0].should.eql(true); - data.body[1].should.eql(false); + expect(data.body).toEqual([true, false]); done(); }, function(err) { @@ -3001,20 +3008,20 @@ describe('Spotify Web API', function() { ); }); - it('should check whether the current user follows several other users using callback', function(done) { + test('should check whether the current user follows several other users using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me/following/contains'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me/following/contains'); + expect(options.query).toEqual({ type: 'user', ids: 'thelinmichael,wizzler' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: [true, false] }); }); @@ -3025,28 +3032,26 @@ describe('Spotify Web API', function() { }); api.isFollowingUsers(['thelinmichael', 'wizzler'], function(err, data) { - should.not.exist(err); - data.body.should.be.an.instanceOf(Array).and.have.lengthOf(2); - data.body[0].should.eql(true); - data.body[1].should.eql(false); + expect(err).toBeFalsy(); + expect(data.body).toEqual([true, false]); done(); }); }); - it('should check whether the current user follows several artists', function(done) { + test('should check whether the current user follows several artists', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me/following/contains'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me/following/contains'); + expect(options.query).toEqual({ type: 'artist', ids: '137W8MRPWKqSmrBGDBFSop' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: [false] }); }); @@ -3058,8 +3063,7 @@ describe('Spotify Web API', function() { api.isFollowingArtists(['137W8MRPWKqSmrBGDBFSop']).then( function(data) { - data.body.should.be.an.instanceOf(Array).and.have.lengthOf(1); - data.body[0].should.eql(false); + expect(data.body).toEqual([false]); done(); }, function(err) { @@ -3069,20 +3073,20 @@ describe('Spotify Web API', function() { ); }); - it('should check whether the current user follows several artists using callback', function(done) { + test('should check whether the current user follows several artists using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me/following/contains'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me/following/contains'); + expect(options.query).toEqual({ type: 'artist', ids: '137W8MRPWKqSmrBGDBFSop' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: [false] }); }); @@ -3093,28 +3097,27 @@ describe('Spotify Web API', function() { }); api.isFollowingArtists(['137W8MRPWKqSmrBGDBFSop'], function(err, data) { - should.not.exist(err); - data.body.should.be.an.instanceOf(Array).and.have.lengthOf(1); - data.body[0].should.eql(false); + expect(err).toBeFalsy(); + expect(data.body).toEqual([false]); done(); }); }); - it("should get a user's followed artists using callback", function(done) { + test("should get a user's followed artists using callback", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me/following'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me/following'); + expect(options.query).toEqual({ type: 'artist', after: '6tbXwhqy3WAFqanusCLvEU', limit: 3 }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { artists: { items: [] } } }); }); @@ -3126,7 +3129,7 @@ describe('Spotify Web API', function() { api.getFollowedArtists({ after: '6tbXwhqy3WAFqanusCLvEU', limit: 3 }).then( function(data) { - should.exist(data.body.artists); + expect(data.body.artists).toBeTruthy(); done(); }, function(err) { @@ -3135,21 +3138,21 @@ describe('Spotify Web API', function() { ); }); - it("should get a user's followed artists using callback", function(done) { + test("should get a user's followed artists using callback", done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/me/following'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/me/following'); + expect(options.query).toEqual({ type: 'artist', after: '6tbXwhqy3WAFqanusCLvEU', limit: 3 }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { artists: { items: [] } } }); }); @@ -3162,28 +3165,28 @@ describe('Spotify Web API', function() { api.getFollowedArtists( { after: '6tbXwhqy3WAFqanusCLvEU', limit: 3 }, function(err, data) { - should.not.exist(err); - should.exist(data.body.artists); + expect(err).toBeFalsy(); + expect(data.body.artists).toBeTruthy(); done(); } ); }); - it('should check whether users follows a playlist', function(done) { + test('should check whether users follows a playlist', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/users/spotify_germany/playlists/2nKFnGNFvHX9hG5Kv7Bm3G/followers/contains' ); - options.query.should.eql({ + expect(options.query).toEqual({ ids: 'thelinmichael,ella' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: [true, false] }); }); @@ -3200,9 +3203,7 @@ describe('Spotify Web API', function() { ]) .then( function(data) { - data.body.should.be.an.instanceOf(Array).and.have.lengthOf(2); - data.body[0].should.eql(true); - data.body[1].should.eql(false); + expect(data.body).toEqual([true, false]); done(); }, function(err) { @@ -3212,22 +3213,21 @@ describe('Spotify Web API', function() { ); }); - it('should add tracks to playlist', function(done) { + test('should add tracks to playlist', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.post); - uri.should.equal( + expect(method).toBe(superagent.post); + expect(uri).toBe( 'https://api.spotify.com/v1/users/thelinmichael/playlists/5ieJqeLJjjI8iJWaxeBLuK/tracks' ); - should.not.exist(options.query); - JSON.parse(options.data) - ['uris'].should.be.an.instanceOf(Array) - .and.have.lengthOf(2); - options.headers.Authorization.should.equal('Bearer long-access-token'); + expect(options.query).toBeFalsy(); + expect(JSON.parse(options.data)['uris']).toBeInstanceOf(Array); + expect(JSON.parse(options.data)['uris']).toHaveLength(2); + expect(options.headers.Authorization).toBe('Bearer long-access-token'); callback(); }); @@ -3250,22 +3250,21 @@ describe('Spotify Web API', function() { ); }); - it('should add tracks to playlist using callback', function(done) { + test('should add tracks to playlist using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.post); - uri.should.equal( + expect(method).toBe(superagent.post); + expect(uri).toBe( 'https://api.spotify.com/v1/users/thelinmichael/playlists/5ieJqeLJjjI8iJWaxeBLuK/tracks' ); - should.not.exist(options.query); - JSON.parse(options.data) - ['uris'].should.be.an.instanceOf(Array) - .and.have.lengthOf(2); - options.headers.Authorization.should.equal('Bearer long-access-token'); + expect(options.query).toBeFalsy(); + expect(JSON.parse(options.data)['uris']).toBeInstanceOf(Array); + expect(JSON.parse(options.data)['uris']).toHaveLength(2); + expect(options.headers.Authorization).toBe('Bearer long-access-token'); callback(); }); @@ -3286,24 +3285,21 @@ describe('Spotify Web API', function() { ); }); - it('should remove tracks from a playlist by position', function(done) { - sinon.stub(HttpManager, '_makeRequest', function( - method, - options, - uri, - callback - ) { - method.should.equal(superagent.del); - uri.should.equal( + test('should remove tracks from a playlist by position', done => { + sinon.stub(HttpManager, 'del', function(request, callback) { + expect(request.getURI()).toBe( 'https://api.spotify.com/v1/users/thelinmichael/playlists/5ieJqeLJjjI8iJWaxeBLuK/tracks' ); - should.not.exist(options.query); - JSON.parse(options.data).positions[0].should.equal(0); - JSON.parse(options.data).positions[1].should.equal(2); - JSON.parse(options.data)['snapshot_id'].should.equal( + expect(request.getQueryParameters()).toBeFalsy(); + var data = request.getBodyParameters(); + expect(data.positions[0]).toBe(0); + expect(data.positions[1]).toBe(2); + expect(data['snapshot_id']).toBe( '0wD+DKCUxiSR/WY8lF3fiCTb7Z8X4ifTUtqn8rO82O4Mvi5wsX8BsLj7IbIpLVM9' ); - options.headers.Authorization.should.equal('Bearer long-access-token'); + expect(request.getHeaders().Authorization).toBe( + 'Bearer long-access-token' + ); callback(); }); @@ -3325,25 +3321,25 @@ describe('Spotify Web API', function() { ); }); - it('should reorder tracks from a playlist by position', function(done) { + test('should reorder tracks from a playlist by position', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - uri.should.equal( + expect(method).toBe(superagent.put); + expect(uri).toBe( 'https://api.spotify.com/v1/users/thelinmichael/playlists/5ieJqeLJjjI8iJWaxeBLuK/tracks' ); - should.not.exist(options.query); - JSON.parse(options.data)['range_start'].should.equal(5); - JSON.parse(options.data)['range_length'].should.equal(1); - JSON.parse(options.data)['insert_before'].should.equal(1512); - JSON.parse(options.data)['snapshot_id'].should.equal( + expect(options.query).toBeFalsy(); + expect(JSON.parse(options.data)['range_start']).toBe(5); + expect(JSON.parse(options.data)['range_length']).toBe(1); + expect(JSON.parse(options.data)['insert_before']).toBe(1512); + expect(JSON.parse(options.data)['snapshot_id']).toBe( '0wD+DKCUxiSR/WY8lF3fiCTb7Z8X4ifTUtqn8rO82O4Mvi5wsX8BsLj7IbIpLVM9' ); - options.headers.Authorization.should.equal('Bearer long-access-token'); + expect(options.headers.Authorization).toBe('Bearer long-access-token'); callback(); }); @@ -3373,18 +3369,18 @@ describe('Spotify Web API', function() { ); }); - it('should add tracks to the users library', function(done) { + test('should add tracks to the users library', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - JSON.parse(options.data).should.eql(['3VNWq8rTnQG6fM1eldSpZ0']); - uri.should.equal('https://api.spotify.com/v1/me/tracks'); - should.not.exist(options.query); - options.headers.Authorization.should.equal('Bearer myAccessToken'); + expect(method).toBe(superagent.put); + expect(JSON.parse(options.data)).toEqual(['3VNWq8rTnQG6fM1eldSpZ0']); + expect(uri).toBe('https://api.spotify.com/v1/me/tracks'); + expect(options.query).toBeFalsy(); + expect(options.headers.Authorization).toBe('Bearer myAccessToken'); callback(); }); @@ -3405,18 +3401,18 @@ describe('Spotify Web API', function() { ); }); - it('should add tracks to the users library using callback', function(done) { + test('should add tracks to the users library using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - JSON.parse(options.data).should.eql(['3VNWq8rTnQG6fM1eldSpZ0']); - uri.should.equal('https://api.spotify.com/v1/me/tracks'); - should.not.exist(options.query); - options.headers.Authorization.should.equal('Bearer myAccessToken'); + expect(method).toBe(superagent.put); + expect(JSON.parse(options.data)).toEqual(['3VNWq8rTnQG6fM1eldSpZ0']); + expect(uri).toBe('https://api.spotify.com/v1/me/tracks'); + expect(options.query).toBeFalsy(); + expect(options.headers.Authorization).toBe('Bearer myAccessToken'); callback(); }); @@ -3431,18 +3427,18 @@ describe('Spotify Web API', function() { }); }); - it('handles expired tokens', function(done) { + test('handles expired tokens', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - JSON.parse(options.data).should.eql(['3VNWq8rTnQG6fM1eldSpZ0']); - uri.should.equal('https://api.spotify.com/v1/me/tracks'); - should.not.exist(options.query); - options.headers.Authorization.should.equal( + expect(method).toBe(superagent.put); + expect(JSON.parse(options.data)).toEqual(['3VNWq8rTnQG6fM1eldSpZ0']); + expect(uri).toBe('https://api.spotify.com/v1/me/tracks'); + expect(options.query).toBeFalsy(); + expect(options.headers.Authorization).toBe( 'Bearer BQAGn9m9tRK96oUcc7962erAWydSShZ-geyZ1mcHSmDSfsoRKmhsz_g2ZZwBDlbRuKTUAb4RjGFFybDm0Kvv-7UNR608ff7nk0u9YU4nM6f9HeRhYXprgmZXQHhBKFfyxaVetvNnPMCBctf05vJcHbpiZBL3-WLQhScTrMExceyrfQ7g' ); @@ -3461,25 +3457,25 @@ describe('Spotify Web API', function() { done(new Error('should have failed')); }, function(err) { - 'The access token expired'.should.equal(err.message); - (401).should.equal(err.statusCode); + expect(err.message).toBe('The access token expired'); + expect(err.statusCode).toBe(401); done(); } ); }); - it('handles expired tokens using callback', function(done) { + test('handles expired tokens using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.put); - JSON.parse(options.data).should.eql(['3VNWq8rTnQG6fM1eldSpZ0']); - uri.should.equal('https://api.spotify.com/v1/me/tracks'); - should.not.exist(options.query); - options.headers.Authorization.should.equal( + expect(method).toBe(superagent.put); + expect(options.data).toEqual(JSON.stringify(['3VNWq8rTnQG6fM1eldSpZ0'])); + expect(uri).toBe('https://api.spotify.com/v1/me/tracks'); + expect(options.query).toBeFalsy(); + expect(options.headers.Authorization).toBe( 'Bearer BQAGn9m9tRK96oUcc7962erAWydSShZ-geyZ1mcHSmDSfsoRKmhsz_g2ZZwBDlbRuKTUAb4RjGFFybDm0Kvv-7UNR608ff7nk0u9YU4nM6f9HeRhYXprgmZXQHhBKFfyxaVetvNnPMCBctf05vJcHbpiZBL3-WLQhScTrMExceyrfQ7g' ); @@ -3494,27 +3490,27 @@ describe('Spotify Web API', function() { }); api.addToMySavedTracks(['3VNWq8rTnQG6fM1eldSpZ0'], function(err, data) { - 'The access token expired'.should.equal(err.message); - (401).should.equal(err.statusCode); + expect(err.message).toBe('The access token expired'); + expect(err.statusCode).toBe(401); done(); }); }); - it('should get new releases', function(done) { + test('should get new releases', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/browse/new-releases'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/browse/new-releases'); + expect(options.query).toEqual({ limit: 5, offset: 0, country: 'SE' }); - options.headers.Authorization.should.equal('Bearer myAccessToken'); + expect(options.headers.Authorization).toBe('Bearer myAccessToken'); callback(null, { body: { albums: { @@ -3540,10 +3536,10 @@ describe('Spotify Web API', function() { }) .then( function(data) { - data.body.albums.href.should.equal( + expect(data.body.albums.href).toBe( 'https://api.spotify.com/v1/browse/new-releases?country=SE&offset=0&limit=5' ); - data.body.albums.items.length.should.equal(5); + expect(data.body.albums.items.length).toBe(5); done(); }, function(err) { @@ -3552,21 +3548,21 @@ describe('Spotify Web API', function() { ); }); - it('should get new releases', function(done) { + test('should get new releases', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/browse/new-releases'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/browse/new-releases'); + expect(options.query).toEqual({ limit: 5, offset: 0, country: 'SE' }); - options.headers.Authorization.should.equal('Bearer myAccessToken'); + expect(options.headers.Authorization).toBe('Bearer myAccessToken'); callback(null, { body: { albums: { @@ -3592,34 +3588,34 @@ describe('Spotify Web API', function() { country: 'SE' }, function(err, data) { - should.not.exist(err); - data.body.albums.href.should.equal( + expect(err).toBeFalsy(); + expect(data.body.albums.href).toBe( 'https://api.spotify.com/v1/browse/new-releases?country=SE&offset=0&limit=5' ); - data.body.albums.items.length.should.equal(5); - (200).should.equal(data.statusCode); + expect(data.body.albums.items.length).toBe(5); + expect(data.statusCode).toBe(200); done(); } ); }); - it('should get featured playlists', function(done) { + test('should get featured playlists', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/browse/featured-playlists'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/browse/featured-playlists'); + expect(options.query).toEqual({ limit: 3, offset: 1, country: 'SE', locale: 'sv_SE', timestamp: '2014-10-23T09:00:00' }); - options.headers.Authorization.should.equal('Bearer myAccessToken'); + expect(options.headers.Authorization).toBe('Bearer myAccessToken'); callback(null, { body: { playlists: { @@ -3648,11 +3644,11 @@ describe('Spotify Web API', function() { }) .then( function(data) { - data.body.playlists.href.should.equal( + expect(data.body.playlists.href).toBe( 'https://api.spotify.com/v1/browse/featured-playlists?country=SE&locale=sv_SE×tamp=2014-10-23T09:00:00&offset=1&limit=3' ); - data.body.playlists.items.length.should.equal(3); - (200).should.equal(data.statusCode); + expect(data.body.playlists.items.length).toBe(3); + expect(data.statusCode).toBe(200); done(); }, function(err) { @@ -3662,23 +3658,23 @@ describe('Spotify Web API', function() { ); }); - it('should get featured playlists using callback', function(done) { + test('should get featured playlists using callback', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/browse/featured-playlists'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/browse/featured-playlists'); + expect(options.query).toEqual({ limit: 3, offset: 1, country: 'SE', locale: 'sv_SE', timestamp: '2014-10-23T09:00:00' }); - options.headers.Authorization.should.equal('Bearer myAccessToken'); + expect(options.headers.Authorization).toBe('Bearer myAccessToken'); callback(null, { body: { playlists: { @@ -3706,33 +3702,33 @@ describe('Spotify Web API', function() { timestamp: '2014-10-23T09:00:00' }, function(err, data) { - should.not.exist(err); - data.body.playlists.href.should.equal( + expect(err).toBeFalsy(); + expect(data.body.playlists.href).toBe( 'https://api.spotify.com/v1/browse/featured-playlists?country=SE&locale=sv_SE×tamp=2014-10-23T09:00:00&offset=1&limit=3' ); - data.body.playlists.items.length.should.equal(3); - (200).should.equal(data.statusCode); + expect(data.body.playlists.items.length).toBe(3); + expect(data.statusCode).toBe(200); done(); } ); }); - it('should get browse categories', function(done) { + test('should get browse categories', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/browse/categories'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/browse/categories'); + expect(options.query).toEqual({ limit: 2, offset: 4, country: 'SE', locale: 'sv_SE' }); - options.headers.Authorization.should.equal('Bearer myAccessToken'); + expect(options.headers.Authorization).toBe('Bearer myAccessToken'); callback(null, { body: { items: [ @@ -3758,34 +3754,34 @@ describe('Spotify Web API', function() { locale: 'sv_SE' }, function(err, data) { - should.not.exist(err); - data.body.items[0].href.should.equal( + expect(err).toBeFalsy(); + expect(data.body.items[0].href).toBe( 'https://api.spotify.com/v1/browse/categories/party' ); - data.body.items[1].href.should.equal( + expect(data.body.items[1].href).toBe( 'https://api.spotify.com/v1/browse/categories/pop' ); - data.body.items.length.should.equal(2); - (200).should.equal(data.statusCode); + expect(data.body.items.length).toBe(2); + expect(data.statusCode).toBe(200); done(); } ); }); - it('should get a browse category', function(done) { + test('should get a browse category', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/browse/categories/party'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/browse/categories/party'); + expect(options.query).toEqual({ country: 'SE', locale: 'sv_SE' }); - options.headers.Authorization.should.equal('Bearer myAccessToken'); + expect(options.headers.Authorization).toBe('Bearer myAccessToken'); callback(null, { body: { href: 'https://api.spotify.com/v1/browse/categories/party', @@ -3808,34 +3804,34 @@ describe('Spotify Web API', function() { locale: 'sv_SE' }, function(err, data) { - should.not.exist(err); - data.body.href.should.equal( + expect(err).toBeFalsy(); + expect(data.body.href).toBe( 'https://api.spotify.com/v1/browse/categories/party' ); - data.body.name.should.equal('Party'); - (200).should.equal(data.statusCode); + expect(data.body.name).toBe('Party'); + expect(data.statusCode).toBe(200); done(); } ); }); - it('should get a playlists for a browse category', function(done) { + test('should get a playlists for a browse category', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/browse/categories/party/playlists' ); - options.query.should.eql({ + expect(options.query).toEqual({ country: 'SE', limit: 2, offset: 1 }); - options.headers.Authorization.should.equal('Bearer myAccessToken'); + expect(options.headers.Authorization).toBe('Bearer myAccessToken'); callback(null, { body: { playlists: { @@ -3869,36 +3865,36 @@ describe('Spotify Web API', function() { offset: 1 }, function(err, data) { - should.not.exist(err); - data.body.playlists.items[0].href.should.equal( + expect(err).toBeFalsy(); + expect(data.body.playlists.items[0].href).toBe( 'https://api.spotify.com/v1/users/spotifybrazilian/playlists/4k7EZPI3uKMz4aRRrLVfen' ); - data.body.playlists.items[1].href.should.equal( + expect(data.body.playlists.items[1].href).toBe( 'https://api.spotify.com/v1/users/spotifybrazilian/playlists/4HZh0C9y80GzHDbHZyX770' ); - data.body.playlists.items.length.should.equal(2); - (200).should.equal(data.statusCode); + expect(data.body.playlists.items.length).toBe(2); + expect(data.statusCode).toBe(200); done(); } ); }); - it('should get the audio features for a track', function(done) { + test('should get the audio features for a track', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/audio-features/3Qm86XLflmIXVm1wcwkgDK' ); - should.not.exist(options.query); - should.not.exist(options.data); + expect(options.query).toBeFalsy(); + expect(options.data).toBeFalsy(); callback(null, { body: { - danceability: 0, + danceability: 20, energy: 0 } }); @@ -3908,7 +3904,7 @@ describe('Spotify Web API', function() { api.getAudioFeaturesForTrack('3Qm86XLflmIXVm1wcwkgDK').then( function(data) { - should.exist(data.body.danceability); + expect(data.body.danceability).toBe(20); done(); }, function(err) { @@ -3917,19 +3913,19 @@ describe('Spotify Web API', function() { ); }); - it('should get the audio features for a several tracks', function(done) { + test('should get the audio features for a several tracks', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/audio-features'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/audio-features'); + expect(options.query).toEqual({ ids: '3Qm86XLflmIXVm1wcwkgDK,1lDWb6b6ieDQ2xT7ewTC3G' }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { audio_features: [] @@ -3946,7 +3942,7 @@ describe('Spotify Web API', function() { ]) .then( function(data) { - should.exist(data.body.audio_features); + expect(data.body.audio_features).toBeTruthy(); done(); }, function(err) { @@ -3955,23 +3951,23 @@ describe('Spotify Web API', function() { ); }); - it('should get recommendations', function(done) { + test('should get recommendations', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/recommendations'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/recommendations'); + expect(options.query).toEqual({ min_energy: 0.4, market: 'ES', seed_artists: '6mfK6Q2tzLMEchAr0e9Uzu,4DYFVNKZ1uixa6SQTvzQwJ', limit: 5, min_popularity: 50 }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { tracks: [{}], @@ -3992,7 +3988,7 @@ describe('Spotify Web API', function() { }) .then( function(data) { - should.exist(data.body.tracks); + expect(data.body.tracks).toBeTruthy(); done(); }, function(err) { @@ -4001,23 +3997,23 @@ describe('Spotify Web API', function() { ); }); - it('should get recommendations using an array of seeds', function(done) { + test('should get recommendations using an array of seeds', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal('https://api.spotify.com/v1/recommendations'); - options.query.should.eql({ + expect(method).toBe(superagent.get); + expect(uri).toBe('https://api.spotify.com/v1/recommendations'); + expect(options.query).toEqual({ min_energy: 0.4, market: 'ES', seed_artists: '6mfK6Q2tzLMEchAr0e9Uzu,4DYFVNKZ1uixa6SQTvzQwJ', limit: 5, min_popularity: 50 }); - should.not.exist(options.data); + expect(options.data).toBeFalsy(); callback(null, { body: { tracks: [{}], @@ -4038,7 +4034,7 @@ describe('Spotify Web API', function() { }) .then( function(data) { - should.exist(data.body.tracks); + expect(data.body.tracks).toBeTruthy(); done(); }, function(err) { @@ -4047,19 +4043,19 @@ describe('Spotify Web API', function() { ); }); - it('should get available genre seeds', function(done) { + test('should get available genre seeds', done => { sinon.stub(HttpManager, '_makeRequest', function( method, options, uri, callback ) { - method.should.equal(superagent.get); - uri.should.equal( + expect(method).toBe(superagent.get); + expect(uri).toBe( 'https://api.spotify.com/v1/recommendations/available-genre-seeds' ); - should.not.exist(options.query); - should.not.exist(options.data); + expect(options.query).toBeFalsy(); + expect(options.data).toBeFalsy(); callback(null, { body: { genres: [] @@ -4071,7 +4067,7 @@ describe('Spotify Web API', function() { api.getAvailableGenreSeeds().then( function(data) { - should.exist(data.body.genres); + expect(data.body.genres).toBeTruthy(); done(); }, function(err) { diff --git a/__tests__/webapi-error.js b/__tests__/webapi-error.js new file mode 100644 index 00000000..08b8d8eb --- /dev/null +++ b/__tests__/webapi-error.js @@ -0,0 +1,9 @@ +var WebApiError = require('../src/webapi-error'); + +describe('Create Web Api Error', () => { + test('should create error with message and status code', () => { + var error = new WebApiError('Something has gone terribly wrong!', 500); + expect(error.message).toBe('Something has gone terribly wrong!'); + expect(error.statusCode).toBe(500); + }); +}); diff --git a/__tests__/webapi-request.js b/__tests__/webapi-request.js new file mode 100644 index 00000000..99955ab0 --- /dev/null +++ b/__tests__/webapi-request.js @@ -0,0 +1,29 @@ +var WebApiRequest = require('../src/webapi-request'); + +describe('Create Web Api Requests', () => { + test('Should use default settings if none are supplied', () => { + var request = WebApiRequest.builder('token').build(); + + expect(request.getHost()).toBe('api.spotify.com'); + expect(request.getPort()).toBe(443); + expect(request.getScheme()).toBe('https'); + expect(request.getHeaders().Authorization).toBeTruthy(); + expect(request.getPath()).toBeFalsy(); + expect(request.getQueryParameters()).toBeFalsy(); + expect(request.getBodyParameters()).toBeFalsy(); + }); + + test('Can overwrite one of the default parameters', () => { + var request = WebApiRequest.builder('token') + .withHost('such.host.wow') + .build(); + + expect(request.getHost()).toBe('such.host.wow'); + expect(request.getPort()).toBe(443); + expect(request.getScheme()).toBe('https'); + expect(request.getHeaders().Authorization).toBeTruthy(); + expect(request.getPath()).toBeFalsy(); + expect(request.getQueryParameters()).toBeFalsy(); + expect(request.getBodyParameters()).toBeFalsy(); + }); +}); diff --git a/package-lock.json b/package-lock.json index e4583380..1bf14db6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,9 +23,9 @@ "sha512-r4snW6Q8ICL3Y8hGzYJRvyG/+sc+kvkewXNedG9tQjoHmUFMwMSv/o45GWQUQswevGnWghiGkpRPivFfOuMsOA==", "dev": true, "requires": { - "chalk": "2.4.1", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -36,7 +36,7 @@ "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -46,9 +46,9 @@ "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -59,7 +59,7 @@ "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -70,19 +70,6 @@ "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", "dev": true }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": - "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "acorn": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", - "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=", - "dev": true - }, "acorn-globals": { "version": "4.1.0", "resolved": @@ -91,7 +78,7 @@ "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", "dev": true, "requires": { - "acorn": "5.5.3" + "acorn": "^5.0.0" }, "dependencies": { "acorn": { @@ -109,12 +96,30 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "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.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, "ansi-escapes": { "version": "1.4.0", "resolved": @@ -143,6 +148,29 @@ "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=", "dev": true }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": + "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": + "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, "app-root-path": { "version": "2.0.1", "resolved": @@ -150,6 +178,16 @@ "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", "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" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -157,7 +195,7 @@ "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -166,7 +204,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -190,13 +228,6 @@ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, - "array-find-index": { - "version": "1.0.2", - "resolved": - "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, "array-unique": { "version": "0.2.1", "resolved": @@ -204,6 +235,12 @@ "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 + }, "asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", @@ -224,6 +261,14 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "astral-regex": { + "version": "1.0.0", + "resolved": + "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": + "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", @@ -263,6 +308,282 @@ "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", "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-core": { + "version": "6.26.0", + "resolved": + "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": + "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": + "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": + "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "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" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": + "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": + "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-jest": { + "version": "22.4.3", + "resolved": + "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.3.tgz", + "integrity": + "sha512-BgSjmtl3mW3i+VeVHEr9d2zFSAT66G++pJcHQiUjd00pkW+voYXFctIm/indcqOWWXw5a1nUpR1XWszD9fJ1qg==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.5", + "babel-preset-jest": "^22.4.3" + } + }, + "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.22.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": + "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": + "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + }, + "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" + } + } + } + }, + "babel-plugin-jest-hoist": { + "version": "22.4.3", + "resolved": + "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.3.tgz", + "integrity": + "sha512-zhvv4f6OTWy2bYevcJftwGCWXMFe7pqoz41IhMi4xna7xNsX5NygdagsrE0y6kkfuXq8UalwvPwKTyAxME2E/g==", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": + "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-preset-jest": { + "version": "22.4.3", + "resolved": + "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.3.tgz", + "integrity": + "sha512-a+M3LTEXTq3gxv0uBN9Qm6ahUl7a8pj923nFbCUdqFUSsf3YrX8Uc+C3MEwji5Af3LiQjSC7w4ooYewlz8HRTA==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^22.4.3", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": + "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "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" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": + "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": + "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": + "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + } + } + }, + "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.4.0", + "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": + "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": @@ -277,13 +598,13 @@ "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -293,7 +614,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -304,7 +625,7 @@ "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -315,7 +636,7 @@ "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -326,9 +647,9 @@ "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -355,29 +676,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" - } - }, - "blanket": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/blanket/-/blanket-1.2.3.tgz", - "integrity": "sha1-FRtJh8O9hFUrtfA7kO9fflkx5HM=", - "dev": true, - "requires": { - "acorn": "1.2.2", - "falafel": "1.2.0", - "foreach": "2.0.5", - "isarray": "0.0.1", - "object-keys": "1.0.11", - "xtend": "4.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 - } + "tweetnacl": "^0.14.3" } }, "boom": { @@ -386,7 +685,7 @@ "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "brace-expansion": { @@ -397,7 +696,7 @@ "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -407,9 +706,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "browser-process-hrtime": { @@ -429,6 +728,15 @@ "resolve": "1.1.7" } }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, "buffer-from": { "version": "1.0.0", "resolved": @@ -452,15 +760,15 @@ "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" }, "dependencies": { "isobject": { @@ -478,40 +786,35 @@ "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", "dev": true }, - "camelcase-keys": { - "version": "2.1.0", + "center-align": { + "version": "0.1.3", "resolved": - "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, + "optional": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.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" + "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" } }, "ci-info": { @@ -529,10 +832,10 @@ "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -542,7 +845,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "isobject": { @@ -561,7 +864,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "cli-spinners": { @@ -579,7 +882,29 @@ "dev": true, "requires": { "slice-ansi": "0.0.4", - "string-width": "1.0.2" + "string-width": "^1.0.1" + } + }, + "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.1", + "right-align": "^0.1.1", + "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 + } } }, "co": { @@ -595,13 +920,6 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, - "coffeescript": { - "version": "1.10.0", - "resolved": - "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", - "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", - "dev": true - }, "collection-visit": { "version": "1.0.0", "resolved": @@ -609,8 +927,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color-convert": { @@ -621,7 +939,7 @@ "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -631,19 +949,13 @@ "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 - }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -653,6 +965,14 @@ "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, + "compare-versions": { + "version": "3.1.0", + "resolved": + "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz", + "integrity": + "sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ==", + "dev": true + }, "component-emitter": { "version": "1.2.1", "resolved": @@ -666,6 +986,13 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "convert-source-map": { + "version": "1.5.1", + "resolved": + "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, "cookiejar": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", @@ -678,6 +1005,12 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "core-js": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", + "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": @@ -692,10 +1025,10 @@ "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", "dev": true, "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.11.0", - "parse-json": "4.0.0", - "require-from-string": "2.0.2" + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0", + "require-from-string": "^2.0.1" }, "dependencies": { "esprima": { @@ -712,8 +1045,8 @@ "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "parse-json": { @@ -723,8 +1056,8 @@ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.2" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } } } @@ -750,9 +1083,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.2.14" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, "dependencies": { "lru-cache": { @@ -763,8 +1096,8 @@ "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } } } @@ -775,7 +1108,7 @@ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "dev": true, "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "cssom": { @@ -790,17 +1123,7 @@ "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", "dev": true, "requires": { - "cssom": "0.3.2" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": - "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "1.0.2" + "cssom": "0.3.x" } }, "dashdash": { @@ -809,7 +1132,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -828,9 +1151,9 @@ "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==", "dev": true, "requires": { - "abab": "1.0.4", - "whatwg-mimetype": "2.1.0", - "whatwg-url": "6.4.1" + "abab": "^1.0.4", + "whatwg-mimetype": "^2.0.0", + "whatwg-url": "^6.4.0" } }, "date-fns": { @@ -840,17 +1163,6 @@ "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", "dev": true }, - "dateformat": { - "version": "1.0.12", - "resolved": - "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -886,6 +1198,27 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "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" + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": + "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "^2.0.5", + "object-keys": "^1.0.8" + } + }, "define-property": { "version": "2.0.2", "resolved": @@ -894,8 +1227,8 @@ "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -906,7 +1239,7 @@ "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -917,7 +1250,7 @@ "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -928,9 +1261,9 @@ "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -955,10 +1288,21 @@ "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "diff": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz", - "integrity": "sha1-JLuwAcSn1VIhaefKvbLCgU7ZHPQ=", + "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.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": + "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", "dev": true }, "domexception": { @@ -969,7 +1313,7 @@ "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, "requires": { - "webidl-conversions": "4.0.2" + "webidl-conversions": "^4.0.2" } }, "ecc-jsbn": { @@ -979,7 +1323,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "elegant-spinner": { @@ -995,7 +1339,34 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.11.0", + "resolved": + "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", + "integrity": + "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", + "dev": true, + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": + "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" } }, "escape-string-regexp": { @@ -1012,11 +1383,11 @@ "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", "dev": true, "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.6.1" + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "dependencies": { "esprima": { @@ -1046,12 +1417,15 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, - "eventemitter2": { - "version": "0.4.14", - "resolved": - "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true + "exec-sh": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.1.tgz", + "integrity": + "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", + "dev": true, + "requires": { + "merge": "^1.1.3" + } }, "execa": { "version": "0.9.0", @@ -1060,13 +1434,13 @@ "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==", "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" + "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" } }, "exit": { @@ -1088,7 +1462,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -1098,7 +1472,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" } }, "expect": { @@ -1108,12 +1482,12 @@ "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "jest-diff": "22.4.3", - "jest-get-type": "22.4.3", - "jest-matcher-utils": "22.4.3", - "jest-message-util": "22.4.3", - "jest-regex-util": "22.4.3" + "ansi-styles": "^3.2.0", + "jest-diff": "^22.4.3", + "jest-get-type": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-regex-util": "^22.4.3" }, "dependencies": { "ansi-styles": { @@ -1124,7 +1498,7 @@ "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } } } @@ -1141,8 +1515,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -1153,7 +1527,7 @@ "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -1164,7 +1538,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" }, "dependencies": { "is-extglob": { @@ -1183,26 +1557,6 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, - "falafel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-1.2.0.tgz", - "integrity": "sha1-wY0k71CRF0pJfzGM0ksCaiXN2rQ=", - "dev": true, - "requires": { - "acorn": "1.2.2", - "foreach": "2.0.5", - "isarray": "0.0.1", - "object-keys": "1.0.11" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, "fast-deep-equal": { "version": "1.1.0", "resolved": @@ -1224,12 +1578,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "faye-websocket": { - "version": "0.4.4", + "fb-watchman": { + "version": "2.0.0", "resolved": - "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz", - "integrity": "sha1-wUxbO/FNdBf/v9mQwKdJXNnzN7w=", - "dev": true + "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } }, "figures": { "version": "1.7.0", @@ -1237,8 +1594,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "filename-regex": { @@ -1248,6 +1605,16 @@ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, "fill-range": { "version": "2.2.3", "resolved": @@ -1255,11 +1622,11 @@ "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" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "find-parent-dir": { @@ -1275,33 +1642,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "findup-sync": { - "version": "0.3.0", - "resolved": - "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "requires": { - "glob": "5.0.15" - }, - "dependencies": { - "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.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "for-in": { @@ -1316,7 +1658,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "foreach": { @@ -1338,9 +1680,9 @@ "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", "requires": { - "async": "1.5.2", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "async": "^1.5.2", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.10" } }, "formatio": { @@ -1349,7 +1691,7 @@ "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", "dev": true, "requires": { - "samsam": "1.1.3" + "samsam": "~1.1" } }, "formidable": { @@ -1366,7 +1708,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "fs.realpath": { @@ -1376,377 +1718,720 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", - "dev": true, - "requires": { - "globule": "0.1.0" - } - }, - "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" - } - }, - "get-own-enumerable-property-symbols": { - "version": "2.0.1", - "resolved": - "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz", + "fsevents": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.2.tgz", "integrity": - "sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "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 - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", - "dev": true - }, - "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" - }, - "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 - } - } - }, - "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", - "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=", + "sha512-iownA+hC4uHFp+7gwP/y5SzaiUo7m2vpa0dhpzw8YuKtiZsz7cIXsFbXpLEeBM6WuCQyw1MH4RRe6XI8GFUctQ==", "dev": true, + "optional": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "nan": "^2.9.2", + "node-pre-gyp": "^0.9.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=", + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, "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=", + "aproba": { + "version": "1.2.0", + "bundled": true, "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, "requires": { - "is-extglob": "1.0.0" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } - } - } - }, - "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" - }, - "dependencies": { - "is-extglob": { + }, + "balanced-match": { "version": "1.0.0", - "resolved": - "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "bundled": true, "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=", + "brace-expansion": { + "version": "1.1.11", + "bundled": true, "dev": true, "requires": { - "is-extglob": "1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } - } - } - }, - "globule": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", - "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", - "dev": true, - "requires": { - "glob": "3.1.21", - "lodash": "1.0.2", - "minimatch": "0.2.14" - }, - "dependencies": { - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + }, + "chownr": { + "version": "1.0.1", + "bundled": true, "dev": true, - "requires": { - "graceful-fs": "1.2.3", - "inherits": "1.0.2", - "minimatch": "0.2.14" - } + "optional": true }, - "graceful-fs": { - "version": "1.2.3", - "resolved": - "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "code-point-at": { + "version": "1.1.0", + "bundled": true, "dev": true }, - "inherits": { - "version": "1.0.2", - "resolved": - "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "concat-map": { + "version": "0.0.1", + "bundled": true, "dev": true }, - "lodash": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", - "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "console-control-strings": { + "version": "1.1.0", + "bundled": true, "dev": true }, - "minimatch": { - "version": "0.2.14", - "resolved": - "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, "dev": true, + "optional": true, "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" + "ms": "2.0.0" } - } - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": - "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "growl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz", - "integrity": "sha1-3i1mE20ALhErpw8/EMMc98NQsto=", - "dev": true - }, - "grunt": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.2.tgz", - "integrity": "sha1-TmpeaVtwRy/VME9fqeNCNoNqc7w=", - "dev": true, - "requires": { - "coffeescript": "1.10.0", - "dateformat": "1.0.12", - "eventemitter2": "0.4.14", - "exit": "0.1.2", - "findup-sync": "0.3.0", - "glob": "7.0.6", - "grunt-cli": "1.2.0", - "grunt-known-options": "1.1.0", - "grunt-legacy-log": "1.0.1", - "grunt-legacy-util": "1.0.0", - "iconv-lite": "0.4.21", - "js-yaml": "3.5.5", - "minimatch": "3.0.4", - "nopt": "3.0.6", - "path-is-absolute": "1.0.1", - "rimraf": "2.2.8" - }, - "dependencies": { - "grunt-cli": { - "version": "1.2.0", - "resolved": - "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, "dev": true, + "optional": true, "requires": { - "findup-sync": "0.3.0", - "grunt-known-options": "1.1.0", - "nopt": "3.0.6", - "resolve": "1.1.7" + "minipass": "^2.2.1" } }, - "js-yaml": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", - "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, "dev": true, + "optional": true, "requires": { - "argparse": "1.0.10", - "esprima": "2.7.3" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } - } - } - }, - "grunt-contrib-watch": { - "version": "0.6.1", - "resolved": - "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.6.1.tgz", - "integrity": "sha1-ZP3LolpjX1tNobbOb5DaCutuPxU=", - "dev": true, - "requires": { - "async": "0.2.10", - "gaze": "0.5.2", - "lodash": "2.4.2", - "tiny-lr-fork": "0.0.5" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.9.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, "dev": true }, - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, "dev": true } } }, - "grunt-known-options": { - "version": "1.1.0", + "function-bind": { + "version": "1.1.1", "resolved": - "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", - "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", + "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": + "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "grunt-legacy-log": { - "version": "1.0.1", + "generate-function": { + "version": "2.0.0", "resolved": - "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.1.tgz", - "integrity": - "sha512-rwuyqNKlI0IPz0DvxzJjcEiQEBaBNVeb1LFoZKxSmHLETFUwhwUrqOsPIxURTKSwNZHZ4ht1YLBYmVU0YZAzHQ==", + "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": { - "colors": "1.1.2", - "grunt-legacy-log-utils": "1.0.0", - "hooker": "0.2.3", - "lodash": "4.17.10", - "underscore.string": "3.3.4" + "is-property": "^1.0.0" } }, - "grunt-legacy-log-utils": { - "version": "1.0.0", + "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-own-enumerable-property-symbols": { + "version": "2.0.1", + "resolved": + "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz", + "integrity": + "sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", "resolved": - "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", - "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", + "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "chalk": "1.1.3", - "lodash": "4.3.0" + "assert-plus": "^1.0.0" }, "dependencies": { - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", + "assert-plus": { + "version": "1.0.0", + "resolved": + "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true } } }, - "grunt-legacy-util": { - "version": "1.0.0", - "resolved": - "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", - "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "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": { - "async": "1.5.2", - "exit": "0.1.2", - "getobject": "0.1.0", - "hooker": "0.2.3", - "lodash": "4.3.0", - "underscore.string": "3.2.3", - "which": "1.2.14" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" }, "dependencies": { - "lodash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", - "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", + "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 }, - "underscore.string": { - "version": "3.2.3", + "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": "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" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", "resolved": - "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", - "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", + "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" + } } } }, - "grunt-simple-mocha": { - "version": "0.4.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 + }, + "graceful-fs": { + "version": "4.1.11", "resolved": - "https://registry.npmjs.org/grunt-simple-mocha/-/grunt-simple-mocha-0.4.1.tgz", - "integrity": "sha1-V5RJJJ6vCoGHj6cvPtq1FF1F/Xc=", + "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": + "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { - "mocha": "1.20.1" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "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": ">=0.0.4" + } + } } }, "har-schema": { @@ -1763,10 +2448,19 @@ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", "dev": true, "requires": { - "chalk": "1.1.3", - "commander": "2.15.1", - "is-my-json-valid": "2.17.2", - "pinkie-promise": "2.0.1" + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^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.0.2" } }, "has-ansi": { @@ -1775,7 +2469,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -1790,9 +2484,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -1811,8 +2505,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -1822,7 +2516,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -1832,7 +2526,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1843,7 +2537,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1854,10 +2548,10 @@ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "dev": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "hoek": { @@ -1866,11 +2560,16 @@ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", "dev": true }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true + "home-or-tmp": { + "version": "2.0.0", + "resolved": + "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } }, "hosted-git-info": { "version": "2.6.0", @@ -1888,7 +2587,7 @@ "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { - "whatwg-encoding": "1.0.3" + "whatwg-encoding": "^1.0.1" } }, "http-signature": { @@ -1898,9 +2597,9 @@ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "dev": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "husky": { @@ -1910,9 +2609,9 @@ "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", "dev": true, "requires": { - "is-ci": "1.1.0", - "normalize-path": "1.0.0", - "strip-indent": "2.0.0" + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" }, "dependencies": { "strip-indent": { @@ -1924,17 +2623,25 @@ } } }, - "iconv-lite": { - "version": "0.4.21", + "import-local": { + "version": "1.0.0", "resolved": - "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", + "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", "integrity": - "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", + "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", "dev": true, "requires": { - "safer-buffer": "2.1.2" + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" } }, + "imurmurhash": { + "version": "0.1.4", + "resolved": + "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "indent-string": { "version": "2.1.0", "resolved": @@ -1942,7 +2649,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "inflight": { @@ -1951,8 +2658,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -1960,6 +2667,22 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": + "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": @@ -1967,7 +2690,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-arrayish": { @@ -1991,9 +2714,16 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, + "is-callable": { + "version": "1.1.3", + "resolved": + "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, "is-ci": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", @@ -2001,7 +2731,7 @@ "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "dev": true, "requires": { - "ci-info": "1.1.3" + "ci-info": "^1.0.0" } }, "is-data-descriptor": { @@ -2011,9 +2741,16 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, + "is-date-object": { + "version": "1.0.1", + "resolved": + "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": @@ -2022,9 +2759,9 @@ "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -2057,7 +2794,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -2080,7 +2817,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -2090,7 +2827,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-generator-fn": { @@ -2106,7 +2843,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-my-ip-valid": { @@ -2125,11 +2862,11 @@ "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", "dev": true, "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "is-my-ip-valid": "1.0.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" } }, "is-number": { @@ -2138,7 +2875,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-obj": { @@ -2154,7 +2891,7 @@ "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", "dev": true, "requires": { - "symbol-observable": "0.2.4" + "symbol-observable": "^0.2.2" } }, "is-odd": { @@ -2164,7 +2901,7 @@ "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "dev": true, "requires": { - "is-number": "4.0.0" + "is-number": "^4.0.0" }, "dependencies": { "is-number": { @@ -2185,130 +2922,586 @@ "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { "version": "3.0.1", "resolved": - "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "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-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "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 + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "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==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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 + }, + "istanbul-api": { + "version": "1.3.1", + "resolved": + "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", + "integrity": + "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", + "dev": true, + "requires": { + "async": "^2.1.4", + "compare-versions": "^3.1.0", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-hook": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-report": "^1.1.4", + "istanbul-lib-source-maps": "^1.2.4", + "istanbul-reports": "^1.3.0", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + }, + "dependencies": { + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": + "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "^4.14.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": + "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": + "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "istanbul-lib-source-maps": { + "version": "1.2.4", + "resolved": + "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", + "integrity": + "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + } + }, + "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" + } + }, + "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" + } + }, + "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.0.5" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": + "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.0", + "resolved": + "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": + "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.0", + "resolved": + "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", + "integrity": + "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.1", + "resolved": + "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": + "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.0", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.4", + "resolved": + "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", + "integrity": + "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "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": "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" + } + }, + "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.3", + "resolved": + "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", + "integrity": + "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.1.2", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": + "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "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" + } + }, + "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.0.5" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": + "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "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-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "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-typedarray": { - "version": "1.0.0", - "resolved": - "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "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 - }, - "is-windows": { - "version": "1.0.2", + "istanbul-reports": { + "version": "1.3.0", "resolved": - "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", "integrity": - "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "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=", + "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", "dev": true, "requires": { - "isarray": "1.0.0" + "handlebars": "^4.0.3" } }, - "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 - }, - "jade": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "jest": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.3.tgz", + "integrity": + "sha512-FFCdU/pXOEASfHxFDOWUysI/+FFoqiXJADEIXgDKuZyqSmBD3tZ4BEGH7+M79v7czj7bbkhwtd2LaEDcJiM/GQ==", "dev": true, "requires": { - "commander": "0.6.1", - "mkdirp": "0.3.0" + "import-local": "^1.0.0", + "jest-cli": "^22.4.3" }, "dependencies": { - "commander": { - "version": "0.6.1", + "ansi-escapes": { + "version": "3.1.0", "resolved": - "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", - "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": + "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, - "mkdirp": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", - "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "ansi-regex": { + "version": "3.0.0", + "resolved": + "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": + "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": + "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": + "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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.4", + "inherits": "2", + "minimatch": "^3.0.4", + "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" + } + }, + "jest-cli": { + "version": "22.4.3", + "resolved": + "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.3.tgz", + "integrity": + "sha512-IiHybF0DJNqZPsbjn4Cy4vcqcmImpoFwNFnkehzVw8lTUSl4axZh5DHewu5bdpZF2Y5gUqFKYzH0FH4Qx2k+UA==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.14", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-instrument": "^1.8.0", + "istanbul-lib-source-maps": "^1.2.1", + "jest-changed-files": "^22.4.3", + "jest-config": "^22.4.3", + "jest-environment-jsdom": "^22.4.3", + "jest-get-type": "^22.4.3", + "jest-haste-map": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-regex-util": "^22.4.3", + "jest-resolve-dependencies": "^22.4.3", + "jest-runner": "^22.4.3", + "jest-runtime": "^22.4.3", + "jest-snapshot": "^22.4.3", + "jest-util": "^22.4.3", + "jest-validate": "^22.4.3", + "jest-worker": "^22.4.3", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^10.0.3" + } + }, + "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" + } + }, + "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.0.5" + } + }, + "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" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": + "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": + "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, + "jest-changed-files": { + "version": "22.4.3", + "resolved": + "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", + "integrity": + "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, "jest-config": { "version": "22.4.3", "resolved": @@ -2317,17 +3510,17 @@ "sha512-KSg3EOToCgkX+lIvenKY7J8s426h6ahXxaUFJxvGoEk0562Z6inWj1TnKoGycTASwiLD+6kSYFALcjdosq9KIQ==", "dev": true, "requires": { - "chalk": "2.4.1", - "glob": "7.1.2", - "jest-environment-jsdom": "22.4.3", - "jest-environment-node": "22.4.3", - "jest-get-type": "22.4.3", - "jest-jasmine2": "22.4.3", - "jest-regex-util": "22.4.3", - "jest-resolve": "22.4.3", - "jest-util": "22.4.3", - "jest-validate": "22.4.3", - "pretty-format": "22.4.3" + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^22.4.3", + "jest-environment-node": "^22.4.3", + "jest-get-type": "^22.4.3", + "jest-jasmine2": "^22.4.3", + "jest-regex-util": "^22.4.3", + "jest-resolve": "^22.4.3", + "jest-util": "^22.4.3", + "jest-validate": "^22.4.3", + "pretty-format": "^22.4.3" }, "dependencies": { "ansi-styles": { @@ -2338,7 +3531,7 @@ "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -2348,9 +3541,9 @@ "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "glob": { @@ -2360,12 +3553,12 @@ "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" + "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" } }, "supports-color": { @@ -2376,7 +3569,7 @@ "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -2388,10 +3581,10 @@ "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", "dev": true, "requires": { - "chalk": "2.4.1", - "diff": "3.5.0", - "jest-get-type": "22.4.3", - "pretty-format": "22.4.3" + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" }, "dependencies": { "ansi-styles": { @@ -2402,7 +3595,7 @@ "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -2412,9 +3605,9 @@ "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "diff": { @@ -2432,11 +3625,22 @@ "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } }, + "jest-docblock": { + "version": "22.4.3", + "resolved": + "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", + "integrity": + "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, "jest-environment-jsdom": { "version": "22.4.3", "resolved": @@ -2445,9 +3649,9 @@ "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", "dev": true, "requires": { - "jest-mock": "22.4.3", - "jest-util": "22.4.3", - "jsdom": "11.9.0" + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3", + "jsdom": "^11.5.1" } }, "jest-environment-node": { @@ -2458,8 +3662,8 @@ "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", "dev": true, "requires": { - "jest-mock": "22.4.3", - "jest-util": "22.4.3" + "jest-mock": "^22.4.3", + "jest-util": "^22.4.3" } }, "jest-get-type": { @@ -2470,6 +3674,73 @@ "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", "dev": true }, + "jest-haste-map": { + "version": "22.4.3", + "resolved": + "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", + "integrity": + "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^22.4.3", + "jest-serializer": "^22.4.3", + "jest-worker": "^22.4.3", + "micromatch": "^2.3.11", + "sane": "^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" + } + }, + "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" + } + } + } + }, "jest-jasmine2": { "version": "22.4.3", "resolved": @@ -2478,17 +3749,17 @@ "sha512-yZCPCJUcEY6R5KJB/VReo1AYI2b+5Ky+C+JA1v34jndJsRcLpU4IZX4rFJn7yDTtdNbO/nNqg+3SDIPNH2ecnw==", "dev": true, "requires": { - "chalk": "2.4.1", - "co": "4.6.0", - "expect": "22.4.3", - "graceful-fs": "4.1.11", - "is-generator-fn": "1.0.0", - "jest-diff": "22.4.3", - "jest-matcher-utils": "22.4.3", - "jest-message-util": "22.4.3", - "jest-snapshot": "22.4.3", - "jest-util": "22.4.3", - "source-map-support": "0.5.5" + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^22.4.3", + "graceful-fs": "^4.1.11", + "is-generator-fn": "^1.0.0", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-snapshot": "^22.4.3", + "jest-util": "^22.4.3", + "source-map-support": "^0.5.0" }, "dependencies": { "ansi-styles": { @@ -2499,7 +3770,7 @@ "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -2509,9 +3780,9 @@ "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -2522,11 +3793,22 @@ "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } }, + "jest-leak-detector": { + "version": "22.4.3", + "resolved": + "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", + "integrity": + "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", + "dev": true, + "requires": { + "pretty-format": "^22.4.3" + } + }, "jest-matcher-utils": { "version": "22.4.3", "resolved": @@ -2535,9 +3817,9 @@ "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", "dev": true, "requires": { - "chalk": "2.4.1", - "jest-get-type": "22.4.3", - "pretty-format": "22.4.3" + "chalk": "^2.0.1", + "jest-get-type": "^22.4.3", + "pretty-format": "^22.4.3" }, "dependencies": { "ansi-styles": { @@ -2548,7 +3830,7 @@ "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -2558,9 +3840,9 @@ "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -2571,7 +3853,7 @@ "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -2584,11 +3866,11 @@ "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0-beta.46", - "chalk": "2.4.1", - "micromatch": "2.3.11", - "slash": "1.0.0", - "stack-utils": "1.0.1" + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" }, "dependencies": { "ansi-styles": { @@ -2599,7 +3881,7 @@ "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -2609,9 +3891,9 @@ "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "is-extglob": { @@ -2627,7 +3909,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "micromatch": { @@ -2637,19 +3919,19 @@ "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" + "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": { @@ -2659,7 +3941,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "supports-color": { @@ -2670,7 +3952,7 @@ "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -2698,8 +3980,106 @@ "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", "dev": true, "requires": { - "browser-resolve": "1.11.2", - "chalk": "2.4.1" + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": + "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": + "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": + "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": + "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": + "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "22.4.3", + "resolved": + "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", + "integrity": + "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", + "dev": true, + "requires": { + "jest-regex-util": "^22.4.3" + } + }, + "jest-runner": { + "version": "22.4.3", + "resolved": + "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.3.tgz", + "integrity": + "sha512-U7PLlQPRlWNbvOHWOrrVay9sqhBJmiKeAdKIkvX4n1G2tsvzLlf77nBD28GL1N6tGv4RmuTfI8R8JrkvCa+IBg==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "jest-config": "^22.4.3", + "jest-docblock": "^22.4.3", + "jest-haste-map": "^22.4.3", + "jest-jasmine2": "^22.4.3", + "jest-leak-detector": "^22.4.3", + "jest-message-util": "^22.4.3", + "jest-runtime": "^22.4.3", + "jest-util": "^22.4.3", + "jest-worker": "^22.4.3", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "22.4.3", + "resolved": + "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.3.tgz", + "integrity": + "sha512-Eat/esQjevhx9BgJEC8udye+FfoJ2qvxAZfOAWshYGS22HydHn5BgsvPdTtt9cp0fSl5LxYOFA1Pja9Iz2Zt8g==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^22.4.3", + "babel-plugin-istanbul": "^4.1.5", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^22.4.3", + "jest-haste-map": "^22.4.3", + "jest-regex-util": "^22.4.3", + "jest-resolve": "^22.4.3", + "jest-util": "^22.4.3", + "jest-validate": "^22.4.3", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^10.0.3" }, "dependencies": { "ansi-styles": { @@ -2710,7 +4090,7 @@ "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -2720,11 +4100,66 @@ "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.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" + } + }, + "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" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": + "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "supports-color": { "version": "5.4.0", "resolved": @@ -2733,11 +4168,19 @@ "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } }, + "jest-serializer": { + "version": "22.4.3", + "resolved": + "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", + "integrity": + "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", + "dev": true + }, "jest-snapshot": { "version": "22.4.3", "resolved": @@ -2746,12 +4189,12 @@ "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", "dev": true, "requires": { - "chalk": "2.4.1", - "jest-diff": "22.4.3", - "jest-matcher-utils": "22.4.3", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "pretty-format": "22.4.3" + "chalk": "^2.0.1", + "jest-diff": "^22.4.3", + "jest-matcher-utils": "^22.4.3", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^22.4.3" }, "dependencies": { "ansi-styles": { @@ -2762,7 +4205,7 @@ "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -2772,9 +4215,9 @@ "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "minimist": { @@ -2801,7 +4244,7 @@ "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -2813,13 +4256,13 @@ "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", "dev": true, "requires": { - "callsites": "2.0.0", - "chalk": "2.4.1", - "graceful-fs": "4.1.11", - "is-ci": "1.1.0", - "jest-message-util": "22.4.3", - "mkdirp": "0.5.1", - "source-map": "0.6.1" + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^22.4.3", + "mkdirp": "^0.5.1", + "source-map": "^0.6.0" }, "dependencies": { "ansi-styles": { @@ -2830,7 +4273,7 @@ "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -2840,9 +4283,9 @@ "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "minimist": { @@ -2869,7 +4312,7 @@ "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -2882,11 +4325,11 @@ "sha512-CfFM18W3GSP/xgmA4UouIx0ljdtfD2mjeBC6c89Gg17E44D4tQhAcTrZmf9djvipwU30kSTnk6CzcxdCCeSXfA==", "dev": true, "requires": { - "chalk": "2.4.1", - "jest-config": "22.4.3", - "jest-get-type": "22.4.3", - "leven": "2.1.0", - "pretty-format": "22.4.3" + "chalk": "^2.0.1", + "jest-config": "^22.4.3", + "jest-get-type": "^22.4.3", + "leven": "^2.1.0", + "pretty-format": "^22.4.3" }, "dependencies": { "ansi-styles": { @@ -2897,7 +4340,7 @@ "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -2907,9 +4350,9 @@ "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -2920,11 +4363,22 @@ "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } }, + "jest-worker": { + "version": "22.4.3", + "resolved": + "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", + "integrity": + "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -2937,8 +4391,8 @@ "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "2.7.3" + "argparse": "^1.0.7", + "esprima": "^2.6.0" } }, "jsbn": { @@ -2955,32 +4409,32 @@ "sha512-sb3omwJTJ+HwAltLZevM/KQBusY+l2Ar5UfnTCWk9oUVBiDnQPBNiG1BaTAKttCnneonYbNo7vi4EFDY2lBfNA==", "dev": true, "requires": { - "abab": "1.0.4", - "acorn": "5.5.3", - "acorn-globals": "4.1.0", - "array-equal": "1.0.0", - "cssom": "0.3.2", - "cssstyle": "0.2.37", - "data-urls": "1.0.0", - "domexception": "1.0.1", - "escodegen": "1.9.1", - "html-encoding-sniffer": "1.0.2", - "left-pad": "1.3.0", - "nwmatcher": "1.4.4", + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwmatcher": "^1.4.3", "parse5": "4.0.0", - "pn": "1.1.0", - "request": "2.85.0", - "request-promise-native": "1.0.5", - "sax": "1.2.4", - "symbol-tree": "3.2.2", - "tough-cookie": "2.3.4", - "w3c-hr-time": "1.0.1", - "webidl-conversions": "4.0.2", - "whatwg-encoding": "1.0.3", - "whatwg-mimetype": "2.1.0", - "whatwg-url": "6.4.1", - "ws": "4.1.0", - "xml-name-validator": "3.0.0" + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.0", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" }, "dependencies": { "acorn": { @@ -3010,7 +4464,7 @@ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "dev": true, "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "caseless": { @@ -3027,7 +4481,7 @@ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "dev": true, "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { @@ -3037,7 +4491,7 @@ "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "dev": true, "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } } } @@ -3049,9 +4503,9 @@ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "mime-types": "^2.1.12" } }, "har-validator": { @@ -3061,8 +4515,8 @@ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "hawk": { @@ -3072,10 +4526,10 @@ "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "dev": true, "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" } }, "hoek": { @@ -3092,9 +4546,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "request": { @@ -3104,28 +4558,28 @@ "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", "dev": true, "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "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.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "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" } }, "sntp": { @@ -3135,7 +4589,7 @@ "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "dev": true, "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "tunnel-agent": { @@ -3145,11 +4599,17 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.0.1" } } } }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": @@ -3172,6 +4632,16 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": 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, + "requires": { + "jsonify": "~0.0.0" + } + }, "json-stringify-safe": { "version": "5.0.1", "resolved": @@ -3179,6 +4649,18 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, "jsonpointer": { "version": "4.0.1", "resolved": @@ -3213,7 +4695,24 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "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" } }, "lcov-parse": { @@ -3242,8 +4741,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "lint-staged": { @@ -3254,28 +4753,28 @@ "sha512-dCzqskhum0WXQBE0RawBkOlRjg2pc7PkAJD4yRB12+ct5CMTOU9tvzzbsyqJwaGHjTdSFUxiT8n+sww77p2r7w==", "dev": true, "requires": { - "app-root-path": "2.0.1", - "chalk": "2.4.1", - "commander": "2.15.1", - "cosmiconfig": "4.0.0", - "debug": "3.1.0", - "dedent": "0.7.0", - "execa": "0.9.0", - "find-parent-dir": "0.3.0", - "is-glob": "4.0.0", - "jest-validate": "22.4.3", - "listr": "0.13.0", - "lodash": "4.17.10", - "log-symbols": "2.2.0", - "micromatch": "3.1.10", - "npm-which": "3.0.1", - "p-map": "1.2.0", - "path-is-inside": "1.0.2", - "pify": "3.0.0", - "please-upgrade-node": "3.0.2", + "app-root-path": "^2.0.1", + "chalk": "^2.3.1", + "commander": "^2.14.1", + "cosmiconfig": "^4.0.0", + "debug": "^3.1.0", + "dedent": "^0.7.0", + "execa": "^0.9.0", + "find-parent-dir": "^0.3.0", + "is-glob": "^4.0.0", + "jest-validate": "^22.4.0", + "listr": "^0.13.0", + "lodash": "^4.17.5", + "log-symbols": "^2.2.0", + "micromatch": "^3.1.8", + "npm-which": "^3.0.1", + "p-map": "^1.1.1", + "path-is-inside": "^1.0.2", + "pify": "^3.0.0", + "please-upgrade-node": "^3.0.2", "staged-git-files": "1.1.1", - "string-argv": "0.0.2", - "stringify-object": "3.2.2" + "string-argv": "^0.0.2", + "stringify-object": "^3.2.2" }, "dependencies": { "ansi-styles": { @@ -3286,7 +4785,7 @@ "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -3296,9 +4795,9 @@ "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "debug": { @@ -3325,7 +4824,7 @@ "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -3336,23 +4835,23 @@ "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "figures": "1.7.0", - "indent-string": "2.1.0", - "is-observable": "0.2.0", - "is-promise": "2.1.0", - "is-stream": "1.1.0", - "listr-silent-renderer": "1.1.1", - "listr-update-renderer": "0.4.0", - "listr-verbose-renderer": "0.4.1", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "ora": "0.2.3", - "p-map": "1.2.0", - "rxjs": "5.5.10", - "stream-to-observable": "0.2.0", - "strip-ansi": "3.0.1" + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "figures": "^1.7.0", + "indent-string": "^2.1.0", + "is-observable": "^0.2.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.4.0", + "listr-verbose-renderer": "^0.4.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "ora": "^0.2.3", + "p-map": "^1.1.1", + "rxjs": "^5.4.2", + "stream-to-observable": "^0.2.0", + "strip-ansi": "^3.0.1" }, "dependencies": { "log-symbols": { @@ -3362,7 +4861,7 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.0.0" } } } @@ -3381,14 +4880,14 @@ "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "elegant-spinner": "1.0.1", - "figures": "1.7.0", - "indent-string": "3.2.0", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "strip-ansi": "3.0.1" + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "strip-ansi": "^3.0.1" }, "dependencies": { "indent-string": { @@ -3405,7 +4904,7 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.0.0" } } } @@ -3417,10 +4916,10 @@ "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "date-fns": "1.29.0", - "figures": "1.7.0" + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" } }, "load-json-file": { @@ -3430,11 +4929,31 @@ "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" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "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": { @@ -3466,7 +4985,7 @@ "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "chalk": "2.4.1" + "chalk": "^2.0.1" }, "dependencies": { "ansi-styles": { @@ -3477,7 +4996,7 @@ "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -3487,9 +5006,9 @@ "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { @@ -3500,7 +5019,7 @@ "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -3512,8 +5031,8 @@ "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "cli-cursor": "1.0.2" + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" } }, "lolex": { @@ -3522,22 +5041,30 @@ "integrity": "sha1-Xbu8hQOV51I8dLNYb3+9JibSWxs=", "dev": true }, - "loud-rejection": { - "version": "1.6.0", + "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/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "js-tokens": "^3.0.0" } }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } }, "map-cache": { "version": "0.2.2", @@ -3545,37 +5072,38 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, "map-visit": { "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.1" + "object-visit": "^1.0.0" } }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "mimic-fn": "^1.0.0" + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "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" } }, "methods": { @@ -3591,19 +5119,19 @@ "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" }, "dependencies": { "arr-diff": { @@ -3627,16 +5155,16 @@ "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -3646,7 +5174,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -3658,13 +5186,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -3674,7 +5202,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -3684,7 +5212,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -3694,7 +5222,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3704,7 +5232,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3716,7 +5244,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3726,7 +5254,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3739,9 +5267,9 @@ "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -3761,14 +5289,14 @@ "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -3778,7 +5306,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -3788,7 +5316,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -3800,10 +5328,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -3813,7 +5341,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -3826,7 +5354,7 @@ "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -3837,7 +5365,7 @@ "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -3848,9 +5376,9 @@ "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-number": { @@ -3860,7 +5388,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3870,7 +5398,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3910,9 +5438,16 @@ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.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 + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3920,7 +5455,7 @@ "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -3937,8 +5472,8 @@ "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -3949,88 +5484,24 @@ "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", - "dev": true - }, - "mocha": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.20.1.tgz", - "integrity": "sha1-80ODLZ/gx9l8ZPxwRI9RNt+f7Vs=", - "dev": true, - "requires": { - "commander": "2.0.0", - "debug": "2.6.9", - "diff": "1.0.7", - "glob": "3.2.3", - "growl": "1.7.0", - "jade": "0.26.3", - "mkdirp": "0.3.5" - }, - "dependencies": { - "commander": { - "version": "2.0.0", - "resolved": - "https://registry.npmjs.org/commander/-/commander-2.0.0.tgz", - "integrity": "sha1-0bhvkB+LZL2UG96tr5JFMDk76Sg=", - "dev": true - }, - "glob": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz", - "integrity": "sha1-4xPusknHr/qlxHUoaw4RW1mDlGc=", - "dev": true, - "requires": { - "graceful-fs": "2.0.3", - "inherits": "2.0.3", - "minimatch": "0.2.14" - } - }, - "graceful-fs": { - "version": "2.0.3", - "resolved": - "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", - "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": - "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2.7.3", - "sigmund": "1.0.1" + "is-plain-object": "^2.0.4" } } } }, - "mocha-lcov-reporter": { - "version": "0.0.2", - "resolved": - "https://registry.npmjs.org/mocha-lcov-reporter/-/mocha-lcov-reporter-0.0.2.tgz", - "integrity": "sha1-rdE60kFYQxVwytpELGFO3F5P65U=", - "dev": true - }, - "mockery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/mockery/-/mockery-1.7.0.tgz", - "integrity": "sha1-9O3g2HUMHJcnwnLqLGBiniyaHE8=", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": + "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true, + "optional": true + }, "nanomatch": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", @@ -4038,18 +5509,18 @@ "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "arr-diff": { @@ -4082,31 +5553,35 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1.1.1" - } + "node-int64": { + "version": "0.4.0", + "resolved": + "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true }, - "noptify": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz", - "integrity": "sha1-WPZUpz2XU98MUdlobckhBKZ/S7s=", + "node-notifier": { + "version": "5.2.1", + "resolved": + "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", + "integrity": + "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", "dev": true, "requires": { - "nopt": "2.0.0" + "growly": "^1.3.0", + "semver": "^5.4.1", + "shellwords": "^0.1.1", + "which": "^1.3.0" }, "dependencies": { - "nopt": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz", - "integrity": "sha1-ynQW8gpeP5w7hhgPlilfo9C1Lg0=", + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": + "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "abbrev": "1.1.1" + "isexe": "^2.0.0" } } } @@ -4119,10 +5594,10 @@ "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -4139,7 +5614,7 @@ "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", "dev": true, "requires": { - "which": "1.2.14" + "which": "^1.2.10" } }, "npm-run-path": { @@ -4149,7 +5624,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "npm-which": { @@ -4158,9 +5633,9 @@ "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", "dev": true, "requires": { - "commander": "2.15.1", - "npm-path": "2.0.4", - "which": "1.2.14" + "commander": "^2.9.0", + "npm-path": "^2.0.2", + "which": "^1.2.10" } }, "number-is-nan": { @@ -4198,9 +5673,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -4210,7 +5685,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -4229,7 +5704,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -4241,6 +5716,17 @@ } } }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": + "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, "object.omit": { "version": "2.0.1", "resolved": @@ -4248,8 +5734,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -4259,7 +5745,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -4277,7 +5763,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -4286,6 +5772,32 @@ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, + "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.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": + "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": + "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, "optionator": { "version": "0.8.2", "resolved": @@ -4293,12 +5805,12 @@ "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" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "ora": { @@ -4307,18 +5819,79 @@ "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-spinners": "0.1.2", - "object-assign": "4.1.1" + "chalk": "^1.1.1", + "cli-cursor": "^1.0.2", + "cli-spinners": "^0.1.2", + "object-assign": "^4.0.1" + } + }, + "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": + "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + }, + "dependencies": { + "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" + } + } } }, + "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 + }, "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.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": + "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "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-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", @@ -4326,6 +5899,12 @@ "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, + "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 + }, "parse-glob": { "version": "3.0.4", "resolved": @@ -4333,10 +5912,10 @@ "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" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" }, "dependencies": { "is-extglob": { @@ -4352,7 +5931,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } @@ -4364,7 +5943,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parse5": { @@ -4388,7 +5967,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -4411,15 +5990,22 @@ "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" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "performance-now": { @@ -4448,7 +6034,27 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "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" + } + } } }, "please-upgrade-node": { @@ -4459,7 +6065,7 @@ "sha512-bslfSeW+ksUbB/sYZeEdKFyTG4YWU9YKRvqfSRvZKE675khAuBUPqV5RUwJZaGuWmVQLweK45Q+lPHFVnSlSug==", "dev": true, "requires": { - "semver-compare": "1.0.0" + "semver-compare": "^1.0.0" } }, "pn": { @@ -4503,8 +6109,8 @@ "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", "dev": true, "requires": { - "ansi-regex": "3.0.0", - "ansi-styles": "3.2.1" + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" }, "dependencies": { "ansi-regex": { @@ -4522,11 +6128,18 @@ "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } } } }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": + "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, "process-nextick-args": { "version": "2.0.0", "resolved": @@ -4560,8 +6173,8 @@ "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -4571,7 +6184,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -4581,7 +6194,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4592,7 +6205,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4603,9 +6216,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -4615,8 +6228,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "readable-stream": { @@ -4626,25 +6239,34 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "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" } }, - "redent": { + "realpath-native": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "resolved": + "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.0.tgz", + "integrity": + "sha512-XJtlRJ9jf0E1H1SLeJyQ9PGzQD7S65h1pRXEcAeK48doKOnKxcgPeNohJvD5u/2sI9J1oke6E8bZHS/fmW1UiQ==", "dev": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "util.promisify": "^1.0.0" } }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": + "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": + "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, "regex-cache": { "version": "0.4.4", "resolved": @@ -4653,7 +6275,7 @@ "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { @@ -4663,8 +6285,8 @@ "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "remove-trailing-separator": { @@ -4694,7 +6316,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { @@ -4703,26 +6325,26 @@ "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", "dev": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.7.0", - "caseless": "0.11.0", - "combined-stream": "1.0.6", - "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.18", - "oauth-sign": "0.8.2", - "qs": "6.3.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.4.3", - "uuid": "3.2.1" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "qs": "~6.3.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1", + "uuid": "^3.0.0" }, "dependencies": { "form-data": { @@ -4732,9 +6354,9 @@ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "dev": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "qs": { @@ -4752,7 +6374,7 @@ "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", "dev": true, "requires": { - "lodash": "4.17.10" + "lodash": "^4.13.1" } }, "request-promise-native": { @@ -4763,10 +6385,17 @@ "dev": true, "requires": { "request-promise-core": "1.1.1", - "stealthy-require": "1.1.1", - "tough-cookie": "2.3.4" + "stealthy-require": "^1.1.0", + "tough-cookie": ">=2.3.3" } }, + "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-from-string": { "version": "2.0.2", "resolved": @@ -4775,12 +6404,36 @@ "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "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": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": + "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": + "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, "resolve-url": { "version": "0.2.1", "resolved": @@ -4795,8 +6448,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } }, "ret": { @@ -4806,11 +6459,16 @@ "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "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.1" + } }, "rxjs": { "version": "5.5.10", @@ -4845,23 +6503,32 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": - "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": - "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, "samsam": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.3.tgz", "integrity": "sha1-n1CHQZtNCR8jJXHn+lLpCw9VJiE=", "dev": true }, + "sane": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.0.tgz", + "integrity": + "sha512-glfKd7YH4UCrh/7dD+UESsr8ylKWRE7UQPoXuz28FgmcF0ViJQhCTCCZHICRKxf8G8O1KdLEn20dcICK54c7ew==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.1.1", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -4883,6 +6550,13 @@ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "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 + }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", @@ -4890,10 +6564,10 @@ "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -4903,7 +6577,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -4915,7 +6589,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -4925,16 +6599,12 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "should": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/should/-/should-3.0.1.tgz", - "integrity": "sha1-sw//iWi0cB4upJnekdmw6k03Yj4=", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "shellwords": { + "version": "0.1.1", + "resolved": + "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": + "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, "signal-exit": { @@ -4952,7 +6622,7 @@ "requires": { "formatio": "1.1.1", "lolex": "1.1.0", - "util": "0.10.3" + "util": ">=0.10.3 <1" } }, "slash": { @@ -4976,14 +6646,14 @@ "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "define-property": { @@ -4993,7 +6663,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -5003,7 +6673,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "source-map": { @@ -5023,9 +6693,9 @@ "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -5035,7 +6705,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -5046,7 +6716,7 @@ "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -5057,7 +6727,7 @@ "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -5068,9 +6738,9 @@ "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -5097,7 +6767,7 @@ "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" } }, "sntp": { @@ -5106,7 +6776,7 @@ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "dev": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "source-map": { @@ -5125,11 +6795,11 @@ "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", "dev": true, "requires": { - "atob": "2.1.0", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.0.0", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -5140,8 +6810,8 @@ "sha512-mR7/Nd5l1z6g99010shcXJiNEaf3fEtmLhRB/sBcQVJGodcHCULPp2y4Sfa43Kv2zq7T+Izmfp/WHCR6dYkQCA==", "dev": true, "requires": { - "buffer-from": "1.0.0", - "source-map": "0.6.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, "source-map-url": { @@ -5159,8 +6829,8 @@ "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -5179,8 +6849,8 @@ "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -5199,7 +6869,7 @@ "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -5215,14 +6885,14 @@ "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "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" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { @@ -5256,8 +6926,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -5267,7 +6937,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -5286,7 +6956,7 @@ "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", "dev": true, "requires": { - "any-observable": "0.2.0" + "any-observable": "^0.2.0" } }, "string-argv": { @@ -5296,6 +6966,36 @@ "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=", "dev": true }, + "string-length": { + "version": "2.0.0", + "resolved": + "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.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 + }, + "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" + } + } + } + }, "string-width": { "version": "1.0.2", "resolved": @@ -5303,9 +7003,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -5315,7 +7015,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } }, "stringify-object": { @@ -5326,9 +7026,9 @@ "sha512-O696NF21oLiDy8PhpWu8AEqoZHw++QW6mUv0UvKZe8gWSdSvMXkiLufK7OmnP27Dro4GU5kb9U7JIO0mBuCRQg==", "dev": true, "requires": { - "get-own-enumerable-property-symbols": "2.0.1", - "is-obj": "1.0.1", - "is-regexp": "1.0.0" + "get-own-enumerable-property-symbols": "^2.0.1", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" } }, "stringstream": { @@ -5345,7 +7045,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -5354,7 +7054,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-eof": { @@ -5363,32 +7063,22 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, - "strip-indent": { - "version": "1.0.1", - "resolved": - "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "4.0.1" - } - }, "superagent": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/superagent/-/superagent-2.3.0.tgz", "integrity": "sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU=", "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.1", - "debug": "2.6.9", - "extend": "3.0.1", + "component-emitter": "^1.2.0", + "cookiejar": "^2.0.6", + "debug": "^2.2.0", + "extend": "^3.0.0", "form-data": "1.0.0-rc4", - "formidable": "1.2.1", - "methods": "1.1.2", - "mime": "1.6.0", - "qs": "6.5.1", - "readable-stream": "2.3.6" + "formidable": "^1.0.17", + "methods": "^1.1.1", + "mime": "^1.3.4", + "qs": "^6.1.0", + "readable-stream": "^2.0.5" } }, "supports-color": { @@ -5412,33 +7102,40 @@ "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", "dev": true }, - "tiny-lr-fork": { - "version": "0.0.5", + "test-exclude": { + "version": "4.2.1", "resolved": - "https://registry.npmjs.org/tiny-lr-fork/-/tiny-lr-fork-0.0.5.tgz", - "integrity": "sha1-Hpnh4qhGm3NquX2X7vqYxx927Qo=", + "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.1.tgz", + "integrity": + "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", "dev": true, "requires": { - "debug": "0.7.4", - "faye-websocket": "0.4.4", - "noptify": "0.0.3", - "qs": "0.5.6" - }, - "dependencies": { - "debug": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", - "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", - "dev": true - }, - "qs": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", - "integrity": "sha1-MbGtBYVnZRxSaSFQa5qHk5EaA4Q=", - "dev": true - } + "arrify": "^1.0.1", + "micromatch": "^3.1.8", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" } }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "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 + }, "to-object-path": { "version": "0.3.0", "resolved": @@ -5446,7 +7143,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "to-regex": { @@ -5456,10 +7153,10 @@ "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -5469,8 +7166,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, "dependencies": { "is-number": { @@ -5480,7 +7177,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } } } @@ -5493,7 +7190,7 @@ "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tr46": { @@ -5502,7 +7199,7 @@ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, "requires": { - "punycode": "2.1.0" + "punycode": "^2.1.0" }, "dependencies": { "punycode": { @@ -5514,11 +7211,11 @@ } } }, - "trim-newlines": { - "version": "1.0.0", + "trim-right": { + "version": "1.0.1", "resolved": - "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, "tunnel-agent": { @@ -5542,20 +7239,60 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, - "underscore.string": { - "version": "3.3.4", - "resolved": - "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz", - "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=", + "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": { - "sprintf-js": "1.0.3", - "util-deprecate": "1.0.2" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": + "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": 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, + "optional": true + }, + "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.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.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 + }, "union-value": { "version": "1.0.0", "resolved": @@ -5563,10 +7300,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -5576,7 +7313,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -5586,10 +7323,10 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } @@ -5601,8 +7338,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -5612,9 +7349,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -5658,7 +7395,7 @@ "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" }, "dependencies": { "kind-of": { @@ -5694,6 +7431,18 @@ "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "util.promisify": { + "version": "1.0.0", + "resolved": + "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": + "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, "uuid": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", @@ -5709,8 +7458,8 @@ "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "verror": { @@ -5719,9 +7468,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" }, "dependencies": { "assert-plus": { @@ -5740,7 +7489,26 @@ "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", "dev": true, "requires": { - "browser-process-hrtime": "0.1.2" + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" } }, "webidl-conversions": { @@ -5788,9 +7556,9 @@ "sha512-FwygsxsXx27x6XXuExA/ox3Ktwcbf+OAvrKmLulotDAiO1Q6ixchPFaHYsis2zZBZSJTR0+dR+JVtf7MlbqZjw==", "dev": true, "requires": { - "lodash.sortby": "4.7.0", - "tr46": "1.0.1", - "webidl-conversions": "4.0.2" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, "which": { @@ -5799,21 +7567,59 @@ "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", "dev": true, "requires": { - "isexe": "2.0.0" + "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": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "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" + } + }, "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": "2.3.0", + "resolved": + "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": + "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, "ws": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", @@ -5821,8 +7627,8 @@ "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", "dev": true, "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.2" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" } }, "xml-name-validator": { @@ -5839,11 +7645,10 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, - "xunit-file": { - "version": "0.0.5", - "resolved": - "https://registry.npmjs.org/xunit-file/-/xunit-file-0.0.5.tgz", - "integrity": "sha1-Ccy3qdinQwAFa7gApkwjQZ7xDfA=", + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, "yallist": { @@ -5851,6 +7656,106 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": + "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.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", + "yargs-parser": "^8.1.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 + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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" + } + } + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": + "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": + "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.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 + } + } } } } diff --git a/package.json b/package.json index b5e37503..730059a1 100644 --- a/package.json +++ b/package.json @@ -13,36 +13,22 @@ "dependencies": { "superagent": "^2.0.0" }, - "config": { - "blanket": { - "pattern": "src", - "data-cover-never": "node_modules" - } - }, "scripts": { - "test": "./node_modules/.bin/mocha --bail", - "coveralls": - "./node_modules/.bin/mocha -r blanket -R mocha-lcov-reporter | ./node_modules/coveralls/bin/coveralls.js", + "test": "jest", + "travis": + "npm test -- --coverage && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js", "precommit": "lint-staged" }, "lint-staged": { "*.{js,json,css,md}": ["prettier --single-quote --write", "git add"] }, "devDependencies": { - "blanket": "^1.1.7", - "coveralls": "^2.11.2", - "grunt": "^1.0.1", - "grunt-contrib-watch": "~0.6", - "grunt-simple-mocha": "0.4.x", + "coveralls": "^2.13.3", "husky": "^0.14.3", + "jest": "^22.4.3", "lint-staged": "^7.0.5", - "mocha": "~1.20.1", - "mocha-lcov-reporter": "0.0.2", - "mockery": "^1.4.0", "prettier": "1.12.1", - "should": "~3.0", - "sinon": "~1.12.2", - "xunit-file": "0.0.5" + "sinon": "~1.12.2" }, "keywords": [ "spotify", diff --git a/src/base-request.js b/src/base-request.js index 91f94631..02cd80b1 100644 --- a/src/base-request.js +++ b/src/base-request.js @@ -143,6 +143,9 @@ Builder.prototype.withAuth = function(accessToken) { }; Builder.prototype._assign = function(src, obj) { + if (obj && Array.isArray(obj)) { + return obj; + } if (obj && Object.keys(obj).length > 0) { return Object.assign(src || {}, obj); } diff --git a/src/http-manager.js b/src/http-manager.js index aa2942f2..ce86be10 100644 --- a/src/http-manager.js +++ b/src/http-manager.js @@ -62,7 +62,7 @@ var _getErrorObject = function(defaultMessage, err) { /* Make the request to the Web API */ HttpManager._makeRequest = function(method, options, uri, callback) { - var req = method(uri); + var req = method.bind(superagent)(uri); if (options.query) { req.query(options.query); diff --git a/test/authentication-request.js b/test/authentication-request.js deleted file mode 100644 index 0a648fd0..00000000 --- a/test/authentication-request.js +++ /dev/null @@ -1,30 +0,0 @@ -var AuthenticationRequest = require('../src/authentication-request'), - should = require('should'); - -describe('Create Authentication Requests', function() { - it('Should use default settings if none are supplied', function() { - var request = AuthenticationRequest.builder().build(); - - request.getHost().should.equal('accounts.spotify.com'); - request.getPort().should.equal(443); - request.getScheme().should.equal('https'); - should.not.exist(request.getHeaders()); - should.not.exist(request.getPath()); - should.not.exist(request.getQueryParameters()); - should.not.exist(request.getBodyParameters()); - }); - - it('Can overwrite one of the default parameters', function() { - var request = AuthenticationRequest.builder() - .withHost('such.host.wow') - .build(); - - request.getHost().should.equal('such.host.wow'); - request.getPort().should.equal(443); - request.getScheme().should.equal('https'); - should.not.exist(request.getHeaders()); - should.not.exist(request.getPath()); - should.not.exist(request.getQueryParameters()); - should.not.exist(request.getBodyParameters()); - }); -}); diff --git a/test/base-request.js b/test/base-request.js deleted file mode 100644 index 29a66a6e..00000000 --- a/test/base-request.js +++ /dev/null @@ -1,172 +0,0 @@ -var Request = require('../src/base-request'), - should = require('should'); - -describe('Create Requests', function() { - it('Should create host, port, and scheme', function() { - var request = Request.builder() - .withHost('such.api.wow') - .withPort(1337) - .withScheme('http') - .build(); - - request.getHost().should.equal('such.api.wow'); - request.getPort().should.equal(1337); - request.getScheme().should.equal('http'); - }); - - it('Should add query parameters', function() { - var request = Request.builder() - .withHost('such.api.wow') - .withPort(1337) - .withScheme('http') - .withQueryParameters({ - oneParameter: 1, - anotherParameter: true, - thirdParameter: 'hello' - }) - .build(); - - request.getQueryParameters().oneParameter.should.equal(1); - request.getQueryParameters().anotherParameter.should.equal(true); - request.getQueryParameters().thirdParameter.should.equal('hello'); - }); - - it('Should add query parameters (multiple calls)', function() { - var request = Request.builder() - .withHost('such.api.wow') - .withPort(1337) - .withScheme('http') - .withQueryParameters({ - oneParameter: 1, - anotherParameter: true - }) - .withQueryParameters({ - thirdParameter: 'hello' - }) - .build(); - - request.getQueryParameters().oneParameter.should.equal(1); - request.getQueryParameters().anotherParameter.should.equal(true); - request.getQueryParameters().thirdParameter.should.equal('hello'); - }); - - it('Should add query parameters (combine calls)', function() { - var request = Request.builder() - .withHost('such.api.wow') - .withPort(1337) - .withScheme('http') - .withQueryParameters( - { - oneParameter: 1, - anotherParameter: true - }, - { - thirdParameter: 'hello' - } - ) - .build(); - - request.getQueryParameters().oneParameter.should.equal(1); - request.getQueryParameters().anotherParameter.should.equal(true); - request.getQueryParameters().thirdParameter.should.equal('hello'); - }); - - it('Should add body parameters', function() { - var request = Request.builder() - .withHost('such.api.wow') - .withPort(1337) - .withScheme('http') - .withBodyParameters({ - one: 1, - two: true, - three: 'world' - }) - .build(); - - request.getBodyParameters().one.should.equal(1); - request.getBodyParameters().two.should.equal(true); - request.getBodyParameters().three.should.equal('world'); - }); - - it('Should add header parameters', function() { - var request = Request.builder() - .withHost('such.api.wow') - .withPort(1337) - .withScheme('http') - .withHeaders({ - Authorization: 'Basic WOOP', - 'Content-Type': 'application/lol' - }) - .build(); - - request.getHeaders().Authorization.should.equal('Basic WOOP'); - request.getHeaders()['Content-Type'].should.equal('application/lol'); - }); - - it('Should add path', function() { - var request = Request.builder() - .withHost('such.api.wow') - .withPort(1337) - .withPath('/v1/users/meriosweg') - .build(); - - request.getPath().should.equal('/v1/users/meriosweg'); - }); - - it('Should build URI', function() { - var request = Request.builder() - .withHost('such.api.wow') - .withScheme('https') - .withPort(1337) - .withPath('/v1/users/meriosweg') - .build(); - - request - .getURI() - .should.equal('https://such.api.wow:1337/v1/users/meriosweg'); - }); - - it('Should construct empty query paramaters string', function() { - var request = Request.builder() - .withQueryParameters({}) - .build(); - - should.not.exist(request.getQueryParameterString()); - }); - - it('Should construct query paramaters string for one parameter', function() { - var request = Request.builder() - .withQueryParameters({ - one: 1 - }) - .build(); - - request.getQueryParameterString().should.equal('?one=1'); - }); - - it('Should construct query paramaters string for multiple parameters', function() { - var request = Request.builder() - .withQueryParameters({ - one: 1, - two: true, - three: 'world' - }) - .build(); - - request - .getQueryParameterString() - .should.equal('?one=1&two=true&three=world'); - }); - - it('Should construct query paramaters string and exclude undefined values', function() { - var request = Request.builder() - .withQueryParameters({ - one: 1, - two: undefined, - three: 'world' - }) - .build(); - - request.getQueryParameterString().should.equal('?one=1&three=world'); - }); -}); diff --git a/test/http-manager.js b/test/http-manager.js deleted file mode 100644 index 7c10f839..00000000 --- a/test/http-manager.js +++ /dev/null @@ -1,162 +0,0 @@ -var mockery = require('mockery'); -var Request = require('../src/base-request'); - -function useSuperagentMock(method, error, response) { - // method - // response - // data - // headers - // statusCode - - var onEnd = function(callback) { - if (error) { - return callback(error); - } - callback(null, { - body: response.data, - headers: response.headers || {}, - statusCode: response.statusCode || 200 - }); - }; - - var noop = function() {}; - - var superagentMock = {}; - superagentMock[method] = function(url) { - return { - query: noop, - send: noop, - set: noop, - end: onEnd - }; - }; - - mockery.registerMock('superagent', superagentMock); -} - -describe('Make requests', function() { - beforeEach(function() { - mockery.enable({ - warnOnReplace: false, - warnOnUnregistered: false, - useCleanCache: true - }); - }); - - afterEach(function() { - mockery.deregisterAll(); - mockery.disable(); - }); - - describe('GET requests', function() { - it('Should make a successful GET request', function(done) { - useSuperagentMock('get', null, { - data: 'some data', - headers: {}, - statusCode: 200 - }); - - var HttpManager = require('../src/http-manager'); - var request = Request.builder() - .withHost('such.api.wow') - .withPort(1337) - .withScheme('http') - .build(); - - HttpManager.get(request, function(errorObject) { - done(errorObject); - }); - }); - - it('Should process an error GET request', function(done) { - useSuperagentMock('get', new Error('GET request error')); - - var HttpManager = require('../src/http-manager'); - var request = Request.builder() - .withHost('such.api.wow') - .withPort(1337) - .withScheme('http') - .build(); - - HttpManager.get(request, function(errorObject) { - errorObject.should.be.an.instanceOf(Error); - errorObject.message.should.equal('GET request error'); - done(); - }); - }); - - it('Should process an error GET request with an error message', function(done) { - useSuperagentMock('get', new Error('There is a problem in your request')); - - var HttpManager = require('../src/http-manager'); - var request = Request.builder() - .withHost('such.api.wow') - .withPort(1337) - .withScheme('http') - .build(); - - HttpManager.get(request, function(errorObject) { - errorObject.should.be.an.instanceOf(Error); - errorObject.message.should.equal('There is a problem in your request'); - done(); - }); - }); - }); - - it('Should make a successful POST request', function(done) { - useSuperagentMock('post', null, { - data: 'some data', - headers: {}, - statusCode: 200 - }); - - var HttpManager = require('../src/http-manager'); - var request = Request.builder() - .withHost('such.api.wow') - .withPort(1337) - .withScheme('http') - .build(); - - HttpManager.post(request, function(errorObject) { - done(errorObject); - }); - }); - - it('Should make a successful PUT request', function(done) { - useSuperagentMock('put', null, { - data: 'some data', - headers: {}, - statusCode: 200 - }); - - var HttpManager = require('../src/http-manager'); - var request = Request.builder() - .withHost('such.api.wow') - .withPort(1337) - .withScheme('http') - .build(); - - HttpManager.put(request, function(errorObject) { - done(errorObject); - }); - }); - - it('Should make a successful DELETE request', function(done) { - useSuperagentMock('del', null, { - data: 'some data', - headers: {}, - statusCode: 200 - }); - - var HttpManager = require('../src/http-manager'); - var request = Request.builder() - .withHost('such.api.wow') - .withPort(1337) - .withScheme('http') - .build(); - - HttpManager.del(request, function(errorObject) { - done(errorObject); - }); - }); -}); diff --git a/test/webapi-error.js b/test/webapi-error.js deleted file mode 100644 index 477f1ab3..00000000 --- a/test/webapi-error.js +++ /dev/null @@ -1,10 +0,0 @@ -var WebApiError = require('../src/webapi-error'), - should = require('should'); - -describe('Create Web Api Error', function() { - it('should create error with message and status code', function() { - var error = new WebApiError('Something has gone terribly wrong!', 500); - 'Something has gone terribly wrong!'.should.equal(error.message); - (500).should.equal(error.statusCode); - }); -}); diff --git a/test/webapi-request.js b/test/webapi-request.js deleted file mode 100644 index f0de3aef..00000000 --- a/test/webapi-request.js +++ /dev/null @@ -1,30 +0,0 @@ -var WebApiRequest = require('../src/webapi-request'), - should = require('should'); - -describe('Create Web Api Requests', function() { - it('Should use default settings if none are supplied', function() { - var request = WebApiRequest.builder('token').build(); - - request.getHost().should.equal('api.spotify.com'); - request.getPort().should.equal(443); - request.getScheme().should.equal('https'); - should.exist(request.getHeaders().Authorization); - should.not.exist(request.getPath()); - should.not.exist(request.getQueryParameters()); - should.not.exist(request.getBodyParameters()); - }); - - it('Can overwrite one of the default parameters', function() { - var request = WebApiRequest.builder('token') - .withHost('such.host.wow') - .build(); - - request.getHost().should.equal('such.host.wow'); - request.getPort().should.equal(443); - request.getScheme().should.equal('https'); - should.exist(request.getHeaders().Authorization); - should.not.exist(request.getPath()); - should.not.exist(request.getQueryParameters()); - should.not.exist(request.getBodyParameters()); - }); -});