diff --git a/.nvmrc b/.nvmrc index 758bb9c82..e5c15102d 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -7.10.0 +8.9.0 diff --git a/.travis.yml b/.travis.yml index bd72015ee..b0af0e81c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,12 @@ language: node_js -before_install: +before_install: - curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.13.0 - export PATH=$HOME/.yarn/bin:$PATH cache: yarn: true script: -- yarn test-ci +- yarn test:ci - yarn doc -- yarn test:perf branches: only: - master diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 000000000..704e2532d --- /dev/null +++ b/jest.config.js @@ -0,0 +1,6 @@ +'use strict'; + +module.exports = { + testEnvironment: 'node', + testMatch: ['/test/spec/**/*.[jt]s?(x)'] +}; diff --git a/jest.setup.js b/jest.setup.js new file mode 100644 index 000000000..f90114bd8 --- /dev/null +++ b/jest.setup.js @@ -0,0 +1,5 @@ +/* eslint-env jest */ + +'use strict'; + +jest.setTimeout(15000); diff --git a/package.json b/package.json index a1ca21d4e..a3940b70c 100644 --- a/package.json +++ b/package.json @@ -18,12 +18,10 @@ "doc:publish": "yarn run doc && gh-pages -d documentation", "doc:staging": "scripts/staging-doc.sh", "readme:toc": "doctoc --notitle README.md --maxlevel 3", - "test-ci": "scripts/test-ci.sh", "test": "scripts/test.sh", - "test:unit": "ONLY_UNIT=true scripts/test.sh", - "test-node": "clear && node test/run", - "test:watch": "onchange '{src,test}/**/*.js' 'index.js' -- npm run test-node", - "test:perf": "node ./test/perf/index.js", + "test:ci": "scripts/test-ci.sh", + "test:unit": "jest", + "test:watch": "jest --watch", "release": "git checkout dist/ && rm -rf node_modules && yarn && ./scripts/release.js", "changelog:view-last": "conventional-changelog -u -n scripts/conventional-changelog/", "changelog:update": "conventional-changelog -i CHANGELOG -s -u -n scripts/conventional-changelog/" @@ -48,17 +46,13 @@ "babel-core": "6.26.3", "babel-loader": "6.4.1", "babel-preset-es2015": "6.24.1", - "bench": "0.3.6", - "benchmark": "2.1.4", "browserify": "14.5.0", "browzers": "1.3.0", - "bulk-require": "1.0.1", "bulkify": "1.4.2", "collect-json": "1.0.8", "colors": "1.1.2", "conventional-changelog-cli": "1.3.2", "doctoc": "1.3.0", - "download": "5.0.3", "envify": "4.1.0", "eslint": "1.10.3", "eslint-config-airbnb": "0.0.8", @@ -71,6 +65,7 @@ "gulp-sass": "2.3.2", "handlebars": "4.1.0", "http-server": "0.11.1", + "jest": "24.7.1", "jsdoc-parse": "1.2.7", "jsdoc-to-markdown": "1.3.9", "marked": "0.3.19", @@ -98,10 +93,7 @@ "rimraf": "2.6.3", "semver": "5.3.0", "shelljs": "0.7.8", - "sinon": "4.5.0", "st": "1.2.2", - "tap-spec": "4.1.1", - "tape": "4.9.0", "uglify-js": "2.8.29", "vinyl": "1.2.0", "watchify": "3.7.0", diff --git a/scripts/test-node.sh b/scripts/test-node.sh index 87beb42da..714971db0 100755 --- a/scripts/test-node.sh +++ b/scripts/test-node.sh @@ -7,4 +7,4 @@ if [ $CI == 'true' ]; then set -x # debug messages fi -node test/run.js | tap-spec +node test/run.js diff --git a/test/.eslintrc b/test/.eslintrc index 2712ae3da..6f4d0bc3e 100644 --- a/test/.eslintrc +++ b/test/.eslintrc @@ -1,6 +1,14 @@ { "rules": { - // in tests quotes are used for results objects, let's ignore badly formatted quotes - "quote-props": [2, "consistent"], + "quote-props": [ + 2, + "consistent" + ] + }, + "env": { + "jest": true + }, + "globals": { + "test": true } } diff --git a/test/spec/search.testdata.js b/test/datasets/SearchParameters/search.dataset.js similarity index 99% rename from test/spec/search.testdata.js rename to test/datasets/SearchParameters/search.dataset.js index 221872be6..4ae6f1cf8 100644 --- a/test/spec/search.testdata.js +++ b/test/datasets/SearchParameters/search.dataset.js @@ -1,6 +1,6 @@ 'use strict'; -var SearchParameters = require('../../src/SearchParameters'); +var SearchParameters = require('../../../src/SearchParameters'); module.exports = getData; diff --git a/test/integration-spec/helper.derive.js b/test/integration-spec/helper.derive.js index 802e5d222..213bf7c81 100644 --- a/test/integration-spec/helper.derive.js +++ b/test/integration-spec/helper.derive.js @@ -5,23 +5,20 @@ var setup = utils.setup; var algoliasearchHelper = require('../../'); -var test = require('tape'); -var bind = require('lodash/bind'); var random = require('lodash/random'); if (!utils.shouldRun) { test = test.skip; } -var indexName = '_travis-algoliasearch-helper-js-' + - (process.env.TRAVIS_BUILD_NUMBER || 'DEV') + - 'helper_searchonce' + random(0, 5000); test( '[INT][DERIVE] Query the same index twice with different query', - function(t) { - t.plan(5); + function() { + var indexName = '_travis-algoliasearch-helper-js-' + + (process.env.TRAVIS_BUILD_NUMBER || 'DEV') + + 'helper_distinct.facet' + random(0, 5000); - setup(indexName, function(client, index) { + return setup(indexName, function(client, index) { return index.addObjects([ {objectID: '0', content: 'tata'}, {objectID: '1', content: 'toto'} @@ -32,7 +29,7 @@ test( return client; }); }).then(function(client) { - var helper = algoliasearchHelper( + var mainHelper = algoliasearchHelper( client, indexName, { @@ -44,21 +41,42 @@ test( }] } ); - var helper2 = helper.derive(function(state) { + + var derivedHelper = mainHelper.derive(function(state) { return state.setQuery('toto'); }); - helper.on('result', function(results, state) { - t.equal(state.query, '', 'No query should be used for this query'); - t.equal(results.hits.length, 2, 'Should retrieve all the records'); + var mainResponse = new Promise(function(resolve) { + mainHelper.on('result', function(results, state) { + resolve({ + results: results, + state: state + }); + }); }); - helper2.on('result', function(results, state) { - t.equal(state.query, 'toto', 'The query `toto` should be used'); - t.equal(results.hits.length, 1, 'Should retrieve one record'); - t.equal(results.hits[0].objectID, '1', 'And it should be the record `1`'); + var derivedResponse = new Promise(function(resolve) { + derivedHelper.on('result', function(results, state) { + resolve({ + results: results, + state: state + }); + }); }); - helper.search(); - }).then(null, bind(t.error, t)); + mainHelper.search(); + + return Promise.all([mainResponse, derivedResponse]); + }).then(function(responses) { + var mainResponse = responses[0]; + + expect(mainResponse.state.query).toBe(''); + expect(mainResponse.results.hits.length).toBe(2); + + var derivedResponse = responses[1]; + + expect(derivedResponse.state.query).toBe('toto'); + expect(derivedResponse.results.hits.length).toBe(1); + expect(derivedResponse.results.hits[0].objectID).toBe('1'); + }); }); diff --git a/test/integration-spec/helper.distinct.facet.js b/test/integration-spec/helper.distinct.facet.js index c3dce0603..de8c08938 100644 --- a/test/integration-spec/helper.distinct.facet.js +++ b/test/integration-spec/helper.distinct.facet.js @@ -5,15 +5,13 @@ var setup = utils.setup; var algoliasearchHelper = utils.isCIBrowser ? window.algoliasearchHelper : require('../../'); -var test = require('tape'); -var bind = require('lodash/bind'); var random = require('lodash/random'); if (!utils.shouldRun) { test = test.skip; } -test('[INT][FILTERS] Using distinct should let me retrieve all facet without distinct', function(t) { +test('[INT][FILTERS] Using distinct should let me retrieve all facet without distinct', function(done) { var indexName = '_travis-algoliasearch-helper-js-' + (process.env.TRAVIS_BUILD_NUMBER || 'DEV') + 'helper_distinct.facet' + random(0, 5000); @@ -41,31 +39,28 @@ test('[INT][FILTERS] Using distinct should let me retrieve all facet without dis facets: ['colors'] }); - var calls = 0; helper.on('error', function(err) { - t.fail(err); - t.end(); + done.fail(err); }); + helper.on('result', function(content) { - calls++; + expect(content.hits.length).toBe(1); + expect(content.facets[0].data).toEqual({ + blue: 2, + red: 2, + gold: 1, + green: 1 + }); - if (calls === 1) { - t.equal(content.hits.length, 1); - t.deepEqual(content.facets[0].data, { - blue: 2, - red: 2, - gold: 1, - green: 1 - }); - client.deleteIndex(indexName); - if (!process.browser) { - client.destroy(); - } - t.end(); + client.deleteIndex(indexName); + + if (!process.browser) { + client.destroy(); } + + done(); }); helper.setQueryParameter('distinct', true).search(); - }) - .then(null, bind(t.error, t)); + }); }); diff --git a/test/integration-spec/helper.filters.js b/test/integration-spec/helper.filters.js index 0290ed4c6..d0c82b7c5 100644 --- a/test/integration-spec/helper.filters.js +++ b/test/integration-spec/helper.filters.js @@ -5,15 +5,13 @@ var setup = utils.setup; var algoliasearchHelper = utils.isCIBrowser ? window.algoliasearchHelper : require('../../'); -var test = require('tape'); -var bind = require('lodash/bind'); var random = require('lodash/random'); if (!utils.shouldRun) { test = test.skip; } -test('[INT][FILTERS] Should retrieve different values for multi facetted records', function(t) { +test('[INT][FILTERS] Should retrieve different values for multi facetted records', function(done) { var indexName = '_travis-algoliasearch-helper-js-' + (process.env.TRAVIS_BUILD_NUMBER || 'DEV') + 'helper_refinements' + random(0, 5000); @@ -41,16 +39,17 @@ test('[INT][FILTERS] Should retrieve different values for multi facetted records }); var calls = 0; + helper.on('error', function(err) { - t.fail(err); - t.end(); + done.fail(err); }); + helper.on('result', function(content) { calls++; if (calls === 1) { - t.equal(content.hits.length, 2, 'filter should result in two items'); - t.deepEqual(content.facets[0].data, { + expect(content.hits.length).toBe(2); + expect(content.facets[0].data).toEqual({ f1: 2, f2: 1, f3: 1 @@ -60,35 +59,39 @@ test('[INT][FILTERS] Should retrieve different values for multi facetted records } if (calls === 2) { - t.equal(content.hits.length, 1, 'filter should result in one item'); - t.deepEqual(content.facets[0].data, { + expect(content.hits.length).toBe(1); + expect(content.facets[0].data).toEqual({ f1: 1, f2: 1 }); + helper.toggleRefine('facet', 'f3').search(); } if (calls === 3) { - t.equal(content.hits.length, 0, 'filter should result in 0 item'); - t.equal(content.facets[0], undefined); + expect(content.hits.length).toBe(0); + expect(content.facets[0]).toBe(undefined); + helper.removeRefine('facet', 'f2').search(); } if (calls === 4) { - t.equal(content.hits.length, 1, 'filter should result in one item again'); - t.deepEqual(content.facets[0].data, { + expect(content.hits.length).toBe(1); + expect(content.facets[0].data).toEqual({ f1: 1, f3: 1 }); + client.deleteIndex(indexName); + if (!process.browser) { client.destroy(); } - t.end(); + + done(); } }); helper.addRefine('facet', 'f1').search(); - }) - .then(null, bind(t.error, t)); + }); }); diff --git a/test/integration-spec/helper.geo.js b/test/integration-spec/helper.geo.js index 6f84d528f..d53ce2855 100644 --- a/test/integration-spec/helper.geo.js +++ b/test/integration-spec/helper.geo.js @@ -5,7 +5,6 @@ var setup = utils.setupSimple; var algoliasearchHelper = utils.isCIBrowser ? window.algoliasearchHelper : require('../../'); -var test = require('tape'); var random = require('lodash/random'); if (!utils.shouldRun) { @@ -26,14 +25,14 @@ var config = {}; test( '[INT][GEO-SEARCH] search inside a single polygon with a string', - function(t) { + function(done) { setup(indexName, dataset, config). then(function(client) { var helper = algoliasearchHelper(client, indexName, {}); helper.on('result', function(content) { - t.equal(content.hits.length, 1); - t.equal(content.hits[0].objectID, '1'); - t.end(); + expect(content.hits.length).toBe(1); + expect(content.hits[0].objectID).toBe('1'); + done(); }); helper.setQueryParameter('insidePolygon', '0,0,1.1,0,1.1,1.1,0,1.1').search(); @@ -43,14 +42,14 @@ test( test( '[INT][GEO-SEARCH] search inside a single polygon with an array', - function(t) { + function(done) { setup(indexName, dataset, config). then(function(client) { var helper = algoliasearchHelper(client, indexName, {}); helper.on('result', function(content) { - t.equal(content.hits.length, 1); - t.equal(content.hits[0].objectID, '1'); - t.end(); + expect(content.hits.length).toBe(1); + expect(content.hits[0].objectID).toBe('1'); + done(); }); helper.setQueryParameter('insidePolygon', [[0, 0, 1.1, 0, 1.1, 1.1, 0, 1.1]]).search(); @@ -60,17 +59,17 @@ test( test( '[INT][GEO-SEARCH] search inside two polygons with an array', - function(t) { + function(done) { setup(indexName, dataset, config). then(function(client) { var helper = algoliasearchHelper(client, indexName, {}); helper.on('result', function(content) { - t.equal(content.hits.length, 2); + expect(content.hits.length).toBe(2); var sortedHits = content.hits.sort(function(a, b) { return a.objectID.localeCompare(b.objectID); }); - t.equal(sortedHits[0].objectID, '1'); - t.equal(sortedHits[1].objectID, '4'); - t.end(); + expect(sortedHits[0].objectID).toBe('1'); + expect(sortedHits[1].objectID).toBe('4'); + done(); }); helper.setQueryParameter( diff --git a/test/integration-spec/helper.highlight.js b/test/integration-spec/helper.highlight.js index 5957afd97..c8e135ff3 100644 --- a/test/integration-spec/helper.highlight.js +++ b/test/integration-spec/helper.highlight.js @@ -5,15 +5,13 @@ var setup = utils.setup; var algoliasearchHelper = utils.isCIBrowser ? window.algoliasearchHelper : require('../../'); -var test = require('tape'); -var bind = require('lodash/bind'); var random = require('lodash/random'); if (!utils.shouldRun) { test = test.skip; } -test('[INT][HIGHLIGHT] The highlight should be consistent with the parameters', function(t) { +test('[INT][HIGHLIGHT] The highlight should be consistent with the parameters', function(done) { var indexName = '_travis-algoliasearch-helper-js-' + (process.env.TRAVIS_BUILD_NUMBER || 'DEV') + 'helper_highlight' + random(0, 5000); @@ -45,32 +43,22 @@ test('[INT][HIGHLIGHT] The highlight should be consistent with the parameters', helper.on('result', function(content) { calls++; if (calls === 1) { - t.equal(content.hits[0]._highlightResult.facet[0].value, - 'f1', - 'should be hightlighted with em (default)'); - t.equal(content.hits[1]._highlightResult.facet[0].value, - 'f1', - 'should be hightlighted with em (default)'); + expect(content.hits[0]._highlightResult.facet[0].value).toBe('f1'); + expect(content.hits[1]._highlightResult.facet[0].value).toBe('f1'); helper.setQueryParameter('highlightPostTag', '') .setQueryParameter('highlightPreTag', '') .search(); } else if (calls === 2) { - t.equal(content.hits[0]._highlightResult.facet[0].value, - 'f1', - 'should be hightlighted with strong (setting)'); - t.equal(content.hits[1]._highlightResult.facet[0].value, - 'f1', - 'should be hightlighted with strong (setting)'); + expect(content.hits[0]._highlightResult.facet[0].value).toBe('f1'); + expect(content.hits[1]._highlightResult.facet[0].value).toBe('f1'); client.deleteIndex(indexName); if (!process.browser) { client.destroy(); } - t.end(); + done(); } }); - helper.setQuery('f1') - .search(); - }) - .then(null, bind(t.error, t)); + helper.setQuery('f1').search(); + }); }); diff --git a/test/integration-spec/helper.insights.js b/test/integration-spec/helper.insights.js index a346743ab..1e704cf88 100644 --- a/test/integration-spec/helper.insights.js +++ b/test/integration-spec/helper.insights.js @@ -5,12 +5,12 @@ var setup = utils.setupSimple; var algoliasearchHelper = utils.isCIBrowser ? window.algoliasearchHelper : require('../../'); -var test = require('tape'); var random = require('lodash/random'); if (!utils.shouldRun) { test = test.skip; } + var indexName = '_travis-algoliasearch-helper-js-' + (process.env.TRAVIS_BUILD_NUMBER || 'DEV') + 'helper_searchonce' + random(0, 5000); @@ -23,13 +23,13 @@ var config = {}; test( '[INT][INSIGHTS] search with clickAnalytics should have a queryID', - function(t) { + function(done) { setup(indexName, dataset, config). then(function(client) { var helper = algoliasearchHelper(client, indexName, {clickAnalytics: true}); helper.on('result', function(content) { - t.equal(typeof content.queryID, 'string'); - t.end(); + expect(typeof content.queryID).toBe('string'); + done(); }); helper.search(); @@ -39,13 +39,13 @@ test( test( '[INT][INSIGHTS] search without clickAnalytics should not have a queryID', - function(t) { + function(done) { setup(indexName, dataset, config). then(function(client) { var helper = algoliasearchHelper(client, indexName, {}); helper.on('result', function(content) { - t.equal(content.queryID, undefined); - t.end(); + expect(content.queryID).toBe(undefined); + done(); }); helper.search(); diff --git a/test/integration-spec/helper.numerics.js b/test/integration-spec/helper.numerics.js index 8ed6d0690..9dcec47de 100644 --- a/test/integration-spec/helper.numerics.js +++ b/test/integration-spec/helper.numerics.js @@ -5,8 +5,6 @@ var setup = utils.setup; var algoliasearchHelper = utils.isCIBrowser ? window.algoliasearchHelper : require('../../'); -var test = require('tape'); -var bind = require('lodash/bind'); var random = require('lodash/random'); var map = require('lodash/map'); @@ -19,7 +17,7 @@ function hitsToParsedID(h) { } test('[INT][NUMERICS][RAW-API]Test numeric operations on the helper and their results on the algolia API', - function(t) { + function(done) { var indexName = '_travis-algoliasearch-helper-js-' + (process.env.TRAVIS_BUILD_NUMBER || 'DEV') + 'helper_numerics' + random(0, 5000); @@ -42,67 +40,53 @@ test('[INT][NUMERICS][RAW-API]Test numeric operations on the helper and their re var calls = 0; helper.on('error', function(err) { - t.fail(err); - t.end(); + done.fail(err); }); helper.on('result', function(content) { calls++; if (calls === 1) { - t.equal(content.hits.length, 4, 'No numeric filter: 4 results'); - t.deepEqual(map(content.hits, hitsToParsedID).sort(), - [0, 1, 2, 3], - 'No tags expected ids: 0, 1, 2, 3'); + expect(content.hits.length).toBe(4); + expect(map(content.hits, hitsToParsedID).sort()).toEqual([0, 1, 2, 3]); helper.setQueryParameter('numericFilters', 'n=6,n=10').search(); } if (calls === 2) { - t.equal(content.hits.length, 1, 'n=6 AND n=10: 1 result'); - t.deepEqual(map(content.hits, hitsToParsedID).sort(), - [1], - 'n=6 AND n=10 >> expected id: 1'); + expect(content.hits.length).toBe(1); + expect(map(content.hits, hitsToParsedID).sort()).toEqual([1]); helper.setQueryParameter('numericFilters', '(n=6,n>40)').search(); } if (calls === 3) { - t.equal(content.hits.length, 3, 'n=6 OR n>40: 3 results'); - t.deepEqual(map(content.hits, hitsToParsedID).sort(), - [0, 1, 2], - 'n=6 OR n>40 >> expected ids: 0, 1, 2'); + expect(content.hits.length).toBe(3); + expect(map(content.hits, hitsToParsedID).sort()).toEqual([0, 1, 2]); helper.setQueryParameter('numericFilters', 'n:11 to 46').search(); } if (calls === 4) { - t.equal(content.hits.length, 2, '11 to 46: 2 results'); - t.deepEqual(map(content.hits, hitsToParsedID).sort(), - [2, 3], - '11 to 46 >> expected ids: 2, 3'); + expect(content.hits.length).toBe(2); + expect(map(content.hits, hitsToParsedID).sort()).toEqual([2, 3]); helper.setQueryParameter('numericFilters', 'n=5,(n=10,n=45)').search(); } if (calls === 5) { - t.equal(content.hits.length, 1, 'n = (5) and (10 or 45) : 1 result'); - t.deepEqual( - map(content.hits, hitsToParsedID).sort(), - [2], - 'n = 5 and (10 or 45) >> expected id : 2' - ); + expect(content.hits.length).toBe(1); + expect(map(content.hits, hitsToParsedID).sort()).toEqual([2]); client.deleteIndex(indexName); if (!process.browser) { client.destroy(); } - t.end(); + done(); } }); helper.search(); - }) - .then(null, bind(t.error, t)); + }); }); test('[INT][NUMERICS][MANAGED-API]Test numeric operations on the helper and their results on the algolia API', - function(t) { + function(done) { var indexName = '_travis-algoliasearch-helper-js-' + (process.env.TRAVIS_BUILD_NUMBER || 'DEV') + 'helper_numerics_managed' + random(0, 5000); @@ -125,37 +109,30 @@ test('[INT][NUMERICS][MANAGED-API]Test numeric operations on the helper and thei var calls = 0; helper.on('error', function(err) { - t.fail(err); - t.end(); + done.fail(err); }); helper.on('result', function(content) { calls++; if (calls === 1) { - t.equal(content.hits.length, 4, 'No numeric filter: 4 results'); - t.deepEqual(map(content.hits, hitsToParsedID).sort(), - [0, 1, 2, 3], - 'No tags expected ids: 0, 1, 2, 3'); + expect(content.hits.length).toBe(4); + expect(map(content.hits, hitsToParsedID).sort()).toEqual([0, 1, 2, 3]); helper.addNumericRefinement('n', '=', '6'); helper.addNumericRefinement('n', '=', '10'); helper.search(); } if (calls === 2) { - t.equal(content.hits.length, 1, 'n=6 AND n=10: 1 result'); - t.deepEqual(map(content.hits, hitsToParsedID).sort(), - [1], - 'n=6 AND n=10 >> expected id: 1'); + expect(content.hits.length).toBe(1); + expect(map(content.hits, hitsToParsedID).sort()).toEqual([1]); helper.clearRefinements('n'); helper.addNumericRefinement('n', '=', [6, 45]).search(); } if (calls === 3) { - t.equal(content.hits.length, 3, 'n=6 OR n=45: 3 results'); - t.deepEqual(map(content.hits, hitsToParsedID).sort(), - [0, 1, 2], - 'n=6 OR n=45 >> expected ids: 0, 1, 2'); + expect(content.hits.length).toBe(3); + expect(map(content.hits, hitsToParsedID).sort()).toEqual([0, 1, 2]); helper.addNumericRefinement('n', '=', 5); helper.removeNumericRefinement('n', '=', [6, 45]); helper.addNumericRefinement('n', '=', [10, 45]); @@ -163,21 +140,16 @@ test('[INT][NUMERICS][MANAGED-API]Test numeric operations on the helper and thei } if (calls === 4) { - t.equal(content.hits.length, 1, 'n = (5) and (10 or 45) : 1 result'); - t.deepEqual( - map(content.hits, hitsToParsedID).sort(), - [2], - 'n = 5 and (10 or 45) >> expected ids : 2' - ); + expect(content.hits.length).toBe(1); + expect(map(content.hits, hitsToParsedID).sort()).toEqual([2]); client.deleteIndex(indexName); if (!process.browser) { client.destroy(); } - t.end(); + done(); } }); helper.search(); - }) - .then(null, bind(t.error, t)); + }); }); diff --git a/test/integration-spec/helper.results.getFacetValues.js b/test/integration-spec/helper.results.getFacetValues.js index 2c05fb241..5e21e063f 100644 --- a/test/integration-spec/helper.results.getFacetValues.js +++ b/test/integration-spec/helper.results.getFacetValues.js @@ -5,8 +5,6 @@ var setup = utils.setup; var algoliasearchHelper = utils.isCIBrowser ? window.algoliasearchHelper : require('../../'); -var test = require('tape'); -var bind = require('lodash/bind'); var random = require('lodash/random'); if (!utils.shouldRun) { @@ -18,7 +16,7 @@ var indexName = '_travis-algoliasearch-helper-js-' + test( '[INT][GETFACETVALUES] When the results are empty, getFacetValues should not crash', - function(t) { + function(done) { setup(indexName, function(client) { return client; }).then(function(client) { @@ -34,16 +32,21 @@ test( }] } ); + helper.on('result', function(rs) { - t.deepEqual(rs.getFacetValues('f'), [], ''); - t.deepEqual(rs.getFacetValues('df'), [], ''); - t.deepEqual( - rs.getFacetValues('products'), - {count: null, data: null, isRefined: true, name: 'products', path: null}, - '' - ); - t.end(); + expect(rs.getFacetValues('f')).toEqual([]); + expect(rs.getFacetValues('df')).toEqual([]); + expect(rs.getFacetValues('products')).toEqual({ + name: 'products', + count: null, + isRefined: true, + path: null, + data: null + }); + + done(); }); + helper.search(); - }).then(null, bind(t.error, t)); + }); }); diff --git a/test/integration-spec/helper.searchForFacetValues.js b/test/integration-spec/helper.searchForFacetValues.js index 85c7f9fae..7fcf67c3f 100644 --- a/test/integration-spec/helper.searchForFacetValues.js +++ b/test/integration-spec/helper.searchForFacetValues.js @@ -5,8 +5,6 @@ var setup = utils.setupSimple; var algoliasearchHelper = utils.isCIBrowser ? window.algoliasearchHelper : require('../../'); -var test = require('tape'); -var bind = require('lodash/bind'); var random = require('lodash/random'); if (!utils.shouldRun) { @@ -30,125 +28,114 @@ var config = { test( '[INT][SEARCHFORCETVALUES] Should be able to search for facet values - conjunctive', - function(t) { - setup(indexName, dataset, config). - then(function(client) { + function() { + return setup(indexName, dataset, config).then(function(client) { var helper = algoliasearchHelper(client, indexName, { facets: ['f', 'f2'] }); - helper.searchForFacetValues('f', 'a').then(function(content) { - t.ok(content, 'should get some content'); - t.equal(content.facetHits.length, 0, 'should get 0 results'); + return helper.searchForFacetValues('f', 'a').then(function(content) { + expect(content).toBeTruthy(); + expect(content.facetHits.length).toBe(0); return helper.searchForFacetValues('f', 'b'); }).then(function(content) { - t.ok(content, 'should get some content'); + expect(content).toBeTruthy(); - t.deepEqual(content.facetHits, [ + expect(content.facetHits).toEqual([ {value: 'ba', highlighted: 'ba', count: 3, isRefined: false}, {value: 'bb', highlighted: 'bb', count: 2, isRefined: false} ]); helper.addFacetRefinement('f2', 'c'); + return helper.searchForFacetValues('f', 'b'); }).then(function(content) { - t.ok(content, 'should get some content'); + expect(content).toBeTruthy(); - t.deepEqual(content.facetHits, [ + expect(content.facetHits).toEqual([ {value: 'ba', highlighted: 'ba', count: 1, isRefined: false}, {value: 'bb', highlighted: 'bb', count: 1, isRefined: false} ]); helper.clearRefinements().addFacetRefinement('f2', 'c'); + return helper.searchForFacetValues('f2', ''); }).then(function(content) { - t.ok(content, 'should get some content'); + expect(content).toBeTruthy(); - t.deepEqual(content.facetHits, [ + expect(content.facetHits).toEqual([ {value: 'c', highlighted: 'c', count: 2, isRefined: true}, {value: 'x', highlighted: 'x', count: 1, isRefined: false}, {value: 'y', highlighted: 'y', count: 1, isRefined: false} ]); - - t.end(); - }).catch(function(err) { - setTimeout(function() {throw err;}, 1); }); - }).then(null, bind(t.error, t)); + }); }); test( '[INT][SEARCHFORCETVALUES] Should be able to search for facet values - disjunctive', - function(t) { - setup(indexName, dataset, config). - then(function(client) { + function() { + return setup(indexName, dataset, config).then(function(client) { var helper = algoliasearchHelper(client, indexName, { disjunctiveFacets: ['f', 'f2'] }); - helper.searchForFacetValues('f', 'a').then(function(content) { - t.ok(content, 'should get some content'); - t.equal(content.facetHits.length, 0, 'should get 0 results'); + return helper.searchForFacetValues('f', 'a').then(function(content) { + expect(content).toBeTruthy(); + expect(content.facetHits.length).toBe(0); return helper.searchForFacetValues('f', 'b'); }).then(function(content) { - t.ok(content, 'should get some content'); + expect(content).toBeTruthy(); - t.deepEqual(content.facetHits, [ + expect(content.facetHits).toEqual([ {value: 'ba', highlighted: 'ba', count: 3, isRefined: false}, {value: 'bb', highlighted: 'bb', count: 2, isRefined: false} ]); helper.addDisjunctiveFacetRefinement('f2', 'd'); + return helper.searchForFacetValues('f', 'b'); }).then(function(content) { - t.ok(content, 'should get some content'); + expect(content).toBeTruthy(); - t.deepEqual(content.facetHits, [ + expect(content.facetHits).toEqual([ {value: 'ba', highlighted: 'ba', count: 1, isRefined: false} ]); helper.clearRefinements().addDisjunctiveFacetRefinement('f2', 'c'); + return helper.searchForFacetValues('f2', ''); }).then(function(content) { - t.ok(content, 'should get some content'); + expect(content).toBeTruthy(); - t.deepEqual(content.facetHits, [ + expect(content.facetHits).toEqual([ {value: 'b', highlighted: 'b', count: 2, isRefined: false}, {value: 'c', highlighted: 'c', count: 2, isRefined: true}, {value: 'd', highlighted: 'd', count: 1, isRefined: false}, {value: 'x', highlighted: 'x', count: 1, isRefined: false}, {value: 'y', highlighted: 'y', count: 1, isRefined: false} ]); - - t.end(); - }).catch(function(err) { - setTimeout(function() {throw err;}, 1); }); - }).then(null, bind(t.error, t)); + }); }); test( '[INT][SEARCHFORCETVALUES] Should be able to limit the number of returned items', - function(t) { - setup(indexName, dataset, config). - then(function(client) { + function() { + return setup(indexName, dataset, config).then(function(client) { var helper = algoliasearchHelper(client, indexName, { facets: ['f', 'f2'] }); - helper.searchForFacetValues('f', 'b', 1).then(function(content) { - t.ok(content.facetHits.length, 'should get one value'); + return helper.searchForFacetValues('f', 'b', 1).then(function(content) { + expect(content.facetHits.length).toBeTruthy(); - t.deepEqual(content.facetHits, [ + expect(content.facetHits).toEqual([ {value: 'ba', highlighted: 'ba', count: 3, isRefined: false} ]); - - t.end(); - }).catch(function(err) { - setTimeout(function() {throw err;}, 1); }); - }).then(null, bind(t.error, t)); + }); }); diff --git a/test/integration-spec/helper.searchOnce.js b/test/integration-spec/helper.searchOnce.js index 132ad3412..4a0a7bb53 100644 --- a/test/integration-spec/helper.searchOnce.js +++ b/test/integration-spec/helper.searchOnce.js @@ -5,9 +5,7 @@ var setup = utils.setup; var algoliasearchHelper = utils.isCIBrowser ? window.algoliasearchHelper : require('../../'); -var test = require('tape'); var find = require('lodash/find'); -var bind = require('lodash/bind'); var random = require('lodash/random'); if (!utils.shouldRun) { @@ -19,7 +17,7 @@ var indexName = '_travis-algoliasearch-helper-js-' + test( '[INT][SEARCHONCE] Should be able to search once with custom parameters without changing main search state', - function(t) { + function(done) { setup(indexName, function(client, index) { return index.addObjects([ {objectID: '1', facet: ['f1', 'f2']}, @@ -41,40 +39,39 @@ test( var calls = 1; helper.on('error', function(err) { - t.fail(err); - t.end(); + done.fail(err); }); helper.on('result', function(content) { if (calls === 3) { - t.equal(content.hits.length, 3, 'results should contain two items'); - t.end(); + expect(content.hits.length).toBe(3); + done(); } else { - t.fail('Should not trigger the result event until the third call'); + done.fail('Should not trigger the result event until the third call'); } }); var state1 = state0.setFacets(['facet']).addFacetRefinement('facet', 'f1'); helper.searchOnce(state1).then(function(res) { - t.equal(helper.state, state0, 'initial state must not be modified'); - t.deepEqual(res.state, state1); - t.equal(res.content.hits.length, 2, 'results should contain two items'); - t.ok(find(res.content.hits, {objectID: '2'})); - t.ok(find(res.content.hits, {objectID: '1'})); + expect(helper.state).toBe(state0); + expect(res.state).toEqual(state1); + expect(res.content.hits.length).toBe(2); + expect(find(res.content.hits, {objectID: '2'})).toBeTruthy(); + expect(find(res.content.hits, {objectID: '1'})).toBeTruthy(); calls++; var state2 = state0.setFacets(['facet']).addFacetRefinement('facet', 'f2'); helper.searchOnce( state2, function(err, c, s) { - t.equal(err, null); - t.equal(helper.state, state0, 'initial state should not be modified'); - t.deepEqual(s, state2); - t.equal(c.hits.length, 2, 'results should contain two items'); - t.ok(find(c.hits, {objectID: '1'})); - t.ok(find(c.hits, {objectID: '3'})); + expect(err).toBe(null); + expect(helper.state).toBe(state0); + expect(s).toEqual(state2); + expect(c.hits.length).toBe(2); + expect(find(c.hits, {objectID: '1'})).toBeTruthy(); + expect(find(c.hits, {objectID: '3'})).toBeTruthy(); calls++; helper.search(); }); }); - }).then(null, bind(t.error, t)); + }); }); diff --git a/test/integration-spec/helper.tags.js b/test/integration-spec/helper.tags.js index 9cafbd764..9ba6a9b27 100644 --- a/test/integration-spec/helper.tags.js +++ b/test/integration-spec/helper.tags.js @@ -5,9 +5,7 @@ var setup = utils.setup; var algoliasearchHelper = utils.isCIBrowser ? window.algoliasearchHelper : require('../../'); -var test = require('tape'); var map = require('lodash/map'); -var bind = require('lodash/bind'); var random = require('lodash/random'); if (!utils.shouldRun) { @@ -18,7 +16,7 @@ function hitsToParsedID(h) { return parseInt(h.objectID, 10); } -test('[INT][TAGS]Test tags operations on the helper and their results on the algolia API', function(t) { +test('[INT][TAGS]Test tags operations on the helper and their results on the algolia API', function(done) { var indexName = '_travis-algoliasearch-helper-js-' + (process.env.TRAVIS_BUILD_NUMBER || 'DEV') + 'helper_refinements' + random(0, 5000); @@ -41,57 +39,47 @@ test('[INT][TAGS]Test tags operations on the helper and their results on the alg var calls = 0; helper.on('error', function(err) { - t.fail(err); - t.end(); + done.fail(err); }); helper.on('result', function(content) { calls++; if (calls === 1) { - t.equal(content.hits.length, 4, 'No tags: 3 results'); - t.deepEqual(map(content.hits, hitsToParsedID).sort(), - [0, 1, 2, 3], - 'No tags expected ids: 0, 1, 2, 3'); + expect(content.hits.length).toBe(4); + expect(map(content.hits, hitsToParsedID).sort()).toEqual([0, 1, 2, 3]); helper.addTag('t1').search(); } if (calls === 2) { - t.equal(content.hits.length, 2, 'One tag (t1): 2 results'); - t.deepEqual(map(content.hits, hitsToParsedID).sort(), - [0, 1], - 'One tag (t1) expected ids: 0, 1'); + expect(content.hits.length).toBe(2); + expect(map(content.hits, hitsToParsedID).sort()).toEqual([0, 1]); helper.addTag('t2').search(); } if (calls === 3) { - t.equal(content.hits.length, 1, 'Two tags (t1, t2): 1 result'); - t.deepEqual(map(content.hits, hitsToParsedID).sort(), - [0], - 'Two tags (t1, t2) expected ids: 0'); + expect(content.hits.length).toBe(1); + expect(map(content.hits, hitsToParsedID).sort()).toEqual([0]); helper.removeTag('t2').toggleTag('t3').toggleTag('t1').search(); } if (calls === 4) { - t.equal(content.hits.length, 3, 'One tag (t3): 3 results'); - t.deepEqual(map(content.hits, hitsToParsedID).sort(), - [1, 2, 3], - 'One tag (t3) expected ids: 1, 2, 3'); + expect(content.hits.length).toBe(3); + expect(map(content.hits, hitsToParsedID).sort()).toEqual([1, 2, 3]); helper.clearTags().setQueryParameter('tagFilters', 't3,(t1,t2)').search(); } if (calls === 5) { - t.equal(content.hits.length, 2, 'filter should result in two item again'); - t.deepEqual(map(content.hits, hitsToParsedID).sort(), [1, 2]); + expect(content.hits.length).toBe(2); + expect(map(content.hits, hitsToParsedID).sort()).toEqual([1, 2]); client.deleteIndex(indexName); if (!process.browser) { client.destroy(); } - t.end(); + done(); } }); helper.search(); - }) - .then(null, bind(t.error, t)); + }); }); diff --git a/test/perf/index.js b/test/perf/index.js deleted file mode 100644 index 7c29f2279..000000000 --- a/test/perf/index.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict'; -var path = require('path'); -var fs = require('fs'); - -var test = require('tape'); -var Benchmark = require('benchmark'); -var download = require('download'); - -download('https://cdn.jsdelivr.net/algoliasearch.helper/2/algoliasearch.helper.min.js', - __dirname) - .then(function() { - var currentHelper = require('../../dist/algoliasearch.helper.min.js'); - var previousHelper = require('./algoliasearch.helper.min.js'); - - var tests = [ - './tests/instanciate.js' - ]; - - tests.forEach(makeTestPerf.bind(null, currentHelper, previousHelper)); - }, function() { - process.exit(1); - }).then(function() { - rmReferenceBuild(); - }); - -function rmReferenceBuild() { - var p = path.join(__dirname, 'algoliasearch.helper.min.js'); - fs.unlink(p); -} - -function makeTestPerf(previousHelper, currentHelper, testFile) { - test(testFile + ' vs helper v.' + previousHelper.version, function(t) { - t.plan(1); - var suite = new Benchmark.Suite; - suite.add('current', require(testFile)(currentHelper)) - .add('previous', require(testFile)(previousHelper)); - - suite.on('complete', function() { - var currentStats = getStats(this['0']); - var previousStats = getStats(this['1']); - - if (currentStats.mean <= previousStats.mean) { - t.pass('Current build is at least as fast: ' + currentStats.mean + ' vs ' + previousStats.mean); - } else { - t.fail('Previous build is faster: ' + currentStats.mean + ' vs ' + previousStats.mean); - } - return; - }); - - suite.run(); - }); -} - -function getStats(bench) { - return bench.stats; -} diff --git a/test/perf/tests/instanciate.js b/test/perf/tests/instanciate.js deleted file mode 100644 index b056db6c0..000000000 --- a/test/perf/tests/instanciate.js +++ /dev/null @@ -1,17 +0,0 @@ -'use strict'; -module.exports = function(algoliasearchHelper) { - return function() { - var helper = algoliasearchHelper(null, null, { - disjunctiveFacets: ['categories'] - }); - helper.addDisjunctiveFacetRefinement('categories', 'phone') - .addDisjunctiveFacetRefinement('categories', 'camera') - .removeDisjunctiveFacetRefinement('categories', 'phone') - .addDisjunctiveFacetRefinement('categories', 'bed') - .removeDisjunctiveFacetRefinement('categories', 'camera') - .addNumericRefinement('price', '>', 3) - .addNumericRefinement('price', '<', '7') - .removeNumericRefinement('price', '>', '3') - .removeNumericRefinement('price'); - }; -}; diff --git a/test/run.js b/test/run.js index 088c19b09..16f947915 100644 --- a/test/run.js +++ b/test/run.js @@ -1,26 +1,42 @@ 'use strict'; -var bulk = require('bulk-require'); -var test = require('tape'); -var algolia = require('algoliasearch'); +var path = require('path'); +var jest = require('jest'); +var algoliasearch = require('algoliasearch'); +var staticJestConfig = require('../jest.config'); -bulk(__dirname, ['spec/**/*.js']); +var enableIntegrationTest = + process.env.ONLY_UNIT !== 'true' && + process.env.INTEGRATION_TEST_API_KEY && + process.env.INTEGRATION_TEST_APPID; -if (process.env.ONLY_UNIT !== 'true' && process.env.INTEGRATION_TEST_API_KEY && process.env.INTEGRATION_TEST_APPID) { - // usage: INTEGRATION_TEST_APPID=$APPID INTEGRATION_TEST_API_KEY=$APIKEY npm run dev - bulk(__dirname, ['integration-spec/**/*.js']); +var projectsRootPaths = [path.resolve(__dirname, '..')]; +var dynamicJestConfig = Object.assign({}, staticJestConfig, { + maxWorkers: 4, + setupFilesAfterEnv: staticJestConfig.setupFilesAfterEnv || [] +}); - test.onFinish(cleanupIntegration); +if (enableIntegrationTest) { + dynamicJestConfig.testMatch.push('/test/integration-spec/**/*.[jt]s?(x)'); + dynamicJestConfig.setupFilesAfterEnv.push(path.resolve(__dirname, '..', 'jest.setup.js')); } -function cleanupIntegration() { - console.log('Deleting all indices'); - var client = algolia(process.env.INTEGRATION_TEST_APPID, process.env.INTEGRATION_TEST_API_KEY); - var maybeIndices = client.listIndexes(); - maybeIndices.then(content => { - content.items - .map(i => i.name) - .filter(n => n.indexOf('_travis-algoliasearch-helper') !== -1) - .forEach(n => client.deleteIndex(n)); - }); -} +jest.runCLI(dynamicJestConfig, projectsRootPaths).then(function(response) { + if (!response.results.success) { + process.exitCode = response.globalConfig.testFailureExitCode; + } + + if (enableIntegrationTest) { + var client = algoliasearch( + process.env.INTEGRATION_TEST_APPID, + process.env.INTEGRATION_TEST_API_KEY + ); + + client.listIndexes().then(content => { + content.items + .map(i => i.name) + .filter(n => n.indexOf('_travis-algoliasearch-helper') !== -1) + .forEach(n => client.deleteIndex(n)); + }); + } +}); diff --git a/test/spec/SearchParameters/RefinementList/clear.js b/test/spec/SearchParameters/RefinementList/clear.js index 5b21d46d8..71c14d3f2 100644 --- a/test/spec/SearchParameters/RefinementList/clear.js +++ b/test/spec/SearchParameters/RefinementList/clear.js @@ -1,26 +1,22 @@ 'use strict'; -var test = require('tape'); - var RefinementList = require('../../../../src/SearchParameters/RefinementList.js'); var clear = RefinementList.clearRefinement; -test('When removing all refinements of a state without any', function(t) { +test('When removing all refinements of a state without any', function() { var initialRefinementList = {}; - t.equal(clear(initialRefinementList), initialRefinementList, 'it should return the same ref'); - t.end(); + expect(clear(initialRefinementList)).toBe(initialRefinementList); }); -test('When removing refinements of a specific attribute, and there are no refinements for this attribute', function(t) { +test('When removing refinements of a specific attribute, and there are no refinements for this attribute', function() { var initialRefinementList = { 'attribute': ['test'] }; - t.equal(clear(initialRefinementList, 'notThisAttribute'), initialRefinementList, 'it should return the same ref'); - t.end(); + expect(clear(initialRefinementList, 'notThisAttribute')).toBe(initialRefinementList); }); -test('When removing numericRefinements using a function, and there are no changes', function(t) { +test('When removing numericRefinements using a function, and there are no changes', function() { var initialRefinementList = { 'attribute': ['test'] }; @@ -29,13 +25,8 @@ test('When removing numericRefinements using a function, and there are no change function clearUndefinedAttribute(value, attribute) {return attribute === 'category';} function clearUndefinedValue(value) {return value === 'toast';} - t.equal(clear(initialRefinementList, clearNothing, 'facet'), initialRefinementList, 'it should return the same ref - nothing'); - t.equal( - clear(initialRefinementList, clearUndefinedAttribute, 'facet'), - initialRefinementList, - 'it should return the same ref - undefined attribute'); - t.equal(clear(initialRefinementList, clearUndefinedValue, 'facet'), initialRefinementList, 'it should return the same ref - undefined value'); - - t.end(); + expect(clear(initialRefinementList, clearNothing, 'facet')).toBe(initialRefinementList); + expect(clear(initialRefinementList, clearUndefinedAttribute, 'facet')).toBe(initialRefinementList); + expect(clear(initialRefinementList, clearUndefinedValue, 'facet')).toBe(initialRefinementList); }); diff --git a/test/spec/SearchParameters/_clearNumericRefinements.js b/test/spec/SearchParameters/_clearNumericRefinements.js index 3d4e1d014..8c68253a7 100644 --- a/test/spec/SearchParameters/_clearNumericRefinements.js +++ b/test/spec/SearchParameters/_clearNumericRefinements.js @@ -1,26 +1,23 @@ 'use strict'; -var test = require('tape'); var SearchParameters = require('../../../src/SearchParameters'); -test('When removing all numeric refinements of a state without any', function(t) { +test('When removing all numeric refinements of a state without any', function() { var state = SearchParameters.make({}); - t.equal(state._clearNumericRefinements(), state.numericRefinements, 'it should return the same ref'); - t.end(); + expect(state._clearNumericRefinements()).toBe(state.numericRefinements); }); -test('When removing numericRefinements of a specific attribute, and there are no refinements for this attribute', function(t) { +test('When removing numericRefinements of a specific attribute, and there are no refinements for this attribute', function() { var state = SearchParameters.make({ numericRefinements: { price: {'>': [300]} } }); - t.equal(state._clearNumericRefinements('size'), state.numericRefinements, 'it should return the same ref'); - t.end(); + expect(state._clearNumericRefinements('size')).toBe(state.numericRefinements); }); -test('When removing numericRefinements using a function, and there are no changes', function(t) { +test('When removing numericRefinements using a function, and there are no changes', function() { var state = SearchParameters.make({ numericRefinements: { price: {'>': [300, 30]}, @@ -33,10 +30,8 @@ test('When removing numericRefinements using a function, and there are no change function clearUndefinedOperator(v) {return v.op === '<';} function clearUndefinedValue(v) {return v.val === 3;} - t.equal(state._clearNumericRefinements(clearNothing), state.numericRefinements, 'it should return the same ref - nothing'); - t.equal(state._clearNumericRefinements(clearUndefinedAttribute), state.numericRefinements, 'it should return the same ref - undefined attribute'); - t.equal(state._clearNumericRefinements(clearUndefinedOperator), state.numericRefinements, 'it should return the same ref - undefined operator'); - t.equal(state._clearNumericRefinements(clearUndefinedValue), state.numericRefinements, 'it should return the same ref - undefined value'); - - t.end(); + expect(state._clearNumericRefinements(clearNothing)).toBe(state.numericRefinements); + expect(state._clearNumericRefinements(clearUndefinedAttribute)).toBe(state.numericRefinements); + expect(state._clearNumericRefinements(clearUndefinedOperator)).toBe(state.numericRefinements); + expect(state._clearNumericRefinements(clearUndefinedValue)).toBe(state.numericRefinements); }); diff --git a/test/spec/SearchParameters/_parseNumbers.js b/test/spec/SearchParameters/_parseNumbers.js index 069525acf..63a20b8c3 100644 --- a/test/spec/SearchParameters/_parseNumbers.js +++ b/test/spec/SearchParameters/_parseNumbers.js @@ -1,9 +1,8 @@ 'use strict'; -var test = require('tape'); var SearchParameters = require('../../../src/SearchParameters'); -test('_parseNumbers should convert to number all specified root keys (that are parseable)', function(t) { +test('_parseNumbers should convert to number all specified root keys (that are parseable)', function() { var partialState = { aroundPrecision: '42', aroundRadius: '42', @@ -20,56 +19,48 @@ test('_parseNumbers should convert to number all specified root keys (that are p }; var actual = SearchParameters._parseNumbers(partialState); - t.equal(actual.aroundPrecision, 42, 'aroundPrecision should be converted to number'); - t.equal(actual.aroundRadius, 42, 'aroundRadius should be converted to number'); - t.equal(actual.getRankingInfo, 42, 'getRankingInfo should be converted to number'); - t.deepEqual(actual.insideBoundingBox, [[51.1241999, 9.662499900000057, 41.3253001, -5.559099999999944]], 'insideBoundingBox should be converted to number'); - t.equal(actual.minWordSizefor2Typos, 42, 'minWordSizeFor2Typos should be converted to number'); - t.equal(actual.minWordSizefor1Typo, 42, 'minWordSizeFor1Typo should be converted to number'); - t.equal(actual.page, 42, 'page should be converted to number'); - t.equal(actual.maxValuesPerFacet, 42, 'maxValuesPerFacet should be converted to number'); - t.equal(actual.distinct, 42, 'distinct should be converted to number'); - t.equal(actual.minimumAroundRadius, 42, 'minimumAroundRadius should be converted to number'); - t.equal(actual.hitsPerPage, 42, 'hitsPerPage should be converted to number'); - t.equal(actual.minProximity, 42, 'minProximity should be converted to number'); - - t.end(); + expect(actual.aroundPrecision).toBe(42); + expect(actual.aroundRadius).toBe(42); + expect(actual.getRankingInfo).toBe(42); + expect(actual.insideBoundingBox).toEqual([[51.1241999, 9.662499900000057, 41.3253001, -5.559099999999944]]); + expect(actual.minWordSizefor2Typos).toBe(42); + expect(actual.minWordSizefor1Typo).toBe(42); + expect(actual.page).toBe(42); + expect(actual.maxValuesPerFacet).toBe(42); + expect(actual.distinct).toBe(42); + expect(actual.minimumAroundRadius).toBe(42); + expect(actual.hitsPerPage).toBe(42); + expect(actual.minProximity).toBe(42); }); -test('_parseNumbers should not convert undefined to NaN', function(t) { +test('_parseNumbers should not convert undefined to NaN', function() { var partialState = { aroundPrecision: undefined }; var actual = SearchParameters._parseNumbers(partialState); - t.equal(actual.aroundPrecision, undefined); - - t.end(); + expect(actual.aroundPrecision).toBe(undefined); }); -test('_parseNumbers should not convert insideBoundingBox if it\'s a string', function(t) { +test('_parseNumbers should not convert insideBoundingBox if it\'s a string', function() { var partialState = { insideBoundingBox: '5,4,5,4' }; var actual = SearchParameters._parseNumbers(partialState); - t.equal(actual.insideBoundingBox, '5,4,5,4'); - - t.end(); + expect(actual.insideBoundingBox).toBe('5,4,5,4'); }); -test('_parseNumbers should not convert unparseable strings', function(t) { +test('_parseNumbers should not convert unparseable strings', function() { var partialState = { aroundRadius: 'all' }; var actual = SearchParameters._parseNumbers(partialState); - t.equal(actual.aroundRadius, 'all'); - - t.end(); + expect(actual.aroundRadius).toBe('all'); }); -test('_parseNumbers should convert numericRefinements values', function(t) { +test('_parseNumbers should convert numericRefinements values', function() { var partialState = { numericRefinements: { foo: { @@ -80,13 +71,11 @@ test('_parseNumbers should convert numericRefinements values', function(t) { }; var actual = SearchParameters._parseNumbers(partialState); - t.deepEqual(actual.numericRefinements.foo['>='], [4.8, 15.16], 'should convert foo >='); - t.deepEqual(actual.numericRefinements.foo['='], [23.42], 'should convert foo ='); - - t.end(); + expect(actual.numericRefinements.foo['>=']).toEqual([4.8, 15.16]); + expect(actual.numericRefinements.foo['=']).toEqual([23.42]); }); -test('_parseNumbers should convert nested numericRefinements values', function(t) { +test('_parseNumbers should convert nested numericRefinements values', function() { var partialState = { numericRefinements: { foo: { @@ -99,10 +88,8 @@ test('_parseNumbers should convert nested numericRefinements values', function(t }; var actual = SearchParameters._parseNumbers(partialState); - t.deepEqual(actual.numericRefinements.foo['>='], [ + expect(actual.numericRefinements.foo['>=']).toEqual([ [4.8], 15.16 - ], 'should convert foo >='); - t.deepEqual(actual.numericRefinements.foo['='], [23.42], 'should convert foo ='); - - t.end(); + ]); + expect(actual.numericRefinements.foo['=']).toEqual([23.42]); }); diff --git a/test/spec/SearchParameters/constructorFn.js b/test/spec/SearchParameters/constructorFn.js index d7b005d59..130016e56 100644 --- a/test/spec/SearchParameters/constructorFn.js +++ b/test/spec/SearchParameters/constructorFn.js @@ -1,10 +1,9 @@ 'use strict'; -var test = require('tape'); var forOwn = require('lodash/forOwn'); var SearchParameters = require('../../../src/SearchParameters'); -test('Constructor should accept an object with known keys', function(t) { +test('Constructor should accept an object with known keys', function() { var legitConfig = { 'query': '', 'disjunctiveFacets': [ @@ -23,13 +22,11 @@ test('Constructor should accept an object with known keys', function(t) { }; var params = new SearchParameters(legitConfig); forOwn(legitConfig, function(v, k) { - t.deepEqual(params[k], v); + expect(params[k]).toEqual(v); }); - - t.end(); }); -test('Constructor should accept an object with unknown keys', function(t) { +test('Constructor should accept an object with unknown keys', function() { var betaConfig = { 'query': '', 'disjunctiveFacets': [ @@ -50,13 +47,11 @@ test('Constructor should accept an object with unknown keys', function(t) { }; var params = new SearchParameters(betaConfig); forOwn(betaConfig, function(v, k) { - t.deepEqual(params[k], v); + expect(params[k]).toEqual(v); }); - - t.end(); }); -test('Factory should accept an object with known keys', function(t) { +test('Factory should accept an object with known keys', function() { var legitConfig = { 'query': '', 'disjunctiveFacets': [ @@ -75,13 +70,11 @@ test('Factory should accept an object with known keys', function(t) { }; var params = SearchParameters.make(legitConfig); forOwn(legitConfig, function(v, k) { - t.deepEqual(params[k], v); + expect(params[k]).toEqual(v); }); - - t.end(); }); -test('Constructor should accept an object with unknown keys', function(t) { +test('Constructor should accept an object with unknown keys', function() { var betaConfig = { 'query': '', 'disjunctiveFacets': [ @@ -102,8 +95,6 @@ test('Constructor should accept an object with unknown keys', function(t) { }; var params = SearchParameters.make(betaConfig); forOwn(betaConfig, function(v, k) { - t.deepEqual(params[k], v); + expect(params[k]).toEqual(v); }); - - t.end(); }); diff --git a/test/spec/SearchParameters/hierarchical-facets/add.js b/test/spec/SearchParameters/hierarchical-facets/add.js index 3882cabf2..230245f3c 100644 --- a/test/spec/SearchParameters/hierarchical-facets/add.js +++ b/test/spec/SearchParameters/hierarchical-facets/add.js @@ -1,9 +1,8 @@ 'use strict'; -var test = require('tape'); var SearchParameters = require('../../../../src/SearchParameters'); -test('Should add a refinement', function(t) { +test('Should add a refinement', function() { var state0 = SearchParameters.make({ hierarchicalFacets: [{ name: 'categories', @@ -11,14 +10,12 @@ test('Should add a refinement', function(t) { }] }); - t.deepEqual(state0.getHierarchicalRefinement('categories'), []); + expect(state0.getHierarchicalRefinement('categories')).toEqual([]); var state1 = state0.addHierarchicalFacetRefinement('categories', 'men'); - t.deepEqual(state1.getHierarchicalRefinement('categories'), ['men']); - - t.end(); + expect(state1.getHierarchicalRefinement('categories')).toEqual(['men']); }); -test('Should throw if there is already a refinement', function(t) { +test('Should throw if there is already a refinement', function() { var state0 = SearchParameters.make({ hierarchicalFacets: [{ name: 'categories', @@ -26,17 +23,13 @@ test('Should throw if there is already a refinement', function(t) { }] }); - t.deepEqual(state0.getHierarchicalRefinement('categories'), []); + expect(state0.getHierarchicalRefinement('categories')).toEqual([]); var state1 = state0.toggleHierarchicalFacetRefinement('categories', 'beers'); - t.throws(state1.addHierarchicalFacetRefinement.bind(state1, 'categories', 'men')); - - t.end(); + expect(state1.addHierarchicalFacetRefinement.bind(state1, 'categories', 'men')).toThrow(); }); -test('Should throw if the facet is not defined', function(t) { +test('Should throw if the facet is not defined', function() { var state0 = SearchParameters.make({}); - t.throws(state0.addHierarchicalFacetRefinement.bind(state0, 'categories', 'men')); - - t.end(); + expect(state0.addHierarchicalFacetRefinement.bind(state0, 'categories', 'men')).toThrow(); }); diff --git a/test/spec/SearchParameters/hierarchical-facets/remove.js b/test/spec/SearchParameters/hierarchical-facets/remove.js index fbf209b93..ca3b1dd2e 100644 --- a/test/spec/SearchParameters/hierarchical-facets/remove.js +++ b/test/spec/SearchParameters/hierarchical-facets/remove.js @@ -1,9 +1,8 @@ 'use strict'; -var test = require('tape'); var SearchParameters = require('../../../../src/SearchParameters'); -test('Should remove a refinement', function(t) { +test('Should remove a refinement', function() { var state0 = SearchParameters.make({ hierarchicalFacets: [{ name: 'categories', @@ -11,14 +10,12 @@ test('Should remove a refinement', function(t) { }] }).addHierarchicalFacetRefinement('categories', 'men'); - t.deepEqual(state0.getHierarchicalRefinement('categories'), ['men']); + expect(state0.getHierarchicalRefinement('categories')).toEqual(['men']); var state1 = state0.removeHierarchicalFacetRefinement('categories'); - t.deepEqual(state1.getHierarchicalRefinement('categories'), []); - - t.end(); + expect(state1.getHierarchicalRefinement('categories')).toEqual([]); }); -test('Should throw if there is no refinement', function(t) { +test('Should throw if there is no refinement', function() { var state0 = SearchParameters.make({ hierarchicalFacets: [{ name: 'categories', @@ -26,15 +23,11 @@ test('Should throw if there is no refinement', function(t) { }] }); - t.throws(state0.removeHierarchicalFacetRefinement.bind(state0, 'categories')); - - t.end(); + expect(state0.removeHierarchicalFacetRefinement.bind(state0, 'categories')).toThrow(); }); -test('Should throw if the facet is not defined', function(t) { +test('Should throw if the facet is not defined', function() { var state0 = SearchParameters.make({}); - t.throws(state0.removeHierarchicalFacetRefinement.bind(state0, 'categories')); - - t.end(); + expect(state0.removeHierarchicalFacetRefinement.bind(state0, 'categories')).toThrow(); }); diff --git a/test/spec/SearchParameters/isNumericRefined.js b/test/spec/SearchParameters/isNumericRefined.js index 0e874a646..1369a87e6 100644 --- a/test/spec/SearchParameters/isNumericRefined.js +++ b/test/spec/SearchParameters/isNumericRefined.js @@ -1,59 +1,52 @@ 'use strict'; -var test = require('tape'); var SearchParameters = require('../../../src/SearchParameters'); -test('isNumericRefined with 3 parameters', function(t) { +test('isNumericRefined with 3 parameters', function() { var params = new SearchParameters(); - t.notOk(params.isNumericRefined('age', '>', '3')); - t.notOk(params.isNumericRefined('age', '>', '7')); - t.notOk(params.isNumericRefined('age', '<', '7')); - t.notOk(params.isNumericRefined('size', '>', '3')); + expect(params.isNumericRefined('age', '>', '3')).toBeFalsy(); + expect(params.isNumericRefined('age', '>', '7')).toBeFalsy(); + expect(params.isNumericRefined('age', '<', '7')).toBeFalsy(); + expect(params.isNumericRefined('size', '>', '3')).toBeFalsy(); var paramsWithNumerics = (params.addNumericRefinement('age', '>', '3')); - t.ok(paramsWithNumerics.isNumericRefined('age', '>', '3')); - t.ok(paramsWithNumerics.isNumericRefined('age', '>', 3)); - t.notOk(paramsWithNumerics.isNumericRefined('age', '>', '7')); - t.notOk(paramsWithNumerics.isNumericRefined('age', '<', '7')); - t.notOk(paramsWithNumerics.isNumericRefined('size', '>', '3')); + expect(paramsWithNumerics.isNumericRefined('age', '>', '3')).toBeTruthy(); + expect(paramsWithNumerics.isNumericRefined('age', '>', 3)).toBeTruthy(); + expect(paramsWithNumerics.isNumericRefined('age', '>', '7')).toBeFalsy(); + expect(paramsWithNumerics.isNumericRefined('age', '<', '7')).toBeFalsy(); + expect(paramsWithNumerics.isNumericRefined('size', '>', '3')).toBeFalsy(); var paramsWithArray = params.addNumericRefinement('age', '=', [3, '4']); - t.ok(paramsWithArray.isNumericRefined('age', '=', [3, 4])); - t.ok(paramsWithArray.isNumericRefined('age', '=', ['3', 4])); - t.ok(paramsWithArray.isNumericRefined('age', '=', [3, '4'])); - t.ok(paramsWithArray.isNumericRefined('age', '=', ['3', '4'])); - t.notOk(paramsWithArray.isNumericRefined('age', '=', 3)); - t.notOk(paramsWithArray.isNumericRefined('age', '=', '3')); - - t.end(); + expect(paramsWithArray.isNumericRefined('age', '=', [3, 4])).toBeTruthy(); + expect(paramsWithArray.isNumericRefined('age', '=', ['3', 4])).toBeTruthy(); + expect(paramsWithArray.isNumericRefined('age', '=', [3, '4'])).toBeTruthy(); + expect(paramsWithArray.isNumericRefined('age', '=', ['3', '4'])).toBeTruthy(); + expect(paramsWithArray.isNumericRefined('age', '=', 3)).toBeFalsy(); + expect(paramsWithArray.isNumericRefined('age', '=', '3')).toBeFalsy(); }); -test('isNumericRefined with 2 parameters', function(t) { +test('isNumericRefined with 2 parameters', function() { var params = new SearchParameters(); - t.notOk(params.isNumericRefined('age', '>')); - t.notOk(params.isNumericRefined('size', '>')); + expect(params.isNumericRefined('age', '>')).toBeFalsy(); + expect(params.isNumericRefined('size', '>')).toBeFalsy(); var paramsWithNumerics = (params.addNumericRefinement('age', '>', '3')); - t.ok(paramsWithNumerics.isNumericRefined('age', '>')); - t.notOk(paramsWithNumerics.isNumericRefined('size', '>')); - - t.end(); + expect(paramsWithNumerics.isNumericRefined('age', '>')).toBeTruthy(); + expect(paramsWithNumerics.isNumericRefined('size', '>')).toBeFalsy(); }); -test('isNumericRefined with 1 parameter', function(t) { +test('isNumericRefined with 1 parameter', function() { var params = new SearchParameters(); - t.notOk(params.isNumericRefined('age')); - t.notOk(params.isNumericRefined('size')); + expect(params.isNumericRefined('age')).toBeFalsy(); + expect(params.isNumericRefined('size')).toBeFalsy(); var paramsWithNumerics = (params.addNumericRefinement('age', '>', '3')); - t.ok(paramsWithNumerics.isNumericRefined('age')); - t.notOk(paramsWithNumerics.isNumericRefined('size')); - - t.end(); + expect(paramsWithNumerics.isNumericRefined('age')).toBeTruthy(); + expect(paramsWithNumerics.isNumericRefined('size')).toBeFalsy(); }); diff --git a/test/spec/SearchParameters/listAttributes.js b/test/spec/SearchParameters/listAttributes.js index 50056aaa4..643b63c56 100644 --- a/test/spec/SearchParameters/listAttributes.js +++ b/test/spec/SearchParameters/listAttributes.js @@ -1,88 +1,72 @@ 'use strict'; -var test = require('tape'); - var SearchParameters = require('../../../src/SearchParameters'); -test('addFacet should add a facet to the facets list', function(t) { +test('addFacet should add a facet to the facets list', function() { var state = SearchParameters.make({}).addFacet('facet'); - t.deepEquals(state.facets, ['facet']); - - t.end(); + expect(state.facets).toEqual(['facet']); }); -test('removeFacet should remove a facet from the facets list', function(t) { +test('removeFacet should remove a facet from the facets list', function() { var state = SearchParameters.make({}).addFacet('facet').removeFacet('facet'); - t.deepEquals(state.facets, []); + expect(state.facets).toEqual([]); state = SearchParameters.make({}) .addFacet('facet') .addFacetRefinement('facet', 'value') .removeFacet('facet'); - t.deepEquals(state.facetsRefinements, {}); - - t.end(); + expect(state.facetsRefinements).toEqual({}); }); -test('addDisjunctiveFacet should add a facet to the disjunctiveFacets list', function(t) { +test('addDisjunctiveFacet should add a facet to the disjunctiveFacets list', function() { var state = SearchParameters.make({}).addDisjunctiveFacet('facet'); - t.deepEquals(state.disjunctiveFacets, ['facet']); - - t.end(); + expect(state.disjunctiveFacets).toEqual(['facet']); }); -test('removeDisjunctiveFacet should remove a facet from the disjunctiveFacets list', function(t) { +test('removeDisjunctiveFacet should remove a facet from the disjunctiveFacets list', function() { var state = SearchParameters.make({}) .addDisjunctiveFacet('facet') .removeDisjunctiveFacet('facet'); - t.deepEquals(state.disjunctiveFacets, []); + expect(state.disjunctiveFacets).toEqual([]); state = SearchParameters.make({}) .addDisjunctiveFacet('facet') .addDisjunctiveFacetRefinement('facet', 'value') .removeDisjunctiveFacet('facet'); - t.deepEquals(state.disjunctiveFacetsRefinements, {}); - - t.end(); + expect(state.disjunctiveFacetsRefinements).toEqual({}); }); -test('addHierarchicalFacet should add a facet to the hierarchicalFacets list', function(t) { +test('addHierarchicalFacet should add a facet to the hierarchicalFacets list', function() { var state = SearchParameters.make({}).addHierarchicalFacet({name: 'facet'}); - t.deepEquals(state.hierarchicalFacets, [{name: 'facet'}]); - - t.end(); + expect(state.hierarchicalFacets).toEqual([{name: 'facet'}]); }); -test('addHierarchicalFacet should throw when a facet with the same name is already declared', function(t) { - t.throws(function() { +test('addHierarchicalFacet should throw when a facet with the same name is already declared', function() { + expect(function() { SearchParameters .make({hierarchicalFacets: [{name: 'facet'}]}) .addHierarchicalFacet({name: 'facet'}); - }); - - t.end(); + }).toThrow(); }); -test('removeHierarchicalFacet should remove a facet from the hierarchicalFacets list', function(t) { +test('removeHierarchicalFacet should remove a facet from the hierarchicalFacets list', function() { var state = SearchParameters.make({}) .addHierarchicalFacet({name: 'facet'}) .removeHierarchicalFacet('facet'); - t.deepEquals(state.hierarchicalFacets, []); + expect(state.hierarchicalFacets).toEqual([]); state = SearchParameters.make({}) .addHierarchicalFacet({name: 'facet'}) .toggleHierarchicalFacetRefinement('facet', 'value') .removeHierarchicalFacet('facet'); - t.deepEquals(state.hierarchicalFacetsRefinements, {}); - - t.end(); + expect(state.hierarchicalFacetsRefinements).toEqual({}); }); diff --git a/test/spec/SearchParameters/noChanges.js b/test/spec/SearchParameters/noChanges.js index 8d5fb27bf..f35d91423 100644 --- a/test/spec/SearchParameters/noChanges.js +++ b/test/spec/SearchParameters/noChanges.js @@ -1,169 +1,131 @@ 'use strict'; -var test = require('tape'); - var SearchParameters = require('../../../src/SearchParameters'); -test('[No changes] setHitsPerPage', function(t) { +test('[No changes] setHitsPerPage', function() { var state = SearchParameters.make({ hitsPerPage: 2 }); - t.equal(state.setHitsPerPage(2), state, 'setHitsPerPage should return the same instance'); - - t.end(); + expect(state.setHitsPerPage(2)).toBe(state); }); -test('[No changes] setTypoTolerance', function(t) { +test('[No changes] setTypoTolerance', function() { var state = SearchParameters.make({ typoTolerance: true }); - t.equal(state.setTypoTolerance(true), state, 'setTypoTolerance should return the same instance'); - - t.end(); + expect(state.setTypoTolerance(true)).toBe(state); }); -test('[No changes] setPage', function(t) { +test('[No changes] setPage', function() { var state = SearchParameters.make({ page: 2 }); - t.equal(state.setPage(2), state, 'setPage should return the same instance'); - - t.end(); + expect(state.setPage(2)).toBe(state); }); -test('[No changes] setQuery', function(t) { +test('[No changes] setQuery', function() { var state = SearchParameters.make({ query: 'query' }); - t.equal(state.setQuery('query'), state, 'setQuery should return the same instance'); - - t.end(); + expect(state.setQuery('query')).toBe(state); }); -test('[No changes] addFacet', function(t) { +test('[No changes] addFacet', function() { var state = SearchParameters.make({}).addFacet('facet'); - t.equal(state.addFacet('facet'), state, 'addFacet should return the same instance'); - - t.end(); + expect(state.addFacet('facet')).toBe(state); }); -test('[No changes] removeFacet', function(t) { +test('[No changes] removeFacet', function() { var state = SearchParameters.make({}); - t.equal(state.removeFacet('facet'), state, 'removeFacet should return the same instance'); - - t.end(); + expect(state.removeFacet('facet')).toBe(state); }); -test('[No changes] addDisjunctiveFacet', function(t) { +test('[No changes] addDisjunctiveFacet', function() { var state = SearchParameters.make({}).addDisjunctiveFacet('facet'); - t.equal(state.addDisjunctiveFacet('facet'), state, 'addDisjunctiveFacet should return the same instance'); - - t.end(); + expect(state.addDisjunctiveFacet('facet')).toBe(state); }); -test('[No changes] removeDisjunctiveFacet', function(t) { +test('[No changes] removeDisjunctiveFacet', function() { var state = SearchParameters.make({}); - t.equal(state.removeDisjunctiveFacet('facet'), state, 'removeDisjunctiveFacet should return the same instance'); - - t.end(); + expect(state.removeDisjunctiveFacet('facet')).toBe(state); }); -test('[No changes] removeHierarchicalFacet', function(t) { +test('[No changes] removeHierarchicalFacet', function() { var state = SearchParameters.make({}); - t.equal(state.removeHierarchicalFacet('facet'), state, 'removeHierarchicalFacet should return the same instance'); - - t.end(); + expect(state.removeHierarchicalFacet('facet')).toBe(state); }); -test('[No changes] addTagRefinement', function(t) { +test('[No changes] addTagRefinement', function() { var state = SearchParameters.make({}).addTagRefinement('tag'); - t.equal(state.addTagRefinement('tag'), state, 'addTagRefinement should return the same instance'); - - t.end(); + expect(state.addTagRefinement('tag')).toBe(state); }); -test('[No changes] clearTags', function(t) { +test('[No changes] clearTags', function() { var state = SearchParameters.make({ query: 'query' }); - t.equal(state.clearTags(), state, 'clearTags should return the same instance'); - - t.end(); + expect(state.clearTags()).toBe(state); }); -test('[No changes] addDisjunctiveFacetRefinement', function(t) { +test('[No changes] addDisjunctiveFacetRefinement', function() { var state = SearchParameters.make({ disjunctiveFacets: ['facet'] }).addDisjunctiveFacetRefinement('facet', 'value'); - t.equal(state.addDisjunctiveFacetRefinement('facet', 'value'), state, 'addDisjunctiveFacetRefinement should return the same instance'); - - t.end(); + expect(state.addDisjunctiveFacetRefinement('facet', 'value')).toBe(state); }); -test('[No changes] removeDisjunctiveFacetRefinement', function(t) { +test('[No changes] removeDisjunctiveFacetRefinement', function() { var state = SearchParameters.make({ disjunctiveFacets: ['facet'] }); - t.equal(state.removeDisjunctiveFacetRefinement('facet', 'value'), state, 'removeDisjunctiveFacetRefinement should return the same instance'); - - t.end(); + expect(state.removeDisjunctiveFacetRefinement('facet', 'value')).toBe(state); }); -test('[No changes] addFacetRefinement', function(t) { +test('[No changes] addFacetRefinement', function() { var state = SearchParameters.make({ facets: ['facet'] }).addFacetRefinement('facet', 'value'); - t.equal(state.addFacetRefinement('facet', 'value'), state, 'addFacetRefinement should return the same instance'); - - t.end(); + expect(state.addFacetRefinement('facet', 'value')).toBe(state); }); -test('[No changes] removeDisjunctiveFacetRefinement', function(t) { +test('[No changes] removeDisjunctiveFacetRefinement', function() { var state = SearchParameters.make({ disjunctiveFacets: ['facet'] }); - t.equal(state.removeDisjunctiveFacetRefinement('facet', 'value'), state, 'removeDisjunctiveFacetRefinement should return the same instance'); - - t.end(); + expect(state.removeDisjunctiveFacetRefinement('facet', 'value')).toBe(state); }); -test('[No changes] addNumericRefinement', function(t) { +test('[No changes] addNumericRefinement', function() { var state = SearchParameters.make({}).addNumericRefinement('attribute', '>', 0); - t.equal(state.addNumericRefinement('attribute', '>', 0), state, 'addNumericRefinement should return the same instance'); - - t.end(); + expect(state.addNumericRefinement('attribute', '>', 0)).toBe(state); }); -test('[No changes] removeNumericRefinement', function(t) { +test('[No changes] removeNumericRefinement', function() { var state = SearchParameters.make({}); - t.equal(state.removeNumericRefinement('attribute', '>'), state, 'removeNumericRefinement should return the same instance'); - - t.end(); + expect(state.removeNumericRefinement('attribute', '>')).toBe(state); }); -test('[No changes] setQueryParameter', function(t) { +test('[No changes] setQueryParameter', function() { var state = SearchParameters.make({ minWordSizefor1Typo: 50 }); - t.equal(state.setQueryParameter('minWordSizefor1Typo', 50), state, 'setQueryParameter should return the same instance'); - - t.end(); + expect(state.setQueryParameter('minWordSizefor1Typo', 50)).toBe(state); }); diff --git a/test/spec/SearchParameters/numericAttributes.js b/test/spec/SearchParameters/numericAttributes.js index 9c13d6f8c..fe289199c 100644 --- a/test/spec/SearchParameters/numericAttributes.js +++ b/test/spec/SearchParameters/numericAttributes.js @@ -1,6 +1,5 @@ 'use strict'; -var test = require('tape'); var forEach = require('lodash/forEach'); var SearchParameters = require('../../../src/SearchParameters'); @@ -19,37 +18,31 @@ var stateWithStringForIntegers = { minimumAroundRadius: '234' }; -test('Constructor should parse the numeric attributes', function(t) { +test('Constructor should parse the numeric attributes', function() { var state = new SearchParameters(stateWithStringForIntegers); forEach(stateWithStringForIntegers, function(v, k) { var parsedValue = parseFloat(v); - t.equal(state[k], parsedValue, k + ' should be parsed'); + expect(state[k]).toBe(parsedValue); }); - - t.end(); }); -test('setQueryParameter should parse the numeric attributes', function(t) { +test('setQueryParameter should parse the numeric attributes', function() { var state0 = new SearchParameters(); forEach(stateWithStringForIntegers, function(v, k) { var parsedValue = parseFloat(v); var state1 = state0.setQueryParameter(k, v); - t.equal(state1[k], parsedValue, k + ' should be parsed'); + expect(state1[k]).toBe(parsedValue); }); - - t.end(); }); -test('setQueryParameters should parse the numeric attributes', function(t) { +test('setQueryParameters should parse the numeric attributes', function() { var state0 = new SearchParameters(); var state1 = state0.setQueryParameters(stateWithStringForIntegers); forEach(stateWithStringForIntegers, function(v, k) { var parsedValue = parseFloat(v); - t.equal(state1[k], parsedValue, k + ' should be parsed'); + expect(state1[k]).toBe(parsedValue); }); - - t.end(); }); diff --git a/test/spec/SearchParameters/numericFilters.js b/test/spec/SearchParameters/numericFilters.js index c27d6cf87..c0ee4f066 100644 --- a/test/spec/SearchParameters/numericFilters.js +++ b/test/spec/SearchParameters/numericFilters.js @@ -1,32 +1,28 @@ 'use strict'; -var test = require('tape'); var SearchParameters = require('../../../src/SearchParameters'); var attribute = 'attribute'; var operator = '='; /* Ensure that we add and then remove the same value, and get a state equivalent to the initial one */ -function testSameValue(t, value) { +function testSameValue(value) { var state0 = new SearchParameters(); var state1 = state0.addNumericRefinement(attribute, operator, value); - t.ok(state1.isNumericRefined(attribute, operator, value), 'Numeric value should be added'); + expect(state1.isNumericRefined(attribute, operator, value)).toBeTruthy(); var state2 = state1.removeNumericRefinement(attribute, operator, value); - t.notOk(state2.isNumericRefined(attribute, operator, value), 'Numeric value should not be refined anymore'); - t.deepEqual(state2, state0, 'The final state should be equivalent to the first one'); + expect(state2.isNumericRefined(attribute, operator, value)).toBeFalsy(); + expect(state2).toEqual(state0); } -test('Should be able to add remove strings', function(t) { - testSameValue(t, '40'); - t.end(); +test('Should be able to add remove strings', function() { + testSameValue('40'); }); -test('Should be able to add remove numbers', function(t) { - testSameValue(t, 40); - t.end(); +test('Should be able to add remove numbers', function() { + testSameValue(40); }); -test('Should be able to add remove arrays', function(t) { - testSameValue(t, [40, '30']); - t.end(); +test('Should be able to add remove arrays', function() { + testSameValue([40, '30']); }); diff --git a/test/spec/SearchParameters/setQueryParameter.js b/test/spec/SearchParameters/setQueryParameter.js index 55b303d49..b1d7ab252 100644 --- a/test/spec/SearchParameters/setQueryParameter.js +++ b/test/spec/SearchParameters/setQueryParameter.js @@ -1,9 +1,8 @@ 'use strict'; -var test = require('tape'); var SearchParameters = require('../../../src/SearchParameters'); -test('setqueryparameter should update existing parameter', function(t) { +test('setqueryparameter should update existing parameter', function() { var sp = new SearchParameters({ facets: ['facet'] }); @@ -11,12 +10,10 @@ test('setqueryparameter should update existing parameter', function(t) { var newValue = []; var newsp = sp.setQueryParameter('facets', newValue); - t.deepEquals(newsp.facets, newValue, 'update of an existing parameter'); - - t.end(); + expect(newsp.facets).toEqual(newValue); }); -test('setqueryparameter should add non-existing parameter', function(t) { +test('setqueryparameter should add non-existing parameter', function() { var sp = new SearchParameters({ facets: ['facet'] }); @@ -24,12 +21,10 @@ test('setqueryparameter should add non-existing parameter', function(t) { var newValue = ['attributesToHighlight']; var newsp = sp.setQueryParameter('attributesToHighlight', newValue); - t.deepEquals(newsp.attributesToHighlight, newValue, 'add new parameter'); - - t.end(); + expect(newsp.attributesToHighlight).toEqual(newValue); }); -test('setQueryParameter should not create a new instance if the update is non effective', function(t) { +test('setQueryParameter should not create a new instance if the update is non effective', function() { var sp = new SearchParameters({ facets: ['facet'], maxValuesPerFacet: 10 @@ -38,21 +33,17 @@ test('setQueryParameter should not create a new instance if the update is non ef var newValue = 10; var newsp = sp.setQueryParameter('maxValuesPerFacet', newValue); - t.deepEquals(newsp, sp, 'No change should result in the same instance'); - - t.end(); + expect(newsp).toEqual(sp); }); test( 'setQueryParameter should not throw an error when trying to add an unknown parameter, and actually add it', - function(t) { + function() { var state0 = new SearchParameters(); var state1 = state0.setQueryParameter('betaParameter', 'configValue'); // manual test that the warnonce message actually display message once state0.setQueryParameter('betaParameter', 'configValue'); - t.deepEquals(state1.betaParameter, 'configValue'); - - t.end(); + expect(state1.betaParameter).toEqual('configValue'); } ); diff --git a/test/spec/SearchParameters/setQueryParameters.js b/test/spec/SearchParameters/setQueryParameters.js index 9757d0019..53e9a0432 100644 --- a/test/spec/SearchParameters/setQueryParameters.js +++ b/test/spec/SearchParameters/setQueryParameters.js @@ -1,24 +1,21 @@ 'use strict'; -var test = require('tape'); var forOwn = require('lodash/forOwn'); var SearchParameters = require('../../../src/SearchParameters'); -test('setQueryParameters should return the same instance if the options is falsey', function(t) { +test('setQueryParameters should return the same instance if the options is falsey', function() { var originalSP = new SearchParameters({ facets: ['a', 'b'], ignorePlurals: false, attributesToHighlight: '' }); - t.equal(originalSP, originalSP.setQueryParameters()); - t.equal(originalSP, originalSP.setQueryParameters(null)); - t.equal(originalSP, originalSP.setQueryParameters(undefined)); - - t.end(); + expect(originalSP).toBe(originalSP.setQueryParameters()); + expect(originalSP).toBe(originalSP.setQueryParameters(null)); + expect(originalSP).toBe(originalSP.setQueryParameters(undefined)); }); -test('setQueryParameters should be able to mix an actual state with a new set of parameters', function(t) { +test('setQueryParameters should be able to mix an actual state with a new set of parameters', function() { var originalSP = new SearchParameters({ facets: ['a', 'b'], ignorePlurals: false, @@ -32,15 +29,13 @@ test('setQueryParameters should be able to mix an actual state with a new set of }; var newSP = originalSP.setQueryParameters(params); - t.deepEquals(newSP.facets, params.facets, 'Facets should be updated (existing parameter)'); - t.deepEquals(newSP.attributesToHighlight, newSP.attributesToHighlight, 'attributesToHighlight should be updated (existing parameter)'); - t.equal(newSP.replaceSynonymsInHighlight, newSP.replaceSynonymsInHighlight, 'replaceSynonymsInHighlight should be updated (new parameter)'); - t.equal(newSP.ignorePlurals, originalSP.ignorePlurals, 'ignorePlurals should be the same as the original'); - - t.end(); + expect(newSP.facets).toEqual(params.facets); + expect(newSP.attributesToHighlight).toEqual(newSP.attributesToHighlight); + expect(newSP.replaceSynonymsInHighlight).toBe(newSP.replaceSynonymsInHighlight); + expect(newSP.ignorePlurals).toBe(originalSP.ignorePlurals); }); -test('setQueryParameters should add unknown properties', function(t) { +test('setQueryParameters should add unknown properties', function() { var state0 = new SearchParameters({ facets: ['a', 'b'], ignorePlurals: false, @@ -55,8 +50,6 @@ test('setQueryParameters should add unknown properties', function(t) { var state1 = state0.setQueryParameters(params); forOwn(params, function(v, k) { - t.deepEquals(state1[k], v); + expect(state1[k]).toEqual(v); }); - - t.end(); }); diff --git a/test/spec/SearchParameters/shortener.js b/test/spec/SearchParameters/shortener.js index ca6f63ad9..272bc0658 100644 --- a/test/spec/SearchParameters/shortener.js +++ b/test/spec/SearchParameters/shortener.js @@ -1,25 +1,15 @@ 'use strict'; -var test = require('tape'); var SearchParameters = require('../../../src/SearchParameters'); var keys = require('lodash/keys'); var map = require('lodash/map'); var uniq = require('lodash/uniq'); var shortener = require('../../../src/SearchParameters/shortener'); -test('Should encode all the properties of AlgoliaSearchHelper properly', function(t) { +test('Should encode all the properties of AlgoliaSearchHelper properly', function() { var ks = keys(new SearchParameters()); var encodedKs = uniq(map(ks, shortener.encode)); - t.equals( - encodedKs.length, - ks.length, - 'Once all the properties converted and dedup, their length should be equal' - ); + expect(encodedKs.length).toBe(ks.length); var decodedKs = map(encodedKs, shortener.decode); - t.deepEquals( - decodedKs, - ks, - 'Encode then decode should be the initial value' - ); - t.end(); + expect(decodedKs).toEqual(ks); }); diff --git a/test/spec/SearchResults/getFacet.js b/test/spec/SearchResults/getFacet.js index 1ca7e3e11..2afce7542 100644 --- a/test/spec/SearchResults/getFacet.js +++ b/test/spec/SearchResults/getFacet.js @@ -1,21 +1,18 @@ 'use strict'; -var test = require('tape'); var SearchResults = require('../../../src/SearchResults'); -test('getFacetByName should return a given facet be it disjunctive or conjunctive', function(t) { - var data = require('../search.testdata')(); +test('getFacetByName should return a given facet be it disjunctive or conjunctive', function() { + var data = require('../../datasets/SearchParameters/search.dataset')(); var result = new SearchResults(data.searchParams, data.response.results); var cityFacet = result.getFacetByName('city'); - t.equal(cityFacet.name, 'city', 'name'); - t.deepEqual(cityFacet.data, { + expect(cityFacet.name).toBe('city'); + expect(cityFacet.data).toEqual({ 'New York': 1, 'Paris': 3, 'San Francisco': 1 - }, 'values'); - - t.end(); + }); }); diff --git a/test/spec/SearchResults/getFacetStats.js b/test/spec/SearchResults/getFacetStats.js index 85762e6b5..f387420ad 100644 --- a/test/spec/SearchResults/getFacetStats.js +++ b/test/spec/SearchResults/getFacetStats.js @@ -1,6 +1,5 @@ 'use strict'; -var test = require('tape'); var SearchResults = require('../../../src/SearchResults'); var SearchParameters = require('../../../src/SearchParameters'); @@ -37,43 +36,25 @@ var response = { }] }; -test('getFacetStats(facetName) returns stats for any facet or disjunctiveFacet', function(t) { +test('getFacetStats(facetName) returns stats for any facet or disjunctiveFacet', function() { var searchParams = new SearchParameters({ facets: ['age', 'country'], disjunctiveFacets: ['price'] }); var result = new SearchResults(searchParams, response.results); - t.throws( - bind(result.getFacetStats, result, 'city'), - Error, - 'non defined facet should throw'); - t.equal( - result.getFacetStats('country'), - undefined, - 'should be undefined as "country" has no stats'); - t.deepEqual( - result.getFacetStats('age'), - response.results[0].facets_stats.age, - 'should return the same stats data as in the response'); - t.deepEqual( - result.getFacetStats('price'), - response.results[0].facets_stats.price, - 'should return the same stats data as in the response'); - - t.end(); + expect(bind(result.getFacetStats, result, 'city')).toThrowError(Error); + expect(result.getFacetStats('country')).toBe(undefined); + expect(result.getFacetStats('age')).toEqual(response.results[0].facets_stats.age); + expect(result.getFacetStats('price')).toEqual(response.results[0].facets_stats.price); }); -test('getFacetStats(facetName) returns stats if the facet is both a regular and disjunctive facet', function(t) { +test('getFacetStats(facetName) returns stats if the facet is both a regular and disjunctive facet', function() { var searchParams = new SearchParameters({ facets: ['price'], disjunctiveFacets: ['price'] }); var result = new SearchResults(searchParams, response.results); - t.deepEqual( - result.getFacetStats('price'), - response.results[0].facets_stats.price, - 'should return the same stats data as in the response'); - t.end(); + expect(result.getFacetStats('price')).toEqual(response.results[0].facets_stats.price); }); diff --git a/test/spec/SearchResults/getFacetValues.js b/test/spec/SearchResults/getFacetValues.js index 7de0f9b7b..d25c20907 100644 --- a/test/spec/SearchResults/getFacetValues.js +++ b/test/spec/SearchResults/getFacetValues.js @@ -1,11 +1,9 @@ 'use strict'; -var test = require('tape'); - var SearchResults = require('../../../src/SearchResults'); var SearchParameters = require('../../../src/SearchParameters'); -test('getFacetValues(facetName) returns a list of values using the defaults', function(t) { +test('getFacetValues(facetName) returns a list of values using the defaults', function() { var data = require('./getFacetValues/disjunctive.json'); var searchParams = new SearchParameters(data.state); var result = new SearchResults(searchParams, data.content.results); @@ -18,14 +16,12 @@ test('getFacetValues(facetName) returns a list of values using the defaults', fu {count: 511, isRefined: false, name: 'Samsung'} ]; - t.deepEqual(facetValues, expected); - - t.end(); + expect(facetValues).toEqual(expected); }); test( 'getFacetValues(facetName) when no order is specified for isRefined the order is descending', - function(t) { + function() { var data = require('./getFacetValues/disjunctive.json'); var searchParams = new SearchParameters(data.state); var result = new SearchResults(searchParams, data.content.results); @@ -38,12 +34,10 @@ test( sortBy: ['isRefined:desc'] }); - t.deepEqual(facetValues, expected); - - t.end(); + expect(facetValues).toEqual(expected); }); -test('getFacetValues(facetName) when no order is specified for count the order is descending', function(t) { +test('getFacetValues(facetName) when no order is specified for count the order is descending', function() { var data = require('./getFacetValues/disjunctive.json'); var searchParams = new SearchParameters(data.state); var result = new SearchResults(searchParams, data.content.results); @@ -56,12 +50,10 @@ test('getFacetValues(facetName) when no order is specified for count the order i sortBy: ['count:desc'] }); - t.deepEqual(facetValues, expected); - - t.end(); + expect(facetValues).toEqual(expected); }); -test('getFacetValues(facetName) when no order is specified for name the order is ascending', function(t) { +test('getFacetValues(facetName) when no order is specified for name the order is ascending', function() { var data = require('./getFacetValues/disjunctive.json'); var searchParams = new SearchParameters(data.state); var result = new SearchResults(searchParams, data.content.results); @@ -74,12 +66,10 @@ test('getFacetValues(facetName) when no order is specified for name the order is sortBy: ['name:asc'] }); - t.deepEqual(facetValues, expected); - - t.end(); + expect(facetValues).toEqual(expected); }); -test('getFacetValues(facetName) testing the sort function', function(t) { +test('getFacetValues(facetName) testing the sort function', function() { var data = require('./getFacetValues/disjunctive.json'); var searchParams = new SearchParameters(data.state); var result = new SearchResults(searchParams, data.content.results); @@ -96,7 +86,5 @@ test('getFacetValues(facetName) testing the sort function', function(t) { sortBy: ['count:asc'] }); - t.deepEqual(facetValues, expected); - - t.end(); + expect(facetValues).toEqual(expected); }); diff --git a/test/spec/SearchResults/getRefinements.js b/test/spec/SearchResults/getRefinements.js index b7dce97d4..c74082978 100644 --- a/test/spec/SearchResults/getRefinements.js +++ b/test/spec/SearchResults/getRefinements.js @@ -1,6 +1,5 @@ 'use strict'; -var test = require('tape'); var filter = require('lodash/filter'); var forEach = require('lodash/forEach'); var find = require('lodash/find'); @@ -8,16 +7,14 @@ var find = require('lodash/find'); var SearchResults = require('../../../src/SearchResults'); var SearchParameters = require('../../../src/SearchParameters'); -test('getRefinements(facetName) returns an empty array when there is no refinements set', function(t) { +test('getRefinements(facetName) returns an empty array when there is no refinements set', function() { var data = require('./getRefinements/noFilters.json'); var searchParams = new SearchParameters(data.state); var result = new SearchResults(searchParams, data.content.results); var refinements = result.getRefinements(); - t.deepEqual(refinements, []); - - t.end(); + expect(refinements).toEqual([]); }); function hasSameNames(l1, l2) { @@ -29,7 +26,7 @@ function hasSameNames(l1, l2) { return res; } -test('getRefinements(facetName) returns a refinement(facet) when a facet refinement is set', function(t) { +test('getRefinements(facetName) returns a refinement(facet) when a facet refinement is set', function() { var data = require('./getRefinements/conjunctive-brand-apple.json'); var searchParams = new SearchParameters(data.state); var result = new SearchResults(searchParams, data.content.results); @@ -44,14 +41,12 @@ test('getRefinements(facetName) returns a refinement(facet) when a facet refinem attributeName: 'brand', count: 386, exhaustive: true, name: 'Apple', type: 'facet' }]; - t.deepEqual(refinements, expected); - t.equal(refinements.length, refinedFacetValues.length); - t.ok(hasSameNames(refinements, refinedFacetValues)); - - t.end(); + expect(refinements).toEqual(expected); + expect(refinements.length).toBe(refinedFacetValues.length); + expect(hasSameNames(refinements, refinedFacetValues)).toBeTruthy(); }); -test('getRefinements(facetName) returns a refinement(exlude) when a facet exclusion is set', function(t) { +test('getRefinements(facetName) returns a refinement(exclude) when a facet exclusion is set', function() { var data = require('./getRefinements/exclude-apple.json'); var searchParams = new SearchParameters(data.state); var result = new SearchResults(searchParams, data.content.results); @@ -66,16 +61,14 @@ test('getRefinements(facetName) returns a refinement(exlude) when a facet exclus attributeName: 'brand', count: 0, exhaustive: true, name: 'Apple', type: 'exclude' }]; - t.deepEqual(refinements, expected); - t.equal(refinements.length, refinedFacetValues.length); - t.ok(hasSameNames(refinements, refinedFacetValues)); - - t.end(); + expect(refinements).toEqual(expected); + expect(refinements.length).toBe(refinedFacetValues.length); + expect(hasSameNames(refinements, refinedFacetValues)).toBeTruthy(); }); test( 'getRefinements(facetName) returns a refinement(disjunctive) when a disjunctive refinement is set', - function(t) { + function() { var data = require('./getRefinements/disjunctive-type-trendcase.json'); var searchParams = new SearchParameters(data.state); var result = new SearchResults(searchParams, data.content.results); @@ -90,56 +83,53 @@ test( attributeName: 'type', count: 537, exhaustive: true, name: 'Trend cases', type: 'disjunctive' }]; - t.deepEqual(refinements, expected); - t.equal(refinements.length, refinedFacetValues.length); - t.ok(hasSameNames(refinements, refinedFacetValues)); - - t.end(); + expect(refinements).toEqual(expected); + expect(refinements.length).toBe(refinedFacetValues.length); + expect(hasSameNames(refinements, refinedFacetValues)).toBeTruthy(); } ); test( 'getRefinements(facetName) returns a refinement(hierarchical) when a disjunctive refinement is set', - function(t) { + function() { var data = require('./getRefinements/hierarchical-cards.json'); var searchParams = new SearchParameters(data.state); var result = new SearchResults(searchParams, data.content.results); var refinements = result.getRefinements(); - t.deepEqual(refinements, [{ - attributeName: 'hierarchicalCategories', count: 0, exhaustive: false, - name: 'Best Buy Gift Cards > Entertainment Gift Cards', type: 'hierarchical' - }]); - - t.end(); + expect(refinements).toEqual([ + { + attributeName: 'hierarchicalCategories', + count: 0, + exhaustive: false, + name: 'Best Buy Gift Cards > Entertainment Gift Cards', + type: 'hierarchical' + } + ]); }); -test('getRefinements(facetName) returns a refinement(numeric) when a numeric filter is set', function(t) { +test('getRefinements(facetName) returns a refinement(numeric) when a numeric filter is set', function() { var data = require('./getRefinements/numeric-rating-3.json'); var searchParams = new SearchParameters(data.state); var result = new SearchResults(searchParams, data.content.results); var refinements = result.getRefinements(); - t.deepEqual(refinements, [{ + expect(refinements).toEqual([{ attributeName: 'rating', name: 3, numericValue: 3, operator: '=', type: 'numeric' }]); - - t.end(); }); -test('getRefinements(facetName) returnes a refinement(tag) when a tag is set', function(t) { +test('getRefinements(facetName) returns a refinement(tag) when a tag is set', function() { var data = require('./getRefinements/dummy-tags.json'); var searchParams = new SearchParameters(data.state); var result = new SearchResults(searchParams, data.content.results); var refinements = result.getRefinements(); - t.deepEqual(refinements, [ + expect(refinements).toEqual([ {attributeName: '_tags', name: 'foo', type: 'tag'}, {attributeName: '_tags', name: 'bar', type: 'tag'} ]); - - t.end(); }); diff --git a/test/spec/accepts-length-parameter.js b/test/spec/accepts-length-parameter.js deleted file mode 100644 index d1b5a8d01..000000000 --- a/test/spec/accepts-length-parameter.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -var test = require('tape'); - -// This test ensures that the helper accepts the `length` (offset/length API param) parameter -// At some point we were badly iterating over the SearchParameters instance and failed when -// the `length` parameter was given. - -test('helper accepts length parameter', function(t) { - t.plan(2); - - var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); - var algoliasearchHelper = require('../../'); - - var appId = 'accepts-length-parameter-appId'; - var apiKey = 'accepts-length-parameter-apiKey'; - var indexName = 'accepts-length-parameter-indexName'; - - var client = algoliasearch(appId, apiKey); - var helper = algoliasearchHelper(client, indexName, { - length: 2, - hitsPerPage: 10 - }); - - client.search = sinon.stub().returns(new Promise(function() {})); - - helper.setQuery('a').search(); - - var searchParams = client.search.getCall(0).args[0][0].params; - - t.equal(searchParams.length, 2, 'searchParams.length was set'); - t.equal(searchParams.hitsPerPage, 10, 'searchParams.hitsPerPage was also set'); -}); diff --git a/test/spec/algoliasearch.helper/clears.js b/test/spec/algoliasearch.helper/clears.js index f9e62ea5b..7c325cd66 100644 --- a/test/spec/algoliasearch.helper/clears.js +++ b/test/spec/algoliasearch.helper/clears.js @@ -1,6 +1,5 @@ 'use strict'; -var test = require('tape'); var algoliasearchHelper = require('../../../index'); var forEach = require('lodash/forEach'); var keys = require('lodash/keys'); @@ -29,57 +28,47 @@ function fixture() { .addNumericRefinement('numeric2', '<', 10); } -test('Check that the state objects match how we test them', function(t) { +test('Check that the state objects match how we test them', function() { var helper = fixture(); - t.deepEqual(helper.state.facetsRefinements, {facet1: ['0'], facet2: ['0']}); - t.deepEqual( - helper.state.disjunctiveFacetsRefinements, - {disjunctiveFacet1: ['0'], disjunctiveFacet2: ['0']}); - t.deepEqual(helper.state.facetsExcludes, {excluded1: ['0'], excluded2: ['0']}); - t.deepEqual( - helper.state.numericRefinements, - {numeric1: {'>=': [0], '<': [10]}, numeric2: {'>=': [0], '<': [10]}}); - - t.end(); + expect(helper.state.facetsRefinements).toEqual({facet1: ['0'], facet2: ['0']}); + expect(helper.state.disjunctiveFacetsRefinements).toEqual({disjunctiveFacet1: ['0'], disjunctiveFacet2: ['0']}); + expect(helper.state.facetsExcludes).toEqual({excluded1: ['0'], excluded2: ['0']}); + expect(helper.state.numericRefinements).toEqual({numeric1: {'>=': [0], '<': [10]}, numeric2: {'>=': [0], '<': [10]}}); }); -test('Clear with a name should work on every type and not remove others than targetted name', function(t) { +test('Clear with a name should work on every type and not remove others than targetted name', function() { var helper = fixture(); helper.clearRefinements('facet1'); - t.deepEqual(helper.state.facetsRefinements, {facet2: ['0']}); + expect(helper.state.facetsRefinements).toEqual({facet2: ['0']}); helper.clearRefinements('disjunctiveFacet1'); - t.deepEqual(helper.state.disjunctiveFacetsRefinements, {disjunctiveFacet2: ['0']}); + expect(helper.state.disjunctiveFacetsRefinements).toEqual({disjunctiveFacet2: ['0']}); helper.clearRefinements('excluded1'); - t.deepEqual(helper.state.facetsExcludes, {excluded2: ['0']}); + expect(helper.state.facetsExcludes).toEqual({excluded2: ['0']}); helper.clearRefinements('numeric1'); - t.deepEqual(helper.state.numericRefinements, {numeric2: {'>=': [0], '<': [10]}}); - - t.end(); + expect(helper.state.numericRefinements).toEqual({numeric2: {'>=': [0], '<': [10]}}); }); -test('Clearing the same field from multiple elements should remove it everywhere', function(t) { +test('Clearing the same field from multiple elements should remove it everywhere', function() { var helper = fixture(); helper.addNumericRefinement('facet1', '>=', '10').toggleExclude('facet1', 'value'); - t.deepEqual(helper.state.facetsRefinements.facet1, ['0']); - t.deepEqual(helper.state.numericRefinements.facet1, {'>=': [10]}); - t.deepEqual(helper.state.facetsExcludes.facet1, ['value']); + expect(helper.state.facetsRefinements.facet1).toEqual(['0']); + expect(helper.state.numericRefinements.facet1).toEqual({'>=': [10]}); + expect(helper.state.facetsExcludes.facet1).toEqual(['value']); helper.clearRefinements('facet1'); - t.assert(isUndefined(helper.state.facetsRefinements.facet1)); - t.assert(isUndefined(helper.state.numericRefinements.facet1)); - t.assert(isUndefined(helper.state.facetsExcludes.facet1)); - - t.end(); + expect(isUndefined(helper.state.facetsRefinements.facet1)).toBeTruthy(); + expect(isUndefined(helper.state.numericRefinements.facet1)).toBeTruthy(); + expect(isUndefined(helper.state.facetsExcludes.facet1)).toBeTruthy(); }); -test('Clear with a function: neutral predicate', function(t) { +test('Clear with a function: neutral predicate', function() { var helper = fixture(); var state0 = helper.state; @@ -87,30 +76,26 @@ test('Clear with a function: neutral predicate', function(t) { return false; }); - t.deepEqual(helper.state.numericRefinements, state0.numericRefinements, 'Neutral op: numeric ref should be equal'); - t.deepEqual(helper.state.facetsRefinements, state0.facetsRefinements, 'Neutral op: conj ref should be equal'); - t.deepEqual(helper.state.facetsExcludes, state0.facetsExcludes, 'Neutral op: exclude ref should be equal'); - t.deepEqual(helper.state.disjunctiveFacetsRefinements, state0.disjunctiveFacetsRefinements, 'Neutral op: disj ref should be equal'); - - t.end(); + expect(helper.state.numericRefinements).toEqual(state0.numericRefinements); + expect(helper.state.facetsRefinements).toEqual(state0.facetsRefinements); + expect(helper.state.facetsExcludes).toEqual(state0.facetsExcludes); + expect(helper.state.disjunctiveFacetsRefinements).toEqual(state0.disjunctiveFacetsRefinements); }); -test('Clear with a function: remove all predicate', function(t) { +test('Clear with a function: remove all predicate', function() { var helper = fixture(); helper.clearRefinements(function() { return true; }); - t.assert(isEmpty(helper.state.numericRefinements), 'remove all numericRefinements'); - t.assert(isEmpty(helper.state.facetsRefinements), 'remove all facetsRefinements'); - t.assert(isEmpty(helper.state.facetsExcludes), 'remove all facetsExcludes'); - t.assert(isEmpty(helper.state.disjunctiveFacetsRefinements), 'remove all disjunctiveFacetsRefinements'); - - t.end(); + expect(isEmpty(helper.state.numericRefinements)).toBeTruthy(); + expect(isEmpty(helper.state.facetsRefinements)).toBeTruthy(); + expect(isEmpty(helper.state.facetsExcludes)).toBeTruthy(); + expect(isEmpty(helper.state.disjunctiveFacetsRefinements)).toBeTruthy(); }); -test('Clear with a function: filtering', function(t) { +test('Clear with a function: filtering', function() { var helper = fixture(); var checkType = { @@ -126,65 +111,59 @@ test('Clear with a function: filtering', function(t) { return key.indexOf('1') !== -1; }); - t.equal(keys(checkType).length, 4, 'There should be only 4 refinements'); - forEach(checkType, function(typeTest, type) { t.ok(typeTest, 'clear should go through: ' + type); }); - - t.deepEqual(helper.state.facetsRefinements, {facet2: ['0']}); - t.deepEqual(helper.state.disjunctiveFacetsRefinements, {disjunctiveFacet2: ['0']}); - t.deepEqual(helper.state.facetsExcludes, {excluded2: ['0']}); - t.deepEqual(helper.state.numericRefinements, {numeric2: {'>=': [0], '<': [10]}}); + expect(keys(checkType).length).toBe(4); + forEach(checkType, function(typeTest) { expect(typeTest).toBeTruthy(); }); - t.end(); + expect(helper.state.facetsRefinements).toEqual({facet2: ['0']}); + expect(helper.state.disjunctiveFacetsRefinements).toEqual({disjunctiveFacet2: ['0']}); + expect(helper.state.facetsExcludes).toEqual({excluded2: ['0']}); + expect(helper.state.numericRefinements).toEqual({numeric2: {'>=': [0], '<': [10]}}); }); -test('Clearing twice the same attribute should be not problem', function(t) { +test('Clearing twice the same attribute should be not problem', function() { var helper = fixture(); - t.deepEqual(helper.state.facetsRefinements.facet1, ['0']); + expect(helper.state.facetsRefinements.facet1).toEqual(['0']); helper.clearRefinements('facet1'); - t.assert(isUndefined(helper.state.facetsRefinements.facet1)); - t.doesNotThrow(function() { + expect(isUndefined(helper.state.facetsRefinements.facet1)).toBeTruthy(); + expect(function() { helper.clearRefinements('facet1'); - }); + }).not.toThrow(); - t.deepEqual(helper.state.disjunctiveFacetsRefinements.disjunctiveFacet1, ['0']); + expect(helper.state.disjunctiveFacetsRefinements.disjunctiveFacet1).toEqual(['0']); helper.clearRefinements('disjunctiveFacet1'); - t.assert(isUndefined(helper.state.disjunctiveFacetsRefinements.disjunctiveFacet1)); - t.doesNotThrow(function() { + expect(isUndefined(helper.state.disjunctiveFacetsRefinements.disjunctiveFacet1)).toBeTruthy(); + expect(function() { helper.clearRefinements('disjunctiveFacet1'); - }); + }).not.toThrow(); - t.deepEqual(helper.state.facetsExcludes.excluded1, ['0']); + expect(helper.state.facetsExcludes.excluded1).toEqual(['0']); helper.clearRefinements('excluded1'); - t.assert(isUndefined(helper.state.facetsExcludes.excluded1)); - t.doesNotThrow(function() { + expect(isUndefined(helper.state.facetsExcludes.excluded1)).toBeTruthy(); + expect(function() { helper.clearRefinements('excluded1'); - }); + }).not.toThrow(); - t.deepEqual(helper.state.numericRefinements.numeric1, {'>=': [0], '<': [10]}); + expect(helper.state.numericRefinements.numeric1).toEqual({'>=': [0], '<': [10]}); helper.clearRefinements('numeric1'); - t.assert(isUndefined(helper.state.numericRefinements.numeric1)); - t.doesNotThrow(function() { + expect(isUndefined(helper.state.numericRefinements.numeric1)).toBeTruthy(); + expect(function() { helper.clearRefinements('numeric1'); - }); - - t.end(); + }).not.toThrow(); }); -test('Clearing without parameters should clear everything', function(t) { +test('Clearing without parameters should clear everything', function() { var helper = fixture(); helper.clearRefinements(); - t.deepEqual(helper.state.numericRefinements, {}, 'Numeric refinements should be empty'); - t.deepEqual(helper.state.facetsRefinements, {}, 'Facets refinements should be empty'); - t.deepEqual(helper.state.disjunctiveFacetsRefinements, {}, 'Disjunctive facets refinements should be empty'); - t.deepEqual(helper.state.hierarchicalFacetsRefinements, {}, 'Hierarchical facets refinements should be empty'); - - t.end(); + expect(helper.state.numericRefinements).toEqual({}); + expect(helper.state.facetsRefinements).toEqual({}); + expect(helper.state.disjunctiveFacetsRefinements).toEqual({}); + expect(helper.state.hierarchicalFacetsRefinements).toEqual({}); }); -test('Clearing with no effect should not update the state', function(t) { +test('Clearing with no effect should not update the state', function() { var helper = fixture(); // Reset the state helper.clearRefinements(); @@ -192,28 +171,24 @@ test('Clearing with no effect should not update the state', function(t) { // This operation should not update the reference to the state helper.clearRefinements(); - t.equal(helper.state.numericRefinements, emptyState.numericRefinements, 'Numeric refinements should be empty'); - t.equal(helper.state.facetsRefinements, emptyState.facetsRefinements, 'Facets refinements should be empty'); - t.equal(helper.state.disjunctiveFacetsRefinements, emptyState.disjunctiveFacetsRefinements, 'Disjunctive facets refinements should be empty'); - t.equal(helper.state.hierarchicalFacetsRefinements, emptyState.hierarchicalFacetsRefinements, 'Hierarchical facets refinements should be empty'); - - t.equal(helper.state, emptyState, 'State should remain the same'); + expect(helper.state.numericRefinements).toBe(emptyState.numericRefinements); + expect(helper.state.facetsRefinements).toBe(emptyState.facetsRefinements); + expect(helper.state.disjunctiveFacetsRefinements).toBe(emptyState.disjunctiveFacetsRefinements); + expect(helper.state.hierarchicalFacetsRefinements).toBe(emptyState.hierarchicalFacetsRefinements); - t.end(); + expect(helper.state).toBe(emptyState); }); -test('Clearing with no effect should not update the state, if used with an unknown attribute', function(t) { +test('Clearing with no effect should not update the state, if used with an unknown attribute', function() { var helper = fixture(); var initialState = helper.state; // This operation should not update the reference to the state helper.clearRefinements('unknown'); - t.equal(helper.state.numericRefinements, initialState.numericRefinements, 'Numeric refinements should be empty'); - t.equal(helper.state.facetsRefinements, initialState.facetsRefinements, 'Facets refinements should be empty'); - t.equal(helper.state.disjunctiveFacetsRefinements, initialState.disjunctiveFacetsRefinements, 'Disjunctive facets refinements should be empty'); - t.equal(helper.state.hierarchicalFacetsRefinements, initialState.hierarchicalFacetsRefinements, 'Hierarchical facets refinements should be empty'); - - t.equal(helper.state, initialState, 'State should remain the same'); + expect(helper.state.numericRefinements).toBe(initialState.numericRefinements); + expect(helper.state.facetsRefinements).toBe(initialState.facetsRefinements); + expect(helper.state.disjunctiveFacetsRefinements).toBe(initialState.disjunctiveFacetsRefinements); + expect(helper.state.hierarchicalFacetsRefinements).toBe(initialState.hierarchicalFacetsRefinements); - t.end(); + expect(helper.state).toBe(initialState); }); diff --git a/test/spec/algoliasearch.helper/client.js b/test/spec/algoliasearch.helper/client.js index 82b337ac7..3b74dc5c5 100644 --- a/test/spec/algoliasearch.helper/client.js +++ b/test/spec/algoliasearch.helper/client.js @@ -1,113 +1,102 @@ 'use strict'; -var test = require('tape'); -var sinon = require('sinon'); var algoliaSearchHelper = require('../../../index.js'); var version = require('../../../src/version'); var algoliasearch = require('algoliasearch'); function makeFakeClient() { var client = algoliasearch('what', 'wait', {}); - client.search = sinon.stub().returns(new Promise(function() {})); + + client.search = jest.fn(function() { + return new Promise(function() {}); + }); + return client; } -test("client without addAlgoliaAgent() doesn't throw on instanciation", function(t) { +test("client without addAlgoliaAgent() doesn't throw on instanciation", function() { var client = {}; - t.doesNotThrow(function() { + expect(function() { algoliaSearchHelper(client); - }); - - t.end(); + }).not.toThrow(); }); -test('addAlgoliaAgent gets called if exists', function(t) { +test('addAlgoliaAgent gets called if exists', function() { var client = { - addAlgoliaAgent: sinon.stub() + addAlgoliaAgent: jest.fn() }; - t.notOk(client.addAlgoliaAgent.called); + expect(client.addAlgoliaAgent).not.toHaveBeenCalled(); algoliaSearchHelper(client); - t.ok(client.addAlgoliaAgent.called); - - t.end(); + expect(client.addAlgoliaAgent).toHaveBeenCalled(); }); -test("client without clearCache() doesn't throw when clearing cache", function(t) { +test("client without clearCache() doesn't throw when clearing cache", function() { var client = {}; var helper = algoliaSearchHelper(client); - t.doesNotThrow(function() { + expect(function() { helper.clearCache(); - }); - - t.end(); + }).not.toThrow(); }); -test('clearCache gets called if exists', function(t) { +test('clearCache gets called if exists', function() { var client = { - clearCache: sinon.stub() + clearCache: jest.fn() }; var helper = algoliaSearchHelper(client); - t.notOk(client.clearCache.called); + expect(client.clearCache).toHaveBeenCalledTimes(0); helper.clearCache(); - t.ok(client.clearCache.called); - - t.end(); + expect(client.clearCache).toHaveBeenCalledTimes(1); }); -test('setting the agent once', function(t) { +test('setting the agent once', function() { var client = algoliasearch('what', 'wait', {}); var originalUA = client._ua; algoliaSearchHelper(client, 'IndexName', {}); algoliaSearchHelper(client, 'IndexName2', {}); - t.equal(client._ua, originalUA + ';JS Helper (' + version + ')'); - - t.end(); + expect(client._ua).toBe(originalUA + ';JS Helper (' + version + ')'); }); -test('getClient / setClient', function(t) { +test('getClient / setClient', function() { var client0 = makeFakeClient(); var originalUA = client0._ua; var helper = algoliaSearchHelper(client0, 'IndexName', {}); - t.equal(client0.search.callCount, 0, 'before any search the client should not have been called'); + expect(client0.search).toHaveBeenCalledTimes(0); helper.search(); - t.equal(client0.search.callCount, 1, 'after a single search, the client must have been strictly one time'); + expect(client0.search).toHaveBeenCalledTimes(1); - t.equal(helper.getClient(), client0, 'getClient should return the instance defined with the Helper factory'); + expect(helper.getClient()).toBe(client0); - t.equal(client0._ua, originalUA + ';JS Helper (' + version + ')', 'sets the helper agent, client 0'); + expect(client0._ua).toBe(originalUA + ';JS Helper (' + version + ')'); var client1 = makeFakeClient(); helper.setClient(client1); - t.equal(helper.getClient(), client1); + expect(helper.getClient()).toBe(client1); - t.equal(client1.search.callCount, 0, 'the new client should not have been called before any search'); + expect(client1.search).toHaveBeenCalledTimes(0); helper.search(); - t.equal(client1.search.callCount, 1, 'the new client should have been called'); - t.equal(client0.search.callCount, 1, 'the old client should not have been called if it is not set anymore'); + expect(client1.search).toHaveBeenCalledTimes(1); + expect(client0.search).toHaveBeenCalledTimes(1); - t.equal(client1._ua, originalUA + ';JS Helper (' + version + ')', 'sets the helper agent, client 1'); + expect(client1._ua).toBe(originalUA + ';JS Helper (' + version + ')'); helper.setClient(client1); - t.equal(client1._ua, originalUA + ';JS Helper (' + version + ')', 'does not set the helper agent twice, client 1'); - - t.end(); + expect(client1._ua).toBe(originalUA + ';JS Helper (' + version + ')'); }); -test('initial client === getClient', function(t) { - t.plan(1); +test('initial client === getClient', function() { var client = algoliasearch('latency', '6be0576ff61c053d5f9a3225e2a90f76'); var helper = algoliaSearchHelper(client, 'instant_search', {}); helper.setQuery('blah').search(); - t.equal(client, helper.getClient()); + expect(client).toBe(helper.getClient()); }); diff --git a/test/spec/algoliasearch.helper/derive/detach.js b/test/spec/algoliasearch.helper/derive/detach.js index 75e3384a7..2f734a212 100644 --- a/test/spec/algoliasearch.helper/derive/detach.js +++ b/test/spec/algoliasearch.helper/derive/detach.js @@ -1,10 +1,8 @@ 'use strict'; -var test = require('tape'); - var algoliasearchHelper = require('../../../../index.js'); -test('[derived helper] detach a derived helper', function(t) { +test('[derived helper] detach a derived helper', function(done) { var client = { search: searchTest }; @@ -20,34 +18,14 @@ test('[derived helper] detach a derived helper', function(t) { function searchTest(requests) { nbRequest = nbRequest || 0; if (nbRequest === 0) { - t.equal( - requests.length, - 2, - 'the helper generates two queries' - ); - t.deepEqual( - requests[0], - requests[1], - 'the helper generates the same query twice' - ); - t.equal( - derivedHelper.listeners('result').length, - 1, - 'one listener is plugged to the derived helper' - ); + expect(requests.length).toBe(2); + expect(requests[0]).toEqual(requests[1]); + expect(derivedHelper.listeners('result').length).toBe(1); nbRequest++; } else if (nbRequest === 1) { - t.equal( - requests.length, - 1, - 'the helper generates two queries' - ); - t.equal( - derivedHelper.listeners('result').length, - 0, - 'no listener on the derived helper' - ); - t.end(); + expect(requests.length).toBe(1); + expect(derivedHelper.listeners('result').length).toBe(0); + done(); } return new Promise(function() {}); diff --git a/test/spec/algoliasearch.helper/derive/multiqueries.js b/test/spec/algoliasearch.helper/derive/multiqueries.js index 0d6372c5a..28c3ee2b7 100644 --- a/test/spec/algoliasearch.helper/derive/multiqueries.js +++ b/test/spec/algoliasearch.helper/derive/multiqueries.js @@ -1,11 +1,9 @@ 'use strict'; -var test = require('tape'); - var algoliasearchHelper = require('../../../../index.js'); -test('[Derived helper] no derived helpers', function(t) { - t.plan(1); +test('[Derived helper] no derived helpers', function() { + expect.assertions(1); var client = { search: searchTest }; @@ -13,18 +11,14 @@ test('[Derived helper] no derived helpers', function(t) { helper.search(); function searchTest(requests) { - t.equal( - requests.length, - 1, - 'Without the derived helpers and no filters, the helper generates a single query' - ); + expect(requests.length).toBe(1); return new Promise(function() {}); } }); -test('[Derived helper] 1 derived helpers, no modifications', function(t) { - t.plan(2); +test('[Derived helper] 1 derived helpers, no modifications', function() { + expect.assertions(2); var client = { search: searchTest }; @@ -33,23 +27,15 @@ test('[Derived helper] 1 derived helpers, no modifications', function(t) { helper.search(); function searchTest(requests) { - t.equal( - requests.length, - 2, - 'the helper generates a two queries' - ); - t.deepEqual( - requests[0], - requests[1], - 'the helper generates the same query twice' - ); + expect(requests.length).toBe(2); + expect(requests[0]).toEqual(requests[1]); return new Promise(function() {}); } }); -test('[Derived helper] no derived helpers, modification', function(t) { - t.plan(4); +test('[Derived helper] no derived helpers, modification', function() { + expect.assertions(4); var client = { search: searchTest }; @@ -58,22 +44,14 @@ test('[Derived helper] no derived helpers, modification', function(t) { helper.search(); function searchTest(requests) { - t.equal( - requests.length, - 2, - 'the helper generates a two queries' - ); - t.equal(requests[0].params.query, '', 'the first query is empty'); - t.equal(requests[1].params.query, 'otherQuery', 'the other query contains `otherQuery`'); + expect(requests.length).toBe(2); + expect(requests[0].params.query).toBe(''); + expect(requests[1].params.query).toBe('otherQuery'); delete requests[0].params.query; delete requests[1].params.query; - t.deepEqual( - requests[0], - requests[1], - 'Without the query the other parameters are identical' - ); + expect(requests[0]).toEqual(requests[1]); return new Promise(function() {}); } diff --git a/test/spec/algoliasearch.helper/distinct.js b/test/spec/algoliasearch.helper/distinct.js index 3a37b53e6..88ad8227f 100644 --- a/test/spec/algoliasearch.helper/distinct.js +++ b/test/spec/algoliasearch.helper/distinct.js @@ -1,6 +1,5 @@ 'use strict'; -var test = require('tape'); var forEach = require('lodash/forEach'); var algoliasearchHelper = require('../../../index.js'); @@ -8,7 +7,7 @@ var requestBuilder = require('../../../src/requestBuilder'); var fakeClient = {}; -test('Distinct not set', function(t) { +test('Distinct not set', function() { var helper = algoliasearchHelper(fakeClient, null, { facets: ['facetConj'], disjunctiveFacets: ['facet'] @@ -16,54 +15,52 @@ test('Distinct not set', function(t) { var state0 = helper.state; var disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, undefined, '[disjunctive] distinct should be undefined'); + expect(disjunctiveFacetSearchParam.distinct).toBe(undefined); var facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, undefined, '[hits] distinct should be undefined'); + expect(facetSearchParam.distinct).toBe(undefined); helper.setState(state0); helper.setQuery('not empty'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, undefined, '[disjunctive][query not empty] distinct should be undefined'); + expect(disjunctiveFacetSearchParam.distinct).toBe(undefined); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, undefined, '[hits][query not empty] distinct should be undefined'); + expect(facetSearchParam.distinct).toBe(undefined); forEach(requestBuilder._getQueries('', helper.state), function(q) { - t.notOk(q.hasOwnProperty('distinct'), '[hits][query not empty] no distinct should be in the queries by default'); + expect(q.hasOwnProperty('distinct')).toBeFalsy(); }); helper.setState(state0); helper.addDisjunctiveRefine('facet', 'value'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, undefined, '[disjunctive][disjunctive refinement] distinct should be undefined'); + expect(disjunctiveFacetSearchParam.distinct).toBe(undefined); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, undefined, '[hits][disjunctive refinement] distinct should be undefined'); + expect(facetSearchParam.distinct).toBe(undefined); forEach(requestBuilder._getQueries('', helper.state), function(q) { - t.notOk(q.hasOwnProperty('distinct'), '[hits][disjunctive refinement] no distinct should be in the queries by default'); + expect(q.hasOwnProperty('distinct')).toBeFalsy(); }); helper.setState(state0); helper.addRefine('facetConj', 'value'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, undefined, '[disjunctive][conjunctive refinement] distinct should be undefined'); + expect(disjunctiveFacetSearchParam.distinct).toBe(undefined); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, undefined, '[hits][conjunctive refinement] distinct should be undefined'); + expect(facetSearchParam.distinct).toBe(undefined); forEach(requestBuilder._getQueries('', helper.state), function(q) { - t.notOk(q.hasOwnProperty('distinct'), '[disjunctive][conjunctive refinement] no distinct should be in the queries by default'); + expect(q.hasOwnProperty('distinct')).toBeFalsy(); }); helper.setState(state0); helper.addNumericRefinement('attribute', '>', '0'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, undefined, '[disjunctive][numeric refinement] distinct should be undefined'); + expect(disjunctiveFacetSearchParam.distinct).toBe(undefined); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, undefined, '[hits][numeric refinement] distinct should be undefined'); + expect(facetSearchParam.distinct).toBe(undefined); forEach(requestBuilder._getQueries('', helper.state), function(q) { - t.notOk(q.hasOwnProperty('distinct'), 'no distinct should be in the queries by default'); + expect(q.hasOwnProperty('distinct')).toBeFalsy(); }); - - t.end(); }); -test('Distinct set to true', function(t) { +test('Distinct set to true', function() { var helper = algoliasearchHelper(fakeClient, null, { facets: ['facetConj'], disjunctiveFacets: ['facet'] @@ -72,44 +69,42 @@ test('Distinct set to true', function(t) { var disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, true, '[disjunctive] distinct should be true'); + expect(disjunctiveFacetSearchParam.distinct).toBe(true); var facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, true, '[hits] distinct should be true'); + expect(facetSearchParam.distinct).toBe(true); helper.setState(state0); helper.setQuery('not empty'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, true, '[disjunctive][query not empty] distinct should be true'); + expect(disjunctiveFacetSearchParam.distinct).toBe(true); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, true, '[hits][query not empty] distinct should be true'); + expect(facetSearchParam.distinct).toBe(true); helper.setState(state0); helper.addDisjunctiveRefine('facet', 'value'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, true, '[disjunctive][disjunctive refinement] distinct should be true'); + expect(disjunctiveFacetSearchParam.distinct).toBe(true); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, true, '[hits][disjunctive refinement] distinct should be true'); + expect(facetSearchParam.distinct).toBe(true); helper.setState(state0); helper.addRefine('facetConj', 'value'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, true, '[disjunctive][conjunctive refinement] distinct should be true'); + expect(disjunctiveFacetSearchParam.distinct).toBe(true); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, true, '[hits][conjunctive refinement] distinct should be true'); + expect(facetSearchParam.distinct).toBe(true); helper.setState(state0); helper.addNumericRefinement('attribute', '>', '0'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, true, '[disjunctive][numeric refinement] distinct should be true'); + expect(disjunctiveFacetSearchParam.distinct).toBe(true); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, true, '[hits][numeric refinement] distinct should be true'); - - t.end(); + expect(facetSearchParam.distinct).toBe(true); }); -test('Distinct to false', function(t) { +test('Distinct to false', function() { var helper = algoliasearchHelper(fakeClient, null, { facets: ['facetConj'], disjunctiveFacets: ['facet'] @@ -118,44 +113,42 @@ test('Distinct to false', function(t) { var disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, false, '[disjunctive] distinct should be false'); + expect(disjunctiveFacetSearchParam.distinct).toBe(false); var facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, false, '[hits] distinct should be false'); + expect(facetSearchParam.distinct).toBe(false); helper.setState(state0); helper.setQuery('not empty'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, false, '[disjunctive][query not empty] distinct should be false'); + expect(disjunctiveFacetSearchParam.distinct).toBe(false); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, false, '[hits][query not empty] distinct should be false'); + expect(facetSearchParam.distinct).toBe(false); helper.setState(state0); helper.addDisjunctiveRefine('facet', 'value'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, false, '[disjunctive][disjunctive refinement] distinct should be false'); + expect(disjunctiveFacetSearchParam.distinct).toBe(false); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, false, '[hits][disjunctive refinement] distinct should be false'); + expect(facetSearchParam.distinct).toBe(false); helper.setState(state0); helper.addRefine('facetConj', 'value'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, false, '[disjunctive][conjunctive refinement] distinct should be false'); + expect(disjunctiveFacetSearchParam.distinct).toBe(false); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, false, '[hits][conjunctive refinement] distinct should be false'); + expect(facetSearchParam.distinct).toBe(false); helper.setState(state0); helper.addNumericRefinement('attribute', '>', '0'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, false, '[disjunctive][numeric refinement] distinct should be false'); + expect(disjunctiveFacetSearchParam.distinct).toBe(false); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, false, '[hits][numeric refinement] distinct should be false'); - - t.end(); + expect(facetSearchParam.distinct).toBe(false); }); -test('Distinct as a number', function(t) { +test('Distinct as a number', function() { var distinctValue = 2; var helper = algoliasearchHelper(fakeClient, null, { facets: ['facetConj'], @@ -165,38 +158,36 @@ test('Distinct as a number', function(t) { var state0 = helper.state; var disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, distinctValue, '[disjunctive] distinct should be ' + distinctValue); + expect(disjunctiveFacetSearchParam.distinct).toBe(distinctValue); var facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, distinctValue, '[hits] distinct should be ' + distinctValue); + expect(facetSearchParam.distinct).toBe(distinctValue); helper.setState(state0); helper.setQuery('not empty'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, distinctValue, '[disjunctive][query not empty] distinct should be ' + distinctValue); + expect(disjunctiveFacetSearchParam.distinct).toBe(distinctValue); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, distinctValue, '[hits][query not empty] distinct should be ' + distinctValue); + expect(facetSearchParam.distinct).toBe(distinctValue); helper.setState(state0); helper.addDisjunctiveRefine('facet', 'value'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, distinctValue, '[disjunctive][disjunctive refinement] distinct should be ' + distinctValue); + expect(disjunctiveFacetSearchParam.distinct).toBe(distinctValue); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, distinctValue, '[hits][disjunctive refinement] distinct should be ' + distinctValue); + expect(facetSearchParam.distinct).toBe(distinctValue); helper.setState(state0); helper.addRefine('facetConj', 'value'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, distinctValue, '[disjunctive][conjunctive refinement] distinct should be ' + distinctValue); + expect(disjunctiveFacetSearchParam.distinct).toBe(distinctValue); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, distinctValue, '[hits][conjunctive refinement] distinct should be ' + distinctValue); + expect(facetSearchParam.distinct).toBe(distinctValue); helper.setState(state0); helper.addNumericRefinement('attribute', '>', '0'); disjunctiveFacetSearchParam = requestBuilder._getDisjunctiveFacetSearchParams(helper.state); - t.equal(disjunctiveFacetSearchParam.distinct, distinctValue, '[disjunctive][numeric refinement] distinct should be ' + distinctValue); + expect(disjunctiveFacetSearchParam.distinct).toBe(distinctValue); facetSearchParam = requestBuilder._getHitsSearchParams(helper.state); - t.equal(facetSearchParam.distinct, distinctValue, '[hits][numeric refinement] distinct should be ' + distinctValue); - - t.end(); + expect(facetSearchParam.distinct).toBe(distinctValue); }); diff --git a/test/spec/algoliasearch.helper/events.js b/test/spec/algoliasearch.helper/events.js index af35c4c4e..e7c58c343 100644 --- a/test/spec/algoliasearch.helper/events.js +++ b/test/spec/algoliasearch.helper/events.js @@ -1,12 +1,20 @@ 'use strict'; -var test = require('tape'); -var sinon = require('sinon'); var algoliaSearchHelper = require('../../../index'); -var fakeClient = {}; +function makeFakeClient() { + return { + search: jest.fn(function() { + return new Promise(function() {}); + }), + searchForFacetValues: jest.fn(function() { + return new Promise(function() {}); + }) + }; +} -test('Change events should be emitted as soon as the state change, but search should be triggered (refactored)', function(t) { +test('Change events should be emitted as soon as the state change, but search should be triggered (refactored)', function() { + var fakeClient = makeFakeClient(); var helper = algoliaSearchHelper(fakeClient, 'Index', { disjunctiveFacets: ['city'], disjunctiveFacetsRefinements: {city: ['Paris']}, @@ -25,48 +33,45 @@ test('Change events should be emitted as soon as the state change, but search sh changeEventCount++; }); - var stubbedSearch = sinon.stub(helper, '_search'); - helper.setQuery('a'); - t.equal(changeEventCount, 1, 'query - change'); - t.equal(stubbedSearch.callCount, 0, 'query - search'); + expect(changeEventCount).toBe(1); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.clearRefinements(); - t.equal(changeEventCount, 2, 'clearRefinements - change'); - t.equal(stubbedSearch.callCount, 0, 'clearRefinements - search'); + expect(changeEventCount).toBe(2); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.addDisjunctiveRefine('city', 'Paris'); - t.equal(changeEventCount, 3, 'addDisjunctiveRefine - change'); - t.equal(stubbedSearch.callCount, 0, 'addDisjunctiveRefine - search'); + expect(changeEventCount).toBe(3); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.removeDisjunctiveRefine('city', 'Paris'); - t.equal(changeEventCount, 4, 'removeDisjunctiveRefine - change'); - t.equal(stubbedSearch.callCount, 0, 'removeDisjunctiveRefine - search'); + expect(changeEventCount).toBe(4); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.addExclude('tower', 'Empire State Building'); - t.equal(changeEventCount, 5, 'addExclude - change'); - t.equal(stubbedSearch.callCount, 0, 'addExclude - search'); + expect(changeEventCount).toBe(5); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.removeExclude('tower', 'Empire State Building'); - t.equal(changeEventCount, 6, 'removeExclude - change'); - t.equal(stubbedSearch.callCount, 0, 'removeExclude - search'); + expect(changeEventCount).toBe(6); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.addRefine('tower', 'Empire State Building'); - t.equal(changeEventCount, 7, 'addRefine - change'); - t.equal(stubbedSearch.callCount, 0, 'addRefine - search'); + expect(changeEventCount).toBe(7); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.removeRefine('tower', 'Empire State Building'); - t.equal(changeEventCount, 8, 'removeRefine - change'); - t.equal(stubbedSearch.callCount, 0, 'removeRefine - search'); + expect(changeEventCount).toBe(8); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.search(); - t.equal(changeEventCount, 8, "final search doesn't call the change"); - t.equal(stubbedSearch.callCount, 1, 'final search triggers the search'); - - t.end(); + expect(changeEventCount).toBe(8); + expect(fakeClient.search).toHaveBeenCalledTimes(1); }); -test('Change events should only be emitted for meaningful changes', function(t) { +test('Change events should only be emitted for meaningful changes', function() { + var fakeClient = makeFakeClient(); var helper = algoliaSearchHelper(fakeClient, 'Index', { query: 'a', disjunctiveFacets: ['city'], @@ -89,63 +94,55 @@ test('Change events should only be emitted for meaningful changes', function(t) changeEventCount++; }); - var stubbedSearch = sinon.stub(helper, '_search'); - helper.setQuery('a'); - t.equal(changeEventCount, 0, 'search'); - t.equal(stubbedSearch.callCount, 0, 'search'); + expect(changeEventCount).toBe(0); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.addDisjunctiveRefine('city', 'Paris'); - t.equal(changeEventCount, 0, 'addDisjunctiveRefine'); - t.equal(stubbedSearch.callCount, 0, 'addDisjunctiveRefine'); + expect(changeEventCount).toBe(0); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.addExclude('tower', 'Empire State Building'); - t.equal(changeEventCount, 0, 'addExclude'); - t.equal(stubbedSearch.callCount, 0, 'addExclude'); + expect(changeEventCount).toBe(0); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.addRefine('tower', 'Empire State Building'); - t.equal(changeEventCount, 0, 'addRefine'); - t.equal(stubbedSearch.callCount, 0, 'addRefine'); + expect(changeEventCount).toBe(0); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.addNumericRefinement('price', '>', 300); - t.equal(changeEventCount, 0, 'addNumericRefinement'); - t.equal(stubbedSearch.callCount, 0, 'addNumericRefinement'); + expect(changeEventCount).toBe(0); + expect(fakeClient.search).toHaveBeenCalledTimes(0); // This is an actual change helper.clearRefinements(); - t.equal(changeEventCount, 1, 'clearRefinements'); - t.equal(stubbedSearch.callCount, 0, 'clearRefinements'); + expect(changeEventCount).toBe(1); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.clearRefinements(); - t.equal(changeEventCount, 1, 'clearRefinements'); - t.equal(stubbedSearch.callCount, 0, 'clearRefinements'); + expect(changeEventCount).toBe(1); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.removeDisjunctiveRefine('city', 'Paris'); - t.equal(changeEventCount, 1, 'removeDisjunctiveRefine'); - t.equal(stubbedSearch.callCount, 0, 'removeDisjunctiveRefine'); + expect(changeEventCount).toBe(1); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.removeExclude('tower', 'Empire State Building'); - t.equal(changeEventCount, 1, 'removeExclude'); - t.equal(stubbedSearch.callCount, 0, 'removeExclude'); + expect(changeEventCount).toBe(1); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.removeRefine('tower', 'Empire State Building'); - t.equal(changeEventCount, 1, 'removeRefine'); - t.equal(stubbedSearch.callCount, 0, 'removeRefine'); + expect(changeEventCount).toBe(1); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.search(); - t.equal(changeEventCount, 1, "final search doesn't call the change"); - t.equal(stubbedSearch.callCount, 1, 'final search triggers the search'); - - t.end(); + expect(changeEventCount).toBe(1); + expect(fakeClient.search).toHaveBeenCalledTimes(1); }); -test('search event should be emitted once when the search is triggered and before the request is sent', function(t) { - var clientMock = { - search: function() { - return new Promise(function() {}); - } - }; - var helper = algoliaSearchHelper(clientMock, 'Index', { +test('search event should be emitted once when the search is triggered and before the request is sent', function() { + var fakeClient = makeFakeClient(); + var helper = algoliaSearchHelper(fakeClient, 'Index', { disjunctiveFacets: ['city'], facets: ['tower'] }); @@ -156,49 +153,46 @@ test('search event should be emitted once when the search is triggered and befor count++; }); - clientMock.search = function() { - t.equal( - count, - 1, - 'When the client search function is called the search' + - ' event should have been sent exactly once.'); - - return new Promise(function() {}); - }; - helper.setQuery(''); - t.equal(count, 0, 'search'); + expect(count).toBe(0); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.clearRefinements(); - t.equal(count, 0, 'clearRefinements'); + expect(count).toBe(0); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.addDisjunctiveRefine('city', 'Paris'); - t.equal(count, 0, 'addDisjunctiveRefine'); + expect(count).toBe(0); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.removeDisjunctiveRefine('city', 'Paris'); - t.equal(count, 0, 'removeDisjunctiveRefine'); + expect(count).toBe(0); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.addExclude('tower', 'Empire State Building'); - t.equal(count, 0, 'addExclude'); + expect(count).toBe(0); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.removeExclude('tower', 'Empire State Building'); - t.equal(count, 0, 'removeExclude'); + expect(count).toBe(0); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.addRefine('tower', 'Empire State Building'); - t.equal(count, 0, 'addRefine'); + expect(count).toBe(0); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.removeRefine('tower', 'Empire State Building'); - t.equal(count, 0, 'removeRefine'); + expect(count).toBe(0); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.search(); - t.equal(count, 1, 'final search does trigger the search event'); - - t.end(); + expect(count).toBe(1); + expect(fakeClient.search).toHaveBeenCalledTimes(1); }); -test('searchOnce event should be emitted once when the search is triggered using searchOnce and before the request is sent', function(t) { - var clientMock = {}; - var helper = algoliaSearchHelper(clientMock, 'Index', { +test('searchOnce event should be emitted once when the search is triggered using searchOnce and before the request is sent', function() { + var fakeClient = makeFakeClient(); + var helper = algoliaSearchHelper(fakeClient, 'Index', { disjunctiveFacets: ['city'], facets: ['tower'] }); @@ -209,28 +203,18 @@ test('searchOnce event should be emitted once when the search is triggered using count++; }); - clientMock.search = function() { - t.equal( - count, - 1, - 'When the client search function is called the searchOnce' + - ' event should have been sent exactly once.'); - - return new Promise(function() {}); - }; - - t.equal(count, 0, 'before search'); + expect(count).toBe(0); + expect(fakeClient.search).toHaveBeenCalledTimes(0); helper.searchOnce({}, function() {}); - t.equal(count, 1, 'final search does trigger the search event'); - - t.end(); + expect(count).toBe(1); + expect(fakeClient.search).toHaveBeenCalledTimes(1); }); test('searchForFacetValues event should be emitted once when the search is triggered using' + - ' searchForFacetValues and before the request is sent', function(t) { - var clientMock = {}; - var helper = algoliaSearchHelper(clientMock, 'Index', { + ' searchForFacetValues and before the request is sent', function() { + var fakeClient = makeFakeClient(); + var helper = algoliaSearchHelper(fakeClient, 'Index', { disjunctiveFacets: ['city'], facets: ['tower'] }); @@ -241,24 +225,10 @@ test('searchForFacetValues event should be emitted once when the search is trigg count++; }); - clientMock.initIndex = function() { - return { - searchForFacetValues: function() { - t.equal( - count, - 1, - 'When the client search function is called the searchOnce' + - ' event should have been sent exactly once.'); - - return new Promise(function() {}); - } - }; - }; - - t.equal(count, 0, 'before search'); + expect(count).toBe(0); + expect(fakeClient.searchForFacetValues).toHaveBeenCalledTimes(0); helper.searchForFacetValues(); - t.equal(count, 1, 'final search does trigger the search event'); - - t.end(); + expect(count).toBe(1); + expect(fakeClient.searchForFacetValues).toHaveBeenCalledTimes(1); }); diff --git a/test/spec/algoliasearch.helper/excludes.js b/test/spec/algoliasearch.helper/excludes.js index b7cdff558..1e66c4470 100644 --- a/test/spec/algoliasearch.helper/excludes.js +++ b/test/spec/algoliasearch.helper/excludes.js @@ -1,11 +1,10 @@ 'use strict'; -var test = require('tape'); var algoliasearchHelper = require('../../../index'); var fakeClient = {}; -test('addExclude should add an exclusion', function(t) { +test('addExclude should add an exclusion', function() { var helper = algoliasearchHelper(fakeClient, null, { facets: ['facet'] }); @@ -15,15 +14,13 @@ test('addExclude should add an exclusion', function(t) { var facetName = 'facet'; var facetValueToExclude = 'brand'; - t.notOk(helper.state.facetsExcludes[facetName], 'initialy empty'); + expect(helper.state.facetsExcludes[facetName]).toBeFalsy(); helper.addExclude(facetName, facetValueToExclude); - t.ok(helper.state.facetsExcludes[facetName], 'not empty'); - t.ok(helper.state.facetsExcludes[facetName][0] === facetValueToExclude, 'with the correct value'); - - t.end(); + expect(helper.state.facetsExcludes[facetName]).toBeTruthy(); + expect(helper.state.facetsExcludes[facetName][0] === facetValueToExclude).toBeTruthy(); }); -test('removeExclude should remove an exclusion', function(t) { +test('removeExclude should remove an exclusion', function(done) { var helper = algoliasearchHelper(fakeClient, null, { facets: ['facet'] }); @@ -34,20 +31,20 @@ test('removeExclude should remove an exclusion', function(t) { var facetValueToExclude = 'brand'; helper.addExclude(facetName, facetValueToExclude); - t.ok(helper.state.facetsExcludes[facetName].length === 1, 'not empty at first'); + expect(helper.state.facetsExcludes[facetName].length === 1).toBeTruthy(); helper.removeExclude(facetName, facetValueToExclude); - t.ok(!helper.state.facetsExcludes[facetName], 'then empty'); + expect(!helper.state.facetsExcludes[facetName]).toBeTruthy(); try { helper.removeExclude(facetName, facetValueToExclude); } catch (e) { - t.fail('Removing unset exclusions should be ok...'); + done.fail('Removing unset exclusions should be ok...'); } - t.end(); + done(); }); -test('isExcluded should allow to omit the value', function(t) { +test('isExcluded should allow to omit the value', function() { var facetName = 'foo'; var facetValueToExclude = 'brand'; var facetValueNotExcluded = 'bar'; @@ -56,20 +53,16 @@ test('isExcluded should allow to omit the value', function(t) { facets: [facetName] }); - t.notOk(helper.isExcluded(facetName, facetValueToExclude), 'before, the value to exclude is not excluded'); - t.notOk(helper.isExcluded(facetName, facetValueNotExcluded), - 'before, the value to exclude is not excluded'); - t.notOk(helper.isExcluded(facetName), 'before, no facet for the attribute'); + expect(helper.isExcluded(facetName, facetValueToExclude)).toBeFalsy(); + expect(helper.isExcluded(facetName, facetValueNotExcluded)).toBeFalsy(); + expect(helper.isExcluded(facetName)).toBeFalsy(); helper.addExclude(facetName, facetValueToExclude); - t.ok(helper.isExcluded(facetName, facetValueToExclude), 'after, the value to exclude is excluded'); - t.notOk(helper.isExcluded(facetName, facetValueNotExcluded), - 'after, the value not to excluded is not excluded'); - t.ok(helper.isExcluded(facetName), 'after, the attribute contains exclusions'); - - t.end(); + expect(helper.isExcluded(facetName, facetValueToExclude)).toBeTruthy(); + expect(helper.isExcluded(facetName, facetValueNotExcluded)).toBeFalsy(); + expect(helper.isExcluded(facetName)).toBeTruthy(); }); -test('isExcluded should report exclusion correctly', function(t) { +test('isExcluded should report exclusion correctly', function() { var helper = algoliasearchHelper(fakeClient, null, { facets: ['facet'] }); @@ -79,11 +72,9 @@ test('isExcluded should report exclusion correctly', function(t) { var facetName = 'facet'; var facetValueToExclude = 'brand'; - t.notOk(helper.isExcluded(facetName, facetValueToExclude), 'value not excluded at first'); + expect(helper.isExcluded(facetName, facetValueToExclude)).toBeFalsy(); helper.addExclude(facetName, facetValueToExclude); - t.ok(helper.isExcluded(facetName, facetValueToExclude), 'value is excluded'); + expect(helper.isExcluded(facetName, facetValueToExclude)).toBeTruthy(); helper.removeExclude(facetName, facetValueToExclude); - t.notOk(helper.isExcluded(facetName, facetValueToExclude), 'value is not excluded anymore'); - - t.end(); + expect(helper.isExcluded(facetName, facetValueToExclude)).toBeFalsy(); }); diff --git a/test/spec/algoliasearch.helper/facetFilters.js b/test/spec/algoliasearch.helper/facetFilters.js index 26eb96017..5fc72fb31 100644 --- a/test/spec/algoliasearch.helper/facetFilters.js +++ b/test/spec/algoliasearch.helper/facetFilters.js @@ -1,41 +1,25 @@ 'use strict'; -// Make sure we do facet filters correctly before sending them to algolia - - -var test = require('tape'); var algoliasearchHelper = require('../../../index'); var requestBuilder = require('../../../src/requestBuilder'); var fakeClient = {}; test('The filters should contain the different filters for a single conjunctive facet with multiple refinements', - function(t) { + function() { var facetName = 'myFacet'; var helper = algoliasearchHelper(fakeClient, '', { facets: [facetName] }); helper.addRefine(facetName, 'value1'); - t.deepEqual(requestBuilder._getFacetFilters(helper.state), - [facetName + ':value1'], - 'One value: one filter'); + expect(requestBuilder._getFacetFilters(helper.state)).toEqual([facetName + ':value1']); helper.addRefine(facetName, 'value2'); - t.deepEqual(requestBuilder._getFacetFilters(helper.state), - [facetName + ':value1', facetName + ':value2'], - 'Two values: two filters'); + expect(requestBuilder._getFacetFilters(helper.state)).toEqual([facetName + ':value1', facetName + ':value2']); helper.toggleRefine(facetName, 'value3'); - t.deepEqual(requestBuilder._getFacetFilters(helper.state), - [facetName + ':value1', facetName + ':value2', facetName + ':value3'], - 'Three values: three filters'); + expect(requestBuilder._getFacetFilters(helper.state)).toEqual([facetName + ':value1', facetName + ':value2', facetName + ':value3']); helper.removeRefine(facetName, 'value3'); - t.deepEqual(requestBuilder._getFacetFilters(helper.state), - [facetName + ':value1', facetName + ':value2'], - 'Three values: three filters'); + expect(requestBuilder._getFacetFilters(helper.state)).toEqual([facetName + ':value1', facetName + ':value2']); helper.addRefine(facetName, 'value1'); - t.deepEqual(requestBuilder._getFacetFilters(helper.state), - [facetName + ':value1', facetName + ':value2'], - 'Add multiple times the same parameter: only two parameters'); - - t.end(); + expect(requestBuilder._getFacetFilters(helper.state)).toEqual([facetName + ':value1', facetName + ':value2']); }); diff --git a/test/spec/algoliasearch.helper/getNumericRefinement.js b/test/spec/algoliasearch.helper/getNumericRefinement.js index d686414c1..5f996fe89 100644 --- a/test/spec/algoliasearch.helper/getNumericRefinement.js +++ b/test/spec/algoliasearch.helper/getNumericRefinement.js @@ -1,27 +1,22 @@ 'use strict'; -var test = require('tape'); var algoliaSearchHelper = require('../../../index.js'); var fakeClient = {}; -test('getNumericRefinement with single value addNumericRefinement', function(t) { +test('getNumericRefinement with single value addNumericRefinement', function() { var helper = algoliaSearchHelper(fakeClient, null); helper.addNumericRefinement('attribute', '=', 0); helper.addNumericRefinement('attribute', '=', 34); - t.deepEqual(helper.getNumericRefinement('attribute', '='), [0, 34]); - - t.end(); + expect(helper.getNumericRefinement('attribute', '=')).toEqual([0, 34]); }); -test('getNumericRefinement with multiple values addNumericRefinement', function(t) { +test('getNumericRefinement with multiple values addNumericRefinement', function() { var helper = algoliaSearchHelper(fakeClient, null); helper.addNumericRefinement('attribute', '=', [0, 34]); - t.deepEqual(helper.getNumericRefinement('attribute', '='), [[0, 34]]); - - t.end(); + expect(helper.getNumericRefinement('attribute', '=')).toEqual([[0, 34]]); }); diff --git a/test/spec/algoliasearch.helper/getQuery.js b/test/spec/algoliasearch.helper/getQuery.js index 4fcc639af..a1b2c757f 100644 --- a/test/spec/algoliasearch.helper/getQuery.js +++ b/test/spec/algoliasearch.helper/getQuery.js @@ -1,11 +1,10 @@ 'use strict'; -var test = require('tape'); var algoliaSearchHelper = require('../../../index.js'); var fakeClient = {}; -test('getQuery', function(t) { +test('getQuery', function() { var helper = algoliaSearchHelper(fakeClient, 'IndexName', { disjunctiveFacets: ['df1', 'df2', 'df3'], disjunctiveFacetsRefinements: { @@ -21,7 +20,7 @@ test('getQuery', function(t) { ignorePlurals: true }); - t.deepEqual(helper.getQuery(), { + expect(helper.getQuery()).toEqual({ query: '', page: 0, minWordSizefor1Typo: 8, @@ -35,6 +34,4 @@ test('getQuery', function(t) { ['df2:DF2-VAL-1', 'df2:DF2-VAL-2'] ] }); - - t.end(); }); diff --git a/test/spec/algoliasearch.helper/getQueryParameter.js b/test/spec/algoliasearch.helper/getQueryParameter.js index 2ff89357f..0bb216a15 100644 --- a/test/spec/algoliasearch.helper/getQueryParameter.js +++ b/test/spec/algoliasearch.helper/getQueryParameter.js @@ -1,11 +1,10 @@ 'use strict'; -var test = require('tape'); var algoliaSearchHelper = require('../../../index.js'); var fakeClient = {}; -test('getQueryParameter', function(t) { +test('getQueryParameter', function() { var bind = require('lodash/bind'); var helper = algoliaSearchHelper(fakeClient, null, { @@ -14,11 +13,9 @@ test('getQueryParameter', function(t) { ignorePlurals: true }); - t.deepEqual(helper.getQueryParameter('facets'), ['facet1']); - t.equal(helper.getQueryParameter('minWordSizefor1Typo'), 8); - t.equal(helper.getQueryParameter('ignorePlurals'), true); + expect(helper.getQueryParameter('facets')).toEqual(['facet1']); + expect(helper.getQueryParameter('minWordSizefor1Typo')).toBe(8); + expect(helper.getQueryParameter('ignorePlurals')).toBe(true); - t.throws(bind(helper.getQueryParameter, helper, 'unknown')); - - t.end(); + expect(bind(helper.getQueryParameter, helper, 'unknown')).toThrow(); }); diff --git a/test/spec/algoliasearch.helper/getStateAsQueryString.js b/test/spec/algoliasearch.helper/getStateAsQueryString.js index 98ff17a08..6ba6a2b1e 100644 --- a/test/spec/algoliasearch.helper/getStateAsQueryString.js +++ b/test/spec/algoliasearch.helper/getStateAsQueryString.js @@ -1,11 +1,10 @@ 'use strict'; -var test = require('tape'); var algoliaSearchHelper = require('../../../index.js'); var fakeClient = {}; -test('getStateAsQueryString', function(t) { +test('getStateAsQueryString', function() { var helper = algoliaSearchHelper(fakeClient, 'fake index', { facets: ['color'], hierarchicalFacets: [{ @@ -16,15 +15,12 @@ test('getStateAsQueryString', function(t) { helper.setQuery('hello mama'); helper.toggleRefine('color', 'white'); helper.toggleRefine('products', 'fruits > bananas'); - t.equal( - helper.getStateAsQueryString(), + expect(helper.getStateAsQueryString()).toBe( 'q=hello%20mama&fR[color][0]=white&hFR[products][0]=fruits%20%3E%20bananas' ); - - t.end(); }); -test('getStateAsQueryString({safe: true})', function(t) { +test('getStateAsQueryString({safe: true})', function() { var helper = algoliaSearchHelper(fakeClient, 'fake index', { facets: ['color'], hierarchicalFacets: [{ @@ -35,10 +31,7 @@ test('getStateAsQueryString({safe: true})', function(t) { helper.setQuery('hello mama'); helper.toggleRefine('color', 'white'); helper.toggleRefine('products', 'fruits > bananas'); - t.equal( - helper.getStateAsQueryString({safe: true}), + expect(helper.getStateAsQueryString({safe: true})).toBe( 'q=hello%20mama&fR%5Bcolor%5D%5B0%5D=white&hFR%5Bproducts%5D%5B0%5D=fruits%20%3E%20bananas' ); - - t.end(); }); diff --git a/test/spec/algoliasearch.helper/hasRefinements.js b/test/spec/algoliasearch.helper/hasRefinements.js index 96555f89c..7c0f1676b 100644 --- a/test/spec/algoliasearch.helper/hasRefinements.js +++ b/test/spec/algoliasearch.helper/hasRefinements.js @@ -1,104 +1,101 @@ 'use strict'; -var test = require('tape'); var algoliasearchHelper = require('../../../index'); var _ = require('lodash'); var fakeClient = {}; -test('helper.hasRefinements(attribute)', function(t) { - var helper; +test('undefined attribute', function() { + var helper = algoliasearchHelper(fakeClient, 'index'); + expect(_.partial(helper.hasRefinements, 'unknown')).toThrow(Error); +}); + +describe('numericRefinement', function() { + test('with refinement', function() { + var helper = algoliasearchHelper(fakeClient, 'index'); + + helper.addNumericRefinement('price', '=', 1337); - // cannot be tested since there's no way to know that a numeric refinement - // was once added then removed thus we always return false when not found - t.skip('undefined attribute', function(tt) { - setup(); - tt.throws(_.partial(helper.hasRefinements, 'unknown'), Error, 'it throws when unknown attribute'); - tt.end(); + expect(helper.hasRefinements('price')).toBe(true); }); - t.test('numericRefinement', function(tt) { - tt.test('with refinement', function(ttt) { - setup(); - helper.addNumericRefinement('price', '=', 1337); - ttt.equal(helper.hasRefinements('price'), true); - ttt.end(); - }); + test('without refinement', function() { + var helper = algoliasearchHelper(fakeClient, 'index'); - tt.test('without refinement', function(ttt) { - setup(); - helper.addNumericRefinement('price', '=', 1337); - helper.clearRefinements('price'); - ttt.equal(helper.hasRefinements('price'), false); - ttt.end(); - }); + helper.addNumericRefinement('price', '=', 1337); + helper.clearRefinements('price'); + + expect(helper.hasRefinements('price')).toBe(false); }); +}); - t.test('facet', function(tt) { - tt.test('with refinement', function(ttt) { - setup({ - facets: ['color'] - }); - helper.toggleFacetRefinement('color', 'red'); - ttt.equal(helper.hasRefinements('color'), true); - ttt.end(); +describe('facet', function() { + test('with refinement', function() { + var helper = algoliasearchHelper(fakeClient, 'index', { + facets: ['color'] }); - tt.test('without refinement', function(ttt) { - setup({ - facets: ['color'] - }); - ttt.equal(helper.hasRefinements('color'), false); - ttt.end(); + helper.toggleFacetRefinement('color', 'red'); + + expect(helper.hasRefinements('color')).toBe(true); + }); + + test('without refinement', function() { + var helper = algoliasearchHelper(fakeClient, 'index', { + facets: ['color'] }); + + expect(helper.hasRefinements('color')).toBe(false); }); +}); - t.test('disjunctiveFacet', function(tt) { - tt.test('with refinement', function(ttt) { - setup({ - disjunctiveFacets: ['author'] - }); - helper.toggleFacetRefinement('author', 'John Spartan'); - ttt.equal(helper.hasRefinements('author'), true); - ttt.end(); +describe('disjunctiveFacet', function() { + test('with refinement', function() { + var helper = algoliasearchHelper(fakeClient, 'index', { + disjunctiveFacets: ['author'] }); - tt.test('without refinement', function(ttt) { - setup({ - disjunctiveFacets: ['author'] - }); - ttt.equal(helper.hasRefinements('author'), false); - ttt.end(); + helper.toggleFacetRefinement('author', 'John Spartan'); + + expect(helper.hasRefinements('author')).toBe(true); + }); + + test('without refinement', function() { + var helper = algoliasearchHelper(fakeClient, 'index', { + disjunctiveFacets: ['author'] }); + + expect(helper.hasRefinements('author')).toBe(false); }); +}); - t.test('hierarchicalFacet', function(tt) { - tt.test('with refinement', function(ttt) { - setup({ - hierarchicalFacets: [{ +describe('hierarchicalFacet', function() { + test('with refinement', function() { + var helper = algoliasearchHelper(fakeClient, 'index', { + hierarchicalFacets: [ + { name: 'category', attributes: ['category.lvl0', 'category.lvl1'] - }] - }); - helper.toggleFacetRefinement('category', 'Action Movies > Max'); - ttt.equal(helper.hasRefinements('category'), true); - ttt.end(); + } + ] }); - tt.test('without refinement', function(ttt) { - setup({ - hierarchicalFacets: [{ + helper.toggleFacetRefinement('category', 'Action Movies > Max'); + + expect(helper.hasRefinements('category')).toBe(true); + }); + + test('without refinement', function() { + var helper = algoliasearchHelper(fakeClient, 'index', { + hierarchicalFacets: [ + { name: 'category', attributes: ['category.lvl0', 'category.lvl1'] - }] - }); - ttt.equal(helper.hasRefinements('category'), false); - ttt.end(); + } + ] }); - }); - function setup(params) { - helper = algoliasearchHelper(fakeClient, 'index', params); - } + expect(helper.hasRefinements('category')).toBe(false); + }); }); diff --git a/test/spec/algoliasearch.helper/incorrectFacetDefinition.js b/test/spec/algoliasearch.helper/incorrectFacetDefinition.js index b80e22aed..7ead46efd 100644 --- a/test/spec/algoliasearch.helper/incorrectFacetDefinition.js +++ b/test/spec/algoliasearch.helper/incorrectFacetDefinition.js @@ -1,38 +1,31 @@ 'use strict'; -var test = require('tape'); var algoliasearchHelper = require('../../../index'); var _ = require('lodash'); var fakeClient = {}; -test('Conjuctive facet should be declared to be refined', function(t) { +test('Conjunctive facet should be declared to be refined', function() { var h = algoliasearchHelper(fakeClient, '', {}); - t.throws(_.bind(h.addRefine, h, 'undeclaredFacet', 'value'), 'Adding a facet refinement should not be possible'); - t.throws(_.bind(h.removeRefine, h, 'undeclaredFacet', 'value'), 'Remove a facet refinement should not be possible'); - t.throws(_.bind(h.isRefined, h, 'undeclaredFacet', 'value'), 'Checking if a facet is refined should not be possible'); - - t.end(); + expect(_.bind(h.addRefine, h, 'undeclaredFacet', 'value')).toThrow(); + expect(_.bind(h.removeRefine, h, 'undeclaredFacet', 'value')).toThrow(); + expect(_.bind(h.isRefined, h, 'undeclaredFacet', 'value')).toThrow(); }); -test('Conjuctive facet should be declared to be excluded', function(t) { +test('Conjuctive facet should be declared to be excluded', function() { var h = algoliasearchHelper(fakeClient, '', {}); - t.throws(_.bind(h.addExclude, h, 'undeclaredFacet', 'value'), 'Adding a facet refinement should not be possible'); - t.throws(_.bind(h.removeExclude, h, 'undeclaredFacet', 'value'), 'Remove a facet refinement should not be possible'); - t.throws(_.bind(h.isExcluded, h, 'undeclaredFacet', 'value'), 'Checking if a facet is refined should not be possible'); - - t.end(); + expect(_.bind(h.addExclude, h, 'undeclaredFacet', 'value')).toThrow(); + expect(_.bind(h.removeExclude, h, 'undeclaredFacet', 'value')).toThrow(); + expect(_.bind(h.isExcluded, h, 'undeclaredFacet', 'value')).toThrow(); }); -test('Conjuctive facet should be declared to be refine', function(t) { +test('Conjuctive facet should be declared to be refine', function() { var h = algoliasearchHelper(fakeClient, '', {}); - t.throws(_.bind(h.addDisjunctiveRefine, h, 'undeclaredFacet', 'value'), 'Adding a facet refinement should not be possible'); - t.throws(_.bind(h.removeDisjunctiveRefine, h, 'undeclaredFacet', 'value'), 'Remove a facet refinement should not be possible'); - t.throws(_.bind(h.isRefined, h, 'undeclaredFacet', 'value'), 'Checking if a facet is refined should not be possible'); - - t.end(); + expect(_.bind(h.addDisjunctiveRefine, h, 'undeclaredFacet', 'value')).toThrow(); + expect(_.bind(h.removeDisjunctiveRefine, h, 'undeclaredFacet', 'value')).toThrow(); + expect(_.bind(h.isRefined, h, 'undeclaredFacet', 'value')).toThrow(); }); diff --git a/test/spec/algoliasearch.helper/numericFilters.js b/test/spec/algoliasearch.helper/numericFilters.js index e20246de7..81fc3a5f5 100644 --- a/test/spec/algoliasearch.helper/numericFilters.js +++ b/test/spec/algoliasearch.helper/numericFilters.js @@ -1,27 +1,26 @@ 'use strict'; -var test = require('tape'); var algoliaSearch = require('algoliasearch'); var algoliasearchHelper = require('../../../index'); var fakeClient = {}; -test('Numeric filters: numeric filters from constructor', function(t) { +test('Numeric filters: numeric filters from constructor', function(done) { var client = algoliaSearch('dsf', 'dsfdf'); client.search = function(queries) { var ps = queries[0].params; - t.deepEqual( - ps.numericFilters, - ['attribute1>3', - 'attribute1<=100', - 'attribute2=42', - 'attribute2=25', - 'attribute2=58', - ['attribute2=27', 'attribute2=70']], - 'Serialization of numerical filters'); - t.end(); + expect(ps.numericFilters).toEqual([ + 'attribute1>3', + 'attribute1<=100', + 'attribute2=42', + 'attribute2=25', + 'attribute2=58', + ['attribute2=27', 'attribute2=70'] + ]); + + done(); return new Promise(function() {}); }; @@ -41,22 +40,22 @@ test('Numeric filters: numeric filters from constructor', function(t) { helper.search(); }); -test('Numeric filters: numeric filters from setters', function(t) { +test('Numeric filters: numeric filters from setters', function(done) { var client = algoliaSearch('dsf', 'dsfdf'); client.search = function(queries) { var ps = queries[0].params; - t.deepEqual( - ps.numericFilters, - ['attribute1>3', - 'attribute1<=100', - 'attribute2=42', - 'attribute2=25', - 'attribute2=58', - ['attribute2=27', 'attribute2=70']], - 'Serialization of numerical filters'); - t.end(); + expect(ps.numericFilters).toEqual([ + 'attribute1>3', + 'attribute1<=100', + 'attribute2=42', + 'attribute2=25', + 'attribute2=58', + ['attribute2=27', 'attribute2=70'] + ]); + + done(); return new Promise(function() {}); }; @@ -73,82 +72,60 @@ test('Numeric filters: numeric filters from setters', function(t) { helper.search(); }); -test('Should be able to remove values one by one even 0s', function(t) { +test('Should be able to remove values one by one even 0s', function() { var helper = algoliasearchHelper(fakeClient, null, null); helper.addNumericRefinement('attribute', '>', 0); helper.addNumericRefinement('attribute', '>', 4); - t.deepEqual(helper.state.numericRefinements.attribute['>'], [0, 4], 'should be set to [0, 4] initially'); + expect(helper.state.numericRefinements.attribute['>']).toEqual([0, 4]); helper.removeNumericRefinement('attribute', '>', 0); - t.deepEqual(helper.state.numericRefinements.attribute['>'], [4], 'should be set to [ 4 ]'); + expect(helper.state.numericRefinements.attribute['>']).toEqual([4]); helper.removeNumericRefinement('attribute', '>', 4); - t.equal(helper.state.numericRefinements.attribute, undefined, 'should set to undefined'); - t.end(); + expect(helper.state.numericRefinements.attribute).toBe(undefined); }); test( 'Should remove all the numeric values for a single operator if remove is called with two arguments', - function(t) { + function() { var helper = algoliasearchHelper(fakeClient, null, null); helper.addNumericRefinement('attribute', '>', 0); helper.addNumericRefinement('attribute', '>', 4); helper.addNumericRefinement('attribute', '<', 4); - t.deepEqual( - helper.state.numericRefinements.attribute, - {'>': [0, 4], '<': [4]}, - 'should be set to {">": [0, 4], "<":[4]} initially'); + expect(helper.state.numericRefinements.attribute).toEqual({'>': [0, 4], '<': [4]}); helper.removeNumericRefinement('attribute', '>'); - t.equal(helper.state.numericRefinements.attribute['>'], undefined, 'should set to undefined'); - t.deepEqual( - helper.state.numericRefinements.attribute['<'], - [4], - 'the value of the other should be the same'); - - t.deepEqual( - helper.getRefinements('attribute'), - [{type: 'numeric', operator: '<', value: [4]}], - 'should have the same result with getRefinements'); - - t.end(); + expect(helper.state.numericRefinements.attribute['>']).toBe(undefined); + expect(helper.state.numericRefinements.attribute['<']).toEqual([4]); + + expect(helper.getRefinements('attribute')).toEqual([{type: 'numeric', operator: '<', value: [4]}]); } ); test( 'Should remove all the numeric values for an attribute if remove is called with one argument', - function(t) { + function() { var helper = algoliasearchHelper(fakeClient, null, null); helper.addNumericRefinement('attribute', '>', 0); helper.addNumericRefinement('attribute', '>', 4); helper.addNumericRefinement('attribute', '<', 4); - t.deepEqual( - helper.state.numericRefinements.attribute, - {'>': [0, 4], '<': [4]}, - 'should be set to {">": [0, 4], "<":[4]} initially'); + expect(helper.state.numericRefinements.attribute).toEqual({'>': [0, 4], '<': [4]}); helper.removeNumericRefinement('attribute'); - t.equal(helper.state.numericRefinements.attribute, undefined, 'should set to undefined'); + expect(helper.state.numericRefinements.attribute).toBe(undefined); - t.deepEqual( - helper.getRefinements('attribute'), - [], - 'should have the same result with getRefinements'); - - t.end(); + expect(helper.getRefinements('attribute')).toEqual([]); } ); -test('Should be able to get if an attribute has numeric filter with hasRefinements', function(t) { +test('Should be able to get if an attribute has numeric filter with hasRefinements', function() { var helper = algoliasearchHelper(fakeClient, null, null); - t.notOk(helper.hasRefinements('attribute'), 'not refined initially'); + expect(helper.hasRefinements('attribute')).toBeFalsy(); helper.addNumericRefinement('attribute', '=', 42); - t.ok(helper.hasRefinements('attribute'), 'should be refined'); - - t.end(); + expect(helper.hasRefinements('attribute')).toBeTruthy(); }); -test('Should be able to remove the value even if it was a string used as a number', function(t) { +test('Should be able to remove the value even if it was a string used as a number', function() { var attributeName = 'attr'; var n = '42'; @@ -156,30 +133,19 @@ test('Should be able to remove the value even if it was a string used as a numbe // add string - removes string helper.addNumericRefinement(attributeName, '=', n); - t.ok(helper.state.isNumericRefined(attributeName, '=', n), 'should contain the numeric refinement "= 42"'); + expect(helper.state.isNumericRefined(attributeName, '=', n)).toBeTruthy(); helper.removeNumericRefinement(attributeName, '=', n); - t.notOk( - helper.state.isNumericRefined(attributeName, '=', n), - 'should not contain the numeric refinement = 42' - ); + expect(helper.state.isNumericRefined(attributeName, '=', n)).toBeFalsy(); // add number - removes string helper.addNumericRefinement(attributeName, '=', 42); - t.ok(helper.state.isNumericRefined(attributeName, '=', 42), 'should contain the numeric refinement "= 42"'); + expect(helper.state.isNumericRefined(attributeName, '=', 42)).toBeTruthy(); helper.removeNumericRefinement(attributeName, '=', n); - t.notOk( - helper.state.isNumericRefined(attributeName, '=', 42), - 'should not contain the numeric refinement = 42' - ); + expect(helper.state.isNumericRefined(attributeName, '=', 42)).toBeFalsy(); // add string - removes number helper.addNumericRefinement(attributeName, '=', n); - t.ok(helper.state.isNumericRefined(attributeName, '=', n), 'should contain the numeric refinement "= 42"'); + expect(helper.state.isNumericRefined(attributeName, '=', n)).toBeTruthy(); helper.removeNumericRefinement(attributeName, '=', 42); - t.notOk( - helper.state.isNumericRefined(attributeName, '=', n), - 'should not contain the numeric refinement = 42' - ); - - t.end(); + expect(helper.state.isNumericRefined(attributeName, '=', n)).toBeFalsy(); }); diff --git a/test/spec/algoliasearch.helper/pages.js b/test/spec/algoliasearch.helper/pages.js index 71f4bc6d6..334c00e04 100644 --- a/test/spec/algoliasearch.helper/pages.js +++ b/test/spec/algoliasearch.helper/pages.js @@ -1,72 +1,68 @@ 'use strict'; -var test = require('tape'); var algoliasearchHelper = require('../../../index'); +var bind = require('lodash/bind'); + var fakeClient = {}; -test('setChange should change the current page', function(t) { +test('setChange should change the current page', function() { var helper = algoliasearchHelper(fakeClient, null, null); - t.ok(helper.getCurrentPage() === 0, 'First page should be 0'); + expect(helper.getCurrentPage() === 0).toBeTruthy(); helper.setCurrentPage(3); - t.ok(helper.getCurrentPage() === 3, 'If page was changed to 3, getCurrentPage should return 3'); - t.end(); + expect(helper.getCurrentPage() === 3).toBeTruthy(); }); -test('nextPage should increment the page by one', function(t) { +test('nextPage should increment the page by one', function() { var helper = algoliasearchHelper(fakeClient, null, null); - t.ok(helper.getCurrentPage() === 0, 'First page should be 0'); + expect(helper.getCurrentPage() === 0).toBeTruthy(); helper.nextPage(); helper.nextPage(); helper.nextPage(); - t.ok(helper.getCurrentPage() === 3, 'If page was increment 3 times, getCurrentPage should return 3'); - t.end(); + expect(helper.getCurrentPage() === 3).toBeTruthy(); }); -test('previousPage should decrement the current page by one', function(t) { +test('previousPage should decrement the current page by one', function() { var helper = algoliasearchHelper(fakeClient, null, null); - t.ok(helper.getCurrentPage() === 0, 'First page should be 0'); + expect(helper.getCurrentPage() === 0).toBeTruthy(); helper.setCurrentPage(3); - t.ok(helper.getCurrentPage() === 3, 'If page was changed to 3, getCurrentPage should return 3'); + expect(helper.getCurrentPage() === 3).toBeTruthy(); helper.previousPage(); - t.ok(helper.getCurrentPage() === 2, 'must be 2 now'); - t.end(); + expect(helper.getCurrentPage() === 2).toBeTruthy(); }); -test('pages should be reset if the mutation might change the number of pages', function(t) { - var bind = require('lodash/bind'); - +test('pages should be reset if the mutation might change the number of pages', function() { var helper = algoliasearchHelper(fakeClient, '', { facets: ['facet1', 'f2'], disjunctiveFacets: ['f1'] }); - function testMutation(tester, text, testFn) { - helper.setCurrentPage(10); - t.equal(helper.getCurrentPage(), 10, 'set the current page to 10' + text); - testFn(); - t.equal(helper.getCurrentPage(), 0, 'page resetted' + text); - } - - testMutation(t, ' clearRefinements', bind(helper.clearRefinements, helper)); - testMutation(t, ' setQuery', bind(helper.setQuery, helper, 'query')); - testMutation(t, ' addNumericRefinement', bind(helper.addNumericRefinement, helper, 'facet', '>', '2')); - testMutation(t, ' removeNumericRefinement', bind(helper.removeNumericRefinement, helper, 'facet', '>')); + [ + ['clearRefinements', bind(helper.clearRefinements, helper)], + ['setQuery', bind(helper.setQuery, helper, 'query')], + ['addNumericRefinement', bind(helper.addNumericRefinement, helper, 'facet', '>', '2')], + ['removeNumericRefinement', bind(helper.removeNumericRefinement, helper, 'facet', '>')], - testMutation(t, ' addExclude', bind(helper.addExclude, helper, 'facet1', 'val2')); - testMutation(t, ' removeExclude', bind(helper.removeExclude, helper, 'facet1', 'val2')); + ['addExclude', bind(helper.addExclude, helper, 'facet1', 'val2')], + ['removeExclude', bind(helper.removeExclude, helper, 'facet1', 'val2')], - testMutation(t, ' addRefine', bind(helper.addRefine, helper, 'f2', 'val')); - testMutation(t, ' removeRefine', bind(helper.removeRefine, helper, 'f2', 'val')); + ['addRefine', bind(helper.addRefine, helper, 'f2', 'val')], + ['removeRefine', bind(helper.removeRefine, helper, 'f2', 'val')], - testMutation(t, ' addDisjunctiveRefine', bind(helper.addDisjunctiveRefine, helper, 'f1', 'val')); - testMutation(t, ' removeDisjunctiveRefine', bind(helper.removeDisjunctiveRefine, helper, 'f1', 'val')); + ['addDisjunctiveRefine', bind(helper.addDisjunctiveRefine, helper, 'f1', 'val')], + ['removeDisjunctiveRefine', bind(helper.removeDisjunctiveRefine, helper, 'f1', 'val')], - testMutation(t, ' toggleRefine', bind(helper.toggleRefine, helper, 'f1', 'v1')); - testMutation(t, ' toggleExclude', bind(helper.toggleExclude, helper, 'facet1', '55')); + ['toggleRefine', bind(helper.toggleRefine, helper, 'f1', 'v1')], + ['toggleExclude', bind(helper.toggleExclude, helper, 'facet1', '55')] + ].forEach(function(definition) { + var fn = definition[1]; - t.end(); + helper.setCurrentPage(10); + expect(helper.getCurrentPage()).toBe(10); + fn(); + expect(helper.getCurrentPage()).toBe(0); + }); }); diff --git a/test/spec/algoliasearch.helper/pendingSearch.js b/test/spec/algoliasearch.helper/pendingSearch.js index 4ab7ac5de..d2e87b379 100644 --- a/test/spec/algoliasearch.helper/pendingSearch.js +++ b/test/spec/algoliasearch.helper/pendingSearch.js @@ -1,18 +1,17 @@ 'use strict'; -var test = require('tape'); var algoliaSearch = require('algoliasearch'); var algoliasearchHelper = require('../../../index'); -test('When searchOnce with callback, hasPendingRequests is true', function(t) { - var testData = require('../search.testdata')(); +test('When searchOnce with callback, hasPendingRequests is true', function(done) { + var testData = require('../../datasets/SearchParameters/search.dataset')(); var client = algoliaSearch('dsf', 'dsfdf'); var triggerCb; client.search = function() { - return new Promise(function(done) { - triggerCb = function() { done(testData.response); }; + return new Promise(function(resolve) { + triggerCb = function() { resolve(testData.response); }; }); }; @@ -22,28 +21,28 @@ test('When searchOnce with callback, hasPendingRequests is true', function(t) { countNoMoreSearch += 1; }); - t.equal(helper.hasPendingRequests(), false, 'before searchOnce'); + expect(helper.hasPendingRequests()).toBe(false); helper.searchOnce(helper.state, function() { - t.equal(helper.hasPendingRequests(), false, 'after searchOnce'); - t.equal(countNoMoreSearch, 1, 'No more search should have been called once after search results'); - t.end(); + expect(helper.hasPendingRequests()).toBe(false); + expect(countNoMoreSearch).toBe(1); + done(); }); - t.equal(helper.hasPendingRequests(), true, 'during searchOnce'); - t.equal(countNoMoreSearch, 0, 'No more search should not have been called yet'); + expect(helper.hasPendingRequests()).toBe(true); + expect(countNoMoreSearch).toBe(0); triggerCb(); }); -test('When searchOnce with promises, hasPendingRequests is true', function(t) { - var testData = require('../search.testdata')(); +test('When searchOnce with promises, hasPendingRequests is true', function(done) { + var testData = require('../../datasets/SearchParameters/search.dataset')(); var client = algoliaSearch('dsf', 'dsfdf'); var triggerCb; client.search = function() { - return new Promise(function(done) { - triggerCb = function() { done(testData.response); }; + return new Promise(function(resolve) { + triggerCb = function() { resolve(testData.response); }; }); }; @@ -53,28 +52,28 @@ test('When searchOnce with promises, hasPendingRequests is true', function(t) { countNoMoreSearch += 1; }); - t.equal(helper.hasPendingRequests(), false, 'before searchOnce'); + expect(helper.hasPendingRequests()).toBe(false); helper.searchOnce(helper.state).then(function() { - t.equal(helper.hasPendingRequests(), false, 'after searchOnce'); - t.equal(countNoMoreSearch, 1, 'No more search should have been called once after search results'); - t.end(); + expect(helper.hasPendingRequests()).toBe(false); + expect(countNoMoreSearch).toBe(1); + done(); }); - t.equal(helper.hasPendingRequests(), true, 'during searchOnce'); - t.equal(countNoMoreSearch, 0, 'No more search should not have been called yet'); + expect(helper.hasPendingRequests()).toBe(true); + expect(countNoMoreSearch).toBe(0); triggerCb(); }); -test('When searchForFacetValues, hasPendingRequests is true', function(t) { - var testData = require('../search.testdata')(); +test('When searchForFacetValues, hasPendingRequests is true', function(done) { + var testData = require('../../datasets/SearchParameters/search.dataset')(); var client = algoliaSearch('dsf', 'dsfdf'); var triggerCb; client.searchForFacetValues = function() { - return new Promise(function(done) { - triggerCb = function() { done([testData.response]); }; + return new Promise(function(resolve) { + triggerCb = function() { resolve([testData.response]); }; }); }; @@ -84,28 +83,28 @@ test('When searchForFacetValues, hasPendingRequests is true', function(t) { countNoMoreSearch += 1; }); - t.equal(helper.hasPendingRequests(), false, 'before searchForFacetValues'); + expect(helper.hasPendingRequests()).toBe(false); helper.searchForFacetValues('').then(function() { - t.equal(helper.hasPendingRequests(), false, 'after searchForFacetValues'); - t.equal(countNoMoreSearch, 1, 'No more search should have been called once after search results'); - t.end(); + expect(helper.hasPendingRequests()).toBe(false); + expect(countNoMoreSearch).toBe(1); + done(); }); - t.equal(helper.hasPendingRequests(), true, 'during searchForFacetValues'); - t.equal(countNoMoreSearch, 0, 'No more search should not have been called yet'); + expect(helper.hasPendingRequests()).toBe(true); + expect(countNoMoreSearch).toBe(0); triggerCb(); }); -test('When helper.search(), hasPendingRequests is true', function(t) { - var testData = require('../search.testdata')(); +test('When helper.search(), hasPendingRequests is true', function(done) { + var testData = require('../../datasets/SearchParameters/search.dataset')(); var client = algoliaSearch('dsf', 'dsfdf'); var triggerCb; client.search = function() { - return new Promise(function(done) { - triggerCb = function() { done(testData.response); }; + return new Promise(function(resolve) { + triggerCb = function() { resolve(testData.response); }; }); }; @@ -115,30 +114,30 @@ test('When helper.search(), hasPendingRequests is true', function(t) { countNoMoreSearch += 1; }); - t.equal(helper.hasPendingRequests(), false, 'before helper.search()'); + expect(helper.hasPendingRequests()).toBe(false); helper.on('result', function() { - t.equal(helper.hasPendingRequests(), false, 'after helper.search()'); - t.equal(countNoMoreSearch, 1, 'No more search should have been called once after search results'); - t.end(); + expect(helper.hasPendingRequests()).toBe(false); + expect(countNoMoreSearch).toBe(1); + done(); }); helper.search(); - t.equal(helper.hasPendingRequests(), true, 'during helper.search()'); - t.equal(countNoMoreSearch, 0, 'No more search should not have be called yet'); + expect(helper.hasPendingRequests()).toBe(true); + expect(countNoMoreSearch).toBe(0); triggerCb(); }); -test('When helper.search() and one request is discarded, hasPendingRequests is true unless all come back', function(t) { - var testData = require('../search.testdata'); +test('When helper.search() and one request is discarded, hasPendingRequests is true unless all come back', function(done) { + var testData = require('../../datasets/SearchParameters/search.dataset')(); var client = algoliaSearch('dsf', 'dsfdf'); var triggerCbs = []; client.search = function() { - return new Promise(function(done) { - triggerCbs.push(function() { done(testData().response); }); + return new Promise(function(resolve) { + triggerCbs.push(function() { resolve(testData.response); }); }); }; @@ -148,7 +147,7 @@ test('When helper.search() and one request is discarded, hasPendingRequests is t countNoMoreSearch += 1; }); - t.equal(helper.hasPendingRequests(), false, 'before helper.search()'); + expect(helper.hasPendingRequests()).toBe(false); helper.search(); helper.search(); @@ -156,8 +155,8 @@ test('When helper.search() and one request is discarded, hasPendingRequests is t // intermediary result handler helper.once('result', function() { - t.equal(helper.hasPendingRequests(), true, 'second request come back first, but the first is still ongoing'); - t.equal(countNoMoreSearch, 0, 'A search is still pending, which means that it should not have triggered the noMoreSearch event'); + expect(helper.hasPendingRequests()).toBe(true); + expect(countNoMoreSearch).toBe(0); }); // The second search returns from algolia -> discards the first one @@ -165,13 +164,13 @@ test('When helper.search() and one request is discarded, hasPendingRequests is t // Final result handler helper.once('result', function() { - t.equal(helper.hasPendingRequests(), true, 'second request come back first, but searchOnce is still ongoing'); - t.equal(countNoMoreSearch, 0, 'A search is still pending, which means that it should not have triggered the noMoreSearch event'); + expect(helper.hasPendingRequests()).toBe(true); + expect(countNoMoreSearch).toBe(0); }); helper.searchOnce({}, function() { - t.equal(helper.hasPendingRequests(), false, 'The last callback triggered is the searchOnce'); - t.equal(countNoMoreSearch, 1, 'This the last query'); + expect(helper.hasPendingRequests()).toBe(false); + expect(countNoMoreSearch).toBe(1); }); // The third search returns from Algolia @@ -182,8 +181,8 @@ test('When helper.search() and one request is discarded, hasPendingRequests is t // this will be ignored and it won't change anything setTimeout(function() { - t.equal(helper.hasPendingRequests(), false, 'after helper.search()'); - t.equal(countNoMoreSearch, 1, 'No more search should have been called once after search results'); - t.end(); + expect(helper.hasPendingRequests()).toBe(false); + expect(countNoMoreSearch).toBe(1); + done(); }, 0); }); diff --git a/test/spec/algoliasearch.helper/queryID.js b/test/spec/algoliasearch.helper/queryID.js index 7a4b3d2c1..c960ea45f 100644 --- a/test/spec/algoliasearch.helper/queryID.js +++ b/test/spec/algoliasearch.helper/queryID.js @@ -1,11 +1,10 @@ 'use strict'; -var test = require('tape'); var algoliasearchHelper = require('../../../index'); var fakeClient = {}; -test('the queryid should keep increasing when new requests arrives', function(t) { +test('the queryid should keep increasing when new requests arrives', function() { var initialQueryID; var client = { search: function() { @@ -19,13 +18,11 @@ test('the queryid should keep increasing when new requests arrives', function(t) helper.search().search().search().search().search(); - t.equal(helper._queryId, initialQueryID, 'the _queryID should have increased of the number of calls'); - - t.end(); + expect(helper._queryId).toBe(initialQueryID); }); -test('the response handler should check that the query is not outdated', function(t) { - var testData = require('../search.testdata')(); +test('the response handler should check that the query is not outdated', function(done) { + var testData = require('../../datasets/SearchParameters/search.dataset')(); var shouldTriggerResult = true; var callCount = 0; @@ -35,7 +32,7 @@ test('the response handler should check that the query is not outdated', functio callCount++; if (!shouldTriggerResult) { - t.fail('The id was outdated'); + done.fail('The id was outdated'); } }); @@ -47,17 +44,17 @@ test('the response handler should check that the query is not outdated', functio helper._dispatchAlgoliaResponse(states, helper._lastQueryIdReceived + 1, testData.response); helper._dispatchAlgoliaResponse(states, helper._lastQueryIdReceived + 10, testData.response); - t.equal(callCount, 2, 'the callback should have been called twice'); + expect(callCount).toBe(2); shouldTriggerResult = false; helper._dispatchAlgoliaResponse(states, helper._lastQueryIdReceived - 1, testData.response); - t.equal(callCount, 2, "and shouldn't have been called if outdated"); + expect(callCount).toBe(2); - t.end(); + done(); }); -test('the error handler should check that the query is not outdated', function(t) { +test('the error handler should check that the query is not outdated', function(done) { var shouldTriggerError = true; var callCount = 0; @@ -67,18 +64,18 @@ test('the error handler should check that the query is not outdated', function(t callCount++; if (!shouldTriggerError) { - t.fail('The id was outdated'); + done.fail('The id was outdated'); } }); helper._dispatchAlgoliaError(helper._lastQueryIdReceived + 1, new Error()); helper._dispatchAlgoliaError(helper._lastQueryIdReceived + 10, new Error()); - t.equal(callCount, 2, 'the callback should have been called twice'); + expect(callCount).toBe(2); shouldTriggerError = false; helper._dispatchAlgoliaError(helper._lastQueryIdReceived - 1, new Error()); - t.equal(callCount, 2, "and shouldn't have been called if outdated"); + expect(callCount).toBe(2); - t.end(); + done(); }); diff --git a/test/spec/algoliasearch.helper/searchForFacetValues.js b/test/spec/algoliasearch.helper/searchForFacetValues.js index be500cbf2..8d156fc8b 100644 --- a/test/spec/algoliasearch.helper/searchForFacetValues.js +++ b/test/spec/algoliasearch.helper/searchForFacetValues.js @@ -1,67 +1,54 @@ 'use strict'; -var test = require('tape'); - var algoliasearchHelper = require('../../../index'); -test('searchForFacetValues calls the client method over the index method', function(t) { - t.plan(2); +test('searchForFacetValues calls the client method over the index method', function() { + var clientSearchForFacetValues = jest.fn(function() { + return Promise.resolve([{}]); + }); - var indexSearchForFacetValuesCalled = 0; - var clientSearchForFacetValuesCalled = 0; + var indexSearchForFacetValues = jest.fn(function() { + return Promise.resolve({}); + }); var fakeClient = { - searchForFacetValues: function() { - clientSearchForFacetValuesCalled++; - return Promise.resolve([{}]); - }, + searchForFacetValues: clientSearchForFacetValues, initIndex: function() { return { - searchForFacetValues: function() { - indexSearchForFacetValuesCalled++; - return Promise.resolve({}); - } + searchForFacetValues: indexSearchForFacetValues }; } }; var helper = algoliasearchHelper(fakeClient, 'index'); - helper.searchForFacetValues('facet', 'query', 1).then(function() { - t.equal(clientSearchForFacetValuesCalled, 1); - t.equal(indexSearchForFacetValuesCalled, 0); - - t.end(); + return helper.searchForFacetValues('facet', 'query', 1).then(function() { + expect(clientSearchForFacetValues).toHaveBeenCalledTimes(1); + expect(indexSearchForFacetValues).toHaveBeenCalledTimes(0); }); }); -test('searchForFacetValues calls the index method if no client method', function(t) { - t.plan(1); - - var indexSearchForFacetValuesCalled = 0; +test('searchForFacetValues calls the index method if no client method', function() { + var indexSearchForFacetValues = jest.fn(function() { + return Promise.resolve({}); + }); var fakeClient = { initIndex: function() { return { - searchForFacetValues: function() { - indexSearchForFacetValuesCalled++; - return Promise.resolve({}); - } + searchForFacetValues: indexSearchForFacetValues }; } }; var helper = algoliasearchHelper(fakeClient, 'index'); - helper.searchForFacetValues('facet', 'query', 1).then(function() { - t.equal(indexSearchForFacetValuesCalled, 1); - t.end(); + return helper.searchForFacetValues('facet', 'query', 1).then(function() { + expect(indexSearchForFacetValues).toHaveBeenCalledTimes(1); }); }); -test('searchForFacetValues resolve with the correct response from client', function(t) { - t.plan(3); - +test('searchForFacetValues resolve with the correct response from client', function() { var fakeClient = { addAlgoliaAgent: function() {}, searchForFacetValues: function() { @@ -77,18 +64,14 @@ test('searchForFacetValues resolve with the correct response from client', funct var helper = algoliasearchHelper(fakeClient, 'index'); - helper.searchForFacetValues('facet', 'query', 1).then(function(content) { - t.equal(content.exhaustiveFacetsCount, true); - t.equal(content.facetHits.length, 0); - t.equal(content.processingTimeMS, 3); - - t.end(); + return helper.searchForFacetValues('facet', 'query', 1).then(function(content) { + expect(content.exhaustiveFacetsCount).toBe(true); + expect(content.facetHits.length).toBe(0); + expect(content.processingTimeMS).toBe(3); }); }); -test('searchForFacetValues resolve with the correct response from initIndex', function(t) { - t.plan(3); - +test('searchForFacetValues resolve with the correct response from initIndex', function() { var fakeClient = { addAlgoliaAgent: function() {}, initIndex: function() { @@ -106,25 +89,22 @@ test('searchForFacetValues resolve with the correct response from initIndex', fu var helper = algoliasearchHelper(fakeClient, 'index'); - helper.searchForFacetValues('facet', 'query', 1).then(function(content) { - t.equal(content.exhaustiveFacetsCount, true); - t.equal(content.facetHits.length, 0); - t.equal(content.processingTimeMS, 3); - - t.end(); + return helper.searchForFacetValues('facet', 'query', 1).then(function(content) { + expect(content.exhaustiveFacetsCount).toBe(true); + expect(content.facetHits.length).toBe(0); + expect(content.processingTimeMS).toBe(3); }); }); -test('index.searchForFacetValues should search for facetValues with the current state', function(t) { - var lastParameters = null; +test('index.searchForFacetValues should search for facetValues with the current state', function() { + var indexSearchForFacetValues = jest.fn(function() { + return Promise.resolve({}); + }); + var fakeClient = { initIndex: function() { return { - searchForFacetValues: function() { - lastParameters = arguments; - return Promise.resolve({ - }); - } + searchForFacetValues: indexSearchForFacetValues }; } }; @@ -137,25 +117,24 @@ test('index.searchForFacetValues should search for facetValues with the current helper.searchForFacetValues('facet', 'query', 75); - t.equal(lastParameters[0].query, 'iphone'); - t.equal(lastParameters[0].facetQuery, 'query'); - t.equal(lastParameters[0].facetName, 'facet'); - t.equal(lastParameters[0].highlightPreTag, 'HIGHLIGHT>'); - t.equal(lastParameters[0].highlightPostTag, ''); + expect(lastArguments.highlightPostTag).toBe(''); - t.equal(lastParameters[0].params.highlightPostTag, ''); + expect(lastArguments.params.highlightPostTag).toBe(' set page to 0, trigger change', function(t) { - t.plan(2); +test('hierarchical facets: add a facet -> set page to 0, trigger change', function() { + expect.assertions(2); var algoliasearchHelper = require('../../../'); var helper = algoliasearchHelper(fakeClient, '', { hierarchicalFacets: [{ @@ -15,15 +13,15 @@ test('hierarchical facets: add a facet -> set page to 0, trigger change', functi }).setPage(2); helper.once('change', function() { - t.equal(helper.getPage(), 0); - t.deepEqual(helper.getHierarchicalFacetBreadcrumb('categories'), ['men']); + expect(helper.getPage()).toBe(0); + expect(helper.getHierarchicalFacetBreadcrumb('categories')).toEqual(['men']); }); helper.addHierarchicalFacetRefinement('categories', 'men'); }); -test('hierarchical facets: remove a facet -> set page to 0, trigger change', function(t) { - t.plan(2); +test('hierarchical facets: remove a facet -> set page to 0, trigger change', function() { + expect.assertions(2); var algoliasearchHelper = require('../../../'); var helper = algoliasearchHelper(fakeClient, '', { hierarchicalFacets: [{ @@ -33,8 +31,8 @@ test('hierarchical facets: remove a facet -> set page to 0, trigger change', fun }).setPage(2).addHierarchicalFacetRefinement('categories', 'men'); helper.once('change', function() { - t.equal(helper.getPage(), 0); - t.deepEqual(helper.getHierarchicalFacetBreadcrumb('categories'), []); + expect(helper.getPage()).toBe(0); + expect(helper.getHierarchicalFacetBreadcrumb('categories')).toEqual([]); }); helper.removeHierarchicalFacetRefinement('categories'); diff --git a/test/spec/hierarchical-facets/attributes-order.js b/test/spec/hierarchical-facets/attributes-order.js index 762c834c9..ee888c9bc 100644 --- a/test/spec/hierarchical-facets/attributes-order.js +++ b/test/spec/hierarchical-facets/attributes-order.js @@ -2,11 +2,8 @@ // different order than the declared attributes order at the helper initialization 'use strict'; -var test = require('tape'); - -test('hierarchical facets: attributes order', function(t) { +test('hierarchical facets: attributes order', function(done) { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var algoliasearchHelper = require('../../../'); @@ -90,16 +87,16 @@ test('hierarchical facets: attributes order', function(t) { }] }]; - client.search = sinon - .stub() - .resolves(algoliaResponse); + client.search = jest.fn(function() { + return Promise.resolve(algoliaResponse); + }); helper.setQuery('a').search(); helper.once('result', function(content) { - t.deepEqual(content.hierarchicalFacets, expectedHelperResponse); - t.deepEqual(content.getFacetByName('categories'), expectedHelperResponse[0]); + expect(content.hierarchicalFacets).toEqual(expectedHelperResponse); + expect(content.getFacetByName('categories')).toEqual(expectedHelperResponse[0]); - t.end(); + done(); }); }); diff --git a/test/spec/hierarchical-facets/breadcrumb.js b/test/spec/hierarchical-facets/breadcrumb.js index 23ecdd099..36f50b3f3 100644 --- a/test/spec/hierarchical-facets/breadcrumb.js +++ b/test/spec/hierarchical-facets/breadcrumb.js @@ -1,8 +1,6 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: using getHierarchicalFacetBreadcrumb()', function(t) { +test('hierarchical facets: using getHierarchicalFacetBreadcrumb()', function() { var algoliasearch = require('algoliasearch'); var algoliasearchHelper = require('../../../'); @@ -21,16 +19,10 @@ test('hierarchical facets: using getHierarchicalFacetBreadcrumb()', function(t) helper.toggleRefine('categories', 'beers > IPA > Flying dog'); - t.deepEqual( - helper.getHierarchicalFacetBreadcrumb('categories'), - ['beers', 'IPA', 'Flying dog'], - 'we get the hierarchical facet `categories` breadcrumb as an array' - ); - - t.end(); + expect(helper.getHierarchicalFacetBreadcrumb('categories')).toEqual(['beers', 'IPA', 'Flying dog']); }); -test('hierarchical facets: using getHierarchicalFacetBreadcrumb before the first refinement', function(t) { +test('hierarchical facets: using getHierarchicalFacetBreadcrumb before the first refinement', function() { var algoliasearch = require('algoliasearch'); var algoliasearchHelper = require('../../../'); @@ -47,16 +39,10 @@ test('hierarchical facets: using getHierarchicalFacetBreadcrumb before the first }] }); - t.deepEqual( - helper.getHierarchicalFacetBreadcrumb('categories'), - [], - 'we get an empty array' - ); - - t.end(); + expect(helper.getHierarchicalFacetBreadcrumb('categories')).toEqual([]); }); -test('hierarchical facets: using getHierarchicalFacetBreadcrumb on an undefined facet', function(t) { +test('hierarchical facets: using getHierarchicalFacetBreadcrumb on an undefined facet', function() { var algoliasearch = require('algoliasearch'); var algoliasearchHelper = require('../../../'); @@ -68,10 +54,5 @@ test('hierarchical facets: using getHierarchicalFacetBreadcrumb on an undefined var client = algoliasearch(appId, apiKey); var helper = algoliasearchHelper(client, indexName, {}); - t.throws( - helper.getHierarchicalFacetBreadcrumb.bind('categories'), - 'we get an exception if the facet is not defined' - ); - - t.end(); + expect(helper.getHierarchicalFacetBreadcrumb.bind('categories')).toThrow(); }); diff --git a/test/spec/hierarchical-facets/custom-prefix-path.js b/test/spec/hierarchical-facets/custom-prefix-path.js index e75700c42..979761e35 100644 --- a/test/spec/hierarchical-facets/custom-prefix-path.js +++ b/test/spec/hierarchical-facets/custom-prefix-path.js @@ -1,10 +1,7 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: custom prefix path', function(t) { +test('hierarchical facets: custom prefix path', function(done) { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var algoliasearchHelper = require('../../../'); @@ -96,14 +93,14 @@ test('hierarchical facets: custom prefix path', function(t) { }] }]; - client.search = sinon - .stub() - .resolves(algoliaResponse); + client.search = jest.fn(function() { + return Promise.resolve(algoliaResponse); + }); helper.setQuery('a').search(); helper.once('result', function(content) { - t.ok(client.search.calledOnce, 'client.search was called once'); - t.deepEqual(content.hierarchicalFacets, expectedHelperResponse); - t.end(); + expect(client.search).toHaveBeenCalledTimes(1); + expect(content.hierarchicalFacets).toEqual(expectedHelperResponse); + done(); }); }); diff --git a/test/spec/hierarchical-facets/custom-separator.js b/test/spec/hierarchical-facets/custom-separator.js index bec85e1bb..c8e8e127e 100644 --- a/test/spec/hierarchical-facets/custom-separator.js +++ b/test/spec/hierarchical-facets/custom-separator.js @@ -1,10 +1,7 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: custom separator', function(t) { +test('hierarchical facets: custom separator', function(done) { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var algoliasearchHelper = require('../../../'); @@ -88,39 +85,22 @@ test('hierarchical facets: custom separator', function(t) { }] }]; - client.search = sinon - .stub() - .resolves(algoliaResponse); + client.search = jest.fn(function() { + return Promise.resolve(algoliaResponse); + }); helper.setQuery('a').search(); helper.once('result', function(content) { - var call = client.search.getCall(0); - var queries = call.args[0]; + var queries = client.search.mock.calls[0][0]; var hitsQuery = queries[0]; var parentValuesQuery = queries[1]; - t.ok(client.search.calledOnce, 'client.search was called once'); - t.deepEqual( - hitsQuery.params.facets, - ['categories.lvl0', 'categories.lvl1'], - 'first query (hits) has `categories.lvl0, categories.lvl1` as facets' - ); - t.deepEqual( - hitsQuery.params.facetFilters, - [['categories.lvl1:beers | IPA']], - 'first query (hits) has our `categories.lvl1` refinement facet filter' - ); - t.deepEqual( - parentValuesQuery.params.facets, - ['categories.lvl0', 'categories.lvl1'], - 'second query (unrefined parent facet values) has `categories.lvl1` as facets' - ); - t.deepEqual( - parentValuesQuery.params.facetFilters, - [['categories.lvl0:beers']], - 'second query (unrefined parent facet values) has `categories.lvl0` (parent level) refined' - ); - t.deepEqual(content.hierarchicalFacets, expectedHelperResponse); - t.end(); + expect(client.search).toHaveBeenCalledTimes(1); + expect(hitsQuery.params.facets).toEqual(['categories.lvl0', 'categories.lvl1']); + expect(hitsQuery.params.facetFilters).toEqual([['categories.lvl1:beers | IPA']]); + expect(parentValuesQuery.params.facets).toEqual(['categories.lvl0', 'categories.lvl1']); + expect(parentValuesQuery.params.facetFilters).toEqual([['categories.lvl0:beers']]); + expect(content.hierarchicalFacets).toEqual(expectedHelperResponse); + done(); }); }); diff --git a/test/spec/hierarchical-facets/do-not-show-parent-level.js b/test/spec/hierarchical-facets/do-not-show-parent-level.js index 34a2bf206..a47054971 100644 --- a/test/spec/hierarchical-facets/do-not-show-parent-level.js +++ b/test/spec/hierarchical-facets/do-not-show-parent-level.js @@ -1,10 +1,7 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: do not show parent level', function(t) { +test('hierarchical facets: do not show parent level', function(done) { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var algoliasearchHelper = require('../../../'); @@ -83,14 +80,14 @@ test('hierarchical facets: do not show parent level', function(t) { }] }]; - client.search = sinon - .stub() - .resolves(algoliaResponse); + client.search = jest.fn(function() { + return Promise.resolve(algoliaResponse); + }); helper.setQuery('a').search(); helper.once('result', function(content) { - t.ok(client.search.calledOnce, 'client.search was called once'); - t.deepEqual(content.hierarchicalFacets, expectedHelperResponse); - t.end(); + expect(client.search).toHaveBeenCalledTimes(1); + expect(content.hierarchicalFacets).toEqual(expectedHelperResponse); + done(); }); }); diff --git a/test/spec/hierarchical-facets/getFacetValues.js b/test/spec/hierarchical-facets/getFacetValues.js index 9b302f3cb..b21c54030 100644 --- a/test/spec/hierarchical-facets/getFacetValues.js +++ b/test/spec/hierarchical-facets/getFacetValues.js @@ -1,10 +1,8 @@ 'use strict'; -var test = require('tape'); - var fakeClient = {}; -test('hierarchical facets: getFacetValues', function(t) { +test('hierarchical facets: getFacetValues', function() { var algoliasearchHelper = require('../../../'); var SearchResults = require('../../../src/SearchResults'); @@ -93,13 +91,8 @@ test('hierarchical facets: getFacetValues', function(t) { var results = new SearchResults(helper.state, algoliaResponse.results); - t.deepEqual( - results.getFacetValues('categories', {sortBy: ['name:asc']}), - expectedHelperResponseNameASC, - 'Hierarchical facet values should be sorted as per the predicate'); - t.deepEqual( - results.getFacetValues('categories', {sortBy: function(a, b) { return a.count - b.count; }}), - results.getFacetValues('categories', {sortBy: ['count:asc']}), - 'Hierarchical faet values should be consistentely sort with string or function predicates'); - t.end(); + expect(results.getFacetValues('categories', {sortBy: ['name:asc']})).toEqual(expectedHelperResponseNameASC); + expect( + results.getFacetValues('categories', {sortBy: function(a, b) { return a.count - b.count; }}) + ).toEqual(results.getFacetValues('categories', {sortBy: ['count:asc']})); }); diff --git a/test/spec/hierarchical-facets/no-refinement.js b/test/spec/hierarchical-facets/no-refinement.js index 67c89aee7..8c4b2149d 100644 --- a/test/spec/hierarchical-facets/no-refinement.js +++ b/test/spec/hierarchical-facets/no-refinement.js @@ -1,10 +1,7 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: no refinement', function(t) { +test('hierarchical facets: no refinement', function(done) { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var algoliasearchHelper = require('../../../'); @@ -55,29 +52,20 @@ test('hierarchical facets: no refinement', function(t) { }] }]; - client.search = sinon - .stub() - .resolves(algoliaResponse); + client.search = jest.fn(function() { + return Promise.resolve(algoliaResponse); + }); helper.setQuery('a').search(); helper.once('result', function(content) { - var call = client.search.getCall(0); - var queries = call.args[0]; + var queries = client.search.mock.calls[0][0]; var hitsQuery = queries[0]; - t.equal(queries.length, 1, 'we made one query'); - t.ok(client.search.calledOnce, 'client.search was called once'); - t.deepEqual( - hitsQuery.params.facets, - ['categories.lvl0'], - 'first query (hits) has `categories.lvl0` as facets' - ); - t.equal( - hitsQuery.params.facetFilters, - undefined, - 'first query (hits) has no facet refinement refinement' - ); - t.deepEqual(content.hierarchicalFacets, expectedHelperResponse); - t.end(); + expect(queries.length).toBe(1); + expect(client.search).toHaveBeenCalledTimes(1); + expect(hitsQuery.params.facets).toEqual(['categories.lvl0']); + expect(hitsQuery.params.facetFilters).toBe(undefined); + expect(content.hierarchicalFacets).toEqual(expectedHelperResponse); + done(); }); }); diff --git a/test/spec/hierarchical-facets/no-trim.js b/test/spec/hierarchical-facets/no-trim.js index fb6883242..e9cb7cebb 100644 --- a/test/spec/hierarchical-facets/no-trim.js +++ b/test/spec/hierarchical-facets/no-trim.js @@ -1,10 +1,7 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: do not trim facetFilters values', function(t) { +test('hierarchical facets: do not trim facetFilters values', function(done) { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var algoliasearchHelper = require('../../../'); @@ -90,28 +87,19 @@ test('hierarchical facets: do not trim facetFilters values', function(t) { }] }]; - client.search = sinon - .stub() - .resolves(algoliaResponse); + client.search = jest.fn(function() { + return Promise.resolve(algoliaResponse); + }); helper.setQuery('a').search(); helper.once('result', function(content) { - var call = client.search.getCall(0); - var queries = call.args[0]; + var queries = client.search.mock.calls[0][0]; var hitsQuery = queries[0]; var parentValuesQuery = queries[1]; - t.deepEqual( - hitsQuery.params.facetFilters, - [['categories.lvl1: beers > IPA ']], - 'first query (hits) has our `categories.lvl1` refinement facet filter' - ); - t.deepEqual( - parentValuesQuery.params.facetFilters, - [['categories.lvl0: beers ']], - 'second query (unrefined parent facet values) has `categories.lvl0` (parent level) refined' - ); - t.deepEqual(content.hierarchicalFacets, expectedHelperResponse); - t.end(); + expect(hitsQuery.params.facetFilters).toEqual([['categories.lvl1: beers > IPA ']]); + expect(parentValuesQuery.params.facetFilters).toEqual([['categories.lvl0: beers ']]); + expect(content.hierarchicalFacets).toEqual(expectedHelperResponse); + done(); }); }); diff --git a/test/spec/hierarchical-facets/objects-with-multiple-categories.js b/test/spec/hierarchical-facets/objects-with-multiple-categories.js index 63d3657c7..55ad4ea93 100644 --- a/test/spec/hierarchical-facets/objects-with-multiple-categories.js +++ b/test/spec/hierarchical-facets/objects-with-multiple-categories.js @@ -1,12 +1,8 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: objects with multiple categories', function(t) { +test('hierarchical facets: objects with multiple categories', function(done) { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); - var algoliasearchHelper = require('../../../'); var appId = 'hierarchical-simple-appId'; @@ -94,13 +90,13 @@ test('hierarchical facets: objects with multiple categories', function(t) { }] }]; - client.search = sinon - .stub() - .resolves(algoliaResponse); + client.search = jest.fn(function() { + return Promise.resolve(algoliaResponse); + }); helper.setQuery('a').search(); helper.once('result', function(content) { - t.deepEqual(content.hierarchicalFacets, expectedHelperResponse); - t.end(); + expect(content.hierarchicalFacets).toEqual(expectedHelperResponse); + done(); }); }); diff --git a/test/spec/hierarchical-facets/one-level.js b/test/spec/hierarchical-facets/one-level.js index e45e84f04..60d39da9c 100644 --- a/test/spec/hierarchical-facets/one-level.js +++ b/test/spec/hierarchical-facets/one-level.js @@ -1,10 +1,7 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: only one level deep', function(t) { +test('hierarchical facets: only one level deep', function(done) { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var algoliasearchHelper = require('../../../'); @@ -68,40 +65,23 @@ test('hierarchical facets: only one level deep', function(t) { }] }]; - client.search = sinon - .stub() - .resolves(algoliaResponse); + client.search = jest.fn(function() { + return Promise.resolve(algoliaResponse); + }); helper.setQuery('a').search(); helper.once('result', function(content) { - var call = client.search.getCall(0); - var queries = call.args[0]; + var queries = client.search.mock.calls[0][0]; var hitsQuery = queries[0]; var parentValuesQuery = queries[1]; - t.equal(queries.length, 2, 'we made two queries'); - t.ok(client.search.calledOnce, 'client.search was called once'); - t.deepEqual( - hitsQuery.params.facets, - ['categories.lvl0'], - 'first query (hits) has `categories.lvl0` as facets' - ); - t.deepEqual( - hitsQuery.params.facetFilters, - [['categories.lvl0:beers']], - 'first query (hits) has our `categories.lvl0` refinement facet filter' - ); - t.deepEqual( - parentValuesQuery.params.facets, - ['categories.lvl0'], - 'second query (unrefined parent facet values) has `categories.lvl0` as facets' - ); - t.equal( - parentValuesQuery.params.facetFilters, - undefined, - 'second query (unrefined parent facet values) has no facet refinement since we are at the root level' - ); - t.deepEqual(content.hierarchicalFacets, expectedHelperResponse); - t.end(); + expect(queries.length).toBe(2); + expect(client.search).toHaveBeenCalledTimes(1); + expect(hitsQuery.params.facets).toEqual(['categories.lvl0']); + expect(hitsQuery.params.facetFilters).toEqual([['categories.lvl0:beers']]); + expect(parentValuesQuery.params.facets).toEqual(['categories.lvl0']); + expect(parentValuesQuery.params.facetFilters).toBe(undefined); + expect(content.hierarchicalFacets).toEqual(expectedHelperResponse); + done(); }); }); diff --git a/test/spec/hierarchical-facets/pagination.js b/test/spec/hierarchical-facets/pagination.js index fe8e2e59b..633f2595b 100644 --- a/test/spec/hierarchical-facets/pagination.js +++ b/test/spec/hierarchical-facets/pagination.js @@ -1,10 +1,7 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: pagination', function(t) { +test('hierarchical facets: pagination', function(done) { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var isArray = require('lodash/isArray'); var algoliasearchHelper = require('../../../'); @@ -68,9 +65,9 @@ test('hierarchical facets: pagination', function(t) { }] }; - client.search = sinon - .stub() - .resolves(algoliaResponse); + client.search = jest.fn(function() { + return Promise.resolve(algoliaResponse); + }); helper.setQuery(''); helper.setCurrentPage(1); @@ -78,19 +75,15 @@ test('hierarchical facets: pagination', function(t) { helper.search(); helper.once('result', function() { - var call = client.search.getCall(0); - var queries = call.args[0]; + var queries = client.search.mock.calls[0][0]; var hitsQuery = queries[0]; - t.equal(hitsQuery.params.page, 0, 'Page is reset to 0'); + expect(hitsQuery.params.page).toBe(0); // we do not yet support multiple values for hierarchicalFacetsRefinements // but at some point we may want to open multiple leafs of a hierarchical menu // So we set this as an array so that we do not have to bump major to handle it - t.ok( - isArray(helper.state.hierarchicalFacetsRefinements.categories), - 'state.hierarchicalFacetsRefinements is an array' - ); - t.end(); + expect(isArray(helper.state.hierarchicalFacetsRefinements.categories)).toBeTruthy(); + done(); }); }); diff --git a/test/spec/hierarchical-facets/parent-toggleRefine.js b/test/spec/hierarchical-facets/parent-toggleRefine.js index adc41d590..b29bd6876 100644 --- a/test/spec/hierarchical-facets/parent-toggleRefine.js +++ b/test/spec/hierarchical-facets/parent-toggleRefine.js @@ -1,10 +1,7 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: toggleRefine behavior', function(t) { +test('hierarchical facets: toggleRefine behavior', function() { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var algoliasearchHelper = require('../../../'); @@ -20,7 +17,9 @@ test('hierarchical facets: toggleRefine behavior', function(t) { }] }); - client.search = sinon.stub().returns(new Promise(function() {})); + client.search = jest.fn(function() { + return new Promise(function() {}); + }); // select `Flying dog` helper.toggleRefine('categories', 'beers > IPA > Flying dog'); @@ -34,26 +33,15 @@ test('hierarchical facets: toggleRefine behavior', function(t) { helper.setQuery('a').search(); - var call = client.search.getCall(0); - var queries = call.args[0]; + var queries = client.search.mock.calls[0][0]; var hitsQuery = queries[0]; - t.deepEqual( - hitsQuery.params.facets, - ['categories.lvl0', 'categories.lvl1'], - 'first query (hits) has `categories.lvl0, categories.lvl1` as facets' - ); - t.deepEqual( - hitsQuery.params.facetFilters, - [['categories.lvl0:beers']], - 'first query (hits) has our `categories.lvl0` refinement facet filter' - ); - t.end(); + expect(hitsQuery.params.facets).toEqual(['categories.lvl0', 'categories.lvl1']); + expect(hitsQuery.params.facetFilters).toEqual([['categories.lvl0:beers']]); }); -test('hierarchical facets: toggleRefine behavior when root level', function(t) { +test('hierarchical facets: toggleRefine behavior when root level', function() { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var algoliasearchHelper = require('../../../'); @@ -69,7 +57,9 @@ test('hierarchical facets: toggleRefine behavior when root level', function(t) { }] }); - client.search = sinon.stub().returns(new Promise(function() {})); + client.search = jest.fn(function() { + return new Promise(function() {}); + }); helper.toggleRefine('categories', 'beers > IPA > Flying dog'); helper.toggleRefine('categories', 'beers'); @@ -77,26 +67,15 @@ test('hierarchical facets: toggleRefine behavior when root level', function(t) { helper.setQuery('a').search(); - var call = client.search.getCall(0); - var queries = call.args[0]; + var queries = client.search.mock.calls[0][0]; var hitsQuery = queries[0]; - t.deepEqual( - hitsQuery.params.facets, - ['categories.lvl0'], - 'first query (hits) has `categories.lvl0, categories.lvl1` as facets' - ); - t.equal( - hitsQuery.params.facetFilters, - undefined, - 'first query (hits) has our `categories.lvl0` refinement facet filter' - ); - t.end(); + expect(hitsQuery.params.facets).toEqual(['categories.lvl0']); + expect(hitsQuery.params.facetFilters).toBe(undefined); }); -test('hierarchical facets: toggleRefine behavior when different root level', function(t) { +test('hierarchical facets: toggleRefine behavior when different root level', function() { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var algoliasearchHelper = require('../../../'); @@ -112,7 +91,9 @@ test('hierarchical facets: toggleRefine behavior when different root level', fun }] }); - client.search = sinon.stub().returns(new Promise(function() {})); + client.search = jest.fn(function() { + return new Promise(function() {}); + }); helper.toggleRefine('categories', 'beers > IPA > Flying dog'); helper.toggleRefine('categories', 'fruits'); @@ -120,19 +101,9 @@ test('hierarchical facets: toggleRefine behavior when different root level', fun helper.setQuery('a').search(); - var call = client.search.getCall(0); - var queries = call.args[0]; + var queries = client.search.mock.calls[0][0]; var hitsQuery = queries[0]; - t.deepEqual( - hitsQuery.params.facets, - ['categories.lvl0', 'categories.lvl1'], - 'first query (hits) has `categories.lvl0, categories.lvl1` as facets' - ); - t.deepEqual( - hitsQuery.params.facetFilters, - [['categories.lvl0:fruits']], - 'first query (hits) has our `categories.lvl0` refinement facet filter' - ); - t.end(); + expect(hitsQuery.params.facets).toEqual(['categories.lvl0', 'categories.lvl1']); + expect(hitsQuery.params.facetFilters).toEqual([['categories.lvl0:fruits']]); }); diff --git a/test/spec/hierarchical-facets/refined-no-result.js b/test/spec/hierarchical-facets/refined-no-result.js index 0ce8a8c05..5754de913 100644 --- a/test/spec/hierarchical-facets/refined-no-result.js +++ b/test/spec/hierarchical-facets/refined-no-result.js @@ -1,10 +1,7 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: simple usage', function(t) { +test('hierarchical facets: no results', function(done) { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var algoliasearchHelper = require('../../../'); @@ -57,14 +54,22 @@ test('hierarchical facets: simple usage', function(t) { }] }; - client.search = sinon - .stub() - .resolves(algoliaResponse); + client.search = jest.fn(function() { + return Promise.resolve(algoliaResponse); + }); helper.setQuery('badquery').search(); helper.once('result', function(content) { - t.deepEqual(content.hierarchicalFacets, [{name: 'categories', count: null, isRefined: true, path: null, data: null}], 'Good facets values'); - t.end(); + expect(content.hierarchicalFacets).toEqual([ + { + name: 'categories', + count: null, + isRefined: true, + path: null, + data: null + } + ]); + done(); }); }); diff --git a/test/spec/hierarchical-facets/show-parent-level.js b/test/spec/hierarchical-facets/show-parent-level.js index 888948d69..3d4a3965b 100644 --- a/test/spec/hierarchical-facets/show-parent-level.js +++ b/test/spec/hierarchical-facets/show-parent-level.js @@ -1,10 +1,7 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: show parent level', function(t) { +test('hierarchical facets: show parent level', function(done) { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var algoliasearchHelper = require('../../../'); @@ -89,14 +86,14 @@ test('hierarchical facets: show parent level', function(t) { }] }]; - client.search = sinon - .stub() - .resolves(algoliaResponse); + client.search = jest.fn(function() { + return Promise.resolve(algoliaResponse); + }); helper.setQuery('a').search(); helper.once('result', function(content) { - t.ok(client.search.calledOnce, 'client.search was called once'); - t.deepEqual(content.hierarchicalFacets, expectedHelperResponse); - t.end(); + expect(client.search).toHaveBeenCalledTimes(1); + expect(content.hierarchicalFacets).toEqual(expectedHelperResponse); + done(); }); }); diff --git a/test/spec/hierarchical-facets/simple-usage.js b/test/spec/hierarchical-facets/simple-usage.js index ab7d17fe2..894526d19 100644 --- a/test/spec/hierarchical-facets/simple-usage.js +++ b/test/spec/hierarchical-facets/simple-usage.js @@ -1,10 +1,7 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: simple usage', function(t) { +test('hierarchical facets: simple usage', function(done) { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var isArray = require('lodash/isArray'); var algoliasearchHelper = require('../../../'); @@ -112,60 +109,34 @@ test('hierarchical facets: simple usage', function(t) { }] }]; - client.search = sinon - .stub() - .resolves(algoliaResponse); + client.search = jest.fn(function() { + return Promise.resolve(algoliaResponse); + }); helper.setQuery('a').search(); helper.once('result', function(content) { - var call = client.search.getCall(0); - var queries = call.args[0]; + var queries = client.search.mock.calls[0][0]; var hitsQuery = queries[0]; var parentValuesQuery = queries[1]; var rootValuesQuery = queries[2]; - t.equal(queries.length, 3, 'we made three queries'); - t.deepEqual( - hitsQuery.params.facets, - ['categories.lvl0', 'categories.lvl1', 'categories.lvl2', 'categories.lvl3'], - 'first query (hits) has `categories.lvl0, categories.lvl1, categories.lvl2, categories.lvl3` as facets' - ); - t.deepEqual( - hitsQuery.params.facetFilters, - [['categories.lvl2:beers > IPA > Flying dog']], - 'first query (hits) has our `categories.lvl2` refinement facet filter' - ); - t.deepEqual( - parentValuesQuery.params.facets, - ['categories.lvl0', 'categories.lvl1', 'categories.lvl2'], - 'second query (unrefined parent facet values) has `categories.lvl2` as facets' + expect(queries.length).toBe(3); + expect(hitsQuery.params.facets).toEqual( + ['categories.lvl0', 'categories.lvl1', 'categories.lvl2', 'categories.lvl3'] ); - t.deepEqual( - parentValuesQuery.params.facetFilters, - [['categories.lvl1:beers > IPA']], - 'second query (unrefined parent facet values) has `categories.lvl1` (parent level) refined' - ); - t.deepEqual( - rootValuesQuery.params.facets, - ['categories.lvl0'], - 'second query (unrefined root facet values) has `categories.lvl0` as facets' - ); - t.equal( - rootValuesQuery.params.facetFilters, - undefined, - 'second query (unrefined root facet values) has no facet refinement' - ); - t.deepEqual(content.hierarchicalFacets, expectedHelperResponse); - t.deepEqual(content.getFacetByName('categories'), expectedHelperResponse[0]); + expect(hitsQuery.params.facetFilters).toEqual([['categories.lvl2:beers > IPA > Flying dog']]); + expect(parentValuesQuery.params.facets).toEqual(['categories.lvl0', 'categories.lvl1', 'categories.lvl2']); + expect(parentValuesQuery.params.facetFilters).toEqual([['categories.lvl1:beers > IPA']]); + expect(rootValuesQuery.params.facets).toEqual(['categories.lvl0']); + expect(rootValuesQuery.params.facetFilters).toBe(undefined); + expect(content.hierarchicalFacets).toEqual(expectedHelperResponse); + expect(content.getFacetByName('categories')).toEqual(expectedHelperResponse[0]); // we do not yet support multiple values for hierarchicalFacetsRefinements // but at some point we may want to open multiple leafs of a hierarchical menu // So we set this as an array so that we do not have to bump major to handle it - t.ok( - isArray(helper.state.hierarchicalFacetsRefinements.categories), - 'state.hierarchicalFacetsRefinements is an array' - ); - t.end(); + expect(isArray(helper.state.hierarchicalFacetsRefinements.categories)).toBeTruthy(); + done(); }); }); diff --git a/test/spec/hierarchical-facets/sort-by.js b/test/spec/hierarchical-facets/sort-by.js index f0f88174f..6af7b0a77 100644 --- a/test/spec/hierarchical-facets/sort-by.js +++ b/test/spec/hierarchical-facets/sort-by.js @@ -1,12 +1,8 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: using sortBy', function(t) { +test('hierarchical facets: using sortBy', function(done) { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); - var algoliasearchHelper = require('../../../'); var appId = 'hierarchical-simple-appId'; @@ -107,13 +103,13 @@ test('hierarchical facets: using sortBy', function(t) { }] }]; - client.search = sinon - .stub() - .resolves(algoliaResponse); + client.search = jest.fn(function() { + return Promise.resolve(algoliaResponse); + }); helper.setQuery('a').search(); helper.once('result', function(content) { - t.deepEqual(content.hierarchicalFacets, expectedHelperResponse); - t.end(); + expect(content.hierarchicalFacets).toEqual(expectedHelperResponse); + done(); }); }); diff --git a/test/spec/hierarchical-facets/two-facets.js b/test/spec/hierarchical-facets/two-facets.js index 198968e9a..21777e484 100644 --- a/test/spec/hierarchical-facets/two-facets.js +++ b/test/spec/hierarchical-facets/two-facets.js @@ -1,10 +1,7 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: two hierarchical facets', function(t) { +test('hierarchical facets: two hierarchical facets', function(done) { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var algoliasearchHelper = require('../../../'); @@ -103,13 +100,13 @@ test('hierarchical facets: two hierarchical facets', function(t) { }]; - client.search = sinon - .stub() - .resolves(algoliaResponse); + client.search = jest.fn(function() { + return Promise.resolve(algoliaResponse); + }); helper.setQuery('a').search(); helper.once('result', function(content) { - t.deepEqual(content.hierarchicalFacets, expectedHelperResponse); - t.end(); + expect(content.hierarchicalFacets).toEqual(expectedHelperResponse); + done(); }); }); diff --git a/test/spec/hierarchical-facets/unknown-facet.js b/test/spec/hierarchical-facets/unknown-facet.js index bd73451b7..93d523914 100644 --- a/test/spec/hierarchical-facets/unknown-facet.js +++ b/test/spec/hierarchical-facets/unknown-facet.js @@ -1,8 +1,6 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: throw on unknown facet', function(t) { +test('hierarchical facets: throw on unknown facet', function() { var bind = require('lodash/bind'); var algoliasearch = require('algoliasearch'); @@ -20,10 +18,5 @@ test('hierarchical facets: throw on unknown facet', function(t) { }] }); - t.throws( - bind(helper.toggleRefine, helper, 'unknownFacet', 'beers'), - 'Refine on an unknown hierarchical facet throws' - ); - - t.end(); + expect(bind(helper.toggleRefine, helper, 'unknownFacet', 'beers')).toThrow(); }); diff --git a/test/spec/hierarchical-facets/with-a-disjunctive-facet.js b/test/spec/hierarchical-facets/with-a-disjunctive-facet.js index d89558b6f..fb2f6f73b 100644 --- a/test/spec/hierarchical-facets/with-a-disjunctive-facet.js +++ b/test/spec/hierarchical-facets/with-a-disjunctive-facet.js @@ -1,10 +1,7 @@ 'use strict'; -var test = require('tape'); - -test('hierarchical facets: combined with a disjunctive facet', function(t) { +test('hierarchical facets: combined with a disjunctive facet', function() { var algoliasearch = require('algoliasearch'); - var sinon = require('sinon'); var algoliasearchHelper = require('../../../'); @@ -24,17 +21,13 @@ test('hierarchical facets: combined with a disjunctive facet', function(t) { helper.toggleRefine('categories', 'beers > IPA'); helper.toggleRefine('colors', 'blue'); - client.search = sinon.stub().returns(new Promise(function() {})); + client.search = jest.fn(function() { + return new Promise(function() {}); + }); helper.setQuery('a').search(); - var disjunctiveFacetsValuesQuery = client.search.getCall(0).args[0][1]; - - t.deepEqual( - disjunctiveFacetsValuesQuery.params.facetFilters, - [['categories.lvl1:beers > IPA']], - 'Disjunctive facet values query is done using the current hierarchical refinement' - ); + var disjunctiveFacetsValuesQuery = client.search.mock.calls[0][0][1]; - t.end(); + expect(disjunctiveFacetsValuesQuery.params.facetFilters).toEqual([['categories.lvl1:beers > IPA']]); }); diff --git a/test/spec/refinements.js b/test/spec/refinements.js index a73c81e3a..62478c73a 100644 --- a/test/spec/refinements.js +++ b/test/spec/refinements.js @@ -1,12 +1,11 @@ 'use strict'; -var test = require('tape'); var _ = require('lodash'); var algoliasearchHelper = require('../../index'); var emptyClient = {}; -test('Adding refinments should add an entry to the refinments attribute', function(t) { +test('Adding refinements should add an entry to the refinements attribute', function() { var facetName = 'facet1'; var facetValue = '42'; @@ -14,82 +13,73 @@ test('Adding refinments should add an entry to the refinments attribute', functi facets: [facetName] }); - t.ok(_.isEmpty(helper.state.facetsRefinements), 'should be empty at first'); + expect(_.isEmpty(helper.state.facetsRefinements)).toBeTruthy(); helper.addRefine(facetName, facetValue); - t.ok(_.size(helper.state.facetsRefinements) === 1, 'when adding a refinment, should have one'); - t.deepEqual(helper.state.facetsRefinements.facet1, [facetValue]); + expect(_.size(helper.state.facetsRefinements) === 1).toBeTruthy(); + expect(helper.state.facetsRefinements.facet1).toEqual([facetValue]); helper.addRefine(facetName, facetValue); - t.ok(_.size(helper.state.facetsRefinements) === 1, 'when adding the same, should still be one'); + expect(_.size(helper.state.facetsRefinements) === 1).toBeTruthy(); helper.removeRefine(facetName, facetValue); - t.ok(_.size(helper.state.facetsRefinements) === 0, 'Then empty '); - t.end(); + expect(_.size(helper.state.facetsRefinements) === 0).toBeTruthy(); }); -test('Adding several refinements for a single attribute should be handled', function(t) { +test('Adding several refinements for a single attribute should be handled', function() { var facetName = 'facet'; var helper = algoliasearchHelper(emptyClient, null, { facets: [facetName] }); - t.ok(_.isEmpty(helper.state.facetsRefinements), 'empty'); + expect(_.isEmpty(helper.state.facetsRefinements)).toBeTruthy(); helper.addRefine(facetName, 'value1'); - t.ok(_.size(helper.state.facetsRefinements[facetName]) === 1, 'Adding one refinement, should have one'); + expect(_.size(helper.state.facetsRefinements[facetName]) === 1).toBeTruthy(); helper.addRefine(facetName, 'value2'); - t.ok(_.size(helper.state.facetsRefinements[facetName]) === 2, 'Adding another refinement, should have two'); + expect(_.size(helper.state.facetsRefinements[facetName]) === 2).toBeTruthy(); helper.addRefine(facetName, 'value1'); - t.ok(_.size(helper.state.facetsRefinements[facetName]) === 2, 'Adding same refinement as the first, should have two'); - - t.end(); + expect(_.size(helper.state.facetsRefinements[facetName]) === 2).toBeTruthy(); }); -test('Toggling several refinements for a single attribute should be handled', function(t) { +test('Toggling several refinements for a single attribute should be handled', function() { var facetName = 'facet'; var helper = algoliasearchHelper(emptyClient, null, { facets: [facetName] }); - t.ok(_.isEmpty(helper.state.facetsRefinements), 'empty'); + expect(_.isEmpty(helper.state.facetsRefinements)).toBeTruthy(); helper.toggleRefine(facetName, 'value1'); - t.ok(_.size(helper.state.facetsRefinements[facetName]) === 1, 'Adding one refinement, should have one'); + expect(_.size(helper.state.facetsRefinements[facetName]) === 1).toBeTruthy(); helper.toggleRefine(facetName, 'value2'); - t.ok(_.size(helper.state.facetsRefinements[facetName]) === 2, 'Adding another refinement, should have two'); + expect(_.size(helper.state.facetsRefinements[facetName]) === 2).toBeTruthy(); helper.toggleRefine(facetName, 'value1'); - t.ok(_.size(helper.state.facetsRefinements[facetName]) === 1, 'Adding same refinement as the first, should have two'); - t.deepEqual(helper.state.facetsRefinements[facetName], ['value2'], 'should contain value2'); - - t.end(); + expect(_.size(helper.state.facetsRefinements[facetName]) === 1).toBeTruthy(); + expect(helper.state.facetsRefinements[facetName]).toEqual(['value2']); }); -test('Using toggleRefine on a non specified facet should throw an exception', function(t) { +test('Using toggleRefine on a non specified facet should throw an exception', function() { var helper = algoliasearchHelper(emptyClient, null, {}); - t.throws(_.partial(helper.toggleRefine, 'unknown', 'value')); - - t.end(); + expect(_.partial(helper.toggleRefine, 'unknown', 'value')).toThrow(); }); -test('Removing several refinements for a single attribute should be handled', function(t) { +test('Removing several refinements for a single attribute should be handled', function() { var facetName = 'facet'; var helper = algoliasearchHelper(emptyClient, null, { facets: [facetName] }); - t.ok(_.isEmpty(helper.state.facetsRefinements), 'empty'); + expect(_.isEmpty(helper.state.facetsRefinements)).toBeTruthy(); helper.addRefine(facetName, 'value1'); helper.addRefine(facetName, 'value2'); helper.addRefine(facetName, 'value3'); - t.ok(_.size(helper.state.facetsRefinements[facetName]) === 3, 'Adding another refinement, should have two'); + expect(_.size(helper.state.facetsRefinements[facetName]) === 3).toBeTruthy(); helper.removeRefine(facetName, 'value2'); - t.ok(_.size(helper.state.facetsRefinements[facetName]) === 2, 'Adding same refinement as the first, should have two'); - t.deepEqual(helper.state.facetsRefinements[facetName], ['value1', 'value3'], 'should contain value1 and value3'); - - t.end(); + expect(_.size(helper.state.facetsRefinements[facetName]) === 2).toBeTruthy(); + expect(helper.state.facetsRefinements[facetName]).toEqual(['value1', 'value3']); }); -test('isDisjunctiveRefined', function(t) { +test('isDisjunctiveRefined', function() { var facet = 'MyFacet'; var helper = algoliasearchHelper(emptyClient, null, { @@ -98,58 +88,50 @@ test('isDisjunctiveRefined', function(t) { var value = 'MyValue'; - t.equal(helper.isDisjunctiveRefined(facet, value), false, - 'isDisjunctiveRefined should return false for when no refinement for facet'); + expect(helper.isDisjunctiveRefined(facet, value)).toBe(false); helper.addDisjunctiveRefine(facet, value); - t.equal(helper.isDisjunctiveRefined(facet, value), true, - 'isDisjunctiveRefined should be true when facet is refined'); + expect(helper.isDisjunctiveRefined(facet, value)).toBe(true); helper.removeDisjunctiveRefine(facet, value); - t.equal(helper.isDisjunctiveRefined(facet, value), false, - 'isDisjunctiveRefined should return false when refinement was removed'); - t.end(); + expect(helper.isDisjunctiveRefined(facet, value)).toBe(false); }); -test('IsRefined should return true if the (facet, value ) is refined.', function(t) { +test('IsRefined should return true if the (facet, value ) is refined.', function() { var helper = algoliasearchHelper(emptyClient, null, { facets: ['facet1'] }); helper.addRefine('facet1', 'boom'); - t.equal(helper.isRefined('facet1', 'boom'), true, 'the facet + value is refined >> true'); - - t.equal(helper.isRefined('facet1', 'booohh'), false, 'value not refined but is a facet'); - t.throws(_.bind(helper.isRefined, helper, 'notAFacet', 'maoooh'), 'should throw as it is not a facet'); - t.throws(_.bind(helper.isRefined, helper, null, null), 'not valid values'); + expect(helper.isRefined('facet1', 'boom')).toBe(true); - t.end(); + expect(helper.isRefined('facet1', 'booohh')).toBe(false); + expect(_.bind(helper.isRefined, helper, 'notAFacet', 'maoooh')).toThrow(); + expect(_.bind(helper.isRefined, helper, null, null)).toThrow(); }); -test('isRefined(facet)/hasRefinements should return true if the facet is refined.', function(t) { +test('isRefined(facet)/hasRefinements should return true if the facet is refined.', function() { var helper = algoliasearchHelper(emptyClient, null, { facets: ['facet1'] }); - t.equal(helper.isRefined('facet1'), false, 'the facet is not refined yet >> false'); - t.equal(helper.hasRefinements('facet1'), false, 'the facet is not refined yet >> false'); + expect(helper.isRefined('facet1')).toBe(false); + expect(helper.hasRefinements('facet1')).toBe(false); helper.addRefine('facet1', 'boom'); - t.equal(helper.isRefined('facet1'), true, 'the facet is refined >> true'); - t.equal(helper.hasRefinements('facet1'), true, 'the facet is refined >> true'); + expect(helper.isRefined('facet1')).toBe(true); + expect(helper.hasRefinements('facet1')).toBe(true); - t.throws(_.bind(helper.isRefined, helper, 'notAFacet'), 'not a facet'); + expect(_.bind(helper.isRefined, helper, 'notAFacet')).toThrow(); // in complete honesty we should be able to detect numeric facets but we can't // t.throws(helper.hasRefinements.bind(helper, 'notAFacet'), 'not a facet'); - t.throws(_.bind(helper.isRefined, null), 'not even valid values'); - t.throws(_.bind(helper.hasRefinements, null), 'not even valid values'); - - t.end(); + expect(_.bind(helper.isRefined, null)).toThrow(); + expect(_.bind(helper.hasRefinements, null)).toThrow(); }); -test('getRefinements should return all the refinements for a given facet', function(t) { +test('getRefinements should return all the refinements for a given facet', function() { var helper = algoliasearchHelper(emptyClient, null, { facets: ['facet1'], disjunctiveFacets: ['facet2', 'sales'] @@ -167,107 +149,91 @@ test('getRefinements should return all the refinements for a given facet', funct helper.addNumericRefinement('sales', '>', '3') .addNumericRefinement('sales', '<', '9'); - t.deepEqual(helper.getRefinements('facet1'), - [ - {value: 'val1', type: 'conjunctive'}, - {value: 'val2', type: 'conjunctive'}, - {value: 'val3', type: 'conjunctive'}, - {value: 'val-1', type: 'exclude'} - ], - ''); - - t.deepEqual(helper.getRefinements('facet2'), - [ - {value: 'val4', type: 'disjunctive'}, - {value: 'val5', type: 'disjunctive'}, - {value: 'val6', type: 'disjunctive'} - ], - ''); - - t.deepEqual(helper.getRefinements('sales'), - [ - {value: [3], operator: '>', type: 'numeric'}, - {value: [9], operator: '<', type: 'numeric'} - ], - ''); - - t.end(); + expect(helper.getRefinements('facet1')).toEqual([ + {value: 'val1', type: 'conjunctive'}, + {value: 'val2', type: 'conjunctive'}, + {value: 'val3', type: 'conjunctive'}, + {value: 'val-1', type: 'exclude'} + ]); + + expect(helper.getRefinements('facet2')).toEqual([ + {value: 'val4', type: 'disjunctive'}, + {value: 'val5', type: 'disjunctive'}, + {value: 'val6', type: 'disjunctive'} + ]); + + expect(helper.getRefinements('sales')).toEqual([ + {value: [3], operator: '>', type: 'numeric'}, + {value: [9], operator: '<', type: 'numeric'} + ]); }); -test('getRefinements should return an empty array if the facet has no refinement', function(t) { +test('getRefinements should return an empty array if the facet has no refinement', function() { var helper = algoliasearchHelper(emptyClient, null, { facets: ['facet1'], disjunctiveFacets: ['facet2'] }); - t.deepEqual(helper.getRefinements('facet1'), [], ''); - t.deepEqual(helper.getRefinements('facet2'), [], ''); - - t.end(); + expect(helper.getRefinements('facet1')).toEqual([]); + expect(helper.getRefinements('facet2')).toEqual([]); }); -test('[Conjunctive] Facets should be resilient to user attempt to use numbers', function(t) { +test('[Conjunctive] Facets should be resilient to user attempt to use numbers', function() { var helper = algoliasearchHelper(emptyClient, null, { facets: ['facet1'], disjunctiveFacets: ['facet2'] }); helper.addRefine('facet1', 42); - t.equal(helper.isRefined('facet1', 42), true, '[facet][number] should be refined'); - t.equal(helper.isRefined('facet1', '42'), true, '[facet][string] should be refined'); + expect(helper.isRefined('facet1', 42)).toBe(true); + expect(helper.isRefined('facet1', '42')).toBe(true); var stateWithFacet1and42 = helper.state; helper.removeRefine('facet1', '42'); - t.equal(helper.isRefined('facet1', '42'), false, '[facet][string] should not be refined'); + expect(helper.isRefined('facet1', '42')).toBe(false); helper.setState(stateWithFacet1and42); helper.removeRefine('facet1', 42); - t.equal(helper.isRefined('facet1', 42), false, '[facet][number] should not be refined'); - - t.end(); + expect(helper.isRefined('facet1', 42)).toBe(false); }); -test('[Disjunctive] Facets should be resilient to user attempt to use numbers', function(t) { +test('[Disjunctive] Facets should be resilient to user attempt to use numbers', function() { var helper = algoliasearchHelper(emptyClient, null, { facets: ['facet1'], disjunctiveFacets: ['facet2'] }); helper.addExclude('facet1', 42); - t.equal(helper.isExcluded('facet1', 42), true, '[facet][number] should be refined'); - t.equal(helper.isExcluded('facet1', '42'), true, '[facet][string] should be refined'); + expect(helper.isExcluded('facet1', 42)).toBe(true); + expect(helper.isExcluded('facet1', '42')).toBe(true); var stateWithFacet1Without42 = helper.state; helper.removeExclude('facet1', '42'); - t.equal(helper.isExcluded('facet1', '42'), false, '[facet][string] should not be refined'); + expect(helper.isExcluded('facet1', '42')).toBe(false); helper.setState(stateWithFacet1Without42); helper.removeExclude('facet1', 42); - t.equal(helper.isExcluded('facet1', 42), false, '[facet][number] should not be refined'); - - t.end(); + expect(helper.isExcluded('facet1', 42)).toBe(false); }); -test('[Disjunctive] Facets should be resilient to user attempt to use numbers', function(t) { +test('[Disjunctive] Facets should be resilient to user attempt to use numbers', function() { var helper = algoliasearchHelper(emptyClient, null, { facets: ['facet1'], disjunctiveFacets: ['facet2'] }); helper.addDisjunctiveRefine('facet2', 42); - t.equal(helper.isDisjunctiveRefined('facet2', 42), true, '[facet][number] should be refined'); - t.equal(helper.isDisjunctiveRefined('facet2', '42'), true, '[facet][string] should be refined'); + expect(helper.isDisjunctiveRefined('facet2', 42)).toBe(true); + expect(helper.isDisjunctiveRefined('facet2', '42')).toBe(true); var stateWithFacet2and42 = helper.state; helper.removeDisjunctiveRefine('facet2', '42'); - t.equal(helper.isDisjunctiveRefined('facet2', '42'), false, '[facet][string] should not be refined'); + expect(helper.isDisjunctiveRefined('facet2', '42')).toBe(false); helper.setState(stateWithFacet2and42); helper.removeDisjunctiveRefine('facet2', 42); - t.equal(helper.isDisjunctiveRefined('facet2', 42), false, '[facet][number] should not be refined'); - - t.end(); + expect(helper.isDisjunctiveRefined('facet2', 42)).toBe(false); }); diff --git a/test/spec/requestBuilder.js b/test/spec/requestBuilder.js index 2a8f087dc..74d94df5d 100644 --- a/test/spec/requestBuilder.js +++ b/test/spec/requestBuilder.js @@ -1,59 +1,48 @@ 'use strict'; -var test = require('tape'); - var requestBuilder = require('../../src/requestBuilder.js'); var getQueries = requestBuilder._getQueries; -test('The request builder should set analytics to subsequent queries', function(t) { - var testData = require('./search.testdata.js')(); +test('The request builder should set analytics to subsequent queries', function() { + var testData = require('../datasets/SearchParameters/search.dataset')(); var searchParams = testData.searchParams; searchParams.analytics = true; var queries = getQueries(searchParams.index, searchParams); - t.equal(queries.length, 2); - t.equal(queries[0].params.analytics, true, 'the parameter analytics should not be defined on the first query'); - t.equal(queries[1].params.analytics, false, 'the parameter analytics should be set to false on the second query'); - - t.end(); + expect(queries.length).toBe(2); + expect(queries[0].params.analytics).toBe(true); + expect(queries[1].params.analytics).toBe(false); }); -test('The request builder should set clickAnalytics to subsequent queries', function(t) { - var testData = require('./search.testdata.js')(); +test('The request builder should set clickAnalytics to subsequent queries', function() { + var testData = require('../datasets/SearchParameters/search.dataset')(); var searchParams = testData.searchParams; searchParams.clickAnalytics = true; var queries = getQueries(searchParams.index, searchParams); - t.equal(queries.length, 2); - t.equal(queries[0].params.clickAnalytics, true, 'the parameter clickAnalytics should be defined on the first query'); - t.equal(queries[1].params.clickAnalytics, false, 'the parameter clickAnalytics should be set to false on the second query'); - - t.end(); + expect(queries.length).toBe(2); + expect(queries[0].params.clickAnalytics).toBe(true); + expect(queries[1].params.clickAnalytics).toBe(false); }); -test('The request builder should should force analytics to false on subsequent queries if not specified', function(t) { - var testData = require('./search.testdata.js')(); +test('The request builder should should force analytics to false on subsequent queries if not specified', function() { + var testData = require('../datasets/SearchParameters/search.dataset')(); var searchParams = testData.searchParams; var queries = getQueries(searchParams.index, searchParams); - t.equal(queries.length, 2); - t.equal(queries[0].params.analytics, undefined, 'the parameter analytics should not be defined on the first query'); - t.equal(queries[1].params.analytics, false, 'the parameter analytics should be set to false on the second query'); - - t.end(); + expect(queries.length).toBe(2); + expect(queries[0].params.analytics).toBe(undefined); + expect(queries[1].params.analytics).toBe(false); }); -test('The request builder should should force clickAnalytics to false on subsequent queries if not specified', function(t) { - var testData = require('./search.testdata.js')(); +test('The request builder should should force clickAnalytics to false on subsequent queries if not specified', function() { + var testData = require('../datasets/SearchParameters/search.dataset')(); var searchParams = testData.searchParams; var queries = getQueries(searchParams.index, searchParams); - t.equal(queries.length, 2); - t.equal(queries[0].params.clickAnalytics, undefined, 'the parameter clickAnalytics should be defined on the first query'); - t.equal(queries[1].params.clickAnalytics, false, 'the parameter clickAnalytics should be set to false on the second query'); - - t.end(); + expect(queries.length).toBe(2); + expect(queries[0].params.clickAnalytics).toBe(undefined); + expect(queries[1].params.clickAnalytics).toBe(false); }); - diff --git a/test/spec/search.js b/test/spec/search.js index 226cad62b..994568253 100644 --- a/test/spec/search.js +++ b/test/spec/search.js @@ -1,18 +1,15 @@ 'use strict'; -var test = require('tape'); -var sinon = require('sinon'); -var algoliaSearch = require('algoliasearch'); - var algoliasearchHelper = require('../../index'); -test('Search should call the algolia client according to the number of refinements', function(t) { - var testData = require('./search.testdata.js')(); - - var client = algoliaSearch('dsf', 'dsfdf'); - var mock = sinon.mock(client); +test('Search should call the algolia client according to the number of refinements', function(done) { + var testData = require('../datasets/SearchParameters/search.dataset')(); - mock.expects('search').once().resolves(testData.response); + var client = { + search: jest.fn().mockImplementationOnce(function() { + return Promise.resolve(testData.response); + }) + }; var helper = algoliasearchHelper(client, 'test_hotels-node', { disjunctiveFacets: ['city'] @@ -23,11 +20,7 @@ test('Search should call the algolia client according to the number of refinemen helper.on('result', function(data) { // shame deepclone, to remove any associated methods coming from the results - t.deepEqual( - JSON.parse(JSON.stringify(data)), - JSON.parse(JSON.stringify(testData.responseHelper)), - 'should be equal' - ); + expect(JSON.parse(JSON.stringify(data))).toEqual(JSON.parse(JSON.stringify(testData.responseHelper))); var cityValues = data.getFacetValues('city'); var expectedCityValues = [ @@ -36,10 +29,7 @@ test('Search should call the algolia client according to the number of refinemen {name: 'San Francisco', count: 1, isRefined: false} ]; - t.deepEqual( - cityValues, - expectedCityValues, - 'Facet values for "city" should be correctly ordered using the default sort'); + expect(cityValues).toEqual(expectedCityValues); var cityValuesCustom = data.getFacetValues('city', {sortBy: ['count:asc', 'name:asc']}); var expectedCityValuesCustom = [ @@ -49,10 +39,7 @@ test('Search should call the algolia client according to the number of refinemen ]; - t.deepEqual( - cityValuesCustom, - expectedCityValuesCustom, - 'Facet values for "city" should be correctly ordered using a custom sort'); + expect(cityValuesCustom).toEqual(expectedCityValuesCustom); var cityValuesFn = data.getFacetValues('city', {sortBy: function(a, b) { return a.count - b.count; }}); var expectedCityValuesFn = [ @@ -61,32 +48,31 @@ test('Search should call the algolia client according to the number of refinemen {name: 'Paris', count: 3, isRefined: true} ]; - t.deepEqual( - cityValuesFn, - expectedCityValuesFn, - 'Facet values for "city" should be correctly ordered using a sort function'); + expect(cityValuesFn).toEqual(expectedCityValuesFn); + + expect(client.search).toHaveBeenCalledTimes(1); - var queries = mock.expectations.search[0].args[0][0]; + var queries = client.search.mock.calls[0][0]; for (var i = 0; i < queries.length; i++) { var query = queries[i]; - t.equal(query.query, undefined); - t.equal(query.params.query, ''); + expect(query.query).toBe(undefined); + expect(query.params.query).toBe(''); } - t.ok(mock.verify(), 'Mock constraints should be verified!'); - t.end(); + done(); }); helper.search(''); }); -test('Search should not mutate the original client response', function(t) { - var testData = require('./search.testdata.js')(); +test('Search should not mutate the original client response', function(done) { + var testData = require('../datasets/SearchParameters/search.dataset')(); - var client = algoliaSearch('dsf', 'dsfdf'); - var mock = sinon.mock(client); - - mock.expects('search').once().resolves(testData.response); + var client = { + search: jest.fn().mockImplementationOnce(function() { + return Promise.resolve(testData.response); + }) + }; var helper = algoliasearchHelper(client, 'test_hotels-node'); @@ -95,25 +81,26 @@ test('Search should not mutate the original client response', function(t) { helper.on('result', function() { var currentResponseLength = testData.response.results.length; - t.equal(currentResponseLength, originalResponseLength); + expect(currentResponseLength).toBe(originalResponseLength); - t.end(); + done(); }); helper.search(''); }); -test('no mutating methods should trigger a search', function(t) { - var client = algoliaSearch('dsf', 'dsfdf'); - sinon.mock(client); +test('no mutating methods should trigger a search', function() { + var client = { + search: jest.fn().mockImplementationOnce(function() { + return new Promise(function() {}); + }) + }; var helper = algoliasearchHelper(client, 'Index', { disjunctiveFacets: ['city'], facets: ['tower'] }); - var stubbedSearch = sinon.stub(helper, '_search'); - helper.setQuery(''); helper.clearRefinements(); helper.addDisjunctiveRefine('city', 'Paris'); @@ -123,11 +110,9 @@ test('no mutating methods should trigger a search', function(t) { helper.addRefine('tower', 'Empire State Building'); helper.removeRefine('tower', 'Empire State Building'); - t.equal(stubbedSearch.callCount, 0, 'should not have triggered calls'); + expect(client.search).toHaveBeenCalledTimes(0); helper.search(); - t.equal(stubbedSearch.callCount, 1, 'should have triggered a single search'); - - t.end(); + expect(client.search).toHaveBeenCalledTimes(1); }); diff --git a/test/spec/url.js b/test/spec/url.js index c11439ab9..d68837e09 100644 --- a/test/spec/url.js +++ b/test/spec/url.js @@ -1,11 +1,10 @@ 'use strict'; -var test = require('tape'); var algoliasearchHelper = require('../../index'); var fakeClient = {}; -test('getStateFromQueryString should parse insideBoundingBox as float georects and be consistent with the state', function(t) { +test('getStateFromQueryString should parse insideBoundingBox as float georects and be consistent with the state', function() { var index = 'indexNameInTheHelper'; var helper = algoliasearchHelper(fakeClient, index, { insideBoundingBox: [[51.1241999, 9.662499900000057, 41.3253001, -5.559099999999944]] @@ -17,14 +16,10 @@ test('getStateFromQueryString should parse insideBoundingBox as float georects a queryString ); - t.deepEquals( - partialStateFromQueryString.insideBoundingBox, - helper.state.insideBoundingBox, - 'insideBoundingBox should be consistent through query string serialization/deserialization'); - t.end(); + expect(partialStateFromQueryString.insideBoundingBox).toEqual(helper.state.insideBoundingBox); }); -test('getStateFromQueryString should parse insideBoundingBox as float georects and be consistent with the state', function(t) { +test('getStateFromQueryString should parse insideBoundingBox as float georects and be consistent with the state', function() { var index = 'indexNameInTheHelper'; var helper = algoliasearchHelper(fakeClient, index, { insideBoundingBox: '51.1241999,9.662499900000057,41.3253001,-5.559099999999944' @@ -36,9 +31,5 @@ test('getStateFromQueryString should parse insideBoundingBox as float georects a queryString ); - t.deepEquals( - partialStateFromQueryString.insideBoundingBox, - helper.state.insideBoundingBox, - 'insideBoundingBox should be consistent through query string serialization/deserialization'); - t.end(); + expect(partialStateFromQueryString.insideBoundingBox).toEqual(helper.state.insideBoundingBox); }); diff --git a/yarn.lock b/yarn.lock index fb49c6237..a69e6a26f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,18 +2,325 @@ # yarn lockfile v1 -"@sinonjs/formatio@^2.0.0": - version "2.0.0" - resolved "http://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2" - integrity sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg== +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.1.0": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.3.tgz#198d6d3af4567be3989550d97e068de94503074f" + integrity sha512-oDpASqKFlbspQfzAE7yaeTmdljSH2ADIvBlb0RwbStltTuWa0+7CCI1fYVINNv9saHPa1W7oaKeuNuKj+RQCvA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helpers" "^7.4.3" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.0.0", "@babel/generator@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.0.tgz#c230e79589ae7a729fd4631b9ded4dc220418196" + integrity sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ== + dependencies: + "@babel/types" "^7.4.0" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-split-export-declaration@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz#571bfd52701f492920d63b7f735030e9a3e10b55" + integrity sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw== + dependencies: + "@babel/types" "^7.4.0" + +"@babel/helpers@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.3.tgz#7b1d354363494b31cb9a2417ae86af32b7853a3b" + integrity sha512-BMh7X0oZqb36CfyhvtbSmcWc3GXocfxv3yNsAEuM0l+fAqSO22rQrUpijr3oE/10jCTrB6/0b9kzmG4VetCj8Q== + dependencies: + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.0", "@babel/parser@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.3.tgz#eb3ac80f64aa101c907d4ce5406360fe75b7895b" + integrity sha512-gxpEUhTS1sGA63EGQGuA+WESPR/6tz6ng7tSHFCmaTJK/cGK8y37cBTspX+U2xCAue2IQVvF6Z0oigmjwD8YGQ== + +"@babel/plugin-syntax-object-rest-spread@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.0.tgz#12474e9c077bae585c5d835a95c0b0b790c25c8b" + integrity sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.0" + "@babel/types" "^7.4.0" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.3.tgz#1a01f078fc575d589ff30c0f71bf3c3d9ccbad84" + integrity sha512-HmA01qrtaCwwJWpSKpA948cBvU5BrmviAief/b3AVw936DtcdsTexlbyzNuDnthwhOQ37xshn7hvQaEQk7ISYQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/types" "^7.4.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0": + version "7.4.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" + integrity sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@jest/console@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" + integrity sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg== + dependencies: + "@jest/source-map" "^24.3.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.7.1.tgz#6707f50db238d0c5988860680e2e414df0032024" + integrity sha512-ivlZ8HX/FOASfHcb5DJpSPFps8ydfUYzLZfgFFqjkLijYysnIEOieg72YRhO4ZUB32xu40hsSMmaw+IGYeKONA== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.7.0" + jest-config "^24.7.1" + jest-haste-map "^24.7.1" + jest-message-util "^24.7.1" + jest-regex-util "^24.3.0" + jest-resolve-dependencies "^24.7.1" + jest-runner "^24.7.1" + jest-runtime "^24.7.1" + jest-snapshot "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + jest-watcher "^24.7.1" + micromatch "^3.1.10" + p-each-series "^1.0.0" + pirates "^4.0.1" + realpath-native "^1.1.0" + rimraf "^2.5.4" + strip-ansi "^5.0.0" + +"@jest/environment@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.7.1.tgz#9b9196bc737561f67ac07817d4c5ece772e33135" + integrity sha512-wmcTTYc4/KqA+U5h1zQd5FXXynfa7VGP2NfF+c6QeGJ7c+2nStgh65RQWNX62SC716dTtqheTRrZl0j+54oGHw== + dependencies: + "@jest/fake-timers" "^24.7.1" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + jest-mock "^24.7.0" + +"@jest/fake-timers@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.7.1.tgz#56e5d09bdec09ee81050eaff2794b26c71d19db2" + integrity sha512-4vSQJDKfR2jScOe12L9282uiwuwQv9Lk7mgrCSZHA9evB9efB/qx8i0KJxsAKtp8fgJYBJdYY7ZU6u3F4/pyjA== + dependencies: + "@jest/types" "^24.7.0" + jest-message-util "^24.7.1" + jest-mock "^24.7.0" + +"@jest/reporters@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.7.1.tgz#38ac0b096cd691bbbe3051ddc25988d42e37773a" + integrity sha512-bO+WYNwHLNhrjB9EbPL4kX/mCCG4ZhhfWmO3m4FSpbgr7N83MFejayz30kKjgqr7smLyeaRFCBQMbXpUgnhAJw== + dependencies: + "@jest/environment" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-api "^2.1.1" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-source-maps "^3.0.1" + jest-haste-map "^24.7.1" + jest-resolve "^24.7.1" + jest-runtime "^24.7.1" + jest-util "^24.7.1" + jest-worker "^24.6.0" + node-notifier "^5.2.1" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0": + version "24.3.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28" + integrity sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.7.1.tgz#19eacdb29a114300aed24db651e5d975f08b6bbe" + integrity sha512-3U7wITxstdEc2HMfBX7Yx3JZgiNBubwDqQMh+BXmZXHa3G13YWF3p6cK+5g0hGkN3iufg/vGPl3hLxQXD74Npg== + dependencies: + "@jest/console" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.7.1.tgz#9c18e428e1ad945fa74f6233a9d35745ca0e63e0" + integrity sha512-84HQkCpVZI/G1zq53gHJvSmhUer4aMYp9tTaffW28Ih5OxfCg8hGr3nTSbL1OhVDRrFZwvF+/R9gY6JRkDUpUA== + dependencies: + "@jest/test-result" "^24.7.1" + jest-haste-map "^24.7.1" + jest-runner "^24.7.1" + jest-runtime "^24.7.1" + +"@jest/transform@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.7.1.tgz#872318f125bcfab2de11f53b465ab1aa780789c2" + integrity sha512-EsOUqP9ULuJ66IkZQhI5LufCHlTbi7hrcllRMUEV/tOgqBVQi93+9qEvkX0n8mYpVXQ8VjwmICeRgg58mrtIEw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.7.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.7.1" + jest-regex-util "^24.3.0" + jest-util "^24.7.1" + micromatch "^3.1.10" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.7.0": + version "24.7.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.7.0.tgz#c4ec8d1828cdf23234d9b4ee31f5482a3f04f48b" + integrity sha512-ipJUa2rFWiKoBqMKP63Myb6h9+iT3FHRTF2M8OR6irxWzItisa8i4dcSg14IbvmXUnBlHBlUQPYUHWyX3UPpYA== dependencies: - samsam "1.3.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/yargs" "^12.0.9" "@types/babel-types@*", "@types/babel-types@^7.0.0": version "7.0.4" resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.4.tgz#bfd5b0d0d1ba13e351dff65b6e52783b816826c8" integrity sha512-WiZhq3SVJHFRgRYLXvpf65XnV6ipVHhnNaNvE8yCimejrGglkg38kEj0JcizqwSHxmPSjcTlig/6JouxLGEhGw== +"@types/babel__core@^7.1.0": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.1.tgz#ce9a9e5d92b7031421e1d0d74ae59f572ba48be6" + integrity sha512-+hjBtgcFPYyCTo0A15+nxrCVJL7aC6Acg87TXd5OW3QhHswdrOLoles+ldL2Uk8q++7yIfl4tURtztccdeeyOw== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" + integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.6.tgz#328dd1a8fc4cfe3c8458be9477b219ea158fd7b2" + integrity sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw== + dependencies: + "@babel/types" "^7.3.0" + "@types/babylon@^6.16.2": version "6.16.3" resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.3.tgz#c2937813a89fcb5e79a00062fc4a8b143e7237bb" @@ -21,6 +328,21 @@ dependencies: "@types/babel-types" "*" +"@types/istanbul-lib-coverage@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.0.tgz#1eb8c033e98cf4e1a4cedcaf8bcafe8cb7591e85" + integrity sha512-eAtOAFZefEnfJiRFQBGw1eYqa5GTLCZ1y86N0XSI/D6EB+E8z6VPV/UL7Gi5UEclFqoQk+6NRqEDsfmDLXn8sg== + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/yargs@^12.0.2", "@types/yargs@^12.0.9": + version "12.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" + integrity sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw== + CSSselect@~0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/CSSselect/-/CSSselect-0.4.1.tgz#f8ab7e1f8418ce63cda6eb7bd778a85d7ec492b2" @@ -47,6 +369,11 @@ JSONStream@^1.0.3, JSONStream@^1.0.4: jsonparse "^1.2.0" through ">=2.2.7 <3" +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + abbrev@1, abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" @@ -87,6 +414,14 @@ acorn-globals@^3.0.0: dependencies: acorn "^4.0.4" +acorn-globals@^4.1.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.2.tgz#4e2c2313a597fd589720395f6354b41cd5ec8006" + integrity sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" @@ -94,6 +429,11 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" +acorn-walk@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + acorn@^3.0.0, acorn@^3.0.4, acorn@^3.1.0, acorn@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" @@ -109,6 +449,16 @@ acorn@^5.0.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" integrity sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw== +acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== + add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" @@ -235,7 +585,7 @@ ansi-escapes@^1.1.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= -ansi-escapes@^3.1.0: +ansi-escapes@^3.0.0, ansi-escapes@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -267,6 +617,11 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + ansi-styles@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" @@ -277,7 +632,7 @@ ansi-styles@^2.2.1: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -307,6 +662,14 @@ anymatch@^1.3.0: arrify "^1.0.0" micromatch "^2.1.5" +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + app-usage-stats@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/app-usage-stats/-/app-usage-stats-0.4.1.tgz#97eb9b89b5678fa2ddc9793b1298628cc218429f" @@ -326,6 +689,13 @@ append-buffer@^1.0.2: dependencies: buffer-equal "^1.0.0" +append-transform@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" + integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== + dependencies: + default-require-extensions "^2.0.0" + aproba@^1.0.3: version "1.1.2" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" @@ -405,11 +775,21 @@ arr-diff@^2.0.0: dependencies: arr-flatten "^1.0.1" -arr-flatten@^1.0.1: +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + array-back@^1.0.2, array-back@^1.0.3, array-back@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/array-back/-/array-back-1.0.4.tgz#644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b" @@ -427,6 +807,11 @@ array-each@^1.0.1: resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" @@ -509,6 +894,11 @@ array-unique@^0.2.1: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + arrify@^1.0.0, arrify@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -572,6 +962,16 @@ assert@~1.3.0: dependencies: util "0.10.3" +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + astw@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917" @@ -596,6 +996,11 @@ async-foreach@^0.1.3: resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + async@0.9.x, async@^0.9.0, async@~0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" @@ -627,6 +1032,13 @@ async@^2.5.0: dependencies: lodash "^4.17.10" +async@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + dependencies: + lodash "^4.17.11" + "async@~ 0.2.9", async@~0.2.6, async@~0.2.7, async@~0.2.9: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" @@ -654,6 +1066,11 @@ atoa@1.0.0: resolved "https://registry.yarnpkg.com/atoa/-/atoa-1.0.0.tgz#0cc0e91a480e738f923ebc103676471779b34a49" integrity sha1-DMDpGkgOc4+SPrwQNnZHF3mzSkk= +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + aws-sign2@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63" @@ -910,6 +1327,19 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" +babel-jest@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.7.1.tgz#73902c9ff15a7dfbdc9994b0b17fcefd96042178" + integrity sha512-GPnLqfk8Mtt0i4OemjWkChi73A3ALs4w2/QbG64uAj8b5mmwzxc7jbJVRZt8NJkxi6FopVHog9S3xX6UJKb2qg== + dependencies: + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.6.0" + chalk "^2.4.2" + slash "^2.0.0" + babel-loader@6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca" @@ -934,6 +1364,22 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" +babel-plugin-istanbul@^5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.3.tgz#202d20ffc96a821c68a3964412de75b9bdeb48c7" + integrity sha512-IFyehbvRRwdBlI1lDp+FaMsWNnEndEk7065IB8NhzBX+ZKLPwPodgk4I5Gobw/8SNUUzso2Dv3hbqRh88eiSCQ== + dependencies: + find-up "^3.0.0" + istanbul-lib-instrument "^3.2.0" + test-exclude "^5.2.2" + +babel-plugin-jest-hoist@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz#f7f7f7ad150ee96d7a5e8e2c5da8319579e78019" + integrity sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w== + dependencies: + "@types/babel__traverse" "^7.0.6" + 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" @@ -1247,6 +1693,14 @@ babel-preset-es2015@6.24.1, babel-preset-es2015@^6.22.0: babel-plugin-transform-es2015-unicode-regex "^6.24.1" babel-plugin-transform-regenerator "^6.24.1" +babel-preset-jest@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz#66f06136eefce87797539c0d63f1769cc3915984" + integrity sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.6.0" + babel-register@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" @@ -1381,11 +1835,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -base64-js@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" - integrity sha1-EQHpVE9KdrG8OybUUsqW16NeeXg= - base64-js@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" @@ -1396,6 +1845,19 @@ base64url@^2.0.0: resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" integrity sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs= +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + batch@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.0.tgz#fd2e05a7a5d696b4db9314013e285d8ff3557ec3" @@ -1418,19 +1880,6 @@ beeper@^1.0.0: resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak= -bench@0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/bench/-/bench-0.3.6.tgz#2f204bd2c0e3cc71c3ab4b6a0adbbc5c0ecad096" - integrity sha1-LyBL0sDjzHHDq0tqCtu8XA7K0JY= - -benchmark@2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" - integrity sha1-CfPeMckWQl1JjMLuVloOvzwqVik= - dependencies: - lodash "^4.17.4" - platform "^1.3.3" - big.js@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" @@ -1456,13 +1905,6 @@ bl@^0.9.0, bl@~0.9.0: dependencies: readable-stream "~1.0.26" -bl@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" - integrity sha1-/cqHGplxOqANGeO7ukHER4emU5g= - dependencies: - readable-stream "~2.0.5" - bl@~1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" @@ -1604,6 +2046,22 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -1620,6 +2078,11 @@ browser-pack@^6.0.1: through2 "^2.0.0" umd "^3.0.0" +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + browser-resolve@^1.11.0, browser-resolve@^1.7.0: version "1.11.2" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" @@ -1627,6 +2090,13 @@ browser-resolve@^1.11.0, browser-resolve@^1.7.0: dependencies: resolve "1.1.7" +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + browserify-aes@0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-0.4.0.tgz#067149b668df31c4b58533e02d01e806d8608e2c" @@ -1879,21 +2349,28 @@ browzers@1.3.0: resolved "https://registry.yarnpkg.com/browzers/-/browzers-1.3.0.tgz#386bf71ac7722ccd55b9d6e79ae92d13538c40e5" integrity sha1-OGv3GsdyLM1VudbnmuktE1OMQOU= +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= + dependencies: + node-int64 "^0.4.0" + buffer-crc32@0.2.1, buffer-crc32@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.1.tgz#be3e5382fc02b6d6324956ac1af98aa98b08534c" integrity sha1-vj5TgvwCttYySVasGvmKqYsIU0w= -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - buffer-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + buffer-indexof@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.0.tgz#f54f647c4f4e25228baa656a2e57e43d5f270982" @@ -1904,15 +2381,6 @@ buffer-xor@^1.0.2: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= -buffer@^3.0.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb" - integrity sha1-pyyTb3e5a/UvX357RnGAYoVR3vs= - dependencies: - base64-js "0.0.8" - ieee754 "^1.1.4" - isarray "^1.0.0" - buffer@^4.1.0, buffer@^4.3.0, buffer@^4.9.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" @@ -1945,7 +2413,7 @@ builtin-status-codes@^3.0.0: resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= -bulk-require@1.0.1, bulk-require@^1.0.0: +bulk-require@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bulk-require/-/bulk-require-1.0.1.tgz#cb3d039e698139a444fc574b261d6b3b2cf44c89" integrity sha1-yz0DnmmBOaRE/FdLJh1rOyz0TIk= @@ -1992,6 +2460,21 @@ bytes@2.5.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a" integrity sha1-TJQj6i0lLCcMQbK97+/5u2tiwGo= +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + cache-point@~0.3.3: version "0.3.4" resolved "https://registry.yarnpkg.com/cache-point/-/cache-point-0.3.4.tgz#152db502c6bb23b5aa3f663e230d5de8ec4e4f3f" @@ -2008,6 +2491,11 @@ cached-path-relative@^1.0.0: resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.1.tgz#d09c4b52800aa4c078e2dd81a869aac90d2e54e7" integrity sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc= +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -2036,11 +2524,23 @@ camelcase@^4.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + caniuse-lite@^1.0.30000704: version "1.0.30000704" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000704.tgz#adb6ea01134515663682db93abab291d4c02946b" integrity sha1-rbbqARNFFWY2gtuTq6spHUwClGs= +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + capture-stack-trace@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" @@ -2076,16 +2576,6 @@ catharsis@~0.8.8: dependencies: underscore-contrib "~0.3.0" -caw@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95" - integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA== - dependencies: - get-proxy "^2.0.0" - isurl "^1.0.0-alpha5" - tunnel-agent "^0.6.0" - url-to-options "^1.0.1" - ccount@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.2.tgz#53b6a2f815bb77b9c2871f7b9a72c3a25f1d8e89" @@ -2137,7 +2627,7 @@ chalk@^1.0.0, 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.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2222,11 +2712,21 @@ chokidar@^1.7.0: optionalDependencies: fsevents "^1.0.0" +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + ci-info@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -2240,6 +2740,16 @@ circular-json@^0.3.1: resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + clean-css@^4.1.11: version "4.1.11" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" @@ -2307,6 +2817,15 @@ cliui@^3.0.3, cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" @@ -2418,6 +2937,14 @@ collect-json@1.0.8, collect-json@^1.0.1, collect-json@^1.0.7, collect-json@^1.0. stream-connect "^1.0.2" stream-via "^1.0.3" +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2606,13 +3133,6 @@ commander@~2.17.1: resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== -commander@~2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" - integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= - dependencies: - graceful-readlink ">= 1.0.0" - common-sequence@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/common-sequence/-/common-sequence-1.0.2.tgz#30e07f3f8f6f7f9b3dee854f20b2d39eee086de8" @@ -2631,6 +3151,16 @@ compare-func@^1.3.1: array-ify "^1.0.0" dot-prop "^3.0.0" +compare-versions@^3.2.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" + integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + compress-commons@~0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-0.1.6.tgz#0c740870fde58cba516f0ac0c822e33a0b85dfa3" @@ -2705,14 +3235,6 @@ concat-stream@~1.6.0: readable-stream "^2.2.2" typedarray "^0.0.6" -config-chain@^1.1.11: - version "1.1.11" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" - integrity sha1-q6CXR9++TD5w52am5BWG4YWfxvI= - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - config-master@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/config-master/-/config-master-2.0.4.tgz#e749505c5d3f946f2fad3c76dfe71fca689751dc" @@ -2972,7 +3494,7 @@ convert-source-map@^1.1.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" integrity sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU= -convert-source-map@^1.5.0, convert-source-map@^1.5.1: +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -3009,6 +3531,11 @@ cookiejar@1.3.0: resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-1.3.0.tgz#dd00b35679021e99cbd4e855b9ad041913474765" integrity sha1-3QCzVnkCHpnL1OhVua0EGRNHR2U= +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + copy-props@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-1.6.0.tgz#f0324bbee99771101e7b3ada112f313c393db8ed" @@ -3099,6 +3626,17 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@~4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" @@ -3152,6 +3690,18 @@ crypto-random-string@^1.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.6" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" + integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== + +cssstyle@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077" + integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow== + dependencies: + cssom "0.3.x" + ctype@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" @@ -3190,6 +3740,15 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -3248,13 +3807,20 @@ debug@2.6.7: dependencies: ms "2.0.0" -debug@^2.6.9: +debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" +debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + debug@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.0.0.tgz#89bd9df6732b51256bc6705342bba02ed12131ef" @@ -3276,50 +3842,15 @@ debug@~2.2.0: dependencies: ms "0.7.1" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decompress-tar@^4.0.0, decompress-tar@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/decompress-tar/-/decompress-tar-4.1.0.tgz#1f092ab698440558c72fc78e77d246d3ecb453b0" - integrity sha1-HwkqtphEBVjHL8eOd9JG0+y0U7A= - dependencies: - file-type "^3.8.0" - is-stream "^1.1.0" - tar-stream "^1.5.2" - -decompress-tarbz2@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/decompress-tarbz2/-/decompress-tarbz2-4.1.0.tgz#fbab58d5de73f3fd213cac3af1c18334f51cb891" - integrity sha1-+6tY1d5z8/0hPKw68cGDNPUcuJE= - dependencies: - decompress-tar "^4.1.0" - file-type "^3.8.0" - is-stream "^1.1.0" - pify "^2.3.0" - seek-bzip "^1.0.5" - unbzip2-stream "^1.0.9" - -decompress-targz@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/decompress-targz/-/decompress-targz-4.1.0.tgz#475b9c406be621ae836274802d9b25f9913ead59" - integrity sha1-R1ucQGvmIa6DYnSALZsl+ZE+rVk= - dependencies: - decompress-tar "^4.0.0" - file-type "^4.3.0" - is-stream "^1.1.0" - -decompress-unzip@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69" - integrity sha1-3qrM39FK6vhVePczroIQ+bSEj2k= - dependencies: - file-type "^3.8.0" - get-stream "^2.2.0" - pify "^2.3.0" - yauzl "^2.4.2" +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= decompress-zip@^0.3.0: version "0.3.0" @@ -3334,21 +3865,7 @@ decompress-zip@^0.3.0: readable-stream "^1.1.8" touch "0.0.3" -decompress@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d" - integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50= - dependencies: - decompress-tar "^4.0.0" - decompress-tarbz2 "^4.0.0" - decompress-targz "^4.0.0" - decompress-unzip "^4.0.1" - graceful-fs "^4.1.10" - make-dir "^1.0.0" - pify "^2.3.0" - strip-dirs "^2.0.0" - -deep-equal@^1.0.1, deep-equal@~1.0.1: +deep-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= @@ -3378,6 +3895,13 @@ deepmerge@^1.3.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.0.tgz#00bc5b88fd23b8130f9f5049071c3420e07a5465" integrity sha512-Hm4+NyDQGgH3oYhKqR0gd99veBBZpnEUNoEfFl+3PRkQL+LKGJEBgqimeofAWzUn6aBzcaYPJrRigto/WfDzTg== +default-require-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" + integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= + dependencies: + strip-bom "^3.0.0" + defaults@^1.0.0, defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -3398,7 +3922,29 @@ define-properties@^1.1.2: foreach "^2.0.5" object-keys "^1.0.8" -defined@^1.0.0, defined@~1.0.0: +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defined@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= @@ -3500,6 +4046,16 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + detect-node@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" @@ -3513,10 +4069,10 @@ detective@^4.0.0: acorn "^4.0.3" defined "^1.0.0" -diff@^3.1.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff-sequences@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" + integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== diffie-hellman@^5.0.0: version "5.0.2" @@ -3622,6 +4178,13 @@ domelementtype@~1.1.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + domhandler@2.2: version "2.2.1" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.2.1.tgz#59df9dcd227e808b365ae73e1f6684ac3d946fc2" @@ -3673,19 +4236,6 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" -download@5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/download/-/download-5.0.3.tgz#63537f977f99266a30eb8a2a2fbd1f20b8000f7a" - integrity sha1-Y1N/l3+ZJmow64oqL70fILgAD3o= - dependencies: - caw "^2.0.0" - decompress "^4.0.0" - filenamify "^2.0.0" - get-stream "^3.0.0" - got "^6.3.0" - mkdirp "^0.5.1" - pify "^2.3.0" - duplexer2@0.0.2, duplexer2@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" @@ -3705,7 +4255,7 @@ duplexer3@^0.1.4: resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= -duplexer@^0.1.1, duplexer@~0.1.1: +duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= @@ -3884,24 +4434,33 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.5.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c" - integrity sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw= +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.0" - is-callable "^1.1.3" - is-regex "^1.0.3" + is-arrayish "^0.2.1" -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - integrity sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0= +es-abstract@^1.5.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== dependencies: - is-callable "^1.1.1" + is-callable "^1.1.4" is-date-object "^1.0.1" - is-symbol "^1.0.1" + is-symbol "^1.0.2" es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14: version "0.10.24" @@ -3999,6 +4558,18 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" +escodegen@^1.9.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" + integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + escodegen@~0.0.24: version "0.0.28" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-0.0.28.tgz#0e4ff1715f328775d6cab51ac44a406cd7abffd3" @@ -4093,6 +4664,11 @@ esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" @@ -4131,7 +4707,7 @@ estraverse@^1.9.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= @@ -4211,6 +4787,11 @@ evp_bytestokey@^1.0.0: dependencies: create-hash "^1.1.1" +exec-sh@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" + integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -4224,11 +4805,29 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + exorcist@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/exorcist/-/exorcist-1.0.1.tgz#79316e3c4885845490f7bb405c0e5b5db1167c52" @@ -4246,6 +4845,19 @@ expand-brackets@^0.1.4: dependencies: is-posix-bracket "^0.1.0" +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" @@ -4267,6 +4879,18 @@ expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" +expect@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.7.1.tgz#d91defbab4e627470a152feaf35b3c31aa1c7c14" + integrity sha512-mGfvMTPduksV3xoI0xur56pQsg2vJjNf5+a+bXOjqCkiCBbmCayrBbHS/75y9K430cfqyocPr2ZjiNiRx4SRKw== + dependencies: + "@jest/types" "^24.7.0" + ansi-styles "^3.2.0" + jest-get-type "^24.3.0" + jest-matcher-utils "^24.7.0" + jest-message-util "^24.7.1" + jest-regex-util "^24.3.0" + express-state@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/express-state/-/express-state-1.0.3.tgz#b6f368743a95d8a91b7683adf593d02b1577ec02" @@ -4331,6 +4955,14 @@ extend-shallow@^2.0.1: dependencies: is-extendable "^0.1.0" +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + extend@^3.0.0, extend@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -4348,6 +4980,20 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + extsprintf@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" @@ -4417,12 +5063,12 @@ faye-websocket@~0.7.2: dependencies: websocket-driver ">=0.3.6" -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" - integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= dependencies: - pend "~1.2.0" + bser "^2.0.0" fd@~0.0.2: version "0.0.2" @@ -4436,7 +5082,7 @@ feature-detect-es6@^1.2.0, feature-detect-es6@^1.3.0, feature-detect-es6@^1.3.1: dependencies: array-back "^1.0.3" -figures@^1.3.5, figures@^1.4.0: +figures@^1.3.5: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= @@ -4468,16 +5114,11 @@ file-set@~0.2.1: array-tools "^2" glob "^4" -file-type@^3.6.0, file-type@^3.8.0: +file-type@^3.6.0: version "3.9.0" resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9" integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek= -file-type@^4.3.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5" - integrity sha1-G2AOX8ofvcboDApwxxyNul95BsU= - file-utils@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/file-utils/-/file-utils-0.1.5.tgz#dc8153c855387cb4dacb0a1725531fa444a6b48c" @@ -4496,20 +5137,6 @@ filename-regex@^2.0.0: resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= -filename-reserved-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" - integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik= - -filenamify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-2.0.0.tgz#bd162262c0b6e94bfbcdcf19a3bbb3764f785695" - integrity sha1-vRYiYsC26Uv7zc8Zo7uzdk94VpU= - dependencies: - filename-reserved-regex "^2.0.0" - strip-outer "^1.0.0" - trim-repeated "^1.0.0" - fileset@0.1.x: version "0.1.8" resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.1.8.tgz#506b91a9396eaa7e32fb42a84077c7a0c736b741" @@ -4518,6 +5145,14 @@ fileset@0.1.x: glob "3.x" minimatch "0.x" +fileset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= + 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" @@ -4529,6 +5164,16 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + filter-where@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/filter-where/-/filter-where-1.0.1.tgz#1b042569edce36bc1c4e9f73740d2c4e2feef77d" @@ -4591,6 +5236,13 @@ find-up@^2.0.0: dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + findup-sync@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" @@ -4669,14 +5321,7 @@ flush-write-stream@^1.0.2: inherits "^2.0.3" readable-stream "^2.3.6" -for-each@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" - integrity sha1-LEBFC5NI6X8oEyJZO6lnBLmr1NQ= - dependencies: - is-function "~1.0.0" - -for-in@^1.0.1: +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= @@ -4768,6 +5413,13 @@ forwarded@~0.1.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" integrity sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M= +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + fresh@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.2.0.tgz#bfd9402cf3df12c4a4c310c79f99a3dde13d34a7" @@ -4818,6 +5470,13 @@ fs-extra@~0.8.1: ncp "~0.4.2" rimraf "~2.2.0" +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" + fs-mkdirp-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" @@ -4859,6 +5518,14 @@ fsevents@^1.0.0: nan "^2.3.0" node-pre-gyp "^0.6.36" +fsevents@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.8.tgz#57ea5320f762cd4696e5e8e87120eccc8b11cacf" + integrity sha512-tPvHgPGB7m40CZ68xqFGkKuzN+RnpGmSV+hgeKxhRpbxdqKXUFJGC3yonBOLzQBcJyGpdZFDfCsdOC2KFsXzeA== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + fstream-ignore@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" @@ -4878,12 +5545,12 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2, fstream@^1.0.8: mkdirp ">=0.5 0" rimraf "2" -function-bind@^1.0.2, function-bind@^1.1.0: +function-bind@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" integrity sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E= -function-bind@^1.1.1, function-bind@~1.1.1: +function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== @@ -4944,13 +5611,6 @@ get-pkg-repo@^1.0.0: parse-github-repo-url "^1.3.0" through2 "^2.0.0" -get-proxy@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" - integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw== - dependencies: - npm-conf "^1.1.0" - get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -4961,19 +5621,23 @@ get-stdin@^5.0.1: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" integrity sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g= -get-stream@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" - integrity sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4= - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" - get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -5128,7 +5792,7 @@ glob@^5.0.10, glob@^5.0.14, glob@^5.0.15, glob@~5.0.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@~7.1.1, glob@~7.1.2: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1, glob@~7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== @@ -5213,6 +5877,11 @@ global@^4.3.2: min-document "^2.19.0" process "~0.5.1" +globals@^11.1.0: + version "11.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" + integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== + globals@^8.11.0: version "8.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-8.18.0.tgz#93d4a62bdcac38cfafafc47d6b034768cb0ffcb4" @@ -5281,7 +5950,7 @@ glogg@^1.0.0: dependencies: sparkles "^1.0.0" -got@^6.3.0, got@^6.7.1: +got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= @@ -5298,7 +5967,7 @@ got@^6.3.0, got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@4.1.11, graceful-fs@^4.1.10, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~4.1.11: +graceful-fs@4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~4.1.11: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= @@ -5310,7 +5979,7 @@ graceful-fs@^3.0.0, graceful-fs@^3.0.2: dependencies: natives "^1.1.0" -graceful-fs@^4.0.0, graceful-fs@^4.1.11: +graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== @@ -5341,6 +6010,11 @@ gray-matter@^2.0.0: js-yaml "^3.8.1" toml "^2.3.2" +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + gulp-cli@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-1.3.0.tgz#a6bfbb8be35341be290ae45cd3e401071216edd4" @@ -5524,6 +6198,17 @@ handlebars@^3.0.0, handlebars@^3.0.3: optionalDependencies: uglify-js "~2.3" +handlebars@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" + integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" @@ -5614,35 +6299,61 @@ has-gulplog@^0.1.0: dependencies: sparkles "^1.0.0" -has-symbol-support-x@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.0.tgz#442d89b1d0ac6cf5ff2f7b916ee539869b93a256" - integrity sha512-F1NtLDtW9NyUrS3faUcI1yVFHCTXyzPb1jfrZBQi5NHxFPlXxZnFLFGzfA2DsdmgCxv2MZ0+bfcgC4EZTmk4SQ== - has-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= -has-to-string-tag-x@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.0.tgz#49d7bcde85c2409be38ac327e3e119a451657c7b" - integrity sha512-R3OdOP9j6AH5hS1yXeu9wAS+iKSZQx/CC6aMdN6WiaqPlBoA2S+47MtoMsZgKr2m0eAJ+73WWGX0RaFFE5XWKA== - dependencies: - has-symbol-support-x "^1.4.0" - has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= -has@^1.0.0, has@^1.0.1, has@~1.0.1: +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.0, has@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" integrity sha1-hGFzP1OLCDfJNh45qauelwTcLyg= dependencies: function-bind "^1.0.2" +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + hash-base@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" @@ -5755,6 +6466,13 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" @@ -5908,6 +6626,13 @@ iconv-lite@0.4.13: resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" integrity sha1-H4irpKsLFQjoMSrMOTRfNumS4vI= +iconv-lite@0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + iconv-lite@0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.4.tgz#e95f2e41db0735fc21652f7827a5ee32e63c83a8" @@ -5928,11 +6653,26 @@ ieee754@^1.1.4: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" integrity sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q= +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -6047,11 +6787,23 @@ invariant@^2.2.0, invariant@^2.2.2: dependencies: loose-envify "^1.0.0" +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + ip@^1.1.0: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -6078,6 +6830,20 @@ is-absolute@^1.0.0: is-relative "^1.0.0" is-windows "^1.0.1" +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + is-alphabetical@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.1.tgz#c77079cc91d4efac775be1034bf2d243f95e6f08" @@ -6115,10 +6881,10 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" - integrity sha1-hut1OSgF3cM69xySoO7fdO52BLI= +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== is-ci@^1.0.10: version "1.2.1" @@ -6127,6 +6893,27 @@ is-ci@^1.0.10: dependencies: ci-info "^1.5.0" +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" @@ -6137,6 +6924,24 @@ is-decimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.1.tgz#f5fb6a94996ad9e8e3761fbfbd091f1fca8c4e82" integrity sha1-9ftqlJlq2ejjdh+/vQkfH8qMToI= +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" @@ -6162,6 +6967,13 @@ is-extendable@^0.1.0, is-extendable@^0.1.1: resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" @@ -6172,7 +6984,7 @@ is-extglob@^2.1.0: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-finite@^1.0.0, is-finite@^1.0.1: +is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= @@ -6191,10 +7003,10 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-function@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" - integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" @@ -6233,11 +7045,6 @@ is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: jsonpointer "^4.0.0" xtend "^4.0.0" -is-natural-number@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" - integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= - is-negated-glob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" @@ -6267,11 +7074,6 @@ is-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= -is-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= - is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" @@ -6291,7 +7093,7 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-plain-object@^2.0.1, is-plain-object@^2.0.3: +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -6323,7 +7125,7 @@ is-redirect@^1.0.0: resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= -is-regex@^1.0.3: +is-regex@^1.0.3, is-regex@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= @@ -6366,10 +7168,12 @@ is-subset@^0.1.1: resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" integrity sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY= -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" - integrity sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI= +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" is-text-path@^1.0.0: version "1.0.1" @@ -6412,11 +7216,16 @@ is-windows@^0.2.0: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" integrity sha1-3hqm1j6indJIc3tp8f+LgALSEIw= -is-windows@^1.0.1: +is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + is@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" @@ -6464,6 +7273,70 @@ isstream@0.1.x, isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +istanbul-api@^2.1.1: + version "2.1.5" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.5.tgz#697b95ec69856c278aacafc0f86ee7392338d5b5" + integrity sha512-meYk1BwDp59Pfse1TvPrkKYgVqAufbdBLEVoqvu/hLLKSaQ054ZTksbNepyc223tMnWdm6AdK2URIJJRqdP87g== + dependencies: + async "^2.6.1" + compare-versions "^3.2.1" + fileset "^2.0.3" + istanbul-lib-coverage "^2.0.4" + istanbul-lib-hook "^2.0.6" + istanbul-lib-instrument "^3.2.0" + istanbul-lib-report "^2.0.7" + istanbul-lib-source-maps "^3.0.5" + istanbul-reports "^2.2.3" + js-yaml "^3.13.0" + make-dir "^2.1.0" + minimatch "^3.0.4" + once "^1.4.0" + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#927a354005d99dd43a24607bb8b33fd4e9aca1ad" + integrity sha512-LXTBICkMARVgo579kWDm8SqfB6nvSDKNqIOBEjmJRnL04JvoMHCYGWaMddQnseJYtkEuEvO/sIcOxPLk9gERug== + +istanbul-lib-hook@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.6.tgz#5baa6067860a38290aef038b389068b225b01b7d" + integrity sha512-829DKONApZ7UCiPXcOYWSgkFXa4+vNYoNOt3F+4uDJLKL1OotAoVwvThoEj1i8jmOj7odbYcR3rnaHu+QroaXg== + dependencies: + append-transform "^1.0.0" + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.2.0.tgz#c549208da8a793f6622257a2da83e0ea96ae6a93" + integrity sha512-06IM3xShbNW4NgZv5AP4QH0oHqf1/ivFo8eFys0ZjPXHGldHJQWb3riYOKXqmOqfxXBfxu4B+g/iuhOPZH0RJg== + dependencies: + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + istanbul-lib-coverage "^2.0.4" + semver "^6.0.0" + +istanbul-lib-report@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.7.tgz#370d80d433c4dbc7f58de63618f49599c74bd954" + integrity sha512-wLH6beJBFbRBLiTlMOBxmb85cnVM1Vyl36N48e4e/aTKSM3WbOx7zbVIH1SQ537fhhsPbX0/C5JB4qsmyRXXyA== + dependencies: + istanbul-lib-coverage "^2.0.4" + make-dir "^2.1.0" + supports-color "^6.0.0" + +istanbul-lib-source-maps@^3.0.1, istanbul-lib-source-maps@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.5.tgz#1d9ee9d94d2633f15611ee7aae28f9cac6d1aeb9" + integrity sha512-eDhZ7r6r1d1zQPVZehLc3D0K14vRba/eBYkz3rw16DLOrrTzve9RmnkcwrrkWVgO1FL3EK5knujVe5S8QHE9xw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.4" + make-dir "^2.1.0" + rimraf "^2.6.2" + source-map "^0.6.1" + istanbul-middleware@0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/istanbul-middleware/-/istanbul-middleware-0.2.2.tgz#83c4c13c128e1a0d6a147792391af3c15a8ab8e0" @@ -6474,6 +7347,13 @@ istanbul-middleware@0.2.2: express "4.x" istanbul "0.4.x" +istanbul-reports@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.3.tgz#14e0d00ecbfa9387757999cf36599b88e9f2176e" + integrity sha512-T6EbPuc8Cb620LWAYyZ4D8SSn06dY9i1+IgUX2lTH8gbwflMc9Obd33zHTyNX653ybjpamAHS9toKS3E6cGhTw== + dependencies: + handlebars "^4.1.0" + istanbul@0.4.x: version "0.4.5" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" @@ -6512,13 +7392,357 @@ istanbul@^0.2.8: which "1.0.x" wordwrap "0.0.x" -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w== +jest-changed-files@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.7.0.tgz#39d723a11b16ed7b373ac83adc76a69464b0c4fa" + integrity sha512-33BgewurnwSfJrW7T5/ZAXGE44o7swLslwh8aUckzq2e17/2Os1V0QU506ZNik3hjs8MgnEMKNkcud442NCDTw== + dependencies: + "@jest/types" "^24.7.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.7.1.tgz#6093a539073b6f4953145abeeb9709cd621044f1" + integrity sha512-32OBoSCVPzcTslGFl6yVCMzB2SqX3IrWwZCY5mZYkb0D2WsogmU3eV2o8z7+gRQa4o4sZPX/k7GU+II7CxM6WQ== + dependencies: + "@jest/core" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^12.0.2" + +jest-config@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.7.1.tgz#6c1dd4db82a89710a3cf66bdba97827c9a1cf052" + integrity sha512-8FlJNLI+X+MU37j7j8RE4DnJkvAghXmBWdArVzypW6WxfGuxiL/CCkzBg0gHtXhD2rxla3IMOSUAHylSKYJ83g== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.7.1" + "@jest/types" "^24.7.0" + babel-jest "^24.7.1" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.7.1" + jest-environment-node "^24.7.1" + jest-get-type "^24.3.0" + jest-jasmine2 "^24.7.1" + jest-regex-util "^24.3.0" + jest-resolve "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + micromatch "^3.1.10" + pretty-format "^24.7.0" + realpath-native "^1.1.0" + +jest-diff@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.7.0.tgz#5d862899be46249754806f66e5729c07fcb3580f" + integrity sha512-ULQZ5B1lWpH70O4xsANC4tf4Ko6RrpwhE3PtG6ERjMg1TiYTC2Wp4IntJVGro6a8HG9luYHhhmF4grF0Pltckg== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.3.0" + jest-get-type "^24.3.0" + pretty-format "^24.7.0" + +jest-docblock@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.3.0.tgz#b9c32dac70f72e4464520d2ba4aec02ab14db5dd" + integrity sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.7.1.tgz#fcc7dda4147c28430ad9fb6dc7211cd17ab54e74" + integrity sha512-4fsS8fEfLa3lfnI1Jw6NxjhyRTgfpuOVTeUZZFyVYqeTa4hPhr2YkToUhouuLTrL2eMGOfpbdMyRx0GQ/VooKA== + dependencies: + "@jest/types" "^24.7.0" + chalk "^2.0.1" + jest-get-type "^24.3.0" + jest-util "^24.7.1" + pretty-format "^24.7.0" + +jest-environment-jsdom@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.7.1.tgz#a40e004b4458ebeb8a98082df135fd501b9fbbd6" + integrity sha512-Gnhb+RqE2JuQGb3kJsLF8vfqjt3PHKSstq4Xc8ic+ax7QKo4Z0RWGucU3YV+DwKR3T9SYc+3YCUQEJs8r7+Jxg== + dependencies: + "@jest/environment" "^24.7.1" + "@jest/fake-timers" "^24.7.1" + "@jest/types" "^24.7.0" + jest-mock "^24.7.0" + jest-util "^24.7.1" + jsdom "^11.5.1" + +jest-environment-node@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.7.1.tgz#fa2c047a31522a48038d26ee4f7c8fd9c1ecfe12" + integrity sha512-GJJQt1p9/C6aj6yNZMvovZuxTUd+BEJprETdvTKSb4kHcw4mFj8777USQV0FJoJ4V3djpOwA5eWyPwfq//PFBA== + dependencies: + "@jest/environment" "^24.7.1" + "@jest/fake-timers" "^24.7.1" + "@jest/types" "^24.7.0" + jest-mock "^24.7.0" + jest-util "^24.7.1" + +jest-get-type@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.3.0.tgz#582cfd1a4f91b5cdad1d43d2932f816d543c65da" + integrity sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow== + +jest-haste-map@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.7.1.tgz#772e215cd84080d4bbcb759cfb668ad649a21471" + integrity sha512-g0tWkzjpHD2qa03mTKhlydbmmYiA2KdcJe762SbfFo/7NIMgBWAA0XqQlApPwkWOF7Cxoi/gUqL0i6DIoLpMBw== + dependencies: + "@jest/types" "^24.7.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.4.0" + jest-util "^24.7.1" + jest-worker "^24.6.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.7.1.tgz#01398686dabe46553716303993f3be62e5d9d818" + integrity sha512-Y/9AOJDV1XS44wNwCaThq4Pw3gBPiOv/s6NcbOAkVRRUEPu+36L2xoPsqQXsDrxoBerqeyslpn2TpCI8Zr6J2w== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.7.1" + is-generator-fn "^2.0.0" + jest-each "^24.7.1" + jest-matcher-utils "^24.7.0" + jest-message-util "^24.7.1" + jest-runtime "^24.7.1" + jest-snapshot "^24.7.1" + jest-util "^24.7.1" + pretty-format "^24.7.0" + throat "^4.0.0" + +jest-leak-detector@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.7.0.tgz#323ff93ed69be12e898f5b040952f08a94288ff9" + integrity sha512-zV0qHKZGXtmPVVzT99CVEcHE9XDf+8LwiE0Ob7jjezERiGVljmqKFWpV2IkG+rkFIEUHFEkMiICu7wnoPM/RoQ== + dependencies: + pretty-format "^24.7.0" + +jest-matcher-utils@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz#bbee1ff37bc8b2e4afcaabc91617c1526af4bcd4" + integrity sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg== + dependencies: + chalk "^2.0.1" + jest-diff "^24.7.0" + jest-get-type "^24.3.0" + pretty-format "^24.7.0" + +jest-message-util@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.7.1.tgz#f1dc3a6c195647096a99d0f1dadbc447ae547018" + integrity sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.7.0.tgz#e49ce7262c12d7f5897b0d8af77f6db8e538023b" + integrity sha512-6taW4B4WUcEiT2V9BbOmwyGuwuAFT2G8yghF7nyNW1/2gq5+6aTqSPcS9lS6ArvEkX55vbPAS/Jarx5LSm4Fng== + dependencies: + "@jest/types" "^24.7.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" + integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg== + +jest-resolve-dependencies@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.7.1.tgz#cf93bbef26999488a96a2b2012f9fe7375aa378f" + integrity sha512-2Eyh5LJB2liNzfk4eo7bD1ZyBbqEJIyyrFtZG555cSWW9xVHxII2NuOkSl1yUYTAYCAmM2f2aIT5A7HzNmubyg== + dependencies: + "@jest/types" "^24.7.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.7.1" + +jest-resolve@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.7.1.tgz#e4150198299298380a75a9fd55043fa3b9b17fde" + integrity sha512-Bgrc+/UUZpGJ4323sQyj85hV9d+ANyPNu6XfRDUcyFNX1QrZpSoM0kE4Mb2vZMAYTJZsBFzYe8X1UaOkOELSbw== + dependencies: + "@jest/types" "^24.7.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.7.1.tgz#41c8a02a06aa23ea82d8bffd69d7fa98d32f85bf" + integrity sha512-aNFc9liWU/xt+G9pobdKZ4qTeG/wnJrJna3VqunziDNsWT3EBpmxXZRBMKCsNMyfy+A/XHiV+tsMLufdsNdgCw== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.7.1" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.7.1" + jest-docblock "^24.3.0" + jest-haste-map "^24.7.1" + jest-jasmine2 "^24.7.1" + jest-leak-detector "^24.7.0" + jest-message-util "^24.7.1" + jest-resolve "^24.7.1" + jest-runtime "^24.7.1" + jest-util "^24.7.1" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.7.1.tgz#2ffd70b22dd03a5988c0ab9465c85cdf5d25c597" + integrity sha512-0VAbyBy7tll3R+82IPJpf6QZkokzXPIS71aDeqh+WzPRXRCNz6StQ45otFariPdJ4FmXpDiArdhZrzNAC3sj6A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.7.1" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/yargs" "^12.0.2" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.7.1" + jest-haste-map "^24.7.1" + jest-message-util "^24.7.1" + jest-mock "^24.7.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.7.1" + jest-snapshot "^24.7.1" + jest-util "^24.7.1" + jest-validate "^24.7.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^12.0.2" + +jest-serializer@^24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" + integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q== + +jest-snapshot@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.7.1.tgz#bd5a35f74aedff070975e9e9c90024f082099568" + integrity sha512-8Xk5O4p+JsZZn4RCNUS3pxA+ORKpEKepE+a5ejIKrId9CwrVN0NY+vkqEkXqlstA5NMBkNahXkR/4qEBy0t5yA== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.7.0" + chalk "^2.0.1" + expect "^24.7.1" + jest-diff "^24.7.0" + jest-matcher-utils "^24.7.0" + jest-message-util "^24.7.1" + jest-resolve "^24.7.1" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.7.0" + semver "^5.5.0" + +jest-util@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.7.1.tgz#b4043df57b32a23be27c75a2763d8faf242038ff" + integrity sha512-/KilOue2n2rZ5AnEBYoxOXkeTu6vi7cjgQ8MXEkih0oeAXT6JkS3fr7/j8+engCjciOU1Nq5loMSKe0A1oeX0A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/fake-timers" "^24.7.1" + "@jest/source-map" "^24.3.0" + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.7.0.tgz#70007076f338528ee1b1c8a8258b1b0bb982508d" + integrity sha512-cgai/gts9B2chz1rqVdmLhzYxQbgQurh1PEQSvSgPZ8KGa1AqXsqC45W5wKEwzxKrWqypuQrQxnF4+G9VejJJA== dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" + "@jest/types" "^24.7.0" + camelcase "^5.0.0" + chalk "^2.0.1" + jest-get-type "^24.3.0" + leven "^2.1.0" + pretty-format "^24.7.0" + +jest-watcher@^24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.7.1.tgz#e161363d7f3f4e1ef3d389b7b3a0aad247b673f5" + integrity sha512-Wd6TepHLRHVKLNPacEsBwlp9raeBIO+01xrN24Dek4ggTS8HHnOzYSFnvp+6MtkkJ3KfMzy220KTi95e2rRkrw== + dependencies: + "@jest/test-result" "^24.7.1" + "@jest/types" "^24.7.0" + "@types/yargs" "^12.0.9" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.7.1" + string-length "^2.0.0" + +jest-worker@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.6.0.tgz#7f81ceae34b7cde0c9827a6980c35b7cdc0161b3" + integrity sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ== + dependencies: + merge-stream "^1.0.1" + supports-color "^6.1.0" + +jest@24.7.1: + version "24.7.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.7.1.tgz#0d94331cf510c75893ee32f87d7321d5bf8f2501" + integrity sha512-AbvRar5r++izmqo5gdbAjTeA6uNRGoNRuj5vHB0OnDXo2DXWZJVuaObiGgtlvhKb+cWy2oYbQSfxv7Q7GjnAtA== + dependencies: + import-local "^2.0.0" + jest-cli "^24.7.1" js-base64@^2.1.8: version "2.1.9" @@ -6535,6 +7759,11 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + js-yaml@3.4.5: version "3.4.5" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.4.5.tgz#c3403797df12b91866574f2de23646fe8cafb44d" @@ -6551,6 +7780,14 @@ js-yaml@3.x, js-yaml@^3.8.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.13.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js2xmlparser@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-1.0.0.tgz#5a170f2e8d6476ce45405e04823242513782fe30" @@ -6638,11 +7875,48 @@ jsdoc2md-stats@^1.0.3: app-usage-stats "^0.4.0" feature-detect-es6 "^1.3.1" +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -6653,6 +7927,11 @@ json-loader@^0.5.4: resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" @@ -6697,6 +7976,13 @@ json5@^0.5.0, json5@^0.5.1: resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -6749,17 +8035,12 @@ jstransformer@1.0.0: is-promise "^2.0.0" promise "^7.0.1" -just-extend@^1.1.27: - version "1.1.27" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905" - integrity sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g== - keypress@0.1.x: version "0.1.0" resolved "https://registry.yarnpkg.com/keypress/-/keypress-0.1.0.tgz#4a3188d4291b66b4f65edb99f806aa9ae293592a" integrity sha1-SjGI1CkbZrT2XtuZ+AaqmuKTWSo= -kind-of@^3.0.2: +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= @@ -6773,6 +8054,16 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + klaw@^1.0.0, klaw@~1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -6780,6 +8071,11 @@ klaw@^1.0.0, klaw@~1.3.0: optionalDependencies: graceful-fs "^4.1.9" +kleur@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + labeled-stream-splicer@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59" @@ -6822,6 +8118,13 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + lead@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" @@ -6829,6 +8132,16 @@ lead@^1.0.0: dependencies: flush-write-stream "^1.0.2" +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= + levn@~0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/levn/-/levn-0.2.5.tgz#ba8d339d0ca4a610e3a3f145b9caf48807155054" @@ -6893,6 +8206,16 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + load-script@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/load-script/-/load-script-0.0.5.tgz#cbd54b27cd7309902b749640c70e996f4c643b63" @@ -6935,6 +8258,14 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lock@^0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/lock/-/lock-0.1.4.tgz#fec7deaef17e7c3a0a55e1da042803e25d91745d" @@ -7150,11 +8481,6 @@ lodash.escape@^3.0.0: dependencies: lodash._root "^3.0.0" -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -7293,7 +8619,7 @@ lodash.some@^4.2.2: resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= -lodash.sortby@^4.5.0: +lodash.sortby@^4.5.0, lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= @@ -7349,7 +8675,7 @@ lodash.toplainobject@^3.0.0: lodash._basecopy "^3.0.0" lodash.keysin "^3.0.0" -lodash@3.10.1, lodash@^3.3.1, lodash@^3.6.0: +lodash@3.10.1, lodash@^3.3.1: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= @@ -7359,7 +8685,7 @@ lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, lo resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4= -lodash@^4.17.10: +lodash@^4.17.10, lodash@^4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -7394,11 +8720,6 @@ loglevel@^1.4.1: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.4.1.tgz#95b383f91a3c2756fd4ab093667e4309161f2bcd" integrity sha1-lbOD+Ro8J1b9SrCTZn5DCRYfK80= -lolex@^2.2.0, lolex@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.2.tgz#85f9450425103bf9e7a60668ea25dc43274ca807" - integrity sha512-A5pN2tkFj7H0dGIAM6MFvHKMJcPnjZsOMvR7ujCjfgW5TbV6H9vb1PgxLtHvjqNZTHsUolz+6/WEO0N1xNx2ng== - longest-streak@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-1.0.0.tgz#d06597c4d4c31b52ccb1f5d8f8fe7148eafd6965" @@ -7449,7 +8770,29 @@ make-dir@^1.0.0: dependencies: pify "^2.3.0" -map-cache@^0.2.0: +make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= @@ -7464,6 +8807,13 @@ map-stream@~0.1.0: resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" integrity sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ= +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + markdown-table@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-0.4.0.tgz#890c2c1b3bfe83fb00e4129b8e4cfe645270f9d1" @@ -7521,6 +8871,15 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + memory-fs@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" @@ -7573,6 +8932,13 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= + dependencies: + readable-stream "^2.0.1" + metalsmith-changed@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/metalsmith-changed/-/metalsmith-changed-2.0.0.tgz#d3edb48abb4e5ca7eceb0af3822dfab1032178a3" @@ -7747,6 +9113,25 @@ micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7, micromatch@^2.3.8: parse-glob "^3.0.4" regex-cache "^0.4.2" +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + miller-rabin@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" @@ -7826,6 +9211,11 @@ mime@~1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" @@ -7871,7 +9261,7 @@ minimatch@0.x, minimatch@^0.2.14, minimatch@~0.2.11, minimatch@~0.2.12: lru-cache "2" sigmund "~1.0.0" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -7915,11 +9305,34 @@ minimist@^0.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" integrity sha1-Tf/lJdriuGTGbC4jxicdev3s784= -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: +minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + mkdirp2@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/mkdirp2/-/mkdirp2-1.0.3.tgz#cc8dd8265f1f06e2d8f5b10b6e52f4e050bed21b" @@ -8001,6 +9414,11 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" @@ -8070,16 +9488,43 @@ nan@^2.10.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" integrity sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA== +nan@^2.12.1: + version "2.13.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" + integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== + nan@^2.3.0, nan@^2.3.2: version "2.6.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" integrity sha1-5P805slf37WuzAjeZZb0NgWn20U= +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + natives@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" integrity sha1-6f+EFBimsux6SV6TmYT3jxY+bjE= +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + ncp@1.0.x: version "1.0.1" resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246" @@ -8090,6 +9535,15 @@ ncp@~0.4.2: resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574" integrity sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ= +needle@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.1.tgz#d272f2f4034afb9c4c9ab1379aabc17fc85c9388" + integrity sha512-CaLXV3W8Vnbps8ZANqDGz7j4x7Yj1LW4TWF/TQuDfj7Cfx4nAPTvw98qgTevtto1oHDrh3pQkaODbqupXlsWTg== + dependencies: + debug "^4.1.0" + iconv-lite "^0.4.4" + sax "^1.2.4" + negotiator@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.3.0.tgz#706d692efeddf574d57ea9fb1ab89a4fa7ee8f60" @@ -8105,6 +9559,11 @@ negotiator@0.6.1, negotiator@~0.6.1: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= +neo-async@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" + integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== + ngrok@2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/ngrok/-/ngrok-2.1.8.tgz#4cac5df7cd4f60fa0aa24a2ad59a6f744d130d46" @@ -8118,16 +9577,10 @@ ngrok@2.1.8: tar.gz "^1.0.3" xtend "^4.0.1" -nise@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/nise/-/nise-1.3.2.tgz#fd6fd8dc040dfb3c0a45252feb6ff21832309b14" - integrity sha512-KPKb+wvETBiwb4eTwtR/OsA2+iijXP+VnlSFYJo3EHjm2yjek1NWxHOUQat3i7xNLm1Bm18UA5j5Wor0yO2GtA== - dependencies: - "@sinonjs/formatio" "^2.0.0" - just-extend "^1.1.27" - lolex "^2.3.2" - path-to-regexp "^1.7.0" - text-encoding "^0.6.4" +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-emoji@^1.4.1: version "1.8.1" @@ -8178,6 +9631,11 @@ node-gyp@^3.8.0: tar "^2.0.0" which "1" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + node-int64@~0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.3.3.tgz#2d6e6b2ece5de8588b43d88d1bc41b26cd1fa84d" @@ -8241,6 +9699,38 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.2.1: + version "5.4.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" + integrity sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + node-pre-gyp@^0.6.36: version "0.6.36" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" @@ -8387,13 +9877,18 @@ now-and-later@^2.0.0: dependencies: once "^1.3.2" -npm-conf@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.2.tgz#170a2c48a0c6ad0495f03f87aec2da11ef47a525" - integrity sha512-dotwbpwVzfNB/2EF3A2wjK5tEMLggKfuA/8TG6WvBB1Zrv+JsvF7E8ei9B/HGq211st/GwXFbREcNJvJ1eySUQ== +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== dependencies: - config-chain "^1.1.11" - pify "^3.0.0" + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" npm-run-path@^2.0.0: version "2.0.2" @@ -8417,6 +9912,11 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= +nwsapi@^2.0.7: + version "2.1.3" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.3.tgz#25f3a5cec26c654f7376df6659cdf84b99df9558" + integrity sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A== + oauth-sign@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.4.0.tgz#f22956f31ea7151a821e5f2fb32c113cad8b9f69" @@ -8442,6 +9942,15 @@ object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + object-get@^2.0.0, object-get@^2.0.2, object-get@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/object-get/-/object-get-2.1.0.tgz#722bbdb60039efa47cad3c6dc2ce51a85c02c5ae" @@ -8452,16 +9961,16 @@ object-inspect@~0.4.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-0.4.0.tgz#f5157c116c1455b243b06ee97703392c5ad89fec" integrity sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w= -object-inspect@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.5.0.tgz#9d876c11e40f485c79215670281b767488f9bfe3" - integrity sha512-UmOFbHbwvv+XHj7BerrhVq+knjceBdkvU5AriwLMvhv2qi+e7DJzxfBeFpILEjVzCp+xA+W/pIf06RGPWlZNfw== - object-keys@^1.0.11, object-keys@^1.0.6, object-keys@^1.0.8, object-keys@~1.0.0: version "1.0.11" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" integrity sha1-xUYBd4rVYPEULODgG8yotW0TQm0= +object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + object-keys@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" @@ -8491,6 +10000,13 @@ object-tools@^2, object-tools@^2.0.6: test-value "^1.1.0" typical "^2.4.2" +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + object.assign@^4.0.4: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" @@ -8511,6 +10027,14 @@ object.defaults@^1.1.0: for-own "^1.0.0" isobject "^3.0.0" +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -8526,6 +10050,13 @@ object.pick@^1.2.0: dependencies: isobject "^2.1.0" +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + obuf@^1.0.0, obuf@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" @@ -8717,6 +10248,15 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" +os-locale@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -8751,16 +10291,40 @@ output-file-sync@^1.1.0: mkdirp "^0.5.1" object-assign "^4.1.0" +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + p-limit@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" integrity sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw= +p-limit@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -8768,11 +10332,28 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + p-map@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a" integrity sha1-BfXkrpegaDcbwqXMhr+9vBnErno= +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" @@ -8854,21 +10435,34 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" -parse-ms@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" - integrity sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0= +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + parseurl@~1.3.0, parseurl@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" integrity sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY= +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + path-browserify@0.0.0, path-browserify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" @@ -8901,7 +10495,7 @@ path-is-inside@^1.0.1: resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= -path-key@^2.0.0: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= @@ -8911,6 +10505,11 @@ path-parse@^1.0.5: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + path-platform@~0.11.15: version "0.11.15" resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" @@ -8933,13 +10532,6 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -path-to-regexp@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30= - dependencies: - isarray "0.0.1" - path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -8956,6 +10548,13 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + path@^0.12.7: version "0.12.7" resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" @@ -8992,11 +10591,6 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" @@ -9017,6 +10611,11 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -9029,6 +10628,13 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" @@ -9036,6 +10642,13 @@ pkg-dir@^1.0.0: dependencies: find-up "^1.0.0" +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + pkginfo@0.3.x: version "0.3.1" resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" @@ -9046,15 +10659,10 @@ pkginfo@0.x.x: resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.0.tgz#349dbb7ffd38081fcadc0853df687f0c7744cd65" integrity sha1-NJ27f/04CB/K3AhT32h/DHdEzWU= -platform@^1.3.3: - version "1.3.4" - resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.4.tgz#6f0fb17edaaa48f21442b3a975c063130f1c3ebd" - integrity sha1-bw+xftqqSPIUQrOpdcBjEw8cPr0= - -plur@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" - integrity sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY= +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== portfinder@^1.0.13: version "1.0.17" @@ -9074,6 +10682,11 @@ portfinder@^1.0.9: debug "^2.2.0" mkdirp "0.5.x" +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + prelude-ls@~1.1.0, prelude-ls@~1.1.1, prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -9103,20 +10716,21 @@ pretty-bytes@^4.0.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9" integrity sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk= +pretty-format@^24.7.0: + version "24.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.7.0.tgz#d23106bc2edcd776079c2daa5da02bcb12ed0c10" + integrity sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA== + dependencies: + "@jest/types" "^24.7.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + pretty-hrtime@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= -pretty-ms@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" - integrity sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw= - dependencies: - is-finite "^1.0.1" - parse-ms "^1.0.0" - plur "^1.0.0" - private@^0.1.6: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" @@ -9183,10 +10797,13 @@ prompt@1.0.0: utile "0.3.x" winston "2.1.x" -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= +prompts@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.4.tgz#179f9d4db3128b9933aa35f93a800d8fce76a682" + integrity sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA== + dependencies: + kleur "^3.0.2" + sisteransi "^1.0.0" proxy-addr@~1.1.4: version "1.1.4" @@ -9211,6 +10828,11 @@ psl@^1.1.24: resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== +psl@^1.1.28: + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + public-encrypt@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" @@ -9335,6 +10957,14 @@ pump@^2.0.0: end-of-stream "^1.1.0" once "^1.3.1" +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pumpify@^1.3.5: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" @@ -9354,6 +10984,11 @@ punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + q@^1.1.2, q@^1.4.1: version "1.5.0" resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" @@ -9519,7 +11154,7 @@ rc@^1.0.1, rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -rc@^1.1.6, rc@^1.2.8: +rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -9529,10 +11164,10 @@ rc@^1.1.6, rc@^1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -re-emitter@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/re-emitter/-/re-emitter-1.1.3.tgz#fa9e319ffdeeeb35b27296ef0f3d374dac2f52a7" - integrity sha1-+p4xn/3u6zWycpbvDz03TawvUqc= +react-is@^16.8.4: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" + integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== read-only-stream@^2.0.0: version "2.0.0" @@ -9557,6 +11192,14 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + read-pkg@^1.0.0, read-pkg@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -9575,6 +11218,15 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + read@1.0.x: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" @@ -9637,7 +11289,7 @@ readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@~2.0.0, readable-stream@~2.0.5: +readable-stream@~2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= @@ -9668,6 +11320,13 @@ readline2@^1.0.1: is-fullwidth-code-point "^1.0.0" mute-stream "0.0.5" +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -9765,6 +11424,14 @@ regex-cache@^0.4.2: is-equal-shallow "^0.1.3" is-primitive "^2.0.0" +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -9866,7 +11533,7 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= -repeat-string@^1.5.2, repeat-string@^1.5.4: +repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -9899,6 +11566,22 @@ req-then@0.5.1: lodash.pick "^4.4.0" typical "^2.6.0" +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== + dependencies: + lodash "^4.17.11" + +request-promise-native@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + dependencies: + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request@2, request@^2.55.0, request@^2.61.0, request@^2.79.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" @@ -10044,6 +11727,11 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + requires-port@0.x.x: version "0.0.1" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-0.0.1.tgz#4b4414411d9df7c855995dd899a8c78a2951c16d" @@ -10061,6 +11749,13 @@ requizzle@~0.2.1: dependencies: underscore "~1.6.0" +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + resolve-dir@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" @@ -10069,6 +11764,11 @@ resolve-dir@^0.1.0: expand-tilde "^1.2.2" global-modules "^0.2.3" +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + resolve-options@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" @@ -10076,6 +11776,11 @@ resolve-options@^1.1.0: dependencies: value-or-function "^3.0.0" +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + resolve@0.7.x: version "0.7.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.7.4.tgz#395a9ef9e873fbfe12bd14408bd91bb936003d69" @@ -10093,12 +11798,12 @@ resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7: dependencies: path-parse "^1.0.5" -resolve@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" - integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== +resolve@^1.3.2: + version "1.10.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.1.tgz#664842ac960795bbe758221cdccda61fb64b5f18" + integrity sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA== dependencies: - path-parse "^1.0.5" + path-parse "^1.0.6" restore-cursor@^1.0.1: version "1.0.1" @@ -10108,12 +11813,10 @@ restore-cursor@^1.0.1: exit-hook "^1.0.0" onetime "^1.0.0" -resumer@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" - integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= - dependencies: - through "~2.3.4" +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== revalidator@0.1.x: version "0.1.8" @@ -10134,7 +11837,7 @@ rimraf@2, rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6 dependencies: glob "^7.0.5" -rimraf@2.6.3: +rimraf@2.6.3, rimraf@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -10159,6 +11862,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^2.0.0" inherits "^2.0.1" +rsvp@^4.8.4: + version "4.8.4" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.4.tgz#b50e6b34583f3dd89329a2f23a8a2be072845911" + integrity sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA== + run-async@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" @@ -10186,10 +11894,32 @@ safe-buffer@^5.1.1, safe-buffer@^5.1.2: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -samsam@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" - integrity sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg== +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" sass-graph@^2.1.1, sass-graph@^2.2.4: version "2.2.4" @@ -10201,7 +11931,7 @@ sass-graph@^2.1.1, sass-graph@^2.2.4: scss-tokenizer "^0.2.3" yargs "^7.0.0" -sax@>=0.6.0: +sax@>=0.6.0, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -10214,13 +11944,6 @@ scss-tokenizer@^0.2.3: js-base64 "^2.1.8" source-map "^0.4.2" -seek-bzip@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" - integrity sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w= - dependencies: - commander "~2.8.1" - select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -10263,11 +11986,21 @@ semver@^4.1.0, semver@^4.2.0: resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= +semver@^5.4.1, semver@^5.5.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + semver@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" + integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== + send@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/send/-/send-0.1.4.tgz#be70d8d1be01de61821af13780b50345a4f71abd" @@ -10340,6 +12073,26 @@ set-immediate-shim@^1.0.1: resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -10421,6 +12174,11 @@ shelljs@^0.5.3: resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.5.3.tgz#c54982b996c76ef0c1e6b59fbdc5825f5b713113" integrity sha1-xUmCuZbHbvDB5rWfvcWCX1txMRM= +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + sigmund@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" @@ -10431,24 +12189,51 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.5.0.tgz#427ae312a337d3c516804ce2754e8c0d5028cb04" - integrity sha512-trdx+mB0VBBgoYucy6a9L7/jfQOmvGeaKZT4OOJ+lPAtI8623xyGr8wLiE4eojzBS8G9yXbhx42GHUOVLr4X2w== - dependencies: - "@sinonjs/formatio" "^2.0.0" - diff "^3.1.0" - lodash.get "^4.4.2" - lolex "^2.2.0" - nise "^1.2.0" - supports-color "^5.1.0" - type-detect "^4.0.5" +sisteransi@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" + integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + sntp@0.2.x: version "0.2.4" resolved "https://registry.yarnpkg.com/sntp/-/sntp-0.2.4.tgz#fb885f18b0f3aad189f824862536bceeec750900" @@ -10507,6 +12292,17 @@ source-map-cjs@~0.1.31: resolved "https://registry.yarnpkg.com/source-map-cjs/-/source-map-cjs-0.1.32.tgz#b113f00065b484f4d3a1123ef084046a56228ce7" integrity sha1-sRPwAGW0hPTToRI+8IQEalYijOc= +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" @@ -10521,6 +12317,19 @@ source-map-support@^0.4.2: dependencies: source-map "^0.5.6" +source-map-support@^0.5.6: + version "0.5.12" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + source-map@0.5.x, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -10545,7 +12354,7 @@ source-map@^0.4.2, source-map@^0.4.4, source-map@~0.4.1: dependencies: amdefine ">=0.0.4" -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -10604,6 +12413,13 @@ spdy@^3.4.1: select-hose "^2.0.0" spdy-transport "^2.0.18" +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + split2@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/split2/-/split2-2.1.1.tgz#7a1f551e176a90ecd3345f7246a0cfe175ef4fd0" @@ -10680,6 +12496,11 @@ stack-trace@0.0.9, stack-trace@0.0.x: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" integrity sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU= +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + "stacktrace-js@http://github.com/defunctzombie/stacktrace.js/tarball/07e7b9516f1449f5c209e4f67f11a43f738c1712": version "0.6.0" resolved "http://github.com/defunctzombie/stacktrace.js/tarball/07e7b9516f1449f5c209e4f67f11a43f738c1712#62e2135deea45b38e7e5dd56e61e55da299607d4" @@ -10696,6 +12517,14 @@ static-eval@~0.2.0: dependencies: escodegen "~0.0.24" +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + static-module@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/static-module/-/static-module-1.4.0.tgz#bef0d9b6f89585f6f2359b8161beeab06055dbd2" @@ -10725,6 +12554,11 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + stream-browserify@^2.0.0, stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" @@ -10809,6 +12643,14 @@ stream-via@~0.1.0: resolved "https://registry.yarnpkg.com/stream-via/-/stream-via-0.1.1.tgz#0cee5df9c959fb1d3f4eda4819f289d5f9205afc" integrity sha1-DO5d+clZ+x0/TtpIGfKJ1fkgWvw= +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + string-tools@^0.1.4: version "0.1.8" resolved "https://registry.yarnpkg.com/string-tools/-/string-tools-0.1.8.tgz#70884e86a26ee5103a078bef67033d558d36e337" @@ -10836,15 +12678,6 @@ string-width@^2.0.0, string-width@^2.1.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string.prototype.trim@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" - integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.0" - function-bind "^1.0.2" - string_decoder@^0.10.25, string_decoder@~0.10.0, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -10907,6 +12740,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-ansi@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" @@ -10932,13 +12772,6 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-dirs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.0.0.tgz#610cdb2928200da0004f41dcb90fc95cd919a0b6" - integrity sha1-YQzbKSggDaAAT0HcuQ/JXNkZoLY= - dependencies: - is-natural-number "^4.0.1" - strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -10961,13 +12794,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -strip-outer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.0.tgz#aac0ba60d2e90c5d4f275fd8869fd9a2d310ffb8" - integrity sha1-qsC6YNLpDF1PJ1/Yhp/ZotMQ/7g= - dependencies: - escape-string-regexp "^1.0.2" - structured-source@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/structured-source/-/structured-source-3.0.2.tgz#dd802425e0f53dc4a6e7aca3752901a1ccda7af5" @@ -11020,10 +12846,10 @@ supports-color@^5.0.0, supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" - integrity sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg== +supports-color@^6.0.0, supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== dependencies: has-flag "^3.0.0" @@ -11035,6 +12861,11 @@ supports-hyperlinks@^1.0.1: has-flag "^2.0.0" supports-color "^5.0.0" +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= + syntax-error@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.3.0.tgz#1ed9266c4d40be75dc55bf9bb1cb77062bb96ca1" @@ -11067,16 +12898,6 @@ tap-finished@0.0.1: tap-parser "~0.2.0" through "~2.3.4" -tap-out@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/tap-out/-/tap-out-1.4.2.tgz#c907ec1bf9405111d088263e92f5608b88cbb37a" - integrity sha1-yQfsG/lAURHQiCY+kvVgi4jLs3o= - dependencies: - re-emitter "^1.0.0" - readable-stream "^2.0.0" - split "^1.0.0" - trim "0.0.1" - tap-parser@0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-0.7.0.tgz#728a61d64680a5b48d5dbd9dbd0a4d48f5c35bcb" @@ -11093,20 +12914,6 @@ tap-parser@~0.2.0: dependencies: split "~0.1.2" -tap-spec@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/tap-spec/-/tap-spec-4.1.1.tgz#e2e9f26f5208232b1f562288c97624d58a88f05a" - integrity sha1-4unyb1IIIysfViKIyXYk1YqI8Fo= - dependencies: - chalk "^1.0.0" - duplexer "^0.1.1" - figures "^1.4.0" - lodash "^3.6.0" - pretty-ms "^2.1.0" - repeat-string "^1.5.2" - tap-out "^1.4.1" - through2 "^2.0.0" - tapable@0.1.x, tapable@^0.1.8, tapable@~0.1.8: version "0.1.10" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" @@ -11117,25 +12924,6 @@ tapable@^0.2.7, tapable@~0.2.5: resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.7.tgz#e46c0daacbb2b8a98b9b0cea0f4052105817ed5c" integrity sha1-5GwNqsuyuKmLmwzqD0BSEFgX7Vw= -tape@4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/tape/-/tape-4.9.0.tgz#855c08360395133709d34d3fbf9ef341eb73ca6a" - integrity sha512-j0jO9BiScfqtPBb9QmPLL0qvxXMz98xjkMb7x8lKipFlJZwNJkqkWPou+NU4V6T9RnVh1kuSthLE8gLrN8bBfw== - dependencies: - deep-equal "~1.0.1" - defined "~1.0.0" - for-each "~0.3.2" - function-bind "~1.1.1" - glob "~7.1.2" - has "~1.0.1" - inherits "~2.0.3" - minimist "~1.2.0" - object-inspect "~1.5.0" - resolve "~1.5.0" - resumer "~0.0.0" - string.prototype.trim "~1.1.2" - through "~2.3.8" - tar-pack@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" @@ -11150,16 +12938,6 @@ tar-pack@^3.4.0: tar "^2.2.1" uid-number "^0.0.6" -tar-stream@^1.5.2: - version "1.5.4" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016" - integrity sha1-NlSc8E7RrumyowwBQyUiONr5QBY= - dependencies: - bl "^1.0.0" - end-of-stream "^1.0.0" - readable-stream "^2.0.0" - xtend "^4.0.0" - tar-stream@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.0.2.tgz#fd19b4a17900fa704f6a133e3045aead0562ab95" @@ -11200,6 +12978,19 @@ tar@^2.0.0, tar@^2.1.1, tar@^2.2.1: fstream "^1.0.2" inherits "2" +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + temp-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-path/-/temp-path-1.0.0.tgz#24b1543973ab442896d9ad367dd9cbdbfafe918b" @@ -11232,6 +13023,16 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" +test-exclude@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.2.tgz#7322f8ab037b0b93ad2aab35fe9068baf997a4c4" + integrity sha512-N2pvaLpT8guUpb5Fe1GJlmvmzH3x+DAKmmyEQmFP792QcLYoGE1syxztSvPD1V8yPe6VrcCt6YGQVjSRjCASsA== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + test-value@^1.0.1, test-value@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/test-value/-/test-value-1.1.0.tgz#a09136f72ec043d27c893707c2b159bfad7de93f" @@ -11248,11 +13049,6 @@ test-value@^2.0.0, test-value@^2.1.0: array-back "^1.0.3" typical "^2.6.0" -text-encoding@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" - integrity sha1-45mpgiV6J22uQou5KEXLcb3CbRk= - text-extensions@^1.0.0: version "1.5.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.5.0.tgz#d1cb2d14b5d0bc45bfdca8a08a473f68c7eb0cbc" @@ -11270,6 +13066,11 @@ then-fs@^2.0.0: dependencies: promise ">=3.2 <8" +throat@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + through2-filter@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" @@ -11323,7 +13124,7 @@ through@1: resolved "https://registry.yarnpkg.com/through/-/through-1.1.2.tgz#344a5425a3773314ca7e0eb6512fbafaf76c0bfe" integrity sha1-NEpUJaN3MxTKfg62US+6+vdsC/4= -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8: +through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -11403,6 +13204,11 @@ tiny-lr@^0.1.5: parseurl "~1.3.0" qs "~2.2.3" +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + to-absolute-glob@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" @@ -11421,6 +13227,36 @@ to-fast-properties@^1.0.1, to-fast-properties@^1.0.3: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= +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" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + to-through@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" @@ -11452,6 +13288,14 @@ tough-cookie@>=0.12.0, tough-cookie@~2.3.0: dependencies: punycode "^1.4.1" +tough-cookie@^2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + tough-cookie@~2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" @@ -11467,6 +13311,13 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + "traverse@>=0.3.0 <0.4": version "0.3.9" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" @@ -11492,13 +13343,6 @@ trim-off-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= -trim-repeated@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= - dependencies: - escape-string-regexp "^1.0.2" - trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -11560,11 +13404,6 @@ type-check@~0.3.1, type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - type-is@~1.5.1: version "1.5.7" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.5.7.tgz#b9368a593cc6ef7d0645e78b2f4c64cbecd05e90" @@ -11648,14 +13487,6 @@ umd@^3.0.0: resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e" integrity sha1-iuVW4RAR9jwllnCKiDclnwGz1g4= -unbzip2-stream@^1.0.9: - version "1.2.5" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.2.5.tgz#73a033a567bbbde59654b193c44d48a7e4f43c47" - integrity sha512-izD3jxT8xkzwtXRUZjtmRwKnZoeECrfZ8ra/ketwOcusbZEp4mjULMnJOCfTDZBgGQAAY1AJ/IgxcwkavcX9Og== - dependencies: - buffer "^3.0.1" - through "^2.3.6" - unc-path-regex@^0.1.0, unc-path-regex@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" @@ -11713,6 +13544,16 @@ unified@^4.1.1: trough "^1.0.0" vfile "^1.0.0" +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + union@~0.4.3: version "0.4.6" resolved "https://registry.yarnpkg.com/union/-/union-0.4.6.tgz#198fbdaeba254e788b0efcb630bc11f24a2959e0" @@ -11762,6 +13603,14 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + unyield@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/unyield/-/unyield-0.0.1.tgz#150e65da42bf7742445b958a64eb9b85d1d2b180" @@ -11795,6 +13644,11 @@ update-section@^0.3.0: resolved "https://registry.yarnpkg.com/update-section/-/update-section-0.3.3.tgz#458f17820d37820dc60e20b86d94391b00123158" integrity sha1-RY8Xgg03gg3GDiC4bZQ5GwASMVg= +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + url-join@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/url-join/-/url-join-2.0.5.tgz#5af22f18c052a000a48d7b82c5e9c2e2feeda728" @@ -11823,11 +13677,6 @@ url-parse@^1.1.8: querystringify "~1.0.0" requires-port "1.0.x" -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= - url@^0.11.0, url@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -11851,6 +13700,11 @@ usage-stats@^0.8.2: typical "^2.6.1" uuid "^3.0.1" +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" @@ -11868,6 +13722,14 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + util@0.10.3, util@^0.10.3, util@~0.10.1: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -12066,6 +13928,13 @@ void-elements@^2.0.1: resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + walk-back@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/walk-back/-/walk-back-2.0.1.tgz#554e2a9d874fac47a8cb006bf44c2f0c4998a0a4" @@ -12078,6 +13947,13 @@ walk@2.2.1: dependencies: forEachAsync "~2.2" +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + ware@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/ware/-/ware-1.3.0.tgz#d1b14f39d2e2cb4ab8c4098f756fe4b164e473d4" @@ -12136,6 +14012,11 @@ wd@0.3.11: underscore.string "~2.3.3" vargs "~0.1.0" +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + webpack-core@~0.6.9: version "0.6.9" resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" @@ -12263,11 +14144,46 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" integrity sha1-domUmcGEtu91Q3fC27DNbLVdKec= +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + which@1, which@^1.1.1, which@^1.2.12, which@^1.2.9: version "1.2.14" resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" @@ -12280,6 +14196,13 @@ which@1.0.x: resolved "https://registry.yarnpkg.com/which/-/which-1.0.9.tgz#460c1da0f810103d0321a9b633af9e575e64486f" integrity sha1-RgwdoPgQED0DIam2M6+eV15kSG8= +which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" @@ -12396,6 +14319,15 @@ wrench@~1.5.1: resolved "https://registry.yarnpkg.com/wrench/-/wrench-1.5.9.tgz#411691c63a9b2531b1700267279bdeca23b2142a" integrity sha1-QRaRxjqbJTGxcAJnJ5veyiOyFCo= +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + write-file-atomic@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" @@ -12412,6 +14344,13 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" @@ -12422,6 +14361,11 @@ xml-escape@~1.0.0: resolved "https://registry.yarnpkg.com/xml-escape/-/xml-escape-1.0.0.tgz#00963d697b2adf0c185c4e04e73174ba9b288eb2" integrity sha1-AJY9aXsq3wwYXE4E5zF0upsojrI= +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + xml2js@~0.4.0: version "0.4.17" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.17.tgz#17be93eaae3f3b779359c795b419705a8817e868" @@ -12454,11 +14398,21 @@ y18n@^3.2.0, y18n@^3.2.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= +"y18n@^3.2.1 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + yamljs@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.1.4.tgz#665789afc2ad4b902bf403f00e85b6434e0f3300" @@ -12467,6 +14421,14 @@ yamljs@0.1.4: argparse "~0.1.4" glob "~3.1.11" +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" @@ -12481,6 +14443,24 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" +yargs@^12.0.2: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + yargs@^3.28.0: version "3.32.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" @@ -12542,14 +14522,6 @@ yargs@~3.10.0: decamelize "^1.0.0" window-size "0.1.0" -yauzl@^2.4.2: - version "2.8.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.8.0.tgz#79450aff22b2a9c5a41ef54e02db907ccfbf9ee2" - integrity sha1-eUUK/yKyqcWkHvVOAtuQfM+/nuI= - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.0.1" - zip-stream@~0.2.0: version "0.2.3" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-0.2.3.tgz#aef095376cfe138959a81341981d26338b46d8d3"