diff --git a/.eslintignore b/.eslintignore index 50bc9799b..5cc53cd12 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,3 +3,5 @@ node_modules report/ dist-start/ dist-build/ +dist-storybook/ +coverage/ diff --git a/.gitignore b/.gitignore index 5ce052b38..0a12c041c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ dist-build/ # managed by sku .prettierrc +coverage/ +dist-storybook/ dist/ report/ tsconfig.json diff --git a/.prettierignore b/.prettierignore index f76215014..40186ef3d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,6 +2,8 @@ dist-build/ dist-start/ # managed by sku +coverage/ +dist-storybook/ dist/ report/ # end managed by sku diff --git a/config/babel/babelConfig.js b/config/babel/babelConfig.js index 55491dd89..57b0df41a 100644 --- a/config/babel/babelConfig.js +++ b/config/babel/babelConfig.js @@ -14,6 +14,7 @@ const nodeEnvOptions = { module.exports = ({ target, lang = 'js' }) => { const isBrowser = target === 'browser'; + const isJest = target === 'jest'; const envPresetOptions = isBrowser ? browserEnvOptions : nodeEnvOptions; const plugins = [ @@ -37,6 +38,10 @@ module.exports = ({ target, lang = 'js' }) => { plugins.push(require.resolve('babel-plugin-seek-style-guide')); } + if (isJest) { + plugins.push(require.resolve('babel-plugin-dynamic-import-node')); + } + if (process.env.NODE_ENV === 'production') { plugins.push( require.resolve('@babel/plugin-transform-react-inline-elements'), diff --git a/config/jest/jsBabelTransform.js b/config/jest/jsBabelTransform.js index 3d47caa5f..27ed4fdbc 100644 --- a/config/jest/jsBabelTransform.js +++ b/config/jest/jsBabelTransform.js @@ -1,4 +1,4 @@ const babelJest = require('babel-jest'); const babelConfig = require('../babel/babelConfig'); -module.exports = babelJest.createTransformer(babelConfig({ target: 'node' })); +module.exports = babelJest.createTransformer(babelConfig({ target: 'jest' })); diff --git a/config/jest/tsBabelTransform.js b/config/jest/tsBabelTransform.js index bdd590f13..7e81652d8 100644 --- a/config/jest/tsBabelTransform.js +++ b/config/jest/tsBabelTransform.js @@ -2,5 +2,5 @@ const babelJest = require('babel-jest'); const babelConfig = require('../babel/babelConfig'); module.exports = babelJest.createTransformer( - babelConfig({ target: 'node', lang: 'ts' }), + babelConfig({ target: 'jest', lang: 'ts' }), ); diff --git a/package.json b/package.json index 58e08aca0..f6cdbdf3d 100644 --- a/package.json +++ b/package.json @@ -94,6 +94,7 @@ "babel-jest": "^24.0.0", "babel-loader": "^8.0.4", "babel-plugin-add-react-displayname": "^0.0.5", + "babel-plugin-dynamic-import-node": "^2.2.0", "babel-plugin-flow-react-proptypes": "^25.0.0", "babel-plugin-macros": "^2.4.2", "babel-plugin-module-resolver": "^3.1.1", @@ -190,6 +191,7 @@ "react-dom": "^16.8.1", "react-helmet": "^5.2.0", "react-router-dom": "^4.3.1", + "react-testing-library": "^6.0.3", "renovate-config-seek": "^0.4.0", "seek-asia-style-guide": "^7.0.0", "seek-style-guide": "^38.9.2", diff --git a/test/test-cases/multiple-routes/__snapshots__/multiple-routes.test.js.snap b/test/test-cases/multiple-routes/__snapshots__/multiple-routes.test.js.snap index adc7ccc56..e6fc5453a 100644 --- a/test/test-cases/multiple-routes/__snapshots__/multiple-routes.test.js.snap +++ b/test/test-cases/multiple-routes/__snapshots__/multiple-routes.test.js.snap @@ -19,25 +19,25 @@ SOURCE HTML: @@ -56,25 +56,25 @@ SOURCE HTML: @@ -86,21 +86,21 @@ POST HYDRATE DIFFS: NO DIFF exports[`multiple-routes build should generate the expected files 1`] = ` Object { - "AsyncComponent-4c9203d1f98425beac91.js": "CONTENTS IGNORED IN SNAPSHOT TEST", + "AsyncComponent-0f65c3bbe8687e1eecaf.js": "CONTENTS IGNORED IN SNAPSHOT TEST", "AsyncComponent.render.js": "CONTENTS IGNORED IN SNAPSHOT TEST", "handlers-Details-0e82719ea3ab71aafb06.css": ._91MnZhe { color: #00f; } , - "handlers-Details-86d217a554c320e535d5.js": "CONTENTS IGNORED IN SNAPSHOT TEST", + "handlers-Details-4ed8e2ebe22a3b84ecff.js": "CONTENTS IGNORED IN SNAPSHOT TEST", "handlers-Details.render.js": "CONTENTS IGNORED IN SNAPSHOT TEST", "handlers-Home-62bf94bf0fd2ba3c2aa2.css": ._1QX0Hyt { color: red; } , - "handlers-Home-9299312b46da1275b24f.js": "CONTENTS IGNORED IN SNAPSHOT TEST", + "handlers-Home-d4afda529b3b1a8b8da7.js": "CONTENTS IGNORED IN SNAPSHOT TEST", "handlers-Home.render.js": "CONTENTS IGNORED IN SNAPSHOT TEST", - "main-88a2f689f8c24a805319.js": "CONTENTS IGNORED IN SNAPSHOT TEST", + "main-31d5c5a990273252eb27.js": "CONTENTS IGNORED IN SNAPSHOT TEST", "production/au/details/:id/index.html": @@ -119,31 +119,31 @@ Object { @@ -165,31 +165,31 @@ Object { @@ -214,25 +214,25 @@ Object { @@ -251,25 +251,25 @@ Object { @@ -294,31 +294,31 @@ Object { @@ -340,31 +340,31 @@ Object { @@ -389,25 +389,25 @@ Object { @@ -426,33 +426,33 @@ Object { , - "runtime-b91dbaa2fd4f016b313a.js": "CONTENTS IGNORED IN SNAPSHOT TEST", - "vendors~main-f5d240030ff34559ef68.js": "CONTENTS IGNORED IN SNAPSHOT TEST", + "runtime-53a00b797ada902fafcd.js": "CONTENTS IGNORED IN SNAPSHOT TEST", + "vendors~main-c6b8f06aa18abf922081.js": "CONTENTS IGNORED IN SNAPSHOT TEST", } `; diff --git a/test/test-cases/multiple-routes/.eslintignore b/test/test-cases/multiple-routes/app/.eslintignore similarity index 100% rename from test/test-cases/multiple-routes/.eslintignore rename to test/test-cases/multiple-routes/app/.eslintignore diff --git a/test/test-cases/multiple-routes/.gitignore b/test/test-cases/multiple-routes/app/.gitignore similarity index 100% rename from test/test-cases/multiple-routes/.gitignore rename to test/test-cases/multiple-routes/app/.gitignore diff --git a/test/test-cases/multiple-routes/.prettierignore b/test/test-cases/multiple-routes/app/.prettierignore similarity index 100% rename from test/test-cases/multiple-routes/.prettierignore rename to test/test-cases/multiple-routes/app/.prettierignore diff --git a/test/test-cases/multiple-routes/sku.config.js b/test/test-cases/multiple-routes/app/sku.config.js similarity index 100% rename from test/test-cases/multiple-routes/sku.config.js rename to test/test-cases/multiple-routes/app/sku.config.js diff --git a/test/test-cases/multiple-routes/src/App.js b/test/test-cases/multiple-routes/app/src/App.js similarity index 56% rename from test/test-cases/multiple-routes/src/App.js rename to test/test-cases/multiple-routes/app/src/App.js index f6f946669..5e894c9d9 100644 --- a/test/test-cases/multiple-routes/src/App.js +++ b/test/test-cases/multiple-routes/app/src/App.js @@ -1,10 +1,14 @@ /* eslint-disable react/jsx-no-bind */ import React, { Fragment } from 'react'; import { Route } from 'react-router-dom'; -import loadable from '../../../../@loadable/component'; +import loadable from '../../../../../@loadable/component'; -const Home = loadable(() => import('./handlers/Home')); -const Details = loadable(() => import('./handlers/Details')); +const Home = loadable(() => import('./handlers/Home'), { + fallback: 'Loading Home...', +}); +const Details = loadable(() => import('./handlers/Details'), { + fallback: 'Loading Details...', +}); export default ({ site }) => ( diff --git a/test/test-cases/multiple-routes/app/src/App.test.js b/test/test-cases/multiple-routes/app/src/App.test.js new file mode 100644 index 000000000..6b67d8ccf --- /dev/null +++ b/test/test-cases/multiple-routes/app/src/App.test.js @@ -0,0 +1,16 @@ +import React from 'react'; +import App from './App'; +import { StaticRouter } from 'react-router-dom'; +import { render } from 'react-testing-library'; + +describe('multiple-routes', () => { + it('should support loadable components', () => { + const { container } = render( + + + , + ); + + expect(container.innerHTML).toMatchInlineSnapshot(`"Loading Home..."`); + }); +}); diff --git a/test/test-cases/multiple-routes/src/client.js b/test/test-cases/multiple-routes/app/src/client.js similarity index 100% rename from test/test-cases/multiple-routes/src/client.js rename to test/test-cases/multiple-routes/app/src/client.js diff --git a/test/test-cases/multiple-routes/src/handlers/AsyncComponent.js b/test/test-cases/multiple-routes/app/src/handlers/AsyncComponent.js similarity index 100% rename from test/test-cases/multiple-routes/src/handlers/AsyncComponent.js rename to test/test-cases/multiple-routes/app/src/handlers/AsyncComponent.js diff --git a/test/test-cases/multiple-routes/src/handlers/Details.js b/test/test-cases/multiple-routes/app/src/handlers/Details.js similarity index 91% rename from test/test-cases/multiple-routes/src/handlers/Details.js rename to test/test-cases/multiple-routes/app/src/handlers/Details.js index 56c049c5f..6533adb80 100644 --- a/test/test-cases/multiple-routes/src/handlers/Details.js +++ b/test/test-cases/multiple-routes/app/src/handlers/Details.js @@ -2,7 +2,7 @@ import styles from './Details.less'; import React from 'react'; -import loadable from '../../../../../@loadable/component'; +import loadable from '../../../../../../@loadable/component'; const AsyncComponent = loadable(() => import('./AsyncComponent')); diff --git a/test/test-cases/multiple-routes/src/handlers/Details.less b/test/test-cases/multiple-routes/app/src/handlers/Details.less similarity index 100% rename from test/test-cases/multiple-routes/src/handlers/Details.less rename to test/test-cases/multiple-routes/app/src/handlers/Details.less diff --git a/test/test-cases/multiple-routes/src/handlers/Home.js b/test/test-cases/multiple-routes/app/src/handlers/Home.js similarity index 100% rename from test/test-cases/multiple-routes/src/handlers/Home.js rename to test/test-cases/multiple-routes/app/src/handlers/Home.js diff --git a/test/test-cases/multiple-routes/src/handlers/Home.less b/test/test-cases/multiple-routes/app/src/handlers/Home.less similarity index 100% rename from test/test-cases/multiple-routes/src/handlers/Home.less rename to test/test-cases/multiple-routes/app/src/handlers/Home.less diff --git a/test/test-cases/multiple-routes/src/render.js b/test/test-cases/multiple-routes/app/src/render.js similarity index 100% rename from test/test-cases/multiple-routes/src/render.js rename to test/test-cases/multiple-routes/app/src/render.js diff --git a/test/test-cases/multiple-routes/multiple-routes.test.js b/test/test-cases/multiple-routes/multiple-routes.test.js index 502b652d9..fe644a0a9 100644 --- a/test/test-cases/multiple-routes/multiple-routes.test.js +++ b/test/test-cases/multiple-routes/multiple-routes.test.js @@ -1,10 +1,12 @@ +const path = require('path'); const dirContentsToObject = require('../../utils/dirContentsToObject'); const runSkuScriptInDir = require('../../utils/runSkuScriptInDir'); const waitForUrls = require('../../utils/waitForUrls'); const { getAppSnapshot } = require('../../utils/appSnapshot'); const startAssetServer = require('../../utils/assetServer'); +const appDir = path.resolve(__dirname, 'app'); -const targetDirectory = `${__dirname}/dist`; +const targetDirectory = `${appDir}/dist`; describe('multiple-routes', () => { describe('start', () => { @@ -12,7 +14,7 @@ describe('multiple-routes', () => { let server; beforeAll(async () => { - server = await runSkuScriptInDir('start', __dirname); + server = await runSkuScriptInDir('start', appDir); await waitForUrls(devServerUrl); }); @@ -31,11 +33,18 @@ describe('multiple-routes', () => { }); }); + describe('test', () => { + it('should handle dynamic imports in tests', async () => { + const { childProcess } = await runSkuScriptInDir('test', appDir); + expect(childProcess.exitCode).toEqual(0); + }); + }); + describe('build', () => { let closeAssetServer; beforeAll(async () => { - await runSkuScriptInDir('build', __dirname); + await runSkuScriptInDir('build', appDir); closeAssetServer = await startAssetServer(4004, targetDirectory, [ { source: '/', destination: '/production/au/index.html' }, ]); diff --git a/yarn.lock b/yarn.lock index afa126967..944bbbf94 100644 --- a/yarn.lock +++ b/yarn.lock @@ -910,6 +910,13 @@ dependencies: regenerator-runtime "^0.12.0" +"@babel/runtime@^7.3.4", "@babel/runtime@^7.4.2": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.2.tgz#f5ab6897320f16decd855eed70b705908a313fe8" + integrity sha512-7Bl2rALb7HpvXFL7TETNzKSAeBVCPHELzc0C//9FCxN8nsiueWSJBqaF+2oIJScyILStASR/Cx5WMkXGYTiJFA== + dependencies: + regenerator-runtime "^0.13.2" + "@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.1.2", "@babel/template@^7.2.2": version "7.2.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" @@ -1193,6 +1200,14 @@ resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8" integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== +"@jest/types@^24.5.0": + version "24.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.5.0.tgz#feee214a4d0167b0ca447284e95a57aa10b3ee95" + integrity sha512-kN7RFzNMf2R8UDadPOl6ReyI+MT8xfqRuAnuVL+i4gwjv/zubdDK+EDeLHYwq1j0CSSR2W/MmgaRlMZJzXdmVA== + dependencies: + "@types/istanbul-lib-coverage" "^1.1.0" + "@types/yargs" "^12.0.9" + "@loadable/babel-plugin@^5.6.0": version "5.6.0" resolved "https://registry.yarnpkg.com/@loadable/babel-plugin/-/babel-plugin-5.6.0.tgz#30b7713c29cbdcc64fba9ecb1bbb5a5340e30ff1" @@ -1355,6 +1370,11 @@ into-stream "^4.0.0" lodash "^4.17.4" +"@sheerun/mutationobserver-shim@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz#8013f2af54a2b7d735f71560ff360d3a8176a87b" + integrity sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q== + "@storybook/addon-knobs@^4.1.11": version "4.1.13" resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-4.1.13.tgz#7a5688903fde1726c168aa188216aaaafb3eb498" @@ -1734,6 +1754,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/istanbul-lib-coverage@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.0.tgz#2cc2ca41051498382b43157c8227fea60363f94a" + integrity sha512-ohkhb9LehJy+PA40rDtGAji61NCgdtKLAlFoYp4cnuuQEswwdK3vz9SOIkkyc3wrk8dzjphQApNs56yyXLStaQ== + "@types/jest-diff@*": version "20.0.1" resolved "https://registry.yarnpkg.com/@types/jest-diff/-/jest-diff-20.0.1.tgz#35cc15b9c4f30a18ef21852e255fdb02f6d59b89" @@ -1854,6 +1879,11 @@ "@types/uglify-js" "*" source-map "^0.6.0" +"@types/yargs@^12.0.9": + version "12.0.10" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.10.tgz#17a8ec65cd8e88f51b418ceb271af18d3137df67" + integrity sha512-WsVzTPshvCSbHThUduGGxbmnwcpkgSctHGHTqzWyFg4lYAuV5qXlyFPOsP3OWqCINfmg/8VXP+zJaa4OxEsBQQ== + "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -2650,7 +2680,7 @@ babel-plugin-add-react-displayname@^0.0.5: resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5" integrity sha1-M51M3be2X9YtHfnbn+BN4TQSK9U= -babel-plugin-dynamic-import-node@2.2.0: +babel-plugin-dynamic-import-node@2.2.0, babel-plugin-dynamic-import-node@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz#c0adfb07d95f4a4495e9aaac6ec386c4d7c2524e" integrity sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA== @@ -4956,6 +4986,16 @@ dom-serializer@0: domelementtype "^1.3.0" entities "^1.1.1" +dom-testing-library@^3.18.2: + version "3.18.2" + resolved "https://registry.yarnpkg.com/dom-testing-library/-/dom-testing-library-3.18.2.tgz#07d65166743ad3299b7bee5b488e9622c31241bc" + integrity sha512-+nYUgGhHarrCY8kLVmyHlgM+IGwBXXrYsWIJB6vpAx2ne9WFgKfwMGcOkkTKQhuAro0sP6RIuRGfm5NF3+ccmQ== + dependencies: + "@babel/runtime" "^7.3.4" + "@sheerun/mutationobserver-shim" "^0.3.2" + pretty-format "^24.5.0" + wait-for-expect "^1.1.0" + dom-walk@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" @@ -11273,6 +11313,16 @@ pretty-format@^24.0.0: ansi-regex "^4.0.0" ansi-styles "^3.2.0" +pretty-format@^24.5.0: + version "24.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.5.0.tgz#cc69a0281a62cd7242633fc135d6930cd889822d" + integrity sha512-/3RuSghukCf8Riu5Ncve0iI+BzVkbRU5EeUoArKARZobREycuH5O4waxvaNIloEXdb0qwgmEAed5vTpX1HNROQ== + dependencies: + "@jest/types" "^24.5.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + pretty-hrtime@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" @@ -11755,6 +11805,11 @@ react-is@^16.7.0, react-is@^16.8.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.3.tgz#4ad8b029c2a718fc0cfc746c8d4e1b7221e5387d" integrity sha512-Y4rC1ZJmsxxkkPuMLwvKvlL1Zfpbcu+Bf4ZigkHup3v9EfdYhAlWAaVyA19olXq2o2mGn0w+dFKvk3pVVlYcIA== +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== + react-isolated-scroll@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/react-isolated-scroll/-/react-isolated-scroll-0.1.1.tgz#781faea948ced62d07624d7e39a12bccb584a5c5" @@ -11857,6 +11912,14 @@ react-tabs@^2.2.2: classnames "^2.2.0" prop-types "^15.5.0" +react-testing-library@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/react-testing-library/-/react-testing-library-6.0.3.tgz#8b5d276a353c17ce4f7486015bb7a1c8827c442c" + integrity sha512-tN0A6nywSOoL8kriqru3rSdw31PxuquL7xnW6xBI0aTNw0VO3kZQtaEa0npUH9dX0MIsSunB0nbElRrc4VtAzw== + dependencies: + "@babel/runtime" "^7.4.2" + dom-testing-library "^3.18.2" + react-text-mask@^5.4.3: version "5.4.3" resolved "https://registry.yarnpkg.com/react-text-mask/-/react-text-mask-5.4.3.tgz#991efb4299e30c2e6c2c46d13f617169463e0d2d" @@ -12190,6 +12253,11 @@ regenerator-runtime@^0.12.0, regenerator-runtime@^0.12.1: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== + regenerator-transform@^0.13.4: version "0.13.4" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.4.tgz#18f6763cf1382c69c36df76c6ce122cc694284fb" @@ -14520,6 +14588,11 @@ w3c-hr-time@^1.0.1: dependencies: browser-process-hrtime "^0.1.2" +wait-for-expect@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-1.1.1.tgz#9cd10e07d52810af9e0aaf509872e38f3c3d81ae" + integrity sha512-vd9JOqqEcBbCDhARWhW85ecjaEcfBLuXgVBqatfS3iw6oU4kzAcs+sCNjF+TC9YHPImCW7ypsuQc+htscIAQCw== + wait-on@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-2.1.2.tgz#a976a6aac12bc23a9bcb974edc4a98f54abed236"