From 78fe38064f82153c5be8bf883c2ad99dd723c3b1 Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Wed, 20 Jan 2021 13:31:48 -0800 Subject: [PATCH 01/17] new(github/workflows): add happo job, split out test and lint jobs --- .github/workflows/ci.yml | 81 +++++++++++++++++++++++++--------------- 1 file changed, 50 insertions(+), 31 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 72cd15380..bcd422723 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,41 +2,60 @@ name: CI on: push: - branches: [ master ] + branches: [master] pull_request: - branches: [ master ] + branches: [master] jobs: build: runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: '12' + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - uses: actions/cache@v1 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + - name: Install dependencies + run: yarn install --frozen-lockfile --ignore-engines + - name: Build packages + run: yarn run build + + test: + needs: build + steps: + - name: Run jest + run: yarn run jest -w 4 + env: + CI: true + COVERAGE: true + - name: Report code coverage + uses: coverallsapp/github-action@v1.1.1 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + lint: + needs: build + steps: + - run: yarn run lint + + happo: + runs-on: ubuntu-latest + needs: build + working-directory: './packages/visx-happo/' steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '12' - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v1 - id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - name: Install dependencies - run: yarn install --frozen-lockfile --ignore-engines - - name: Build packages - run: yarn run build - - name: Run jest - run: yarn run jest -w 4 - env: - CI: true - COVERAGE: true - - name: Report code coverage - uses: coverallsapp/github-action@v1.1.1 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - - name: Run lint - run: yarn run lint + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + - run: npm ci + - run: npm run happo-ci-github-actions + env: + HAPPO_API_KEY: ${{ secrets.HAPPO_API_KEY }} + HAPPO_API_SECRET: ${{ secrets.HAPPO_API_SECRET }} From 39d3f5cff6e5a0c73eb2785ffa495ea78f546e4c Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Thu, 21 Jan 2021 18:52:13 -0800 Subject: [PATCH 02/17] deps(demo): add happo deps --- packages/visx-demo/package.json | 10 +- yarn.lock | 706 +++++++++++++++++++++++++++++++- 2 files changed, 698 insertions(+), 18 deletions(-) diff --git a/packages/visx-demo/package.json b/packages/visx-demo/package.json index 398ae117b..0f3bb420e 100644 --- a/packages/visx-demo/package.json +++ b/packages/visx-demo/package.json @@ -4,11 +4,13 @@ "description": "visx demo", "repository": "https://github.com/airbnb/visx", "scripts": { - "dev": "next", "build": "next build && next export", - "start": "next start", + "deploy": "rm -rf out && yarn build && cd out && touch .nojekyll && git init && git add . && git commit -m \"Deploy commit\" && git remote add origin git@github.com:airbnb/visx.git && git push -f origin master:gh-pages", + "dev": "next", + "happo": "happo", + "happo-ci-github-actions": "happo-ci-github-actions", "preview": "yarn build && cd ./out && npx serve", - "deploy": "rm -rf out && yarn build && cd out && touch .nojekyll && git init && git add . && git commit -m \"Deploy commit\" && git remote add origin git@github.com:airbnb/visx.git && git push -f origin master:gh-pages" + "start": "next start" }, "keywords": [ "visx", @@ -66,6 +68,7 @@ "@visx/xychart": "1.4.0", "@visx/zoom": "1.3.0", "@zeit/next-css": "^1.0.1", + "babel-loader": "8.2.2", "classnames": "^2.2.5", "d3-array": "^1.1.1", "d3-collection": "^1.0.4", @@ -77,6 +80,7 @@ "d3-scale-chromatic": "^1.3.3", "d3-shape": "^1.0.6", "d3-time-format": "^2.0.5", + "happo.io": "^6.4.0", "markdown-loader": "^5.1.0", "next": "9.5.4", "nprogress": "^0.2.0", diff --git a/yarn.lock b/yarn.lock index d67d720c2..8e4f3a9f2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -279,6 +279,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-annotate-as-pure@^7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d" + integrity sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ== + dependencies: + "@babel/types" "^7.12.10" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz#0ec7d9be8174934532661f87783eb18d72290059" @@ -500,6 +507,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-module-imports@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" + integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== + dependencies: + "@babel/types" "^7.12.5" + "@babel/helper-module-transforms@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" @@ -652,6 +666,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== +"@babel/helper-validator-identifier@^7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" + integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + "@babel/helper-wrap-function@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9" @@ -969,6 +988,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.1" +"@babel/plugin-syntax-jsx@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" + integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -1436,6 +1462,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-react-display-name@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.1.tgz#1cbcd0c3b1d6648c55374a22fc9b6b7e5341c00d" + integrity sha512-cAzB+UzBIrekfYxyLlFqf/OagTvHLcVBb5vpouzkYkBclRPraiygVnafvAoipErZLI8ANv8Ecn6E/m5qPXD26w== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-react-jsx-development@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.1.tgz#1ac6300d8b28ef381ee48e6fec430cc38047b7f3" @@ -1454,6 +1487,13 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.10.4" +"@babel/plugin-transform-react-jsx-development@^7.12.7": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.12.tgz#bccca33108fe99d95d7f9e82046bfe762e71f4e7" + integrity sha512-i1AxnKxHeMxUaWVXQOSIco4tvVvvCxMSfeBMnMM06mpaJt3g+MpxYQQrDfojUQldP1xxraPSJYSMEljoWM/dCg== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.12.12" + "@babel/plugin-transform-react-jsx-self@^7.10.1", "@babel/plugin-transform-react-jsx-self@^7.8.3": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.1.tgz#22143e14388d72eb88649606bb9e46f421bc3821" @@ -1506,6 +1546,17 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-jsx" "^7.10.4" +"@babel/plugin-transform-react-jsx@^7.12.10", "@babel/plugin-transform-react-jsx@^7.12.12": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.12.tgz#b0da51ffe5f34b9a900e9f1f5fb814f9e512d25e" + integrity sha512-JDWGuzGNWscYcq8oJVCtSE61a5+XAOos+V0HrxnDieUus4UMnBEosDnY1VJqU5iZ4pA04QY7l0+JvHL1hZEfsw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.12.10" + "@babel/helper-module-imports" "^7.12.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-jsx" "^7.12.1" + "@babel/types" "^7.12.12" + "@babel/plugin-transform-react-pure-annotations@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.1.tgz#f5e7c755d3e7614d4c926e144f501648a5277b70" @@ -1522,6 +1573,14 @@ "@babel/helper-annotate-as-pure" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-transform-react-pure-annotations@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" + integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-regenerator@^7.10.1": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz#10e175cbe7bdb63cc9b39f9b3f823c5c7c5c5490" @@ -1693,6 +1752,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" +"@babel/polyfill@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.12.1.tgz#1f2d6371d1261bbd961f3c5d5909150e12d0bd96" + integrity sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g== + dependencies: + core-js "^2.6.5" + regenerator-runtime "^0.13.4" + "@babel/preset-env@7.11.5": version "7.11.5" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.5.tgz#18cb4b9379e3e92ffea92c07471a99a2914e4272" @@ -1872,6 +1939,17 @@ "@babel/plugin-transform-react-jsx-source" "^7.10.4" "@babel/plugin-transform-react-pure-annotations" "^7.10.4" +"@babel/preset-react@^7.12.1": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.10.tgz#4fed65f296cbb0f5fb09de6be8cddc85cc909be9" + integrity sha512-vtQNjaHRl4DUpp+t+g4wvTHsLQuye+n0H/wsXIZRn69oz/fvNC7gQ4IK73zGJBaxvHoxElDvnYCthMcT7uzFoQ== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-transform-react-display-name" "^7.12.1" + "@babel/plugin-transform-react-jsx" "^7.12.10" + "@babel/plugin-transform-react-jsx-development" "^7.12.7" + "@babel/plugin-transform-react-pure-annotations" "^7.12.1" + "@babel/preset-react@^7.8.3": version "7.10.1" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.1.tgz#e2ab8ae9a363ec307b936589f07ed753192de041" @@ -2005,6 +2083,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.12.10", "@babel/types@^7.12.12", "@babel/types@^7.12.5": + version "7.12.12" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" + integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -4000,6 +4087,11 @@ abab@^2.0.0: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== +abab@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -4020,6 +4112,14 @@ acorn-globals@^4.3.2: acorn "^6.0.1" acorn-walk "^6.0.1" +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + acorn-jsx@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" @@ -4030,6 +4130,11 @@ acorn-walk@^6.0.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c" integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + acorn@^6.0.1, acorn@^6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" @@ -4262,6 +4367,35 @@ aproba@^2.0.0: resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== +archiver-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" + integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== + dependencies: + glob "^7.1.4" + graceful-fs "^4.2.0" + lazystream "^1.0.0" + lodash.defaults "^4.2.0" + lodash.difference "^4.5.0" + lodash.flatten "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.union "^4.6.0" + normalize-path "^3.0.0" + readable-stream "^2.0.0" + +archiver@^5.0.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.2.0.tgz#25aa1b3d9febf7aec5b0f296e77e69960c26db94" + integrity sha512-QEAKlgQuAtUxKeZB9w5/ggKXh21bZS+dzzuQ0RPBC20qtDCbTyzqmisoeJP46MP39fg4B4IcyvR+yeyEBdblsQ== + dependencies: + archiver-utils "^2.1.0" + async "^3.2.0" + buffer-crc32 "^0.2.1" + readable-stream "^3.6.0" + readdir-glob "^1.0.0" + tar-stream "^2.1.4" + zip-stream "^4.0.4" + are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" @@ -4472,6 +4606,18 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== +async-retry@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.1.tgz#139f31f8ddce50c0870b0ba558a6079684aaed55" + integrity sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA== + dependencies: + retry "0.12.0" + +async@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" + integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -4546,7 +4692,17 @@ babel-literal-to-ast@^2.1.0: "@babel/traverse" "^7.1.6" "@babel/types" "^7.1.6" -babel-plugin-dynamic-import-node@^2.3.3: +babel-loader@8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" + integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.1.0, babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== @@ -4658,6 +4814,11 @@ base64-js@^1.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -4705,6 +4866,15 @@ bindings@^1.5.0: dependencies: file-uri-to-path "1.0.0" +bl@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489" + integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -4873,6 +5043,16 @@ btoa-lite@^1.0.0: resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= +buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: + 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-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + buffer-from@1.x, buffer-from@^1.0.0, buffer-from@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -4900,6 +5080,14 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -4979,6 +5167,14 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + call-me-maybe@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" @@ -5424,7 +5620,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@2, commander@^2.11.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.3: +commander@2, commander@^2.11.0, commander@^2.15.1, commander@^2.19.0, commander@^2.20.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -5459,6 +5655,16 @@ compose-function@3.0.3: dependencies: arity-n "^1.0.4" +compress-commons@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.0.2.tgz#d6896be386e52f37610cef9e6fa5defc58c31bd7" + integrity sha512-qhd32a9xgzmpfoga1VQEiLEwdKZ6Plnpx5UCgIsf89FSolyJ7WnifY4Gtjgv5WR6hWAyRaHxC5MiEhU/38U70A== + dependencies: + buffer-crc32 "^0.2.13" + crc32-stream "^4.0.1" + normalize-path "^3.0.0" + readable-stream "^3.6.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -5660,6 +5866,11 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= +core-js@^2.6.5: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -5686,6 +5897,22 @@ coveralls@^3.0.6: minimist "^1.2.5" request "^2.88.2" +crc-32@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" + integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + +crc32-stream@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.1.tgz#0f047d74041737f8a55e86837a1b826bd8ab0067" + integrity sha512-FN5V+weeO/8JaXsamelVYO1PHyeCsuL3HcG4cqsj0ceARcocxalaShCsohZMSAF+db7UYFwBy1rARK/0oFItUw== + dependencies: + crc-32 "^1.2.0" + readable-stream "^3.4.0" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -5872,7 +6099,7 @@ cssnano-simple@1.2.0: cssnano-preset-simple "1.2.0" postcss "^7.0.32" -cssom@^0.4.1: +cssom@^0.4.1, cssom@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== @@ -5882,7 +6109,7 @@ cssom@~0.3.6: resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssstyle@^2.0.0: +cssstyle@^2.0.0, cssstyle@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== @@ -6118,6 +6345,15 @@ data-urls@^1.1.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" @@ -6181,6 +6417,11 @@ decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decimal.js@^10.2.0: + version "10.2.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" + integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== + 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" @@ -6388,6 +6629,13 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + domhandler@3.0.0, domhandler@^3.0, domhandler@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9" @@ -6471,6 +6719,13 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + edit-json-file@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/edit-json-file/-/edit-json-file-1.4.0.tgz#bb244abf7fc47a23f3dfb7c106a80f2ef83c39c3" @@ -6537,7 +6792,7 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -6695,6 +6950,26 @@ es-abstract@^1.17.0, es-abstract@^1.17.0-next.0, es-abstract@^1.17.0-next.1, es- string.prototype.trimleft "^2.1.1" string.prototype.trimright "^2.1.1" +es-abstract@^1.18.0-next.1: + version "1.18.0-next.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" + integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.1" + is-regex "^1.1.1" + object-inspect "^1.9.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.3" + string.prototype.trimstart "^1.0.3" + es-array-method-boxes-properly@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" @@ -6792,6 +7067,18 @@ escodegen@^1.11.1: optionalDependencies: source-map "~0.6.1" +escodegen@^1.14.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + eslint-ast-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-ast-utils/-/eslint-ast-utils-1.1.0.tgz#3d58ba557801cfb1c941d68131ee9f8c34bd1586" @@ -7139,6 +7426,11 @@ execa@^4.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -7358,7 +7650,7 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-cache-dir@3.3.1: +find-cache-dir@3.3.1, find-cache-dir@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== @@ -7474,6 +7766,11 @@ front-matter@^2.3.0: dependencies: js-yaml "^3.10.0" +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -7599,6 +7896,15 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49" + integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -7808,6 +8114,32 @@ handlebars@4.5.3, handlebars@^4.7.6: optionalDependencies: uglify-js "^3.1.4" +happo.io@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/happo.io/-/happo.io-6.4.0.tgz#32e81af3c8e8ccc9905e0aef10db268928a2d90f" + integrity sha512-ki2bZu7rSASR5Dpg3HkrOf37MXDZoBImVKOY8+XEWFLQvaM3uioVFKD+txD/lOUeZJGD6dJZ1R62sWwXljosow== + dependencies: + "@babel/polyfill" "^7.12.1" + "@babel/preset-react" "^7.12.1" + archiver "^5.0.2" + async-retry "^1.3.1" + babel-plugin-dynamic-import-node "^2.1.0" + commander "^2.15.1" + glob "^7.1.2" + jsdom "^16.4.0" + jsonwebtoken "^8.2.1" + lcs-image-diff "^2.0.0" + mkdirp "^0.5.1" + parse-srcset "^1.0.2" + pngjs "^3.4.0" + request "^2.85.0" + request-promise-native "^1.0.5" + require-relative "^0.8.7" + rimraf "^3.0.0" + source-map-support "^0.5.9" + string.prototype.matchall "^4.0.0" + supports-color "^7.1.0" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -7954,6 +8286,13 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -8113,6 +8452,11 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: dependencies: postcss "^7.0.14" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" @@ -8140,6 +8484,11 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +imagetracerjs@^1.2.5: + version "1.2.6" + resolved "https://registry.yarnpkg.com/imagetracerjs/-/imagetracerjs-1.2.6.tgz#1f618b9b94b6f298145ce9cb5e74a88447f15184" + integrity sha512-LKJlnKmXFzDdh6IZtXTyBxXcCLTAkwgKYS+NMiPXiXVnlTLjQC8fq7U89laUSgHtypJB3TdMMDK4ecG5NI/Cgw== + import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" @@ -8405,6 +8754,11 @@ is-callable@^1.1.4, is-callable@^1.1.5: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== +is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -8539,6 +8893,11 @@ is-map@^2.0.1: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + is-number-object@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" @@ -8580,6 +8939,11 @@ is-plain-object@^3.0.0: dependencies: isobject "^4.0.0" +is-potential-custom-element-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" + integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + is-regex@^1.0.4, is-regex@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" @@ -8587,6 +8951,13 @@ is-regex@^1.0.4, is-regex@^1.0.5: dependencies: has "^1.0.3" +is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + is-set@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" @@ -9233,6 +9604,38 @@ jsdom@^15.2.1: ws "^7.0.0" xml-name-validator "^3.0.0" +jsdom@^16.4.0: + version "16.4.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" + integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== + dependencies: + abab "^2.0.3" + acorn "^7.1.1" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.2.0" + data-urls "^2.0.0" + decimal.js "^10.2.0" + domexception "^2.0.1" + escodegen "^1.14.1" + html-encoding-sniffer "^2.0.1" + is-potential-custom-element-name "^1.0.0" + nwsapi "^2.2.0" + parse5 "5.1.1" + request "^2.88.2" + request-promise-native "^1.0.8" + saxes "^5.0.0" + symbol-tree "^3.2.4" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + ws "^7.2.3" + xml-name-validator "^3.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -9294,6 +9697,22 @@ jsonparse@^1.2.0: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= +jsonwebtoken@^8.2.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -9312,6 +9731,23 @@ jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: array-includes "^3.1.1" object.assign "^4.1.0" +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + 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" @@ -9346,6 +9782,13 @@ klona@^2.0.3: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ= + dependencies: + readable-stream "^2.0.5" + lcid@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/lcid/-/lcid-3.1.1.tgz#9030ec479a058fc36b5e8243ebaac8b6ac582fd0" @@ -9358,6 +9801,13 @@ lcov-parse@^1.0.0: resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-1.0.0.tgz#eb0d46b54111ebc561acb4c408ef9363bdc8f7e0" integrity sha1-6w1GtUER68VhrLTECO+TY73I9+A= +lcs-image-diff@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/lcs-image-diff/-/lcs-image-diff-2.0.1.tgz#53901063e032478ff4ce0c04ffe7f0f791869fda" + integrity sha512-ahY+sUAThUnL4J5eGBOjA4QaPCN+n55rOzUz2/uY1y6VJA1tQTkhJqUSlvsDm3YrMcRmoUbD1l/asMa77YSXzw== + dependencies: + imagetracerjs "^1.2.5" + lerna@^3.15.0: version "3.22.0" resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.22.0.tgz#da14d08f183ffe6eec566a4ef3f0e11afa621183" @@ -9472,7 +9922,7 @@ loader-utils@2.0.0, loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== @@ -9519,16 +9969,31 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + lodash.defaultsdeep@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6" integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== +lodash.difference@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" + integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= + lodash.escape@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" integrity sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg= +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -9539,16 +10004,46 @@ lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + lodash.isequal@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + lodash.kebabcase@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" @@ -9559,6 +10054,11 @@ lodash.memoize@4.x: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -9589,6 +10089,11 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" +lodash.union@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -9702,7 +10207,7 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2: +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -10600,6 +11105,11 @@ object-inspect@^1.7.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + object-is@^1.0.1, object-is@^1.0.2: version "1.1.2" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" @@ -10635,6 +11145,16 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + object.entries@^1.1.0, object.entries@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" @@ -10983,6 +11503,11 @@ parse-path@^4.0.0: is-ssh "^1.3.0" protocols "^1.4.0" +parse-srcset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1" + integrity sha1-8r0iH2zJcKk42IVWq8WJyqqiveE= + parse-url@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-5.0.1.tgz#99c4084fc11be14141efa41b3d117a96fcb9527f" @@ -10998,6 +11523,11 @@ parse5@5.1.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ== +parse5@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + parse5@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" @@ -11210,6 +11740,11 @@ pn@^1.1.0: resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== +pngjs@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + pnp-webpack-plugin@1.6.4: version "1.6.4" resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" @@ -11410,6 +11945,11 @@ pretty-ms@^5.1.0: dependencies: parse-ms "^2.1.0" +printj@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" + integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== + prismjs@^1.19.0: version "1.20.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.20.0.tgz#9b685fc480a3514ee7198eac6a3bf5024319ff03" @@ -11871,7 +12411,7 @@ read@1, read@~1.0.1: dependencies: mute-stream "~0.0.4" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -11884,7 +12424,7 @@ read@1, read@~1.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0: +"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -11893,6 +12433,13 @@ read@1, read@~1.0.1: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdir-glob@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4" + integrity sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA== + dependencies: + minimatch "^3.0.4" + readdir-scoped-modules@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" @@ -12124,6 +12671,22 @@ request-promise-core@1.1.3: dependencies: lodash "^4.17.15" +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.5, request-promise-native@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + request-promise-native@^1.0.7: version "1.0.8" resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" @@ -12133,7 +12696,7 @@ request-promise-native@^1.0.7: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.88.0, request@^2.88.2: +request@^2.85.0, request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -12169,6 +12732,11 @@ require-main-filename@^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== +require-relative@^0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" + integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= + reserved-words@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/reserved-words/-/reserved-words-0.1.2.tgz#00a0940f98cd501aeaaac316411d9adc52b31ab1" @@ -12262,6 +12830,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retry@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + retry@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" @@ -12418,6 +12991,13 @@ saxes@^3.1.9: dependencies: xmlchars "^2.1.1" +saxes@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + scheduler@^0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" @@ -12582,6 +13162,15 @@ side-channel@^1.0.2: es-abstract "^1.17.0-next.1" object-inspect "^1.7.0" +side-channel@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -12706,7 +13295,7 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.6, source-map-support@~0.5.12: +source-map-support@^0.5.6, source-map-support@^0.5.9, source-map-support@~0.5.12: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -12940,6 +13529,19 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string.prototype.matchall@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.3.tgz#24243399bc31b0a49d19e2b74171a15653ec996a" + integrity sha512-OBxYDA2ifZQ2e13cP82dWFMaCV9CGF8GzmN4fljBVw5O5wep0lu4gacm1OL6MjROoUnB8VbkWRThqkV2YFLNxw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.3" + "string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" @@ -12985,6 +13587,14 @@ string.prototype.trimend@^1.0.0: define-properties "^1.1.3" es-abstract "^1.17.5" +string.prototype.trimend@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" + integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + string.prototype.trimleft@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" @@ -13011,6 +13621,14 @@ string.prototype.trimstart@^1.0.0: define-properties "^1.1.3" es-abstract "^1.17.5" +string.prototype.trimstart@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" + integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -13192,7 +13810,7 @@ symbol-observable@^1.0.4: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== -symbol-tree@^3.2.2: +symbol-tree@^3.2.2, symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== @@ -13220,6 +13838,17 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" @@ -13476,6 +14105,13 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +tr46@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== + dependencies: + punycode "^2.1.1" + traverse@0.6.6: version "0.6.6" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" @@ -13942,7 +14578,7 @@ w-json@^1.3.5: resolved "https://registry.yarnpkg.com/w-json/-/w-json-1.3.9.tgz#c1ddfbae1279f7e84d5a1bd587b53a03f5c5cff8" integrity sha512-9hvWhnNZ5J3ypOJt2LzmAQBl1NrQBZED/E8MwkZQ+lGTq51hyR9zeH0dgaJzLfzOVoTbxe/yPqL10c5WVsHvbg== -w3c-hr-time@^1.0.1: +w3c-hr-time@^1.0.1, w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== @@ -13958,6 +14594,13 @@ w3c-xmlserializer@^1.1.2: webidl-conversions "^4.0.2" xml-name-validator "^3.0.0" +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -14008,6 +14651,16 @@ webidl-conversions@^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== +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + webpack-log@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" @@ -14081,6 +14734,15 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" +whatwg-url@^8.0.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" + integrity sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^6.1.0" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -14217,6 +14879,11 @@ ws@^7.0.0: resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== +ws@^7.2.3: + version "7.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd" + integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA== + x-is-string@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" @@ -14227,7 +14894,7 @@ xml-name-validator@^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== -xmlchars@^2.1.1: +xmlchars@^2.1.1, xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== @@ -14323,3 +14990,12 @@ yargs@^15.3.1: which-module "^2.0.0" y18n "^4.0.0" yargs-parser "^18.1.1" + +zip-stream@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.0.4.tgz#3a8f100b73afaa7d1ae9338d910b321dec77ff3a" + integrity sha512-a65wQ3h5gcQ/nQGWV1mSZCEzCML6EK/vyVPcrPNynySP1j3VBbQKh3nhC8CbORb+jfl2vXvh56Ul5odP1bAHqw== + dependencies: + archiver-utils "^2.1.0" + compress-commons "^4.0.2" + readable-stream "^3.6.0" From 06dcaa4cb6959416fee10d7caebf52b26367b3d9 Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Thu, 21 Jan 2021 18:52:55 -0800 Subject: [PATCH 03/17] new(demo/Gallery): export tiles --- packages/visx-demo/src/components/Gallery/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/visx-demo/src/components/Gallery/index.tsx b/packages/visx-demo/src/components/Gallery/index.tsx index 760d1e3e3..a7305b2a5 100644 --- a/packages/visx-demo/src/components/Gallery/index.tsx +++ b/packages/visx-demo/src/components/Gallery/index.tsx @@ -53,7 +53,7 @@ import exampleToVisxDependencyLookup, { const tiltOptions = { max: 8, scale: 1 }; -const tiles = [ +export const tiles = [ CurvesTile, BarsTile, DotsTile, From 151b62c1aae08b712b7725510a3a1f00479c8726 Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Thu, 21 Jan 2021 18:53:41 -0800 Subject: [PATCH 04/17] fix(demo): ensure unique sandbox names, ensure correct example package.json import --- packages/visx-demo/src/components/Gallery/AnnotationTile.tsx | 2 +- .../visx-demo/src/components/Gallery/SplitLinePathTile.tsx | 2 +- packages/visx-demo/src/components/Gallery/TextTile.tsx | 2 +- packages/visx-demo/src/sandboxes/visx-annotation/Example.tsx | 2 ++ packages/visx-demo/src/sandboxes/visx-annotation/package.json | 3 ++- packages/visx-demo/src/sandboxes/visx-glyph/package.json | 2 +- packages/visx-demo/src/sandboxes/visx-legend/package.json | 2 +- packages/visx-demo/src/sandboxes/visx-pattern/package.json | 4 ++-- .../visx-demo/src/sandboxes/visx-streamgraph/package.json | 2 +- 9 files changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/visx-demo/src/components/Gallery/AnnotationTile.tsx b/packages/visx-demo/src/components/Gallery/AnnotationTile.tsx index c3885f78d..7cee23ee5 100644 --- a/packages/visx-demo/src/components/Gallery/AnnotationTile.tsx +++ b/packages/visx-demo/src/components/Gallery/AnnotationTile.tsx @@ -2,7 +2,7 @@ import React from 'react'; import Annotation, { AnnotationProps, greens } from '../../sandboxes/visx-annotation/Example'; import GalleryTile from '../GalleryTile'; -export { default as packageJson } from '../../sandboxes/visx-area/package.json'; +export { default as packageJson } from '../../sandboxes/visx-annotation/package.json'; const tileStyles = { background: greens[0] }; const detailsStyles: React.CSSProperties = { diff --git a/packages/visx-demo/src/components/Gallery/SplitLinePathTile.tsx b/packages/visx-demo/src/components/Gallery/SplitLinePathTile.tsx index 6d048d818..411a0f035 100644 --- a/packages/visx-demo/src/components/Gallery/SplitLinePathTile.tsx +++ b/packages/visx-demo/src/components/Gallery/SplitLinePathTile.tsx @@ -5,7 +5,7 @@ import SplitLinePath, { } from '../../sandboxes/visx-shape-splitlinepath/Example'; import GalleryTile from '../GalleryTile'; -export { default as packageJson } from '../../sandboxes/visx-area/package.json'; +export { default as packageJson } from '../../sandboxes/visx-shape-splitlinepath/package.json'; const tileStyles = { background: backgroundLight }; const detailsStyles = { color: 'white' }; diff --git a/packages/visx-demo/src/components/Gallery/TextTile.tsx b/packages/visx-demo/src/components/Gallery/TextTile.tsx index e7ce59f6c..09a7f1bee 100644 --- a/packages/visx-demo/src/components/Gallery/TextTile.tsx +++ b/packages/visx-demo/src/components/Gallery/TextTile.tsx @@ -1,7 +1,7 @@ import React from 'react'; import GalleryTile from '../GalleryTile'; -export const packageJson = { name: 'visx-text', dependencies: { '@visx/text': 'current' } }; +export const packageJson = { name: '@visx/demo-text', dependencies: { '@visx/text': 'current' } }; const tileStyles = { background: 'white', border: '1px solid lightgray', borderRadius: '14px' }; const detailsStyles = { color: '#232323', zIndex: 1 }; diff --git a/packages/visx-demo/src/sandboxes/visx-annotation/Example.tsx b/packages/visx-demo/src/sandboxes/visx-annotation/Example.tsx index 30e2ffaec..bf45f4211 100644 --- a/packages/visx-demo/src/sandboxes/visx-annotation/Example.tsx +++ b/packages/visx-demo/src/sandboxes/visx-annotation/Example.tsx @@ -1,6 +1,8 @@ import React from 'react'; import { Label, Connector, CircleSubject, LineSubject } from '@visx/annotation'; import { LinePath } from '@visx/shape'; +// import resizeObserverPolyfill from 'resize-observer-polyfill'; + import ExampleControls from './ExampleControls'; import findNearestDatum from './findNearestDatum'; diff --git a/packages/visx-demo/src/sandboxes/visx-annotation/package.json b/packages/visx-demo/src/sandboxes/visx-annotation/package.json index ffe4b6d2b..c45d24995 100644 --- a/packages/visx-demo/src/sandboxes/visx-annotation/package.json +++ b/packages/visx-demo/src/sandboxes/visx-annotation/package.json @@ -1,5 +1,5 @@ { - "name": "@visx/annotation-example", + "name": "@visx/demo-annotation", "description": "Standalone visx annotation demo.", "main": "index.tsx", "private": true, @@ -16,6 +16,7 @@ "react": "^16", "react-dom": "^16", "react-scripts-ts": "3.1.0", + "resize-observer-polyfill": "1.5.1", "typescript": "^3" }, "keywords": [ diff --git a/packages/visx-demo/src/sandboxes/visx-glyph/package.json b/packages/visx-demo/src/sandboxes/visx-glyph/package.json index 026b3c5b9..5160acc7a 100644 --- a/packages/visx-demo/src/sandboxes/visx-glyph/package.json +++ b/packages/visx-demo/src/sandboxes/visx-glyph/package.json @@ -1,5 +1,5 @@ { - "name": "@visx/demo-glyphs", + "name": "@visx/demo-glyph", "description": "Standalone visx glyph demo.", "main": "index.tsx", "private": true, diff --git a/packages/visx-demo/src/sandboxes/visx-legend/package.json b/packages/visx-demo/src/sandboxes/visx-legend/package.json index a26c8cf2e..6b23b0094 100644 --- a/packages/visx-demo/src/sandboxes/visx-legend/package.json +++ b/packages/visx-demo/src/sandboxes/visx-legend/package.json @@ -1,5 +1,5 @@ { - "name": "@visx/demo-legends", + "name": "@visx/demo-legend", "description": "Standalone visx legends demo.", "main": "index.tsx", "private": true, diff --git a/packages/visx-demo/src/sandboxes/visx-pattern/package.json b/packages/visx-demo/src/sandboxes/visx-pattern/package.json index 46d1c60c0..f928c7365 100644 --- a/packages/visx-demo/src/sandboxes/visx-pattern/package.json +++ b/packages/visx-demo/src/sandboxes/visx-pattern/package.json @@ -1,6 +1,6 @@ { - "name": "@visx/demo-example", - "description": "Standalone visx demo.", + "name": "@visx/demo-pattern", + "description": "Standalone visx pattern demo.", "main": "index.tsx", "private": true, "dependencies": { diff --git a/packages/visx-demo/src/sandboxes/visx-streamgraph/package.json b/packages/visx-demo/src/sandboxes/visx-streamgraph/package.json index 496e2e73d..9cb7d9915 100644 --- a/packages/visx-demo/src/sandboxes/visx-streamgraph/package.json +++ b/packages/visx-demo/src/sandboxes/visx-streamgraph/package.json @@ -1,5 +1,5 @@ { - "name": "@visx/demo-example", + "name": "@visx/demo-streamgraph", "description": "Standalone visx streamgraph demo.", "main": "index.tsx", "private": true, From 6f4b5dcce9609dc136dfa394a17102aeb803ac5f Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Thu, 21 Jan 2021 18:53:56 -0800 Subject: [PATCH 05/17] new(demo/happo): add happo config --- packages/visx-demo/.happo.js | 66 ++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 packages/visx-demo/.happo.js diff --git a/packages/visx-demo/.happo.js b/packages/visx-demo/.happo.js new file mode 100644 index 000000000..5cdc086f8 --- /dev/null +++ b/packages/visx-demo/.happo.js @@ -0,0 +1,66 @@ +const { RemoteBrowserTarget } = require('happo.io'); +const { findPagesDir } = require('next/dist/lib/find-pages-dir'); +const getWebpackConfig = require('next/dist/build/webpack-config').default; +const nextConfig = require('./next.config'); +const path = require('path'); + +const happoTmpDir = './.happo'; // should match .gitignore + +module.exports = { + // these are provided via github actions in CI, locally you + // need to provide them yourself + apiKey: process.env.HAPPO_API_KEY, + apiSecret: process.env.HAPPO_API_SECRET, + + // ms timeout for async examples (default=200) + asyncTimeout: 500, + + // don't use JSDOM for rendering. saves having to mock out + // things like getBoundingClientRect + canvas element methods + prerender: false, + + stylesheets: [path.join(__dirname, '/public/static/doc_styles.css')], + + // happo snapshots to include + include: 'happo/*.@(ts|tsx)', + + targets: { + 'chrome-desktop': new RemoteBrowserTarget('chrome', { + viewport: '800x552', + }), + }, + + // extend next's webpack config so examples can be used directly + // this is largely taken from the happo storybook plugin + customizeWebpackConfig: async config => { + const base = await getWebpackConfig(__dirname, { + config: { + devIndicators: {}, + distDir: happoTmpDir, + experimental: { plugins: [] }, + future: {}, + env: {}, + pageExtensions: ['pages.js'], + sassOptions: {}, // we don't have this loader + ...nextConfig, + }, + rewrites: [], + entrypoints: {}, + pagesDir: findPagesDir(process.cwd()), + }); + config.plugins = base.plugins; + config.resolve = base.resolve; + config.resolveLoader = base.resolveLoader; + Object.keys(config.resolve.alias).forEach(key => { + if (!config.resolve.alias[key]) { + delete config.resolve.alias[key]; + } + }); + config.module = base.module; + return config; + }, + + // happo is unable to resolve some imports if the tmpdir isn't located inside + // the project structure. The default is an OS provided folder, `os.tmpdir()`. + tmpdir: path.join(__dirname, happoTmpDir), +}; From f8733819ce6766f438004a644aaeafb04e1e37ba Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Thu, 21 Jan 2021 18:54:26 -0800 Subject: [PATCH 06/17] new(demo/happo): add snapshots for all gallery examples --- packages/visx-demo/happo/gallery.tsx | 55 ++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 packages/visx-demo/happo/gallery.tsx diff --git a/packages/visx-demo/happo/gallery.tsx b/packages/visx-demo/happo/gallery.tsx new file mode 100644 index 000000000..274400785 --- /dev/null +++ b/packages/visx-demo/happo/gallery.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { tiles as examples } from '../src/components/Gallery'; +import AxisTile from '../src/components/Gallery/AxisTile'; +import XYChartTile from '../src/components/Gallery/XYChartTile'; + +type HappoSnapshot = { + component: string; + variants: { + [key: string]: ( + renderInDom: (component: React.ReactElement) => void, + ) => React.ReactNode | Promise; + }; +}; + +const MAX_TIMEOUT_MS = 400; +const specialCases = new Set(['@visx/demo-axis', '@visx/demo-xychart']); + +function getComponentName(T: typeof examples[0]) { + return T.packageJson.name || 'missing-name'; +} + +const snapshots: HappoSnapshot[] = examples + .filter(Example => !specialCases.has(getComponentName(Example))) + .map(Example => ({ + // note: this (reasonably) asserts Examples have unique names + component: getComponentName(Example), + variants: { default: () => }, + })); + +export default snapshots.concat([ + // needs timeout for animated axes + { + component: '@visx/demo-axis', + variants: { + default: renderInDom => { + return new Promise(resolve => { + renderInDom(); + setTimeout(() => resolve(), MAX_TIMEOUT_MS); + }); + }, + }, + }, + // needs timeout for animated axes + { + component: '@visx/demo-xychart', + variants: { + default: renderInDom => { + return new Promise(resolve => { + renderInDom(); + setTimeout(() => resolve(), MAX_TIMEOUT_MS); + }); + }, + }, + }, +]); From e0d9282cb676c79a217970373b91aa4aa7c01f54 Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Fri, 22 Jan 2021 12:12:56 -0800 Subject: [PATCH 07/17] github(workflow): add runs-on to all jobs --- .github/workflows/ci.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bcd422723..bf8057c7c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,13 +27,14 @@ jobs: - name: Install dependencies run: yarn install --frozen-lockfile --ignore-engines - name: Build packages - run: yarn run build + run: yarn build test: + runs-on: ubuntu-latest needs: build steps: - name: Run jest - run: yarn run jest -w 4 + run: yarn jest -w 4 env: CI: true COVERAGE: true @@ -43,9 +44,10 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} lint: + runs-on: ubuntu-latest needs: build steps: - - run: yarn run lint + - run: yarn lint happo: runs-on: ubuntu-latest @@ -54,8 +56,8 @@ jobs: steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 - - run: npm ci - - run: npm run happo-ci-github-actions + - run: yarn ci + - run: yarn run happo-ci-github-actions env: HAPPO_API_KEY: ${{ secrets.HAPPO_API_KEY }} HAPPO_API_SECRET: ${{ secrets.HAPPO_API_SECRET }} From 6f39705fff2e15889780bd5a637144f5e2052c0c Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Fri, 22 Jan 2021 12:13:35 -0800 Subject: [PATCH 08/17] fix(happo): use .happo.js asyncTimeout for max timeout in snapshots --- packages/visx-demo/happo/gallery.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/visx-demo/happo/gallery.tsx b/packages/visx-demo/happo/gallery.tsx index 274400785..89608a2f9 100644 --- a/packages/visx-demo/happo/gallery.tsx +++ b/packages/visx-demo/happo/gallery.tsx @@ -2,6 +2,7 @@ import React from 'react'; import { tiles as examples } from '../src/components/Gallery'; import AxisTile from '../src/components/Gallery/AxisTile'; import XYChartTile from '../src/components/Gallery/XYChartTile'; +import { asyncTimeout } from '../.happo.js'; type HappoSnapshot = { component: string; @@ -12,7 +13,6 @@ type HappoSnapshot = { }; }; -const MAX_TIMEOUT_MS = 400; const specialCases = new Set(['@visx/demo-axis', '@visx/demo-xychart']); function getComponentName(T: typeof examples[0]) { @@ -35,7 +35,7 @@ export default snapshots.concat([ default: renderInDom => { return new Promise(resolve => { renderInDom(); - setTimeout(() => resolve(), MAX_TIMEOUT_MS); + setTimeout(resolve, asyncTimeout); }); }, }, @@ -47,7 +47,7 @@ export default snapshots.concat([ default: renderInDom => { return new Promise(resolve => { renderInDom(); - setTimeout(() => resolve(), MAX_TIMEOUT_MS); + setTimeout(resolve, asyncTimeout); }); }, }, From 0288009af23b3b34987c6f2b1da768dd49bb8988 Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Fri, 22 Jan 2021 12:15:16 -0800 Subject: [PATCH 09/17] fix(happo): use better variable name, T => Example --- packages/visx-demo/happo/gallery.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/visx-demo/happo/gallery.tsx b/packages/visx-demo/happo/gallery.tsx index 89608a2f9..0b396277e 100644 --- a/packages/visx-demo/happo/gallery.tsx +++ b/packages/visx-demo/happo/gallery.tsx @@ -15,9 +15,8 @@ type HappoSnapshot = { const specialCases = new Set(['@visx/demo-axis', '@visx/demo-xychart']); -function getComponentName(T: typeof examples[0]) { - return T.packageJson.name || 'missing-name'; -} +const getComponentName = (Example: typeof examples[0]) => + Example.packageJson.name || 'missing-name'; const snapshots: HappoSnapshot[] = examples .filter(Example => !specialCases.has(getComponentName(Example))) From e27faf7f9389eb7e7296c213ebbdb60b3d8dee56 Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Fri, 22 Jan 2021 12:15:34 -0800 Subject: [PATCH 10/17] fix(demo/annotation): remove unneeded deps --- packages/visx-demo/src/sandboxes/visx-annotation/Example.tsx | 1 - packages/visx-demo/src/sandboxes/visx-annotation/package.json | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/visx-demo/src/sandboxes/visx-annotation/Example.tsx b/packages/visx-demo/src/sandboxes/visx-annotation/Example.tsx index bf45f4211..4b54ad03d 100644 --- a/packages/visx-demo/src/sandboxes/visx-annotation/Example.tsx +++ b/packages/visx-demo/src/sandboxes/visx-annotation/Example.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { Label, Connector, CircleSubject, LineSubject } from '@visx/annotation'; import { LinePath } from '@visx/shape'; -// import resizeObserverPolyfill from 'resize-observer-polyfill'; import ExampleControls from './ExampleControls'; import findNearestDatum from './findNearestDatum'; diff --git a/packages/visx-demo/src/sandboxes/visx-annotation/package.json b/packages/visx-demo/src/sandboxes/visx-annotation/package.json index c45d24995..b8195f5e6 100644 --- a/packages/visx-demo/src/sandboxes/visx-annotation/package.json +++ b/packages/visx-demo/src/sandboxes/visx-annotation/package.json @@ -16,7 +16,6 @@ "react": "^16", "react-dom": "^16", "react-scripts-ts": "3.1.0", - "resize-observer-polyfill": "1.5.1", "typescript": "^3" }, "keywords": [ From 6756c8d0e2fe410e67158bd45b13a33a0bfb2718 Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Fri, 22 Jan 2021 13:51:52 -0800 Subject: [PATCH 11/17] fix(workflows/happo): fix working-directory syntax --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bf8057c7c..addb87747 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,7 +52,9 @@ jobs: happo: runs-on: ubuntu-latest needs: build - working-directory: './packages/visx-happo/' + defaults: + run: + working-directory: './packages/visx-demo/' steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 From 2367913a28880c0677e0db5149f4400820baeb0b Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Fri, 22 Jan 2021 14:16:25 -0800 Subject: [PATCH 12/17] fix(workflows/ci): merge back into one job with multiple steps --- .github/workflows/ci.yml | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index addb87747..3a86f1646 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,6 +14,7 @@ jobs: - uses: actions/setup-node@v1 with: node-version: '12' + - name: Get yarn cache directory path id: yarn-cache-dir-path run: echo "::set-output name=dir::$(yarn cache dir)" @@ -24,42 +25,30 @@ jobs: key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | ${{ runner.os }}-yarn- + - name: Install dependencies run: yarn install --frozen-lockfile --ignore-engines + - name: Build packages run: yarn build - test: - runs-on: ubuntu-latest - needs: build - steps: - name: Run jest run: yarn jest -w 4 env: CI: true COVERAGE: true + - name: Report code coverage uses: coverallsapp/github-action@v1.1.1 with: github-token: ${{ secrets.GITHUB_TOKEN }} - lint: - runs-on: ubuntu-latest - needs: build - steps: - - run: yarn lint + - name: Run lint + run: yarn lint - happo: - runs-on: ubuntu-latest - needs: build - defaults: - run: + - name: Run happo + run: yarn run happo-ci-github-actions working-directory: './packages/visx-demo/' - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - - run: yarn ci - - run: yarn run happo-ci-github-actions env: HAPPO_API_KEY: ${{ secrets.HAPPO_API_KEY }} HAPPO_API_SECRET: ${{ secrets.HAPPO_API_SECRET }} From e5064531e05ab3a6eda25c65265d1e8dfbc8e73e Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Fri, 22 Jan 2021 14:59:01 -0800 Subject: [PATCH 13/17] fix(workflows/ci/happo): try overriding HAPPO_COMMAND --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3a86f1646..99af853c6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -52,3 +52,4 @@ jobs: env: HAPPO_API_KEY: ${{ secrets.HAPPO_API_KEY }} HAPPO_API_SECRET: ${{ secrets.HAPPO_API_SECRET }} + HAPPO_COMMAND: '../../node_modules/happo.io/build/cli.js' From eca1275310c0ca8bb4975994b72cac10413f3bcd Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Fri, 22 Jan 2021 15:39:56 -0800 Subject: [PATCH 14/17] fix(happo): move asyncTimeout to separate file --- packages/visx-demo/.happo-variables.js | 3 +++ packages/visx-demo/.happo.js | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 packages/visx-demo/.happo-variables.js diff --git a/packages/visx-demo/.happo-variables.js b/packages/visx-demo/.happo-variables.js new file mode 100644 index 000000000..df6bc4d92 --- /dev/null +++ b/packages/visx-demo/.happo-variables.js @@ -0,0 +1,3 @@ +module.exports = { + asyncTimeout: 500, +}; diff --git a/packages/visx-demo/.happo.js b/packages/visx-demo/.happo.js index 5cdc086f8..965a998be 100644 --- a/packages/visx-demo/.happo.js +++ b/packages/visx-demo/.happo.js @@ -3,6 +3,7 @@ const { findPagesDir } = require('next/dist/lib/find-pages-dir'); const getWebpackConfig = require('next/dist/build/webpack-config').default; const nextConfig = require('./next.config'); const path = require('path'); +const { asyncTimeout } = require('./.happo-variables'); const happoTmpDir = './.happo'; // should match .gitignore @@ -13,7 +14,7 @@ module.exports = { apiSecret: process.env.HAPPO_API_SECRET, // ms timeout for async examples (default=200) - asyncTimeout: 500, + asyncTimeout, // don't use JSDOM for rendering. saves having to mock out // things like getBoundingClientRect + canvas element methods From df71c5119934e4475ab5c05f81a7c3d07ae8ad9c Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Fri, 22 Jan 2021 15:57:35 -0800 Subject: [PATCH 15/17] fix(happo): fix timeout filepath --- packages/visx-demo/happo/gallery.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/visx-demo/happo/gallery.tsx b/packages/visx-demo/happo/gallery.tsx index 0b396277e..5539279fc 100644 --- a/packages/visx-demo/happo/gallery.tsx +++ b/packages/visx-demo/happo/gallery.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { tiles as examples } from '../src/components/Gallery'; import AxisTile from '../src/components/Gallery/AxisTile'; import XYChartTile from '../src/components/Gallery/XYChartTile'; -import { asyncTimeout } from '../.happo.js'; +import { asyncTimeout } from '../.happo-variables.js'; type HappoSnapshot = { component: string; From e0a5e61a54d81ac60b909e4cb8165d045cb3d26a Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Tue, 26 Jan 2021 11:53:33 -0800 Subject: [PATCH 16/17] new(mock-data, demo): add stable randomness (#1033) * deps(mock-data): d3-random@^2.2.2 for seeded random * new(mock-data): add getSeededRandom, support seeds in all generators * test(mock-data): add tests for seeded random across generators * new(mock-data): export getRandomNormal * internal(demo): use stable randomness for all demos --- .../src/sandboxes/visx-axis/Example.tsx | 4 ++- .../src/sandboxes/visx-curve/Example.tsx | 11 ++++--- .../src/sandboxes/visx-dots/Example.tsx | 2 +- .../sandboxes/visx-drag-i/generateCircles.ts | 17 +++++++--- .../src/sandboxes/visx-drag-i/package.json | 1 + .../src/sandboxes/visx-glyph/Example.tsx | 2 +- .../src/sandboxes/visx-heatmap/Example.tsx | 10 +++++- .../src/sandboxes/visx-responsive/Lines.tsx | 2 +- .../src/sandboxes/visx-stats/Example.tsx | 6 +++- .../visx-streamgraph/generateData.ts | 10 ++++-- .../sandboxes/visx-streamgraph/package.json | 3 +- .../src/sandboxes/visx-voronoi/Example.tsx | 11 +++++-- .../src/sandboxes/visx-voronoi/package.json | 1 + .../src/sandboxes/visx-zoom-i/Example.tsx | 4 +-- packages/visx-mock-data/package.json | 4 +-- .../src/generators/genDateValue.ts | 16 ++++++++-- .../src/generators/genRandomNormalPoints.ts | 16 +++++++--- .../visx-mock-data/src/generators/genStats.ts | 13 ++++++-- .../src/generators/getSeededRandom.ts | 9 ++++++ packages/visx-mock-data/src/index.ts | 2 ++ packages/visx-mock-data/test/genBin.test.ts | 30 +++++++++++++++--- packages/visx-mock-data/test/genBins.test.ts | 31 ++++++++++++++++--- .../visx-mock-data/test/genDateValue.test.ts | 15 ++++++--- .../test/genRandomNormalPoints.test.ts | 17 +++++++--- packages/visx-mock-data/test/genStats.test.ts | 12 +++++-- .../test/getSeededRandom.test.ts | 16 ++++++++++ yarn.lock | 16 +++++----- 27 files changed, 213 insertions(+), 68 deletions(-) create mode 100644 packages/visx-mock-data/src/generators/getSeededRandom.ts create mode 100644 packages/visx-mock-data/test/getSeededRandom.test.ts diff --git a/packages/visx-demo/src/sandboxes/visx-axis/Example.tsx b/packages/visx-demo/src/sandboxes/visx-axis/Example.tsx index 6c514893a..81fca7cf3 100644 --- a/packages/visx-demo/src/sandboxes/visx-axis/Example.tsx +++ b/packages/visx-demo/src/sandboxes/visx-axis/Example.tsx @@ -4,6 +4,7 @@ import { curveMonotoneX } from '@visx/curve'; import { scaleUtc, scaleLinear, scaleLog, scaleBand, ScaleInput, coerceNumber } from '@visx/scale'; import { Orientation, SharedAxisProps, AxisScale } from '@visx/axis'; import { AnimatedAxis, AnimatedGridRows, AnimatedGridColumns } from '@visx/react-spring'; +import { getSeededRandom } from '@visx/mock-data'; import { LinearGradient } from '@visx/gradient'; import { timeFormat } from 'd3-time-format'; @@ -12,6 +13,7 @@ const axisColor = '#fff'; const tickLabelColor = '#fff'; export const labelColor = '#340098'; const gridColor = '#6e0fca'; +const seededRandom = getSeededRandom(0.5); const margin = { top: 40, right: 150, @@ -167,7 +169,7 @@ export default function Example({ ('bandwidth' in scale && typeof scale!.bandwidth !== 'undefined' ? scale.bandwidth!() / 2 : 0), - yScale(10 + Math.random() * 90), + yScale(10 + seededRandom() * 90), ])} yScale={yScale} curve={curveMonotoneX} diff --git a/packages/visx-demo/src/sandboxes/visx-curve/Example.tsx b/packages/visx-demo/src/sandboxes/visx-curve/Example.tsx index ae0b11faf..bbe2aaeb0 100644 --- a/packages/visx-demo/src/sandboxes/visx-curve/Example.tsx +++ b/packages/visx-demo/src/sandboxes/visx-curve/Example.tsx @@ -11,11 +11,12 @@ type CurveType = keyof typeof allCurves; const curveTypes = Object.keys(allCurves); const lineCount = 5; -const series = new Array(lineCount) - .fill(null) - .map(_ => - generateDateValue(25).sort((a: DateValue, b: DateValue) => a.date.getTime() - b.date.getTime()), - ); +const series = new Array(lineCount).fill(null).map((_, i) => + // vary each series value deterministically + generateDateValue(25, /* seed= */ i / 72).sort( + (a: DateValue, b: DateValue) => a.date.getTime() - b.date.getTime(), + ), +); const allData = series.reduce((rec, d) => rec.concat(d), []); // data accessors diff --git a/packages/visx-demo/src/sandboxes/visx-dots/Example.tsx b/packages/visx-demo/src/sandboxes/visx-dots/Example.tsx index c75fbdbb7..b412fdfee 100644 --- a/packages/visx-demo/src/sandboxes/visx-dots/Example.tsx +++ b/packages/visx-demo/src/sandboxes/visx-dots/Example.tsx @@ -11,7 +11,7 @@ import { WithTooltipProvidedProps } from '@visx/tooltip/lib/enhancers/withToolti import { voronoi, VoronoiPolygon } from '@visx/voronoi'; import { localPoint } from '@visx/event'; -const points: PointsRange[] = genRandomNormalPoints(600).filter((d, i) => i < 600); +const points: PointsRange[] = genRandomNormalPoints(600, /* seed= */ 0.5).filter((_, i) => i < 600); const x = (d: PointsRange) => d[0]; const y = (d: PointsRange) => d[1]; diff --git a/packages/visx-demo/src/sandboxes/visx-drag-i/generateCircles.ts b/packages/visx-demo/src/sandboxes/visx-drag-i/generateCircles.ts index d33452d89..6dd37836d 100644 --- a/packages/visx-demo/src/sandboxes/visx-drag-i/generateCircles.ts +++ b/packages/visx-demo/src/sandboxes/visx-drag-i/generateCircles.ts @@ -1,3 +1,5 @@ +import { getSeededRandom } from '@visx/mock-data'; + export interface Circle { id: string; radius: number; @@ -5,15 +7,20 @@ export interface Circle { y: number; } -const generateCircles = ({ width, height }: { width: number; height: number }) => - new Array(width < 360 ? 40 : 185).fill(1).map((d, i) => { - const radius = 25 - Math.random() * 20; +const generateCircles = ({ width, height }: { width: number; height: number }) => { + const radiusRandom = getSeededRandom(0.2); + const xRandom = getSeededRandom(0.3); + const yRandom = getSeededRandom(0.4); + + return new Array(width < 360 ? 40 : 185).fill(1).map((d, i) => { + const radius = 25 - radiusRandom() * 20; return { id: `${i}`, radius, - x: Math.round(Math.random() * (width - radius * 2) + radius), - y: Math.round(Math.random() * (height - radius * 2) + radius), + x: Math.round(xRandom() * (width - radius * 2) + radius), + y: Math.round(yRandom() * (height - radius * 2) + radius), }; }); +}; export default generateCircles; diff --git a/packages/visx-demo/src/sandboxes/visx-drag-i/package.json b/packages/visx-demo/src/sandboxes/visx-drag-i/package.json index c253a2630..fd4e951e4 100644 --- a/packages/visx-demo/src/sandboxes/visx-drag-i/package.json +++ b/packages/visx-demo/src/sandboxes/visx-drag-i/package.json @@ -9,6 +9,7 @@ "@types/react-dom": "^16", "@visx/drag": "latest", "@visx/gradient": "latest", + "@visx/mock-data": "latest", "@visx/responsive": "latest", "@visx/scale": "latest", "react": "^16", diff --git a/packages/visx-demo/src/sandboxes/visx-glyph/Example.tsx b/packages/visx-demo/src/sandboxes/visx-glyph/Example.tsx index 84059b417..f77eadaa1 100644 --- a/packages/visx-demo/src/sandboxes/visx-glyph/Example.tsx +++ b/packages/visx-demo/src/sandboxes/visx-glyph/Example.tsx @@ -42,7 +42,7 @@ const Glyphs = [ ), ]; -const data: DateValue[] = genDateValue(Glyphs.length * 2); +const data: DateValue[] = genDateValue(Glyphs.length * 2, 0.91); // accessors const date = (d: DateValue) => d.date.valueOf(); diff --git a/packages/visx-demo/src/sandboxes/visx-heatmap/Example.tsx b/packages/visx-demo/src/sandboxes/visx-heatmap/Example.tsx index 7c802ed4a..42097d8a1 100644 --- a/packages/visx-demo/src/sandboxes/visx-heatmap/Example.tsx +++ b/packages/visx-demo/src/sandboxes/visx-heatmap/Example.tsx @@ -3,6 +3,7 @@ import { Group } from '@visx/group'; import genBins, { Bin, Bins } from '@visx/mock-data/lib/generators/genBins'; import { scaleLinear } from '@visx/scale'; import { HeatmapCircle, HeatmapRect } from '@visx/heatmap'; +import { getSeededRandom } from '@visx/mock-data'; const hot1 = '#77312f'; const hot2 = '#f33d15'; @@ -10,7 +11,14 @@ const cool1 = '#122549'; const cool2 = '#b4fbde'; export const background = '#28272c'; -const binData = genBins(/* length = */ 16, /* height = */ 16); +const seededRandom = getSeededRandom(0.41); + +const binData = genBins( + /* length = */ 16, + /* height = */ 16, + /** binFunc */ idx => 150 * idx, + /** countFunc */ (i, number) => 25 * (number - i) * seededRandom(), +); function max(data: Datum[], value: (d: Datum) => number): number { return Math.max(...data.map(value)); diff --git a/packages/visx-demo/src/sandboxes/visx-responsive/Lines.tsx b/packages/visx-demo/src/sandboxes/visx-responsive/Lines.tsx index 24cf8457c..8e8a860af 100644 --- a/packages/visx-demo/src/sandboxes/visx-responsive/Lines.tsx +++ b/packages/visx-demo/src/sandboxes/visx-responsive/Lines.tsx @@ -6,7 +6,7 @@ import { scaleTime, scaleLinear } from '@visx/scale'; import { extent, max } from 'd3-array'; const lineCount = 12; -const series = new Array(lineCount).fill(null).map(_ => generateDateValue(25)); +const series = new Array(lineCount).fill(null).map((_, i) => generateDateValue(25, i / 47)); const allData = series.reduce((rec, d) => rec.concat(d), []); // data accessors diff --git a/packages/visx-demo/src/sandboxes/visx-stats/Example.tsx b/packages/visx-demo/src/sandboxes/visx-stats/Example.tsx index 412b273ed..8b234f7cb 100644 --- a/packages/visx-demo/src/sandboxes/visx-stats/Example.tsx +++ b/packages/visx-demo/src/sandboxes/visx-stats/Example.tsx @@ -4,11 +4,15 @@ import { ViolinPlot, BoxPlot } from '@visx/stats'; import { LinearGradient } from '@visx/gradient'; import { scaleBand, scaleLinear } from '@visx/scale'; import genStats, { Stats } from '@visx/mock-data/lib/generators/genStats'; +import { getSeededRandom, getRandomNormal } from '@visx/mock-data'; import { withTooltip, Tooltip, defaultStyles as defaultTooltipStyles } from '@visx/tooltip'; import { WithTooltipProvidedProps } from '@visx/tooltip/lib/enhancers/withTooltip'; import { PatternLines } from '@visx/pattern'; -const data: Stats[] = genStats(5); +// seeded randomness +const seededRandom = getSeededRandom(0.1); +const randomNormal = getRandomNormal.source(getSeededRandom(0.789))(4, 3); +const data: Stats[] = genStats(5, randomNormal, () => 10 * seededRandom()); // accessors const x = (d: Stats) => d.boxPlot.x; diff --git a/packages/visx-demo/src/sandboxes/visx-streamgraph/generateData.ts b/packages/visx-demo/src/sandboxes/visx-streamgraph/generateData.ts index e100d5965..348b4613a 100644 --- a/packages/visx-demo/src/sandboxes/visx-streamgraph/generateData.ts +++ b/packages/visx-demo/src/sandboxes/visx-streamgraph/generateData.ts @@ -1,7 +1,11 @@ +import { getSeededRandom } from '@visx/mock-data'; + +const random = getSeededRandom(0.65); + const getPoints = (array: number[], pointCount: number) => { - const x = 1 / (0.1 + Math.random()); - const y = 2 * Math.random() - 0.5; - const z = 10 / (0.1 + Math.random()); + const x = 1 / (0.1 + random()); + const y = 2 * random() - 0.5; + const z = 10 / (0.1 + random()); for (let i = 0; i < pointCount; i += 1) { const w = (i / pointCount - y) * z; array[i] += x * Math.exp(-w * w); diff --git a/packages/visx-demo/src/sandboxes/visx-streamgraph/package.json b/packages/visx-demo/src/sandboxes/visx-streamgraph/package.json index 9cb7d9915..63d0db0b4 100644 --- a/packages/visx-demo/src/sandboxes/visx-streamgraph/package.json +++ b/packages/visx-demo/src/sandboxes/visx-streamgraph/package.json @@ -8,8 +8,9 @@ "@types/d3-array": "^2.0.0", "@types/react": "^16", "@types/react-dom": "^16", - "@visx/responsive": "latest", + "@visx/mock-data": "latest", "@visx/pattern": "latest", + "@visx/responsive": "latest", "@visx/scale": "latest", "@visx/shape": "latest", "d3-array": "^2.4.0", diff --git a/packages/visx-demo/src/sandboxes/visx-voronoi/Example.tsx b/packages/visx-demo/src/sandboxes/visx-voronoi/Example.tsx index ab52dbd90..2dcf29aa5 100644 --- a/packages/visx-demo/src/sandboxes/visx-voronoi/Example.tsx +++ b/packages/visx-demo/src/sandboxes/visx-voronoi/Example.tsx @@ -4,6 +4,7 @@ import { GradientOrangeRed, GradientPinkRed } from '@visx/gradient'; import { RectClipPath } from '@visx/clip-path'; import { voronoi, VoronoiPolygon } from '@visx/voronoi'; import { localPoint } from '@visx/event'; +import { getSeededRandom } from '@visx/mock-data'; type Datum = { x: number; @@ -11,9 +12,11 @@ type Datum = { id: string; }; +const seededRandom = getSeededRandom(0.88); + const data: Datum[] = new Array(150).fill(null).map(() => ({ - x: Math.random(), - y: Math.random(), + x: seededRandom(), + y: seededRandom(), id: Math.random() .toString(36) .slice(2), @@ -34,7 +37,7 @@ export type VoronoiProps = { margin?: { top: number; right: number; bottom: number; left: number }; }; -export default ({ width, height, margin = defaultMargin }: VoronoiProps) => { +const Example = ({ width, height, margin = defaultMargin }: VoronoiProps) => { const innerWidth = width - margin.left - margin.right; const innerHeight = height - margin.top - margin.bottom; @@ -121,3 +124,5 @@ export default ({ width, height, margin = defaultMargin }: VoronoiProps) => { ); }; + +export default Example; diff --git a/packages/visx-demo/src/sandboxes/visx-voronoi/package.json b/packages/visx-demo/src/sandboxes/visx-voronoi/package.json index 5d150f66a..05baae42c 100644 --- a/packages/visx-demo/src/sandboxes/visx-voronoi/package.json +++ b/packages/visx-demo/src/sandboxes/visx-voronoi/package.json @@ -11,6 +11,7 @@ "@visx/event": "latest", "@visx/gradient": "latest", "@visx/group": "latest", + "@visx/mock-data": "latest", "@visx/responsive": "latest", "@visx/voronoi": "latest", "react": "^16.8", diff --git a/packages/visx-demo/src/sandboxes/visx-zoom-i/Example.tsx b/packages/visx-demo/src/sandboxes/visx-zoom-i/Example.tsx index 4d656c352..edbfe9047 100644 --- a/packages/visx-demo/src/sandboxes/visx-zoom-i/Example.tsx +++ b/packages/visx-demo/src/sandboxes/visx-zoom-i/Example.tsx @@ -33,8 +33,8 @@ export type ZoomIProps = { export default function ZoomI({ width, height }: ZoomIProps) { const [showMiniMap, setShowMiniMap] = useState(true); - const genenerator: GenPhyllotaxisFunction = genPhyllotaxis({ radius: 10, width, height }); - const phyllotaxis: PhyllotaxisPoint[] = points.map((d, i) => genenerator(i)); + const generator: GenPhyllotaxisFunction = genPhyllotaxis({ radius: 10, width, height }); + const phyllotaxis: PhyllotaxisPoint[] = points.map((d, i) => generator(i)); return ( <> diff --git a/packages/visx-mock-data/package.json b/packages/visx-mock-data/package.json index 053756e80..0c136a6ae 100644 --- a/packages/visx-mock-data/package.json +++ b/packages/visx-mock-data/package.json @@ -31,7 +31,7 @@ "access": "public" }, "dependencies": { - "@types/d3-random": "^1.1.2", - "d3-random": "^1.0.3" + "@types/d3-random": "^2.2.0", + "d3-random": "^2.2.2" } } diff --git a/packages/visx-mock-data/src/generators/genDateValue.ts b/packages/visx-mock-data/src/generators/genDateValue.ts index 151d4791c..b3e9ce446 100644 --- a/packages/visx-mock-data/src/generators/genDateValue.ts +++ b/packages/visx-mock-data/src/generators/genDateValue.ts @@ -1,14 +1,24 @@ +import getSeededRandom from './getSeededRandom'; + export interface DateValue { date: Date; value: number; } -export default function genDateValue(length: number): DateValue[] { +export default function genDateValue( + length: number, + /** Optional random seed in the interval [0, 1). */ + seed?: number, + /** Optional start time in ms UTC. */ + startTimeMs?: number, +): DateValue[] { + const random = seed == null ? Math.random : getSeededRandom(seed); + const startDateMs = startTimeMs == null ? Date.now() : new Date(startTimeMs).valueOf(); return new Array(length).fill(1).map((_, idx: number) => { return { - date: new Date(Date.now() - idx * 3600000), + date: new Date(startDateMs - idx * 3600000), // eslint-disable-next-line no-bitwise - value: Math.max(250, (Math.random() * 3000) | 0), + value: (random() * 3000) | 0, }; }); } diff --git a/packages/visx-mock-data/src/generators/genRandomNormalPoints.ts b/packages/visx-mock-data/src/generators/genRandomNormalPoints.ts index e061a1d2b..847f5778f 100644 --- a/packages/visx-mock-data/src/generators/genRandomNormalPoints.ts +++ b/packages/visx-mock-data/src/generators/genRandomNormalPoints.ts @@ -1,9 +1,9 @@ import { randomNormal } from 'd3-random'; +import getSeededRandom from './getSeededRandom'; export type PointConfig = [number, number, number]; export type PointsRange = [number, number, number]; -const random = randomNormal(0, 0.2); const sqrt3: number = Math.sqrt(3); function range(length: number): number[] { @@ -13,16 +13,22 @@ function range(length: number): number[] { export function genPointsRange( length: number, [offsetX, offsetY, index]: PointConfig, + random: () => number = randomNormal(0, 0.2), ): PointsRange[] { return range(length).map(() => { return [random() + offsetX, random() + offsetY, index]; }); } -export default function genPoints(count: number = 300): PointsRange[] { +export default function genPoints( + count: number = 300, + /** Optional random seed in the interval [0, 1). */ + seed: number | undefined = undefined, +): PointsRange[] { + const random = seed == null ? undefined : randomNormal.source(getSeededRandom(seed))(0, 0.2); return [ - ...genPointsRange(count, [sqrt3, 1, 0]), - ...genPointsRange(count, [-sqrt3, 1, 1]), - ...genPointsRange(count, [0, -1, 2]), + ...genPointsRange(count, [sqrt3, 1, 0], random), + ...genPointsRange(count, [-sqrt3, 1, 1], random), + ...genPointsRange(count, [0, -1, 2], random), ]; } diff --git a/packages/visx-mock-data/src/generators/genStats.ts b/packages/visx-mock-data/src/generators/genStats.ts index 32f4ce9cd..08691bf6c 100644 --- a/packages/visx-mock-data/src/generators/genStats.ts +++ b/packages/visx-mock-data/src/generators/genStats.ts @@ -20,11 +20,18 @@ export interface Stats { binData: BinData[]; } -const random = randomNormal(4, 3); -const randomOffset = () => Math.random() * 10; +const defaultRandom = randomNormal(4, 3); +const defaultRandomOffset = () => Math.random() * 10; const sampleSize = 1000; -export default function genStats(number: number): Stats[] { +export default function genStats( + /** Number of stat distributions to generate. */ + number: number, + /** Function which generates a random number. */ + random: () => number = defaultRandom, + /** Function which generates an offset for each data point / invocation of random. */ + randomOffset: () => number = defaultRandomOffset, +): Stats[] { const data = []; for (let i = 0; i < number; i += 1) { diff --git a/packages/visx-mock-data/src/generators/getSeededRandom.ts b/packages/visx-mock-data/src/generators/getSeededRandom.ts new file mode 100644 index 000000000..1a6f538ad --- /dev/null +++ b/packages/visx-mock-data/src/generators/getSeededRandom.ts @@ -0,0 +1,9 @@ +import { randomLcg } from 'd3-random'; + +// returns a seeded random number generator +export default function getSeededRandom( + /** Seed in the interval [0, 1). */ + seed: number, +) { + return randomLcg(seed); +} diff --git a/packages/visx-mock-data/src/index.ts b/packages/visx-mock-data/src/index.ts index f7e951011..390d14c42 100644 --- a/packages/visx-mock-data/src/index.ts +++ b/packages/visx-mock-data/src/index.ts @@ -1,5 +1,7 @@ export { default as genDateValue } from './generators/genDateValue'; export { default as genRandomNormalPoints } from './generators/genRandomNormalPoints'; +export { default as getSeededRandom } from './generators/getSeededRandom'; +export { randomNormal as getRandomNormal } from 'd3-random'; export { default as genBin } from './generators/genBin'; export { default as genBins } from './generators/genBins'; export { default as genPhyllotaxis } from './generators/genPhyllotaxis'; diff --git a/packages/visx-mock-data/test/genBin.test.ts b/packages/visx-mock-data/test/genBin.test.ts index 70d9c32ef..90bebab8c 100644 --- a/packages/visx-mock-data/test/genBin.test.ts +++ b/packages/visx-mock-data/test/genBin.test.ts @@ -1,25 +1,45 @@ -import { genBin } from '../src'; +import { genBin, getSeededRandom } from '../src'; describe('generators/genBin', () => { - test('it should be defined', () => { + it('should be defined', () => { expect(genBin).toBeDefined(); }); - test('it should have shape [{ bin, count }]', () => { + it('should have shape [{ bin, count }]', () => { const bin = genBin(1); expect(bin).toHaveLength(1); expect(bin[0].bin).toBeDefined(); expect(bin[0].count).toBeDefined(); }); - test('it should take optional bin function', () => { + it('should take optional bin function', () => { const bin = genBin(1, i => i); expect(bin[0].bin).toEqual(0); }); - test('it should take an optional count function', () => { + it('should take an optional count function', () => { const bin = genBin(1, undefined, i => i); expect(bin[0].count).toEqual(0); expect(bin[0].bin).toEqual(0); }); + + it('should support seeded randomness', () => { + const n = 3; + const seededRandom1 = getSeededRandom(0.5); + const seededRandom2 = getSeededRandom(0.5); + + expect( + genBin( + n, + i => i, + (i, number) => 25 * (number - i) * seededRandom1(), + ), + ).toEqual( + genBin( + n, + i => i, + (i, number) => 25 * (number - i) * seededRandom2(), + ), + ); + }); }); diff --git a/packages/visx-mock-data/test/genBins.test.ts b/packages/visx-mock-data/test/genBins.test.ts index 87c3584f9..7796b46be 100644 --- a/packages/visx-mock-data/test/genBins.test.ts +++ b/packages/visx-mock-data/test/genBins.test.ts @@ -1,11 +1,11 @@ -import { genBins } from '../src'; +import { genBins, getSeededRandom } from '../src'; describe('generators/genBins', () => { - test('it should be defined', () => { + it('should be defined', () => { expect(genBins).toBeDefined(); }); - test('it should have the shape of [{bin, bins: [{ bin, count }]}]', () => { + it('should have the shape of [{bin, bins: [{ bin, count }]}]', () => { const bins = genBins(1, 2); expect(bins[0].bin).toEqual(0); expect(bins).toHaveLength(1); @@ -13,13 +13,34 @@ describe('generators/genBins', () => { expect(bins[0].bins[1].bin).toEqual(150); }); - test('it should take an optional bin function parameter', () => { + it('should take an optional bin function parameter', () => { const bins = genBins(1, 1, i => i); expect(bins[0].bins[0].bin).toEqual(0); }); - test('it should take an optional count function parameter', () => { + it('should take an optional count function parameter', () => { const bins = genBins(1, 1, undefined, i => i); expect(bins[0].bins[0].count).toEqual(0); }); + + it('should support seeded randomness', () => { + const seededRandom1 = getSeededRandom(0.5); + const seededRandom2 = getSeededRandom(0.5); + + expect( + genBins( + 2, + 2, + i => i, + (i, number) => 25 * (number - i) * seededRandom1(), + ), + ).toEqual( + genBins( + 2, + 2, + i => i, + (i, number) => 25 * (number - i) * seededRandom2(), + ), + ); + }); }); diff --git a/packages/visx-mock-data/test/genDateValue.test.ts b/packages/visx-mock-data/test/genDateValue.test.ts index 410232e65..4fb11a1b2 100644 --- a/packages/visx-mock-data/test/genDateValue.test.ts +++ b/packages/visx-mock-data/test/genDateValue.test.ts @@ -1,24 +1,31 @@ import { genDateValue } from '../src'; describe('generators/genDateValue', () => { - test('it should be defined', () => { + it('should be defined', () => { expect(genDateValue).toBeDefined(); }); - test('it should be function', () => { + it('should be function', () => { expect(typeof genDateValue).toBe('function'); }); - test('it should return a array of n', () => { + it('should return a array of n', () => { const n = 3; const data = genDateValue(n); expect(data).toHaveLength(3); }); - test('it should return [{ date, value }]', () => { + it('should return [{ date, value }]', () => { const n = 1; const data = genDateValue(n); expect(data[0].date.constructor).toEqual(Date); expect(typeof data[0].value).toBe('number'); }); + + it('should should use a start date and seed if provided', () => { + const n = 3; + const seed = 0.5; + const startDate = new Date('2020-01-01').getUTCMilliseconds(); + expect(genDateValue(n, seed, startDate)).toEqual(genDateValue(n, seed, startDate)); + }); }); diff --git a/packages/visx-mock-data/test/genRandomNormalPoints.test.ts b/packages/visx-mock-data/test/genRandomNormalPoints.test.ts index 32c9fdef2..5e2481df7 100644 --- a/packages/visx-mock-data/test/genRandomNormalPoints.test.ts +++ b/packages/visx-mock-data/test/genRandomNormalPoints.test.ts @@ -1,26 +1,26 @@ import { genRandomNormalPoints } from '../src'; describe('generators/genRandomNormalPoints', () => { - test('it should be defined', () => { + it('should be defined', () => { expect(genRandomNormalPoints).toBeDefined(); }); - test('it should be function', () => { + it('should be function', () => { expect(typeof genRandomNormalPoints).toBe('function'); }); - test('it should default to 3x300 points', () => { + it('should default to 3x300 points', () => { const data = genRandomNormalPoints(); expect(data).toHaveLength(900); }); - test('it should return 3 * n', () => { + it('should return 3 * n', () => { const n = 3; const data = genRandomNormalPoints(n); expect(data).toHaveLength(9); }); - test('it should return points with x, y, index', () => { + it('should return points with x, y, index', () => { const n = 3; const data = genRandomNormalPoints(n); expect(data[0]).toHaveLength(3); @@ -31,4 +31,11 @@ describe('generators/genRandomNormalPoints', () => { expect(data[3][2]).toEqual(1); expect(data[6][2]).toEqual(2); }); + + it('should support seeded randomness', () => { + const n = 3; + const data1 = genRandomNormalPoints(n, 0.5); + const data2 = genRandomNormalPoints(n, 0.5); + expect(data1).toMatchObject(data2); + }); }); diff --git a/packages/visx-mock-data/test/genStats.test.ts b/packages/visx-mock-data/test/genStats.test.ts index e96135728..097d66ba9 100644 --- a/packages/visx-mock-data/test/genStats.test.ts +++ b/packages/visx-mock-data/test/genStats.test.ts @@ -1,15 +1,21 @@ -import { genStats } from '../src'; +import { genStats, getSeededRandom } from '../src'; describe('generators/genStats', () => { - test('it should be defined', () => { + it('should be defined', () => { expect(genStats).toBeDefined(); }); - test('it should have boxPlot and binData', () => { + it('should have boxPlot and binData', () => { const data = genStats(2); expect(data.length).toBeDefined(); expect(data).toHaveLength(2); expect(data[0].boxPlot).toBeDefined(); expect(data[0].binData).toBeDefined(); }); + + it('should support seeded randomness', () => { + const data1 = genStats(1, getSeededRandom(0.5), getSeededRandom(0.75)); + const data2 = genStats(1, getSeededRandom(0.5), getSeededRandom(0.75)); + expect(data1).toMatchObject(data2); + }); }); diff --git a/packages/visx-mock-data/test/getSeededRandom.test.ts b/packages/visx-mock-data/test/getSeededRandom.test.ts new file mode 100644 index 000000000..2682046ff --- /dev/null +++ b/packages/visx-mock-data/test/getSeededRandom.test.ts @@ -0,0 +1,16 @@ +import { getSeededRandom } from '../src'; + +describe('generators/getSeededRandom', () => { + it('should be defined', () => { + expect(getSeededRandom).toBeDefined(); + }); + + it('should return a random number generator that returns the same value given the same seed', () => { + const random1 = getSeededRandom(0.5)(); + const random2 = getSeededRandom(0.5)(); + const random3 = getSeededRandom(0.1)(); + + expect(random1).toEqual(random2); + expect(random1).not.toEqual(random3); + }); +}); diff --git a/yarn.lock b/yarn.lock index 8e4f3a9f2..a722d2361 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3534,10 +3534,10 @@ resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.8.tgz#48e6945a8ff43ee0a1ce85c8cfa2337de85c7c79" integrity sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA== -"@types/d3-random@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-1.1.2.tgz#6f77e8b7bb64ac393f92d33fe8f71038bc4f3cde" - integrity sha512-Jui+Zn28pQw/3EayPKaN4c/PqTvqNbIPjHkgIIFnxne1FdwNjfHtAIsZIBMKlquQNrrMjFzCrlF2gPs3xckqaA== +"@types/d3-random@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-2.2.0.tgz#fc44cabb966917459490b758f31f5359adeabe5b" + integrity sha512-Hjfj9m68NmYZzushzEG7etPvKH/nj9b9s9+qtkNG3/dbRBjQZQg1XS6nRuHJcCASTjxXlyXZnKu2gDxyQIIu9A== "@types/d3-scale-chromatic@^1.3.1": version "1.5.0" @@ -6222,10 +6222,10 @@ d3-path@1, d3-path@^1.0.5: resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-2.0.0.tgz#55d86ac131a0548adae241eebfb56b4582dd09d8" integrity sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA== -d3-random@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.2.tgz#2833be7c124360bf9e2d3fd4f33847cfe6cab291" - integrity sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ== +d3-random@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-2.2.2.tgz#5eebd209ef4e45a2b362b019c1fb21c2c98cbb6e" + integrity sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw== d3-scale-chromatic@^1.3.3: version "1.5.0" From 856df30e06ea69cd5dc0b2edf41af61b7d2f130e Mon Sep 17 00:00:00 2001 From: Chris Williams Date: Tue, 26 Jan 2021 12:06:18 -0800 Subject: [PATCH 17/17] internal(happo/gallery): factor out reusable renderWithTimeout --- packages/visx-demo/happo/gallery.tsx | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/visx-demo/happo/gallery.tsx b/packages/visx-demo/happo/gallery.tsx index 5539279fc..9f0a7ae7f 100644 --- a/packages/visx-demo/happo/gallery.tsx +++ b/packages/visx-demo/happo/gallery.tsx @@ -15,6 +15,16 @@ type HappoSnapshot = { const specialCases = new Set(['@visx/demo-axis', '@visx/demo-xychart']); +// renders an example with a timeout +const renderWithTimeout: ( + Example: React.ReactElement, +) => HappoSnapshot['variants'][string] = Example => renderInDom => { + return new Promise(resolve => { + renderInDom(Example); + setTimeout(resolve, asyncTimeout); + }); +}; + const getComponentName = (Example: typeof examples[0]) => Example.packageJson.name || 'missing-name'; @@ -31,24 +41,14 @@ export default snapshots.concat([ { component: '@visx/demo-axis', variants: { - default: renderInDom => { - return new Promise(resolve => { - renderInDom(); - setTimeout(resolve, asyncTimeout); - }); - }, + default: renderWithTimeout(), }, }, // needs timeout for animated axes { component: '@visx/demo-xychart', variants: { - default: renderInDom => { - return new Promise(resolve => { - renderInDom(); - setTimeout(resolve, asyncTimeout); - }); - }, + default: renderWithTimeout(), }, }, ]);