diff --git a/.babelrc b/.babelrc index 91a8d7b..92fab8d 100644 --- a/.babelrc +++ b/.babelrc @@ -9,6 +9,7 @@ "targets": { "browsers": [ "last 5 versions", + "ie 9", "defaults" ] }, @@ -26,6 +27,15 @@ "modules": false }] ] + }, + "test": { + "presets": [ + ["env", { + "targets": { + "node": "current" + }, + }] + ] } } } diff --git a/.eslintrc b/.eslintrc index 12c45b0..799c4e1 100644 --- a/.eslintrc +++ b/.eslintrc @@ -22,14 +22,14 @@ "functions": "ignore", }], "prettier/prettier": ["error", { - "trailingComma": "es5", + "printWidth": 100, "singleQuote": true, - "printWidth": 80 + "trailingComma": "es5", }], "no-plusplus": 0 }, "env": { - "mocha": true + "jest": true }, "globals": { "fetch": true, diff --git a/package.json b/package.json index ad84275..7934513 100644 --- a/package.json +++ b/package.json @@ -33,12 +33,11 @@ "devDependencies": { "babel-cli": "^6.26.0", "babel-eslint": "^8.0.1", + "babel-jest": "^21.2.0", "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-polyfill": "^6.26.0", "babel-preset-env": "^1.6.1", "babel-register": "^6.26.0", - "chai": "^4.1.2", - "chai-as-promised": "^7.1.1", "cz-conventional-changelog": "^2.1.0", "eslint": "^4.10.0", "eslint-config-airbnb-base": "^12.1.0", @@ -48,8 +47,7 @@ "eslint-plugin-prettier": "^2.3.1", "fetch-mock": "^5.13.1", "form-data": "^2.3.1", - "mocha": "^3.1.1", - "nyc": "^10.1.2", + "jest": "^21.2.1", "prettier": "^1.7.4", "rimraf": "^2.6.2", "semantic-release": "^8.2.0" @@ -59,15 +57,9 @@ "path": "./node_modules/cz-conventional-changelog" } }, - "nyc": { - "exclude": [ - "**/tests/**", - "resources", - "node_modules" - ], - "reporter": [ - "lcov", - "text" + "jest": { + "roots": [ + "/src" ] }, "scripts": { @@ -75,9 +67,9 @@ "build-lib": "rimraf lib && BABEL_ENV=lib babel src -d lib", "build-es": "rimraf es && BABEL_ENV=es babel src -d es", "lint": "eslint src test *.js", - "coverage": "nyc npm run test:all", - "test": "BABEL_ENV=lib mocha --require test/mocha-bootload --compilers js:babel-register test/*.test.js test/**/*.test.js", - "test:all": "npm run lint && npm run test", + "coverage": "jest --coverage --maxWorkers 2", + "watch": "jest --watch", + "test": "npm run coverage && npm run lint", "semantic-release": "semantic-release pre && npm publish && semantic-release post" } } diff --git a/test/testutils.js b/src/__mocks__/mockReq.js similarity index 100% rename from test/testutils.js rename to src/__mocks__/mockReq.js diff --git a/test/fetchWithMiddleware.test.js b/src/__tests__/fetchWithMiddleware.test.js similarity index 60% rename from test/fetchWithMiddleware.test.js rename to src/__tests__/fetchWithMiddleware.test.js index 1146a73..0bf8cd7 100644 --- a/test/fetchWithMiddleware.test.js +++ b/src/__tests__/fetchWithMiddleware.test.js @@ -1,9 +1,8 @@ /* eslint-disable no-param-reassign */ -import { assert } from 'chai'; import fetchMock from 'fetch-mock'; -import fetchWithMiddleware from '../src/fetchWithMiddleware'; -import { mockReq as mockRelayReq } from './testutils'; +import fetchWithMiddleware from '../fetchWithMiddleware'; +import { mockReq as mockRelayReq } from '../__mocks__/mockReq'; function createMockReq(reqId) { const relayRequest = mockRelayReq(reqId); @@ -32,16 +31,14 @@ describe('fetchWithMiddleware', () => { fetchMock.restore(); }); - it('should make a successfull request without middlewares', () => { + it('should make a successfull request without middlewares', async () => { fetchMock.post('/graphql', { id: 1, data: { user: 123 } }); - return assert.isFulfilled( - fetchWithMiddleware(createMockReq(1), []).then(data => { - assert.deepEqual(data, { user: 123 }); - }) - ); + + const data = await fetchWithMiddleware(createMockReq(1), []); + expect(data).toEqual({ user: 123 }); }); - it('should make a successfull request with middlewares', () => { + it('should make a successfull request with middlewares', async () => { const numPlus5 = next => req => next(req).then(res => { res.json.data.num += 5; @@ -54,13 +51,11 @@ describe('fetchWithMiddleware', () => { }); fetchMock.post('/graphql', { id: 1, data: { num: 1 } }); - return assert.isFulfilled( - fetchWithMiddleware(createMockReq(1), [ - numPlus5, - numMultiply10, // should be first, when changing response - ]).then(data => { - assert.deepEqual(data, { num: 15 }); - }) - ); + + const data = await fetchWithMiddleware(createMockReq(1), [ + numPlus5, + numMultiply10, // should be first, when changing response + ]); + expect(data).toEqual({ num: 15 }); }); }); diff --git a/src/__tests__/mutation.test.js b/src/__tests__/mutation.test.js new file mode 100644 index 0000000..16b8b6e --- /dev/null +++ b/src/__tests__/mutation.test.js @@ -0,0 +1,69 @@ +import fetchMock from 'fetch-mock'; +import { RelayNetworkLayer } from '../'; +import { mockReq } from '../__mocks__/mockReq'; + +describe('Mutation tests', () => { + const middlewares = []; + const rnl = new RelayNetworkLayer(middlewares); + + beforeEach(() => { + fetchMock.restore(); + }); + + it('should make a successfull mutation', async () => { + fetchMock.post('/graphql', { data: { ok: 1 } }); + const req = mockReq(); + await rnl.sendMutation(req); + expect(req.payload).toEqual({ response: { ok: 1 } }); + }); + + it('should fail correctly on network failure', async () => { + fetchMock.mock({ + matcher: '/graphql', + response: { + throws: new Error('Network connection error'), + }, + method: 'POST', + }); + const req1 = mockReq(); + await rnl.sendMutation(req1); + expect(req1.error instanceof Error).toBeTruthy(); + expect(/Network connection error/.test(req1.error.message)).toBeTruthy(); + }); + + it('should handle error response', async () => { + fetchMock.mock({ + matcher: '/graphql', + response: { + status: 200, + body: { + errors: [{ location: 1, message: 'major error' }], + }, + }, + method: 'POST', + }); + + const req1 = mockReq(1); + await rnl.sendMutation(req1); + expect(req1.error instanceof Error).toBeTruthy(); + }); + + it('should handle server non-2xx errors', async () => { + fetchMock.mock({ + matcher: '/graphql', + + response: { + status: 500, + body: 'Something went completely wrong.', + }, + method: 'POST', + }); + + const req1 = mockReq(1); + await rnl.sendMutation(req1); + + expect(req1.error instanceof Error).toBeTruthy(); + expect(req1.error.message).toEqual('Something went completely wrong.'); + expect(req1.error.fetchResponse.status).toEqual(500); + }); +}); diff --git a/test/queries.test.js b/src/__tests__/queries.test.js similarity index 50% rename from test/queries.test.js rename to src/__tests__/queries.test.js index adef647..180fdbf 100644 --- a/test/queries.test.js +++ b/src/__tests__/queries.test.js @@ -1,7 +1,6 @@ -import { assert } from 'chai'; import fetchMock from 'fetch-mock'; -import { RelayNetworkLayer } from '../src'; -import { mockReq } from './testutils'; +import { RelayNetworkLayer } from '../'; +import { mockReq } from '../__mocks__/mockReq'; describe('Queries tests', () => { const middlewares = []; @@ -11,20 +10,22 @@ describe('Queries tests', () => { fetchMock.restore(); }); - it('should make a successfull query', () => { + it('should make a successfull query', async () => { fetchMock.mock({ matcher: '/graphql', response: { status: 200, - body: { data: {} }, + body: { data: { ok: 1 } }, sendAsJson: true, }, method: 'POST', }); - return assert.isFulfilled(rnl.sendQueries([mockReq()])); + const req = mockReq(); + await rnl.sendQueries([req]); + expect(req.payload).toEqual({ response: { ok: 1 } }); }); - it('should fail correctly on network failure', () => { + it('should fail correctly on network failure', async () => { fetchMock.mock({ matcher: '/graphql', response: { @@ -33,15 +34,12 @@ describe('Queries tests', () => { method: 'POST', }); const req1 = mockReq(); - return assert.isFulfilled( - rnl.sendQueries([req1]).then(() => { - assert(req1.error instanceof Error); - assert(/Network connection error/.test(req1.error.message)); - }) - ); + await rnl.sendQueries([req1]); + expect(req1.error instanceof Error).toBeTruthy(); + expect(/Network connection error/.test(req1.error.message)).toBeTruthy(); }); - it('should handle error response', () => { + it('should handle error response', async () => { fetchMock.mock({ matcher: '/graphql', response: { @@ -54,14 +52,11 @@ describe('Queries tests', () => { }); const req1 = mockReq(1); - return assert.isFulfilled( - rnl.sendQueries([req1]).then(() => { - assert(req1.error instanceof Error, 'should be an error'); - }) - ); + await rnl.sendQueries([req1]); + expect(req1.error instanceof Error).toBeTruthy(); }); - it('should handle server non-2xx errors', () => { + it('should handle server non-2xx errors', async () => { fetchMock.mock({ matcher: '/graphql', response: { @@ -72,14 +67,13 @@ describe('Queries tests', () => { }); const req1 = mockReq(1); - return assert.isFulfilled(rnl.sendQueries([req1])).then(() => { - assert(req1.error instanceof Error, 'should be an error'); - assert.equal(req1.error.message, 'Something went completely wrong.'); - assert.equal(req1.error.fetchResponse.status, 500); - }); + await rnl.sendQueries([req1]); + expect(req1.error instanceof Error).toBeTruthy(); + expect(req1.error.message).toEqual('Something went completely wrong.'); + expect(req1.error.fetchResponse.status).toEqual(500); }); - it('should fail on missing `data` property', () => { + it('should fail on missing `data` property', async () => { fetchMock.mock({ matcher: '/graphql', response: { @@ -89,9 +83,9 @@ describe('Queries tests', () => { }, method: 'POST', }); - return assert.isFulfilled( - rnl.sendQueries([mockReq()]), - /^Server response.data was missing/ - ); + + const req = mockReq(); + await rnl.sendQueries([req]); + expect(req.error.toString()).toMatch('Server response.data was missing'); }); }); diff --git a/src/middleware/__tests__/auth.test.js b/src/middleware/__tests__/auth.test.js new file mode 100644 index 0000000..e461f8f --- /dev/null +++ b/src/middleware/__tests__/auth.test.js @@ -0,0 +1,142 @@ +import fetchMock from 'fetch-mock'; +import { RelayNetworkLayer } from '../../'; +import { mockReq } from '../../__mocks__/mockReq'; +import authMiddleware from '../../middleware/auth'; + +describe('Middleware / auth', () => { + describe('`token` option as string (with default `prefix` and `header`)', () => { + const rnl = new RelayNetworkLayer([ + authMiddleware({ + token: '123', + tokenRefreshPromise: () => 345, + }), + ]); + + beforeEach(() => { + fetchMock.restore(); + + fetchMock.mock({ + matcher: '/graphql', + response: { + status: 200, + body: { data: 'PAYLOAD' }, + sendAsJson: true, + }, + method: 'POST', + }); + }); + + it('should work with query', async () => { + const req1 = mockReq(); + await rnl.sendQueries([req1]); + + expect(req1.payload.response).toBe('PAYLOAD'); + const reqs = fetchMock.calls('/graphql'); + expect(reqs).toHaveLength(1); + expect(reqs[0][1].headers.Authorization).toBe('Bearer 123'); + }); + + it('should work with mutation', async () => { + const req1 = mockReq(); + await rnl.sendMutation(req1); + + expect(req1.payload.response).toBe('PAYLOAD'); + const reqs = fetchMock.calls('/graphql'); + expect(reqs).toHaveLength(1); + expect(reqs[0][1].headers.Authorization).toBe('Bearer 123'); + }); + }); + + describe('`token` option as thunk (with custom `prefix` and `header`)', () => { + const rnl = new RelayNetworkLayer([ + authMiddleware({ + token: () => '333', + tokenRefreshPromise: () => 345, + prefix: 'MyBearer ', + header: 'MyAuthorization', + }), + ]); + + beforeEach(() => { + fetchMock.restore(); + + fetchMock.mock({ + matcher: '/graphql', + response: { + status: 200, + body: { data: 'PAYLOAD' }, + sendAsJson: true, + }, + method: 'POST', + }); + }); + + it('should work with query', async () => { + const req1 = mockReq(); + await rnl.sendQueries([req1]); + + expect(req1.payload.response).toBe('PAYLOAD'); + const reqs = fetchMock.calls('/graphql'); + expect(reqs).toHaveLength(1); + expect(reqs[0][1].headers.MyAuthorization).toBe('MyBearer 333'); + }); + + it('should work with mutation', async () => { + const req1 = mockReq(); + await rnl.sendMutation(req1); + + expect(req1.payload.response).toBe('PAYLOAD'); + const reqs = fetchMock.calls('/graphql'); + expect(reqs).toHaveLength(1); + expect(reqs[0][1].headers.MyAuthorization).toBe('MyBearer 333'); + }); + }); + + describe('`tokenRefreshPromise` should be called on 401 response', () => { + beforeEach(() => { + fetchMock.restore(); + + fetchMock.mock({ + matcher: '/graphql', + response: { + status: 401, + body: { data: 'PAYLOAD' }, + sendAsJson: true, + }, + method: 'POST', + }); + }); + + it('should work with query (provided promise)', async () => { + const rnl = new RelayNetworkLayer([ + authMiddleware({ + token: '123', + tokenRefreshPromise: () => Promise.resolve(345), + }), + ]); + + const req1 = mockReq(); + await rnl.sendQueries([req1]); + + const reqs = fetchMock.calls('/graphql'); + expect(reqs).toHaveLength(2); + expect(reqs[1][1].headers.Authorization).toBe('Bearer 345'); + }); + + it('should work with mutation (provided regular value)', async () => { + const rnl = new RelayNetworkLayer([ + authMiddleware({ + token: '123', + tokenRefreshPromise: () => 456, + }), + ]); + + const req1 = mockReq(); + await rnl.sendMutation(req1); + + const reqs = fetchMock.calls('/graphql'); + expect(reqs).toHaveLength(2); + expect(reqs[1][1].headers.Authorization).toBe('Bearer 456'); + }); + }); +}); diff --git a/test/batch.test.js b/src/middleware/__tests__/batch.test.js similarity index 52% rename from test/batch.test.js rename to src/middleware/__tests__/batch.test.js index 96309b8..8f3fe72 100644 --- a/test/batch.test.js +++ b/src/middleware/__tests__/batch.test.js @@ -1,8 +1,7 @@ -import { assert } from 'chai'; import fetchMock from 'fetch-mock'; import FormData from 'form-data'; -import { RelayNetworkLayer, batchMiddleware } from '../src'; -import { mockReq, mockReqWithSize, mockReqWithFiles } from './testutils'; +import { RelayNetworkLayer, batchMiddleware } from '../../'; +import { mockReq, mockReqWithSize, mockReqWithFiles } from '../../__mocks__/mockReq'; global.FormData = FormData; @@ -13,30 +12,36 @@ describe('batchMiddleware', () => { fetchMock.restore(); }); - it('should make a successfull single request', () => { - fetchMock.post('/graphql', { data: {} }); - return assert.isFulfilled(rnl.sendQueries([mockReq()])); + it('should make a successfull single request', async () => { + fetchMock.post('/graphql', { data: { ok: 1 } }); + const req = mockReq(); + await rnl.sendQueries([req]); + expect(req.payload).toEqual({ response: { ok: 1 } }); }); - it('should make a successfully batch request', () => { + it('should make a successfully batch request', async () => { fetchMock.mock({ matcher: '/graphql/batch', response: { status: 200, - body: [{ id: 1, data: {} }, { id: 2, data: {} }], + body: [{ id: 1, data: { ok: 1 } }, { id: 2, data: { ok: 2 } }], }, method: 'POST', }); - return assert.isFulfilled(rnl.sendQueries([mockReq(1), mockReq(2)])); + const req1 = mockReq(1); + const req2 = mockReq(2); + await rnl.sendQueries([req1, req2]); + expect(req1.payload).toEqual({ response: { ok: 1 } }); + expect(req2.payload).toEqual({ response: { ok: 2 } }); }); - it('should make a successfully batch request with duplicate request ids', () => { + it('should make a successfully batch request with duplicate request ids', async () => { fetchMock.mock({ matcher: '/graphql/batch', response: { status: 200, - body: [{ id: 1, data: {} }, { id: 2, data: {} }], + body: [{ id: 1, data: { ok: 1 } }, { id: 2, data: { ok: 2 } }], }, method: 'POST', }); @@ -45,67 +50,53 @@ describe('batchMiddleware', () => { const req2 = mockReq(2); const req3 = mockReq(2); - return assert.isFulfilled(rnl.sendQueries([req1, req2, req3])); + await rnl.sendQueries([req1, req2, req3]); + expect(req1.payload).toEqual({ response: { ok: 1 } }); + expect(req2.payload).toEqual({ response: { ok: 2 } }); + expect(req3.payload).toEqual({ response: { ok: 2 } }); }); - it('should reject if server does not return response for request', () => { + it('should reject if server does not return response for request', async () => { fetchMock.mock({ matcher: '/graphql/batch', response: { status: 200, - body: [{ data: {} }, { data: {} }], + body: [{ data: {} }, { id: 2, data: { ok: 2 } }], }, method: 'POST', }); const req1 = mockReq(1); const req2 = mockReq(2); - return assert.isFulfilled( - rnl.sendQueries([req1, req2]).then(() => { - assert(req1.error instanceof Error); - assert( - /Server does not return response for request/.test(req1.error.message) - ); - assert(req2.error instanceof Error); - assert( - /Server does not return response for request/.test(req2.error.message) - ); - }) - ); + await rnl.sendQueries([req1, req2]); + + expect(req1.error).toBeInstanceOf(Error); + expect(req1.error.toString()).toMatch('Server does not return response for request'); + expect(req2.payload).toEqual({ response: { ok: 2 } }); }); - it('should reject if server does not return response for duplicate request ids', () => { + it('should reject if server does not return response for duplicate request ids', async () => { fetchMock.mock({ matcher: '/graphql/batch', response: { status: 200, - body: [{ data: {} }, { data: {} }], + body: [{ data: {} }, { id: 2, data: { ok: 2 } }], }, method: 'POST', }); const req1 = mockReq(1); const req2 = mockReq(2); - const req3 = mockReq(2); - return assert.isFulfilled( - rnl.sendQueries([req1, req2, req3]).then(() => { - assert(req1.error instanceof Error); - assert( - /Server does not return response for request/.test(req1.error.message) - ); - assert(req2.error instanceof Error); - assert( - /Server does not return response for request/.test(req2.error.message) - ); - assert(req3.error instanceof Error); - assert( - /Server does not return response for request/.test(req3.error.message) - ); - }) - ); + const req3 = mockReq(3); + await rnl.sendQueries([req1, req2, req3]); + expect(req1.error).toBeInstanceOf(Error); + expect(req1.error.toString()).toMatch('Server does not return response for request'); + expect(req2.payload).toEqual({ response: { ok: 2 } }); + expect(req3.error).toBeInstanceOf(Error); + expect(req3.error.toString()).toMatch('Server does not return response for request'); }); - it('should handle network failure', () => { + it('should handle network failure', async () => { fetchMock.mock({ matcher: '/graphql/batch', response: { @@ -115,15 +106,15 @@ describe('batchMiddleware', () => { }); const req1 = mockReq(1); const req2 = mockReq(2); - return assert.isFulfilled(rnl.sendQueries([req1, req2])).then(() => { - assert(req1.error instanceof Error); - assert(/Network connection error/.test(req1.error.message)); - assert(req2.error instanceof Error); - assert(/Network connection error/.test(req2.error.message)); - }); + await rnl.sendQueries([req1, req2]); + + expect(req1.error).toBeInstanceOf(Error); + expect(req1.error.toString()).toMatch('Network connection error'); + expect(req2.error).toBeInstanceOf(Error); + expect(req2.error.toString()).toMatch('Network connection error'); }); - it('should handle server errors for one request', () => { + it('should handle server errors for one request', async () => { fetchMock.mock({ matcher: '/graphql/batch', response: { @@ -135,7 +126,7 @@ describe('batchMiddleware', () => { errors: [{ location: 1, message: 'major error' }], }, }, - { id: 2, payload: { data: {} } }, + { id: 2, payload: { data: { ok: 2 } } }, ], }, method: 'POST', @@ -143,13 +134,15 @@ describe('batchMiddleware', () => { const req1 = mockReq(1); const req2 = mockReq(2); - return assert.isFulfilled(rnl.sendQueries([req1, req2])).then(() => { - assert(req1.error instanceof Error, 'should be an error'); - assert(!req2.error); - }); + await rnl.sendQueries([req1, req2]); + + expect(req1.error).toBeInstanceOf(Error); + expect(req1.error.toString()).toMatch('major error'); + expect(req2.payload).toEqual({ response: { ok: 2 } }); + expect(req2.error).toBeUndefined(); }); - it('should handle server errors for all requests', () => { + it('should handle server errors for all requests', async () => { fetchMock.mock({ matcher: '/graphql/batch', response: { @@ -164,14 +157,15 @@ describe('batchMiddleware', () => { const req1 = mockReq(1); const req2 = mockReq(2); const req3 = mockReq(3); - return assert.isFulfilled(rnl.sendQueries([req1, req2, req3])).then(() => { - assert(req1.error instanceof Error, 'should be an error'); - assert(req2.error instanceof Error, 'should be an error'); - assert(req3.error instanceof Error, 'should be an error'); - }); + + await rnl.sendQueries([req1, req2, req3]); + + expect(req1.error.toString()).toMatch('Wrong response'); + expect(req2.error.toString()).toMatch('Wrong response'); + expect(req3.error.toString()).toMatch('Wrong response'); }); - it('should handle responses without payload wrapper', () => { + it('should handle responses without payload wrapper', async () => { fetchMock.mock({ matcher: '/graphql/batch', response: { @@ -181,7 +175,7 @@ describe('batchMiddleware', () => { id: 1, errors: [{ location: 1, message: 'major error' }], }, - { id: 2, data: {} }, + { id: 2, data: { ok: 2 } }, ], }, method: 'POST', @@ -189,10 +183,13 @@ describe('batchMiddleware', () => { const req1 = mockReq(1); const req2 = mockReq(2); - return assert.isFulfilled(rnl.sendQueries([req1, req2])).then(() => { - assert(req1.error instanceof Error, 'should be an error'); - assert(!req2.error); - }); + + await rnl.sendQueries([req1, req2]); + + expect(req1.error).toBeInstanceOf(Error); + expect(req1.error.toString()).toMatch('major error'); + expect(req2.payload).toEqual({ response: { ok: 2 } }); + expect(req2.error).toBeUndefined(); }); describe('option `batchTimeout`', () => { @@ -202,7 +199,7 @@ describe('batchMiddleware', () => { fetchMock.restore(); }); - it('should gather different requests into one batch request', () => { + it('should gather different requests into one batch request', async () => { fetchMock.mock({ matcher: '/graphql/batch', response: { @@ -215,17 +212,16 @@ describe('batchMiddleware', () => { rnl2.sendQueries([mockReq(1)]); setTimeout(() => rnl2.sendQueries([mockReq(2)]), 30); - return assert.isFulfilled(rnl2.sendQueries([mockReq(3)])).then(() => { - const reqs = fetchMock.calls('/graphql/batch'); - assert.equal(reqs.length, 1); - assert.equal( - reqs[0][1].body, - '[{"id":1,"query":"{}","variables":{}},{"id":2,"query":"{}","variables":{}},{"id":3,"query":"{}","variables":{}}]' - ); - }); + await rnl2.sendQueries([mockReq(3)]); + + const reqs = fetchMock.calls('/graphql/batch'); + expect(reqs).toHaveLength(1); + expect(reqs[0][1].body).toEqual( + '[{"id":1,"query":"{}","variables":{}},{"id":2,"query":"{}","variables":{}},{"id":3,"query":"{}","variables":{}}]' + ); }); - it('should gather different requests into two batch request', () => { + it('should gather different requests into two batch request', async () => { fetchMock.mock({ matcher: '/graphql/batch', response: { @@ -245,36 +241,31 @@ describe('batchMiddleware', () => { setTimeout(() => rnl2.sendQueries([mockReq(2)]), 60); setTimeout(() => rnl2.sendQueries([mockReq(3)]), 70); - return assert.isFulfilled(rnl2.sendQueries([mockReq(4)])).then(() => { - return new Promise(resolve => { - setTimeout(() => { - const reqs = fetchMock.calls('/graphql/batch'); - assert.equal(reqs.length, 2); - assert.equal( - reqs[0][1].body, - '[{"id":1,"query":"{}","variables":{}},{"id":4,"query":"{}","variables":{}}]' - ); - assert.equal( - reqs[1][1].body, - '[{"id":2,"query":"{}","variables":{}},{"id":3,"query":"{}","variables":{}}]' - ); - resolve(); - }, 100); - }); + await rnl2.sendQueries([mockReq(4)]); + await new Promise(resolve => { + setTimeout(() => { + const reqs = fetchMock.calls('/graphql/batch'); + expect(reqs).toHaveLength(2); + expect(reqs[0][1].body).toBe( + '[{"id":1,"query":"{}","variables":{}},{"id":4,"query":"{}","variables":{}}]' + ); + expect(reqs[1][1].body).toBe( + '[{"id":2,"query":"{}","variables":{}},{"id":3,"query":"{}","variables":{}}]' + ); + resolve(); + }, 100); }); }); }); describe('option `maxBatchSize`', () => { - const rnl3 = new RelayNetworkLayer([ - batchMiddleware({ maxBatchSize: 1024 * 10 }), - ]); + const rnl3 = new RelayNetworkLayer([batchMiddleware({ maxBatchSize: 1024 * 10 })]); beforeEach(() => { fetchMock.restore(); }); - it('should split large batched requests into multiple requests', () => { + it('should split large batched requests into multiple requests', async () => { fetchMock.mock({ matcher: '/graphql', response: { @@ -304,14 +295,12 @@ describe('batchMiddleware', () => { const req4 = mockReqWithSize(4, 1024 * 4); const req5 = mockReqWithSize(5, 1024 * 11); - return assert - .isFulfilled(rnl3.sendQueries([req1, req2, req3, req4, req5])) - .then(() => { - const batchReqs = fetchMock.calls('/graphql/batch'); - const singleReqs = fetchMock.calls('/graphql'); - assert.equal(batchReqs.length, 2); - assert.equal(singleReqs.length, 1); - }); + await rnl3.sendQueries([req1, req2, req3, req4, req5]); + + const batchReqs = fetchMock.calls('/graphql/batch'); + const singleReqs = fetchMock.calls('/graphql'); + expect(batchReqs).toHaveLength(2); + expect(singleReqs).toHaveLength(1); }); }); @@ -320,10 +309,8 @@ describe('batchMiddleware', () => { fetchMock.restore(); }); - it('should not batch mutations by default', () => { - const rnlTimeout20 = new RelayNetworkLayer([ - batchMiddleware({ batchTimeout: 20 }), - ]); + it('should not batch mutations by default', async () => { + const rnlTimeout20 = new RelayNetworkLayer([batchMiddleware({ batchTimeout: 20 })]); fetchMock.mock({ matcher: '/graphql', @@ -338,13 +325,13 @@ describe('batchMiddleware', () => { rnlTimeout20.sendMutation(req1); const req2 = mockReqWithFiles(1); - return assert.isFulfilled(rnlTimeout20.sendMutation(req2)).then(() => { - const singleReqs = fetchMock.calls('/graphql'); - assert.equal(singleReqs.length, 2); - }); + await rnlTimeout20.sendMutation(req2); + + const singleReqs = fetchMock.calls('/graphql'); + expect(singleReqs).toHaveLength(2); }); - it('should batch mutations if `allowMutations=true`', () => { + it('should batch mutations if `allowMutations=true`', async () => { const rnlAllowMutations = new RelayNetworkLayer([ batchMiddleware({ batchTimeout: 20, allowMutations: true }), ]); @@ -362,15 +349,13 @@ describe('batchMiddleware', () => { rnlAllowMutations.sendMutation(req1); const req2 = mockReq(2); - return assert - .isFulfilled(rnlAllowMutations.sendMutation(req2)) - .then(() => { - const batchReqs = fetchMock.calls('/graphql/batch'); - assert.equal(batchReqs.length, 1); - }); + await rnlAllowMutations.sendMutation(req2); + + const batchReqs = fetchMock.calls('/graphql/batch'); + expect(batchReqs).toHaveLength(1); }); - it('should not batch mutations with files if `allowMutations=true`', () => { + it('should not batch mutations with files if `allowMutations=true`', async () => { const rnlAllowMutations = new RelayNetworkLayer([ batchMiddleware({ batchTimeout: 20, allowMutations: true }), ]); @@ -388,12 +373,10 @@ describe('batchMiddleware', () => { rnlAllowMutations.sendMutation(req1); const req2 = mockReqWithFiles(1); - return assert - .isFulfilled(rnlAllowMutations.sendMutation(req2)) - .then(() => { - const singleReqs = fetchMock.calls('/graphql'); - assert.equal(singleReqs.length, 2); - }); + await rnlAllowMutations.sendMutation(req2); + + const singleReqs = fetchMock.calls('/graphql'); + expect(singleReqs).toHaveLength(2); }); }); }); diff --git a/src/middleware/__tests__/url.test.js b/src/middleware/__tests__/url.test.js new file mode 100644 index 0000000..ff36457 --- /dev/null +++ b/src/middleware/__tests__/url.test.js @@ -0,0 +1,74 @@ +import fetchMock from 'fetch-mock'; +import { RelayNetworkLayer } from '../../'; +import { mockReq } from '../../__mocks__/mockReq'; +import urlMiddleware from '../url'; + +describe('Middleware / url', () => { + describe('`url` option as string', () => { + const rnl = new RelayNetworkLayer([ + urlMiddleware({ + url: '/other/url', + }), + ]); + + beforeEach(() => { + fetchMock.restore(); + + fetchMock.mock({ + matcher: '/other/url', + response: { + status: 200, + body: { data: 'PAYLOAD' }, + sendAsJson: true, + }, + method: 'POST', + }); + }); + + it('should work with query', async () => { + const req1 = mockReq(); + await rnl.sendQueries([req1]); + expect(req1.payload.response).toBe('PAYLOAD'); + }); + + it('should work with mutation', async () => { + const req1 = mockReq(); + await rnl.sendMutation(req1); + expect(req1.payload.response).toBe('PAYLOAD'); + }); + }); + + describe('`url` option as thunk', async () => { + const rnl = new RelayNetworkLayer([ + urlMiddleware({ + url: () => '/thunk_url', + }), + ]); + + beforeEach(() => { + fetchMock.restore(); + + fetchMock.mock({ + matcher: '/thunk_url', + response: { + status: 200, + body: { data: 'PAYLOAD2' }, + sendAsJson: true, + }, + method: 'POST', + }); + }); + + it('should work with query', async () => { + const req1 = mockReq(); + await rnl.sendQueries([req1]); + expect(req1.payload.response).toBe('PAYLOAD2'); + }); + + it('should work with mutation', async () => { + const req1 = mockReq(); + await rnl.sendQueries([req1]); + expect(req1.payload.response).toBe('PAYLOAD2'); + }); + }); +}); diff --git a/test/middleware/auth.test.js b/test/middleware/auth.test.js deleted file mode 100644 index c0ca0a1..0000000 --- a/test/middleware/auth.test.js +++ /dev/null @@ -1,149 +0,0 @@ -import { assert } from 'chai'; -import fetchMock from 'fetch-mock'; -import { RelayNetworkLayer } from '../../src'; -import { mockReq } from '../testutils'; -import authMiddleware from '../../src/middleware/auth'; - -describe('Middleware / auth', () => { - describe('`token` option as string (with default `prefix` and `header`)', () => { - const rnl = new RelayNetworkLayer([ - authMiddleware({ - token: '123', - tokenRefreshPromise: () => 345, - }), - ]); - - beforeEach(() => { - fetchMock.restore(); - - fetchMock.mock({ - matcher: '/graphql', - response: { - status: 200, - body: { data: 'PAYLOAD' }, - sendAsJson: true, - }, - method: 'POST', - }); - }); - - it('should work with query', () => { - const req1 = mockReq(); - return rnl.sendQueries([req1]).then(() => { - assert.equal(req1.payload.response, 'PAYLOAD'); - const reqs = fetchMock.calls('/graphql'); - assert.equal(reqs.length, 1); - assert.equal(reqs[0][1].headers.Authorization, 'Bearer 123'); - }); - }); - - it('should work with mutation', () => { - const req1 = mockReq(); - return assert.isFulfilled( - rnl.sendMutation(req1).then(() => { - assert.equal(req1.payload.response, 'PAYLOAD'); - const reqs = fetchMock.calls('/graphql'); - assert.equal(reqs.length, 1); - assert.equal(reqs[0][1].headers.Authorization, 'Bearer 123'); - }) - ); - }); - }); - - describe('`token` option as thunk (with custom `prefix` and `header`)', () => { - const rnl = new RelayNetworkLayer([ - authMiddleware({ - token: () => '333', - tokenRefreshPromise: () => 345, - prefix: 'MyBearer ', - header: 'MyAuthorization', - }), - ]); - - beforeEach(() => { - fetchMock.restore(); - - fetchMock.mock({ - matcher: '/graphql', - response: { - status: 200, - body: { data: 'PAYLOAD' }, - sendAsJson: true, - }, - method: 'POST', - }); - }); - - it('should work with query', () => { - const req1 = mockReq(); - return rnl.sendQueries([req1]).then(() => { - assert.equal(req1.payload.response, 'PAYLOAD'); - const reqs = fetchMock.calls('/graphql'); - assert.equal(reqs.length, 1); - assert.equal(reqs[0][1].headers.MyAuthorization, 'MyBearer 333'); - }); - }); - - it('should work with mutation', () => { - const req1 = mockReq(); - return assert.isFulfilled( - rnl.sendMutation(req1).then(() => { - assert.equal(req1.payload.response, 'PAYLOAD'); - const reqs = fetchMock.calls('/graphql'); - assert.equal(reqs.length, 1); - assert.equal(reqs[0][1].headers.MyAuthorization, 'MyBearer 333'); - }) - ); - }); - }); - - describe('`tokenRefreshPromise` should be called on 401 response', () => { - beforeEach(() => { - fetchMock.restore(); - - fetchMock.mock({ - matcher: '/graphql', - response: { - status: 401, - body: { data: 'PAYLOAD' }, - sendAsJson: true, - }, - method: 'POST', - }); - }); - - it('should work with query (provided promise)', () => { - const rnl = new RelayNetworkLayer([ - authMiddleware({ - token: '123', - tokenRefreshPromise: () => Promise.resolve(345), - }), - ]); - - const req1 = mockReq(); - return rnl.sendQueries([req1]).then(() => { - const reqs = fetchMock.calls('/graphql'); - assert.equal(reqs.length, 2); - assert.equal(reqs[1][1].headers.Authorization, 'Bearer 345'); - }); - }); - - it('should work with mutation (provided regular value)', () => { - const rnl = new RelayNetworkLayer([ - authMiddleware({ - token: '123', - tokenRefreshPromise: () => 456, - }), - ]); - - const req1 = mockReq(); - return assert.isFulfilled( - rnl.sendMutation(req1).then(() => { - const reqs = fetchMock.calls('/graphql'); - assert.equal(reqs.length, 2); - assert.equal(reqs[1][1].headers.Authorization, 'Bearer 456'); - }) - ); - }); - }); -}); diff --git a/test/middleware/url.test.js b/test/middleware/url.test.js deleted file mode 100644 index e32ebeb..0000000 --- a/test/middleware/url.test.js +++ /dev/null @@ -1,83 +0,0 @@ -import { assert } from 'chai'; -import fetchMock from 'fetch-mock'; -import { RelayNetworkLayer } from '../../src'; -import { mockReq } from '../testutils'; -import urlMiddleware from '../../src/middleware/url'; - -describe('Middleware / url', () => { - describe('`url` option as string', () => { - const rnl = new RelayNetworkLayer([ - urlMiddleware({ - url: '/other/url', - }), - ]); - - beforeEach(() => { - fetchMock.restore(); - - fetchMock.mock({ - matcher: '/other/url', - response: { - status: 200, - body: { data: 'PAYLOAD' }, - sendAsJson: true, - }, - method: 'POST', - }); - }); - - it('should work with query', () => { - const req1 = mockReq(); - return rnl.sendQueries([req1]).then(() => { - assert.equal(req1.payload.response, 'PAYLOAD'); - }); - }); - - it('should work with mutation', () => { - const req1 = mockReq(); - return assert.isFulfilled( - rnl.sendMutation(req1).then(() => { - assert.equal(req1.payload.response, 'PAYLOAD'); - }) - ); - }); - }); - - describe('`url` option as thunk', () => { - const rnl = new RelayNetworkLayer([ - urlMiddleware({ - url: (_) => '/thunk_url', // eslint-disable-line - }), - ]); - - beforeEach(() => { - fetchMock.restore(); - - fetchMock.mock({ - matcher: '/thunk_url', - response: { - status: 200, - body: { data: 'PAYLOAD' }, - sendAsJson: true, - }, - method: 'POST', - }); - }); - - it('should work with query', () => { - const req1 = mockReq(); - return rnl.sendQueries([req1]).then(() => { - assert.equal(req1.payload.response, 'PAYLOAD'); - }); - }); - - it('should work with mutation', () => { - const req1 = mockReq(); - return assert.isFulfilled( - rnl.sendMutation(req1).then(() => { - assert.equal(req1.payload.response, 'PAYLOAD'); - }) - ); - }); - }); -}); diff --git a/test/mocha-bootload.js b/test/mocha-bootload.js deleted file mode 100644 index c217182..0000000 --- a/test/mocha-bootload.js +++ /dev/null @@ -1,11 +0,0 @@ -/* eslint-disable */ - -var chai = require('chai'); -var chaiAsPromised = require('chai-as-promised'); -chai.use(chaiAsPromised); - -process.on('unhandledRejection', function(error) { - console.error('Unhandled Promise Rejection:'); - console.error((error && error.stack) || error); - exit(1); -}); diff --git a/test/mutation.test.js b/test/mutation.test.js deleted file mode 100644 index ee2a011..0000000 --- a/test/mutation.test.js +++ /dev/null @@ -1,76 +0,0 @@ -import { assert } from 'chai'; -import fetchMock from 'fetch-mock'; -import { RelayNetworkLayer } from '../src'; -import { mockReq } from './testutils'; - -describe('Mutation tests', () => { - const middlewares = []; - const rnl = new RelayNetworkLayer(middlewares); - - beforeEach(() => { - fetchMock.restore(); - }); - - it('should make a successfull mutation', () => { - fetchMock.post('/graphql', { data: {} }); - return assert.isFulfilled(rnl.sendMutation(mockReq())); - }); - - it('should fail correctly on network failure', () => { - fetchMock.mock({ - matcher: '/graphql', - response: { - throws: new Error('Network connection error'), - }, - method: 'POST', - }); - const req1 = mockReq(); - return assert.isFulfilled( - rnl.sendMutation(req1).then(() => { - assert(req1.error instanceof Error); - assert(/Network connection error/.test(req1.error.message)); - }) - ); - }); - - it('should handle error response', () => { - fetchMock.mock({ - matcher: '/graphql', - response: { - status: 200, - body: { - errors: [{ location: 1, message: 'major error' }], - }, - }, - method: 'POST', - }); - - const req1 = mockReq(1); - return assert.isFulfilled( - rnl.sendMutation(req1).then(() => { - assert(req1.error instanceof Error, 'should be an error'); - }) - ); - }); - - it('should handle server non-2xx errors', () => { - fetchMock.mock({ - matcher: '/graphql', - - response: { - status: 500, - body: 'Something went completely wrong.', - }, - method: 'POST', - }); - - const req1 = mockReq(1); - return assert.isFulfilled( - rnl.sendMutation(req1).then(() => { - assert(req1.error instanceof Error, 'should be an error'); - assert.equal(req1.error.message, 'Something went completely wrong.'); - assert.equal(req1.error.fetchResponse.status, 500); - }) - ); - }); -}); diff --git a/yarn.lock b/yarn.lock index f25b497..f26049c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -54,10 +54,20 @@ JSONStream@^1.0.4: jsonparse "^1.2.0" through ">=2.2.7 <3" +abab@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + abbrev@1: version "1.1.0" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" +acorn-globals@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" + dependencies: + acorn "^4.0.4" + acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" @@ -68,6 +78,10 @@ acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" +acorn@^4.0.4: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + acorn@^5.1.1: version "5.2.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" @@ -126,7 +140,7 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansi-styles@^3.1.0: +ansi-styles@^3.1.0, ansi-styles@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" dependencies: @@ -149,10 +163,6 @@ aproba@^1.0.3: version "1.1.1" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - are-we-there-yet@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" @@ -176,6 +186,10 @@ arr-flatten@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -214,15 +228,15 @@ assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" -assertion-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@^1.4.0, async@^1.4.2: +async@^1.4.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -232,6 +246,12 @@ async@^2.0.1: dependencies: lodash "^4.14.0" +async@^2.1.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" + dependencies: + lodash "^4.14.0" + async@~0.2.6: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" @@ -293,7 +313,7 @@ babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.26.0: +babel-core@^6.0.0, babel-core@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" dependencies: @@ -326,20 +346,7 @@ babel-eslint@^8.0.1: babel-types "7.0.0-beta.0" babylon "7.0.0-beta.22" -babel-generator@^6.18.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.23.0.tgz#6b8edab956ef3116f79d8c84c5a3c05f32a74bc5" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.23.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" - trim-right "^1.0.1" - -babel-generator@^6.26.0: +babel-generator@^6.18.0, babel-generator@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" dependencies: @@ -468,6 +475,13 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" +babel-jest@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-21.2.0.tgz#2ce059519a9374a2c46f2455b6fbef5ad75d863e" + dependencies: + babel-plugin-istanbul "^4.0.0" + babel-preset-jest "^21.2.0" + babel-messages@7.0.0-beta.0: version "7.0.0-beta.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-7.0.0-beta.0.tgz#6df01296e49fc8fbd0637394326a167f36da817b" @@ -484,6 +498,18 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" +babel-plugin-istanbul@^4.0.0: + version "4.1.5" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e" + dependencies: + find-up "^2.1.0" + istanbul-lib-instrument "^1.7.5" + test-exclude "^4.1.1" + +babel-plugin-jest-hoist@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz#2cef637259bd4b628a6cace039de5fcd14dbb006" + babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -492,7 +518,7 @@ babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" -babel-plugin-syntax-object-rest-spread@^6.8.0: +babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" @@ -771,6 +797,13 @@ babel-preset-env@^1.6.1: invariant "^2.2.2" semver "^5.3.0" +babel-preset-jest@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz#ff9d2bce08abd98e8a36d9a8a5189b9173b85638" + dependencies: + babel-plugin-jest-hoist "^21.2.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" + babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" @@ -806,17 +839,7 @@ babel-template@7.0.0-beta.0: babylon "7.0.0-beta.22" lodash "^4.2.0" -babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.23.0" - babel-types "^6.23.0" - babylon "^6.11.0" - lodash "^4.2.0" - -babel-template@^6.24.1, babel-template@^6.26.0: +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" dependencies: @@ -826,6 +849,16 @@ babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" +babel-template@^6.22.0, babel-template@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.23.0" + babel-types "^6.23.0" + babylon "^6.11.0" + lodash "^4.2.0" + babel-traverse@7.0.0-beta.0: version "7.0.0-beta.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-7.0.0-beta.0.tgz#da14be9b762f62a2f060db464eaafdd8cd072a41" @@ -840,21 +873,7 @@ babel-traverse@7.0.0-beta.0: invariant "^2.2.0" lodash "^4.2.0" -babel-traverse@^6.18.0, babel-traverse@^6.23.0: - version "6.23.1" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48" - dependencies: - babel-code-frame "^6.22.0" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-types "^6.23.0" - babylon "^6.15.0" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: @@ -868,6 +887,20 @@ babel-traverse@^6.24.1, babel-traverse@^6.26.0: invariant "^2.2.2" lodash "^4.17.4" +babel-traverse@^6.23.0: + version "6.23.1" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.23.0" + babylon "^6.15.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + babel-types@7.0.0-beta.0: version "7.0.0-beta.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-7.0.0-beta.0.tgz#eb8b6e556470e6dcc4aef982d79ad229469b5169" @@ -876,16 +909,7 @@ babel-types@7.0.0-beta.0: lodash "^4.2.0" to-fast-properties "^2.0.0" -babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf" - dependencies: - babel-runtime "^6.22.0" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" - -babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -894,11 +918,20 @@ babel-types@^6.24.1, babel-types@^6.26.0: lodash "^4.17.4" to-fast-properties "^1.0.3" +babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + babylon@7.0.0-beta.22: version "7.0.0-beta.22" resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.22.tgz#74f0ad82ed7c7c3cfeab74cf684f815104161b65" -babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0: +babylon@^6.11.0, babylon@^6.15.0: version "6.16.1" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.16.1.tgz#30c5a22f481978a9e7f8cdfdf496b11d94b404d3" @@ -964,9 +997,11 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -browser-stdout@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" +browser-resolve@^1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" browserslist@^2.1.2: version "2.6.1" @@ -975,6 +1010,12 @@ browserslist@^2.1.2: caniuse-lite "^1.0.30000755" electron-to-chromium "^1.3.27" +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + dependencies: + node-int64 "^0.4.0" + buffer-shims@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" @@ -987,14 +1028,6 @@ builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" -caching-transform@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" - dependencies: - md5-hex "^1.2.0" - mkdirp "^0.5.1" - write-file-atomic "^1.1.4" - caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" @@ -1005,6 +1038,10 @@ callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -1020,9 +1057,9 @@ camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" caniuse-lite@^1.0.30000755: version "1.0.30000757" @@ -1043,23 +1080,6 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chai-as-promised@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" - dependencies: - check-error "^1.0.2" - -chai@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" - dependencies: - assertion-error "^1.0.1" - check-error "^1.0.1" - deep-eql "^3.0.0" - get-func-name "^2.0.0" - pathval "^1.0.0" - type-detect "^4.0.0" - chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -1070,7 +1090,7 @@ chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.1.0: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" dependencies: @@ -1078,10 +1098,6 @@ chalk@^2.0.0, chalk@^2.1.0: escape-string-regexp "^1.0.5" supports-color "^4.0.0" -check-error@^1.0.1, check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - chokidar@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" @@ -1097,6 +1113,10 @@ chokidar@^1.6.1: optionalDependencies: fsevents "^1.0.0" +ci-info@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.1.tgz#47b44df118c48d2597b56d342e7e25791060171a" + circular-json@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" @@ -1151,19 +1171,15 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@2.9.0, commander@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - dependencies: - graceful-readlink ">= 1.0.0" - commander@^2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" +commander@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" compare-func@^1.3.1: version "1.3.2" @@ -1199,6 +1215,10 @@ contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" +content-type-parser@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" + conventional-changelog-angular@^1.4.0: version "1.5.1" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.5.1.tgz#974e73aa1c39c392e4364f2952bd9a62904e9ea3" @@ -1262,11 +1282,7 @@ conventional-commits-parser@^2.0.0: through2 "^2.0.0" trim-off-newlines "^1.0.0" -convert-source-map@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.4.0.tgz#e3dad195bf61bfe13a7a3c73e9876ec14a0268f3" - -convert-source-map@^1.5.0: +convert-source-map@^1.4.0, convert-source-map@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" @@ -1282,13 +1298,6 @@ core-util-is@^1.0.1, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" -cross-spawn@^4: - version "4.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -1303,6 +1312,16 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.37 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -1338,11 +1357,7 @@ dateformat@^1.0.11, dateformat@^1.0.12: get-stdin "^4.0.1" meow "^3.3.0" -debug-log@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" - -debug@2.2.0, debug@^2.2.0, debug@~2.2.0: +debug@^2.2.0, debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: @@ -1354,7 +1369,7 @@ debug@^2.4.1, debug@^2.6.8, debug@^2.6.9: dependencies: ms "2.0.0" -debug@^3.0.1: +debug@^3.0.1, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: @@ -1364,12 +1379,6 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" -deep-eql@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - dependencies: - type-detect "^4.0.0" - deep-extend@~0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" @@ -1410,9 +1419,13 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -diff@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" +detect-libc@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.2.tgz#71ad5d204bf17a6a6ca8f450c61454066ef461e1" + +diff@^3.2.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" doctrine@1.5.0: version "1.5.0" @@ -1450,6 +1463,12 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" +errno@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + error-ex@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" @@ -1466,10 +1485,21 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" +escodegen@^1.6.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.5.6" + eslint-config-airbnb-base@^12.1.0: version "12.1.0" resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944" @@ -1578,6 +1608,10 @@ espree@^3.5.1: acorn "^5.1.1" acorn-jsx "^3.0.0" +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" @@ -1607,6 +1641,24 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" +exec-sh@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" + dependencies: + merge "^1.1.3" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + 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" + execa@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" @@ -1631,6 +1683,17 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" +expect@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-21.2.1.tgz#003ac2ac7005c3c29e73b38a272d4afadd6d1d7b" + dependencies: + ansi-styles "^3.2.0" + jest-diff "^21.2.1" + jest-get-type "^21.2.0" + jest-matcher-utils "^21.2.1" + jest-message-util "^21.2.1" + jest-regex-util "^21.2.0" + extend@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" @@ -1669,6 +1732,12 @@ fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + dependencies: + bser "^2.0.0" + fetch-mock@^5.13.1: version "5.13.1" resolved "https://registry.yarnpkg.com/fetch-mock/-/fetch-mock-5.13.1.tgz#955794a77f3d972f1644b9ace65a0fdfd60f1df7" @@ -1694,6 +1763,13 @@ filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" @@ -1704,22 +1780,14 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - -find-up@^1.0.0, find-up@^1.1.2: +find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0: +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: @@ -1754,13 +1822,6 @@ foreachasync@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/foreachasync/-/foreachasync-3.0.0.tgz#5502987dc8714be3392097f32e0071c9dee07cf6" -foreground-child@^1.3.3, foreground-child@^1.5.3: - version "1.5.6" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" - dependencies: - cross-spawn "^4" - signal-exit "^3.0.0" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -1812,7 +1873,14 @@ fsevents@^1.0.0: nan "^2.3.0" node-pre-gyp "^0.6.29" -fstream-ignore@~1.0.5: +fsevents@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.36" + +fstream-ignore@^1.0.5, fstream-ignore@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" dependencies: @@ -1829,6 +1897,15 @@ fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: mkdirp ">=0.5 0" rimraf "2" +fstream@^1.0.10: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + function-bind@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" @@ -1850,6 +1927,19 @@ gauge@~2.7.1: strip-ansi "^3.0.1" wide-align "^1.1.0" +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + 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" + generate-function@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" @@ -1864,10 +1954,6 @@ get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - get-pkg-repo@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" @@ -1970,18 +2056,7 @@ glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" -glob@7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" - dependencies: - 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@^7.0.3, glob@^7.0.5, glob@^7.0.6: +glob@^7.0.3, glob@^7.0.5: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: @@ -1992,7 +2067,7 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.0.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.2: +glob@^7.1.1, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -2034,11 +2109,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6: version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" -growl@1.9.2: - version "1.9.2" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" -handlebars@^4.0.2: +handlebars@^4.0.2, handlebars@^4.0.3: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" dependencies: @@ -2048,16 +2123,6 @@ handlebars@^4.0.2: optionalDependencies: uglify-js "^2.6" -handlebars@^4.0.3: - version "4.0.6" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" - dependencies: - async "^1.4.0" - optimist "^0.6.1" - source-map "^0.4.4" - optionalDependencies: - uglify-js "^2.6" - har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" @@ -2078,6 +2143,13 @@ har-validator@~4.2.0: ajv "^4.9.1" har-schema "^1.0.5" +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -2102,7 +2174,7 @@ has@^1.0.1: dependencies: function-bind "^1.0.2" -hawk@~3.1.3: +hawk@3.1.3, hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" dependencies: @@ -2130,6 +2202,12 @@ hosted-git-info@^2.4.2: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" +html-encoding-sniffer@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + dependencies: + whatwg-encoding "^1.0.1" + http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -2145,7 +2223,7 @@ https-proxy-agent@^2.1.0: agent-base "^4.1.0" debug "^2.4.1" -iconv-lite@^0.4.17: +iconv-lite@0.4.19, iconv-lite@^0.4.17: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" @@ -2237,6 +2315,12 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" +is-ci@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + dependencies: + ci-info "^1.0.0" + is-dotfile@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" @@ -2368,6 +2452,10 @@ isexe@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" @@ -2378,58 +2466,294 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.0-alpha, istanbul-lib-coverage@^1.0.0-alpha.0, istanbul-lib-coverage@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.1.tgz#f263efb519c051c5f1f3343034fc40e7b43ff212" +istanbul-api@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620" + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.1.1" + istanbul-lib-hook "^1.1.0" + istanbul-lib-instrument "^1.9.1" + istanbul-lib-report "^1.1.2" + istanbul-lib-source-maps "^1.2.2" + istanbul-reports "^1.1.3" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" -istanbul-lib-hook@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0.tgz#fc5367ee27f59268e8f060b0c7aaf051d9c425c5" +istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" + +istanbul-lib-hook@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b" dependencies: append-transform "^0.4.0" -istanbul-lib-instrument@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.4.2.tgz#0e2fdfac93c1dabf2e31578637dc78a19089f43e" +istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e" dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" - babylon "^6.13.0" - istanbul-lib-coverage "^1.0.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.1.1" semver "^5.3.0" -istanbul-lib-report@^1.0.0-alpha.3: - version "1.0.0-alpha.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz#32d5f6ec7f33ca3a602209e278b2e6ff143498af" +istanbul-lib-report@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz#922be27c13b9511b979bd1587359f69798c1d425" dependencies: - async "^1.4.2" - istanbul-lib-coverage "^1.0.0-alpha" + istanbul-lib-coverage "^1.1.1" mkdirp "^0.5.1" path-parse "^1.0.5" - rimraf "^2.4.3" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.0.tgz#9d429218f35b823560ea300a96ff0c3bbdab785f" +istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c" dependencies: - istanbul-lib-coverage "^1.0.0-alpha.0" + debug "^3.1.0" + istanbul-lib-coverage "^1.1.1" mkdirp "^0.5.1" - rimraf "^2.4.4" + rimraf "^2.6.1" source-map "^0.5.3" -istanbul-reports@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.1.tgz#9a17176bc4a6cbebdae52b2f15961d52fa623fbc" +istanbul-reports@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.3.tgz#3b9e1e8defb6d18b1d425da8e8b32c5a163f2d10" dependencies: handlebars "^4.0.3" -jest-docblock@^21.0.0: +jest-changed-files@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-21.2.0.tgz#5dbeecad42f5d88b482334902ce1cba6d9798d29" + dependencies: + throat "^4.0.0" + +jest-cli@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-21.2.1.tgz#9c528b6629d651911138d228bdb033c157ec8c00" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + istanbul-api "^1.1.1" + istanbul-lib-coverage "^1.0.1" + istanbul-lib-instrument "^1.4.2" + istanbul-lib-source-maps "^1.1.0" + jest-changed-files "^21.2.0" + jest-config "^21.2.1" + jest-environment-jsdom "^21.2.1" + jest-haste-map "^21.2.0" + jest-message-util "^21.2.1" + jest-regex-util "^21.2.0" + jest-resolve-dependencies "^21.2.0" + jest-runner "^21.2.1" + jest-runtime "^21.2.1" + jest-snapshot "^21.2.1" + jest-util "^21.2.1" + micromatch "^2.3.11" + node-notifier "^5.0.2" + pify "^3.0.0" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + worker-farm "^1.3.1" + yargs "^9.0.0" + +jest-config@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-21.2.1.tgz#c7586c79ead0bcc1f38c401e55f964f13bf2a480" + dependencies: + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^21.2.1" + jest-environment-node "^21.2.1" + jest-get-type "^21.2.0" + jest-jasmine2 "^21.2.1" + jest-regex-util "^21.2.0" + jest-resolve "^21.2.0" + jest-util "^21.2.1" + jest-validate "^21.2.1" + pretty-format "^21.2.1" + +jest-diff@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-21.2.1.tgz#46cccb6cab2d02ce98bc314011764bb95b065b4f" + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^21.2.0" + pretty-format "^21.2.1" + +jest-docblock@^21.0.0, jest-docblock@^21.2.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" +jest-environment-jsdom@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz#38d9980c8259b2a608ec232deee6289a60d9d5b4" + dependencies: + jest-mock "^21.2.0" + jest-util "^21.2.1" + jsdom "^9.12.0" + +jest-environment-node@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-21.2.1.tgz#98c67df5663c7fbe20f6e792ac2272c740d3b8c8" + dependencies: + jest-mock "^21.2.0" + jest-util "^21.2.1" + +jest-get-type@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23" + +jest-haste-map@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-21.2.0.tgz#1363f0a8bb4338f24f001806571eff7a4b2ff3d8" + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + jest-docblock "^21.2.0" + micromatch "^2.3.11" + sane "^2.0.0" + worker-farm "^1.3.1" + +jest-jasmine2@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz#9cc6fc108accfa97efebce10c4308548a4ea7592" + dependencies: + chalk "^2.0.1" + expect "^21.2.1" + graceful-fs "^4.1.11" + jest-diff "^21.2.1" + jest-matcher-utils "^21.2.1" + jest-message-util "^21.2.1" + jest-snapshot "^21.2.1" + p-cancelable "^0.3.0" + +jest-matcher-utils@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz#72c826eaba41a093ac2b4565f865eb8475de0f64" + dependencies: + chalk "^2.0.1" + jest-get-type "^21.2.0" + pretty-format "^21.2.1" + +jest-message-util@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-21.2.1.tgz#bfe5d4692c84c827d1dcf41823795558f0a1acbe" + dependencies: + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + +jest-mock@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-21.2.0.tgz#7eb0770e7317968165f61ea2a7281131534b3c0f" + +jest-regex-util@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-21.2.0.tgz#1b1e33e63143babc3e0f2e6c9b5ba1eb34b2d530" + +jest-resolve-dependencies@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz#9e231e371e1a736a1ad4e4b9a843bc72bfe03d09" + dependencies: + jest-regex-util "^21.2.0" + +jest-resolve@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-21.2.0.tgz#068913ad2ba6a20218e5fd32471f3874005de3a6" + dependencies: + browser-resolve "^1.11.2" + chalk "^2.0.1" + is-builtin-module "^1.0.0" + +jest-runner@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-21.2.1.tgz#194732e3e518bfb3d7cbfc0fd5871246c7e1a467" + dependencies: + jest-config "^21.2.1" + jest-docblock "^21.2.0" + jest-haste-map "^21.2.0" + jest-jasmine2 "^21.2.1" + jest-message-util "^21.2.1" + jest-runtime "^21.2.1" + jest-util "^21.2.1" + pify "^3.0.0" + throat "^4.0.0" + worker-farm "^1.3.1" + +jest-runtime@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-21.2.1.tgz#99dce15309c670442eee2ebe1ff53a3cbdbbb73e" + dependencies: + babel-core "^6.0.0" + babel-jest "^21.2.0" + babel-plugin-istanbul "^4.0.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + graceful-fs "^4.1.11" + jest-config "^21.2.1" + jest-haste-map "^21.2.0" + jest-regex-util "^21.2.0" + jest-resolve "^21.2.0" + jest-util "^21.2.1" + json-stable-stringify "^1.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^9.0.0" + +jest-snapshot@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-21.2.1.tgz#29e49f16202416e47343e757e5eff948c07fd7b0" + dependencies: + chalk "^2.0.1" + jest-diff "^21.2.1" + jest-matcher-utils "^21.2.1" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^21.2.1" + +jest-util@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-21.2.1.tgz#a274b2f726b0897494d694a6c3d6a61ab819bb78" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + jest-message-util "^21.2.1" + jest-mock "^21.2.0" + jest-validate "^21.2.1" + mkdirp "^0.5.1" + +jest-validate@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7" + dependencies: + chalk "^2.0.1" + jest-get-type "^21.2.0" + leven "^2.1.0" + pretty-format "^21.2.1" + +jest@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-21.2.1.tgz#c964e0b47383768a1438e3ccf3c3d470327604e1" + dependencies: + jest-cli "^21.2.1" + jodid25519@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" @@ -2444,7 +2768,7 @@ js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@^3.9.1: +js-yaml@^3.7.0, js-yaml@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" dependencies: @@ -2459,6 +2783,30 @@ jschardet@^1.4.2: version "1.6.0" resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.6.0.tgz#c7d1a71edcff2839db2f9ec30fc5d5ebd3c1a678" +jsdom@^9.12.0: + version "9.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" + dependencies: + abab "^1.0.3" + acorn "^4.0.4" + acorn-globals "^3.1.0" + array-equal "^1.0.0" + content-type-parser "^1.0.1" + cssom ">= 0.3.2 < 0.4.0" + cssstyle ">= 0.2.37 < 0.3.0" + escodegen "^1.6.1" + html-encoding-sniffer "^1.0.1" + nwmatcher ">= 1.3.9 < 2.0.0" + parse5 "^1.5.1" + request "^2.79.0" + sax "^1.2.1" + symbol-tree "^3.2.1" + tough-cookie "^2.3.2" + webidl-conversions "^4.0.0" + whatwg-encoding "^1.0.1" + whatwg-url "^4.3.0" + xml-name-validator "^2.0.1" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" @@ -2485,10 +2833,6 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -json3@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -2535,6 +2879,10 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -2579,10 +2927,6 @@ lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" -lodash._basecreate@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" - lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" @@ -2619,14 +2963,6 @@ lodash.cond@^4.3.0: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" -lodash.create@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" - dependencies: - lodash._baseassign "^3.0.0" - lodash._basecreate "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -2696,19 +3032,21 @@ lru-cache@^4.0.1: pseudomap "^1.0.1" yallist "^2.0.0" +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + dependencies: + tmpl "1.0.x" + map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" -md5-hex@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" dependencies: - md5-o-matic "^0.1.1" - -md5-o-matic@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" + mimic-fn "^1.0.0" meow@^3.3.0: version "3.7.0" @@ -2725,11 +3063,9 @@ meow@^3.3.0: redent "^1.0.0" trim-newlines "^1.0.0" -merge-source-map@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.3.tgz#da1415f2722a5119db07b14c4f973410863a2abf" - dependencies: - source-map "^0.5.3" +merge@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" micromatch@^2.1.5, micromatch@^2.3.11: version "2.3.11" @@ -2783,32 +3119,16 @@ minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" -mocha@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.2.0.tgz#7dc4f45e5088075171a68896814e6ae9eb7a85e3" - dependencies: - browser-stdout "1.3.0" - commander "2.9.0" - debug "2.2.0" - diff "1.4.0" - escape-string-regexp "1.0.5" - glob "7.0.5" - growl "1.9.2" - json3 "3.3.2" - lodash.create "3.1.1" - mkdirp "0.5.1" - supports-color "3.1.2" - modify-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.0.tgz#e2b6cdeb9ce19f99317a53722f3dbf5df5eaaab2" @@ -2848,6 +3168,19 @@ node-fetch@^1.3.3: encoding "^0.1.11" is-stream "^1.0.1" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + +node-notifier@^5.0.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff" + dependencies: + growly "^1.3.0" + semver "^5.3.0" + shellwords "^0.1.0" + which "^1.2.12" + node-pre-gyp@^0.6.29: version "0.6.33" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.33.tgz#640ac55198f6a925972e0c16c4ac26a034d5ecc9" @@ -2862,11 +3195,27 @@ node-pre-gyp@^0.6.29: tar "~2.2.1" tar-pack "~3.3.0" +node-pre-gyp@^0.6.36: + version "0.6.39" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + dependencies: + detect-libc "^1.0.2" + hawk "3.1.3" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + node-uuid@~1.4.7: version "1.4.7" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.7.tgz#6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f" -nopt@^4.0.0: +nopt@^4.0.0, nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" dependencies: @@ -2956,41 +3305,22 @@ npmconf@^2.1.2: gauge "~2.7.1" set-blocking "~2.0.0" +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + 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@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -nyc@^10.1.2: - version "10.1.2" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-10.1.2.tgz#ea7acaa20a235210101604f4e7d56d28453b0274" - dependencies: - archy "^1.0.0" - arrify "^1.0.1" - caching-transform "^1.0.0" - convert-source-map "^1.3.0" - debug-log "^1.0.1" - default-require-extensions "^1.0.0" - find-cache-dir "^0.1.1" - find-up "^1.1.2" - foreground-child "^1.5.3" - glob "^7.0.6" - istanbul-lib-coverage "^1.0.1" - istanbul-lib-hook "^1.0.0" - istanbul-lib-instrument "^1.4.2" - istanbul-lib-report "^1.0.0-alpha.3" - istanbul-lib-source-maps "^1.1.0" - istanbul-reports "^1.0.0" - md5-hex "^1.2.0" - merge-source-map "^1.0.2" - micromatch "^2.3.11" - mkdirp "^0.5.0" - resolve-from "^2.0.0" - rimraf "^2.5.4" - signal-exit "^3.0.1" - spawn-wrap "1.2.4" - test-exclude "^3.3.0" - yargs "^6.6.0" - yargs-parser "^4.0.2" +"nwmatcher@>= 1.3.9 < 2.0.0": + version "1.4.3" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" oauth-sign@~0.8.1: version "0.8.2" @@ -3007,7 +3337,7 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -once@^1.3.0, once@^1.3.3: +once@^1.3.0, once@^1.3.3, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -3032,7 +3362,7 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.2: +optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" dependencies: @@ -3043,15 +3373,17 @@ optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -os-homedir@^1.0.0, os-homedir@^1.0.1: +os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" dependencies: + execa "^0.7.0" lcid "^1.0.0" + mem "^1.1.0" os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" @@ -3072,6 +3404,10 @@ output-file-sync@^1.1.2: mkdirp "^0.5.1" object-assign "^4.1.0" +p-cancelable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -3121,6 +3457,10 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -3174,10 +3514,6 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" -pathval@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" @@ -3222,6 +3558,13 @@ prettier@^1.7.4: version "1.7.4" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.7.4.tgz#5e8624ae9363c80f95ec644584ecdf55d74f93fa" +pretty-format@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.2.1.tgz#ae5407f3cf21066cd011aa1ba5fce7b6a2eddb36" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + private@^0.1.6: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" @@ -3242,6 +3585,10 @@ proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + pseudomap@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -3262,6 +3609,10 @@ qs@~6.3.0: version "6.3.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.1.tgz#918c0b3bcd36679772baf135b1acb4c1651ed79d" +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + randomatic@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" @@ -3269,6 +3620,15 @@ randomatic@^1.1.3: is-number "^2.0.2" kind-of "^3.0.2" +rc@^1.1.7: + version "1.2.2" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + rc@~1.1.6: version "1.1.7" resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.7.tgz#c5ea564bb07aff9fd3a5b32e906c1d3a65940fea" @@ -3320,7 +3680,7 @@ read-pkg@^2.0.0: string_decoder "~0.10.x" util-deprecate "~1.0.1" -readable-stream@^2.1.5: +readable-stream@^2.1.4, readable-stream@^2.1.5: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -3434,6 +3794,33 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" +request@2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + 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" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + request@^2.74.0, request@^2.79.0: version "2.80.0" resolved "https://registry.yarnpkg.com/request/-/request-2.80.0.tgz#8cc162d76d79381cdefdd3505d76b80b60589bd0" @@ -3509,14 +3896,14 @@ resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" -resolve-from@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + resolve@^1.2.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" @@ -3544,13 +3931,13 @@ right-pad@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/right-pad/-/right-pad-1.0.1.tgz#8ca08c2cbb5b55e74dafa96bf7fd1a27d568c8d0" -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.4: +rimraf@2, rimraf@^2.2.8: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: glob "^7.0.5" -rimraf@^2.6.2: +rimraf@^2.5.1, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -3578,10 +3965,28 @@ rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" -safe-buffer@^5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" +sane@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-2.2.0.tgz#d6d2e2fcab00e3d283c93b912b7c3a20846f1d56" + dependencies: + anymatch "^1.3.0" + exec-sh "^0.2.0" + fb-watchman "^2.0.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.1.1" + +sax@^1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + semantic-release@^8.2.0: version "8.2.3" resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-8.2.3.tgz#a746a0a588be1c24aa8c212ee8dc3bda9ec85d46" @@ -3636,11 +4041,11 @@ shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" -signal-exit@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-2.1.2.tgz#375879b1f92ebc3b334480d038dc546a6d558564" +shellwords@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" -signal-exit@^3.0.0, signal-exit@^3.0.1, signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -3654,7 +4059,7 @@ slice-ansi@1.0.0: dependencies: is-fullwidth-code-point "^2.0.0" -slide@^1.1.3, slide@^1.1.5: +slide@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" @@ -3676,24 +4081,13 @@ source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - -source-map@^0.5.6: +source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" -spawn-wrap@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.2.4.tgz#920eb211a769c093eebfbd5b0e7a5d2e68ab2e40" - dependencies: - foreground-child "^1.3.3" - mkdirp "^0.5.0" - os-homedir "^1.0.1" - rimraf "^2.3.3" - signal-exit "^2.0.0" - which "^1.2.4" +source-map@~0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" spdx-correct@~1.0.0: version "1.0.2" @@ -3746,7 +4140,14 @@ ssri@^4.1.2: dependencies: safe-buffer "^5.1.0" -string-width@^1.0.1, string-width@^1.0.2: +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" dependencies: @@ -3754,7 +4155,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: @@ -3787,16 +4188,16 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-bom@3.0.0, strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" dependencies: is-utf8 "^0.2.0" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -3811,22 +4212,26 @@ strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" -supports-color@3.1.2, supports-color@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" - dependencies: - has-flag "^1.0.0" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" +supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + supports-color@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" dependencies: has-flag "^2.0.0" +symbol-tree@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + table@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" @@ -3838,6 +4243,19 @@ table@^4.0.1: slice-ansi "1.0.0" string-width "^2.1.1" +tar-pack@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + tar-pack@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" @@ -3851,7 +4269,7 @@ tar-pack@~3.3.0: tar "~2.2.1" uid-number "~0.0.6" -tar@~2.2.1: +tar@^2.2.1, tar@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" dependencies: @@ -3859,9 +4277,9 @@ tar@~2.2.1: fstream "^1.0.2" inherits "2" -test-exclude@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-3.3.0.tgz#7a17ca1239988c98367b0621456dbb7d4bc38977" +test-exclude@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26" dependencies: arrify "^1.0.1" micromatch "^2.3.11" @@ -3877,6 +4295,10 @@ text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + through2@^2.0.0, through2@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" @@ -3894,6 +4316,10 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + to-fast-properties@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" @@ -3906,12 +4332,22 @@ to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" +tough-cookie@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + dependencies: + punycode "^1.4.1" + tough-cookie@~2.3.0: version "2.3.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" dependencies: punycode "^1.4.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + travis-ci@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/travis-ci/-/travis-ci-2.1.1.tgz#98696265af827ae3576f31aa06d876e74b4b082e" @@ -3946,6 +4382,12 @@ tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + tunnel-agent@~0.4.1: version "0.4.3" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" @@ -3960,10 +4402,6 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -3985,7 +4423,7 @@ uid-number@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.5.tgz#5a3db23ef5dbd55b81fce0ec9a2ac6fccdebb81e" -uid-number@~0.0.6: +uid-number@^0.0.6, uid-number@~0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" @@ -4040,11 +4478,51 @@ walk@^2.3.9: dependencies: foreachasync "^3.0.0" -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" +walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + dependencies: + makeerror "1.0.x" + +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + +webidl-conversions@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + +whatwg-encoding@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" + dependencies: + iconv-lite "0.4.19" + +whatwg-url@^4.3.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" -which@^1.2.4, which@^1.2.9: +which@^1.2.12: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +which@^1.2.9: version "1.2.12" resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" dependencies: @@ -4076,6 +4554,13 @@ wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" +worker-farm@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.1.tgz#8e9f4a7da4f3c595aa600903051b969390423fa1" + dependencies: + errno "^0.1.4" + xtend "^4.0.1" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -4087,13 +4572,13 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -write-file-atomic@^1.1.4: - version "1.3.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.1.tgz#7d45ba32316328dd1ec7d90f60ebc0d845bb759a" +write-file-atomic@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" - slide "^1.1.5" + signal-exit "^3.0.2" write@^0.2.1: version "0.2.1" @@ -4101,7 +4586,11 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" -xtend@^4.0.0, xtend@~4.0.1: +xml-name-validator@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -4113,29 +4602,29 @@ yallist@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" -yargs-parser@^4.0.2, yargs-parser@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" dependencies: - camelcase "^3.0.0" + camelcase "^4.1.0" -yargs@^6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" +yargs@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" dependencies: - camelcase "^3.0.0" + camelcase "^4.1.0" cliui "^3.2.0" decamelize "^1.1.1" get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" + string-width "^2.0.0" + which-module "^2.0.0" y18n "^3.2.1" - yargs-parser "^4.2.0" + yargs-parser "^7.0.0" yargs@~3.10.0: version "3.10.0"