diff --git a/.editorconfig b/.editorconfig index a541e47e767bc..2f3fbe64be9f7 100644 --- a/.editorconfig +++ b/.editorconfig @@ -19,3 +19,10 @@ indent_size = 2 [*.md] trim_trailing_whitespace = false + +[*.{gradle,java,kt}] +indent_style = space + +[packages/react-native-*/**.xml] +indent_style = space + diff --git a/.eslintignore b/.eslintignore index 08e37e82948a3..2577b07cec12e 100644 --- a/.eslintignore +++ b/.eslintignore @@ -4,6 +4,7 @@ build-module node_modules packages/block-serialization-spec-parser/parser.js packages/e2e-tests/plugins +packages/react-native-editor/bundle playground/dist vendor wordpress diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ab662eef3da46..2773fa8ea7581 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -15,6 +15,7 @@ /packages/block-library/src/gallery @mkevins @pinarol /packages/block-library/src/social-links @mkaz /packages/block-library/src/social-link @mkaz +/packages/block-library/src/image @ajlende # Editor /packages/annotations @atimmer @ellatrix @@ -49,7 +50,7 @@ /packages/babel-plugin-makepot @ntwb @nerrad @ajitbohra /packages/babel-preset-default @gziolo @ntwb @nerrad @ajitbohra /packages/browserslist-config @gziolo @ntwb @nerrad @ajitbohra -/packages/create-block @gziolo +/packages/create-block @gziolo @mkaz /packages/custom-templated-path-webpack-plugin @ntwb @nerrad @ajitbohra /packages/docgen @nosolosw /packages/e2e-test-utils @gziolo @ntwb @nerrad @ajitbohra @@ -100,9 +101,9 @@ /packages/plugins @gziolo @adamsilverstein # Rich Text -/packages/format-library @ellatrix @daniloercoli @sergioestevao @etoledom -/packages/rich-text @ellatrix @daniloercoli @sergioestevao @etoledom -/packages/block-editor/src/components/rich-text @ellatrix @daniloercoli @sergioestevao @etoledom +/packages/format-library @ellatrix @etoledom @cameronvoell @guarani +/packages/rich-text @ellatrix @etoledom @cameronvoell @guarani +/packages/block-editor/src/components/rich-text @ellatrix @etoledom @cameronvoell @guarani # Project Management /.github @youknowriad @mapk @karmatosed diff --git a/.github/ISSUE_TEMPLATE/Mobile_apps_bug_report.md b/.github/ISSUE_TEMPLATE/Mobile_apps_bug_report.md new file mode 100644 index 0000000000000..188673e9e0996 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/Mobile_apps_bug_report.md @@ -0,0 +1,34 @@ +--- +name: Bug report for Mobile Apps +about: Create a report to help us improve the Gutenberg mobile apps version +labels: Mobile App Android/iOS +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Tap on '....' +3. Scroll down to '....' +4. See '... exact error ...' + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Editor version (please complete the following information):** +- WordPress version: [e.g: 5.3.2] +- Does the website have the Gutenberg plugin installed, or is it using the block editor that comes by default? [e.g: "gutenberg plugin", "default"] +- If the Gutenberg plugin is installed, which version is it? [e.g., 7.6] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6, Pixel 3] + - OS: [e.g. iOS 8.1, Android 10.0] + - WordPress App Version [e.g. 15.3] or Demo App Version [branch name or git commit hash] + +**Additional context** +- To report a security issue, please visit the WordPress HackerOne program: https://hackerone.com/wordpress. diff --git a/.github/workflows/bundle-size.yml b/.github/workflows/bundle-size.yml index 2ee68bc6d240d..caba6ffb0bf03 100644 --- a/.github/workflows/bundle-size.yml +++ b/.github/workflows/bundle-size.yml @@ -4,13 +4,14 @@ on: [pull_request] jobs: build: - + name: Check runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2-beta + - uses: actions/checkout@v2 with: fetch-depth: 1 + - uses: preactjs/compressed-size-action@v1 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/cancel.yml b/.github/workflows/cancel.yml new file mode 100644 index 0000000000000..b51369c13098a --- /dev/null +++ b/.github/workflows/cancel.yml @@ -0,0 +1,15 @@ +name: Cancel +on: pull_request +jobs: + cancel: + name: 'Cancel Previous Runs' + runs-on: ubuntu-latest + timeout-minutes: 3 + steps: + - name: Get all workflow ids and set to env variable + run: echo ::set-env name=WORKFLOW_IDS_TO_CANCEL::$(curl https://api.github.com/repos/${GITHUB_REPOSITORY}/actions/workflows -s | jq -r '.workflows | map(.id|tostring) | join(",")') + + - uses: styfle/cancel-workflow-action@0.4.0 + with: + workflow_id: ${{ env.WORKFLOW_IDS_TO_CANCEL }} + access_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/create-block.yml b/.github/workflows/create-block.yml index fc9f51e5b20b8..f585ecefc4c13 100644 --- a/.github/workflows/create-block.yml +++ b/.github/workflows/create-block.yml @@ -1,7 +1,13 @@ name: Create Block on: + pull_request: + paths: + - 'packages/**' + - '!packages/**/test/**' + - '!packages/**/*.md' push: + branches: [master] paths: - 'packages/**' - '!packages/**/test/**' @@ -13,11 +19,26 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 + + - name: Cache node modules + uses: actions/cache@v2 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + - name: Use Node.js 12.x uses: actions/setup-node@v1 with: node-version: 12.x + - name: npm install, build, format and lint run: | npm ci diff --git a/.github/workflows/end2end-test.yml b/.github/workflows/end2end-test.yml new file mode 100644 index 0000000000000..37da6d7fcdd7b --- /dev/null +++ b/.github/workflows/end2end-test.yml @@ -0,0 +1,175 @@ +name: End-to-End Tests + +on: + pull_request: + paths-ignore: + - '**.md' + push: + branches: [master] + paths-ignore: + - '**.md' + +jobs: + admin-1: + name: Admin - 1 + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Cache node modules + uses: actions/cache@v2 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: Use Node.js 12.x + uses: actions/setup-node@v1 + with: + node-version: 12.x + + - name: Npm install and build + run: | + npm ci + FORCE_REDUCED_MOTION=true npm run build + + - name: Install WordPress + run: | + chmod -R 767 ./ # TODO: Possibly integrate in wp-env + npm run wp-env start + + - name: Running the tests + run: | + $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests + $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 0' < ~/.jest-e2e-tests ) + + admin-2: + name: Admin - 2 + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Cache node modules + uses: actions/cache@v2 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: Use Node.js 12.x + uses: actions/setup-node@v1 + with: + node-version: 12.x + + - name: Npm install and build + run: | + npm ci + FORCE_REDUCED_MOTION=true npm run build + + - name: Install WordPress + run: | + chmod -R 767 ./ # TODO: Possibly integrate in wp-env + npm run wp-env start + + - name: Running the tests + run: | + $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests + $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 1' < ~/.jest-e2e-tests ) + + admin-3: + name: Admin - 3 + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Cache node modules + uses: actions/cache@v2 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: Use Node.js 12.x + uses: actions/setup-node@v1 + with: + node-version: 12.x + + - name: Npm install and build + run: | + npm ci + FORCE_REDUCED_MOTION=true npm run build + + - name: Install WordPress + run: | + chmod -R 767 ./ # TODO: Possibly integrate in wp-env + npm run wp-env start + + - name: Running the tests + run: | + $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests + $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 2' < ~/.jest-e2e-tests ) + + admin-4: + name: Admin - 4 + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Cache node modules + uses: actions/cache@v2 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: Use Node.js 12.x + uses: actions/setup-node@v1 + with: + node-version: 12.x + + - name: Npm install and build + run: | + npm ci + FORCE_REDUCED_MOTION=true npm run build + + - name: Install WordPress + run: | + chmod -R 767 ./ # TODO: Possibly integrate in wp-env + npm run wp-env start + + - name: Running the tests + run: | + $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests + $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 3' < ~/.jest-e2e-tests ) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml new file mode 100644 index 0000000000000..8d1bfadc5d7b3 --- /dev/null +++ b/.github/workflows/performance.yml @@ -0,0 +1,40 @@ +name: Performances Tests + +on: + pull_request: + paths-ignore: + - '**.md' + +jobs: + performance: + name: Compare performance with master + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Cache node modules + uses: actions/cache@v2 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: Use Node.js 12.x + uses: actions/setup-node@v1 + with: + node-version: 12.x + + - name: Npm install + run: | + npm ci + + - name: Run the performance tests + run: ./bin/plugin/cli.js perf --ci $GITHUB_SHA master --tests-branch $GITHUB_SHA diff --git a/.github/workflows/pull-request-automation.yml b/.github/workflows/pull-request-automation.yml index 7aa2aa12122ac..a19fb0f1a761f 100644 --- a/.github/workflows/pull-request-automation.yml +++ b/.github/workflows/pull-request-automation.yml @@ -8,14 +8,16 @@ jobs: pull-request-automation: runs-on: ubuntu-latest steps: - # Checkout defaults to using the branch which triggered the event, which - # isn't necessarily `master` (e.g. in the case of a merge). - - uses: actions/checkout@v2 - with: - ref: master - # Changing into the action's directory and running `npm install` is much - # faster than a full project-wide `npm ci`. - - run: cd packages/project-management-automation && npm install - - uses: ./packages/project-management-automation - with: - github_token: ${{ secrets.GITHUB_TOKEN }} + # Checkout defaults to using the branch which triggered the event, which + # isn't necessarily `master` (e.g. in the case of a merge). + - uses: actions/checkout@v2 + with: + ref: master + + # Changing into the action's directory and running `npm install` is much + # faster than a full project-wide `npm ci`. + - run: cd packages/project-management-automation && npm install + + - uses: ./packages/project-management-automation + with: + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/rnmobile-android-runner.yml b/.github/workflows/rnmobile-android-runner.yml new file mode 100644 index 0000000000000..c424385527f04 --- /dev/null +++ b/.github/workflows/rnmobile-android-runner.yml @@ -0,0 +1,46 @@ +name: React Native E2E Tests (Android) + +on: + pull_request: + paths-ignore: + - '**.md' + +jobs: + test: + runs-on: macos-latest + strategy: + matrix: + native-test-name: [ + gutenberg-editor-gallery + ] + + steps: + - name: checkout + uses: actions/checkout@v2 + + - name: Restore npm cache + uses: actions/cache@v2 + with: + path: ~/.npm + key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} + + - run: npm ci + + - name: Restore Gradle cache + uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + restore-keys: ${{ runner.os }}-gradle + + - uses: reactivecircus/android-emulator-runner@v2 + with: + api-level: 28 + profile: pixel_xl + script: npm run native test:e2e:android:local ${{ matrix.native-test-name }} + + - uses: actions/upload-artifact@v2 + if: always() + with: + name: android-screen-recordings + path: packages/react-native-editor/android-screen-recordings diff --git a/.github/workflows/rnmobile-ios-runner.yml b/.github/workflows/rnmobile-ios-runner.yml new file mode 100644 index 0000000000000..7a7a69a14d564 --- /dev/null +++ b/.github/workflows/rnmobile-ios-runner.yml @@ -0,0 +1,70 @@ +name: React Native E2E Tests (iOS) +on: + pull_request: + paths-ignore: + - '**.md' + +jobs: + test: + runs-on: macos-latest + strategy: + matrix: + native-test-name: [ + gutenberg-editor-gallery + ] + + steps: + - uses: actions/checkout@v2 + + - name: Restore npm cache + uses: actions/cache@v2 + with: + path: ~/.npm + key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} + + - run: npm ci + + - name: Prepare build cache key + run: find package-lock.json packages/react-native-editor/ios packages/react-native-aztec/ios packages/react-native-bridge/ios -type f -print0 | sort -z | xargs -0 shasum | tee ios-checksums.txt + + - name: Restore build cache + uses: actions/cache@v2 + with: + path: packages/react-native-editor/ios/build/gutenberg/Build/Products/Release-iphonesimulator/GutenbergDemo.app + key: ${{ runner.os }}-ios-build-${{ hashFiles('ios-checksums.txt') }} + + - name: Restore pods cache + uses: actions/cache@v2 + with: + path: | + packages/react-native-editor/ios/Pods + ~/Library/Caches/CocoaPods + ~/.cocoapods/repos/trunk + packages/react-native-editor/ios/vendor + key: ${{ runner.os }}-pods-${{ hashFiles('packages/react-native-editor/ios/Gemfile.lock') }}-${{ hashFiles('packages/react-native-editor/ios/Podfile.lock') }}-${{ hashFiles('package-lock.json') }} + restore-keys: | + ${{ runner.os }}-pods-${{ hashFiles('packages/react-native-editor/ios/Gemfile.lock') }}-${{ hashFiles('packages/react-native-editor/ios/Podfile.lock') }}-${{ hashFiles('package-lock.json') }} + ${{ runner.os }}-pods-${{ hashFiles('packages/react-native-editor/ios/Gemfile.lock') }}-${{ hashFiles('packages/react-native-editor/ios/Podfile.lock') }}- + ${{ runner.os }}-pods-${{ hashFiles('packages/react-native-editor/ios/Gemfile.lock') }}- + ${{ runner.os }}-pods- + + - name: Bundle iOS + run: npm run native test:e2e:bundle:ios + + - name: Switch Xcode Version + run: sudo xcode-select --switch /Applications/Xcode_11.4.1.app + + - name: Build (if needed) + run: test -e packages/react-native-editor/ios/build/gutenberg/Build/Products/Release-iphonesimulator/GutenbergDemo.app/GutenbergDemo || SKIP_BUNDLING=true npm run native test:e2e:build-app:ios + + - name: Run iOS Device Tests + run: TEST_RN_PLATFORM=ios npm run native device-tests:local ${{ matrix.native-test-name }} + + - name: Prepare build cache + run: rm packages/react-native-editor/ios/build/gutenberg/Build/Products/Release-iphonesimulator/GutenbergDemo.app/main.jsbundle + + - uses: actions/upload-artifact@v2 + if: always() + with: + name: ios-screen-recordings + path: packages/react-native-editor/ios-screen-recordings diff --git a/.github/workflows/static-checks.yml b/.github/workflows/static-checks.yml new file mode 100644 index 0000000000000..fd447c4254209 --- /dev/null +++ b/.github/workflows/static-checks.yml @@ -0,0 +1,57 @@ +name: Static Analysis (Linting, License, Type checks...) + +on: + pull_request: + push: + branches: [master] + +jobs: + check: + name: All + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Cache node modules + uses: actions/cache@v2 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: Use Node.js 12.x + uses: actions/setup-node@v1 + with: + node-version: 12.x + + - name: Npm install and build + # A "full" install is executed, since `npm ci` does not always exit + # with an error status code if the lock file is inaccurate. + # + # See: https://github.com/WordPress/gutenberg/issues/16157 + run: | + npm install + npm run build + + - name: Lint JavaScript and Styles + run: npm run lint + + - name: Lint ES5 built files (IE11) + run: npx eslint --parser-options=ecmaVersion:5 --no-eslintrc --no-ignore ./build/**/*.js + + - name: Type checking + run: npm run build:package-types + + - name: Build artifacts + run: npm run check-local-changes + + - name: License compatibility + run: npm run check-licenses diff --git a/.github/workflows/storybook-pages.yml b/.github/workflows/storybook-pages.yml index 5a64163e6549d..3e168c8e806fc 100644 --- a/.github/workflows/storybook-pages.yml +++ b/.github/workflows/storybook-pages.yml @@ -9,24 +9,37 @@ jobs: deploy: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v2 - with: - ref: master + - name: Checkout + uses: actions/checkout@v2 + with: + ref: master - - name: Setup Node - uses: actions/setup-node@v1 - with: - node-version: '12.x' + - name: Cache node modules + uses: actions/cache@v2 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- - - name: Install Dependencies - run: npm ci + - name: Setup Node + uses: actions/setup-node@v1 + with: + node-version: '12.x' - - name: Build Storybook - run: npm run storybook:build + - name: Install Dependencies + run: npm ci - - name: Deploy - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./playground/dist + - name: Build Storybook + run: npm run storybook:build + + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./playground/dist diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml new file mode 100644 index 0000000000000..e229ab384abc2 --- /dev/null +++ b/.github/workflows/unit-test.yml @@ -0,0 +1,124 @@ +name: Unit Tests + +on: + pull_request: + paths-ignore: + - '**.md' + push: + branches: [master] + paths-ignore: + - '**.md' + +jobs: + unit-js: + name: JavaScript + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Cache node modules + uses: actions/cache@v2 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: Use Node.js 12.x + uses: actions/setup-node@v1 + with: + node-version: 12.x + + - name: Npm install and build + # It's not necessary to run the full build, since Jest can interpret + # source files with `babel-jest`. Some packages have their own custom + # build tasks, however. These must be run. + run: | + npm ci + npx lerna run build + + - name: Running the tests + run: npm run test-unit -- --ci --maxWorkers=2 --cacheDirectory="$HOME/.jest-cache" + + unit-php: + name: PHP + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Cache node modules + uses: actions/cache@v2 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: Use Node.js 12.x + uses: actions/setup-node@v1 + with: + node-version: 12.x + + - name: Npm install and build + run: | + npm ci + npm run build + + - name: Install WordPress + run: | + chmod -R 767 ./ # TODO: Possibly integrate in wp-env + npm run wp-env start + + - name: Running the tests + run: npm run test-php && npm run test-unit-php-multisite + + mobile-unit-js: + name: Mobile + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Cache node modules + uses: actions/cache@v2 + env: + cache-name: cache-node-modules + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-build-${{ env.cache-name }}- + ${{ runner.os }}-build- + ${{ runner.os }}- + + - name: Use Node.js 12.x + uses: actions/setup-node@v1 + with: + node-version: 12.x + + - name: Npm install and build + # It's not necessary to run the full build, since Jest can interpret + # source files with `babel-jest`. Some packages have their own custom + # build tasks, however. These must be run. + run: | + npm ci + npx lerna run build + + - name: Running the tests + run: npm run test-unit:native -- --ci --maxWorkers=2 --cacheDirectory="$HOME/.jest-cache" diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 0000000000000..42556fe6d99c1 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,3 @@ +{ + "extends": "packages/scripts/config/.markdownlint.json" +} diff --git a/.npmrc b/.npmrc index 1dab4ed4c3020..aafab1669bf72 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ save-exact = true +engine-strict = true diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index a494339b3af3f..0000000000000 --- a/.travis.yml +++ /dev/null @@ -1,189 +0,0 @@ -language: generic - -services: - - docker - -notifications: - email: - on_success: never - on_failure: change - -cache: - directories: - - $HOME/.composer/cache - - $HOME/.jest-cache - - $HOME/.npm - - $HOME/.nvm/.cache - -branches: - only: - - master - - rnmobile/master - - /rnmobile\/release.*/ - - /wp\/.*/ - -env: - global: - - WP_DEVELOP_DIR: ./wordpress - - LOCAL_SCRIPT_DEBUG: false - - INSTALL_WORDPRESS: true - -# Make sure NodeGit gets the correct C libs. -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - libstdc++-4.9-dev - -before_install: - - nvm install --latest-npm - - | - if [[ "$INSTALL_WORDPRESS" = "true" ]]; then - # Upgrade docker-compose. - sudo rm /usr/local/bin/docker-compose - curl -sL https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > docker-compose - chmod +x docker-compose - sudo mv docker-compose /usr/local/bin - fi - -install: - # Build Gutenberg. - - npm ci - - npm run build - - | - if [[ "$INSTALL_WORDPRESS" = "true" ]]; then - echo '{ "config": { "SCRIPT_DEBUG": false, "WP_PHP_BINARY": "php", "WP_TESTS_EMAIL": "admin@example.org", "WP_TESTS_TITLE": "Test Blog" } }' > .wp-env.override.json - chmod -R 767 ./ # TODO: Possibly integrate in wp-env - npm run wp-env start - fi - - | - if [[ "$E2E_ROLE" = "author" ]]; then - npm run wp-env run tests-cli "wp user create author author@example.com --role=author --user_pass=authpass" - npm run wp-env run tests-cli "wp post update 1 --post_author=2" - fi - -jobs: - include: - - name: Lint - install: - - npm ci - # eslint-plugin-import/no-extraneous-dependencies relies on modules to - # be "installed", which in practice requires that packages be built, - # presumably so that pkg.main can be resolved. - # - # See: https://github.com/benmosher/eslint-plugin-import/blob/92caa35/resolvers/node/index.js - - node ./bin/packages/build.js - script: - - npm run lint - - - name: Lint ES5 only - install: - - npm ci - - npm run build - script: - - npx eslint --parser-options=ecmaVersion:5 --no-eslintrc --no-ignore ./build/**/*.js - - - name: Typecheck - install: - - npm ci - script: - - npm run build:package-types - - - - name: Build artifacts - install: - # A "full" install is executed, since `npm ci` does not always exit - # with an error status code if the lock file is inaccurate. - # - # See: https://github.com/WordPress/gutenberg/issues/16157 - - npm install - script: - - npm run check-local-changes - - - name: License compatibility - install: - - npm ci - script: - - npm run check-licenses - - - name: JavaScript unit tests - env: INSTALL_WORDPRESS=false - install: - - npm ci - # It's not necessary to run the full build, since Jest can interpret - # source files with `babel-jest`. Some packages have their own custom - # build tasks, however. These must be run. - - npx lerna run build - script: - - npm run test-unit -- --ci --maxWorkers=2 --cacheDirectory="$HOME/.jest-cache" - - - name: JavaScript native mobile tests - install: - - npm ci - # It's not necessary to run the full build, since Jest can interpret - # source files with `babel-jest`. Some packages have their own custom - # build tasks, however. These must be run. - - npx lerna run build - script: - - npm run test-unit:native -- --ci --maxWorkers=2 --cacheDirectory="$HOME/.jest-cache" - - - name: PHP unit tests - script: - - npm run test-php && npm run test-unit-php-multisite - - - name: PHP unit tests (PHP 5.6) - env: LOCAL_PHP=5.6-fpm - script: - - npm run test-php && npm run test-unit-php-multisite - - - name: E2E tests (Admin) (1/4) - env: FORCE_REDUCED_MOTION=true - script: - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 0' < ~/.jest-e2e-tests ) - - - name: E2E tests (Admin) (2/4) - env: FORCE_REDUCED_MOTION=true - script: - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 1' < ~/.jest-e2e-tests ) - - - name: E2E tests (Admin) (3/4) - env: FORCE_REDUCED_MOTION=true - script: - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 2' < ~/.jest-e2e-tests ) - - - name: E2E tests (Admin) (4/4) - env: FORCE_REDUCED_MOTION=true - script: - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 3' < ~/.jest-e2e-tests ) - - - name: E2E tests (Author) (1/4) - env: E2E_ROLE=author FORCE_REDUCED_MOTION=true - script: - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 0' < ~/.jest-e2e-tests ) - - - name: E2E tests (Author) (2/4) - env: E2E_ROLE=author FORCE_REDUCED_MOTION=true - script: - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 1' < ~/.jest-e2e-tests ) - - - name: E2E tests (Author) (3/4) - env: E2E_ROLE=author FORCE_REDUCED_MOTION=true - script: - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 2' < ~/.jest-e2e-tests ) - - - name: E2E tests (Author) (4/4) - env: E2E_ROLE=author FORCE_REDUCED_MOTION=true - script: - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests - - $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 3' < ~/.jest-e2e-tests ) - - allow_failures: - # nothing is allowed to fail at the moment diff --git a/.wp-env.json b/.wp-env.json index 943f4d0399eea..0f9c8d4670f67 100644 --- a/.wp-env.json +++ b/.wp-env.json @@ -1,8 +1,12 @@ { "core": "WordPress/WordPress", "plugins": [ "." ], - "mappings": { - "wp-content/mu-plugins": "./packages/e2e-tests/mu-plugins", - "wp-content/plugins/gutenberg-test-plugins": "./packages/e2e-tests/plugins" + "env": { + "tests": { + "mappings": { + "wp-content/mu-plugins": "./packages/e2e-tests/mu-plugins", + "wp-content/plugins/gutenberg-test-plugins": "./packages/e2e-tests/plugins" + } + } } } diff --git a/README.md b/README.md index 78567bb190d04..037168329a5c2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # Gutenberg + [![Build Status](https://img.shields.io/travis/com/WordPress/gutenberg/master.svg)](https://travis-ci.com/WordPress/gutenberg) [![lerna](https://img.shields.io/badge/maintained%20with-lerna-cc00ff.svg)](https://lerna.js.org) @@ -18,17 +19,17 @@ Get hands on: check out the [block editor live demo](https://wordpress.org/guten ### Using Gutenberg -- **Download:** To use the latest release of the Gutenberg plugin on your WordPress site: install from the plugins page in wp-admin, or [download from the WordPress.org plugins repository](https://wordpress.org/plugins/gutenberg/). +- **Download:** To use the latest release of the Gutenberg plugin on your WordPress site: install from the plugins page in wp-admin, or [download from the WordPress.org plugins repository](https://wordpress.org/plugins/gutenberg/). -- **User Documentation:** See the [WordPress Editor documentation](https://wordpress.org/support/article/wordpress-editor/) for detailed docs on using the editor as an author creating posts and pages. +- **User Documentation:** See the [WordPress Editor documentation](https://wordpress.org/support/article/wordpress-editor/) for detailed docs on using the editor as an author creating posts and pages. -- **User Support:** If you have run into an issue, you should check the [Support Forums first](https://wordpress.org/support/forums/). The forums are a great place to get help. If you have a bug to report, please [submit it to the Gutenberg repository](https://github.com/wordpress/gutenberg/issues). Please search prior to creating a new bug to confirm its not a duplicate. +- **User Support:** If you have run into an issue, you should check the [Support Forums first](https://wordpress.org/support/forums/). The forums are a great place to get help. If you have a bug to report, please [submit it to the Gutenberg repository](https://github.com/wordpress/gutenberg/issues). Please search prior to creating a new bug to confirm its not a duplicate. ### Developing for Gutenberg Extending and customizing is at the heart of the WordPress platform, this is no different for the Gutenberg project. The editor and future products can be extended by third-party developers using plugins. -The Getting Started guide will help you run Gutenberg locally to tinker with. See the [Developer Documentation](https://developer.wordpress.org/block-editor/developers/) for extensive tutorials, documentation, and API references on how to extend the editor. +Review the [Create a Block tutorial](/docs/designers-developers/developers/tutorials/create-block/readme.md) for the fastest way to get started extending the block editor. See the [Developer Documentation](https://developer.wordpress.org/block-editor/developers/) for extensive tutorials, documentation, and API references. ### Contribute to Gutenberg diff --git a/bin/packages/build-worker.js b/bin/packages/build-worker.js index d09294c10b0df..e0de0fd401181 100644 --- a/bin/packages/build-worker.js +++ b/bin/packages/build-worker.js @@ -96,7 +96,6 @@ const BUILD_TASK_BY_EXTENSION = { makeDir( path.dirname( outputFile ) ), readFile( file, 'utf8' ), ] ); - const builtSass = await renderSass( { file, includePaths: [ path.join( PACKAGES_DIR, 'base-styles' ) ], @@ -109,6 +108,12 @@ const BUILD_TASK_BY_EXTENSION = { 'animations', 'z-index', ] + // Editor styles should be excluded from the default CSS vars output. + .concat( + file.includes( 'editor-styles.scss' ) + ? [] + : [ 'default-custom-properties' ] + ) .map( ( imported ) => `@import "${ imported }";` ) .join( ' ' ) + contents, } ); diff --git a/bin/packages/watch.js b/bin/packages/watch.js index c74fe095f06d8..69256b7937c5b 100644 --- a/bin/packages/watch.js +++ b/bin/packages/watch.js @@ -44,7 +44,7 @@ getPackages().forEach( ( p ) => { fs.accessSync( srcDir, fs.F_OK ); watch( path.resolve( p, 'src' ), - { recursive: true }, + { recursive: true, delay: 500 }, ( event, filename ) => { if ( ! isSourceFile( filename ) ) { return; diff --git a/bin/plugin/cli.js b/bin/plugin/cli.js index d99bd94f72a1a..054199ef4b4b1 100755 --- a/bin/plugin/cli.js +++ b/bin/plugin/cli.js @@ -5,11 +5,25 @@ */ const program = require( 'commander' ); +const catchException = ( command ) => { + return async ( ...args ) => { + try { + await command( ...args ); + } catch ( error ) { + console.error( error ); + process.exitCode = 1; + } + }; +}; + /** * Internal dependencies */ const { releaseRC, releaseStable } = require( './commands/release' ); -const { prepublishNpmStablePackages } = require( './commands/packages' ); +const { + prepareLatestDistTag, + prepareNextDistTag, +} = require( './commands/packages' ); const { getReleaseChangelog } = require( './commands/changelog' ); const { runPerformanceTests } = require( './commands/performance' ); @@ -19,21 +33,29 @@ program .description( 'Release an RC version of the plugin (supports only rc.1 for now)' ) - .action( releaseRC ); + .action( catchException( releaseRC ) ); program .command( 'release-plugin-stable' ) .alias( 'stable' ) .description( 'Release a stable version of the plugin' ) - .action( releaseStable ); + .action( catchException( releaseStable ) ); program - .command( 'prepublish-packages-stable' ) + .command( 'prepare-packages-stable' ) .alias( 'npm-stable' ) .description( - 'Prepublish to npm steps for the next stable version of WordPress packages' + 'Prepares the packages to be published to npm as stable (latest dist-tag, production version)' + ) + .action( catchException( prepareLatestDistTag ) ); + +program + .command( 'prepare-packages-rc' ) + .alias( 'npm-rc' ) + .description( + 'Prepares the packages to be published to npm as RC (next dist-tag, RC version)' ) - .action( prepublishNpmStablePackages ); + .action( catchException( prepareNextDistTag ) ); program .command( 'release-plugin-changelog' ) @@ -41,14 +63,19 @@ program .option( '-m, --milestone ', 'Milestone' ) .option( '-t, --token ', 'Github token' ) .description( 'Generates a changelog from merged Pull Requests' ) - .action( getReleaseChangelog ); + .action( catchException( getReleaseChangelog ) ); program .command( 'performance-tests [branches...]' ) .alias( 'perf' ) + .option( '-c, --ci', 'Run in CI (non interactive)' ) + .option( + '--tests-branch ', + "Use this branch's performance test files" + ) .description( 'Runs performance tests on two separate branches and outputs the result' ) - .action( runPerformanceTests ); + .action( catchException( runPerformanceTests ) ); program.parse( process.argv ); diff --git a/bin/plugin/commands/packages.js b/bin/plugin/commands/packages.js index ca82883d8a2d6..9a16beeb82b06 100644 --- a/bin/plugin/commands/packages.js +++ b/bin/plugin/commands/packages.js @@ -88,19 +88,21 @@ async function runWordPressReleaseBranchSyncStep( * * @param {string} gitWorkingDirectoryPath Git working directory path. * @param {string} minimumVersionBump Minimum version bump for the packages. + * @param {boolean} isPrerelease Whether the package version to publish is a prerelease. * @param {string} abortMessage Abort Message. */ -async function updatePackageChangelogs( +async function updatePackages( gitWorkingDirectoryPath, minimumVersionBump, + isPrerelease, abortMessage ) { const changelogFiles = await glob( path.resolve( gitWorkingDirectoryPath, 'packages/*/CHANGELOG.md' ) ); const processedPackages = await Promise.all( - changelogFiles.map( async ( changelogFile ) => { - const fileStream = fs.createReadStream( changelogFile ); + changelogFiles.map( async ( changelogPath ) => { + const fileStream = fs.createReadStream( changelogPath ); const lines = readline.createInterface( { input: fileStream, @@ -152,30 +154,33 @@ async function updatePackageChangelogs( } } const packageName = `@wordpress/${ - changelogFile.split( '/' ).reverse()[ 1 ] + changelogPath.split( '/' ).reverse()[ 1 ] }`; - const { version } = readJSONFile( - changelogFile.replace( 'CHANGELOG.md', 'package.json' ) + const packageJSONPath = changelogPath.replace( + 'CHANGELOG.md', + 'package.json' ); + const { version } = readJSONFile( packageJSONPath ); const nextVersion = versionBump !== null ? semver.inc( version, versionBump ) : null; return { - changelogFile, + changelogPath, + packageJSONPath, packageName, - version, nextVersion, + version, }; } ) ); - const changelogsToUpdate = processedPackages.filter( + const packagesToUpdate = processedPackages.filter( ( { nextVersion } ) => nextVersion ); - if ( changelogsToUpdate.length === 0 ) { + if ( packagesToUpdate.length === 0 ) { log( '>> No changes in CHANGELOG files detected.' ); return; } @@ -186,19 +191,40 @@ async function updatePackageChangelogs( const publishDate = new Date().toISOString().split( 'T' )[ 0 ]; await Promise.all( - changelogsToUpdate.map( - async ( { changelogFile, packageName, nextVersion, version } ) => { + packagesToUpdate.map( + async ( { + changelogPath, + packageJSONPath, + packageName, + nextVersion, + version, + } ) => { + // Update changelog const content = await fs.promises.readFile( - changelogFile, + changelogPath, 'utf8' ); await fs.promises.writeFile( - changelogFile, + changelogPath, content.replace( '## Unreleased', - `## Unreleased\n\n## ${ nextVersion } (${ publishDate })` + `## Unreleased\n\n## ${ + isPrerelease ? nextVersion + '-rc.0' : nextVersion + } (${ publishDate })` ) ); + + // Update package.json + const packageJson = readJSONFile( packageJSONPath ); + const newPackageJson = { + ...packageJson, + version: nextVersion + '-prerelease', + }; + fs.writeFileSync( + packageJSONPath, + JSON.stringify( newPackageJson, null, '\t' ) + '\n' + ); + log( ` - ${ packageName }: ${ version } -> ${ nextVersion }` ); @@ -246,13 +272,14 @@ async function runPushGitChangesStep( } /** - * Prepublish to npm steps for WordPress packages. + * Prepare everything to publish WordPress packages to npm. * * @param {string} minimumVersionBump Minimum version bump for the packages. + * @param {boolean} isPrerelease Whether the package version to publish is a prerelease. * * @return {Promise} Github release object. */ -async function prepublishPackages( minimumVersionBump ) { +async function prepareForPackageRelease( minimumVersionBump, isPrerelease ) { // This is a variable that contains the abort message shown when the script is aborted. let abortMessage = 'Aborting!'; const temporaryFolders = []; @@ -270,9 +297,10 @@ async function prepublishPackages( minimumVersionBump ) { abortMessage ); - await updatePackageChangelogs( + await updatePackages( gitWorkingDirectoryPath, minimumVersionBump, + isPrerelease, abortMessage ); @@ -288,22 +316,40 @@ async function prepublishPackages( minimumVersionBump ) { await runCleanLocalFoldersStep( temporaryFolders, abortMessage ); } -async function prepublishNpmStablePackages() { +async function prepareLatestDistTag() { + log( + formats.title( + '\n💃 Time to publish WordPress packages to npm 🕺\n\n' + ), + 'Welcome! This tool is going to help you with preparing everything for publishing a new stable version of WordPress packages.\n', + "To perform a release you'll have to be a member of the WordPress Team on npm.\n" + ); + + await prepareForPackageRelease( 'patch' ); + + log( + '\n>> 🎉 WordPress packages are ready to publish!\n', + 'You need to run "npm run publish:prod" to release them to npm.\n', + 'Let also people know on WordPress Slack when everything is finished.\n' + ); +} + +async function prepareNextDistTag() { log( formats.title( '\n💃 Time to publish WordPress packages to npm 🕺\n\n' ), - 'Welcome! This tool is going to help you with prepublish to npm steps for the next stable version of WordPress packages.\n', + 'Welcome! This tool is going to help you with preparing everything for publishing a new RC version of WordPress packages.\n', "To perform a release you'll have to be a member of the WordPress Team on npm.\n" ); - await prepublishPackages( 'minor' ); + await prepareForPackageRelease( 'minor', true ); log( - '\n>> 🎉 WordPress packages are ready to publish.\n', - 'Thanks for performing the prepublish process! You still need to run "npm run publish:prod" to perform the actual release.\n', + '\n>> 🎉 WordPress packages are ready to publish!\n', + 'You need to run "npm run publish:dev" to release them to npm.\n', 'Let also people know on WordPress Slack when everything is finished.\n' ); } -module.exports = { prepublishNpmStablePackages }; +module.exports = { prepareLatestDistTag, prepareNextDistTag }; diff --git a/bin/plugin/commands/performance.js b/bin/plugin/commands/performance.js index 3eef3f42e50e6..213341db0d08a 100644 --- a/bin/plugin/commands/performance.js +++ b/bin/plugin/commands/performance.js @@ -2,6 +2,7 @@ * External dependencies */ const path = require( 'path' ); +const { pickBy, mapValues } = require( 'lodash' ); /** * Internal dependencies @@ -16,6 +17,13 @@ const { const git = require( '../lib/git' ); const config = require( '../config' ); +/** + * @typedef WPPerformanceCommandOptions + * + * @property {boolean=} ci Run on CI. + * @property {string=} testsBranch The branch whose performance test files will be used for testing. + */ + /** * @typedef WPRawPerformanceResults * @@ -40,14 +48,14 @@ const config = require( '../config' ); /** * @typedef WPFormattedPerformanceResults * - * @property {string} load Load Time. - * @property {string} domcontentloaded DOM Contentloaded time. - * @property {string} type Average type time. - * @property {string} minType Minium type time. - * @property {string} maxType Maximum type time. - * @property {string} focus Average block selection time. - * @property {string} minFocus Min block selection time. - * @property {string} maxFocus Max block selection time. + * @property {string=} load Load Time. + * @property {string=} domcontentloaded DOM Contentloaded time. + * @property {string=} type Average type time. + * @property {string=} minType Minium type time. + * @property {string=} maxType Maximum type time. + * @property {string=} focus Average block selection time. + * @property {string=} minFocus Min block selection time. + * @property {string=} maxFocus Max block selection time. */ /** @@ -58,7 +66,7 @@ const config = require( '../config' ); * @return {number} Average. */ function average( array ) { - return array.reduce( ( a, b ) => a + b ) / array.length; + return array.reduce( ( a, b ) => a + b, 0 ) / array.length; } /** @@ -109,19 +117,12 @@ function curateResults( results ) { } /** - * Runs the performance tests on a given branch. + * Set up the given branch for testing. * - * @param {string} performanceTestDirectory Path to the performance tests' clone. - * @param {string} environmentDirectory Path to the plugin environment's clone. * @param {string} branch Branch name. - * - * @return {Promise} Performance results for the branch. + * @param {string} environmentDirectory Path to the plugin environment's clone. */ -async function getPerformanceResultsForBranch( - performanceTestDirectory, - environmentDirectory, - branch -) { +async function setUpGitBranch( branch, environmentDirectory ) { // Restore clean working directory (e.g. if `package-lock.json` has local // changes after install). await git.discardLocalChanges( environmentDirectory ); @@ -134,45 +135,59 @@ async function getPerformanceResultsForBranch( 'rm -rf node_modules && npm install && npm run build', environmentDirectory ); +} - log( - '>> Running the test on the ' + formats.success( branch ) + ' branch' - ); +/** + * Runs the performance tests on the current branch. + * + * @param {string} testSuite Name of the tests set. + * @param {string} performanceTestDirectory Path to the performance tests' clone. + * + * @return {Promise} Performance results for the branch. + */ +async function runTestSuite( testSuite, performanceTestDirectory ) { const results = []; for ( let i = 0; i < 3; i++ ) { await runShellScript( - 'npm run test-performance', + `npm run test-performance -- packages/e2e-tests/specs/performance/${ testSuite }.test.js`, performanceTestDirectory ); const rawResults = await readJSONFile( path.join( performanceTestDirectory, - 'packages/e2e-tests/specs/performance/results.json' + `packages/e2e-tests/specs/performance/${ testSuite }.test.results.json` ) ); results.push( curateResults( rawResults ) ); } - return { - load: formatTime( median( results.map( ( r ) => r.load ) ) ), - domcontentloaded: formatTime( - median( results.map( ( r ) => r.domcontentloaded ) ) - ), - type: formatTime( median( results.map( ( r ) => r.type ) ) ), - minType: formatTime( median( results.map( ( r ) => r.minType ) ) ), - maxType: formatTime( median( results.map( ( r ) => r.maxType ) ) ), - focus: formatTime( median( results.map( ( r ) => r.focus ) ) ), - minFocus: formatTime( median( results.map( ( r ) => r.minFocus ) ) ), - maxFocus: formatTime( median( results.map( ( r ) => r.maxFocus ) ) ), - }; + const medians = mapValues( + { + load: results.map( ( r ) => r.load ), + domcontentloaded: results.map( ( r ) => r.domcontentloaded ), + type: results.map( ( r ) => r.type ), + minType: results.map( ( r ) => r.minType ), + maxType: results.map( ( r ) => r.maxType ), + focus: results.map( ( r ) => r.focus ), + minFocus: results.map( ( r ) => r.minFocus ), + maxFocus: results.map( ( r ) => r.maxFocus ), + }, + median + ); + + // Remove results for which we don't have data (and where the statistical functions thus returned NaN or Infinity etc). + const finiteMedians = pickBy( medians, isFinite ); + // Format results as times. + return mapValues( finiteMedians, formatTime ); } /** * Runs the performances tests on an array of branches and output the result. * - * @param {string[]} branches Branches to compare + * @param {WPPerformanceCommandOptions} options Command options. + * @param {string[]} branches Branches to compare */ -async function runPerformanceTests( branches ) { +async function runPerformanceTests( branches, options ) { // The default value doesn't work because commander provides an array. if ( branches.length === 0 ) { branches = [ 'master' ]; @@ -185,10 +200,25 @@ async function runPerformanceTests( branches ) { 'Make sure these ports are not used before continuing.\n' ); - await askForConfirmation( 'Ready to go? ' ); + if ( ! options.ci ) { + await askForConfirmation( 'Ready to go? ' ); + } log( '>> Cloning the repository' ); const performanceTestDirectory = await git.clone( config.gitRepositoryURL ); + + if ( !! options.testsBranch ) { + log( + '>> Fetching the ' + + formats.success( options.testsBranch ) + + ' branch' + ); + await git.checkoutRemoteBranch( + performanceTestDirectory, + options.testsBranch + ); + } + const environmentDirectory = getRandomTemporaryPath(); log( '>> Perf Tests Directory : ' + @@ -211,21 +241,40 @@ async function runPerformanceTests( branches ) { log( '>> Starting the WordPress environment' ); await runShellScript( 'npm run wp-env start', environmentDirectory ); - /** @type {Record} */ - const results = {}; + const testSuites = [ 'post-editor', 'site-editor' ]; + + /** @type {Record>} */ + let results = {}; for ( const branch of branches ) { - results[ branch ] = await getPerformanceResultsForBranch( - performanceTestDirectory, - environmentDirectory, - branch + await setUpGitBranch( branch, environmentDirectory ); + log( + '>> Running the test on the ' + + formats.success( branch ) + + ' branch' ); + + for ( const testSuite of testSuites ) { + results = { + ...results, + [ testSuite ]: { + ...results[ testSuite ], + [ branch ]: await runTestSuite( + testSuite, + performanceTestDirectory + ), + }, + }; + } } log( '>> Stopping the WordPress environment' ); await runShellScript( 'npm run wp-env stop', environmentDirectory ); log( '\n>> 🎉 Results.\n' ); - console.table( results ); + for ( const testSuite of testSuites ) { + log( `\n>> ${ testSuite }\n` ); + console.table( results[ testSuite ] ); + } } module.exports = { diff --git a/bin/plugin/commands/release.js b/bin/plugin/commands/release.js index b5ea52ba3dd40..9df33d8987b07 100644 --- a/bin/plugin/commands/release.js +++ b/bin/plugin/commands/release.js @@ -450,11 +450,12 @@ async function runGithubReleaseStep( type: 'input', name: 'token', message: - 'Please provide a GitHub personal authentication token. Navigate to ' + + 'Please enter a GitHub personal authentication token.\n' + + 'You can create one by navigating to ' + formats.success( 'https://github.com/settings/tokens/new?scopes=repo,admin:org,write:packages' ) + - ' to create one.', + '.\nToken:', }, ] ); diff --git a/bin/plugin/lib/git.js b/bin/plugin/lib/git.js index 922b72946182a..b8b4242800744 100644 --- a/bin/plugin/lib/git.js +++ b/bin/plugin/lib/git.js @@ -18,7 +18,10 @@ const { getRandomTemporaryPath } = require( './utils' ); async function clone( repositoryUrl ) { const gitWorkingDirectoryPath = getRandomTemporaryPath(); const simpleGit = SimpleGit(); - await simpleGit.clone( repositoryUrl, gitWorkingDirectoryPath ); + await simpleGit.clone( repositoryUrl, gitWorkingDirectoryPath, [ + '--depth=1', + '--no-single-branch', + ] ); return gitWorkingDirectoryPath; } @@ -59,6 +62,7 @@ async function createLocalBranch( gitWorkingDirectoryPath, branchName ) { */ async function checkoutRemoteBranch( gitWorkingDirectoryPath, branchName ) { const simpleGit = SimpleGit( gitWorkingDirectoryPath ); + await simpleGit.fetch( 'origin', branchName ); await simpleGit.checkout( branchName ); } diff --git a/bin/validate-package-lock.js b/bin/validate-package-lock.js index 63ffbd70c0b09..ec33014cbfee0 100755 --- a/bin/validate-package-lock.js +++ b/bin/validate-package-lock.js @@ -28,7 +28,7 @@ for ( const [ name, dependency ] of dependencies ) { ${ red( JSON.stringify( { [ name ]: dependency }, null, '\t' ) ) } -To fix, try removing the node_modules directory, then run ${ yellow( +To fix, try removing the node_modules directory and reverting package-lock.json, then run ${ yellow( 'npm install' ) }. ` diff --git a/changelog.txt b/changelog.txt index 581099fd160f8..a005f40cf05ee 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,951 @@ == Changelog == += 8.9.1 = + +### Bug Fixes + + += 8.9.0 = + +### Features + +- Enable the block-based widgets screen. ([24843](https://github.com/WordPress/gutenberg/pull/24843)), ([24087](https://github.com/WordPress/gutenberg/pull/24087)) +- Add character count to the info panel. ([24823](https://github.com/WordPress/gutenberg/pull/24823)) +- Latest Post Block: Allow adding links to featured images. ([24548](https://github.com/WordPress/gutenberg/pull/24548)) +- List block: Add color controls. ([21387](https://github.com/WordPress/gutenberg/pull/21387)) + +### Enhancements + +- Disable the tools menu while the code editor is enabled. ([24923](https://github.com/WordPress/gutenberg/pull/24923)) +- Add picture keyword to the Image block. ([24755](https://github.com/WordPress/gutenberg/pull/24755)) +- Adding a maximum height to the long blocks previews. ([24493](https://github.com/WordPress/gutenberg/pull/24493)) +- Add "read more" keyword to the More block. ([24794](https://github.com/WordPress/gutenberg/pull/24794)) +- Improve the UX of inactive widgets area on the widgets screen. ([24790](https://github.com/WordPress/gutenberg/pull/24790)) +- Trim whitespace from rendered widgets. ([24789](https://github.com/WordPress/gutenberg/pull/24789)) +- Block Directory: Explicitly close the inserter on block add. ([24709](https://github.com/WordPress/gutenberg/pull/24709)) +- Make strings translatable in block patterns. ([24647](https://github.com/WordPress/gutenberg/pull/24647)) +- Improve the UI of the custom gradient pickers. ([23802](https://github.com/WordPress/gutenberg/pull/23802)) +- Adds suggestions for categories and formats to link controls. ([22600](https://github.com/WordPress/gutenberg/pull/22600)) +- Clarify the font size control label. ([24619](https://github.com/WordPress/gutenberg/pull/24619)) +- Convert all `px` values in front-facing styles to relative (`em`) units. ([24523](https://github.com/WordPress/gutenberg/pull/24523)) + +### Bug Fixes + +- Fix infinite loop in the Disabled component. ([24935](https://github.com/WordPress/gutenberg/pull/24935)) +- Fix wp-env start for non-english WordPress core sources. ([24884](https://github.com/WordPress/gutenberg/pull/24884)) +- Invalid HTML structure on the widgets screen. ([24866](https://github.com/WordPress/gutenberg/pull/24866)) +- Fix sidebar flickering caused by the block preview border. ([24739](https://github.com/WordPress/gutenberg/pull/24739)) +- Don't use an offset when dragging using a draggable chip. ([24707](https://github.com/WordPress/gutenberg/pull/24707)) +- Fix Image alignment controls styles in the Latest posts block. ([24655](https://github.com/WordPress/gutenberg/pull/24655)) +- Improve the focus state of the tags control remove button. ([24632](https://github.com/WordPress/gutenberg/pull/24632)) +- Fix Crash after undoing with the top toolbar on. ([24629](https://github.com/WordPress/gutenberg/pull/24629)) +- Avoid double borders on the meta boxes panels. ([24627](https://github.com/WordPress/gutenberg/pull/24627)) +- Fix Inline text-color regex edge-case. ([24621](https://github.com/WordPress/gutenberg/pull/24621)) +- Fix inserter z-index. ([24614](https://github.com/WordPress/gutenberg/pull/24614)) +- Missing selected block highlighting in the list view. ([24609](https://github.com/WordPress/gutenberg/pull/24609)) +- Fix the Pullquote block text color after unsetting the main color. ([24600](https://github.com/WordPress/gutenberg/pull/24600)) +- Fix style specificity for Button blocks with outline style and background colors. ([24599](https://github.com/WordPress/gutenberg/pull/24599)) +- Remove references to `$default-font` from front-facing styles. ([24567](https://github.com/WordPress/gutenberg/pull/24567)) +- Center-align the block variations buttons. ([24547](https://github.com/WordPress/gutenberg/pull/24547)) +- Fix category select in QueryControls component. ([24516](https://github.com/WordPress/gutenberg/pull/24516)) +- Image Block: Prevent Alt and caption written during image upload from being discarded. ([24471](https://github.com/WordPress/gutenberg/pull/24471)) +- Correct the Unicode character used to represent the macOS Control key. ([24452](https://github.com/WordPress/gutenberg/pull/24452)) +- Fix undefined $block_type->supports PHP error. ([24411](https://github.com/WordPress/gutenberg/pull/24411)) +- Fix admin-theme colors in the editor canvas. ([24408](https://github.com/WordPress/gutenberg/pull/24408)) +- Limit the number of fetched tags to avoid infinite queries. ([23841](https://github.com/WordPress/gutenberg/pull/23841)) +- Fix error when inserting a tag with an apostrophe. ([21693](https://github.com/WordPress/gutenberg/pull/21693)) +- Fix the alignment of the trash post button. ([24889](https://github.com/WordPress/gutenberg/pull/24889)) +- Make legacy widgets support for non-class-based widgets. ([24861](https://github.com/WordPress/gutenberg/pull/24861)) ([24792](https://github.com/WordPress/gutenberg/pull/24792)) +- Remove WP_Widget_Block from the legacy dropdown list. ([24787](https://github.com/WordPress/gutenberg/pull/24787)) +- Fix isSavingWidgetAreas selector. ([24788](https://github.com/WordPress/gutenberg/pull/24788)) +- Inserter: Update the search form placeholder text when changing tabs. ([24697](https://github.com/WordPress/gutenberg/pull/24697)) ([24802](https://github.com/WordPress/gutenberg/pull/24802)) +- Avoid lossy HTML entities encoding by setting charset. ([24645](https://github.com/WordPress/gutenberg/pull/24645)) +- Embeds: Don't transform into specialized embed block variation if it's not registered. ([24559](https://github.com/WordPress/gutenberg/pull/24559)) + +### Performance + +- Fix getBlocks selector performance issues causing typing lags on Gutenberg 8.8.0. ([24835](https://github.com/WordPress/gutenberg/pull/24835)) + +- Preload widgets on the widgets screen. ([24855](https://github.com/WordPress/gutenberg/pull/24855)) +- Only request the required fields to populate the parent page list. ([23637](https://github.com/WordPress/gutenberg/pull/23637)) + +### New APIs + +- Core Data: Implement `_fields` data reuse for entities. ([19498](https://github.com/WordPress/gutenberg/pull/19498)) + +### Experiments + +- Site Editing: Blocks + - Add Post Comment block. ([24781](https://github.com/WordPress/gutenberg/pull/24781)) + - Add Post Comment Date block. ([24854](https://github.com/WordPress/gutenberg/pull/24854)) + - Add Post Comment Author block. ([24824](https://github.com/WordPress/gutenberg/pull/24824)) + - Add Post Hierarchical Terms Block. ([24091](https://github.com/WordPress/gutenberg/pull/24091)) + - Adds icons and descriptions to Post blocks. ([24603](https://github.com/WordPress/gutenberg/pull/24603)) + - Make Site title block render a link. ([24725](https://github.com/WordPress/gutenberg/pull/24725)) + - Add heading level toolbar to the Site title block. ([24758](https://github.com/WordPress/gutenberg/pull/24758)) +- Site Editing: UI + - Alert when trying to leave the Site Editor with unsaved changes. (24659) (24719) + - Update Template Part Block Placeholder Button Styles. (24633) + - Template Part block - add border states in the editor. ([24498](https://github.com/WordPress/gutenberg/pull/24498)) +- Global Styles and theme.json APIs: + - Allow enabling/disabling custom colors from theme.json config. ([24761](https://github.com/WordPress/gutenberg/pull/24761)) ([24932](https://github.com/WordPress/gutenberg/pull/24932)) + - Rename features.colors to features.color. ([24933](https://github.com/WordPress/gutenberg/pull/24933)) + - useEditorFeature: Take block context into account. ([24416](https://github.com/WordPress/gutenberg/pull/24416)) +- Navigation block and screen: + - Add Post, Page, Category and Tag variations to Link. ([24670](https://github.com/WordPress/gutenberg/pull/24670)) + - Add block inspector to nav screen. ([24669](https://github.com/WordPress/gutenberg/pull/24669)) + - Add opt-in Navigation block rendering. ([24503](https://github.com/WordPress/gutenberg/pull/24503)) + - Support drag-and-drop for submenus of navigation blocks. ([24479](https://github.com/WordPress/gutenberg/pull/24479)) + - Fix invalid textarea markup. ([24641](https://github.com/WordPress/gutenberg/pull/24641)) + - Add unit tests for edit-navigation store. ([24681](https://github.com/WordPress/gutenberg/pull/24681)) + +### Documentation + +- Document Cmponents + - BlockInspector. ([24929](https://github.com/WordPress/gutenberg/pull/24929)) + - BlockMover. ([24851](https://github.com/WordPress/gutenberg/pull/24851)) + - BlockBreadcrumb. ([24827](https://github.com/WordPress/gutenberg/pull/24827)) +- Update tutorial Creating a block-based theme. ([24736](https://github.com/WordPress/gutenberg/pull/24736)) +- Correct BoxControl values in readme examples. ([24717](https://github.com/WordPress/gutenberg/pull/24717)) +- Add ToggleControl at related components section in FormToggle documentation. ([24636](https://github.com/WordPress/gutenberg/pull/24636)) +- Typos and tweaks: ([24857](https://github.com/WordPress/gutenberg/pull/24857)), ([24811](https://github.com/WordPress/gutenberg/pull/24811)), ([24695](https://github.com/WordPress/gutenberg/pull/24695)), ([24650](https://github.com/WordPress/gutenberg/pull/24650)), ([24628](https://github.com/WordPress/gutenberg/pull/24628)). + +### Code Quality + +- Keep the default color CSS variables for npm package consumers. ([24890](https://github.com/WordPress/gutenberg/pull/24890)) +- Refactor components as functional components: + - `WordCount` ([24850](https://github.com/WordPress/gutenberg/pull/24850)) + - BlockMover ([24774](https://github.com/WordPress/gutenberg/pull/24774)) + - UnsavedChangesWarning ([24783](https://github.com/WordPress/gutenberg/pull/24783)) +- Refactor and move drag and drop geometry code. ([24715](https://github.com/WordPress/gutenberg/pull/24715)) +- Only update state if we have a valid reference. ([24496](https://github.com/WordPress/gutenberg/pull/24496)) +- Add state for storing dragged block client ids to block-editor store. ([24782](https://github.com/WordPress/gutenberg/pull/24782)) +- Remove commented-out blank line. ([24858](https://github.com/WordPress/gutenberg/pull/24858)) +- Simplify gutenberg_widgets_init when $hook === 'widgets.php'. ([24793](https://github.com/WordPress/gutenberg/pull/24793)) +- Refactor block drop event handlers into a single hook to support drag and drop in List View. ([24649](https://github.com/WordPress/gutenberg/pull/24649)) +- Move DOM utility functions from @wordpress/blocks to @wordpress/dom. ([24618](https://github.com/WordPress/gutenberg/pull/24618)) +- Fix React warning on text color formatter. ([24686](https://github.com/WordPress/gutenberg/pull/24686)) + +### Build Tooling + +- Update package lock file. ([24815](https://github.com/WordPress/gutenberg/pull/24815)) +- Update the minimum version and the tested up to flag of the Gutenberg plugin. ([24693](https://github.com/WordPress/gutenberg/pull/24693)) +- Build: Make the watch rate slower to avoid using a lot of CPU while developing. ([23998](https://github.com/WordPress/gutenberg/pull/23998)) +- Fix Performance Tests on CI. ([24925](https://github.com/WordPress/gutenberg/pull/24925)) +- Add tests for slashing behavior. ([24785](https://github.com/WordPress/gutenberg/pull/24785)) +- Add permissions PHPUnit tests. ([24784](https://github.com/WordPress/gutenberg/pull/24784)) +- Update browserlist dependency. ([24756](https://github.com/WordPress/gutenberg/pull/24756)) +- Allow local Prettier configuration to take precedence in the recommended ESLint configuration. ([24590](https://github.com/WordPress/gutenberg/pull/24590)) + += 8.8.0 = + +### Enhancements + +- Copy: Use “block patterns” strings consistently. ([24457](https://github.com/WordPress/gutenberg/pull/24457)) +- Remove hardcoded color from the Recent Comments block. ([24410](https://github.com/WordPress/gutenberg/pull/24410)) +- Remove hardcoded styles from the Separator block. ([24366](https://github.com/WordPress/gutenberg/pull/24366)) +- Block toolbar: Split switcher from mover and simplify styles. ([23971](https://github.com/WordPress/gutenberg/pull/23971)) +- Use the block label API for BlockTitle component. ([23847](https://github.com/WordPress/gutenberg/pull/23847)) +- i18n: Translate all strings inside the Large Header Button block pattern. ([24499](https://github.com/WordPress/gutenberg/pull/24499)) +- Block Movers: Use a bigger mobile touch target. ([23761](https://github.com/WordPress/gutenberg/pull/23761)) +- Block Movers: Use a bigger visible focus rectangle. ([23760](https://github.com/WordPress/gutenberg/pull/23760)) +- Update the top toolbar buttons color. ([24420](https://github.com/WordPress/gutenberg/pull/24420)) +- Remove editor styles from front-facing stylesheets. ([24439](https://github.com/WordPress/gutenberg/pull/24439)) +- Block Toolbar More Menu: Switch back to the vertical ellipsis icon. ([24426](https://github.com/WordPress/gutenberg/pull/24426)) +- Removes hardcoded body text color from some block patterns. ([24424](https://github.com/WordPress/gutenberg/pull/24424)) + +### New APIs + +- Support the default block classnames in dynamic blocks. ([24546](https://github.com/WordPress/gutenberg/pull/24546)) +- Support the custom classnames hook in dynamic blocks. ([24483](https://github.com/WordPress/gutenberg/pull/24483)) +- Stabilize the accessible Toolbar component and deprecate the old usage. ([23316](https://github.com/WordPress/gutenberg/pull/23316)) +- Add store icon to Icons package. ([23867](https://github.com/WordPress/gutenberg/pull/23867)) +- Allow POST requests in . ([21068](https://github.com/WordPress/gutenberg/pull/21068)) + +### Bug Fixes + +- Fix inserter expecting experimental settings to exist in the context. ([24554](https://github.com/WordPress/gutenberg/pull/24554)) +- Fix Image block caption jumps on Safari. ([24540](https://github.com/WordPress/gutenberg/pull/24540)) +- Fix Media Text block: Always show images on top on mobile. ([24468](https://github.com/WordPress/gutenberg/pull/24468)) +- Hide Preview menu on small viewports. ([24537](https://github.com/WordPress/gutenberg/pull/24537)) +- Fix canInsertBlockType selector returning true for blocks that don’t allow inner blocks. ([24514](https://github.com/WordPress/gutenberg/pull/24514)) +- Fix the huge font size on the editor when using the default font sizes presets. ([24492](https://github.com/WordPress/gutenberg/pull/24492)) +- Fix Cover block: Impossible to reset the minimum height value. ([24490](https://github.com/WordPress/gutenberg/pull/24490)) +- Fix Post preview button only appearing on small screens. ([24487](https://github.com/WordPress/gutenberg/pull/24487)) +- Fix deduplication of style rules for server-side block support flags. ([24486](https://github.com/WordPress/gutenberg/pull/24486)) +- Fix the quick inserter results limit for block variations. ([24481](https://github.com/WordPress/gutenberg/pull/24481)) +- Fix tiny editor preview when using Mobile or Tablet options with metaboxes enabled. ([24478](https://github.com/WordPress/gutenberg/pull/24478)) +- Fix custom gradient picker unable to change predefined gradients with hex colors. ([24470](https://github.com/WordPress/gutenberg/pull/24470)) +- Fixing duplicated wp-block classes in block-list. ([24466](https://github.com/WordPress/gutenberg/pull/24466)) +- A11y: + - Make the inserter behave as a popover. ([24429](https://github.com/WordPress/gutenberg/pull/24429)) + - Fix incorrect aria description in the Block List View. ([24533](https://github.com/WordPress/gutenberg/pull/24533)) + - Add arrow navigation in Preview menu. ([24465](https://github.com/WordPress/gutenberg/pull/24465)) + - Add arrow navigation to Warning dropdown menu. ([24333](https://github.com/WordPress/gutenberg/pull/24333)) + - Add an example to the buttons block to avoid focus loss issue. ([24434](https://github.com/WordPress/gutenberg/pull/24434)) +- Fix rendering non-Latin characters on aligned Cover blocks. ([24447](https://github.com/WordPress/gutenberg/pull/24447)) +- Remove --wp-admin-theme-color reference from frontend styles. ([24436](https://github.com/WordPress/gutenberg/pull/24436)) +- Prevent links from being focusable inside the Disabled component. ([24397](https://github.com/WordPress/gutenberg/pull/24397)) +- Image Editing: Fix alignment of aspect-ratio button. ([24343](https://github.com/WordPress/gutenberg/pull/24343)) +- Fix retrying of post-processing of edited images. ([24081](https://github.com/WordPress/gutenberg/pull/24081)) +- Set error state when there is an upload error in during file upload. ([24017](https://github.com/WordPress/gutenberg/pull/24017)) +- Block Directory: Decode entities in block title & description. ([24172](https://github.com/WordPress/gutenberg/pull/24172)) +- Preview menu: Remove redundant “opens in a new tab” hidden text. ([24427](https://github.com/WordPress/gutenberg/pull/24427)) +- Fix uploading PDFs in the File block. ([24318](https://github.com/WordPress/gutenberg/pull/24318)) + +### Experiments + +- InnerBlocks: Introduce prop to specify render callback for each block. ([24232](https://github.com/WordPress/gutenberg/pull/24232)) +- Navigation: + - Display children of inner block controllers in the block navigator. ([24083](https://github.com/WordPress/gutenberg/pull/24083)) + - Add font-size support to the the Navigation block. ([24531](https://github.com/WordPress/gutenberg/pull/24531)) +- Template Parts and saving flow: + - Move the title to the block toolbar. ([24450](https://github.com/WordPress/gutenberg/pull/24450)) + - Fix Template Part renaming error. ([24500](https://github.com/WordPress/gutenberg/pull/24500)) + - Fix Site Title Save Bug. ([24302](https://github.com/WordPress/gutenberg/pull/24302)) +- Post Blocks: + - Post Tags block: Fix bug where no tags are rendered. ([24082](https://github.com/WordPress/gutenberg/pull/24082)) + - Post Tags block: Support color, font-size and line-height customization. ([24069](https://github.com/WordPress/gutenberg/pull/24069)) +- Full Site Editing: + - Load php files only if experiment is enabled. ([24182](https://github.com/WordPress/gutenberg/pull/24182)) +- Global Styles: + - Consider any user changes to global styles as publishable. ([24293](https://github.com/WordPress/gutenberg/pull/24293)) + - Add support for more style properties in the global context. ([24298](https://github.com/WordPress/gutenberg/pull/24298)) +- Widgets screen: + - Refactor the widgets screen to rely on dedicated endpoints. ([24290](https://github.com/WordPress/gutenberg/pull/24290)) + - Make the list of widgets excluded from the legacy widget block extensible via a filter. ([24271](https://github.com/WordPress/gutenberg/pull/24271)) + +### Documentation + +- Add undocumented global styles blocks & properties. ([24421](https://github.com/WordPress/gutenberg/pull/24421)) +- Remove “experimental” from title of editor filters. ([24382](https://github.com/WordPress/gutenberg/pull/24382)) +- Add instructions for disabling the Block Directory. ([24357](https://github.com/WordPress/gutenberg/pull/24357)) +- Remove duplicate questions in FAQ. ([24355](https://github.com/WordPress/gutenberg/pull/24355)) +- Indicate custom-fields support is required for registering meta. ([24325](https://github.com/WordPress/gutenberg/pull/24325)) +- Add block directory submission guidelines. ([23545](https://github.com/WordPress/gutenberg/pull/23545)) +- Typos and tweaks: ([24511](https://github.com/WordPress/gutenberg/pull/24511)) (24244) (24491) (24361) (24340) +- Update the “Create a Block” Tutorial. ([24545](https://github.com/WordPress/gutenberg/pull/24545)) +- Getting started: Add a MAMP section. ([24241](https://github.com/WordPress/gutenberg/pull/24241)) + +### Code Quality + +- Refactor embed block to single block with block variations. ([24090](https://github.com/WordPress/gutenberg/pull/24090)) +- Upgrade React version to 16.13.1. ([21289](https://github.com/WordPress/gutenberg/pull/21289)) +- Update lodash to 4.17.19. ([24401](https://github.com/WordPress/gutenberg/pull/24401)) +- Register the block attributes server-side for blocks with support flags. ([24400](https://github.com/WordPress/gutenberg/pull/24400)) +- Refactor components as functional components: + - TimePicker. ([24348](https://github.com/WordPress/gutenberg/pull/24348)) + - PostTextEditor. ([23897](https://github.com/WordPress/gutenberg/pull/23897)) + - CalendarEdit. ([23072](https://github.com/WordPress/gutenberg/pull/23072)) +- Remove unnecessary selector from the PostTitle block. ([24418](https://github.com/WordPress/gutenberg/pull/24418)) +- Remove unnecessary ad-hoc class application for dynamic blocks. ([24223](https://github.com/WordPress/gutenberg/pull/24223)) + +### Build Tooling + +- Run wp-env start before PHP unit tests in package scripts. ([23797](https://github.com/WordPress/gutenberg/pull/23797)) +- Upgrade eslint-plugin-jsdoc to latest version. ([24586](https://github.com/WordPress/gutenberg/pull/24586)) +- Add full parameters for emulateNetworkConditions. ([24144](https://github.com/WordPress/gutenberg/pull/24144)) +- Add an end-to-end regression test for the “Browse All” inserter button. ([24396](https://github.com/WordPress/gutenberg/pull/24396)) + + += 8.7.1 = + +### Bug Fixes + + - Block Supports: Add missing UTF-8 conversion. + - File block: Fix upload pdf file using Upload button but can using Media Library link. + + += 8.7.0 = + +### Enhancements + +* Make "Attempt Block Recovery" the default option of block invalidation. ([24263](https://github.com/WordPress/gutenberg/pull/24263)) +* Add a block example to the Buttons block. ([24249](https://github.com/WordPress/gutenberg/pull/24249)) +* Make the padding for the nav block inserter content the same for all sides. ([24084](https://github.com/WordPress/gutenberg/pull/24084)) +* Improve margin within the media replace popover. ([24309](https://github.com/WordPress/gutenberg/pull/24309)) +* Move "Convert to regular blocks" button to the reusable block toolbar. ([24066](https://github.com/WordPress/gutenberg/pull/24066)) +* Consistently autosave edits. ([23962](https://github.com/WordPress/gutenberg/pull/23962)) +* Use Post Type label for Document tab in Settings Header. ([17311](https://github.com/WordPress/gutenberg/pull/17311)) +* Update the Group block description. ([24297](https://github.com/WordPress/gutenberg/pull/24297)) +* Remove bottom margin of components dropdown menu item. ([24227](https://github.com/WordPress/gutenberg/pull/24227)) +* Core Block Patterns improvements: + * Adds "Heading and paragraph" pattern. ([24143](https://github.com/WordPress/gutenberg/pull/24143)) + * Updates "Large header and a paragraph" pattern. ([24142](https://github.com/WordPress/gutenberg/pull/24142)) + * Updates the "Large header" pattern. ([24141](https://github.com/WordPress/gutenberg/pull/24141)) + * Updates the "Quote" pattern. ([24140](https://github.com/WordPress/gutenberg/pull/24140)) + * Updates "Two images" pattern. ([24139](https://github.com/WordPress/gutenberg/pull/24139)) ([23856](https://github.com/WordPress/gutenberg/pull/23856)) + * Updates "Three columns of text with buttons" pattern. ([24138](https://github.com/WordPress/gutenberg/pull/24138)) + * Updates "Three buttons" pattern. ([24137](https://github.com/WordPress/gutenberg/pull/24137)) + * Updates "Two buttons" pattern. ([24136](https://github.com/WordPress/gutenberg/pull/24136)) + * Updates '"wo columns of text" pattern. ([24135](https://github.com/WordPress/gutenberg/pull/24135)) + * Update "Two columns of text with images" pattern. ([24134](https://github.com/WordPress/gutenberg/pull/24134)) + * Update the "Large header and button" block pattern. ([24177](https://github.com/WordPress/gutenberg/pull/24177)) +* Block Directory: Use local assets with automatic asset detection. ([24117](https://github.com/WordPress/gutenberg/pull/24117)) + +### New APIs + +* Add support for delete operations to `@wordpress/core-data` entities. ([21557](https://github.com/WordPress/gutenberg/pull/21557)) +* Add server-side handling for the block 'align' supports flag. ([24122](https://github.com/WordPress/gutenberg/pull/24122)) +* Add isDestructive style to Button. ([22921](https://github.com/WordPress/gutenberg/pull/22921)) +* @wordpress/create-block: Enable loading translations for created blocks. ([24125](https://github.com/WordPress/gutenberg/pull/24125)) + +### Bug Fixes + +* Fix html mode for non light blocks. ([24335](https://github.com/WordPress/gutenberg/pull/24335)) +* Fix block movers overlapping. ([24349](https://github.com/WordPress/gutenberg/pull/24349)) +* Fix List RichText backward compatibility for multiline root tag. ([24324](https://github.com/WordPress/gutenberg/pull/24324)) +* Block patterns: Fix translatable strings. ([24317](https://github.com/WordPress/gutenberg/pull/24317)) +* Preserve the seconds when editing dates using the TimePicker component. ([24305](https://github.com/WordPress/gutenberg/pull/24305)) +* A11y: + * Announce block selection changes manually on windows. ([24299](https://github.com/WordPress/gutenberg/pull/24299)) + * Fix arrow navigation in the LinkControl suggestions. ([24222](https://github.com/WordPress/gutenberg/pull/24222)) + * Avoid focus style from being cut on the categories panel. ([24197](https://github.com/WordPress/gutenberg/pull/24197)) + * Avoid focusing the block selection button on each render. ([24195](https://github.com/WordPress/gutenberg/pull/24195)) + * Avoid rendering the clipboard textarea inside the button. ([24194](https://github.com/WordPress/gutenberg/pull/24194)) + * Fix missing focus outline in Add New Tag. ([24187](https://github.com/WordPress/gutenberg/pull/24187)) + * Fix dropdown menu focus loss when using arrow keys with Safari and Voiceover. ([24186](https://github.com/WordPress/gutenberg/pull/24186)) + * Fix the gallery buttons focus style. ([24157](https://github.com/WordPress/gutenberg/pull/24157)) + * Update the editor landmark regions. ([24196](https://github.com/WordPress/gutenberg/pull/24196)) + * Mover control: Remove drag cursor. ([23759](https://github.com/WordPress/gutenberg/pull/23759)) +* Fix block insertion place after clicking Browse All in the inline inserter. ([24285](https://github.com/WordPress/gutenberg/pull/24285)) +* Fix last.fm svg icon alignment. ([24278](https://github.com/WordPress/gutenberg/pull/24278)) +* Cover: Fix padding controls showing null units. ([24251](https://github.com/WordPress/gutenberg/pull/24251)) +* Consistently show the default style variation if none provided. ([24217](https://github.com/WordPress/gutenberg/pull/24217)) +* Fix gradient RGBA/HSLA inputs' width. ([24214](https://github.com/WordPress/gutenberg/pull/24214)) +* Popover: Fix arrow color to match content border color. ([24208](https://github.com/WordPress/gutenberg/pull/24208)) +* Fix dragging multiple blocks downwards resulted in blocks inserted in wrong position. ([24183](https://github.com/WordPress/gutenberg/pull/24183)) +* Fix Button block colors in the editor. ([24153](https://github.com/WordPress/gutenberg/pull/24153)) +* Fix the save shortcut in the code editor. ([24151](https://github.com/WordPress/gutenberg/pull/24151)) +* Fix PHP notices when a block hasn't declared 'supports'. ([24131](https://github.com/WordPress/gutenberg/pull/24131)) +* Fix Block Directory icons. ([24086](https://github.com/WordPress/gutenberg/pull/24086)) +* Block Breadcrumb: Fix arrow direction in RTL. ([24074](https://github.com/WordPress/gutenberg/pull/24074)) +* i18N: + * Fix missing plural forms for block related strings. ([24071](https://github.com/WordPress/gutenberg/pull/24071)) + * Merge similar translation strings in the RSS block. ([24159](https://github.com/WordPress/gutenberg/pull/24159)) + * Merge similar translation strings - tables. ([24169](https://github.com/WordPress/gutenberg/pull/24169)) +* useBlockSync: Fix race condition when onChange callback changes. ([24012](https://github.com/WordPress/gutenberg/pull/24012)) +* Allow enter to insert line breaks even if template is locked. ([23330](https://github.com/WordPress/gutenberg/pull/23330)) + +### Experiments + +* Full Site Editing and Site editor: + * Add alignment support to post content block. ([24014](https://github.com/WordPress/gutenberg/pull/24014)) ([24077](https://github.com/WordPress/gutenberg/pull/24077)) + * Post Title Block: Add style attributes. ([24246](https://github.com/WordPress/gutenberg/pull/24246)) + * Remove more initial PHP state. ([23775](https://github.com/WordPress/gutenberg/pull/23775)) + * Template Part: Improve title editing interactions. ([23661](https://github.com/WordPress/gutenberg/pull/23661)) + * Update the Post author, Excerpt and Comment blocks to use lightBlockWrapper. ([24253](https://github.com/WordPress/gutenberg/pull/24253)) + * Query blocks: Support wide alignments in the editor. ([24229](https://github.com/WordPress/gutenberg/pull/24229)) + * Post Comments Block: add block alignment support. ([24226](https://github.com/WordPress/gutenberg/pull/24226)) + * Post Excerpt block: Added icon and description to Post Excerpt block. ([24203](https://github.com/WordPress/gutenberg/pull/24203)) + * Post Date block: Added Post Date icon and updated block with icon and desc. ([24178](https://github.com/WordPress/gutenberg/pull/24178)) ([24225](https://github.com/WordPress/gutenberg/pull/24225)) + * Post Author block: Added a description. ([24171](https://github.com/WordPress/gutenberg/pull/24171)) + * Post Comments Counts: Add style attributes. ([24167](https://github.com/WordPress/gutenberg/pull/24167)) + * Post Comments Form: Add style attributes. ([24162](https://github.com/WordPress/gutenberg/pull/24162)) + * Post Author and Post Excerpt: change editor selector class. ([24104](https://github.com/WordPress/gutenberg/pull/24104)) + * Post Comments block: add style supports for text and background settings. ([24080](https://github.com/WordPress/gutenberg/pull/24080)) + * Post excerpt block: Add color, fontSize, lineHeight, and text alignment. ([23945](https://github.com/WordPress/gutenberg/pull/23945)) + * Add Post Tags block description and icon. ([23496](https://github.com/WordPress/gutenberg/pull/23496)) + * Add a description to the Post Title block. ([23494](https://github.com/WordPress/gutenberg/pull/23494)) + * Update Post Author block to use __experimentalColor and __experimentalLineHeight. ([23044](https://github.com/WordPress/gutenberg/pull/23044)) + +* Global styles: + * Fix link color style property name in global styles. ([24296](https://github.com/WordPress/gutenberg/pull/24296)) + * Fix merge algorithm. ([24294](https://github.com/WordPress/gutenberg/pull/24294)) +* Navigation Block and screen: + * Fix Navigation Block submenu being overlapped by Cover block overlay. ([24062](https://github.com/WordPress/gutenberg/pull/24062)) +* APIs: + * Add initial support for themes to control the editor. ([24275](https://github.com/WordPress/gutenberg/pull/24275)) + * Prefix useSimulatedMediaQuery __experimental. ([24279](https://github.com/WordPress/gutenberg/pull/24279)) + * URLInput Customizable control rendering. ([24115](https://github.com/WordPress/gutenberg/pull/24115)) + +### Documentation + +* Update Gutenberg FAQ with more recent information. ([24202](https://github.com/WordPress/gutenberg/pull/24202)) +* Clarify custom link color documentation for themes. ([24056](https://github.com/WordPress/gutenberg/pull/24056)) +* Add a link to the WordPress Data guide. ([24327](https://github.com/WordPress/gutenberg/pull/24327)) +* Document the new block tools theme support and core block patterns. ([24265](https://github.com/WordPress/gutenberg/pull/24265)) +* Replace the demo link of the Gutenberg Storybook in the documentation. ([24212](https://github.com/WordPress/gutenberg/pull/24212)) +* Docs: Update default values for Popover props 'noArrow' and 'position'. ([24207](https://github.com/WordPress/gutenberg/pull/24207)) +* Added missing documentation link for contributor handbook. ([24179](https://github.com/WordPress/gutenberg/pull/24179)) +* Docs: Convert Block Registration RFC to the Block Metadata document. ([23832](https://github.com/WordPress/gutenberg/pull/23832)) +* Typos and tweaks: ([23899](https://github.com/WordPress/gutenberg/pull/23899)) ([24057](https://github.com/WordPress/gutenberg/pull/24057)) ([24033](https://github.com/WordPress/gutenberg/pull/24033)) ([24211](https://github.com/WordPress/gutenberg/pull/24211)) ([24100](https://github.com/WordPress/gutenberg/pull/24100)) + +### Code Quality + +* Improve rootClientId comparison in useBlockDropZone. ([24307](https://github.com/WordPress/gutenberg/pull/24307)) +* Clarify wp.blocks.createBlock error message. ([24287](https://github.com/WordPress/gutenberg/pull/24287)) +* Convert blocks to function component with hooks: + * BlockInvalidWarning. ([24284](https://github.com/WordPress/gutenberg/pull/24284)) + * ReusableBlockConvertButton. ([24015](https://github.com/WordPress/gutenberg/pull/24015)) +* Add missing prop to `WPBlockVariation` type definition. ([24110](https://github.com/WordPress/gutenberg/pull/24110)) +* Remove deprecated blockType.context support. ([24155](https://github.com/WordPress/gutenberg/pull/24155)) +* Wrap LinkControlSearchInput in forwardRef. ([24119](https://github.com/WordPress/gutenberg/pull/24119)) + +### Build Tooling + +* Perf Tests: Set up branch only once for all test suites. ([24123](https://github.com/WordPress/gutenberg/pull/24123)) +* Revert "Build: Use `.min.js` suffix for bundled JavaScript". ([24239](https://github.com/WordPress/gutenberg/pull/24239)) +* Add a Git Diff to the output of the static checks job on failure. ([24154](https://github.com/WordPress/gutenberg/pull/24154)) + +### Various + +* Fix intermittent Navigation block test failure. ([24146](https://github.com/WordPress/gutenberg/pull/24146)) + + += 8.6.1 = + +### Bug Fixes: + + - Fix the plugin translations. + + += 8.6.0 = + +### Features + +* Cover Block: Add video position controls. ([22531](https://github.com/WordPress/gutenberg/pull/22531)) +* Block pattern updates: _Large header and paragraph,_ _Large header,_ _Text two columns,_ _Three buttons,_ _Two buttons,_ _Quote._ ([23858](https://github.com/WordPress/gutenberg/pull/23858)) ([23857](https://github.com/WordPress/gutenberg/pull/23857)) ([23853](https://github.com/WordPress/gutenberg/pull/23853)) ([23849](https://github.com/WordPress/gutenberg/pull/23849)) ([23848](https://github.com/WordPress/gutenberg/pull/23848)) ([23881](https://github.com/WordPress/gutenberg/pull/23881)) + +### Enhancements + +* Editor: Display Site Icon (if one is set) in full-screen mode. ([22952](https://github.com/WordPress/gutenberg/pull/22952)) +* Block Variations: Add support for finding variations using keywords. ([24040](https://github.com/WordPress/gutenberg/pull/24040)) +* a11y: Fix radio control in Windows High Contrast mode. ([23706](https://github.com/WordPress/gutenberg/pull/23706)) +* Classic Block: Move the "convert to blocks" option from menu to own toolbar button. ([23704](https://github.com/WordPress/gutenberg/pull/23704)) +* a11y: Use composite pattern to improve keyboard navigation on the inserter. ([23610](https://github.com/WordPress/gutenberg/pull/23610)) +* Date: Add timezone hint to post-scheduling UI. ([23400](https://github.com/WordPress/gutenberg/pull/23400)) +* Panel: Improve scroll view handling when expanding. ([23327](https://github.com/WordPress/gutenberg/pull/23327)) ([24046](https://github.com/WordPress/gutenberg/pull/24046)) + +### New APIs + +* Support disabling core block patterns. ([24042](https://github.com/WordPress/gutenberg/pull/24042)) +* Make the line height and custom units theme support flags consistent and opt-in. ([23964](https://github.com/WordPress/gutenberg/pull/23964)) ([23904](https://github.com/WordPress/gutenberg/pull/23904)) +* Image: Add the ability for a plugin to disable Image Editor. ([23966](https://github.com/WordPress/gutenberg/pull/23966)) + +### Experiments + +* Site Builder: + * Change references to section back to template part. ([23765](https://github.com/WordPress/gutenberg/pull/23765)) + * Post Date Block: Add style attributes and restructure the edit function. ([23931](https://github.com/WordPress/gutenberg/pull/23931)) + * Edit Site: Integrate quick inserter. ([23516](https://github.com/WordPress/gutenberg/pull/23516)) +* Navigation screen and blocks: + * Try: Customizable toolbar contents. ([23613](https://github.com/WordPress/gutenberg/pull/23613)) + * Navigation screen: Restore block movers for blocks with just one sibling. ([23680](https://github.com/WordPress/gutenberg/pull/23680)) + * Navigation screen: Add error boundary to experimental navigation screen. ([23679](https://github.com/WordPress/gutenberg/pull/23679)) + * Navigation screen: Show block appender by default. ([23676](https://github.com/WordPress/gutenberg/pull/23676)) + * Block Navigation: Use quick inserter. ([23737](https://github.com/WordPress/gutenberg/pull/23737)) + * Navigation screen: Add .editor-styles-wrapper. ([23736](https://github.com/WordPress/gutenberg/pull/23736)) +* Fix Inserter on the widgets screen. ([24045](https://github.com/WordPress/gutenberg/pull/24045)) + +### Bug Fixes + +* Prevent JavaScript error when using arrow navigation in URLInput. ([24047](https://github.com/WordPress/gutenberg/pull/24047)) +* a11y: Components: Fix Toolbar arrow key navigation in RTL contexts. ([24043](https://github.com/WordPress/gutenberg/pull/24043)) +* RichText: Restore aria-multiline. ([24041](https://github.com/WordPress/gutenberg/pull/24041)) +* a11y: Fix Copy block button focus loss and try to remove the visually hidden textarea. ([24022](https://github.com/WordPress/gutenberg/pull/24022)) +* Block Patterns: Override patterns that were registered by Core. ([24004](https://github.com/WordPress/gutenberg/pull/24004)) +* Fix block wrapper selector. ([23991](https://github.com/WordPress/gutenberg/pull/23991)) +* Fix block icon mouse-out gesture issue. ([23980](https://github.com/WordPress/gutenberg/pull/23980)) +* Fix components utils export for use-update-effect. ([23969](https://github.com/WordPress/gutenberg/pull/23969)) +* a11y: Persist tooltips on hover. ([23959](https://github.com/WordPress/gutenberg/pull/23959)) +* Fix blocks dropping to incorrect position in inner block lists. ([23950](https://github.com/WordPress/gutenberg/pull/23950)) +* RangeControl: Adapt slider color to color scheme. ([23936](https://github.com/WordPress/gutenberg/pull/23936)) + * (JS) Color Values: Rename brand to theme. Add fallback values. ([24059](https://github.com/WordPress/gutenberg/pull/24059)) +* Prevent content loss after refreshing an editor with unsaved auto-draft post. ([23928](https://github.com/WordPress/gutenberg/pull/23928)) +* Fix edited Classic block's content deletion when switching to Code editor. ([23927](https://github.com/WordPress/gutenberg/pull/23927)) +* Fix drag and drop to empty block lists. ([23923](https://github.com/WordPress/gutenberg/pull/23923)) +* Fix drag and drop for aligned blocks. ([23916](https://github.com/WordPress/gutenberg/pull/23916)) +* Fix comment capitalization/punctuation. ([23912](https://github.com/WordPress/gutenberg/pull/23912)) +* Fix block merging regression. ([23901](https://github.com/WordPress/gutenberg/pull/23901)) +* Inserter: Order quick inserter items by frecency. ([23900](https://github.com/WordPress/gutenberg/pull/23900)) +* Inserter: Set quick inserter content width to 100% on screens below 782px. ([23896](https://github.com/WordPress/gutenberg/pull/23896)) +* Autocomplete: Fix closing slash inserter with ESC. ([23859](https://github.com/WordPress/gutenberg/pull/23859)) +* Inserter: Hide inserter's block preview when searching. ([23827](https://github.com/WordPress/gutenberg/pull/23827)) +* apiFetch: Fix fetch-all preloading. ([23807](https://github.com/WordPress/gutenberg/pull/23807)) +* Fix error triggered when a tab is removed from TabPanel component. ([23784](https://github.com/WordPress/gutenberg/pull/23784)) +* Fix block movers in navigator on experimental navigation page displaying horizontally. ([23779](https://github.com/WordPress/gutenberg/pull/23779)) +* Search: Fix attribute defaults. ([23777](https://github.com/WordPress/gutenberg/pull/23777)) +* Apply the reset mixin to the inserter panel. ([23744](https://github.com/WordPress/gutenberg/pull/23744)) +* Sidebar controls: Add more space for German and other locales. ([23738](https://github.com/WordPress/gutenberg/pull/23738)) +* Block Library: Standardize post block placeholders. ([23690](https://github.com/WordPress/gutenberg/pull/23690)) + * i18n: Block Library: Translate post block placeholders. ([23774](https://github.com/WordPress/gutenberg/pull/23774)) +* Fix issue where block inserted in wrong place when selection is in nested block list, but root appender is used. ([23668](https://github.com/WordPress/gutenberg/pull/23668)) +* Fix an issue where dragging while the page has no scrollbar results in a console error. ([23666](https://github.com/WordPress/gutenberg/pull/23666)) +* Updated styling to match the post editor. ([23525](https://github.com/WordPress/gutenberg/pull/23525)) +* UnitControl: Fix internal unit parsing to handle incoming unit prop. ([23521](https://github.com/WordPress/gutenberg/pull/23521)) +* Table block: Fix focus loss in between row/column insertions. ([23508](https://github.com/WordPress/gutenberg/pull/23508)) +* Editor: Fix block highlight rendering after block is moved. ([23425](https://github.com/WordPress/gutenberg/pull/23425)) +* Inserter: Fix line to show again. ([20792](https://github.com/WordPress/gutenberg/pull/20792)) +* Button: Properly handle border radius reset. ([23887](https://github.com/WordPress/gutenberg/pull/23887)) +* Block Directory: Remove "contact admin" messaging. ([23948](https://github.com/WordPress/gutenberg/pull/23948)) + +### Performance + +* Optimize more selector calls. ([23930](https://github.com/WordPress/gutenberg/pull/23930)) +* Performance testing: Cover Site Editor loading time. ([23842](https://github.com/WordPress/gutenberg/pull/23842)) +* Avoid re-rendering the PostSavedState component on each change. ([23829](https://github.com/WordPress/gutenberg/pull/23829)) +* Small performance tweaks. ([23825](https://github.com/WordPress/gutenberg/pull/23825)) +* Env: Only perform expensive install work when required. ([23809](https://github.com/WordPress/gutenberg/pull/23809)) +* Env: Improve install performance. ([23806](https://github.com/WordPress/gutenberg/pull/23806)) + +### Documentation + +* Expand and update block-based themes documentation page. ([23750](https://github.com/WordPress/gutenberg/pull/23750)) +* Docs/update button component props. ([24013](https://github.com/WordPress/gutenberg/pull/24013)) +* Docs: Update plugin FAQ with versions link. ([24005](https://github.com/WordPress/gutenberg/pull/24005)) +* Remove the experimental flag from the block patterns documentation. ([23954](https://github.com/WordPress/gutenberg/pull/23954)) +* Docs: Add links for Create a Block Tutorial. ([23946](https://github.com/WordPress/gutenberg/pull/23946)) +* Adds basic documentation for the ToolbarButton component. ([23909](https://github.com/WordPress/gutenberg/pull/23909)) +* Docs: Title and markdown formatting for table. ([23850](https://github.com/WordPress/gutenberg/pull/23850)) +* Update documentation contributors guide. ([23840](https://github.com/WordPress/gutenberg/pull/23840)) +* Create new page listing Gutenberg releases in each WordPress version. ([23773](https://github.com/WordPress/gutenberg/pull/23773)) +* Docs: Clarify the interactive mode for create-block. ([23752](https://github.com/WordPress/gutenberg/pull/23752)) +* Docs: Add a tutorial on how to create a block-based theme. ([23732](https://github.com/WordPress/gutenberg/pull/23732)) +* Docs: Move ESNext to JavaScript tutorial. ([23725](https://github.com/WordPress/gutenberg/pull/23725)) +* Docs: Move DevEnv to own section for documentation. ([23593](https://github.com/WordPress/gutenberg/pull/23593)) +* Added readme to matrix alignment toolbar. ([23341](https://github.com/WordPress/gutenberg/pull/23341)) +* Update nested-blocks-inner-blocks.md. ([23935](https://github.com/WordPress/gutenberg/pull/23935)) +* Update block-registration.md. ([23933](https://github.com/WordPress/gutenberg/pull/23933)) +* Link to theme-experiments repo in block-based theme documentation. ([23748](https://github.com/WordPress/gutenberg/pull/23748)) +* Docs: Update device-tests readme with monorepo commands. ([23630](https://github.com/WordPress/gutenberg/pull/23630)) + +### Code Quality + +* Refactor URLPopover to use React Hook. ([23918](https://github.com/WordPress/gutenberg/pull/23918)) +* Refactor Disabled component to use React Hooks. ([23917](https://github.com/WordPress/gutenberg/pull/23917)) +* Refactor More block. ([23758](https://github.com/WordPress/gutenberg/pull/23758)) +* Remove navigation block styles. ([23678](https://github.com/WordPress/gutenberg/pull/23678)) +* Refactor MediaPlaceholder to function component. ([23671](https://github.com/WordPress/gutenberg/pull/23671)) +* Remove duplicate selectors. ([23466](https://github.com/WordPress/gutenberg/pull/23466)) +* Refactor Tag Cloud block to use React Hooks. ([23426](https://github.com/WordPress/gutenberg/pull/23426)) +* Convert PostSavedState to functional component. ([23038](https://github.com/WordPress/gutenberg/pull/23038)) +* Types: Improve project setup. ([21581](https://github.com/WordPress/gutenberg/pull/21581)) +* Refactor ReusableBlockEditPanel to use hooks (and add type info). ([21181](https://github.com/WordPress/gutenberg/pull/21181)) +* Updates text, buttons colors and labels. ([23855](https://github.com/WordPress/gutenberg/pull/23855)) + +### Build Tooling + +* Env: + * Allow wp-env to start without configuration. ([23913](https://github.com/WordPress/gutenberg/pull/23913)) + * Add support for different options in each environment. ([22568](https://github.com/WordPress/gutenberg/pull/22568)) +* Build: Use `.min.js` suffix for bundled JavaScript. ([23926](https://github.com/WordPress/gutenberg/pull/23926)) + +* Try running the performance tests as a GitHub action. ([23818](https://github.com/WordPress/gutenberg/pull/23818)) +* Improve the performance tests setup. ([23817](https://github.com/WordPress/gutenberg/pull/23817)) +* Automation: + * Limit tests to not run on documentation-only changes. ([23834](https://github.com/WordPress/gutenberg/pull/23834)) + * Add paths-ignore **.md for unit tests checks. ([23845](https://github.com/WordPress/gutenberg/pull/23845)) + * Switch workflows to use paths-ignore and **.md. ([23843](https://github.com/WordPress/gutenberg/pull/23843)) + +Fix action GitHub action workflow YAML syntax errors. ([23844](https://github.com/WordPress/gutenberg/pull/23844)) + +### Various + +* Embeds: Remove unsupported core-embed/hulu block. ([23984](https://github.com/WordPress/gutenberg/pull/23984)) +* E2E: Remove duplicate blocks in setup file. ([23981](https://github.com/WordPress/gutenberg/pull/23981)) +* REST API: Check for WP5.5 and skip registering routes. ([23880](https://github.com/WordPress/gutenberg/pull/23880)) +* LinkControl: Extract reusable parts. ([23869](https://github.com/WordPress/gutenberg/pull/23869)) +* Updates image size to match columns width. ([23854](https://github.com/WordPress/gutenberg/pull/23854)) +* InputControl: Add prefix prop. ([23824](https://github.com/WordPress/gutenberg/pull/23824)) +* Block Navigation: Change the visible labels for "Block navigation" to "List view". ([23796](https://github.com/WordPress/gutenberg/pull/23796)) +* Site Tagline Block. ([23788](https://github.com/WordPress/gutenberg/pull/23788)) +* Image Editor: When editing, pass the edited image src. ([23703](https://github.com/WordPress/gutenberg/pull/23703)) +* Replace SEO settings nofollow toggle with rel text widget. ([23682](https://github.com/WordPress/gutenberg/pull/23682)) +* Use global registry on the experimental navigation screen. ([23675](https://github.com/WordPress/gutenberg/pull/23675)) +* Env: Mark breaking change in changelog. ([23776](https://github.com/WordPress/gutenberg/pull/23776)) +* Cancel previous running workflows when a new commit is made. ([23587](https://github.com/WordPress/gutenberg/pull/23587)) +* Add title to image and video selection sheets. ([23083](https://github.com/WordPress/gutenberg/pull/23083)) +* Site Title: Add support settings for colors, fonts, and line height. ([23007](https://github.com/WordPress/gutenberg/pull/23007)) +* Add fix to make inputs of type email return true from isTextField. ([21162](https://github.com/WordPress/gutenberg/pull/21162)) +* Full Site Editing: Add a Site Logo block. ([18811](https://github.com/WordPress/gutenberg/pull/18811)) + + += 8.5.1 = + +### Bug Fixes + + - Improve the performance of the Site builder page. + - Load external images if local images not present. + + += 8.5.0 = + +### Features + +* A11y: Add an option to keep the caret inside blocks in edit mode. ([23546](https://github.com/WordPress/gutenberg/pull/23546)) +* Add anchor/id support to all static blocks. ([23197](https://github.com/WordPress/gutenberg/pull/23197)) + +### Enhancements + +* Add an edit button to the gallery images. ([23554](https://github.com/WordPress/gutenberg/pull/23554)) +* Image block: Allow uploading external image if image host allows it. ([23565](https://github.com/WordPress/gutenberg/pull/23565)) +* Drag And Drop: + * Enable for multi selection. ([23477](https://github.com/WordPress/gutenberg/pull/23477)) + * Improve the drag and scroll behavior. ([23082](https://github.com/WordPress/gutenberg/pull/23082)) ([23448](https://github.com/WordPress/gutenberg/pull/23448)) + * Don't show a cloned block while dragging. ([23024](https://github.com/WordPress/gutenberg/pull/23024)) + * Polish the block drag chip. ([23609](https://github.com/WordPress/gutenberg/pull/23609)) +* Image editing: + * Move zoom control to toolbar dropdown. ([23677](https://github.com/WordPress/gutenberg/pull/23677)) + * Add original aspect to dropdown. ([23659](https://github.com/WordPress/gutenberg/pull/23659)) + * Add filter to REST API image edit. ([23539](https://github.com/WordPress/gutenberg/pull/23539)) + * Polish zoom slider. ([23418](https://github.com/WordPress/gutenberg/pull/23418)) + * Add permission checks to the endpoint. ([23423](https://github.com/WordPress/gutenberg/pull/23423)) +* Block Directory: + * Return inactive plugins in search results. ([23688](https://github.com/WordPress/gutenberg/pull/23688)) + * Use CDN for block directory assets. ([23499](https://github.com/WordPress/gutenberg/pull/23499)) +* Add line height rule to the post title. ([23656](https://github.com/WordPress/gutenberg/pull/23656)) +* Avoid ordering block types per frecency inside block categories. ([23643](https://github.com/WordPress/gutenberg/pull/23643)) +* Polish the document sidebar controls. ([23578](https://github.com/WordPress/gutenberg/pull/23578)) +* Add modern color scheme support. ([23558](https://github.com/WordPress/gutenberg/pull/23558)) +* Use a consistent close icon across the UI. ([23551](https://github.com/WordPress/gutenberg/pull/23551)) +* Redesign the transform menu. ([23028](https://github.com/WordPress/gutenberg/pull/23028)) ([23449](https://github.com/WordPress/gutenberg/pull/23449)) +* Redesign the canvas inserter. ([22789](https://github.com/WordPress/gutenberg/pull/22789)) +* Unify tooltip styles. ([23382](https://github.com/WordPress/gutenberg/pull/23382)) +* Add block variations to the slash inserter. ([23364](https://github.com/WordPress/gutenberg/pull/23364)) +* Hide the most used blocks by default and add an option to enable it. ([23358](https://github.com/WordPress/gutenberg/pull/23358)) +* Add reusable block tab to inserter. ([23296](https://github.com/WordPress/gutenberg/pull/23296)) +* Add keyboard shortcuts for moving blocks. ([23276](https://github.com/WordPress/gutenberg/pull/23276)) +* Cover block: Don't show the matrix alignment button when no background set. ([23196](https://github.com/WordPress/gutenberg/pull/23196)) +* Spacer: Show tooltip with height value on resize. ([23077](https://github.com/WordPress/gutenberg/pull/23077)) +* Improve post publish buttons alignment. ([22390](https://github.com/WordPress/gutenberg/pull/22390)) ([23487](https://github.com/WordPress/gutenberg/pull/23487)) +* Make Preview and Save Draft buttons use the same style. ([21192](https://github.com/WordPress/gutenberg/pull/21192)) +* Add unlink URL to buttons block. ([23445](https://github.com/WordPress/gutenberg/pull/23445)) +* Clean the patterns list to include in core. ([23608](https://github.com/WordPress/gutenberg/pull/23608)) +* Add pullquote block tranformations. ([23562](https://github.com/WordPress/gutenberg/pull/23562)) +* Remove block label from child block appender. ([23393](https://github.com/WordPress/gutenberg/pull/23393)) +* A11y: Move blocks between levels using keyboard. ([22453](https://github.com/WordPress/gutenberg/pull/22453)) + +### New APIs + +* Support **orientation** prop in InnerBlocks. ([23416](https://github.com/WordPress/gutenberg/pull/23416)) +* Support a flexible **useItems** API for the autocompleters API. ([22853](https://github.com/WordPress/gutenberg/pull/22853)) ([23385](https://github.com/WordPress/gutenberg/pull/23385)) +* Stabilize the image editing REST API endpoint. ([23536](https://github.com/WordPress/gutenberg/pull/23536)) +* Stabilize the block directory REST API endpoint. ([23528](https://github.com/WordPress/gutenberg/pull/23528)) +* Add descriptions to Block patterns. ([23070](https://github.com/WordPress/gutenberg/pull/23070)) + +### Experiments + +* Site Builder: + * Remove the button block appender. ([23436](https://github.com/WordPress/gutenberg/pull/23436)) + * Improve the template parts insertion flow. ([23295](https://github.com/WordPress/gutenberg/pull/23295)) + * Fix template part resolution for edited files. ([23591](https://github.com/WordPress/gutenberg/pull/23591)) + * Fix inspector panels buttons. ([23464](https://github.com/WordPress/gutenberg/pull/23464)) + * Add template part block keyword. ([23623](https://github.com/WordPress/gutenberg/pull/23623)) + * Allow wide alignment. ([23488](https://github.com/WordPress/gutenberg/pull/23488)) + * Remove templateIds state. ([22893](https://github.com/WordPress/gutenberg/pull/22893)) +* Navigation screen and block: + * Fix saving issues. ([23559](https://github.com/WordPress/gutenberg/pull/23559)) + * A11y: Improve keyboard navigation on the Navigation block toolbar. ([23281](https://github.com/WordPress/gutenberg/pull/23281)) + * Fix text size no longer overwritten. ([23360](https://github.com/WordPress/gutenberg/pull/23360)) + * Adjust Navigation block submenu padding and spacing. ([23380](https://github.com/WordPress/gutenberg/pull/23380)) + * Update placeholder label. ([23297](https://github.com/WordPress/gutenberg/pull/23297)) + * Hide the block toolbar on the navigation screen. ([23021](https://github.com/WordPress/gutenberg/pull/23021)) + * Allow setting up menus that auto add new pages. ([22697](https://github.com/WordPress/gutenberg/pull/22697)) + * Allow Search block to be added alongside links. ([22656](https://github.com/WordPress/gutenberg/pull/22656)) + +### Bug Fixes + +* Block Directory: + * Support .svg extension for results icons. ([23442](https://github.com/WordPress/gutenberg/pull/23442)) + * Throw error if we have an issue registering blocks. ([23439](https://github.com/WordPress/gutenberg/pull/23439)) + * Remove the overflow on the Add button. ([23409](https://github.com/WordPress/gutenberg/pull/23409)) + * Fix double border in block list. ([23625](https://github.com/WordPress/gutenberg/pull/23625)) +* Fix the upload icon size. ([23553](https://github.com/WordPress/gutenberg/pull/23553)) +* Allow scrolling over Popovers. ([23696](https://github.com/WordPress/gutenberg/pull/23696)) +* Fix quote left border color in dark mode. ([23692](https://github.com/WordPress/gutenberg/pull/23692)) +* Fix empty block list appender visibility on aligned blocks. ([23672](https://github.com/WordPress/gutenberg/pull/23672)) +* Fix horizontal Block Mover Layout. ([23640](https://github.com/WordPress/gutenberg/pull/23640)) +* Fix invisible drop target indicator. ([23638](https://github.com/WordPress/gutenberg/pull/23638)) +* Rich text: Fix soft line break in caption on enter. ([23622](https://github.com/WordPress/gutenberg/pull/23622)) +* Fix clicking Gallery items buttons on Safari. ([23586](https://github.com/WordPress/gutenberg/pull/23586)) +* Hide block list appender in a reusable block if it's not being edited. ([23584](https://github.com/WordPress/gutenberg/pull/23584)) +* Revert "Remove the style CSS class when the default style variation is chosen". ([23548](https://github.com/WordPress/gutenberg/pull/23548)) +* Classic block: + * Add height: Auto to content wrapper. ([23547](https://github.com/WordPress/gutenberg/pull/23547)) + * Add scroll to last edit position. ([23544](https://github.com/WordPress/gutenberg/pull/23544)) + * Adjust placement of the toolbar. ([23438](https://github.com/WordPress/gutenberg/pull/23438)) + * Prevent content loss by regularly dispatching changes. ([23408](https://github.com/WordPress/gutenberg/pull/23408)) + * Fix undo keyboard shortcut. ([23376](https://github.com/WordPress/gutenberg/pull/23376)) +* Fix the Gallery images buttons rendering. ([23471](https://github.com/WordPress/gutenberg/pull/23471)) +* Fix Post title top margin. ([23447](https://github.com/WordPress/gutenberg/pull/23447)) +* Fix file names generation for edited image files. ([23440](https://github.com/WordPress/gutenberg/pull/23440)) +* Fix React warning when cropping imùges. ([23432](https://github.com/WordPress/gutenberg/pull/23432)) +* Polish block moving animation. ([23401](https://github.com/WordPress/gutenberg/pull/23401)) ([22640](https://github.com/WordPress/gutenberg/pull/22640)) +* Fix small RTL regression in Buttons block. ([23390](https://github.com/WordPress/gutenberg/pull/23390)) +* Fix centered legacy button. ([23381](https://github.com/WordPress/gutenberg/pull/23381)) +* Fix React warning while unmounting slots. ([23365](https://github.com/WordPress/gutenberg/pull/23365)) +* Don't show the "Move to trash" action if the user is not allowed to delete posts. ([23174](https://github.com/WordPress/gutenberg/pull/23174)) +* add inline font-sizes and colors to the editor for themes that don't enqueue the preset classes. ([22356](https://github.com/WordPress/gutenberg/pull/22356)) ([22668](https://github.com/WordPress/gutenberg/pull/22668)) ([23717](https://github.com/WordPress/gutenberg/pull/23717)) +* Create Block: Fix missing `scripts` section in scaffolded `package.json`. ([23443](https://github.com/WordPress/gutenberg/pull/23443)) +* Scripts: Fix build script with style.css files. ([23710](https://github.com/WordPress/gutenberg/pull/23710)) +* Restore removed props and behavior back to Query Controls. ([23419](https://github.com/WordPress/gutenberg/pull/23419)) +* Add support for hexadecimal colors in gradient presets. ([23363](https://github.com/WordPress/gutenberg/pull/23363)) + +### Performance + +* Improve the performance of the keyboard shortcuts binding. ([23394](https://github.com/WordPress/gutenberg/pull/23394)) + +### Documentation + +* Add a documentation page explaining how the repository is organized. ([23563](https://github.com/WordPress/gutenberg/pull/23563)) +* Document the WordPress 5.5 backported code. ([23478](https://github.com/WordPress/gutenberg/pull/23478)) ([23708](https://github.com/WordPress/gutenberg/pull/23708)) +* Add .markdownlint.json configuration extending scripts configuration. ([23655](https://github.com/WordPress/gutenberg/pull/23655)) +* Add "Create a Block" tutorial Create a Block tutorial. ([22831](https://github.com/WordPress/gutenberg/pull/22831)) ([23654](https://github.com/WordPress/gutenberg/pull/23654)) +* Update wp-env Ubuntu documentation. ([23650](https://github.com/WordPress/gutenberg/pull/23650)) +* Add documentation for InnerBlocks orientation prop. ([23641](https://github.com/WordPress/gutenberg/pull/23641)) +* Remove DropZone position argument from documentation to reflect removal in WordPress 5.4. ([23577](https://github.com/WordPress/gutenberg/pull/23577)) +* Update categories in block registration documentation. ([23572](https://github.com/WordPress/gutenberg/pull/23572)) +* Update ESNext usage in public API. ([23475](https://github.com/WordPress/gutenberg/pull/23475)) +* Clarify the wp-block-styles documentation. ([23359](https://github.com/WordPress/gutenberg/pull/23359)) +* Add documentation for setting up Prettier for markdown. ([23286](https://github.com/WordPress/gutenberg/pull/23286)) +* Typos and tweaks: ([23542](https://github.com/WordPress/gutenberg/pull/23542)) ([23489](https://github.com/WordPress/gutenberg/pull/23489)) ([23590](https://github.com/WordPress/gutenberg/pull/23590)) ([23300](https://github.com/WordPress/gutenberg/pull/23300)) ([23534](https://github.com/WordPress/gutenberg/pull/23534)) ([23467](https://github.com/WordPress/gutenberg/pull/23467)) + +### Code Quality + +* Optimize useSelect calls (dependencies) ([23255](https://github.com/WordPress/gutenberg/pull/23255)) ([23247](https://github.com/WordPress/gutenberg/pull/23247)) ([23245](https://github.com/WordPress/gutenberg/pull/23245)) ([23249](https://github.com/WordPress/gutenberg/pull/23249)) +* Reduced the number of SASS color variables. ([23648](https://github.com/WordPress/gutenberg/pull/23648)) ([23454](https://github.com/WordPress/gutenberg/pull/23454)) +* Remove unused getBlockIndex selector from useBlockDropZone hook. ([23634](https://github.com/WordPress/gutenberg/pull/23634)) +* Scroll on drag: Remove blockNodes context dependency. ([23561](https://github.com/WordPress/gutenberg/pull/23561)) +* Add missing notices dependency. ([23517](https://github.com/WordPress/gutenberg/pull/23517)) +* Remove BlockPopover key prop and related code. ([23504](https://github.com/WordPress/gutenberg/pull/23504)) +* Show a warning when SlotFillProvider is missing. ([23493](https://github.com/WordPress/gutenberg/pull/23493)) +* Block toolbar: Remove data-align attribute. ([23468](https://github.com/WordPress/gutenberg/pull/23468)) +* Extract block draggable scroll behaviour into React hook. ([23444](https://github.com/WordPress/gutenberg/pull/23444)) +* Refactor Dropdown to use functional component. ([23142](https://github.com/WordPress/gutenberg/pull/23142)) +* Refactor Embed Edit component: Class component to Function component. ([22846](https://github.com/WordPress/gutenberg/pull/22846)) +* Extract navigation link rendering code from the navigation block. ([21075](https://github.com/WordPress/gutenberg/pull/21075)) +* Block editor: Use vanilla JS instead of Lodash if possible. ([21063](https://github.com/WordPress/gutenberg/pull/21063)) ([23633](https://github.com/WordPress/gutenberg/pull/23633)) +* Add "engines" to the package.json and "engine-strict = true" to the package.json. ([23600](https://github.com/WordPress/gutenberg/pull/23600)) +* Block Directory: Remove custom permission check in favor of `canUser`. ([23624](https://github.com/WordPress/gutenberg/pull/23624)) +* Remove REST\_WP\_REST\_Block\_Types\_Controller\_Test which now exists in WordPress Core. ([23500](https://github.com/WordPress/gutenberg/pull/23500)) +* Editor: Remove unnecessary block directory dependency. ([23476](https://github.com/WordPress/gutenberg/pull/23476)) +* Plugin Controller: Return the plugin without the extension. ([23395](https://github.com/WordPress/gutenberg/pull/23395)) +* Clean up image editor REST route. ([23368](https://github.com/WordPress/gutenberg/pull/23368)) +* Make slash inserter tests more stable. ([23367](https://github.com/WordPress/gutenberg/pull/23367)) +* Post Author block: Fix end-to-end test fixture indentation. ([23209](https://github.com/WordPress/gutenberg/pull/23209)) + +### Build Tooling + +* Add new command for pre-releasing npm packages. ([23357](https://github.com/WordPress/gutenberg/pull/23357)) +* Move the CI setup from Travis to Github actions. ([23523](https://github.com/WordPress/gutenberg/pull/23523)) ([23520](https://github.com/WordPress/gutenberg/pull/23520)) ([23518](https://github.com/WordPress/gutenberg/pull/23518)) ([23470](https://github.com/WordPress/gutenberg/pull/23470)) ([23538](https://github.com/WordPress/gutenberg/pull/23538)) +* Add npm cache to Github workflows and use checkout v2. ([23482](https://github.com/WordPress/gutenberg/pull/23482)) +* Update bin/validate-package-lock.js error message. ([23435](https://github.com/WordPress/gutenberg/pull/23435)) +* Minor improvements to the release tool and release documentation. ([23441](https://github.com/WordPress/gutenberg/pull/23441)) +* Tools: Always append prerelease to version update in package.json when preparing npm release. ([23480](https://github.com/WordPress/gutenberg/pull/23480)) +* Scripts: Add custom TerserPlugin configuration. ([22990](https://github.com/WordPress/gutenberg/pull/22990)) +* Scripts: Exclude node\_modules from source map processing in start script. ([23711](https://github.com/WordPress/gutenberg/pull/23711)) +* Fix rc version number added to the CHANGELOG. ([23433](https://github.com/WordPress/gutenberg/pull/23433)) +* Tests: Jest - Add typeahead plugin. ([23366](https://github.com/WordPress/gutenberg/pull/23366)) +* Tests: Run end-to-end tests only as an admin. ([23588](https://github.com/WordPress/gutenberg/pull/23588)) +* End-2-end Tests: Add test for using block variation with the slash inserter. ([23585](https://github.com/WordPress/gutenberg/pull/23585)) + +### Various + +* RangeControl: Integrate NumberControl + update internal state flow. ([23006](https://github.com/WordPress/gutenberg/pull/23006)) +* Create Block: Generate a block.json file. ([23399](https://github.com/WordPress/gutenberg/pull/23399)) +* Sync Block Context changes from Core. ([23602](https://github.com/WordPress/gutenberg/pull/23602)) +* Scripts: Remove default exclude rule for node\_modules for SVG, CSS and Sass files. ([23495](https://github.com/WordPress/gutenberg/pull/23495)) +* REST API: Sync /themes endpoint with Core's. ([23321](https://github.com/WordPress/gutenberg/pull/23321)) + + += 8.4.0 = + +### Features + +- Add image editing. ([23349](https://github.com/WordPress/gutenberg/pull/23349)) +- Enable block directory. ([23389](https://github.com/WordPress/gutenberg/pull/23389)) +- Allow block attributes to be modified while multiple blocks are selected. ([22470](https://github.com/WordPress/gutenberg/pull/22470)) + +### Enhancements + +- Show movers next to block switcher. ([22673](https://github.com/WordPress/gutenberg/pull/22673)) +- Support drag and drop in blocks like Social Links and improve drop zone detection. ([23020](https://github.com/WordPress/gutenberg/pull/23020)) +- Improve the accessibliity of toolbars by implementing roving tab index. + - Embed block toolbar. ([23278](https://github.com/WordPress/gutenberg/pull/23278)) + - Custom HTML block toolbar. ([23277](https://github.com/WordPress/gutenberg/pull/23277)) + - Table block toolbar. ([23252](https://github.com/WordPress/gutenberg/pull/23252)) + - Grouped blocks toolbars. ([23216](https://github.com/WordPress/gutenberg/pull/23216)) + - Header toolbar. ([22354](https://github.com/WordPress/gutenberg/pull/22354)) +- Tweak colors of disabled buttons to match rest of WP Admin. ([23229](https://github.com/WordPress/gutenberg/pull/23229)) +- Unify style of subheadings. ([23192](https://github.com/WordPress/gutenberg/pull/23192)) +- Make Popover scrolling and position behavior adapt to the content changes. ([23159](https://github.com/WordPress/gutenberg/pull/23159)) +- Reduce block appender hover delay. ([23046](https://github.com/WordPress/gutenberg/pull/23046)) +- Improve the alignment of children in the CardHeader and CardFooter components. ([22916](https://github.com/WordPress/gutenberg/pull/22916)) +- Add ability to transform a Preformatted block into a Code block. ([22634](https://github.com/WordPress/gutenberg/pull/22634)) +- Add a border to blocks while hovering with the Select tool active. ([22508](https://github.com/WordPress/gutenberg/pull/22508)) +- Consolidate disparate "copy block" actions. ([23088](https://github.com/WordPress/gutenberg/pull/23088)) +- Remove margin from last button if buttons in Buttons block are centered. ([23319](https://github.com/WordPress/gutenberg/pull/23319)) +- Adapt the block switcher styles to the new Popover component. ([23232](https://github.com/WordPress/gutenberg/pull/23232)) +- Make UI more consistent. ([23202](https://github.com/WordPress/gutenberg/pull/23202)) +- Remove canvas padding. ([22213](https://github.com/WordPress/gutenberg/pull/22213)) +- Image Editing + - Update Rich Image Icons. ([22819](https://github.com/WordPress/gutenberg/pull/22819)) + - Consolidate crop ratios. ([22817](https://github.com/WordPress/gutenberg/pull/22817)) + - Use snackbar notifications. ([23029](https://github.com/WordPress/gutenberg/pull/23029)) + - Batch editing in cropper component. ([23284](https://github.com/WordPress/gutenberg/pull/23284)) + - Move to image block. ([23053](https://github.com/WordPress/gutenberg/pull/23053)) + - Change Edit label to crop icon. ([23387](https://github.com/WordPress/gutenberg/pull/23387)) + - Use percentage instead of multiplier. ([23362](https://github.com/WordPress/gutenberg/pull/23362)) + +### New APIs + +- Update the theme colors to rely on CSS variables. ([23048](https://github.com/WordPress/gutenberg/pull/23048)) +- Extend `register_block_type_from_metadata` to handle assets. ([22519](https://github.com/WordPress/gutenberg/pull/22519)) +- Enable custom classnames on ``. ([23045](https://github.com/WordPress/gutenberg/pull/23045)) +- Add `onFilesPreUpload` property to`MediaPlaceholder`. ([23003](https://github.com/WordPress/gutenberg/pull/23003)) +- Improve error customization in`MediaReplaceFlow`. ([22995](https://github.com/WordPress/gutenberg/pull/22995)) +- Add context properties to block types REST endpoint. ([22686](https://github.com/WordPress/gutenberg/pull/22686)) + +### Bug Fixes + +- Fix pixel shift for toggles. ([23191](https://github.com/WordPress/gutenberg/pull/23191)) +- Fix `useBlockSync` race condition. ([23292](https://github.com/WordPress/gutenberg/pull/23292)) +- Avoid overriding popover content padding. ([23270](https://github.com/WordPress/gutenberg/pull/23270)) +- Fix block parent selector border radius. ([23250](https://github.com/WordPress/gutenberg/pull/23250)) +- Fix plus radius. ([23240](https://github.com/WordPress/gutenberg/pull/23240)) +- Fix Inserter's handling of child blocks. ([23231](https://github.com/WordPress/gutenberg/pull/23231)) +- Create Block: Fix errors reported by CSS linter in ESNext template. ([23188](https://github.com/WordPress/gutenberg/pull/23188)) +- Add context property mapping to block registration. ([23180](https://github.com/WordPress/gutenberg/pull/23180)) +- Remove `z-index` from placeholder fieldset. ([23152](https://github.com/WordPress/gutenberg/pull/23152)) +- Fix possibly outdated `onChange` in color palette's color picker. ([23136](https://github.com/WordPress/gutenberg/pull/23136)) +- Fix updateSlot missing from default`SlotFillContext`. ([23108](https://github.com/WordPress/gutenberg/pull/23108)) +- Add check theme support is an array before indexing. ([23104](https://github.com/WordPress/gutenberg/pull/23104)) +- Add i18n to padding 'reset' button. ([23099](https://github.com/WordPress/gutenberg/pull/23099)) +- Fix group block moving animation not working correctly. ([23084](https://github.com/WordPress/gutenberg/pull/23084)) +- Use a light block DOM for the Media & Text block. ([23062](https://github.com/WordPress/gutenberg/pull/23062)) +- Popover: Ensure popovers consider border width's in their positioning. ([23035](https://github.com/WordPress/gutenberg/pull/23035)) +- Remove child space in`Tooltip`. ([23019](https://github.com/WordPress/gutenberg/pull/23019)) +- Fix drag and drop for blocks that don't use `__experimentalTagName` for their inner blocks. ([23016](https://github.com/WordPress/gutenberg/pull/23016)) +- Fix am / pm i18n bug. ([22963](https://github.com/WordPress/gutenberg/pull/22963)) +- Fix plugin document setting panel name. ([22763](https://github.com/WordPress/gutenberg/pull/22763)) +- Fix plus icon. ([22704](https://github.com/WordPress/gutenberg/pull/22704)) +- Fix Typography panel rendering from style hooks. ([22605](https://github.com/WordPress/gutenberg/pull/22605)) +- Fix "Cannot read property 'end' of undefined" error on babel-plugin-makepot. ([22394](https://github.com/WordPress/gutenberg/pull/22394)) +- Fix "React does not recognize isSelected prop in ComplementaryAreaToggle" warning. ([22967](https://github.com/WordPress/gutenberg/pull/22967)) +- Cover padding: Fix reset and visualize on hover. ([23041](https://github.com/WordPress/gutenberg/pull/23041)) +- Fix color picker saturation bug. ([23272](https://github.com/WordPress/gutenberg/pull/23272)) +- Fix image size feature. ([23342](https://github.com/WordPress/gutenberg/pull/23342)) +- Remove block preview paddings. ([23386](https://github.com/WordPress/gutenberg/pull/23386)) +- Block Directory + - Fix "no result" UI flash. ([22783](https://github.com/WordPress/gutenberg/pull/22783)) + - Uninstall unused block types. ([22918](https://github.com/WordPress/gutenberg/pull/22918)) + - Fix installing blocks. ([23096](https://github.com/WordPress/gutenberg/pull/23096)) + - Add plugins REST API endpoints. ([22454](https://github.com/WordPress/gutenberg/pull/22454)) + - Use plugin API for installing & deleting block-plugins. ([23219](https://github.com/WordPress/gutenberg/pull/23219)) + - Use a more specific `", $esc_src ), + sprintf( "", esc_attr( $handle ), $esc_src ), + $tag + ); return $tag; } - add_filter( 'script_loader_tag', 'gutenberg_change_script_tag', 10, 2 ); + add_filter( 'script_loader_tag', 'gutenberg_change_script_tag', 1, 3 ); } diff --git a/lib/block-patterns.php b/lib/block-patterns.php new file mode 100644 index 0000000000000..e8c0d0811dae9 --- /dev/null +++ b/lib/block-patterns.php @@ -0,0 +1,66 @@ +get_all_registered(); + $settings['__experimentalBlockPatternCategories'] = WP_Block_Pattern_Categories_Registry::get_instance()->get_all_registered(); + + return $settings; +} +add_filter( 'block_editor_settings', 'gutenberg_extend_settings_block_patterns', 0 ); + + +/** + * Load a block pattern by name. + * + * @param string $name Block Pattern File name. + * + * @return array Block Pattern Array. + */ +function gutenberg_load_block_pattern( $name ) { + return require( __DIR__ . '/patterns/' . $name . '.php' ); +} + +/** + * Register default patterns and categories, potentially overriding ones that were already registered in Core. + * + * This can be removed when plugin support requires WordPress 5.5.0+, and patterns have been synced back to Core. + * + * @see https://core.trac.wordpress.org/ticket/50550 + */ +function gutenberg_register_block_patterns() { + $should_register_core_patterns = get_theme_support( 'core-block-patterns' ); + + if ( $should_register_core_patterns ) { + register_block_pattern( 'core/text-two-columns', gutenberg_load_block_pattern( 'text-two-columns' ) ); + register_block_pattern( 'core/two-buttons', gutenberg_load_block_pattern( 'two-buttons' ) ); + register_block_pattern( 'core/two-images', gutenberg_load_block_pattern( 'two-images' ) ); + register_block_pattern( 'core/text-two-columns-with-images', gutenberg_load_block_pattern( 'text-two-columns-with-images' ) ); + register_block_pattern( 'core/text-three-columns-buttons', gutenberg_load_block_pattern( 'text-three-columns-buttons' ) ); + register_block_pattern( 'core/large-header', gutenberg_load_block_pattern( 'large-header' ) ); + register_block_pattern( 'core/large-header-button', gutenberg_load_block_pattern( 'large-header-button' ) ); + register_block_pattern( 'core/three-buttons', gutenberg_load_block_pattern( 'three-buttons' ) ); + register_block_pattern( 'core/heading-paragraph', gutenberg_load_block_pattern( 'heading-paragraph' ) ); + register_block_pattern( 'core/quote', gutenberg_load_block_pattern( 'quote' ) ); + } + + register_block_pattern_category( 'buttons', array( 'label' => _x( 'Buttons', 'Block pattern category', 'gutenberg' ) ) ); + register_block_pattern_category( 'columns', array( 'label' => _x( 'Columns', 'Block pattern category', 'gutenberg' ) ) ); + register_block_pattern_category( 'gallery', array( 'label' => _x( 'Gallery', 'Block pattern category', 'gutenberg' ) ) ); + register_block_pattern_category( 'header', array( 'label' => _x( 'Headers', 'Block pattern category', 'gutenberg' ) ) ); + register_block_pattern_category( 'text', array( 'label' => _x( 'Text', 'Block pattern category', 'gutenberg' ) ) ); +} +add_action( 'init', 'gutenberg_register_block_patterns' ); diff --git a/lib/block-supports/align.php b/lib/block-supports/align.php new file mode 100644 index 0000000000000..762ae13fb71f7 --- /dev/null +++ b/lib/block-supports/align.php @@ -0,0 +1,56 @@ +supports, array( 'align' ), false ); + } + if ( $has_align_support ) { + if ( ! $block_type->attributes ) { + $block_type->attributes = array(); + } + + if ( ! array_key_exists( 'align', $block_type->attributes ) ) { + $block_type->attributes['align'] = array( + 'type' => 'string', + 'enum' => array( 'left', 'center', 'right', 'wide', 'full', '' ), + ); + } + } +} + +/** + * Add CSS classes for block alignment to the incoming attributes array. + * This will be applied to the block markup in the front-end. + * + * @param array $attributes Comprehensive list of attributes to be applied. + * @param array $block_attributes Block attributes. + * @param WP_Block_Type $block_type Block Type. + * + * @return array Block alignment CSS classes and inline styles. + */ +function gutenberg_apply_alignment_support( $attributes, $block_attributes, $block_type ) { + $has_align_support = false; + if ( property_exists( $block_type, 'supports' ) ) { + $has_align_support = gutenberg_experimental_get( $block_type->supports, array( 'align' ), false ); + } + if ( $has_align_support ) { + $has_block_alignment = array_key_exists( 'align', $block_attributes ); + + if ( $has_block_alignment ) { + $attributes['css_classes'][] = sprintf( 'align%s', $block_attributes['align'] ); + } + } + + return $attributes; +} diff --git a/lib/block-supports/colors.php b/lib/block-supports/colors.php new file mode 100644 index 0000000000000..9d799bd4bb806 --- /dev/null +++ b/lib/block-supports/colors.php @@ -0,0 +1,139 @@ +supports, array( '__experimentalColor' ), false ); + } + $has_text_colors_support = is_array( $color_support ) || $color_support; + $has_background_colors_support = $has_text_colors_support; + $has_gradients_support = $has_text_colors_support && gutenberg_experimental_get( $color_support, array( 'gradients' ), false ); + + if ( ! $block_type->attributes ) { + $block_type->attributes = array(); + } + + if ( $has_text_colors_support && ! array_key_exists( 'style', $block_type->attributes ) ) { + $block_type->attributes['style'] = array( + 'type' => 'object', + ); + } + + if ( $has_background_colors_support && ! array_key_exists( 'backgroundColor', $block_type->attributes ) ) { + $block_type->attributes['backgroundColor'] = array( + 'type' => 'string', + ); + } + + if ( $has_text_colors_support && ! array_key_exists( 'textColor', $block_type->attributes ) ) { + $block_type->attributes['textColor'] = array( + 'type' => 'string', + ); + } + + if ( $has_gradients_support && ! array_key_exists( 'gradient', $block_type->attributes ) ) { + $block_type->attributes['gradient'] = array( + 'type' => 'string', + ); + } +} + + +/** + * Add CSS classes and inline styles for colors to the incoming attributes array. + * This will be applied to the block markup in the front-end. + * + * @param array $attributes Comprehensive list of attributes to be applied. + * @param array $block_attributes Block attributes. + * @param WP_Block_Type $block_type Block type. + * + * @return array Colors CSS classes and inline styles. + */ +function gutenberg_apply_colors_support( $attributes, $block_attributes, $block_type ) { + $color_support = gutenberg_experimental_get( $block_type->supports, array( '__experimentalColor' ), false ); + $has_text_colors_support = is_array( $color_support ) || $color_support; + $has_background_colors_support = $has_text_colors_support; + $has_link_colors_support = $has_text_colors_support && gutenberg_experimental_get( $color_support, array( 'linkColor' ), false ); + $has_gradients_support = $has_text_colors_support && gutenberg_experimental_get( $color_support, array( 'gradients' ), false ); + + // Text Colors. + // Check support for text colors. + if ( $has_text_colors_support ) { + $has_named_text_color = array_key_exists( 'textColor', $block_attributes ); + $has_custom_text_color = isset( $block_attributes['style']['color']['text'] ); + + // Apply required generic class. + if ( $has_custom_text_color || $has_named_text_color ) { + $attributes['css_classes'][] = 'has-text-color'; + } + // Apply color class or inline style. + if ( $has_named_text_color ) { + $attributes['css_classes'][] = sprintf( 'has-%s-color', $block_attributes['textColor'] ); + } elseif ( $has_custom_text_color ) { + $attributes['inline_styles'][] = sprintf( 'color: %s;', $block_attributes['style']['color']['text'] ); + } + } + + // Link Colors. + if ( $has_link_colors_support ) { + $has_link_color = isset( $block_attributes['style']['color']['link'] ); + // Apply required class and style. + if ( $has_link_color ) { + $attributes['css_classes'][] = 'has-link-color'; + // If link is a named color. + if ( strpos( $block_attributes['style']['color']['link'], 'var:preset|color|' ) !== false ) { + // Get the name from the string and add proper styles. + $index_to_splice = strrpos( $block_attributes['style']['color']['link'], '|' ) + 1; + $link_color_name = substr( $block_attributes['style']['color']['link'], $index_to_splice ); + $attributes['inline_styles'][] = sprintf( '--wp--style--color--link:var(--wp--preset--color--%s);', $link_color_name ); + } else { + $attributes['inline_styles'][] = sprintf( '--wp--style--color--link: %s;', $block_attributes['style']['color']['link'] ); + } + } + } + + // Background Colors. + if ( $has_background_colors_support ) { + $has_named_background_color = array_key_exists( 'backgroundColor', $block_attributes ); + $has_custom_background_color = isset( $block_attributes['style']['color']['background'] ); + + // Apply required background class. + if ( $has_custom_background_color || $has_named_background_color ) { + $attributes['css_classes'][] = 'has-background'; + } + // Apply background color classes or styles. + if ( $has_named_background_color ) { + $attributes['css_classes'][] = sprintf( 'has-%s-background-color', $block_attributes['backgroundColor'] ); + } elseif ( $has_custom_background_color ) { + $attributes['inline_styles'][] = sprintf( 'background-color: %s;', $block_attributes['style']['color']['background'] ); + } + } + + // Gradients. + if ( $has_gradients_support ) { + $has_named_gradient = array_key_exists( 'gradient', $block_attributes ); + $has_custom_gradient = isset( $block_attributes['style']['color']['gradient'] ); + + if ( $has_named_gradient || $has_custom_gradient ) { + $attributes['css_classes'][] = 'has-background'; + } + // Apply required background class. + if ( $has_named_gradient ) { + $attributes['css_classes'][] = sprintf( 'has-%s-gradient-background', $block_attributes['gradient'] ); + } elseif ( $has_custom_gradient ) { + $attributes['inline_styles'][] = sprintf( 'background: %s;', $block_attributes['style']['color']['gradient'] ); + } + } + + return $attributes; +} diff --git a/lib/block-supports/custom-classname.php b/lib/block-supports/custom-classname.php new file mode 100644 index 0000000000000..59126dd384cff --- /dev/null +++ b/lib/block-supports/custom-classname.php @@ -0,0 +1,54 @@ +supports, array( 'customClassName' ), true ); + } + if ( $has_custom_classname_support ) { + if ( ! $block_type->attributes ) { + $block_type->attributes = array(); + } + + if ( ! array_key_exists( 'className', $block_type->attributes ) ) { + $block_type->attributes['className'] = array( + 'type' => 'string', + ); + } + } +} + +/** + * Add the custom classnames to the output. + * + * @param array $attributes Comprehensive list of attributes to be applied. + * @param array $block_attributes Block attributes. + * @param WP_Block_Type $block_type Block Type. + * + * @return array Block CSS classes and inline styles. + */ +function gutenberg_apply_custom_classname_support( $attributes, $block_attributes, $block_type ) { + $has_custom_classname_support = true; + if ( property_exists( $block_type, 'supports' ) ) { + $has_custom_classname_support = gutenberg_experimental_get( $block_type->supports, array( 'customClassName' ), true ); + } + if ( $has_custom_classname_support ) { + $has_custom_classnames = array_key_exists( 'className', $block_attributes ); + + if ( $has_custom_classnames ) { + $attributes['css_classes'][] = $block_attributes['className']; + } + } + + return $attributes; +} diff --git a/lib/block-supports/generated-classname.php b/lib/block-supports/generated-classname.php new file mode 100644 index 0000000000000..ee194304c0590 --- /dev/null +++ b/lib/block-supports/generated-classname.php @@ -0,0 +1,57 @@ +supports, array( 'className' ), true ); + } + if ( $has_generated_classname_support ) { + $block_classname = gutenberg_get_block_default_classname( $block_type->name ); + + if ( $block_classname ) { + $attributes['css_classes'][] = $block_classname; + } + } + + return $attributes; +} diff --git a/lib/block-supports/index.php b/lib/block-supports/index.php new file mode 100644 index 0000000000000..e43111e097150 --- /dev/null +++ b/lib/block-supports/index.php @@ -0,0 +1,114 @@ +get_all_registered(); + // Ideally we need a hook to extend the block registration + // instead of mutating the block type. + foreach ( $registered_block_types as $block_type ) { + gutenberg_register_alignment_support( $block_type ); + gutenberg_register_colors_support( $block_type ); + gutenberg_register_typography_support( $block_type ); + gutenberg_register_custom_classname_support( $block_type ); + } +} + +add_action( 'init', 'gutenberg_register_block_supports', 21 ); + +/** + * Filters the frontend output of blocks and apply the block support flags transformations. + * + * @param string $block_content rendered block content. + * @param array $block block object. + * @return string filtered block content. + */ +function gutenberg_apply_block_supports( $block_content, $block ) { + if ( ! isset( $block['attrs'] ) ) { + return $block_content; + } + + $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] ); + // If no render_callback, assume styles have been previously handled. + if ( ! $block_type || ! $block_type->render_callback ) { + return $block_content; + } + + $attributes = array(); + $attributes = gutenberg_apply_generated_classname_support( $attributes, $block['attrs'], $block_type ); + $attributes = gutenberg_apply_colors_support( $attributes, $block['attrs'], $block_type ); + $attributes = gutenberg_apply_typography_support( $attributes, $block['attrs'], $block_type ); + $attributes = gutenberg_apply_alignment_support( $attributes, $block['attrs'], $block_type ); + $attributes = gutenberg_apply_custom_classname_support( $attributes, $block['attrs'], $block_type ); + + if ( ! count( $attributes ) ) { + return $block_content; + } + + // We need to wrap the block in order to handle UTF-8 properly. + $wrapper_left = ''; + $wrapper_right = ''; + + $dom = new DOMDocument( '1.0', 'utf-8' ); + + // Suppress DOMDocument::loadHTML warnings from polluting the front-end. + $previous = libxml_use_internal_errors( true ); + + $success = $dom->loadHTML( $wrapper_left . $block_content . $wrapper_right, LIBXML_HTML_NODEFDTD | LIBXML_COMPACT ); + + // Clear errors and reset the use_errors setting. + libxml_clear_errors(); + libxml_use_internal_errors( $previous ); + + if ( ! $success ) { + return $block_content; + } + + $xpath = new DOMXPath( $dom ); + $block_root = $xpath->query( '/html/body/*' )[0]; + + if ( empty( $block_root ) ) { + return $block_content; + } + + // Merge and dedupe new and existing classes and styles. + $current_classes = explode( ' ', trim( $block_root->getAttribute( 'class' ) ) ); + $classes_to_add = array_key_exists( 'css_classes', $attributes ) ? $attributes['css_classes'] : array(); + $new_classes = array_unique( array_filter( array_merge( $current_classes, $classes_to_add ) ) ); + + $current_styles = preg_split( '/\s*;\s*/', trim( $block_root->getAttribute( 'style' ) ) ); + $styles_to_add = array_key_exists( 'inline_styles', $attributes ) ? $attributes['inline_styles'] : array(); + $new_styles = array_unique( array_map( 'gutenberg_normalize_css_rule', array_filter( array_merge( $current_styles, $styles_to_add ) ) ) ); + + // Apply new styles and classes. + if ( ! empty( $new_classes ) ) { + $block_root->setAttribute( 'class', esc_attr( implode( ' ', $new_classes ) ) ); + } + + if ( ! empty( $new_styles ) ) { + $block_root->setAttribute( 'style', esc_attr( implode( '; ', $new_styles ) . ';' ) ); + } + + return $dom->saveHtml( $block_root ); +} +add_filter( 'render_block', 'gutenberg_apply_block_supports', 10, 2 ); + +/** + * Normalizes spacing in a string representing a CSS rule + * + * @example + * 'color :red;' becomes 'color:red' + * + * @param string $css_rule_string CSS rule. + * @return string Normalized CSS rule. + */ +function gutenberg_normalize_css_rule( $css_rule_string ) { + return trim( implode( ': ', preg_split( '/\s*:\s*/', $css_rule_string, 2 ) ), ';' ); +} diff --git a/lib/block-supports/typography.php b/lib/block-supports/typography.php new file mode 100644 index 0000000000000..083a6ee477b90 --- /dev/null +++ b/lib/block-supports/typography.php @@ -0,0 +1,85 @@ +supports, array( '__experimentalFontSize' ), false ); + } + + $has_line_height_support = false; + if ( property_exists( $block_type, 'supports' ) ) { + $has_line_height_support = gutenberg_experimental_get( $block_type->supports, array( '__experimentalLineHeight' ), false ); + } + + if ( ! $block_type->attributes ) { + $block_type->attributes = array(); + } + + if ( ( $has_font_size_support || $has_line_height_support ) && ! array_key_exists( 'style', $block_type->attributes ) ) { + $block_type->attributes['style'] = array( + 'type' => 'object', + ); + } + + if ( $has_font_size_support && ! array_key_exists( 'fontSize', $block_type->attributes ) ) { + $block_type->attributes['fontSize'] = array( + 'type' => 'string', + ); + } +} + +/** + * Add CSS classes and inline styles for font sizes to the incoming attributes array. + * This will be applied to the block markup in the front-end. + * + * @param array $attributes Comprehensive list of attributes to be applied. + * @param array $block_attributes Block attributes. + * @param WP_Block_Type $block_type Block type. + * + * @return array Font size CSS classes and inline styles. + */ +function gutenberg_apply_typography_support( $attributes, $block_attributes, $block_type ) { + $has_font_size_support = false; + if ( property_exists( $block_type, 'supports' ) ) { + $has_font_size_support = gutenberg_experimental_get( $block_type->supports, array( '__experimentalFontSize' ), false ); + } + + $has_line_height_support = false; + if ( property_exists( $block_type, 'supports' ) ) { + $has_line_height_support = gutenberg_experimental_get( $block_type->supports, array( '__experimentalLineHeight' ), false ); + } + + // Font Size. + if ( $has_font_size_support ) { + $has_named_font_size = array_key_exists( 'fontSize', $block_attributes ); + $has_custom_font_size = isset( $block_attributes['style']['typography']['fontSize'] ); + + // Apply required class or style. + if ( $has_named_font_size ) { + $attributes['css_classes'][] = sprintf( 'has-%s-font-size', $block_attributes['fontSize'] ); + } elseif ( $has_custom_font_size ) { + $attributes['inline_styles'][] = sprintf( 'font-size: %spx;', $block_attributes['style']['typography']['fontSize'] ); + } + } + + // Line Height. + if ( $has_line_height_support ) { + $has_line_height = isset( $block_attributes['style']['typography']['lineHeight'] ); + // Add the style (no classes for line-height). + if ( $has_line_height ) { + $attributes['inline_styles'][] = sprintf( 'line-height: %s;', $block_attributes['style']['typography']['lineHeight'] ); + } + } + + return $attributes; +} diff --git a/lib/blocks.php b/lib/blocks.php index 80522bda95367..55bc31da6d37a 100644 --- a/lib/blocks.php +++ b/lib/blocks.php @@ -61,6 +61,7 @@ function gutenberg_reregister_core_block_types() { 'latest-posts.php' => 'core/latest-posts', 'legacy-widget.php' => 'core/legacy-widget', 'navigation.php' => 'core/navigation', + 'navigation-link.php' => 'core/navigation-link', 'rss.php' => 'core/rss', 'search.php' => 'core/search', 'shortcode.php' => 'core/shortcode', @@ -72,21 +73,28 @@ function gutenberg_reregister_core_block_types() { $block_names = array_merge( $block_names, array( - 'post-author.php' => 'core/post-author', - 'post-comments.php' => 'core/post-comments', - 'post-comments-count.php' => 'core/post-comments-count', - 'post-comments-form.php' => 'core/post-comments-form', - 'post-content.php' => 'core/post-content', - 'post-date.php' => 'core/post-date', - 'post-excerpt.php' => 'core/post-excerpt', - 'post-featured-image.php' => 'core/post-featured-image', - 'post-tags.php' => 'core/post-tags', - 'post-title.php' => 'core/post-title', - 'query.php' => 'core/query', - 'query-loop.php' => 'core/query-loop', - 'query-pagination.php' => 'core/query-pagination', - 'site-title.php' => 'core/site-title', - 'template-part.php' => 'core/template-part', + 'post-author.php' => 'core/post-author', + 'post-comment.php' => 'core/post-comment', + 'post-comment-author.php' => 'core/post-comment-author', + 'post-comment-content.php' => 'core/post-comment-content', + 'post-comment-date.php' => 'core/post-comment-date', + 'post-comments.php' => 'core/post-comments', + 'post-comments-count.php' => 'core/post-comments-count', + 'post-comments-form.php' => 'core/post-comments-form', + 'post-content.php' => 'core/post-content', + 'post-date.php' => 'core/post-date', + 'post-excerpt.php' => 'core/post-excerpt', + 'post-featured-image.php' => 'core/post-featured-image', + 'post-hierarchical-terms.php' => 'core/post-hierarchical-terms', + 'post-tags.php' => 'core/post-tags', + 'post-title.php' => 'core/post-title', + 'query.php' => 'core/query', + 'query-loop.php' => 'core/query-loop', + 'query-pagination.php' => 'core/query-pagination', + 'site-logo.php' => 'core/site-logo', + 'site-tagline.php' => 'core/site-tagline', + 'site-title.php' => 'core/site-title', + 'template-part.php' => 'core/template-part', ) ); } @@ -216,83 +224,3 @@ function gutenberg_register_legacy_social_link_blocks() { } } add_action( 'init', 'gutenberg_register_legacy_social_link_blocks' ); - -if ( ! function_exists( 'register_block_style' ) ) { - /** - * Registers a new block style. - * - * @param string $block_name Block type name including namespace. - * @param array $style_properties Array containing the properties of the style name, label, style (name of the stylesheet to be enqueued), inline_style (string containing the CSS to be added). - * - * @return boolean True if the block style was registered with success and false otherwise. - */ - function register_block_style( $block_name, $style_properties ) { - return WP_Block_Styles_Registry::get_instance()->register( $block_name, $style_properties ); - } -} - -if ( ! function_exists( 'unregister_block_style' ) ) { - /** - * Unregisters a block style. - * - * @param string $block_name Block type name including namespace. - * @param array $block_style_name Block style name. - * - * @return boolean True if the block style was unregistered with success and false otherwise. - */ - function unregister_block_style( $block_name, $block_style_name ) { - return WP_Block_Styles_Registry::get_instance()->unregister( $block_name, $block_style_name ); - } -} - -if ( ! has_action( 'enqueue_block_assets', 'enqueue_block_styles_assets' ) ) { - /** - * Function responsible for enqueuing the styles required for block styles functionality on the editor and on the frontend. - */ - function gutenberg_enqueue_block_styles_assets() { - $block_styles = WP_Block_Styles_Registry::get_instance()->get_all_registered(); - - foreach ( $block_styles as $styles ) { - foreach ( $styles as $style_properties ) { - if ( isset( $style_properties['style_handle'] ) ) { - wp_enqueue_style( $style_properties['style_handle'] ); - } - if ( isset( $style_properties['inline_style'] ) ) { - wp_add_inline_style( 'wp-block-library', $style_properties['inline_style'] ); - } - } - } - } - add_action( 'enqueue_block_assets', 'gutenberg_enqueue_block_styles_assets', 30 ); -} -if ( ! has_action( 'enqueue_block_editor_assets', 'enqueue_editor_block_styles_assets' ) ) { - /** - * Function responsible for enqueuing the assets required for block styles functionality on the editor. - */ - function gutenberg_enqueue_editor_block_styles_assets() { - $block_styles = WP_Block_Styles_Registry::get_instance()->get_all_registered(); - - $register_script_lines = array( '( function() {' ); - foreach ( $block_styles as $block_name => $styles ) { - foreach ( $styles as $style_properties ) { - $register_script_lines[] = sprintf( - ' wp.blocks.registerBlockStyle( \'%s\', %s );', - $block_name, - wp_json_encode( - array( - 'name' => $style_properties['name'], - 'label' => $style_properties['label'], - ) - ) - ); - } - } - $register_script_lines[] = '} )();'; - $inline_script = implode( "\n", $register_script_lines ); - - wp_register_script( 'wp-block-styles', false, array( 'wp-blocks' ), true, true ); - wp_add_inline_script( 'wp-block-styles', $inline_script ); - wp_enqueue_script( 'wp-block-styles' ); - } - add_action( 'enqueue_block_editor_assets', 'gutenberg_enqueue_editor_block_styles_assets' ); -} diff --git a/lib/class-experimental-wp-widget-blocks-manager.php b/lib/class-experimental-wp-widget-blocks-manager.php deleted file mode 100644 index c915807bd769b..0000000000000 --- a/lib/class-experimental-wp-widget-blocks-manager.php +++ /dev/null @@ -1,420 +0,0 @@ - $post_id, - 'wp_inactive_widgets' => array_merge( - $sidebars['wp_inactive_widgets'], - $sidebar - ), - ) - ) - ); - } - - /** - * Returns a sidebar as an array of legacy widget blocks. - * - * @since 5.7.0 - * - * @param string $sidebar_id Identifier of the sidebar. - * @return array $post_id Post id. - */ - public static function get_sidebar_as_blocks( $sidebar_id ) { - $blocks = array(); - - $sidebars_items = self::get_raw_sidebar_widgets(); - $wp_registered_sidebars = self::get_wp_registered_sidebars(); - - foreach ( $sidebars_items[ $sidebar_id ] as $item ) { - $widget_class = self::get_widget_class( $item ); - list( $object, $number ) = self::get_widget_info( $item ); - $new_block = array( - 'blockName' => 'core/legacy-widget', - 'attrs' => array( - 'id' => $item, - 'instance' => self::get_sidebar_widget_instance( $wp_registered_sidebars[ $sidebar_id ], $item ), - ), - 'innerHTML' => '', - ); - if ( null !== $widget_class ) { - $new_block['attrs']['widgetClass'] = $widget_class; - } - if ( isset( $object->id_base ) ) { - $new_block['attrs']['idBase'] = $object->id_base; - } - if ( is_int( $number ) ) { - $new_block['attrs']['number'] = $number; - } - $blocks[] = $new_block; - } - return $blocks; - } - - /** - * Verifies if a sidebar id is valid or not. - * - * @since 5.7.0 - * - * @param string $sidebar_id Identifier of the sidebar. - * @return boolean True if the $sidebar_id value is valid and false otherwise. - */ - public static function is_valid_sidebar_id( $sidebar_id ) { - $wp_registered_sidebars = self::get_wp_registered_sidebars(); - return isset( $wp_registered_sidebars[ $sidebar_id ] ); - } - - - /** - * Given a widget id returns the name of the class the represents the widget. - * - * @since 5.7.0 - * - * @param string $widget_id Identifier of the widget. - * @return string|null Name of the class that represents the widget or null if the widget is not represented by a class. - */ - private static function get_widget_class( $widget_id ) { - $wp_registered_widgets = self::get_wp_registered_widgets(); - if ( - isset( $wp_registered_widgets[ $widget_id ]['callback'][0] ) && - $wp_registered_widgets[ $widget_id ]['callback'][0] instanceof WP_Widget - ) { - return get_class( $wp_registered_widgets[ $widget_id ]['callback'][0] ); - } - return null; - } - - /** - * Retrieves a widget instance. - * - * @since 5.7.0 - * - * @param array $sidebar sidebar data available at $wp_registered_sidebars. - * @param string $id Identifier of the widget instance. - * @return array Array containing the widget instance. - */ - private static function get_sidebar_widget_instance( $sidebar, $id ) { - list( $object, $number, $name ) = self::get_widget_info( $id ); - if ( ! $object ) { - return array(); - } - - $object->_set( $number ); - - $instances = $object->get_settings(); - $instance = $instances[ $number ]; - - $args = array_merge( - $sidebar, - array( - 'widget_id' => $id, - 'widget_name' => $name, - ) - ); - - /** - * Filters the settings for a particular widget instance. - * - * Returning false will effectively short-circuit display of the widget. - * - * @since 2.8.0 - * - * @param array $instance The current widget instance's settings. - * @param WP_Widget $this The current widget instance. - * @param array $args An array of default widget arguments. - */ - $instance = apply_filters( 'widget_display_callback', $instance, $object, $args ); - - if ( false === $instance ) { - return array(); - } - - return $instance; - } - - /** - * Given a widget id returns an array containing information about the widget. - * - * @since 5.7.0 - * - * @param string $widget_id Identifier of the widget. - * @return array Array containing the the widget object, the number, and the name. - */ - private static function get_widget_info( $widget_id ) { - $wp_registered_widgets = self::get_wp_registered_widgets(); - - if ( - ! isset( $wp_registered_widgets[ $widget_id ]['callback'][0] ) || - ! isset( $wp_registered_widgets[ $widget_id ]['params'][0]['number'] ) || - ! isset( $wp_registered_widgets[ $widget_id ]['name'] ) || - ! ( $wp_registered_widgets[ $widget_id ]['callback'][0] instanceof WP_Widget ) - ) { - return array( null, null, null ); - } - - $object = $wp_registered_widgets[ $widget_id ]['callback'][0]; - $number = $wp_registered_widgets[ $widget_id ]['params'][0]['number']; - $name = $wp_registered_widgets[ $widget_id ]['name']; - return array( $object, $number, $name ); - } - - /** - * Serializes an array of blocks. - * - * @since 5.7.0 - * - * @param array $blocks Post Array of block objects. - * @return string String representing the blocks. - */ - public static function serialize_blocks( $blocks ) { - return implode( array_map( 'self::serialize_block', $blocks ) ); - } - - /** - * Serializes a block. - * - * @since 5.7.0 - * - * @param array $block Block object. - * @return string String representing the block. - */ - public static function serialize_block( $block ) { - if ( ! isset( $block['blockName'] ) ) { - return false; - } - $name = $block['blockName']; - if ( 0 === strpos( $name, 'core/' ) ) { - $name = substr( $name, strlen( 'core/' ) ); - } - - if ( empty( $block['attrs'] ) ) { - $opening_tag_suffix = ''; - } else { - $opening_tag_suffix = ' ' . json_encode( $block['attrs'] ); - } - - if ( empty( $block['innerHTML'] ) ) { - return sprintf( - '', - $name, - $opening_tag_suffix - ); - } else { - return sprintf( - '%3$s', - $name, - $opening_tag_suffix, - $block['innerHTML'] - ); - } - } - - /** - * Outputs a block widget on the website frontend. - * - * @param array $options Widget options. - * @param array $arguments Arguments array. - */ - public static function output_blocks_widget( $options, $arguments ) { - echo $options['before_widget']; - foreach ( $arguments['blocks'] as $block ) { - echo render_block( $block ); - } - echo $options['after_widget']; - } - - /** - * Noop block widget control output function for the necessary call to `wp_register_widget_control`. - */ - public static function output_blocks_widget_control() {} - - /** - * Registers a widget that should represent a set of blocks and returns its ID. - * - * @param array $blocks Array of blocks. - */ - public static function convert_blocks_to_widget( $blocks ) { - $widget_id = 'blocks-widget-' . md5( self::serialize_blocks( $blocks ) ); - global $wp_registered_widgets; - if ( isset( $wp_registered_widgets[ $widget_id ] ) ) { - return $widget_id; - } - wp_register_sidebar_widget( - $widget_id, - __( 'Blocks Area', 'gutenberg' ), - 'Experimental_WP_Widget_Blocks_Manager::output_blocks_widget', - array( - 'classname' => 'widget-area', - 'description' => __( 'Displays a set of blocks', 'gutenberg' ), - ), - array( - 'blocks' => $blocks, - ) - ); - wp_register_widget_control( - $widget_id, - __( 'Blocks Area', 'gutenberg' ), - 'Experimental_WP_Widget_Blocks_Manager::output_blocks_widget_control', - array( 'id_base' => 'blocks-widget' ) - ); - return $widget_id; - } - - /** - * Filters the $sidebars_widgets to exchange wp_area post id with a widget that renders that block area. - * - * @param array $sidebars_widgets_input An associative array of sidebars and their widgets. - */ - public static function swap_out_sidebars_blocks_for_block_widgets( $sidebars_widgets_input ) { - global $sidebars_widgets; - global $wp_customize; - if ( null === self::$unfiltered_sidebar_widgets ) { - self::$unfiltered_sidebar_widgets = $sidebars_widgets; - } - $changeset_data = null; - if ( function_exists( 'is_customize_preview' ) && is_customize_preview() ) { - $changeset_data = $wp_customize->changeset_data(); - if ( isset( $changeset_data['gutenberg_widget_blocks']['value'] ) ) { - $changeset_data = json_decode( $changeset_data['gutenberg_widget_blocks']['value'] ); - } - } - - $filtered_sidebar_widgets = array(); - foreach ( $sidebars_widgets_input as $sidebar_id => $item ) { - $changeset_value = $changeset_data && isset( $changeset_data->$sidebar_id ) - ? $changeset_data->$sidebar_id - : null; - - if ( ! is_numeric( $item ) && ! $changeset_value ) { - $filtered_sidebar_widgets[ $sidebar_id ] = $item; - continue; - } - - $filtered_widgets = array(); - $last_set_of_blocks = array(); - $blocks = parse_blocks( - $changeset_value ? $changeset_value : get_post( $item )->post_content - ); - - foreach ( $blocks as $block ) { - if ( ! isset( $block['blockName'] ) ) { - continue; - } - if ( - 'core/legacy-widget' === $block['blockName'] && - isset( $block['attrs']['identifier'] ) - ) { - if ( ! empty( $last_set_of_blocks ) ) { - $filtered_widgets[] = self::convert_blocks_to_widget( $last_set_of_blocks ); - $last_set_of_blocks = array(); - } - $filtered_widgets[] = $block['attrs']['identifier']; - } else { - $last_set_of_blocks[] = $block; - } - } - if ( ! empty( $last_set_of_blocks ) ) { - $filtered_widgets[] = self::convert_blocks_to_widget( $last_set_of_blocks ); - } - - $filtered_sidebar_widgets[ $sidebar_id ] = $filtered_widgets; - } - $sidebars_widgets = $filtered_sidebar_widgets; - - return $filtered_sidebar_widgets; - } -} diff --git a/lib/class-wp-block-list.php b/lib/class-wp-block-list.php index 281fa6ed4deb6..3bf1f6252088b 100644 --- a/lib/class-wp-block-list.php +++ b/lib/class-wp-block-list.php @@ -7,6 +7,11 @@ /** * Class representing a list of block instances. + * + * This class can be removed when plugin support requires WordPress 5.5.0+. + * + * @see https://core.trac.wordpress.org/ticket/49926 + * @see https://core.trac.wordpress.org/changeset/48159 */ class WP_Block_List implements Iterator, ArrayAccess, Countable { diff --git a/lib/class-wp-block-pattern-categories-registry.php b/lib/class-wp-block-pattern-categories-registry.php index 157f00ae24f56..2404f6a88dd92 100644 --- a/lib/class-wp-block-pattern-categories-registry.php +++ b/lib/class-wp-block-pattern-categories-registry.php @@ -7,6 +7,11 @@ /** * Class used for interacting with block pattern categories. + * + * This class can be removed when plugin support requires WordPress 5.5.0+. + * + * @see https://core.trac.wordpress.org/ticket/50445 + * @see https://core.trac.wordpress.org/changeset/48156 */ final class WP_Block_Pattern_Categories_Registry { /** diff --git a/lib/class-wp-block-patterns-registry.php b/lib/class-wp-block-patterns-registry.php index dedce3f9a3f19..56a36bce386f6 100644 --- a/lib/class-wp-block-patterns-registry.php +++ b/lib/class-wp-block-patterns-registry.php @@ -7,6 +7,11 @@ /** * Class used for interacting with patterns. + * + * This class can be removed when plugin support requires WordPress 5.5.0+. + * + * @see https://core.trac.wordpress.org/ticket/50445 + * @see https://core.trac.wordpress.org/changeset/48156 */ final class WP_Block_Patterns_Registry { /** @@ -27,16 +32,28 @@ final class WP_Block_Patterns_Registry { * Registers a pattern. * * @param string $pattern_name Pattern name including namespace. - * @param array $pattern_properties Array containing the properties of the pattern: label, content. + * @param array $pattern_properties Array containing the properties of the pattern: Title, content, description, viewportWidth, categories, keywords. * @return boolean True if the pattern was registered with success and false otherwise. */ public function register( $pattern_name, $pattern_properties ) { if ( ! isset( $pattern_name ) || ! is_string( $pattern_name ) ) { - $message = __( 'Pattern name must be a string.', 'gutenberg' ); + $message = __( 'Block pattern name must be a string.', 'gutenberg' ); _doing_it_wrong( __METHOD__, $message, '7.8.0' ); return false; } + if ( ! isset( $pattern_properties['title'] ) || ! is_string( $pattern_properties['title'] ) ) { + $message = __( 'Block pattern title must be a string.', 'gutenberg' ); + _doing_it_wrong( __METHOD__, $message, '8.5.0' ); + return false; + } + + if ( ! isset( $pattern_properties['content'] ) || ! is_string( $pattern_properties['content'] ) ) { + $message = __( 'Block pattern content must be a string.', 'gutenberg' ); + _doing_it_wrong( __METHOD__, $message, '8.5.0' ); + return false; + } + $this->registered_patterns[ $pattern_name ] = array_merge( $pattern_properties, array( 'name' => $pattern_name ) @@ -54,7 +71,7 @@ public function register( $pattern_name, $pattern_properties ) { public function unregister( $pattern_name ) { if ( ! $this->is_registered( $pattern_name ) ) { /* translators: 1: Pattern name. */ - $message = sprintf( __( 'Pattern "%1$s" not found.', 'gutenberg' ), $pattern_name ); + $message = sprintf( __( 'Block pattern "%1$s" not found.', 'gutenberg' ), $pattern_name ); _doing_it_wrong( __METHOD__, $message, '7.8.0' ); return false; } diff --git a/lib/class-wp-block-styles-registry.php b/lib/class-wp-block-styles-registry.php deleted file mode 100644 index a5c2d9edae8b3..0000000000000 --- a/lib/class-wp-block-styles-registry.php +++ /dev/null @@ -1,161 +0,0 @@ - $block_style_name => $block_style_properties` multidimensional arrays. - * - * @since 6.2.0 - * @var array - */ - private $registered_block_styles = array(); - - /** - * Container for the main instance of the class. - * - * @since 6.2.0 - * @var WP_Block_Styles_Registry|null - */ - private static $instance = null; - - /** - * Registers a block style. - * - * @since 6.2.0 - * - * @param string $block_name Block type name including namespace. - * @param array $style_properties Array containing the properties of the style name, label, style (name of the stylesheet to be enqueued), inline_style (string containing the CSS to be added). - * - * @return boolean True if the block style was registered with success and false otherwise. - */ - public function register( $block_name, $style_properties ) { - - if ( ! isset( $block_name ) || ! is_string( $block_name ) ) { - $message = __( 'Block name name must be a string.', 'gutenberg' ); - _doing_it_wrong( __METHOD__, $message, '6.2.0' ); - return false; - } - - if ( ! isset( $style_properties['name'] ) || ! is_string( $style_properties['name'] ) ) { - $message = __( 'Block style name must be a string.', 'gutenberg' ); - _doing_it_wrong( __METHOD__, $message, '6.2.0' ); - return false; - } - - $block_style_name = $style_properties['name']; - - if ( ! isset( $this->registered_block_styles[ $block_name ] ) ) { - $this->registered_block_styles[ $block_name ] = array(); - } - $this->registered_block_styles[ $block_name ][ $block_style_name ] = $style_properties; - - return true; - } - - /** - * Unregisters a block style. - * - * @param string $block_name Block type name including namespace. - * @param array $block_style_name Block style name. - * - * @return boolean True if the block style was unregistered with success and false otherwise. - */ - public function unregister( $block_name, $block_style_name ) { - if ( ! $this->is_registered( $block_name, $block_style_name ) ) { - /* translators: 1: block name, 2: block style name */ - $message = sprintf( __( 'Block "%1$s" does not contain a style named "%2$s.".', 'gutenberg' ), $block_name, $block_style_name ); - _doing_it_wrong( __METHOD__, $message, '6.2.0' ); - return false; - } - - unset( $this->registered_block_styles[ $block_name ][ $block_style_name ] ); - - return true; - } - - /** - * Retrieves an array containing the properties of a registered block style. - * - * @since 6.2.0 - * - * @param string $block_name Block type name including namespace. - * @param array $block_style_name Block style name. - * - * @return array Registered block style properties. - */ - public function get_registered( $block_name, $block_style_name ) { - if ( ! $this->is_registered( $block_name, $block_style_name ) ) { - return null; - } - - return $this->registered_block_styles[ $block_name ][ $block_style_name ]; - } - - /** - * Retrieves all registered block styles. - * - * @since 6.2.0 - * - * @return array Array of arrays containing the registered block styles properties grouped per block, and per style. - */ - public function get_all_registered() { - return $this->registered_block_styles; - } - - /** - * Retrieves registered block styles for a specific block. - * - * @since 6.2.0 - * - * @param string $block_name Block type name including namespace. - * - * @return array Array whose keys are block style names and whose value are block style properties. - */ - public function get_registered_styles_for_block( $block_name ) { - if ( isset( $this->registered_block_styles[ $block_name ] ) ) { - return $this->registered_block_styles[ $block_name ]; - } - return array(); - } - - /** - * Checks if a block style is registered. - * - * @since 6.2.0 - * - * @param string $block_name Block type name including namespace. - * @param array $block_style_name Block style name. - * - * @return bool True if the block style is registered, false otherwise. - */ - public function is_registered( $block_name, $block_style_name ) { - return isset( $this->registered_block_styles[ $block_name ][ $block_style_name ] ); - } - - /** - * Utility method to retrieve the main instance of the class. - * - * The instance will be created if it does not exist yet. - * - * @since 6.2.0 - * - * @return WP_Block_Styles_Registry The main instance. - */ - public static function get_instance() { - if ( null === self::$instance ) { - self::$instance = new self(); - } - - return self::$instance; - } -} diff --git a/lib/class-wp-block.php b/lib/class-wp-block.php index ccc3f5f942307..cd02905074566 100644 --- a/lib/class-wp-block.php +++ b/lib/class-wp-block.php @@ -8,6 +8,11 @@ /** * Class representing a parsed instance of a block. * + * This class can be removed when plugin support requires WordPress 5.5.0+. + * + * @see https://core.trac.wordpress.org/ticket/49926 + * @see https://core.trac.wordpress.org/changeset/48159 + * * @property array $attributes */ class WP_Block { @@ -105,10 +110,29 @@ public function __construct( $block, $available_context = array(), $registry = n $this->block_type = $registry->get_registered( $this->name ); + if ( ! empty( $this->block_type->context ) ) { + $message = sprintf( + /* translators: 1: Block name. */ + __( 'The "context" parameter provided in block type "%s" is deprecated. Please use "uses_context" instead.', 'gutenberg' ), + $this->name + ); + _doing_it_wrong( __CLASS__, $message, '8.6.0' ); + $this->block_type->uses_context = $this->block_type->context; + } + if ( ! empty( $this->block_type->providesContext ) ) { + $message = sprintf( + /* translators: 1: Block name. */ + __( 'The "providesContext" parameter provided in block type "%s" is deprecated. Please use "provides_context".', 'gutenberg' ), + $this->name + ); + _doing_it_wrong( __CLASS__, $message, '8.6.0' ); + $this->block_type->provides_context = $this->block_type->providesContext; + } + $this->available_context = $available_context; - if ( ! empty( $this->block_type->context ) ) { - foreach ( $this->block_type->context as $context_name ) { + if ( ! empty( $this->block_type->uses_context ) ) { + foreach ( $this->block_type->uses_context as $context_name ) { if ( array_key_exists( $context_name, $this->available_context ) ) { $this->context[ $context_name ] = $this->available_context[ $context_name ]; } @@ -118,15 +142,13 @@ public function __construct( $block, $available_context = array(), $registry = n if ( ! empty( $block['innerBlocks'] ) ) { $child_context = $this->available_context; - /* phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase */ - if ( ! empty( $this->block_type->providesContext ) ) { - foreach ( $this->block_type->providesContext as $context_name => $attribute_name ) { + if ( ! empty( $this->block_type->provides_context ) ) { + foreach ( $this->block_type->provides_context as $context_name => $attribute_name ) { if ( array_key_exists( $attribute_name, $this->attributes ) ) { $child_context[ $context_name ] = $this->attributes[ $attribute_name ]; } } } - /* phpcs:enable */ $this->inner_blocks = new WP_Block_List( $block['innerBlocks'], $child_context, $registry ); } diff --git a/lib/class-wp-rest-block-directory-controller.php b/lib/class-wp-rest-block-directory-controller.php index 7ffa52a1fd767..df1f2e408506e 100644 --- a/lib/class-wp-rest-block-directory-controller.php +++ b/lib/class-wp-rest-block-directory-controller.php @@ -10,6 +10,8 @@ /** * Controller which provides REST endpoint for the blocks. * + * This class can be removed when plugin support requires WordPress 5.5.0+. + * * @since 5.5.0 * * @see WP_REST_Controller @@ -20,7 +22,7 @@ class WP_REST_Block_Directory_Controller extends WP_REST_Controller { * Constructs the controller. */ public function __construct() { - $this->namespace = '__experimental'; + $this->namespace = 'wp/v2'; $this->rest_base = 'block-directory'; } @@ -41,36 +43,6 @@ public function register_routes() { 'schema' => array( $this, 'get_public_item_schema' ), ) ); - - register_rest_route( - $this->namespace, - '/' . $this->rest_base . '/install', - array( - 'methods' => WP_REST_Server::CREATABLE, - 'callback' => array( $this, 'create_item' ), - 'permission_callback' => array( $this, 'create_item_permissions_check' ), - 'args' => array( - 'slug' => array( - 'required' => true, - ), - ), - ) - ); - - register_rest_route( - $this->namespace, - '/' . $this->rest_base . '/uninstall', - array( - 'methods' => WP_REST_Server::DELETABLE, - 'callback' => array( $this, 'delete_item' ), - 'permission_callback' => array( $this, 'delete_item_permissions_check' ), - 'args' => array( - 'slug' => array( - 'required' => true, - ), - ), - ) - ); } /** @@ -125,10 +97,6 @@ public function get_items( $request ) { $result = array(); foreach ( $response->plugins as $plugin ) { - if ( $this->find_plugin_for_slug( $plugin['slug'] ) ) { - continue; - } - $data = $this->prepare_item_for_response( $plugin, $request ); $result[] = $this->prepare_response_for_collection( $data ); } @@ -136,117 +104,6 @@ public function get_items( $request ) { return rest_ensure_response( $result ); } - /** - * Checks whether a given request has permission to install and activate plugins. - * - * @since 5.5.0 - * - * @param WP_REST_Request $request Full details about the request. - * - * @return WP_Error|bool True if the request has permission, WP_Error object otherwise. - */ - public function create_item_permissions_check( $request ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable - if ( ! current_user_can( 'install_plugins' ) || ! current_user_can( 'activate_plugins' ) ) { - return new WP_Error( - 'rest_block_directory_cannot_create', - __( 'Sorry, you are not allowed to install blocks.', 'gutenberg' ), - array( 'status' => rest_authorization_required_code() ) - ); - } - - return true; - } - - /** - * Installs and activates a plugin - * - * @since 5.5.0 - * - * @param WP_REST_Request $request Full details about the request. - * - * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure. - */ - public function create_item( $request ) { - require_once ABSPATH . 'wp-admin/includes/plugin.php'; - - $existing = $this->find_plugin_for_slug( $request['slug'] ); - - if ( $existing ) { - $activate = new WP_REST_Request( 'PUT', '/__experimental/plugins/' . substr( $existing, 0, - 4 ) ); - $activate->set_body_params( array( 'status' => 'active' ) ); - - return rest_do_request( $activate ); - } - - $inner_request = new WP_REST_Request( 'POST', '/__experimental/plugins' ); - $inner_request->set_body_params( - array( - 'slug' => $request['slug'], - 'status' => 'active', - ) - ); - - return rest_do_request( $inner_request ); - } - - /** - * Checks whether a given request has permission to remove/deactivate plugins. - * - * @since 5.5.0 - * - * @param WP_REST_Request $request Full details about the request. - * - * @return WP_Error|bool True if the request has permission, WP_Error object otherwise. - */ - public function delete_item_permissions_check( $request ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable - if ( ! current_user_can( 'delete_plugins' ) || ! current_user_can( 'deactivate_plugins' ) ) { - return new WP_Error( - 'rest_block_directory_cannot_delete', - __( 'Sorry, you are not allowed to uninstall blocks.', 'gutenberg' ), - array( 'status' => rest_authorization_required_code() ) - ); - } - - return true; - } - - /** - * Deactivates and deletes a plugin - * - * @since 5.5.0 - * - * @param WP_REST_Request $request Full details about the request. - * - * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure. - */ - public function delete_item( $request ) { - require_once ABSPATH . 'wp-admin/includes/plugin.php'; - - $slug = trim( $request->get_param( 'slug' ) ); - - if ( ! $slug ) { - return new WP_Error( 'slug_not_provided', 'Valid slug not provided.', array( 'status' => 400 ) ); - } - - $plugin_file = $this->find_plugin_for_slug( $slug ); - - if ( ! $plugin_file ) { - return new WP_Error( 'block_not_found', 'Valid slug not provided.', array( 'status' => 400 ) ); - } - - $route = '/__experimental/plugins/' . substr( $plugin_file, 0, - 4 ); - $deactivate = new WP_REST_Request( 'PUT', $route ); - $deactivate->set_body_params( array( 'status' => 'inactive' ) ); - - $deactivated = rest_do_request( $deactivate ); - - if ( $deactivated->is_error() ) { - return $deactivated->as_error(); - } - - return rest_do_request( new WP_REST_Request( 'DELETE', $route ) ); - } - /** * Parse block metadata for a block, and prepare it for an API repsonse. * @@ -277,15 +134,25 @@ public function prepare_item_for_response( $plugin, $request ) { 'assets' => array(), 'last_updated' => $plugin['last_updated'], 'humanized_updated' => sprintf( - /* translators: %s: Human-readable time difference. */ + /* translators: %s: Human-readable time difference. */ __( '%s ago', 'gutenberg' ), human_time_diff( strtotime( $plugin['last_updated'] ) ) ), ); foreach ( $plugin['block_assets'] as $asset ) { - // TODO: Return from API, not client-set. - $block['assets'][] = 'https://plugins.svn.wordpress.org/' . $plugin['slug'] . $asset; + // Allow for fully qualified URLs in future. + if ( 'https' === wp_parse_url( $asset, PHP_URL_SCHEME ) && ! empty( wp_parse_url( $asset, PHP_URL_HOST ) ) ) { + $block['assets'][] = esc_url_raw( + $asset, + array( 'https' ) + ); + } else { + $block['assets'][] = esc_url_raw( + add_query_arg( 'v', strtotime( $block['last_updated'] ), 'https://ps.w.org/' . $plugin['slug'] . $asset ), + array( 'https' ) + ); + } } $this->add_additional_fields_to_object( $block, $request ); @@ -308,7 +175,7 @@ public function prepare_item_for_response( $plugin, $request ) { protected function prepare_links( $plugin ) { $links = array( 'https://api.w.org/install-plugin' => array( - 'href' => add_query_arg( 'slug', urlencode( $plugin['slug'] ), rest_url( '__experimental/plugins' ) ), + 'href' => add_query_arg( 'slug', urlencode( $plugin['slug'] ), rest_url( 'wp/v2/plugins' ) ), ), ); @@ -316,7 +183,7 @@ protected function prepare_links( $plugin ) { if ( $plugin_file ) { $links['https://api.w.org/plugin'] = array( - 'href' => rest_url( '__experimental/plugins/' . substr( $plugin_file, 0, - 4 ) ), + 'href' => rest_url( 'wp/v2/plugins/' . substr( $plugin_file, 0, - 4 ) ), 'embeddable' => true, ); } @@ -453,8 +320,7 @@ public function get_item_schema() { public function get_collection_params() { $query_params = parent::get_collection_params(); - $query_params['context']['default'] = 'view'; - $query_params['per_page']['default'] = 3; + $query_params['context']['default'] = 'view'; $query_params['term'] = array( 'description' => __( 'Limit result set to blocks matching the search term.', 'gutenberg' ), diff --git a/lib/class-wp-rest-block-types-controller.php b/lib/class-wp-rest-block-types-controller.php index b8592a9419319..32b8a17cc45fb 100644 --- a/lib/class-wp-rest-block-types-controller.php +++ b/lib/class-wp-rest-block-types-controller.php @@ -10,6 +10,10 @@ /** * Core class used to access block types via the REST API. * + * This class can be removed when plugin support requires WordPress 5.5.0+. + * + * @see https://core.trac.wordpress.org/ticket/47620 + * * @see WP_REST_Controller */ class WP_REST_Block_Types_Controller extends WP_REST_Controller { @@ -239,21 +243,23 @@ public function prepare_item_for_response( $block_type, $request ) { $schema = $this->get_item_schema(); $extra_fields = array( - 'name' => 'name', - 'title' => 'title', - 'description' => 'description', - 'icon' => 'icon', - 'category' => 'category', - 'keywords' => 'keywords', - 'parent' => 'parent', - 'supports' => 'supports', - 'styles' => 'styles', - 'textdomain' => 'textdomain', - 'example' => 'example', - 'editor_script' => 'editor_script', - 'script' => 'script', - 'editor_style' => 'editor_style', - 'style' => 'style', + 'name' => 'name', + 'title' => 'title', + 'description' => 'description', + 'icon' => 'icon', + 'category' => 'category', + 'keywords' => 'keywords', + 'parent' => 'parent', + 'provides_context' => 'provides_context', + 'uses_context' => 'uses_context', + 'supports' => 'supports', + 'styles' => 'styles', + 'textdomain' => 'textdomain', + 'example' => 'example', + 'editor_script' => 'editor_script', + 'script' => 'script', + 'editor_style' => 'editor_style', + 'style' => 'style', ); foreach ( $extra_fields as $key => $extra_field ) { if ( rest_is_field_included( $key, $fields ) ) { @@ -337,35 +343,35 @@ public function get_item_schema() { 'title' => 'block-type', 'type' => 'object', 'properties' => array( - 'title' => array( + 'title' => array( 'description' => __( 'Title of block type.', 'gutenberg' ), 'type' => 'string', 'default' => '', 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'name' => array( + 'name' => array( 'description' => __( 'Unique name identifying the block type.', 'gutenberg' ), 'type' => 'string', 'default' => '', 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'description' => array( + 'description' => array( 'description' => __( 'Description of block type.', 'gutenberg' ), 'type' => 'string', 'default' => '', 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'icon' => array( + 'icon' => array( 'description' => __( 'Icon of block type.', 'gutenberg' ), 'type' => array( 'string', 'null' ), 'default' => null, 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'attributes' => array( + 'attributes' => array( 'description' => __( 'Block attributes.', 'gutenberg' ), 'type' => array( 'object', 'null' ), 'properties' => array(), @@ -376,7 +382,28 @@ public function get_item_schema() { 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'supports' => array( + 'provides_context' => array( + 'description' => __( 'Context provided by blocks of this type.', 'gutenberg' ), + 'type' => 'object', + 'properties' => array(), + 'additionalProperties' => array( + 'type' => 'string', + ), + 'default' => array(), + 'context' => array( 'embed', 'view', 'edit' ), + 'readonly' => true, + ), + 'uses_context' => array( + 'description' => __( 'Context values inherited by blocks of this type.', 'gutenberg' ), + 'type' => 'array', + 'default' => array(), + 'items' => array( + 'type' => 'string', + ), + 'context' => array( 'embed', 'view', 'edit' ), + 'readonly' => true, + ), + 'supports' => array( 'description' => __( 'Block supports.', 'gutenberg' ), 'type' => 'object', 'default' => array(), @@ -384,49 +411,49 @@ public function get_item_schema() { 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'category' => array( + 'category' => array( 'description' => __( 'Block category.', 'gutenberg' ), 'type' => array( 'string', null ), 'default' => null, 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'is_dynamic' => array( + 'is_dynamic' => array( 'description' => __( 'Is the block dynamically rendered.', 'gutenberg' ), 'type' => 'boolean', 'default' => false, 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'editor_script' => array( + 'editor_script' => array( 'description' => __( 'Editor script handle.', 'gutenberg' ), 'type' => array( 'string', null ), 'default' => null, 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'script' => array( + 'script' => array( 'description' => __( 'Public facing script handle.', 'gutenberg' ), 'type' => array( 'string', null ), 'default' => null, 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'editor_style' => array( + 'editor_style' => array( 'description' => __( 'Editor style handle.', 'gutenberg' ), 'type' => array( 'string', null ), 'default' => null, 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'style' => array( + 'style' => array( 'description' => __( 'Public facing style handle.', 'gutenberg' ), 'type' => array( 'string', null ), 'default' => null, 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'styles' => array( + 'styles' => array( 'description' => __( 'Block style variations.', 'gutenberg' ), 'type' => 'array', 'properties' => array(), @@ -437,14 +464,14 @@ public function get_item_schema() { 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'textdomain' => array( + 'textdomain' => array( 'description' => __( 'Public text domain.', 'gutenberg' ), 'type' => array( 'string', 'null' ), 'default' => null, 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'parent' => array( + 'parent' => array( 'description' => __( 'Parent blocks.', 'gutenberg' ), 'type' => array( 'array', 'null' ), 'items' => array( @@ -454,7 +481,7 @@ public function get_item_schema() { 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'keywords' => array( + 'keywords' => array( 'description' => __( 'Block keywords.', 'gutenberg' ), 'type' => 'array', 'items' => array( @@ -464,7 +491,7 @@ public function get_item_schema() { 'context' => array( 'embed', 'view', 'edit' ), 'readonly' => true, ), - 'example' => array( + 'example' => array( 'description' => __( 'Block example.', 'gutenberg' ), 'type' => array( 'object', 'null' ), 'default' => null, diff --git a/lib/class-wp-rest-image-editor-controller.php b/lib/class-wp-rest-image-editor-controller.php index 8be0dd425834e..66c8531e02d7e 100644 --- a/lib/class-wp-rest-image-editor-controller.php +++ b/lib/class-wp-rest-image-editor-controller.php @@ -1,17 +1,12 @@ namespace = '__experimental'; - $this->rest_base = '/richimage/(?P[\d]+)'; - $this->editor = new Image_Editor(); + $this->namespace = 'wp/v2'; + $this->rest_base = 'media'; } /** @@ -42,75 +36,43 @@ public function __construct() { public function register_routes() { register_rest_route( $this->namespace, - $this->rest_base . '/rotate', + '/' . $this->rest_base . '/(?P[\d]+)/edit', array( array( 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'rotate_image' ), + 'callback' => array( $this, 'apply_edits' ), 'permission_callback' => array( $this, 'permission_callback' ), 'args' => array( - 'angle' => array( - 'description' => __( 'Rotation angle', 'gutenberg' ), - 'type' => 'integer', - 'required' => true, + 'rotation' => array( + 'type' => 'integer', ), - ), - ), - ) - ); - register_rest_route( - $this->namespace, - $this->rest_base . '/flip', - array( - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'flip_image' ), - 'permission_callback' => array( $this, 'permission_callback' ), - 'args' => array( - 'direction' => array( - 'description' => __( 'Flip direction', 'gutenberg' ), - 'type' => 'string', - 'enum' => array( 'vertical', 'horizontal' ), - 'required' => true, + // Src is required to check for correct $image_meta. + 'src' => array( + 'type' => 'string', + 'required' => true, ), - ), - ), - ) - ); - register_rest_route( - $this->namespace, - $this->rest_base . '/crop', - array( - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'crop_image' ), - 'permission_callback' => array( $this, 'permission_callback' ), - 'args' => array( - 'crop_x' => array( - 'description' => __( 'Crop offset percentage from left', 'gutenberg' ), - 'type' => 'number', - 'minimum' => 0, - 'required' => true, + // Crop values are in percents. + 'x' => array( + 'type' => 'number', + 'minimum' => 0, + 'maximum' => 100, ), - 'crop_y' => array( - 'description' => __( 'Crop offset percentage from top', 'gutenberg' ), - 'type' => 'number', - 'minimum' => 0, - 'required' => true, + 'y' => array( + 'type' => 'number', + 'minimum' => 0, + 'maximum' => 100, ), - 'crop_width' => array( - 'description' => __( 'Crop width percentage', 'gutenberg' ), - 'type' => 'number', - 'minimum' => 1, - 'required' => true, + 'width' => array( + 'type' => 'number', + 'minimum' => 0, + 'maximum' => 100, ), - 'crop_height' => array( - 'description' => __( 'Crop height percentage', 'gutenberg' ), - 'type' => 'number', - 'minimum' => 1, - 'required' => true, + 'height' => array( + 'type' => 'number', + 'minimum' => 0, + 'maximum' => 100, ), ), ), @@ -128,55 +90,273 @@ public function register_routes() { * @return true|WP_Error True if the request has read access, WP_Error object otherwise. */ public function permission_callback( $request ) { - if ( ! current_user_can( 'edit_post', $request['media_id'] ) ) { - return new WP_Error( 'rest_cannot_edit_image', __( 'Sorry, you are not allowed to edit images.', 'gutenberg' ), array( 'status' => rest_authorization_required_code() ) ); + if ( ! current_user_can( 'edit_post', $request['id'] ) ) { + $error = __( 'Sorry, you are not allowed to edit images.', 'gutenberg' ); + return new WP_Error( 'rest_cannot_edit_image', $error, array( 'status' => rest_authorization_required_code() ) ); + } + + if ( ! current_user_can( 'upload_files' ) ) { + return new WP_Error( 'rest_cannot_edit_image', __( 'Sorry, you are not allowed to upload media on this site.', 'gutenberg' ), array( 'status' => rest_authorization_required_code() ) ); } return true; } /** - * Rotates an image. + * Applies all edits in one go. * * @since 7.x ? * @access public * * @param WP_REST_Request $request Full details about the request. - * @return array|WP_Error If successful image JSON for the modified image, otherwise a WP_Error. + * @return WP_REST_Response|WP_Error If successful image JSON for the modified image, otherwise a WP_Error. */ - public function rotate_image( $request ) { - $modifier = new Image_Editor_Rotate( $request['angle'] ); + public function apply_edits( $request ) { + require_once ABSPATH . 'wp-admin/includes/image.php'; - return $this->editor->modify_image( $request['media_id'], $modifier ); - } + $attachment_id = $request['id']; - /** - * Flips/mirrors an image. - * - * @since 7.x ? - * @access public - * - * @param WP_REST_Request $request Full details about the request. - * @return array|WP_Error If successful image JSON for the modified image, otherwise a WP_Error. - */ - public function flip_image( $request ) { - $modifier = new Image_Editor_Flip( $request['direction'] ); + // This also confirms the attachment is an image. + $image_file = wp_get_original_image_path( $attachment_id ); + $image_meta = wp_get_attachment_metadata( $attachment_id ); - return $this->editor->modify_image( $request['media_id'], $modifier ); - } + if ( function_exists( 'wp_image_file_matches_image_meta' ) ) { + if ( + ! $image_meta || + ! $image_file || + ! wp_image_file_matches_image_meta( $request['src'], $image_meta ) + ) { + return new WP_Error( + 'rest_unknown_attachment', + __( 'Unable to get meta information for file.', 'gutenberg' ), + array( 'status' => 404 ) + ); + } + } else { + // Back-compat for WP versions < 5.5. + if ( ! $image_meta || ! $image_file ) { + return new WP_Error( + 'rest_unknown_attachment', + __( 'Unable to get meta information for file.', 'gutenberg' ), + array( 'status' => 404 ) + ); + } else { + $match = false; + $image_src = $request['src']; - /** - * Crops an image. - * - * @since 7.x ? - * @access public - * - * @param WP_REST_Request $request Full details about the request. - * @return array|WP_Error If successful image JSON for the modified image, otherwise a WP_Error. - */ - public function crop_image( $request ) { - $modifier = new Image_Editor_Crop( $request['crop_x'], $request['crop_y'], $request['crop_width'], $request['crop_height'] ); + if ( isset( $image_meta['file'] ) && strlen( $image_meta['file'] ) > 4 ) { + // Remove quiery args. + list( $image_src ) = explode( '?', $image_src ); + + // Check if the relative image path from the image meta is at the end of $image_src. + if ( strrpos( $image_src, $image_meta['file'] ) === strlen( $image_src ) - strlen( $image_meta['file'] ) ) { + $match = true; + } + + if ( ! empty( $image_meta['sizes'] ) ) { + // Retrieve the uploads sub-directory from the full size image. + $dirname = _wp_get_attachment_relative_path( $image_meta['file'] ); + + if ( $dirname ) { + $dirname = trailingslashit( $dirname ); + } + + foreach ( $image_meta['sizes'] as $image_size_data ) { + $relative_path = $dirname . $image_size_data['file']; + + if ( strrpos( $image_src, $relative_path ) === strlen( $image_src ) - strlen( $relative_path ) ) { + $match = true; + break; + } + } + } + } + + if ( ! $match ) { + return new WP_Error( + 'rest_unknown_attachment', + __( 'Unable to get meta information for file.', 'gutenberg' ), + array( 'status' => 404 ) + ); + } + } + } + + $supported_types = array( 'image/jpeg', 'image/png', 'image/gif' ); + $mime_type = get_post_mime_type( $attachment_id ); + if ( ! in_array( $mime_type, $supported_types, true ) ) { + return new WP_Error( + 'rest_cannot_edit_file_type', + __( 'This type of file cannot be edited.', 'gutenberg' ), + array( 'status' => 400 ) + ); + } + + // Check if we need to do anything. + $rotate = 0; + $crop = false; + + if ( ! empty( $request['rotation'] ) ) { + // Rotation direction: clockwise vs. counter clockwise. + $rotate = 0 - (int) $request['rotation']; + } + + if ( isset( $request['x'], $request['y'], $request['width'], $request['height'] ) ) { + $crop = true; + } + + if ( ! $rotate && ! $crop ) { + $error = __( 'The image was not edited. Edit the image before applying the changes.', 'gutenberg' ); + return new WP_Error( 'rest_image_not_edited', $error, array( 'status' => 400 ) ); + } + + // If the file doesn't exist, attempt a URL fopen on the src link. + // This can occur with certain file replication plugins. + // Keep the original file path to get a modified name later. + $image_file_to_edit = $image_file; + if ( ! file_exists( $image_file_to_edit ) ) { + $image_file_to_edit = _load_image_to_edit_path( $attachment_id ); + } + + $image_editor = wp_get_image_editor( $image_file_to_edit ); + + if ( is_wp_error( $image_editor ) ) { + // This image cannot be edited. + $error = __( 'Unable to edit this image.', 'gutenberg' ); + return new WP_Error( 'rest_unknown_image_file_type', $error, array( 'status' => 500 ) ); + } + + if ( 0 !== $rotate ) { + $result = $image_editor->rotate( $rotate ); + + if ( is_wp_error( $result ) ) { + $error = __( 'Unable to rotate this image.', 'gutenberg' ); + return new WP_Error( 'rest_image_rotation_failed', $error, array( 'status' => 500 ) ); + } + } + + if ( $crop ) { + $size = $image_editor->get_size(); + + $crop_x = round( ( $size['width'] * floatval( $request['x'] ) ) / 100.0 ); + $crop_y = round( ( $size['height'] * floatval( $request['y'] ) ) / 100.0 ); + $width = round( ( $size['width'] * floatval( $request['width'] ) ) / 100.0 ); + $height = round( ( $size['height'] * floatval( $request['height'] ) ) / 100.0 ); + + $result = $image_editor->crop( $crop_x, $crop_y, $width, $height ); + + if ( is_wp_error( $result ) ) { + $error = __( 'Unable to crop this image.', 'gutenberg' ); + return new WP_Error( 'rest_image_crop_failed', $error, array( 'status' => 500 ) ); + } + } + + // Calculate the file name. + $image_ext = pathinfo( $image_file, PATHINFO_EXTENSION ); + $image_name = wp_basename( $image_file, ".{$image_ext}" ); + + // Do not append multiple `-edited` to the file name. + // The user may be editing a previously edited image. + if ( preg_match( '/-edited(-\d+)?$/', $image_name ) ) { + // Remove any `-1`, `-2`, etc. `wp_unique_filename()` will add the proper number. + $image_name = preg_replace( '/-edited(-\d+)?$/', '-edited', $image_name ); + } else { + // Append `-edited` before the extension. + $image_name .= '-edited'; + } + + $filename = "{$image_name}.{$image_ext}"; + + // Create the uploads sub-directory if needed. + $uploads = wp_upload_dir(); + + // Make the file name unique in the (new) upload directory. + $filename = wp_unique_filename( $uploads['path'], $filename ); + + // Save to disk. + $saved = $image_editor->save( $uploads['path'] . "/$filename" ); + + if ( is_wp_error( $saved ) ) { + return $saved; + } + + // Create new attachment post. + $attachment_post = array( + 'post_mime_type' => $saved['mime-type'], + 'guid' => $uploads['url'] . "/$filename", + 'post_title' => $filename, + 'post_content' => '', + ); + + $new_attachment_id = wp_insert_attachment( wp_slash( $attachment_post ), $saved['path'], 0, true ); + + if ( is_wp_error( $new_attachment_id ) ) { + if ( 'db_update_error' === $new_attachment_id->get_error_code() ) { + $new_attachment_id->add_data( array( 'status' => 500 ) ); + } else { + $new_attachment_id->add_data( array( 'status' => 400 ) ); + } + + return $new_attachment_id; + } + + if ( defined( 'REST_REQUEST' ) && REST_REQUEST ) { + // Set a custom header with the attachment_id. + // Used by the browser/client to resume creating image sub-sizes after a PHP fatal error. + header( 'X-WP-Upload-Attachment-ID: ' . $new_attachment_id ); + } + + // Generate image sub-sizes and meta. + $new_image_meta = wp_generate_attachment_metadata( $new_attachment_id, $saved['path'] ); + + // Copy the EXIF metadata from the original attachment if not generated for the edited image. + if ( ! empty( $image_meta['image_meta'] ) ) { + $empty_image_meta = true; + + if ( isset( $new_image_meta['image_meta'] ) && is_array( $new_image_meta['image_meta'] ) ) { + $empty_image_meta = empty( array_filter( array_values( $new_image_meta['image_meta'] ) ) ); + } + + if ( $empty_image_meta ) { + $new_image_meta['image_meta'] = $image_meta['image_meta']; + } + } + + // Reset orientation. At this point the image is edited and orientation is correct. + if ( ! empty( $new_image_meta['image_meta']['orientation'] ) ) { + $new_image_meta['image_meta']['orientation'] = 1; + } + + // The attachment_id may change if the site is exported and imported. + $new_image_meta['parent_image'] = array( + 'attachment_id' => $attachment_id, + // Path to the originally uploaded image file relative to the uploads directory. + 'file' => _wp_relative_upload_path( $image_file ), + ); + + /** + * Filters the updated attachment meta data. + * + * @since 5.5.0 + * + * @param array $data Array of updated attachment meta data. + * @param int $new_attachment_id Attachment post ID. + * @param int $attachment_id Original Attachment post ID. + */ + $new_image_meta = apply_filters( 'wp_edited_attachment_metadata', $new_image_meta, $new_attachment_id, $attachment_id ); + + wp_update_attachment_metadata( $new_attachment_id, $new_image_meta ); + + $path = '/wp/v2/media/' . $new_attachment_id; + $new_request = new WP_REST_Request( 'GET', $path ); + $new_request->set_query_params( array( 'context' => 'edit' ) ); + $response = rest_do_request( $new_request ); + + if ( ! $response->is_error() ) { + $response->set_status( 201 ); + $response->header( 'Location', rest_url( $path ) ); + } - return $this->editor->modify_image( $request['media_id'], $modifier ); + return $response; } } diff --git a/lib/class-wp-rest-menu-items-controller.php b/lib/class-wp-rest-menu-items-controller.php index 1e1b84975abeb..f6cf192a80722 100644 --- a/lib/class-wp-rest-menu-items-controller.php +++ b/lib/class-wp-rest-menu-items-controller.php @@ -317,6 +317,7 @@ protected function prepare_item_for_database( $request ) { 'menu-item-title' => $menu_item_obj->title, 'menu-item-url' => $menu_item_obj->url, 'menu-item-description' => $menu_item_obj->description, + 'menu-item-content' => $menu_item_obj->menu_item_content, 'menu-item-attr-title' => $menu_item_obj->attr_title, 'menu-item-target' => $menu_item_obj->target, // Stored in the database as a string. @@ -337,6 +338,7 @@ protected function prepare_item_for_database( $request ) { 'menu-item-title' => '', 'menu-item-url' => '', 'menu-item-description' => '', + 'menu-item-content' => '', 'menu-item-attr-title' => '', 'menu-item-target' => '', 'menu-item-classes' => '', @@ -390,6 +392,15 @@ protected function prepare_item_for_database( $request ) { } } + // Nav menu content. + if ( ! empty( $schema['properties']['content'] ) && isset( $request['content'] ) ) { + if ( is_string( $request['content'] ) ) { + $prepared_nav_item['menu-item-content'] = $request['content']; + } elseif ( isset( $request['content']['raw'] ) ) { + $prepared_nav_item['menu-item-content'] = $request['content']['raw']; + } + } + // Check if object id exists before saving. if ( ! $prepared_nav_item['menu-item-object'] ) { // If taxonony, check if term exists. @@ -429,6 +440,13 @@ protected function prepare_item_for_database( $request ) { } } + // If menu item is type block, then content is required. + if ( 'block' === $prepared_nav_item['menu-item-type'] ) { + if ( empty( $prepared_nav_item['menu-item-content'] ) ) { + return new WP_Error( 'rest_content_required', __( 'Content required if menu item of type block.', 'gutenberg' ), array( 'status' => 400 ) ); + } + } + // If menu id is set, valid the value of menu item position and parent id. if ( ! empty( $prepared_nav_item['menu-id'] ) ) { // Check if nav menu is valid. @@ -551,9 +569,15 @@ public function prepare_item_for_response( $post, $request ) { if ( in_array( 'title', $fields, true ) ) { add_filter( 'protected_title_format', array( $this, 'protected_title_format' ) ); + /** This filter is documented in wp-includes/post-template.php */ + $title = apply_filters( 'the_title', $menu_item->title, $menu_item->ID ); + + /** This filter is documented in wp-includes/class-walker-nav-menu.php */ + $title = apply_filters( 'nav_menu_item_title', $title, $menu_item, null, 0 ); + $data['title'] = array( - 'raw' => $menu_item->post_title, - 'rendered' => $menu_item->title, + 'raw' => $menu_item->title, + 'rendered' => $title, ); remove_filter( 'protected_title_format', array( $this, 'protected_title_format' ) ); @@ -596,6 +620,20 @@ public function prepare_item_for_response( $post, $request ) { $data['object_id'] = absint( $menu_item->object_id ); } + if ( rest_is_field_included( 'content', $fields ) ) { + $data['content'] = array(); + } + if ( rest_is_field_included( 'content.raw', $fields ) ) { + $data['content']['raw'] = $menu_item->content; + } + if ( rest_is_field_included( 'content.rendered', $fields ) ) { + /** This filter is documented in wp-includes/post-template.php */ + $data['content']['rendered'] = apply_filters( 'the_content', $menu_item->content ); + } + if ( rest_is_field_included( 'content.block_version', $fields ) ) { + $data['content']['block_version'] = block_version( $menu_item->content ); + } + if ( in_array( 'parent', $fields, true ) ) { // Same as post_parent, expose as integer. $data['parent'] = absint( $menu_item->menu_item_parent ); @@ -787,7 +825,7 @@ public function get_item_schema() { $schema['properties']['type'] = array( 'description' => __( 'The family of objects originally represented, such as "post_type" or "taxonomy".', 'gutenberg' ), 'type' => 'string', - 'enum' => array( 'taxonomy', 'post_type', 'post_type_archive', 'custom' ), + 'enum' => array( 'taxonomy', 'post_type', 'post_type_archive', 'custom', 'block' ), 'context' => array( 'view', 'edit', 'embed' ), 'default' => 'custom', ); @@ -861,6 +899,35 @@ public function get_item_schema() { 'default' => 0, ); + $schema['properties']['content'] = array( + 'description' => __( 'HTML content to display for this block menu item.', 'gutenberg' ), + 'context' => array( 'view', 'edit', 'embed' ), + 'type' => 'object', + 'arg_options' => array( + 'sanitize_callback' => null, // Note: sanitization implemented in self::prepare_item_for_database(). + 'validate_callback' => null, // Note: validation implemented in self::prepare_item_for_database(). + ), + 'properties' => array( + 'raw' => array( + 'description' => __( 'HTML content, as it exists in the database.', 'gutenberg' ), + 'type' => 'string', + 'context' => array( 'edit' ), + ), + 'rendered' => array( + 'description' => __( 'HTML content, transformed for display.', 'gutenberg' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'block_version' => array( + 'description' => __( 'Version of the block format used in the HTML content.', 'gutenberg' ), + 'type' => 'integer', + 'context' => array( 'edit' ), + 'readonly' => true, + ), + ), + ); + $schema['properties']['target'] = array( 'description' => __( 'The target attribute of the link element for this menu item.', 'gutenberg' ), 'type' => 'string', diff --git a/lib/class-wp-rest-menus-controller.php b/lib/class-wp-rest-menus-controller.php index 2c0a782f8ed21..dc358ea850f1d 100644 --- a/lib/class-wp-rest-menus-controller.php +++ b/lib/class-wp-rest-menus-controller.php @@ -76,7 +76,8 @@ protected function get_term( $id ) { return $term; } - $nav_term = wp_get_nav_menu_object( $term ); + $nav_term = wp_get_nav_menu_object( $term ); + $nav_term->auto_add = $this->get_menu_auto_add( $nav_term->term_id ); return $nav_term; } @@ -94,6 +95,10 @@ public function create_item_permissions_check( $request ) { if ( is_wp_error( $check ) ) { return $check; } + $check = $this->check_set_auto_add_permission( $request ); + if ( is_wp_error( $check ) ) { + return $check; + } return parent::create_item_permissions_check( $request ); } @@ -110,6 +115,10 @@ public function update_item_permissions_check( $request ) { if ( is_wp_error( $check ) ) { return $check; } + $check = $this->check_set_auto_add_permission( $request ); + if ( is_wp_error( $check ) ) { + return $check; + } return parent::update_item_permissions_check( $request ); } @@ -119,7 +128,7 @@ public function update_item_permissions_check( $request ) { * * @param WP_REST_Request $request The request object with post and locations data. * - * @return bool Whether the current user can assign the provided terms. + * @return bool|WP_Error Whether the current user can assign the provided terms. */ protected function check_assign_locations_permission( $request ) { if ( ! isset( $request['locations'] ) ) { @@ -146,6 +155,25 @@ protected function check_assign_locations_permission( $request ) { return true; } + /** + * Checks whether current user can set auto add pages. + * + * @param WP_REST_Request $request The request object with post and locations data. + * + * @return true|WP_Error Whether the current user can assign the provided terms. + */ + protected function check_set_auto_add_permission( $request ) { + if ( ! isset( $request['auto_add'] ) ) { + return true; + } + + if ( ! current_user_can( 'edit_theme_options' ) ) { + return new WP_Error( 'rest_cannot_set_auto_add', __( 'Sorry, you are not allowed to set auto add pages.', 'gutenberg' ), array( 'status' => rest_authorization_required_code() ) ); + } + + return true; + } + /** * Prepares a single term output for response. * @@ -156,8 +184,25 @@ protected function check_assign_locations_permission( $request ) { */ public function prepare_item_for_response( $term, $request ) { $nav_menu = wp_get_nav_menu_object( $term ); + $response = parent::prepare_item_for_response( $nav_menu, $request ); + + $fields = $this->get_fields_for_response( $request ); + $data = $response->get_data(); + + if ( in_array( 'auto_add', $fields, true ) ) { + $auto_add = $this->get_menu_auto_add( $nav_menu->term_id ); + $data['auto_add'] = $auto_add; + } + + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); - return parent::prepare_item_for_response( $nav_menu, $request ); + $response = rest_ensure_response( $data ); + $response->add_links( $this->prepare_links( $term ) ); + + /** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */ + return apply_filters( "rest_prepare_{$this->taxonomy}", $response, $term, $request ); } /** @@ -276,6 +321,8 @@ public function create_item( $request ) { return $locations_update; } + $this->handle_auto_add( $term->term_id, $request ); + $fields_update = $this->update_additional_fields_for_object( $term, $request ); if ( is_wp_error( $fields_update ) ) { @@ -362,6 +409,8 @@ public function update_item( $request ) { return $locations_update; } + $this->handle_auto_add( $term->term_id, $request ); + $fields_update = $this->update_additional_fields_for_object( $term, $request ); if ( is_wp_error( $fields_update ) ) { @@ -431,6 +480,57 @@ public function delete_item( $request ) { return $response; } + /** + * Returns the value of a menu's auto_add + * + * @param int $menu_id The menu id to update the location form. + * + * @return bool The value of auto_add. + */ + function get_menu_auto_add( $menu_id ) { + $nav_menu_option = (array) get_option( 'nav_menu_options', array( 'auto_add' => array() ) ); + $check = in_array( $menu_id, $nav_menu_option['auto_add'], true ); + + return $check; + } + + /** + * Updates the menu's auto add from a REST request. + * + * @param int $menu_id The menu id to update the location form. + * @param WP_REST_Request $request The request object with menu and locations data. + * + * @return bool True if the auto update was successfully updated. + */ + function handle_auto_add( $menu_id, $request ) { + if ( ! isset( $request['auto_add'] ) ) { + return true; + } + + $nav_menu_option = (array) get_option( 'nav_menu_options', array( 'auto_add' => array() ) ); + + if ( ! isset( $nav_menu_option['auto_add'] ) ) { + $nav_menu_option['auto_add'] = array(); + } + + $auto_add = $request['auto_add']; + + $i = array_search( $menu_id, $nav_menu_option['auto_add'], true ); + + if ( $auto_add && false === $i ) { + $nav_menu_option['auto_add'][] = $menu_id; + } elseif ( ! $auto_add && false !== $i ) { + array_splice( $nav_menu_option['auto_add'], $i, 1 ); + } + + $update = update_option( 'nav_menu_options', $nav_menu_option ); + + /** This action is documented in wp-includes/nav-menu.php */ + do_action( 'wp_update_nav_menu', $menu_id ); + + return $update; + } + /** * Updates the menu's locations from a REST request. * @@ -485,6 +585,12 @@ public function get_item_schema() { 'context' => array( 'view', 'edit' ), ); + $schema['properties']['auto_add'] = array( + 'description' => __( 'Whether to automatically add top level pages to this menu.', 'gutenberg' ), + 'context' => array( 'view', 'edit' ), + 'type' => 'boolean', + ); + return $schema; } } diff --git a/lib/class-wp-rest-plugins-controller.php b/lib/class-wp-rest-plugins-controller.php index 492c03a50644f..49a55192dad20 100644 --- a/lib/class-wp-rest-plugins-controller.php +++ b/lib/class-wp-rest-plugins-controller.php @@ -10,6 +10,8 @@ /** * Core class to access plugins via the REST API. * + * This class can be removed when plugin support requires WordPress 5.5.0+. + * * @since 5.5.0 * * @see WP_REST_Controller @@ -24,7 +26,7 @@ class WP_REST_Plugins_Controller extends WP_REST_Controller { * @since 5.5.0 */ public function __construct() { - $this->namespace = '__experimental'; + $this->namespace = 'wp/v2'; $this->rest_base = 'plugins'; } @@ -531,10 +533,10 @@ public function delete_item( $request ) { */ public function prepare_item_for_response( $item, $request ) { $item = _get_plugin_data_markup_translate( $item['_file'], $item, false ); - $marked = _get_plugin_data_markup_translate( $item['_file'], $item, true, false ); + $marked = _get_plugin_data_markup_translate( $item['_file'], $item, true ); $data = array( - 'plugin' => $item['_file'], + 'plugin' => substr( $item['_file'], 0, - 4 ), 'status' => $this->get_plugin_status( $item['_file'] ), 'name' => $item['Name'], 'plugin_uri' => $item['PluginURI'], diff --git a/lib/class-wp-rest-post-format-search-handler.php b/lib/class-wp-rest-post-format-search-handler.php new file mode 100644 index 0000000000000..e13bbbfab3228 --- /dev/null +++ b/lib/class-wp-rest-post-format-search-handler.php @@ -0,0 +1,120 @@ +type = 'post-format'; + } + + /** + * Searches the object type content for a given search request. + * + * @param WP_REST_Request $request Full REST request. + * @return array Associative array containing an `WP_REST_Search_Handler::RESULT_IDS` containing + * an array of found IDs and `WP_REST_Search_Handler::RESULT_TOTAL` containing the + * total count for the matching search results. + */ + public function search_items( WP_REST_Request $request ) { + $format_strings = get_post_format_strings(); + $format_slugs = array_keys( $format_strings ); + + $query_args = array(); + + if ( ! empty( $request['search'] ) ) { + $query_args['search'] = $request['search']; + } + + /** + * Filters the query arguments for a search request. + * + * Enables adding extra arguments or setting defaults for a post format search request. + * + * @param array $query_args Key value array of query var to query value. + * @param WP_REST_Request $request The request used. + */ + $query_args = apply_filters( 'rest_post_format_search_query', $query_args, $request ); + + $found_ids = array(); + foreach ( $format_slugs as $index => $format_slug ) { + if ( ! empty( $query_args['search'] ) ) { + $format_string = get_post_format_string( $format_slug ); + $format_slug_match = stripos( $format_slug, $query_args['search'] ) !== false; + $format_string_match = stripos( $format_string, $query_args['search'] ) !== false; + if ( ! $format_slug_match && ! $format_string_match ) { + continue; + } + } + + $format_link = get_post_format_link( $format_slug ); + if ( $format_link ) { + // Formats don't have an ID, so fake one using the array index. + $found_ids[] = $index + 1; + } + } + + $page = (int) $request['page']; + $per_page = (int) $request['per_page']; + + return array( + self::RESULT_IDS => array_slice( $found_ids, ( $page - 1 ) * $per_page, $per_page ), + self::RESULT_TOTAL => count( $found_ids ), + ); + } + + /** + * Prepares the search result for a given ID. + * + * @param int $id Item ID. + * @param array $fields Fields to include for the item. + * @return array Associative array containing all fields for the item. + */ + public function prepare_item( $id, array $fields ) { + $format_strings = get_post_format_strings(); + $format_slugs = array_keys( $format_strings ); + $format_slug = $format_slugs[ $id - 1 ]; + + $data = array(); + + if ( in_array( WP_REST_Search_Controller::PROP_ID, $fields, true ) ) { + $data[ WP_REST_Search_Controller::PROP_ID ] = $id; + } + + if ( in_array( WP_REST_Search_Controller::PROP_TITLE, $fields, true ) ) { + $data[ WP_REST_Search_Controller::PROP_TITLE ] = get_post_format_string( $format_slug ); + } + + if ( in_array( WP_REST_Search_Controller::PROP_URL, $fields, true ) ) { + $data[ WP_REST_Search_Controller::PROP_URL ] = get_post_format_link( $format_slug ); + } + + if ( in_array( WP_REST_Search_Controller::PROP_TYPE, $fields, true ) ) { + $data[ WP_REST_Search_Controller::PROP_TYPE ] = $this->type; + } + + return $data; + } + + /** + * Prepares links for the search result. + * + * @param string $id Item ID. + * @return array Links for the given item. + */ + public function prepare_item_links( $id ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable + return array(); + } + +} diff --git a/lib/class-wp-rest-sidebars-controller.php b/lib/class-wp-rest-sidebars-controller.php new file mode 100644 index 0000000000000..16b827e70ad17 --- /dev/null +++ b/lib/class-wp-rest-sidebars-controller.php @@ -0,0 +1,635 @@ +. + * + * @author Martin Pettersson + * @copyright 2015 Martin Pettersson + * @license GPLv2 + * @link https://github.com/martin-pettersson/wp-rest-api-sidebars + * @package gutenberg + */ + +/** + * Class Sidebars_Controller + * + * @package WP_API_Sidebars\Controllers + */ +class WP_REST_Sidebars_Controller extends WP_REST_Controller { + + /** + * Plugins controller constructor. + * + * @since 5.5.0 + */ + public function __construct() { + $this->namespace = '__experimental'; + $this->rest_base = 'sidebars'; + } + + /** + * Registers the controllers routes. + * + * @return void + */ + public function register_routes() { + // Lists all sidebars. + register_rest_route( + $this->namespace, + '/' . $this->rest_base, + array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'permissions_check' ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + + // Lists/updates a single sidebar based on the given id. + register_rest_route( + $this->namespace, + '/' . $this->rest_base . '/(?P[\w-]+)', + array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'permissions_check' ), + 'args' => array( + 'id' => array( + 'description' => __( 'The id of a registered sidebar', 'gutenberg' ), + 'type' => 'string', + 'validate_callback' => function ( $id ) { + return self::get_sidebar( $id )[0]; + }, + ), + ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'update_item' ), + 'permission_callback' => array( $this, 'permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Checks if the user has permissions to make the request. + * + * @return true|WP_Error True if the request has read access, WP_Error object otherwise. + * @since 5.6.0 + * @access public + */ + public function permissions_check() { + // Verify if the current user has edit_theme_options capability. + // This capability is required to access the widgets screen. + if ( ! current_user_can( 'edit_theme_options' ) ) { + return new WP_Error( + 'widgets_cannot_access', + __( 'Sorry, you are not allowed to access widgets on this site.', 'gutenberg' ), + array( + 'status' => rest_authorization_required_code(), + ) + ); + } + + return true; + } + + + /** + * Updates the sidebar. + * + * @param WP_REST_Request $request The request instance. + * + * @return WP_REST_Response + * @global array $wp_registered_widget_updates + */ + public function update_item( $request ) { + global $wp_registered_widget_updates, $wp_registered_widgets; + $sidebar_id = $request['id']; + $input_widgets = $request['widgets']; + + // Initialize $numbers. + $numbers = array(); + foreach ( $wp_registered_widget_updates as $id_base => $control ) { + if ( is_array( $control['callback'] ) ) { + $numbers[ $id_base ] = $control['callback'][0]->number + 1; + } + } + + // Create and update widgets. + $sidebar_widgets_ids = array(); + foreach ( $input_widgets as $input_widget ) { + ob_start(); + if ( isset( $input_widget['id_base'] ) && isset( $wp_registered_widget_updates[ $input_widget['id_base'] ] ) ) { + // Class-based widget. + $update_control = $wp_registered_widget_updates[ $input_widget['id_base'] ]; + if ( ! isset( $input_widget['id'] ) ) { + $number = $numbers[ $input_widget['id_base'] ] ++; + $id = $input_widget['id_base'] . '-' . $number; + + $input_widget['id'] = $id; + $input_widget['number'] = $number; + } + $field = 'widget-' . $input_widget['id_base']; + $number = $input_widget['number']; + $_POST = $input_widget; + $_POST[ $field ][ $number ] = wp_slash( $input_widget['settings'] ); + call_user_func( $update_control['callback'] ); + $update_control['callback'][0]->updated = false; + + // Just because we saved new widget doesn't mean it was added to $wp_registered_widgets. + // Let's make sure it's there so that it's included in the response. + if ( ! isset( $wp_registered_widgets[ $input_widget['id'] ] ) ) { + $first_widget_id = substr( $input_widget['id'], 0, strrpos( $input_widget['id'], '-' ) ) . '-1'; + + if ( isset( $wp_registered_widgets[ $first_widget_id ] ) ) { + $wp_registered_widgets[ $input_widget['id'] ] = $wp_registered_widgets[ $first_widget_id ]; + $widget_class = get_class( $update_control['callback'][0] ); + $new_object = new $widget_class( + $input_widget['id_base'], + $input_widget['name'], + $input_widget['settings'] + ); + $new_object->_register(); + $wp_registered_widgets[ $input_widget['id'] ]['callback'][0] = $new_object; + } + } + } else { + $registered_widget_id = null; + if ( isset( $wp_registered_widget_updates[ $input_widget['id'] ] ) ) { + $registered_widget_id = $input_widget['id']; + } else { + $numberless_id = substr( $input_widget['id'], 0, strrpos( $input_widget['id'], '-' ) ); + if ( isset( $wp_registered_widget_updates[ $numberless_id ] ) ) { + $registered_widget_id = $numberless_id; + } + } + + if ( $registered_widget_id ) { + // Old-style widget. + $update_control = $wp_registered_widget_updates[ $registered_widget_id ]; + $_POST = wp_slash( $input_widget['settings'] ); + call_user_func( $update_control['callback'] ); + } + } + ob_end_clean(); + + $sidebar_widgets_ids[] = $input_widget['id']; + } + + // Update sidebar to only consist of the widgets we just processed. + $sidebars = wp_get_sidebars_widgets(); + $sidebars[ $sidebar_id ] = $sidebar_widgets_ids; + wp_set_sidebars_widgets( $sidebars ); + + $request = new WP_REST_Request( 'GET' ); + $request->set_param( 'id', $sidebar_id ); + + return $this->get_item( $request ); + } + + /** + * Returns a list of sidebars (active or inactive) + * + * @param WP_REST_Request $request The request instance. + * + * @return WP_REST_Response + * @global array $wp_registered_sidebars + */ + public function get_items( $request ) { + $data = array(); + foreach ( (array) wp_get_sidebars_widgets() as $id => $widgets ) { + $sidebar = self::get_sidebar( $id )[1]; + + $data[] = $this->prepare_item_for_response( $sidebar, $request )->get_data(); + } + + return rest_ensure_response( $data ); + } + + /** + * Returns the given sidebar + * + * @param WP_REST_Request $request The request instance. + * + * @return WP_REST_Response + */ + public function get_item( $request ) { + $sidebar = self::get_sidebar( $request['id'] )[1]; + + return $this->prepare_item_for_response( $sidebar, $request ); + } + + /** + * Returns a sidebar for the given id or null if not found + * + * Note: The id can be either an index, the id or the name of a sidebar + * + * @param string|int $id ID of the sidebar. + * + * @return array|null + * @global array $wp_registered_sidebars + */ + public static function get_sidebar( $id ) { + global $wp_registered_sidebars; + + if ( is_int( $id ) ) { + $id = 'sidebar-' . $id; + } else { + $id = sanitize_title( $id ); + + foreach ( (array) $wp_registered_sidebars as $key => $sidebar ) { + if ( sanitize_title( $sidebar['name'] ) === $id ) { + return array( true, $sidebar ); + } + } + } + + foreach ( (array) $wp_registered_sidebars as $key => $sidebar ) { + if ( $key === $id ) { + return array( true, $sidebar ); + } + } + + return array( false, array( 'id' => $id ) ); + } + + /** + * Returns a list of widgets for the given sidebar id + * + * @param string $sidebar_id ID of the sidebar. + * @param WP_REST_Request $request Request object. + * + * @return array + * @global array $wp_registered_widgets + * @global array $wp_registered_sidebars + */ + public static function get_widgets( $sidebar_id, $request ) { + global $wp_registered_widgets, $wp_registered_sidebars, $wp_registered_widget_controls; + + $widgets = array(); + $sidebars_widgets = (array) wp_get_sidebars_widgets(); + $registered_sidebar = isset( $wp_registered_sidebars[ $sidebar_id ] ) + ? $wp_registered_sidebars[ $sidebar_id ] + : ( + 'wp_inactive_widgets' === $sidebar_id ? array() : null + ); + + if ( null !== $registered_sidebar && isset( $sidebars_widgets[ $sidebar_id ] ) ) { + foreach ( $sidebars_widgets[ $sidebar_id ] as $widget_id ) { + // Just to be sure. + if ( isset( $wp_registered_widgets[ $widget_id ] ) ) { + $widget = $wp_registered_widgets[ $widget_id ]; + + // Get the widget output. + if ( is_callable( $widget['callback'] ) ) { + // @note: everything up to ob_start is taken from the dynamic_sidebar function. + $widget_parameters = array_merge( + array( + array_merge( + $registered_sidebar, + array( + 'widget_id' => $widget_id, + 'widget_name' => $widget['name'], + ) + ), + ), + (array) $widget['params'] + ); + + $classname = ''; + foreach ( (array) $widget['classname'] as $cn ) { + if ( is_string( $cn ) ) { + $classname .= '_' . $cn; + } elseif ( is_object( $cn ) ) { + $classname .= '_' . get_class( $cn ); + } + } + $classname = ltrim( $classname, '_' ); + if ( isset( $widget_parameters[0]['before_widget'] ) ) { + $widget_parameters[0]['before_widget'] = sprintf( + $widget_parameters[0]['before_widget'], + $widget_id, + $classname + ); + } + + ob_start(); + call_user_func_array( $widget['callback'], $widget_parameters ); + $widget['rendered'] = trim( ob_get_clean() ); + } + + if ( is_array( $widget['callback'] ) && isset( $widget['callback'][0] ) ) { + $instance = $widget['callback'][0]; + $widget['widget_class'] = get_class( $instance ); + $widget['settings'] = static::get_sidebar_widget_instance( + $registered_sidebar, + $widget_id + ); + $widget['number'] = (int) $widget['params'][0]['number']; + $widget['id_base'] = $instance->id_base; + } + + if ( 'edit' === $request['context'] && isset( $wp_registered_widget_controls[ $widget_id ]['callback'] ) ) { + $control = $wp_registered_widget_controls[ $widget_id ]; + $arguments = array(); + if ( ! empty( $widget['number'] ) ) { + $arguments[0] = array( 'number' => $widget['number'] ); + } + ob_start(); + call_user_func_array( $control['callback'], $arguments ); + $widget['rendered_form'] = trim( ob_get_clean() ); + } + + unset( $widget['params'] ); + unset( $widget['callback'] ); + + $widgets[] = $widget; + } + } + } + + return $widgets; + } + + /** + * Prepare a single sidebar output for response + * + * @param array $raw_sidebar Sidebar instance. + * @param WP_REST_Request $request Request object. + * + * @return WP_REST_Response $data + */ + public function prepare_item_for_response( $raw_sidebar, $request ) { + global $wp_registered_sidebars; + + $id = $raw_sidebar['id']; + $sidebar = array( 'id' => $id ); + + if ( isset( $wp_registered_sidebars[ $id ] ) ) { + $registered_sidebar = $wp_registered_sidebars[ $id ]; + + $sidebar['status'] = 'active'; + $sidebar['name'] = isset( $registered_sidebar['name'] ) ? $registered_sidebar['name'] : ''; + $sidebar['description'] = isset( $registered_sidebar['description'] ) ? $registered_sidebar['description'] : ''; + } else { + $sidebar['status'] = 'inactive'; + } + + if ( 'wp_inactive_widgets' === $sidebar['id'] && empty( $sidebar['name'] ) ) { + $sidebar['name'] = __( 'Inactive widgets', 'gutenberg' ); + } + + $fields = $this->get_fields_for_response( $request ); + if ( rest_is_field_included( 'widgets', $fields ) ) { + $sidebar['widgets'] = self::get_widgets( $sidebar['id'], $request ); + } + + $schema = $this->get_item_schema(); + $data = array(); + foreach ( $schema['properties'] as $property_id => $property ) { + if ( isset( $sidebar[ $property_id ] ) && gettype( $sidebar[ $property_id ] ) === $property['type'] ) { + $data[ $property_id ] = $sidebar[ $property_id ]; + } elseif ( isset( $property['default'] ) ) { + $data[ $property_id ] = $property['default']; + } + } + + foreach ( $sidebar['widgets'] as $widget_id => $widget ) { + $widget_data = array(); + foreach ( $schema['properties']['widgets']['items']['properties'] as $property_id => $property ) { + if ( isset( $widget[ $property_id ] ) && gettype( $widget[ $property_id ] ) === $property['type'] ) { + $widget_data[ $property_id ] = $widget[ $property_id ]; + } elseif ( 'settings' === $property_id && isset( $widget[ $property_id ] ) && 'array' === gettype( $widget[ $property_id ] ) ) { + $widget_data[ $property_id ] = $widget['settings']; + } elseif ( isset( $property['default'] ) ) { + $widget_data[ $property_id ] = $property['default']; + } + } + $data['widgets'][ $widget_id ] = $widget_data; + } + + $response = rest_ensure_response( $data ); + + /** + * Filters a sidebar location returned from the REST API. + * + * Allows modification of the menu location data right before it is + * returned. + * + * @param WP_REST_Response $response The response object. + * @param object $sidebar The original status object. + * @param WP_REST_Request $request Request used to generate the response. + */ + return apply_filters( 'rest_prepare_sidebar', $response, $sidebar, $request ); + } + + /** + * Retrieves the block type' schema, conforming to JSON Schema. + * + * @return array Item schema data. + */ + public function get_item_schema() { + if ( $this->schema ) { + return $this->add_additional_fields_schema( $this->schema ); + } + + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'sidebar', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'ID of sidebar.', 'gutenberg' ), + 'type' => 'string', + 'default' => '', + 'context' => array( 'embed', 'view', 'edit' ), + 'readonly' => true, + ), + 'name' => array( + 'description' => __( 'Unique name identifying the sidebar.', 'gutenberg' ), + 'type' => 'string', + 'default' => '', + 'context' => array( 'embed', 'view', 'edit' ), + 'readonly' => true, + ), + 'description' => array( + 'description' => __( 'Description of sidebar.', 'gutenberg' ), + 'type' => 'string', + 'default' => '', + 'context' => array( 'embed', 'view', 'edit' ), + 'readonly' => true, + ), + 'status' => array( + 'description' => __( 'Status of sidebar.', 'gutenberg' ), + 'type' => 'string', + 'enum' => array( 'active', 'inactive' ), + 'default' => '', + 'context' => array( 'embed', 'view', 'edit' ), + 'readonly' => true, + ), + 'widgets' => array( + 'description' => __( 'Nested widgets.', 'gutenberg' ), + 'type' => 'array', + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the widget.', 'gutenberg' ), + 'type' => 'string', + 'context' => array( 'view', 'edit', 'embed' ), + ), + 'id_base' => array( + 'description' => __( 'Type of widget for the object.', 'gutenberg' ), + 'type' => 'string', + 'context' => array( 'view', 'edit', 'embed' ), + ), + 'widget_class' => array( + 'description' => __( 'Class name of the widget implementation.', 'gutenberg' ), + 'type' => 'string', + 'context' => array( 'view', 'edit', 'embed' ), + ), + 'name' => array( + 'description' => __( 'Name of the widget.', 'gutenberg' ), + 'type' => 'string', + 'context' => array( 'view', 'edit', 'embed' ), + ), + 'description' => array( + 'description' => __( 'Description of the widget.', 'gutenberg' ), + 'type' => 'string', + 'context' => array( 'view', 'edit', 'embed' ), + ), + 'number' => array( + 'description' => __( 'Number of the widget.', 'gutenberg' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit', 'embed' ), + ), + 'rendered' => array( + 'description' => __( 'HTML representation of the widget.', 'gutenberg' ), + 'type' => 'string', + 'context' => array( 'view', 'embed' ), + 'readonly' => true, + ), + 'rendered_form' => array( + 'description' => __( 'HTML representation of the widget admin form.', 'gutenberg' ), + 'type' => 'string', + 'context' => array( 'edit' ), + 'readonly' => true, + ), + 'settings' => array( + 'description' => __( 'Settings of the widget.', 'gutenberg' ), + 'type' => 'object', + 'context' => array( 'view', 'edit', 'embed' ), + 'default' => array(), + ), + ), + ), + 'default' => array(), + 'context' => array( 'embed', 'view', 'edit' ), + ), + ), + ); + + $this->schema = $schema; + + return $this->add_additional_fields_schema( $this->schema ); + } + + /** + * Retrieves a widget instance. + * + * @param array $sidebar sidebar data available at $wp_registered_sidebars. + * @param string $id Identifier of the widget instance. + * + * @return array Array containing the widget instance. + * @since 5.7.0 + */ + public static function get_sidebar_widget_instance( $sidebar, $id ) { + list( $object, $number, $name ) = static::get_widget_info( $id ); + if ( ! $object ) { + return array(); + } + + $object->_set( $number ); + + $instances = $object->get_settings(); + $instance = $instances[ $number ]; + + $args = array_merge( + $sidebar, + array( + 'widget_id' => $id, + 'widget_name' => $name, + ) + ); + + /** + * Filters the settings for a particular widget instance. + * + * Returning false will effectively short-circuit display of the widget. + * + * @param array $instance The current widget instance's settings. + * @param WP_Widget $this The current widget instance. + * @param array $args An array of default widget arguments. + * + * @since 2.8.0 + */ + $instance = apply_filters( 'widget_display_callback', $instance, $object, $args ); + + if ( false === $instance ) { + return array(); + } + + return $instance; + } + + /** + * Given a widget id returns an array containing information about the widget. + * + * @param string $widget_id Identifier of the widget. + * + * @return array Array containing the the widget object, the number, and the name. + * @since 5.7.0 + */ + private static function get_widget_info( $widget_id ) { + global $wp_registered_widgets; + + if ( + ! isset( $wp_registered_widgets[ $widget_id ]['callback'][0] ) || + ! isset( $wp_registered_widgets[ $widget_id ]['params'][0]['number'] ) || + ! isset( $wp_registered_widgets[ $widget_id ]['name'] ) || + ! ( $wp_registered_widgets[ $widget_id ]['callback'][0] instanceof WP_Widget ) + ) { + return array( null, null, null ); + } + + $object = $wp_registered_widgets[ $widget_id ]['callback'][0]; + $number = $wp_registered_widgets[ $widget_id ]['params'][0]['number']; + $name = $wp_registered_widgets[ $widget_id ]['name']; + + return array( $object, $number, $name ); + } + +} diff --git a/lib/class-wp-rest-term-search-handler.php b/lib/class-wp-rest-term-search-handler.php new file mode 100644 index 0000000000000..53b5eb5ad6226 --- /dev/null +++ b/lib/class-wp-rest-term-search-handler.php @@ -0,0 +1,142 @@ +type = 'term'; + + $this->subtypes = array_values( + get_taxonomies( + array( + 'public' => true, + 'show_in_rest' => true, + ), + 'names' + ) + ); + } + + /** + * Searches the object type content for a given search request. + * + * @param WP_REST_Request $request Full REST request. + * @return array Associative array containing an `WP_REST_Search_Handler::RESULT_IDS` containing + * an array of found IDs and `WP_REST_Search_Handler::RESULT_TOTAL` containing the + * total count for the matching search results. + */ + public function search_items( WP_REST_Request $request ) { + $taxonomies = $request[ WP_REST_Search_Controller::PROP_SUBTYPE ]; + if ( in_array( WP_REST_Search_Controller::TYPE_ANY, $taxonomies, true ) ) { + $taxonomies = $this->subtypes; + } + + $page = (int) $request['page']; + $per_page = (int) $request['per_page']; + + $query_args = array( + 'taxonomy' => $taxonomies, + 'hide_empty' => false, + 'offset' => ( $page - 1 ) * $per_page, + 'number' => $per_page, + ); + + if ( ! empty( $request['search'] ) ) { + $query_args['search'] = $request['search']; + } + + /** + * Filters the query arguments for a search request. + * + * Enables adding extra arguments or setting defaults for a term search request. + * + * @param array $query_args Key value array of query var to query value. + * @param WP_REST_Request $request The request used. + */ + $query_args = apply_filters( 'rest_term_search_query', $query_args, $request ); + + $query = new WP_Term_Query(); + $found_terms = $query->query( $query_args ); + $found_ids = wp_list_pluck( $found_terms, 'term_id' ); + + unset( $query_args['offset'], $query_args['number'] ); + + $total = wp_count_terms( $query_args ); + + // wp_count_terms() can return a falsey value when the term has no children. + if ( ! $total ) { + $total = 0; + } + + return array( + self::RESULT_IDS => $found_ids, + self::RESULT_TOTAL => $total, + ); + } + + /** + * Prepares the search result for a given ID. + * + * @param int $id Item ID. + * @param array $fields Fields to include for the item. + * @return array Associative array containing all fields for the item. + */ + public function prepare_item( $id, array $fields ) { + $term = get_term( $id ); + + $data = array(); + + if ( in_array( WP_REST_Search_Controller::PROP_ID, $fields, true ) ) { + $data[ WP_REST_Search_Controller::PROP_ID ] = (int) $id; + } + if ( in_array( WP_REST_Search_Controller::PROP_TITLE, $fields, true ) ) { + $data[ WP_REST_Search_Controller::PROP_TITLE ] = $term->name; + } + if ( in_array( WP_REST_Search_Controller::PROP_URL, $fields, true ) ) { + $data[ WP_REST_Search_Controller::PROP_URL ] = get_term_link( $id ); + } + if ( in_array( WP_REST_Search_Controller::PROP_TYPE, $fields, true ) ) { + $data[ WP_REST_Search_Controller::PROP_TYPE ] = $term->taxonomy; + } + + return $data; + } + + /** + * Prepares links for the search result of a given ID. + * + * @param int $id Item ID. + * @return array Links for the given item. + */ + public function prepare_item_links( $id ) { + $term = get_term( $id ); + + $links = array(); + + $item_route = rest_get_route_for_term( $term ); + if ( $item_route ) { + $links['self'] = array( + 'href' => rest_url( $item_route ), + 'embeddable' => true, + ); + } + + $links['about'] = array( + 'href' => rest_url( sprintf( 'wp/v2/taxonomies/%s', $term->taxonomy ) ), + ); + + return $links; + } +} diff --git a/lib/class-wp-rest-widget-areas-controller.php b/lib/class-wp-rest-widget-areas-controller.php deleted file mode 100644 index d03bf04435ea7..0000000000000 --- a/lib/class-wp-rest-widget-areas-controller.php +++ /dev/null @@ -1,275 +0,0 @@ -namespace = '__experimental'; - $this->rest_base = 'widget-areas'; - } - - /** - * Registers the necessary REST API routes. - * - * @access public - */ - public function register_routes() { - register_rest_route( - $this->namespace, - '/' . $this->rest_base, - array( - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - - $id_argument = array( - 'description' => __( 'The sidebar’s ID.', 'gutenberg' ), - 'type' => 'string', - 'required' => true, - 'validate_callback' => 'Experimental_WP_Widget_Blocks_Manager::is_valid_sidebar_id', - ); - - register_rest_route( - $this->namespace, - '/' . $this->rest_base . '/(?P.+)', - array( - 'args' => array( - 'id' => $id_argument, - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_item' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'update_item' ), - 'permission_callback' => array( $this, 'update_item_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - } - - /** - * Retrieves the comment's schema, conforming to JSON Schema. - * - * @since 6.1.0 - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'widget-area', - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the object.', 'gutenberg' ), - 'type' => 'string', - 'context' => array( 'view', 'edit', 'embed' ), - 'readonly' => true, - ), - 'content' => array( - 'description' => __( 'The content for the object.', 'gutenberg' ), - 'type' => 'object', - 'context' => array( 'view', 'edit', 'embed' ), - 'arg_options' => array( - 'sanitize_callback' => null, - 'validate_callback' => null, - ), - 'properties' => array( - 'raw' => array( - 'description' => __( 'Content for the object, as it exists in the database.', 'gutenberg' ), - 'type' => 'string', - 'context' => array( 'view', 'edit', 'embed' ), - ), - 'rendered' => array( - 'description' => __( 'HTML content for the object, transformed for display.', 'gutenberg' ), - 'type' => 'string', - 'context' => array( 'view', 'edit', 'embed' ), - 'readonly' => true, - ), - 'block_version' => array( - 'description' => __( 'Version of the content block format used by the object.', 'gutenberg' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit', 'embed' ), - 'readonly' => true, - ), - ), - ), - ), - ); - - return $schema; - } - - /** - * Checks whether a given request has permission to read widget areas. - * - * @since 5.7.0 - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|bool True if the request has read access, WP_Error object otherwise. - * - * This function is overloading a function defined in WP_REST_Controller so it should have the same parameters. - * phpcs:disable VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable - */ - public function get_items_permissions_check( $request ) { - if ( ! current_user_can( 'edit_theme_options' ) ) { - return new WP_Error( - 'rest_user_cannot_view', - __( 'Sorry, you are not allowed to read sidebars.', 'gutenberg' ) - ); - } - - return true; - } - /* phpcs:enable */ - - /** - * Retrieves all widget areas. - * - * @since 5.7.0 - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure. - */ - public function get_items( $request ) { - global $wp_registered_sidebars; - - $data = array(); - - foreach ( array_keys( $wp_registered_sidebars ) as $sidebar_id ) { - $data[ $sidebar_id ] = $this->get_sidebar_data( $sidebar_id ); - } - - return rest_ensure_response( $data ); - } - - /** - * Retrieves a specific widget area. - * - * @since 5.7.0 - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure. - */ - public function get_item( $request ) { - return rest_ensure_response( $this->get_sidebar_data( $request['id'] ) ); - } - - /** - * Checks if a given REST request has access to update a widget area. - * - * @since 5.7.0 - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|bool True if the request has access to update the item, error object otherwise. - * - * This function is overloading a function defined in WP_REST_Controller so it should have the same parameters. - * phpcs:disable VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable - */ - public function update_item_permissions_check( $request ) { - if ( ! current_user_can( 'edit_theme_options' ) ) { - return new WP_Error( - 'rest_user_cannot_edit', - __( 'Sorry, you are not allowed to edit sidebars.', 'gutenberg' ) - ); - } - - return true; - } - /* phpcs:enable */ - - /** - * Updates a single widget area. - * - * @since 5.7.0 - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. - */ - public function update_item( $request ) { - $sidebar_id = $request->get_param( 'id' ); - $sidebar_content = $request->get_param( 'content' ); - - if ( ! is_string( $sidebar_content ) && isset( $sidebar_content['raw'] ) ) { - $sidebar_content = $sidebar_content['raw']; - } - - $id_referenced_in_sidebar = Experimental_WP_Widget_Blocks_Manager::get_post_id_referenced_in_sidebar( $sidebar_id ); - - $post_id = wp_insert_post( - array( - 'ID' => $id_referenced_in_sidebar, - 'post_content' => $sidebar_content, - 'post_type' => 'wp_area', - ) - ); - - if ( 0 === $id_referenced_in_sidebar ) { - Experimental_WP_Widget_Blocks_Manager::reference_post_id_in_sidebar( $sidebar_id, $post_id ); - } - - return rest_ensure_response( $this->get_sidebar_data( $request['id'] ) ); - } - - /** - * Returns the sidebar data together with a content array containing the blocks present in the sidebar. - * The bocks may be legacy widget blocks representing the widgets currently present in the sidebar, or the content of a wp_area post that the sidebar references. - * - * @since 5.7.0 - * - * @param string $sidebar_id Identifier of the sidebar. - * @return object Sidebar data with a content array. - */ - protected function get_sidebar_data( $sidebar_id ) { - $content_string = ''; - - $post_id_referenced_in_sidebar = Experimental_WP_Widget_Blocks_Manager::get_post_id_referenced_in_sidebar( $sidebar_id ); - - if ( 0 !== $post_id_referenced_in_sidebar ) { - $post = get_post( $post_id_referenced_in_sidebar ); - $content_string = $post->post_content; - } else { - $blocks = Experimental_WP_Widget_Blocks_Manager::get_sidebar_as_blocks( $sidebar_id ); - $content_string = Experimental_WP_Widget_Blocks_Manager::serialize_blocks( $blocks ); - } - - return array_merge( - Experimental_WP_Widget_Blocks_Manager::get_wp_registered_sidebars_sidebar( $sidebar_id ), - array( - 'content' => array( - 'raw' => $content_string, - 'rendered' => apply_filters( 'the_content', $content_string ), - 'block_version' => block_version( $content_string ), - ), - ) - ); - } -} diff --git a/lib/class-wp-rest-widget-forms.php b/lib/class-wp-rest-widget-utils-controller.php similarity index 54% rename from lib/class-wp-rest-widget-forms.php rename to lib/class-wp-rest-widget-utils-controller.php index 6ff3d16c0b16f..832a25a625280 100644 --- a/lib/class-wp-rest-widget-forms.php +++ b/lib/class-wp-rest-widget-utils-controller.php @@ -14,7 +14,7 @@ * * @see WP_REST_Controller */ -class WP_REST_Widget_Forms extends WP_REST_Controller { +class WP_REST_Widget_Utils_Controller extends WP_REST_Controller { /** * Constructs the controller. @@ -23,7 +23,7 @@ class WP_REST_Widget_Forms extends WP_REST_Controller { */ public function __construct() { $this->namespace = '__experimental'; - $this->rest_base = 'widget-forms'; + $this->rest_base = 'widget-utils'; } /** @@ -32,46 +32,40 @@ public function __construct() { * @access public */ public function register_routes() { - register_rest_route( - $this->namespace, - '/' . $this->rest_base . '/(?P[^/]*)/', - array( - 'args' => array( - 'widget_class' => array( - 'description' => __( 'Class name of the widget.', 'gutenberg' ), - 'type' => 'string', - 'required' => true, - 'validate_callback' => array( $this, 'is_valid_widget' ), - ), - 'instance' => array( - 'description' => __( 'Current widget instance', 'gutenberg' ), - 'type' => 'object', - 'default' => array(), - ), - 'instance_changes' => array( - 'description' => __( 'Array of instance changes', 'gutenberg' ), - 'type' => 'object', - 'default' => array(), - ), + register_rest_route( + $this->namespace, + '/' . $this->rest_base . '/form/(?P[^/]*)/', + array( + 'args' => array( + 'widget_class' => array( + 'description' => __( 'Class name of the widget.', 'gutenberg' ), + 'type' => 'string', + 'required' => true, + 'validate_callback' => array( $this, 'is_valid_widget' ), ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'permission_callback' => array( $this, 'compute_new_widget_permissions_check' ), - 'callback' => array( $this, 'compute_new_widget' ), + 'instance' => array( + 'description' => __( 'Current widget instance', 'gutenberg' ), + 'type' => 'object', + 'default' => array(), ), - ) - ); + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'permission_callback' => array( $this, 'permissions_check' ), + 'callback' => array( $this, 'compute_widget_form' ), + ), + ) + ); } /** * Checks if the user has permissions to make the request. * + * @return true|WP_Error True if the request has read access, WP_Error object otherwise. * @since 5.2.0 * @access public - * - * @return true|WP_Error True if the request has read access, WP_Error object otherwise. */ - public function compute_new_widget_permissions_check() { + public function permissions_check() { // Verify if the current user has edit_theme_options capability. // This capability is required to access the widgets screen. if ( ! current_user_can( 'edit_theme_options' ) ) { @@ -83,16 +77,17 @@ public function compute_new_widget_permissions_check() { ) ); } + return true; } /** * Checks if the widget being referenced is valid. * - * @since 5.2.0 * @param string $widget_class Name of the class the widget references. * * @return boolean| True if the widget being referenced exists and false otherwise. + * @since 5.2.0 */ private function is_valid_widget( $widget_class ) { $widget_class = urldecode( $widget_class ); @@ -100,6 +95,7 @@ private function is_valid_widget( $widget_class ) { if ( ! $widget_class ) { return false; } + return isset( $wp_widget_factory->widgets[ $widget_class ] ) && ( $wp_widget_factory->widgets[ $widget_class ] instanceof WP_Widget ); } @@ -107,16 +103,15 @@ private function is_valid_widget( $widget_class ) { /** * Returns the new widget instance and the form that represents it. * - * @since 5.7.0 - * @access public - * * @param WP_REST_Request $request Full details about the request. + * * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. + * @since 5.7.0 + * @access public */ - public function compute_new_widget( $request ) { - $widget_class = urldecode( $request->get_param( 'widget_class' ) ); - $instance = $request->get_param( 'instance' ); - $instance_changes = $request->get_param( 'instance_changes' ); + public function compute_widget_form( $request ) { + $widget_class = urldecode( $request->get_param( 'widget_class' ) ); + $instance = $request->get_param( 'instance' ); global $wp_widget_factory; $widget_obj = $wp_widget_factory->widgets[ $widget_class ]; @@ -124,29 +119,6 @@ public function compute_new_widget( $request ) { $widget_obj->_set( -1 ); ob_start(); - if ( ! empty( $instance_changes ) ) { - $old_instance = $instance; - $instance = $widget_obj->update( $instance_changes, $old_instance ); - - /** - * Filters a widget's settings before saving. - * - * Returning false will effectively short-circuit the widget's ability - * to update settings. The old setting will be returned. - * - * @since 5.2.0 - * - * @param array $instance The current widget instance's settings. - * @param array $instance_changes Array of new widget settings. - * @param array $old_instance Array of old widget settings. - * @param WP_Widget $widget_ob The widget instance. - */ - $instance = apply_filters( 'widget_update_callback', $instance, $instance_changes, $old_instance, $widget_obj ); - if ( false === $instance ) { - $instance = $old_instance; - } - } - $instance = apply_filters( 'widget_form_callback', $instance, $widget_obj ); $return = null; @@ -163,11 +135,11 @@ public function compute_new_widget( $request ) { * Note: If the widget has no form, the text echoed from the default * form method can be hidden using CSS. * - * @since 5.2.0 + * @param WP_Widget $widget_obj The widget instance (passed by reference). + * @param null $return Return null if new fields are added. + * @param array $instance An array of the widget's settings. * - * @param WP_Widget $widget_obj The widget instance (passed by reference). - * @param null $return Return null if new fields are added. - * @param array $instance An array of the widget's settings. + * @since 5.2.0 */ do_action_ref_array( 'in_widget_form', array( &$widget_obj, &$return, $instance ) ); } @@ -180,6 +152,7 @@ public function compute_new_widget( $request ) { ) ); } + } /** * End: Include for phase 2 diff --git a/lib/class-wp-widget-block.php b/lib/class-wp-widget-block.php new file mode 100644 index 0000000000000..a9eb407abddc4 --- /dev/null +++ b/lib/class-wp-widget-block.php @@ -0,0 +1,89 @@ + '', + ); + + /** + * Sets up a new Block widget instance. + * + * @since 4.8.1 + */ + public function __construct() { + $widget_ops = array( + 'classname' => 'widget_block', + 'description' => __( 'Gutenberg block.', 'gutenberg' ), + 'customize_selective_refresh' => true, + ); + $control_ops = array( + 'width' => 400, + 'height' => 350, + ); + parent::__construct( 'block', __( 'Block', 'gutenberg' ), $widget_ops, $control_ops ); + } + + /** + * Outputs the content for the current Block widget instance. + * + * @since 4.8.1 + * + * @global WP_Post $post Global post object. + * + * @param array $args Display arguments including 'before_title', 'after_title', + * 'before_widget', and 'after_widget'. + * @param array $instance Settings for the current Block widget instance. + */ + public function widget( $args, $instance ) { + echo do_blocks( $instance['content'] ); + } + + /** + * Handles updating settings for the current Block widget instance. + * + * @since 4.8.1 + * + * @param array $new_instance New settings for this instance as input by the user via + * WP_Widget::form(). + * @param array $old_instance Old settings for this instance. + * @return array Settings to save or bool false to cancel saving. + */ + public function update( $new_instance, $old_instance ) { + $instance = array_merge( $this->default_instance, $old_instance ); + $instance['content'] = $new_instance['content']; + return $instance; + } + + /** + * Outputs the Block widget settings form. + * + * @see WP_Widget_Custom_HTML::render_control_template_scripts() + * + * @param array $instance Current instance. + */ + public function form( $instance ) { + $instance = wp_parse_args( (array) $instance, $this->default_instance ); + echo do_blocks( $instance['content'] ); + ?> + + get_all_registered(), - $settings['__experimentalBlockPatterns'] - ); - - if ( empty( $settings['__experimentalBlockPatternCategories'] ) ) { - $settings['__experimentalBlockPatternCategories'] = array(); - } - - $settings['__experimentalBlockPatternCategories'] = array_merge( - WP_Block_Pattern_Categories_Registry::get_instance()->get_all_registered(), - $settings['__experimentalBlockPatternCategories'] - ); - - return $settings; -} -add_filter( 'block_editor_settings', 'gutenberg_extend_settings_block_patterns', 0 ); - -/** - * Extends block editor settings to determine whether to use custom line height controls. - * - * @param array $settings Default editor settings. - * - * @return array Filtered editor settings. - */ -function gutenberg_extend_settings_custom_line_height( $settings ) { - $settings['__experimentalDisableCustomLineHeight'] = get_theme_support( 'disable-custom-line-height' ); - return $settings; -} -add_filter( 'block_editor_settings', 'gutenberg_extend_settings_custom_line_height' ); - /** * Extends block editor settings to determine whether to use custom unit controls. * Currently experimental. @@ -684,7 +629,7 @@ function gutenberg_extend_settings_custom_line_height( $settings ) { * @return array Filtered editor settings. */ function gutenberg_extend_settings_custom_units( $settings ) { - $settings['__experimentalDisableCustomUnits'] = get_theme_support( 'experimental-custom-units' ); + $settings['enableCustomUnits'] = get_theme_support( 'custom-units' ); return $settings; } add_filter( 'block_editor_settings', 'gutenberg_extend_settings_custom_units' ); @@ -717,33 +662,3 @@ function gutenberg_extend_settings_link_color( $settings ) { return $settings; } add_filter( 'block_editor_settings', 'gutenberg_extend_settings_link_color' ); - -/* - * Register default patterns if not registered in Core already. - */ - -if ( class_exists( 'WP_Block_Patterns_Registry' ) && ! WP_Block_Patterns_Registry::get_instance()->is_registered( 'text-two-columns' ) ) { - register_block_pattern( 'core/text-two-columns', gutenberg_load_block_pattern( 'text-two-columns' ) ); - register_block_pattern( 'core/two-buttons', gutenberg_load_block_pattern( 'two-buttons' ) ); - register_block_pattern( 'core/cover-abc', gutenberg_load_block_pattern( 'cover-abc' ) ); - register_block_pattern( 'core/two-images', gutenberg_load_block_pattern( 'two-images' ) ); - register_block_pattern( 'core/hero-two-columns', gutenberg_load_block_pattern( 'hero-two-columns' ) ); - register_block_pattern( 'core/numbered-features', gutenberg_load_block_pattern( 'numbered-features' ) ); - register_block_pattern( 'core/its-time', gutenberg_load_block_pattern( 'its-time' ) ); - register_block_pattern( 'core/hero-right-column', gutenberg_load_block_pattern( 'hero-right-column' ) ); - register_block_pattern( 'core/testimonials', gutenberg_load_block_pattern( 'testimonials' ) ); - register_block_pattern( 'core/features-services', gutenberg_load_block_pattern( 'features-services' ) ); -} - -/* - * Register default pattern categories if not registered in Core already. - */ -if ( class_exists( 'WP_Block_Pattern_Categories_Registry' ) ) { - register_block_pattern_category( 'text', array( 'label' => _x( 'Text', 'Block pattern category', 'gutenberg' ) ) ); - register_block_pattern_category( 'hero', array( 'label' => _x( 'Hero', 'Block pattern category', 'gutenberg' ) ) ); - register_block_pattern_category( 'columns', array( 'label' => _x( 'Columns', 'Block pattern category', 'gutenberg' ) ) ); - register_block_pattern_category( 'buttons', array( 'label' => _x( 'Buttons', 'Block pattern category', 'gutenberg' ) ) ); - register_block_pattern_category( 'gallery', array( 'label' => _x( 'Gallery', 'Block pattern category', 'gutenberg' ) ) ); - register_block_pattern_category( 'features', array( 'label' => _x( 'Features', 'Block pattern category', 'gutenberg' ) ) ); - register_block_pattern_category( 'testimonials', array( 'label' => _x( 'Testimonials', 'Block pattern category', 'gutenberg' ) ) ); -} diff --git a/lib/compat.php b/lib/compat.php index 202c1345c2a8a..b5ad85956d068 100644 --- a/lib/compat.php +++ b/lib/compat.php @@ -8,6 +8,12 @@ * @package gutenberg */ +/** + * These functions can be removed when plugin support requires WordPress 5.5.0+. + * + * @see https://core.trac.wordpress.org/ticket/50263 + * @see https://core.trac.wordpress.org/changeset/48141 + */ if ( ! function_exists( 'register_block_type_from_metadata' ) ) { /** * Removes the block asset's path prefix if provided. @@ -167,17 +173,20 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) { $settings = array(); $property_mappings = array( - 'title' => 'title', - 'category' => 'category', - 'context' => 'context', - 'parent' => 'parent', - 'icon' => 'icon', - 'description' => 'description', - 'keywords' => 'keywords', - 'attributes' => 'attributes', - 'supports' => 'supports', - 'styles' => 'styles', - 'example' => 'example', + 'title' => 'title', + 'category' => 'category', + 'parent' => 'parent', + 'icon' => 'icon', + 'description' => 'description', + 'keywords' => 'keywords', + 'attributes' => 'attributes', + 'providesContext' => 'provides_context', + 'usesContext' => 'uses_context', + // Deprecated: remove with Gutenberg 8.6 release. + 'context' => 'context', + 'supports' => 'supports', + 'styles' => 'styles', + 'example' => 'example', ); foreach ( $property_mappings as $key => $mapped_key ) { @@ -225,104 +234,75 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) { } /** - * Extends block editor settings to include a list of image dimensions per size. + * Adds a wp.date.setSettings with timezone abbr parameter * - * This can be removed when plugin support requires WordPress 5.4.0+. + * This can be removed when plugin support requires WordPress 5.6.0+. * - * @see https://core.trac.wordpress.org/ticket/49389 - * @see https://core.trac.wordpress.org/changeset/47240 + * The script registration occurs in core wp-includes/script-loader.php + * wp_default_packages_inline_scripts() * - * @param array $settings Default editor settings. + * @since 8.6.0 * - * @return array Filtered editor settings. + * @param WP_Scripts $scripts WP_Scripts object. */ -function gutenberg_extend_settings_image_dimensions( $settings ) { - /* - * Only filter settings if: - * 1. `imageDimensions` is not already assigned, in which case it can be - * assumed to have been set from WordPress 5.4.0+ default settings. - * 2. `imageSizes` is an array. Plugins may run `block_editor_settings` - * directly and not provide all properties of the settings array. - */ - if ( ! isset( $settings['imageDimensions'] ) && ! empty( $settings['imageSizes'] ) ) { - $image_dimensions = array(); - $all_sizes = wp_get_registered_image_subsizes(); - foreach ( $settings['imageSizes'] as $size ) { - $key = $size['slug']; - if ( isset( $all_sizes[ $key ] ) ) { - $image_dimensions[ $key ] = $all_sizes[ $key ]; - } - } - $settings['imageDimensions'] = $image_dimensions; +function gutenberg_add_date_settings_timezone( $scripts ) { + if ( ! did_action( 'init' ) ) { + return; } - return $settings; -} -add_filter( 'block_editor_settings', 'gutenberg_extend_settings_image_dimensions' ); + global $wp_locale; -/** - * Adds a polyfill for the WHATWG URL in environments which do not support it. - * The intention in how this action is handled is under the assumption that this - * code would eventually be placed at `wp_default_packages_vendor`, which is - * called as a result of `wp_default_packages` via the `wp_default_scripts`. - * - * This can be removed when plugin support requires WordPress 5.4.0+. - * - * The script registration occurs in `gutenberg_register_vendor_scripts`, which - * should be removed in coordination with this function. - * - * @see gutenberg_register_vendor_scripts - * @see https://core.trac.wordpress.org/ticket/49360 - * @see https://developer.mozilla.org/en-US/docs/Web/API/URL/URL - * @see https://developer.wordpress.org/reference/functions/wp_default_packages_vendor/ - * - * @since 7.3.0 - * - * @param WP_Scripts $scripts WP_Scripts object. - */ -function gutenberg_add_url_polyfill( $scripts ) { - did_action( 'init' ) && $scripts->add_inline_script( - 'wp-polyfill', - wp_get_script_polyfill( - $scripts, - array( - 'window.URL && window.URL.prototype && window.URLSearchParams' => 'wp-polyfill-url', - ) - ) - ); -} -add_action( 'wp_default_scripts', 'gutenberg_add_url_polyfill', 20 ); + // Calculate the timezone abbr (EDT, PST) if possible. + $timezone_string = get_option( 'timezone_string', 'UTC' ); + $timezone_abbr = ''; -/** - * Adds a polyfill for DOMRect in environments which do not support it. - * - * This can be removed when plugin support requires WordPress 5.4.0+. - * - * The script registration occurs in `gutenberg_register_vendor_scripts`, which - * should be removed in coordination with this function. - * - * @see gutenberg_register_vendor_scripts - * @see gutenberg_add_url_polyfill - * @see https://core.trac.wordpress.org/ticket/49360 - * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMRect - * @see https://developer.wordpress.org/reference/functions/wp_default_packages_vendor/ - * - * @since 7.5.0 - * - * @param WP_Scripts $scripts WP_Scripts object. - */ -function gutenberg_add_dom_rect_polyfill( $scripts ) { - did_action( 'init' ) && $scripts->add_inline_script( - 'wp-polyfill', - wp_get_script_polyfill( - $scripts, - array( - 'window.DOMRect' => 'wp-polyfill-dom-rect', + if ( ! empty( $timezone_string ) ) { + $timezone_date = new DateTime( null, new DateTimeZone( $timezone_string ) ); + $timezone_abbr = $timezone_date->format( 'T' ); + } + + $scripts->add_inline_script( + 'wp-date', + sprintf( + 'wp.date.setSettings( %s );', + wp_json_encode( + array( + 'l10n' => array( + 'locale' => get_user_locale(), + 'months' => array_values( $wp_locale->month ), + 'monthsShort' => array_values( $wp_locale->month_abbrev ), + 'weekdays' => array_values( $wp_locale->weekday ), + 'weekdaysShort' => array_values( $wp_locale->weekday_abbrev ), + 'meridiem' => (object) $wp_locale->meridiem, + 'relative' => array( + /* translators: %s: Duration. */ + 'future' => __( '%s from now', 'default' ), + /* translators: %s: Duration. */ + 'past' => __( '%s ago', 'default' ), + ), + ), + 'formats' => array( + /* translators: Time format, see https://www.php.net/date */ + 'time' => get_option( 'time_format', __( 'g:i a', 'default' ) ), + /* translators: Date format, see https://www.php.net/date */ + 'date' => get_option( 'date_format', __( 'F j, Y', 'default' ) ), + /* translators: Date/Time format, see https://www.php.net/date */ + 'datetime' => __( 'F j, Y g:i a', 'default' ), + /* translators: Abbreviated date/time format, see https://www.php.net/date */ + 'datetimeAbbreviated' => __( 'M j, Y g:i a', 'default' ), + ), + 'timezone' => array( + 'offset' => get_option( 'gmt_offset', 0 ), + 'string' => $timezone_string, + 'abbr' => $timezone_abbr, + ), + ) ) - ) + ), + 'after' ); } -add_action( 'wp_default_scripts', 'gutenberg_add_dom_rect_polyfill', 20 ); +add_action( 'wp_default_scripts', 'gutenberg_add_date_settings_timezone', 20 ); /** * Filters default block categories to substitute legacy category names with new @@ -331,6 +311,7 @@ function gutenberg_add_dom_rect_polyfill( $scripts ) { * This can be removed when plugin support requires WordPress 5.5.0+. * * @see https://core.trac.wordpress.org/ticket/50278 + * @see https://core.trac.wordpress.org/changeset/48177 * * @param array[] $default_categories Array of block categories. * @@ -392,6 +373,7 @@ function gutenberg_replace_default_block_categories( $default_categories ) { * This can be removed when plugin support requires WordPress 5.5.0+. * * @see https://core.trac.wordpress.org/ticket/49927 + * @see https://core.trac.wordpress.org/changeset/48243 * * @param string|null $pre_render The pre-rendered content. Defaults to null. * @param array $parsed_block The parsed block being rendered. @@ -414,8 +396,10 @@ function gutenberg_render_block_with_assigned_block_context( $pre_render, $parse /** This filter is documented in src/wp-includes/blocks.php */ $parsed_block = apply_filters( 'render_block_data', $parsed_block, $source_block ); - $context = array( - 'postId' => $post->ID, + $context = array(); + + if ( $post instanceof WP_Post ) { + $context['postId'] = $post->ID; /* * The `postType` context is largely unnecessary server-side, since the @@ -423,12 +407,12 @@ function gutenberg_render_block_with_assigned_block_context( $pre_render, $parse * manifest is expected to be shared between the server and the client, * it should be included to consistently fulfill the expectation. */ - 'postType' => $post->post_type, - - 'query' => array( 'categoryIds' => array() ), - ); + $context['postType'] = $post->post_type; + } if ( isset( $wp_query->tax_query->queried_terms['category'] ) ) { + $context['query'] = array( 'categoryIds' => array() ); + foreach ( $wp_query->tax_query->queried_terms['category']['terms'] as $category_slug_or_id ) { $context['query']['categoryIds'][] = 'slug' === $wp_query->tax_query->queried_terms['category']['field'] ? get_cat_ID( $category_slug_or_id ) : $category_slug_or_id; } @@ -449,15 +433,57 @@ function gutenberg_render_block_with_assigned_block_context( $pre_render, $parse add_filter( 'pre_render_block', 'gutenberg_render_block_with_assigned_block_context', 9, 2 ); /** - * Avoid enqueueing block assets of all registered blocks for all posts, instead - * deferring to block render mechanics to enqueue scripts, thereby ensuring only - * blocks of the content have their assets enqueued. + * Amends the paths to preload when initializing edit post. * - * This can be removed once minimum support for the plugin is outside the range - * of the version associated with closure of the following ticket. + * @see https://core.trac.wordpress.org/ticket/50606 * - * @see https://core.trac.wordpress.org/ticket/50328 + * @since 8.4.0 * - * @see WP_Block::render + * @param array $preload_paths Default path list that will be preloaded. + * @return array Modified path list to preload. */ -remove_action( 'enqueue_block_assets', 'wp_enqueue_registered_block_scripts_and_styles' ); +function gutenberg_preload_edit_post( $preload_paths ) { + $additional_paths = array( '/?context=edit' ); + return array_merge( $preload_paths, $additional_paths ); +} + +add_filter( 'block_editor_preload_paths', 'gutenberg_preload_edit_post' ); + +/** + * Override post type labels for Reusable Block custom post type. + * + * This shim can be removed when the Gutenberg plugin requires a WordPress + * version that has the ticket below. + * + * @see https://core.trac.wordpress.org/ticket/50755 + * + * @since 8.6.0 + * + * @return array Array of new labels for Reusable Block post type. + */ +function gutenberg_override_reusable_block_post_type_labels() { + return array( + 'name' => _x( 'Reusable Blocks', 'post type general name', 'gutenberg' ), + 'singular_name' => _x( 'Reusable Block', 'post type singular name', 'gutenberg' ), + 'menu_name' => _x( 'Reusable Blocks', 'admin menu', 'gutenberg' ), + 'name_admin_bar' => _x( 'Reusable Block', 'add new on admin bar', 'gutenberg' ), + 'add_new' => _x( 'Add New', 'Reusable Block', 'gutenberg' ), + 'add_new_item' => __( 'Add New Reusable Block', 'gutenberg' ), + 'new_item' => __( 'New Reusable Block', 'gutenberg' ), + 'edit_item' => __( 'Edit Reusable Block', 'gutenberg' ), + 'view_item' => __( 'View Reusable Block', 'gutenberg' ), + 'all_items' => __( 'All Reusable Blocks', 'gutenberg' ), + 'search_items' => __( 'Search Reusable Blocks', 'gutenberg' ), + 'not_found' => __( 'No reusable blocks found.', 'gutenberg' ), + 'not_found_in_trash' => __( 'No reusable blocks found in Trash.', 'gutenberg' ), + 'filter_items_list' => __( 'Filter reusable blocks list', 'gutenberg' ), + 'items_list_navigation' => __( 'Reusable Blocks list navigation', 'gutenberg' ), + 'items_list' => __( 'Reusable Blocks list', 'gutenberg' ), + 'item_published' => __( 'Reusable Block published.', 'gutenberg' ), + 'item_published_privately' => __( 'Reusable Block published privately.', 'gutenberg' ), + 'item_reverted_to_draft' => __( 'Reusable Block reverted to draft.', 'gutenberg' ), + 'item_scheduled' => __( 'Reusable Block scheduled.', 'gutenberg' ), + 'item_updated' => __( 'Reusable Block updated.', 'gutenberg' ), + ); +} +add_filter( 'post_type_labels_wp_block', 'gutenberg_override_reusable_block_post_type_labels', 10, 0 ); diff --git a/lib/customizer.php b/lib/customizer.php index 1f27db00ee308..d2f24010c84c6 100644 --- a/lib/customizer.php +++ b/lib/customizer.php @@ -55,10 +55,11 @@ function gutenberg_customize_register( $wp_customize ) { 'sanitize_callback' => 'gutenberg_customize_sanitize', ) ); - if ( gutenberg_is_experiment_enabled( 'gutenberg-widget-experiments' ) ) { + + if ( gutenberg_use_widgets_block_editor() ) { $wp_customize->add_section( 'gutenberg_widget_blocks', - array( 'title' => __( 'Widget Blocks (Experimental)', 'gutenberg' ) ) + array( 'title' => __( 'Widget Blocks', 'gutenberg' ) ) ); $wp_customize->add_control( new WP_Customize_Widget_Blocks_Control( @@ -75,30 +76,23 @@ function gutenberg_customize_register( $wp_customize ) { add_action( 'customize_register', 'gutenberg_customize_register' ); /** - * Specifies how to save the `gutenberg_widget_blocks` setting. It parses the JSON string and updates the - * referenced widget areas with the new content. + * Removes the core 'Widgets' panel from the Customizer if block based widgets are enabled. * - * @param string $value The value that is being published. - * @param \WP_Customize_Setting $setting The setting instance. + * @param array $components Core Customizer components list. + * @return array (Maybe) modified components list. */ -function gutenberg_customize_update( $value, $setting ) { - foreach ( json_decode( $value ) as $sidebar_id => $sidebar_content ) { - $id_referenced_in_sidebar = Experimental_WP_Widget_Blocks_Manager::get_post_id_referenced_in_sidebar( $sidebar_id ); - - $post_id = wp_insert_post( - array( - 'ID' => $id_referenced_in_sidebar, - 'post_content' => $sidebar_content, - 'post_type' => 'wp_area', - ) - ); +function gutenberg_remove_widgets_panel( $components ) { + if ( ! gutenberg_use_widgets_block_editor() ) { + return $components; + } - if ( 0 === $id_referenced_in_sidebar ) { - Experimental_WP_Widget_Blocks_Manager::reference_post_id_in_sidebar( $sidebar_id, $post_id ); - } + $i = array_search( 'widgets', $components, true ); + if ( false !== $i ) { + unset( $components[ $i ] ); } + return $components; } -add_action( 'customize_update_gutenberg_widget_blocks', 'gutenberg_customize_update', 10, 2 ); +add_filter( 'customize_loaded_components', 'gutenberg_remove_widgets_panel' ); /** * Filters the Customizer widget settings arguments. diff --git a/lib/edit-site-page.php b/lib/edit-site-page.php index 837148666319d..508cf5184d418 100644 --- a/lib/edit-site-page.php +++ b/lib/edit-site-page.php @@ -40,7 +40,6 @@ function gutenberg_is_edit_site_page( $page ) { function gutenberg_get_editor_styles() { global $editor_styles; - // // Ideally the code is extracted into a reusable function. $styles = array( array( @@ -127,11 +126,10 @@ function gutenberg_edit_site_init( $hook ) { } $settings = array( - 'disableCustomColors' => get_theme_support( 'disable-custom-colors' ), - 'disableCustomFontSizes' => get_theme_support( 'disable-custom-font-sizes' ), - 'imageSizes' => $available_image_sizes, - 'isRTL' => is_rtl(), - 'maxUploadFileSize' => $max_upload_size, + 'alignWide' => get_theme_support( 'align-wide' ), + 'imageSizes' => $available_image_sizes, + 'isRTL' => is_rtl(), + 'maxUploadFileSize' => $max_upload_size, ); list( $color_palette, ) = (array) get_theme_support( 'editor-color-palette' ); @@ -143,37 +141,7 @@ function gutenberg_edit_site_init( $hook ) { $settings['fontSizes'] = $font_sizes; } $settings['styles'] = gutenberg_get_editor_styles(); - - $template_ids = array(); - $template_part_ids = array(); - foreach ( get_template_types() as $template_type ) { - // Skip 'embed' for now because it is not a regular template type. - // Skip 'index' because it's a fallback that we handle differently. - if ( in_array( $template_type, array( 'embed', 'index' ), true ) ) { - continue; - } - - $current_template = gutenberg_find_template_post_and_parts( $template_type ); - if ( isset( $current_template ) ) { - $template_ids[ $template_type ] = $current_template['template_post']->ID; - $template_part_ids = $template_part_ids + $current_template['template_part_ids']; - } - } - - $settings['editSiteInitialState'] = array(); - - $settings['editSiteInitialState']['templateType'] = 'wp_template'; - $settings['editSiteInitialState']['templateIds'] = array_values( $template_ids ); - $settings['editSiteInitialState']['templatePartIds'] = array_values( $template_part_ids ); - - $settings['editSiteInitialState']['showOnFront'] = get_option( 'show_on_front' ); - $settings['editSiteInitialState']['page'] = array( - 'path' => '/', - 'context' => 'page' === $settings['editSiteInitialState']['showOnFront'] ? array( - 'postType' => 'page', - 'postId' => get_option( 'page_on_front' ), - ) : array(), - ); + $settings = gutenberg_experimental_global_styles_settings( $settings ); // This is so other parts of the code can hook their own settings. // Example: Global Styles. @@ -183,10 +151,10 @@ function gutenberg_edit_site_init( $hook ) { // Preload block editor paths. // most of these are copied from edit-forms-blocks.php. $preload_paths = array( - '/', + '/?context=edit', '/wp/v2/types?context=edit', - '/wp/v2/taxonomies?per_page=100&context=edit', - '/wp/v2/pages?per_page=100&context=edit', + '/wp/v2/taxonomies?context=edit', + '/wp/v2/pages?context=edit', '/wp/v2/themes?status=active', array( '/wp/v2/media', 'OPTIONS' ), ); @@ -243,3 +211,29 @@ function gutenberg_edit_site_init( $hook ) { wp_enqueue_style( 'wp-format-library' ); } add_action( 'admin_enqueue_scripts', 'gutenberg_edit_site_init' ); + +/** + * Register a core site setting for front page information. + */ +function register_site_editor_homepage_settings() { + register_setting( + 'general', + 'show_on_front', + array( + 'show_in_rest' => true, + 'type' => 'string', + 'description' => __( 'What to show on the front page', 'gutenberg' ), + ) + ); + + register_setting( + 'general', + 'page_on_front', + array( + 'show_in_rest' => true, + 'type' => 'number', + 'description' => __( 'The ID of the page that should be displayed on the front page', 'gutenberg' ), + ) + ); +} +add_action( 'init', 'register_site_editor_homepage_settings', 10 ); diff --git a/lib/editor-features.php b/lib/editor-features.php deleted file mode 100644 index 4f43424e29e1a..0000000000000 --- a/lib/editor-features.php +++ /dev/null @@ -1,49 +0,0 @@ - __( 'Enable Widgets screen and Legacy Widgets block', 'gutenberg' ), - 'id' => 'gutenberg-widget-experiments', - ) - ); add_settings_field( 'gutenberg-navigation', __( 'Navigation', 'gutenberg' ), @@ -62,17 +51,6 @@ function gutenberg_initialize_experiments_settings() { 'id' => 'gutenberg-navigation', ) ); - add_settings_field( - 'gutenberg-block-directory', - __( 'Block Directory', 'gutenberg' ), - 'gutenberg_display_experiment_field', - 'gutenberg-experiments', - 'gutenberg_experiments_section', - array( - 'label' => __( 'Enable block directory search', 'gutenberg' ), - 'id' => 'gutenberg-block-directory', - ) - ); add_settings_field( 'gutenberg-full-site-editing', __( 'Full Site Editing', 'gutenberg' ), @@ -95,17 +73,6 @@ function gutenberg_initialize_experiments_settings() { 'id' => 'gutenberg-full-site-editing-demo', ) ); - add_settings_field( - 'gutenberg-rich-image-editing', - __( 'Rich Image Editing', 'gutenberg' ), - 'gutenberg_display_experiment_field', - 'gutenberg-experiments', - 'gutenberg_experiments_section', - array( - 'label' => __( 'Enable inline rich image editing', 'gutenberg' ), - 'id' => 'gutenberg-rich-image-editing', - ) - ); register_setting( 'gutenberg-experiments', 'gutenberg-experiments' @@ -153,11 +120,8 @@ function gutenberg_display_experiment_section() { */ function gutenberg_experiments_editor_settings( $settings ) { $experiments_settings = array( - '__experimentalEnableLegacyWidgetBlock' => gutenberg_is_experiment_enabled( 'gutenberg-widget-experiments' ), - '__experimentalBlockDirectory' => gutenberg_is_experiment_enabled( 'gutenberg-block-directory' ), '__experimentalEnableFullSiteEditing' => gutenberg_is_experiment_enabled( 'gutenberg-full-site-editing' ), '__experimentalEnableFullSiteEditingDemo' => gutenberg_is_experiment_enabled( 'gutenberg-full-site-editing-demo' ), - '__experimentalEnableRichImageEditing' => gutenberg_is_experiment_enabled( 'gutenberg-rich-image-editing' ), ); $gradient_presets = current( (array) get_theme_support( 'editor-gradient-presets' ) ); @@ -165,8 +129,6 @@ function gutenberg_experiments_editor_settings( $settings ) { $experiments_settings['gradients'] = $gradient_presets; } - $experiments_settings['disableCustomGradients'] = get_theme_support( 'disable-custom-gradients' ); - return array_merge( $settings, $experiments_settings ); } add_filter( 'block_editor_settings', 'gutenberg_experiments_editor_settings' ); diff --git a/lib/global-styles.php b/lib/global-styles.php index 9e23f31eaba10..354ffa39744b1 100644 --- a/lib/global-styles.php +++ b/lib/global-styles.php @@ -101,7 +101,7 @@ function gutenberg_experimental_global_styles_get_from_file( $file_path ) { */ function gutenberg_experimental_global_styles_get_user() { $config = array(); - $user_cpt = gutenberg_experimental_global_styles_get_user_cpt( array( 'publish' ) ); + $user_cpt = gutenberg_experimental_global_styles_get_user_cpt(); if ( array_key_exists( 'post_content', $user_cpt ) ) { $decoded_data = json_decode( $user_cpt['post_content'], true ); @@ -125,13 +125,13 @@ function gutenberg_experimental_global_styles_get_user() { * * It can also create and return a new draft CPT. * + * @param bool $should_create_cpt Whether a new CPT should be created if no one was found. + * False by default. * @param array $post_status_filter Filter CPT by post status. * ['publish'] by default, so it only fetches published posts. - * @param bool $should_create_draft Whether a new draft should be created if no CPT was found. - * False by default. * @return array Custom Post Type for the user's origin config. */ -function gutenberg_experimental_global_styles_get_user_cpt( $post_status_filter = array( 'publish' ), $should_create_draft = false ) { +function gutenberg_experimental_global_styles_get_user_cpt( $should_create_cpt = false, $post_status_filter = array( 'publish' ) ) { $user_cpt = array(); $post_type_filter = 'wp_global_styles'; $post_name_filter = 'wp-global-styles-' . strtolower( wp_get_theme()->get( 'TextDomain' ) ); @@ -148,11 +148,11 @@ function gutenberg_experimental_global_styles_get_user_cpt( $post_status_filter if ( is_array( $recent_posts ) && ( count( $recent_posts ) === 1 ) ) { $user_cpt = $recent_posts[0]; - } elseif ( $should_create_draft ) { + } elseif ( $should_create_cpt ) { $cpt_post_id = wp_insert_post( array( 'post_content' => '{}', - 'post_status' => 'draft', + 'post_status' => 'publish', 'post_type' => $post_type_filter, 'post_name' => $post_name_filter, ), @@ -171,7 +171,7 @@ function gutenberg_experimental_global_styles_get_user_cpt( $post_status_filter */ function gutenberg_experimental_global_styles_get_user_cpt_id() { $user_cpt_id = null; - $user_cpt = gutenberg_experimental_global_styles_get_user_cpt( array( 'publish', 'draft' ), true ); + $user_cpt = gutenberg_experimental_global_styles_get_user_cpt( true ); if ( array_key_exists( 'ID', $user_cpt ) ) { $user_cpt_id = $user_cpt['ID']; } @@ -270,11 +270,12 @@ function gutenberg_experimental_global_styles_get_theme() { */ function gutenberg_experimental_global_styles_get_supported_styles( $supports ) { $style_features = array( - 'color' => array( '__experimentalColor' ), - 'background-color' => array( '__experimentalColor' ), - 'background' => array( '__experimentalColor', 'gradients' ), - 'line-height' => array( '__experimentalLineHeight' ), - 'font-size' => array( '__experimentalFontSize' ), + '--wp--style--color--link' => array( '__experimentalColor', 'linkColor' ), + 'background-color' => array( '__experimentalColor' ), + 'background' => array( '__experimentalColor', 'gradients' ), + 'color' => array( '__experimentalColor' ), + 'font-size' => array( '__experimentalFontSize' ), + 'line-height' => array( '__experimentalLineHeight' ), ); $supported_features = array(); @@ -293,16 +294,29 @@ function gutenberg_experimental_global_styles_get_supported_styles( $supports ) * @return array */ function gutenberg_experimental_global_styles_get_block_data() { - $block_data = array( - 'global' => array( - 'selector' => ':root', - 'supports' => array( 'background-color' ), - ), - ); + $block_data = array(); $registry = WP_Block_Type_Registry::get_instance(); - foreach ( $registry->get_all_registered() as $block_name => $block_type ) { - if ( empty( $block_type->supports ) || ! is_array( $block_type->supports ) ) { + $blocks = array_merge( + $registry->get_all_registered(), + array( + 'global' => new WP_Block_Type( + 'global', + array( + 'supports' => array( + '__experimentalSelector' => ':root', + '__experimentalFontSize' => true, + '__experimentalColor' => array( + 'linkColor' => true, + 'gradients' => true, + ), + ), + ) + ), + ) + ); + foreach ( $blocks as $block_name => $block_type ) { + if ( ! property_exists( $block_type, 'supports' ) || empty( $block_type->supports ) || ! is_array( $block_type->supports ) ) { continue; } @@ -493,13 +507,20 @@ function gutenberg_experimental_global_styles_merge_trees( $core, $theme, $user $result = gutenberg_experimental_global_styles_normalize_schema( array() ); foreach ( array_keys( $core ) as $block_name ) { - foreach ( array( 'presets', 'styles', 'features' ) as $subtree ) { + foreach ( array( 'presets', 'features' ) as $subtree ) { $result[ $block_name ][ $subtree ] = array_merge( $core[ $block_name ][ $subtree ], $theme[ $block_name ][ $subtree ], $user[ $block_name ][ $subtree ] ); } + foreach ( array_keys( $core[ $block_name ]['styles'] ) as $subtree ) { + $result[ $block_name ]['styles'][ $subtree ] = array_merge( + $core[ $block_name ]['styles'][ $subtree ], + $theme[ $block_name ]['styles'][ $subtree ], + $user[ $block_name ]['styles'][ $subtree ] + ); + } } return $result; @@ -514,7 +535,10 @@ function gutenberg_experimental_global_styles_merge_trees( $core, $theme, $user */ function gutenberg_experimental_global_styles_normalize_schema( $tree ) { $block_schema = array( - 'styles' => array(), + 'styles' => array( + 'typography' => array(), + 'color' => array(), + ), 'features' => array(), 'presets' => array(), ); @@ -534,24 +558,18 @@ function gutenberg_experimental_global_styles_normalize_schema( $tree ) { } /** - * Returns the stylesheet resulting of merging - * core's, theme's, and user's origins. + * Takes data from the different origins (core, theme, and user) + * and returns the merged result. * - * @return string + * @return array Merged trees. */ -function gutenberg_experimental_global_styles_get_stylesheet() { - $gs_merged = array(); - $gs_core = gutenberg_experimental_global_styles_get_core(); - $gs_theme = gutenberg_experimental_global_styles_get_theme(); - $gs_user = gutenberg_experimental_global_styles_get_user(); +function gutenberg_experimental_global_styles_get_merged_origins() { + $core = gutenberg_experimental_global_styles_get_core(); + $theme = gutenberg_experimental_global_styles_get_theme(); + $user = gutenberg_experimental_global_styles_get_user(); + $merged = gutenberg_experimental_global_styles_merge_trees( $core, $theme, $user ); - $gs_merged = gutenberg_experimental_global_styles_merge_trees( $gs_core, $gs_theme, $gs_user ); - - $stylesheet = gutenberg_experimental_global_styles_resolver( $gs_merged ); - if ( empty( $stylesheet ) ) { - return; - } - return $stylesheet; + return $merged; } /** @@ -559,14 +577,66 @@ function gutenberg_experimental_global_styles_get_stylesheet() { * and enqueues the resulting stylesheet. */ function gutenberg_experimental_global_styles_enqueue_assets() { - - $stylesheet = gutenberg_experimental_global_styles_get_stylesheet(); + $merged = gutenberg_experimental_global_styles_get_merged_origins(); + $stylesheet = gutenberg_experimental_global_styles_resolver( $merged ); + if ( empty( $stylesheet ) ) { + return; + } wp_register_style( 'global-styles', false, array(), true, true ); wp_add_inline_style( 'global-styles', $stylesheet ); wp_enqueue_style( 'global-styles' ); } +/** + * Returns the default config for editor features, + * or an empty array if none found. + * + * @param array $config Config to extract values from. + * @return array Default features config for the editor. + */ +function gutenberg_experimental_global_styles_get_editor_features( $config ) { + $features = array(); + foreach ( array_keys( $config ) as $context ) { + if ( + empty( $config[ $context ]['features'] ) || + ! is_array( $config[ $context ]['features'] ) + ) { + $features[ $context ] = array(); + } else { + $features[ $context ] = $config[ $context ]['features']; + } + } + + // Deprecated theme supports. + if ( get_theme_support( 'disable-custom-colors' ) ) { + if ( ! isset( $features['global']['color'] ) ) { + $features['global']['color'] = array(); + } + $features['global']['color']['custom'] = false; + } + if ( get_theme_support( 'disable-custom-gradients' ) ) { + if ( ! isset( $features['global']['gradient'] ) ) { + $features['global']['gradient'] = array(); + } + $features['global']['gradient']['custom'] = false; + } + if ( get_theme_support( 'disable-custom-font-sizes' ) ) { + if ( ! isset( $features['global']['fontSize'] ) ) { + $features['global']['fontSize'] = array(); + } + $features['global']['fontSize']['custom'] = false; + } + if ( get_theme_support( 'custom-line-height' ) ) { + if ( ! isset( $features['global']['lineHeight'] ) ) { + $features['global']['lineHeight'] = array(); + } + $features['global']['lineHeight']['custom'] = true; + } + + return $features; +} + /** * Adds the necessary data for the Global Styles client UI to the block settings. * @@ -589,7 +659,17 @@ function gutenberg_experimental_global_styles_settings( $settings ) { // Add the styles for the editor via the settings // so they get processed as if they were added via add_editor_styles: // they will get the editor wrapper class. - $settings['styles'][] = array( 'css' => gutenberg_experimental_global_styles_get_stylesheet() ); + $merged = gutenberg_experimental_global_styles_get_merged_origins(); + $stylesheet = gutenberg_experimental_global_styles_resolver( $merged ); + $settings['styles'][] = array( 'css' => $stylesheet ); + + $settings['__experimentalFeatures'] = gutenberg_experimental_global_styles_get_editor_features( $merged ); + + // Unsetting deprecated settings defined by Core. + unset( $settings['disableCustomColors'] ); + unset( $settings['disableCustomGradients'] ); + unset( $settings['disableCustomFontSizes'] ); + unset( $settings['enableCustomLineHeight'] ); return $settings; } diff --git a/lib/image-editor/class-image-editor-crop.php b/lib/image-editor/class-image-editor-crop.php deleted file mode 100644 index 422d0994bfaad..0000000000000 --- a/lib/image-editor/class-image-editor-crop.php +++ /dev/null @@ -1,126 +0,0 @@ -crop_x = floatval( $crop_x ); - $this->crop_y = floatval( $crop_y ); - $this->width = floatval( $width ); - $this->height = floatval( $height ); - } - - /** - * Update the image metadata with the modifier. - * - * @access public - * - * @param array $meta Metadata to update. - * @return array Updated metadata. - */ - public function apply_to_meta( $meta ) { - $meta['crop_x'] = $this->crop_x; - $meta['crop_y'] = $this->crop_y; - $meta['crop_width'] = $this->width; - $meta['crop_height'] = $this->height; - - return $meta; - } - - /** - * Apply the modifier to the image - * - * @access public - * - * @param WP_Image_Editor $image Image editor. - * @return bool|WP_Error True on success, WP_Error object or false on failure. - */ - public function apply_to_image( $image ) { - $size = $image->get_size(); - - $crop_x = round( ( $size['width'] * $this->crop_x ) / 100.0 ); - $crop_y = round( ( $size['height'] * $this->crop_y ) / 100.0 ); - $width = round( ( $size['width'] * $this->width ) / 100.0 ); - $height = round( ( $size['height'] * $this->height ) / 100.0 ); - - return $image->crop( $crop_x, $crop_y, $width, $height ); - } - - /** - * Gets the new filename based on metadata. - * - * @access public - * - * @param array $meta Image metadata. - * @return string Filename for the edited image. - */ - public static function get_filename( $meta ) { - if ( isset( $meta['crop_width'] ) && $meta['crop_width'] > 0 ) { - $target_file = sprintf( 'crop-%d-%d-%d-%d', round( $meta['crop_x'], 2 ), round( $meta['crop_y'], 2 ), round( $meta['crop_width'], 2 ), round( $meta['crop_height'], 2 ) ); - - // We need to change the original name to include the crop. This way if it's cropped again we won't clash. - $meta['original_name'] = $target_file; - - return $target_file; - } - - return false; - } - - /** - * Gets the default metadata for the crop modifier. - * - * @access public - * - * @return array Default metadata. - */ - public static function get_default_meta() { - return array(); - } -} diff --git a/lib/image-editor/class-image-editor-flip.php b/lib/image-editor/class-image-editor-flip.php deleted file mode 100644 index f9b4797c99e94..0000000000000 --- a/lib/image-editor/class-image-editor-flip.php +++ /dev/null @@ -1,127 +0,0 @@ -direction = 'vertical'; - - if ( 'horizontal' === $direction ) { - $this->direction = $direction; - } - } - - /** - * Update the image metadata with the modifier. - * - * @access public - * - * @param array $meta Metadata to update. - * @return array Updated metadata. - */ - public function apply_to_meta( $meta ) { - if ( $this->is_vertical() ) { - $meta['flip_vertical'] = ! $meta['flip_vertical']; - } elseif ( $this->is_horizontal() ) { - $meta['flip_horizontal'] = ! $meta['flip_horizontal']; - } - - return $meta; - } - - /** - * Apply the modifier to the image - * - * @access public - * - * @param WP_Image_Editor $image Image editor. - * @return bool|WP_Error True on success, WP_Error object or false on failure. - */ - public function apply_to_image( $image ) { - return $image->flip( $this->is_vertical(), $this->is_horizontal() ); - } - - /** - * Checks if the modifier is a vertical flip - * - * @access private - * - * @return boolean true if the modifier is vertical - */ - private function is_vertical() { - return 'vertical' === $this->direction; - } - - /** - * Checks if the modifier is a horizontal flip - * - * @access private - * - * @return boolean true if the modifier is horizontal - */ - private function is_horizontal() { - return 'horizontal' === $this->direction; - } - - /** - * Gets the new filename based on metadata. - * - * @access public - * - * @param array $meta Image metadata. - * @return string Filename for the edited image. - */ - public static function get_filename( $meta ) { - $parts = array(); - - if ( $meta['flip_horizontal'] ) { - $parts[] = 'flip_horizontal'; - } - - if ( $meta['flip_vertical'] ) { - $parts[] = 'flip_vertical'; - } - - if ( count( $parts ) > 0 ) { - return implode( '-', $parts ); - } - - return false; - } - - /** - * Gets the default metadata for the flip modifier. - * - * @access public - * - * @return array Default metadata. - */ - public static function get_default_meta() { - return array( - 'flip_horizontal' => false, - 'flip_vertical' => false, - ); - } -} diff --git a/lib/image-editor/class-image-editor-rotate.php b/lib/image-editor/class-image-editor-rotate.php deleted file mode 100644 index 82edd5524e80c..0000000000000 --- a/lib/image-editor/class-image-editor-rotate.php +++ /dev/null @@ -1,104 +0,0 @@ -angle = $this->restrict_angle( intval( $angle, 10 ) ); - } - - /** - * Update the image metadata with the modifier. - * - * @access public - * - * @param array $meta Metadata to update. - * @return array Updated metadata. - */ - public function apply_to_meta( $meta ) { - $meta['rotate'] += $this->angle; - $meta['rotate'] = $this->restrict_angle( $meta['rotate'] ); - - return $meta; - } - - /** - * Apply the rotate modifier to the image - * - * @access public - * - * @param WP_Image_Editor $image Image editor. - * @return bool|WP_Error True on success, WP_Error object or false on failure. - */ - public function apply_to_image( $image ) { - return $image->rotate( 0 - $this->angle ); - } - - /** - * Puts the angle in the range [ 0, 360 ). - * - * @access private - * - * @param integer $angle Angle to restrict. - * @return integer Restricted angle. - */ - private function restrict_angle( $angle ) { - if ( $angle >= 360 ) { - $angle = $angle % 360; - } elseif ( $angle < 0 ) { - $angle = 360 - ( abs( $angle ) % 360 ); - } - - return $angle; - } - - /** - * Gets the new filename based on metadata. - * - * @access public - * - * @param array $meta Image metadata. - * @return string Filename for the edited image. - */ - public static function get_filename( $meta ) { - if ( $meta['rotate'] > 0 ) { - return 'rotate-' . intval( $meta['rotate'], 10 ); - } - - return false; - } - - /** - * Gets the default metadata for the rotate modifier. - * - * @access public - * - * @return array Default metadata. - */ - public static function get_default_meta() { - return array( 'rotate' => 0 ); - } -} diff --git a/lib/image-editor/class-image-editor.php b/lib/image-editor/class-image-editor.php deleted file mode 100644 index a201f65453a37..0000000000000 --- a/lib/image-editor/class-image-editor.php +++ /dev/null @@ -1,295 +0,0 @@ -all_modifiers = array( - 'Image_Editor_Crop', - 'Image_Editor_Flip', - 'Image_Editor_Rotate', - ); - } - - /** - * Modifies an image. - * - * @param integer $media_id Media id. - * @param Image_Editor_Modifier $modifier Modifier to apply to the image. - * @return array|WP_Error If successful image JSON containing the media_id and url of modified image, otherwise WP_Error. - */ - public function modify_image( $media_id, $modifier ) { - // Get image information. - $info = $this->load_image_info( $media_id ); - if ( is_wp_error( $info ) ) { - return $info; - } - - // Update it with our modifier. - $info['meta'] = $modifier->apply_to_meta( $info['meta'] ); - - // Generate filename based on current attributes. - $target_file = $this->get_filename( $info['meta'] ); - - // Does the image already exist? - $image = $this->get_existing_image( $info, $target_file ); - if ( $image ) { - // Return the existing image. - return $image; - } - - // Try and load the image itself. - $image = $this->load_image( $media_id, $info ); - if ( is_wp_error( $image ) ) { - return $image; - } - - // Finally apply the modification. - $modified = $modifier->apply_to_image( $image['editor'] ); - if ( is_wp_error( $modified ) ) { - return $modified; - } - - // And save. - return $this->save_image( $image, $target_file, $info ); - } - - /** - * Loads an image for editing. - * - * @param integer $media_id Image ID. - * @return array|WP_Error The WP_Image_Editor and image path if successful, WP_Error otherwise. - */ - private function load_image( $media_id ) { - require_once ABSPATH . 'wp-admin/includes/image.php'; - - $image_path = get_attached_file( $media_id ); - - if ( empty( $image_path ) ) { - return new WP_Error( 'fileunknown', 'Unable to find original media file' ); - } - - $image_editor = wp_get_image_editor( $image_path ); - if ( ! $image_editor->load() ) { - return new WP_Error( 'fileload', 'Unable to load original media file' ); - } - - return array( - 'editor' => $image_editor, - 'path' => $image_path, - ); - } - - /** - * Gets the JSON response object for an image. - * - * @param integer $id Image ID. - * @return array Image JSON. - */ - private function get_image_as_json( $id ) { - return array( - 'media_id' => $id, - 'url' => wp_get_attachment_image_url( $id, 'original' ), - ); - } - - /** - * Checks for the existence of an image and if it exists, return the image. - * - * @param array $attachment Attachment with url to look up. - * @param string $target_file Target file name to look up. - * @return array|false Image JSON if exists, otherwise false. - */ - private function get_existing_image( $attachment, $target_file ) { - $url = str_replace( basename( $attachment['url'] ), $target_file, $attachment['url'] ); - - $new_id = attachment_url_to_postid( $url ); - if ( $new_id > 0 ) { - return $this->get_image_as_json( $new_id ); - } - - return false; - } - - /** - * Saves an edited image. - * - * @param array $image_edit Image path and editor to save. - * @param string $target_name Target file name to save as. - * @param array $attachment Attachment with metadata to apply. - * @return array|WP_Error Image JSON if successful, WP_Error otherwise - */ - private function save_image( $image_edit, $target_name, $attachment ) { - $filename = rtrim( dirname( $image_edit['path'] ), '/' ) . '/' . $target_name; - - // Save to disk. - $saved = $image_edit['editor']->save( $filename ); - - if ( is_wp_error( $saved ) ) { - return $saved; - } - - // Update attachment details. - $attachment_post = array( - 'guid' => $saved['path'], - 'post_mime_type' => $saved['mime-type'], - 'post_title' => pathinfo( $target_name, PATHINFO_FILENAME ), - 'post_content' => '', - 'post_status' => 'inherit', - ); - - // Add this as an attachment. - $attachment_id = wp_insert_attachment( $attachment_post, $saved['path'], 0 ); - if ( 0 === $attachment_id ) { - return new WP_Error( 'attachment', 'Unable to add image as attachment' ); - } - - // Generate thumbnails. - $metadata = wp_generate_attachment_metadata( $attachment_id, $saved['path'] ); - - // Store out meta data. - $metadata[ self::META_KEY ] = $attachment['meta']; - - wp_update_attachment_metadata( $attachment_id, $metadata ); - - return $this->get_image_as_json( $attachment_id ); - } - - /** - * Computes the filename based on metadata. - * - * @param array $meta Metadata for the image. - * @return string Name of the edited file. - */ - private function get_filename( $meta ) { - $parts = array(); - - foreach ( $this->all_modifiers as $modifier ) { - $parts[] = $modifier::get_filename( $meta ); - } - - $parts = array_filter( $parts ); - - if ( count( $parts ) > 0 ) { - return sprintf( '%s-%s', implode( '-', $parts ), $meta['original_name'] ); - } - - return $meta['original_name']; - } - - /** - * Loads image info. - * - * @param integer $media_id Image ID. - * @return array|WP_Error If successful image info, otherwise a WP_Error - */ - private function load_image_info( $media_id ) { - $attachment_info = wp_get_attachment_metadata( $media_id ); - $media_url = wp_get_attachment_image_url( $media_id, 'original' ); - - if ( ! $attachment_info || ! $media_url ) { - return new WP_Error( 'unknown', 'Unable to get meta information for file' ); - } - - $default_meta = array(); - foreach ( $this->all_modifiers as $modifier ) { - $default_meta = array_merge( $default_meta, $modifier::get_default_meta() ); - } - - $info = array( - 'url' => $media_url, - 'media_id' => $media_id, - 'meta' => array_merge( - $default_meta, - array( 'original_name' => basename( $media_url ) ) - ), - ); - - if ( isset( $attachment_info[ self::META_KEY ] ) ) { - $info['meta'] = array_merge( $info['meta'], $attachment_info[ self::META_KEY ] ); - } - - return $info; - } -} - -/** - * Abstract class for image modifiers. Any modifier to an image should implement this. - * - * @abstract - */ -abstract class Image_Editor_Modifier { - - /** - * Update the image metadata with the modifier. - * - * @abstract - * @access public - * - * @param array $meta Metadata to update. - * @return array Updated metadata. - */ - abstract public function apply_to_meta( $meta ); - - /** - * Apply the modifier to the image - * - * @abstract - * @access public - * - * @param WP_Image_Editor $image Image editor. - * @return bool|WP_Error True on success, WP_Error object or false on failure. - */ - abstract public function apply_to_image( $image ); - - /** - * Gets the new filename based on metadata. - * - * @abstract - * @access public - * - * @param array $meta Image metadata. - * @return string Filename for the edited image. - */ - abstract public static function get_filename( $meta ); - - /** - * Gets the default metadata for an image modifier. - * - * @abstract - * @access public - * - * @return array Default metadata. - */ - abstract public static function get_default_meta(); -} diff --git a/lib/load.php b/lib/load.php index f13302e7e5dd8..540539f56ba59 100644 --- a/lib/load.php +++ b/lib/load.php @@ -29,12 +29,11 @@ function gutenberg_is_experiment_enabled( $name ) { /** * Start: Include for phase 2 */ - if ( ! class_exists( 'WP_REST_Widget_Forms' ) ) { - require dirname( __FILE__ ) . '/class-wp-rest-widget-forms.php'; + if ( ! class_exists( 'WP_REST_Widget_Utils_Controller' ) ) { + require dirname( __FILE__ ) . '/class-wp-rest-widget-utils-controller.php'; } - if ( ! class_exists( 'WP_REST_Widget_Areas_Controller' ) ) { - require dirname( __FILE__ ) . '/class-experimental-wp-widget-blocks-manager.php'; - require dirname( __FILE__ ) . '/class-wp-rest-widget-areas-controller.php'; + if ( ! class_exists( 'WP_REST_Sidebars_Controller' ) ) { + require_once dirname( __FILE__ ) . '/class-wp-rest-sidebars-controller.php'; } if ( ! class_exists( 'WP_REST_Block_Directory_Controller' ) ) { require dirname( __FILE__ ) . '/class-wp-rest-block-directory-controller.php'; @@ -60,6 +59,12 @@ function gutenberg_is_experiment_enabled( $name ) { if ( ! class_exists( 'WP_REST_Plugins_Controller' ) ) { require_once dirname( __FILE__ ) . '/class-wp-rest-plugins-controller.php'; } + if ( ! class_exists( 'WP_REST_Post_Format_Search_Handler' ) ) { + require_once dirname( __FILE__ ) . '/class-wp-rest-post-format-search-handler.php'; + } + if ( ! class_exists( 'WP_REST_Term_Search_Handler' ) ) { + require_once dirname( __FILE__ ) . '/class-wp-rest-term-search-handler.php'; + } /** * End: Include for phase 2 */ @@ -67,10 +72,6 @@ function gutenberg_is_experiment_enabled( $name ) { require dirname( __FILE__ ) . '/rest-api.php'; } -if ( ! class_exists( 'WP_Block_Styles_Registry' ) ) { - require dirname( __FILE__ ) . '/class-wp-block-styles-registry.php'; -} - if ( ! class_exists( 'WP_Block_Patterns_Registry' ) ) { require dirname( __FILE__ ) . '/class-wp-block-patterns-registry.php'; } @@ -86,23 +87,37 @@ function gutenberg_is_experiment_enabled( $name ) { if ( ! class_exists( 'WP_Block_List' ) ) { require dirname( __FILE__ ) . '/class-wp-block-list.php'; } +if ( ! class_exists( 'WP_Widget_Block' ) ) { + require_once dirname( __FILE__ ) . '/class-wp-widget-block.php'; +} +require_once dirname( __FILE__ ) . '/widgets-page.php'; require dirname( __FILE__ ) . '/compat.php'; require dirname( __FILE__ ) . '/utils.php'; +// Include FSE related files only if the experiment is enabled. +if ( gutenberg_is_experiment_enabled( 'gutenberg-full-site-editing' ) ) { + require dirname( __FILE__ ) . '/templates.php'; + require dirname( __FILE__ ) . '/template-parts.php'; + require dirname( __FILE__ ) . '/template-loader.php'; + require dirname( __FILE__ ) . '/edit-site-page.php'; + require dirname( __FILE__ ) . '/edit-site-export.php'; +} + +require dirname( __FILE__ ) . '/block-patterns.php'; require dirname( __FILE__ ) . '/blocks.php'; -require dirname( __FILE__ ) . '/templates.php'; -require dirname( __FILE__ ) . '/template-parts.php'; -require dirname( __FILE__ ) . '/template-loader.php'; require dirname( __FILE__ ) . '/client-assets.php'; require dirname( __FILE__ ) . '/block-directory.php'; require dirname( __FILE__ ) . '/demo.php'; require dirname( __FILE__ ) . '/widgets.php'; -require dirname( __FILE__ ) . '/widgets-page.php'; +require dirname( __FILE__ ) . '/navigation.php'; require dirname( __FILE__ ) . '/navigation-page.php'; require dirname( __FILE__ ) . '/experiments-page.php'; require dirname( __FILE__ ) . '/customizer.php'; -require dirname( __FILE__ ) . '/edit-site-page.php'; -require dirname( __FILE__ ) . '/edit-site-export.php'; -require dirname( __FILE__ ) . '/editor-features.php'; require dirname( __FILE__ ) . '/global-styles.php'; +require dirname( __FILE__ ) . '/block-supports/index.php'; +require dirname( __FILE__ ) . '/block-supports/align.php'; +require dirname( __FILE__ ) . '/block-supports/colors.php'; +require dirname( __FILE__ ) . '/block-supports/typography.php'; +require dirname( __FILE__ ) . '/block-supports/custom-classname.php'; +require dirname( __FILE__ ) . '/block-supports/generated-classname.php'; diff --git a/lib/navigation-page.php b/lib/navigation-page.php index 74227fcfbd1cd..919c776306be4 100644 --- a/lib/navigation-page.php +++ b/lib/navigation-page.php @@ -58,11 +58,10 @@ function gutenberg_navigation_init( $hook ) { } $settings = array( - 'disableCustomColors' => get_theme_support( 'disable-custom-colors' ), - 'disableCustomFontSizes' => get_theme_support( 'disable-custom-font-sizes' ), - 'imageSizes' => $available_image_sizes, - 'isRTL' => is_rtl(), - 'maxUploadFileSize' => $max_upload_size, + 'imageSizes' => $available_image_sizes, + 'isRTL' => is_rtl(), + 'maxUploadFileSize' => $max_upload_size, + 'blockNavMenus' => get_theme_support( 'block-nav-menus' ), ); list( $color_palette, ) = (array) get_theme_support( 'editor-color-palette' ); @@ -76,6 +75,8 @@ function gutenberg_navigation_init( $hook ) { $settings['fontSizes'] = $font_sizes; } + $settings = gutenberg_experimental_global_styles_settings( $settings ); + wp_add_inline_script( 'wp-edit-navigation', sprintf( diff --git a/lib/navigation.php b/lib/navigation.php new file mode 100644 index 0000000000000..66d27b16696f2 --- /dev/null +++ b/lib/navigation.php @@ -0,0 +1,375 @@ +unsanitized_post_values(); + if ( isset( $values[ "nav_menu_item[$menu_item_db_id]" ]['content'] ) ) { + if ( is_string( $values[ "nav_menu_item[$menu_item_db_id]" ]['content'] ) ) { + $args['menu-item-content'] = $values[ "nav_menu_item[$menu_item_db_id]" ]['content']; + } elseif ( isset( $values[ "nav_menu_item[$menu_item_db_id]" ]['content']['raw'] ) ) { + $args['menu-item-content'] = $values[ "nav_menu_item[$menu_item_db_id]" ]['content']['raw']; + } + } + } + + // Everything else belongs in `wp_update_nav_menu_item()`. + + $defaults = array( + 'menu-item-content' => '', + ); + + $args = wp_parse_args( $args, $defaults ); + + update_post_meta( $menu_item_db_id, '_menu_item_content', wp_slash( $args['menu-item-content'] ) ); +} +add_action( 'wp_update_nav_menu_item', 'gutenberg_update_nav_menu_item_content', 10, 3 ); + +/** + * Shim that hooks into `wp_setup_nav_menu_items` and makes it so that nav menu + * items have a 'content' field. This field contains HTML and is used by nav + * menu items with `type` set to `'block'`. + * + * Specifically, this shim makes it so that the `wp_setup_nav_menu_item()` + * function sets `content` on the returned menu item. When merged to Core, this + * functionality should exist in `wp_setup_nav_menu_item()`. + * + * This shim can be removed when the Gutenberg plugin requires a WordPress + * version that has the ticket below. + * + * @see https://core.trac.wordpress.org/ticket/50544 + * + * @param object $menu_item The menu item object. + * + * @return object Updated menu item object. + */ +function gutenberg_setup_block_nav_menu_item( $menu_item ) { + if ( 'block' === $menu_item->type ) { + $menu_item->type_label = __( 'Block', 'gutenberg' ); + $menu_item->content = ! isset( $menu_item->content ) ? get_post_meta( $menu_item->db_id, '_menu_item_content', true ) : $menu_item->content; + + // Set to make the menu item display nicely in nav-menus.php. + $menu_item->object = 'block'; + $menu_item->title = __( 'Block', 'gutenberg' ); + } + + return $menu_item; +} +add_filter( 'wp_setup_nav_menu_item', 'gutenberg_setup_block_nav_menu_item' ); + +/** + * Shim that hooks into `walker_nav_menu_start_el` and makes it so that the + * default walker which renders a menu will correctly render the HTML associated + * with any navigation menu item that has `type` set to `'block`'. + * + * Specifically, this shim makes it so that `Walker_Nav_Menu::start_el()` + * renders the `content` of a nav menu item when its `type` is `'block'`. When + * merged to Core, this functionality should exist in + * `Walker_Nav_Menu::start_el()`. + * + * This shim can be removed when the Gutenberg plugin requires a WordPress + * version that has the ticket below. + * + * @see https://core.trac.wordpress.org/ticket/50544 + * + * @param string $item_output The menu item's starting HTML output. + * @param WP_Post $item Menu item data object. + * @param int $depth Depth of menu item. Used for padding. + * @param stdClass $args An object of wp_nav_menu() arguments. + * + * @return string The menu item's updated HTML output. + */ +function gutenberg_output_block_nav_menu_item( $item_output, $item, $depth, $args ) { + if ( 'block' === $item->type ) { + $item_output = $args->before; + /** This filter is documented in wp-includes/post-template.php */ + $item_output .= apply_filters( 'the_content', $item->content ); + $item_output .= $args->after; + } + + return $item_output; +} +add_filter( 'walker_nav_menu_start_el', 'gutenberg_output_block_nav_menu_item', 10, 4 ); + +/** + * Shim that prevents menu items with type `'block'` from being rendered in the + * frontend when the theme does not support block menus. + * + * Specifically, this shim makes it so that `wp_nav_menu()` will remove any menu + * items that have a `type` of `'block'` from `$sorted_menu_items`. When merged + * to Core, this functionality should exist in `wp_nav_menu()`. + * + * This shim can be removed when the Gutenberg plugin requires a WordPress + * version that has the ticket below. + * + * @see https://core.trac.wordpress.org/ticket/50544 + * + * @param array $menu_items The menu items, sorted by each menu item's menu order. + * + * @return array Updated menu items, sorted by each menu item's menu order. + */ +function gutenberg_remove_block_nav_menu_items( $menu_items ) { + if ( current_theme_supports( 'block-nav-menus' ) ) { + return $menu_items; + } + + return array_filter( + $menu_items, + function( $menu_item ) { + return 'block' !== $menu_item->type; + } + ); +} +add_filter( 'wp_nav_menu_objects', 'gutenberg_remove_block_nav_menu_items', 10 ); + +/** + * Recursively converts a list of menu items into a list of blocks. This is a + * helper function used by `gutenberg_output_block_nav_menu()`. + * + * Transformation depends on the menu item type. Link menu items are turned into + * a `core/navigation-link` block. Block menu items are simply parsed. + * + * @param array $menu_items The menu items to convert, sorted by each menu item's menu order. + * @param array $menu_items_by_parent_id All menu items, indexed by their parent's ID. + + * @return array Updated menu items, sorted by each menu item's menu order. + */ +function gutenberg_convert_menu_items_to_blocks( + $menu_items, + &$menu_items_by_parent_id +) { + if ( empty( $menu_items ) ) { + return array(); + } + + $blocks = array(); + + foreach ( $menu_items as $menu_item ) { + if ( 'block' === $menu_item->type ) { + $parsed_blocks = parse_blocks( $menu_item->content ); + + if ( count( $parsed_blocks ) ) { + $block = $parsed_blocks[0]; + } else { + $block = array( + 'blockName' => 'core/freeform', + 'attrs' => array( + 'originalContent' => $menu_item->content, + ), + ); + } + } else { + $block = array( + 'blockName' => 'core/navigation-link', + 'attrs' => array( + 'label' => $menu_item->title, + 'url' => $menu_item->url, + ), + ); + } + + $block['innerBlocks'] = gutenberg_convert_menu_items_to_blocks( + isset( $menu_items_by_parent_id[ $menu_item->ID ] ) + ? $menu_items_by_parent_id[ $menu_item->ID ] + : array(), + $menu_items_by_parent_id + ); + + $blocks[] = $block; + } + + return $blocks; +}; + +/** + * Shim that causes `wp_nav_menu()` to output a Navigation block instead of a + * nav menu when the theme supports block menus. The Navigation block is + * constructed by transforming the stored tree of menu items into a tree of + * blocks. + * + * Specifically, this shim makes it so that `wp_nav_menu()` returns early when + * the theme supports block menus. When merged to Core, this functionality + * should exist in `wp_nav_menu()` after `$sorted_menu_items` is set. The + * duplicated code (marked using BEGIN and END) can be deleted. + * + * This shim can be removed when the Gutenberg plugin requires a WordPress + * version that has the ticket below. + * + * @see https://core.trac.wordpress.org/ticket/50544 + * + * @param string|null $output Nav menu output to short-circuit with. Default null. + * @param stdClass $args An object containing wp_nav_menu() arguments. + * + * @return string|null Nav menu output to short-circuit with. + */ +function gutenberg_output_block_nav_menu( $output, $args ) { + if ( ! current_theme_supports( 'block-nav-menus' ) ) { + return null; + } + + // BEGIN: Code that already exists in wp_nav_menu(). + + // Get the nav menu based on the requested menu. + $menu = wp_get_nav_menu_object( $args->menu ); + + // Get the nav menu based on the theme_location. + $locations = get_nav_menu_locations(); + if ( ! $menu && $args->theme_location && $locations && isset( $locations[ $args->theme_location ] ) ) { + $menu = wp_get_nav_menu_object( $locations[ $args->theme_location ] ); + } + + // Get the first menu that has items if we still can't find a menu. + if ( ! $menu && ! $args->theme_location ) { + $menus = wp_get_nav_menus(); + foreach ( $menus as $menu_maybe ) { + $menu_items = wp_get_nav_menu_items( $menu_maybe->term_id, array( 'update_post_term_cache' => false ) ); + if ( $menu_items ) { + $menu = $menu_maybe; + break; + } + } + } + + if ( empty( $args->menu ) ) { + $args->menu = $menu; + } + + // If the menu exists, get its items. + if ( $menu && ! is_wp_error( $menu ) && ! isset( $menu_items ) ) { + $menu_items = wp_get_nav_menu_items( $menu->term_id, array( 'update_post_term_cache' => false ) ); + } + + // Set up the $menu_item variables. + _wp_menu_item_classes_by_context( $menu_items ); + + $sorted_menu_items = array(); + foreach ( (array) $menu_items as $menu_item ) { + $sorted_menu_items[ $menu_item->menu_order ] = $menu_item; + } + + unset( $menu_items, $menu_item ); + + // END: Code that already exists in wp_nav_menu(). + + $menu_items_by_parent_id = array(); + foreach ( $sorted_menu_items as $menu_item ) { + $menu_items_by_parent_id[ $menu_item->menu_item_parent ][] = $menu_item; + } + + $navigation_block = array( + 'blockName' => 'core/navigation', + 'attrs' => array(), + 'innerBlocks' => gutenberg_convert_menu_items_to_blocks( + isset( $menu_items_by_parent_id[0] ) + ? $menu_items_by_parent_id[0] + : array(), + $menu_items_by_parent_id + ), + ); + + return render_block( $navigation_block ); +} +add_filter( 'pre_wp_nav_menu', 'gutenberg_output_block_nav_menu', 10, 2 ); + +/** + * Shim that makes nav-menus.php nicely display a menu item with its `type` set to + * `'block'`. + * + * Specifically, this shim makes it so that `Walker_Nav_Menu_Edit::start_el()` + * outputs extra form fields. When merged to Core, this markup should exist in + * `Walker_Nav_Menu_Edit::start_el()`. + * + * This shim can be removed when the Gutenberg plugin requires a WordPress + * version that has the ticket below. + * + * @see https://core.trac.wordpress.org/ticket/50544 + * + * @param int $item_id Menu item ID. + * @param WP_Post $item Menu item data object. + */ +function gutenberg_output_block_menu_item_custom_fields( $item_id, $item ) { + if ( 'block' === $item->type ) { + ?> +

+ +

+ __( 'Cover', 'gutenberg' ), - 'categories' => array( 'hero' ), - 'content' => "\n
\n

" . _x( 'abc!', 'pattern', 'gutenberg' ) . "

\n
\n", -); diff --git a/lib/patterns/features-services.php b/lib/patterns/features-services.php deleted file mode 100644 index 026f645876b0f..0000000000000 --- a/lib/patterns/features-services.php +++ /dev/null @@ -1,12 +0,0 @@ - __( 'Features and Services', 'gutenberg' ), - 'content' => "\n
\n
\n
\n
\n
\n\n\n\n

One

\n\n\n\n

This software is design for everyone, emphasizing accessibility, performance, security and ease of use.

\n\n\n\n\n
\n
\n\n\n\n
\n
\n
\n\n\n\n

Two

\n\n\n\n

Simple and predictable so you can easily get started. Offers powerful features for growth and success.

\n\n\n\n\n
\n
\n\n\n\n
\n
\n
\n\n\n\n

Three

\n\n\n\n

Works with minimum setup, so you can focus on sharing your story, product, or services freely.

\n\n\n\n\n
\n
\n
\n
\n", - 'viewportWidth' => 1000, -); diff --git a/lib/patterns/heading-paragraph.php b/lib/patterns/heading-paragraph.php new file mode 100644 index 0000000000000..9a8b160a78772 --- /dev/null +++ b/lib/patterns/heading-paragraph.php @@ -0,0 +1,14 @@ + __( 'Heading and paragraph', 'gutenberg' ), + 'content' => "\n
\n

2.
" . __( 'Which treats of the first sally the ingenious Don Quixote made from home', 'gutenberg' ) . "

\n\n\n\n

" . __( 'These preliminaries settled, he did not care to put off any longer the execution of his design, urged on to it by the thought of all the world was losing by his delay, seeing what wrongs he intended to right, grievances to redress, injustices to repair, abuses to remove, and duties to discharge.', 'gutenberg' ) . "

\n
\n", + 'viewportWidth' => 1000, + 'categories' => array( 'text' ), + 'description' => _x( 'A heading preceded by a chapter number, and followed by a paragraph.', 'Block pattern description', 'gutenberg' ), +); diff --git a/lib/patterns/hero-right-column.php b/lib/patterns/hero-right-column.php deleted file mode 100644 index a392cbfce2398..0000000000000 --- a/lib/patterns/hero-right-column.php +++ /dev/null @@ -1,12 +0,0 @@ - __( 'Hero Right Column', 'gutenberg' ), - 'categories' => array( 'hero', 'columns' ), - 'content' => "\n
\n
\n
\n

Easy & Accessible

\n
\n
\n\n\n\n
\n
\n\n\n\n
\n
\n\n\n\n

Extend it with over 54,000 plugins to help your website meet your needs. Hundreds of thousands of developers and site owners trust it worldwide. Add an online store, galleries, mailing lists, forums, analytics, and much more.

\n\n\n\n

Hundreds of thousands of developers and site owners trust it worldwide. Add an online store, galleries, mailing lists, forums, analytics, and much more.

\n\n\n\n
\n\n\n\n\n
\n
\n
\n", -); diff --git a/lib/patterns/hero-two-columns.php b/lib/patterns/hero-two-columns.php deleted file mode 100644 index 24e9850c42c24..0000000000000 --- a/lib/patterns/hero-two-columns.php +++ /dev/null @@ -1,12 +0,0 @@ - __( 'Hero Two Columns', 'gutenberg' ), - 'categories' => array( 'columns' ), - 'content' => "\n
\n

Enjoy a wide variety of

\n\n\n\n

Custom Designs

\n\n\n\n
\n
\n

Extend it with over 54,000 plugins to help your website meet your needs. Add an online store, galleries, mailing lists, forums, analytics, and much more. Hundreds of thousands of developers and site owners trust it worldwide.

\n
\n\n\n\n
\n

Hundreds of thousands of developers and site owners trust it worldwide. Extend it with over 54,000 plugins to help your website meet your needs. Add an online store, galleries, mailing lists, forums, analytics, and much more.

\n
\n
\n
\n", -); diff --git a/lib/patterns/its-time.php b/lib/patterns/its-time.php deleted file mode 100644 index 7291b3594b336..0000000000000 --- a/lib/patterns/its-time.php +++ /dev/null @@ -1,12 +0,0 @@ - __( 'It\'s time', 'gutenberg' ), - 'categories' => array( 'text', 'columns' ), - 'content' => "\n
\n
\n
\n

NEW

\n\n\n\n

John Lenwood \"Jackie\" McLean was an American jazz alto saxophonist, composer, bandleader, and educator, and is one of the few musicians to be elected to the DownBeat Hall of Fame in the year of their death.

\n
\n\n\n\n
\n

space

\n\n\n\n

Derek Ansell's full-length biography of McLean, Sugar Free Saxophone (London: Northway Books, 2012), details the story of his career and provides a full analysis of his music on record.

\n
\n
\n\n\n\n
\n
\n\n\n\n
\n

it's time

\n
\n
\n
\n", -); diff --git a/lib/patterns/large-header-button.php b/lib/patterns/large-header-button.php new file mode 100644 index 0000000000000..1d71e5703f5b5 --- /dev/null +++ b/lib/patterns/large-header-button.php @@ -0,0 +1,14 @@ + __( 'Large header with a heading and a button ', 'gutenberg' ), + 'content' => "\n
\n
\n
\n
\n
\n\n\n\n
\n
\n\n\n\n

" . __( 'Thou hast seen', 'gutenberg' ) . '
' . __( 'nothing yet', 'gutenberg' ) . "

\n\n\n\n\n\n\n\n
\n
\n\n\n\n
\n
\n
\n
\n
\n", + 'viewportWidth' => 1000, + 'categories' => array( 'header' ), + 'description' => _x( 'A large hero section with a bright gradient background, a big heading and a filled button.', 'Block pattern description', 'gutenberg' ), +); diff --git a/lib/patterns/large-header.php b/lib/patterns/large-header.php new file mode 100644 index 0000000000000..0213bf8bfeb72 --- /dev/null +++ b/lib/patterns/large-header.php @@ -0,0 +1,14 @@ + __( 'Large header with a heading', 'gutenberg' ), + 'content' => "\n
\n

" . __( 'Don Quixote', 'gutenberg' ) . "

\n
\n", + 'viewportWidth' => 1000, + 'categories' => array( 'header' ), + 'description' => _x( 'A large hero section with an example background image and a heading in the center.', 'Block pattern description', 'gutenberg' ), +); diff --git a/lib/patterns/numbered-features.php b/lib/patterns/numbered-features.php deleted file mode 100644 index 84d461efd1445..0000000000000 --- a/lib/patterns/numbered-features.php +++ /dev/null @@ -1,12 +0,0 @@ - __( 'Numbered Features', 'gutenberg' ), - 'categories' => array( 'features' ), - 'content' => "\n
\n
\n
\n
\n

1

\n
\n\n\n\n
\n

Custom Designs

\n\n\n\n

Extend it with over 54,000 plugins to help your website meet your needs.

\n\n\n\n
\n
\n
\n
\n\n\n\n
\n
\n
\n

2

\n
\n\n\n\n
\n

High Performance

\n\n\n\n

Add an online store, galleries, mailing lists, forums, analytics, and much more.

\n\n\n\n
\n
\n
\n
\n\n\n\n
\n
\n
\n

3

\n
\n\n\n\n
\n

Easy and Accessible

\n\n\n\n

Hundreds of thousands of developers and site owners trust it worldwide.

\n
\n
\n
\n
\n", -); diff --git a/lib/patterns/quote.php b/lib/patterns/quote.php new file mode 100644 index 0000000000000..0e1e0f3b24841 --- /dev/null +++ b/lib/patterns/quote.php @@ -0,0 +1,14 @@ + __( 'Quote', 'gutenberg' ), + 'content' => "\n
\n
\""
\n\n\n\n

" . __( '"Do you see over yonder, friend Sancho, thirty or forty hulking giants? I intend to do battle with them and slay them."', 'gutenberg' ) . '

' . __( '— Don Quixote', 'gutenberg' ) . "
\n\n\n\n
\n
\n", + 'viewportWidth' => 800, + 'categories' => array( 'text' ), + 'description' => _x( 'A quote and citation with an image above, and a separator at the bottom.', 'Block pattern description', 'gutenberg' ), +); diff --git a/lib/patterns/testimonials.php b/lib/patterns/testimonials.php deleted file mode 100644 index 1288d5eec14e4..0000000000000 --- a/lib/patterns/testimonials.php +++ /dev/null @@ -1,12 +0,0 @@ - __( 'Testimonials', 'gutenberg' ), - 'categories' => array( 'testimonials' ), - 'content' => "\n
\n
\n
\n
\n

\"This software is designed for everyone, emphasizing accessibility, performance, security, and ease of use.\"

\n
\n\n\n\n
\n
\n
\"\"/
\n
\n\n\n\n
\n

Doris Som

\n
\n
\n
\n\n\n\n
\n
\n

\"We believe great software should work with minimum set up, so you can focus on sharing your story, or services freely.\"

\n
\n\n\n\n
\n
\n
\"\"/
\n
\n\n\n\n
\n

Walt Art

\n
\n
\n
\n\n\n\n
\n
\n

\"The product is simple and predictable so you can easily get started. It also offers powerful features for success.\"

\n
\n\n\n\n
\n
\n
\"\"/
\n
\n\n\n\n
\n

Moly Neo

\n
\n
\n
\n
\n
\n", -); diff --git a/lib/patterns/text-three-columns-buttons.php b/lib/patterns/text-three-columns-buttons.php new file mode 100644 index 0000000000000..629c839b89bb8 --- /dev/null +++ b/lib/patterns/text-three-columns-buttons.php @@ -0,0 +1,14 @@ + __( 'Three columns of text with buttons', 'gutenberg' ), + 'categories' => array( 'columns' ), + 'content' => "\n
\n
\n
\n

" . __( 'Which treats of the character and pursuits of the famous Don Quixote of La Mancha.', 'gutenberg' ) . "

\n\n\n\n\n
\n\n\n\n
\n

" . __( 'Which treats of the first sally the ingenious Don Quixote made from home.', 'gutenberg' ) . "

\n\n\n\n\n
\n\n\n\n
\n

" . __( 'Wherein is related the droll way in which Don Quixote had himself dubbed a knight.', 'gutenberg' ) . "

\n\n\n\n\n
\n
\n
\n", + 'viewportWidth' => 1000, + 'description' => _x( 'Three small columns of text, each with an outlined button with rounded corners at the bottom.', 'Block pattern description', 'gutenberg' ), +); diff --git a/lib/patterns/text-two-columns-with-images.php b/lib/patterns/text-two-columns-with-images.php new file mode 100644 index 0000000000000..c4978acbc371e --- /dev/null +++ b/lib/patterns/text-two-columns-with-images.php @@ -0,0 +1,13 @@ + __( 'Two columns of text with images', 'gutenberg' ), + 'categories' => array( 'columns' ), + 'content' => "\n
\n
\n
\n
\"\"/
\n\n\n\n

" . __( 'They must know, then, that the above-named gentleman whenever he was at leisure (which was mostly all the year round) gave himself up to reading books of chivalry with such ardour and avidity that he almost entirely neglected the pursuit of his field-sports, and even the management of his property; and to such a pitch did his eagerness and infatuation go that he sold many an acre of tillageland to buy books of chivalry to read, and brought home as many of them as he could get.', 'gutenberg' ) . "

\n
\n\n\n\n
\n
\"\"/
\n\n\n\n

" . __( 'But of all there were none he liked so well as those of the famous Feliciano de Silva\'s composition, for their lucidity of style and complicated conceits were as pearls in his sight, particularly when in his reading he came upon courtships and cartels, where he often found passages like "the reason of the unreason with which my reason is afflicted so weakens my reason that with reason I murmur at your beauty;" or again, "the high heavens render you deserving of the desert your greatness deserves."', 'gutenberg' ) . "

\n
\n
\n
\n", + 'description' => _x( 'Two columns of text, each with an image on top.', 'Block pattern description', 'gutenberg' ), +); diff --git a/lib/patterns/text-two-columns.php b/lib/patterns/text-two-columns.php index ad297deb29745..ca40c74289a0a 100644 --- a/lib/patterns/text-two-columns.php +++ b/lib/patterns/text-two-columns.php @@ -6,7 +6,8 @@ */ return array( - 'title' => __( 'Two Columns of Text', 'gutenberg' ), - 'categories' => array( 'columns', 'text' ), - 'content' => "\n
\n
\n

CHAPTER 1. Loomings

\n\n\n\n

Call me Ishmael. Some years ago—never mind how long precisely—having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world. It is a way I have of driving off the spleen and regulating the circulation.

\n
\n\n\n\n
\n

Whenever I find myself growing grim about the mouth; whenever it is a damp, drizzly November in my soul; whenever I find myself involuntarily pausing before coffin warehouses, and bringing up the rear of every funeral I meet; and especially whenever my hypos get such an upper hand of me, that it requires a strong moral principle to prevent me from deliberately stepping into the street, and methodically knocking people’s hats off—then, I account it high time to get to sea as soon as I can.

\n
\n
\n", + 'title' => __( 'Two columns of text', 'gutenberg' ), + 'categories' => array( 'columns' ), + 'content' => "\n
\n

" . __( 'Which treats of the character and pursuits of the famous gentleman Don Quixote of La Mancha', 'gutenberg' ) . "

\n\n\n\n
\n
\n

" . __( 'In a village of La Mancha, the name of which I have no desire to call to mind, there lived not long since one of those gentlemen that keep a lance in the lance-rack, an old buckler, a lean hack, and a greyhound for coursing. An olla of rather more beef than mutton, a salad on most nights, scraps on Saturdays, lentils on Fridays, and a pigeon or so extra on Sundays, made away with three-quarters of his income.', 'gutenberg' ) . "

\n
\n\n\n\n
\n

" . __( 'The rest of it went in a doublet of fine cloth and velvet breeches and shoes to match for holidays, while on week-days he made a brave figure in his best homespun. He had in his house a housekeeper past forty, a niece under twenty, and a lad for the field and market-place, who used to saddle the hack as well as handle the bill-hook. The age of this gentleman of ours was bordering on fifty; he was of a hardy habit, spare, gaunt-featured, a very early riser and a great sportsman.', 'gutenberg' ) . "

\n
\n
\n
\n", + 'description' => _x( 'Two columns of text preceded by a long heading.', 'Block pattern description', 'gutenberg' ), ); diff --git a/lib/patterns/three-buttons.php b/lib/patterns/three-buttons.php new file mode 100644 index 0000000000000..2f60d3cf009bf --- /dev/null +++ b/lib/patterns/three-buttons.php @@ -0,0 +1,14 @@ + __( 'Three buttons', 'gutenberg' ), + 'content' => "\n\n", + 'viewportWidth' => 600, + 'categories' => array( 'buttons' ), + 'description' => _x( 'Three filled buttons with rounded corners, side by side.', 'Block pattern description', 'gutenberg' ), +); diff --git a/lib/patterns/two-buttons.php b/lib/patterns/two-buttons.php index ff434b858782d..90564c4c30487 100644 --- a/lib/patterns/two-buttons.php +++ b/lib/patterns/two-buttons.php @@ -6,8 +6,9 @@ */ return array( - 'title' => __( 'Two Buttons', 'gutenberg' ), - 'content' => "\n\n", + 'title' => __( 'Two buttons', 'gutenberg' ), + 'content' => "\n\n", 'viewportWidth' => 500, 'categories' => array( 'buttons' ), + 'description' => _x( 'Two buttons, one filled and one outlined, side by side.', 'Block pattern description', 'gutenberg' ), ); diff --git a/lib/patterns/two-images.php b/lib/patterns/two-images.php index a998d86f2fc86..6b71853f3f970 100644 --- a/lib/patterns/two-images.php +++ b/lib/patterns/two-images.php @@ -6,7 +6,8 @@ */ return array( - 'title' => __( 'Two images side by side', 'gutenberg' ), - 'categories' => array( 'gallery' ), - 'content' => "\n\n", + 'title' => __( 'Two images side by side', 'gutenberg' ), + 'categories' => array( 'gallery' ), + 'description' => _x( 'An image gallery with two example images.', 'Block pattern description', 'gutenberg' ), + 'content' => "\n\n", ); diff --git a/lib/rest-api.php b/lib/rest-api.php index c0f1c2aa31950..e10f52805bcb4 100644 --- a/lib/rest-api.php +++ b/lib/rest-api.php @@ -55,34 +55,73 @@ function gutenberg_filter_oembed_result( $response, $handler, $request ) { /** * Add fields required for site editing to the /themes endpoint. * - * @todo Remove once https://core.trac.wordpress.org/ticket/49906 is fixed. - * @see https://github.com/WordPress/wordpress-develop/pull/222 + * @todo Remove once Gutenberg's minimum required WordPress version is v5.5. + * @see https://core.trac.wordpress.org/ticket/49906 + * @see https://core.trac.wordpress.org/changeset/47921 * * @param WP_REST_Response $response The response object. * @param WP_Theme $theme Theme object used to create response. * @param WP_REST_Request $request Request object. */ function gutenberg_filter_rest_prepare_theme( $response, $theme, $request ) { - $data = $response->get_data(); - $field_mappings = array( + $data = $response->get_data(); + $fields = array_keys( $data ); + + /** + * The following is basically copied from Core's WP_REST_Themes_Controller::prepare_item_for_response() + * (as of WP v5.5), with `rest_is_field_included()` replaced by `! in_array()`. + * This makes sure that we add all the fields that are missing from Core. + * + * @see https://github.com/WordPress/WordPress/blob/019bc2d244c4d536338d2c634419583e928143df/wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php#L118-L167 + */ + if ( ! in_array( 'stylesheet', $fields, true ) ) { + $data['stylesheet'] = $theme->get_stylesheet(); + } + + if ( ! in_array( 'template', $fields, true ) ) { + /** + * Use the get_template() method, not the 'Template' header, for finding the template. + * The 'Template' header is only good for what was written in the style.css, while + * get_template() takes into account where WordPress actually located the theme and + * whether it is actually valid. + */ + $data['template'] = $theme->get_template(); + } + + $plain_field_mappings = array( + 'requires_php' => 'RequiresPHP', + 'requires_wp' => 'RequiresWP', + 'textdomain' => 'TextDomain', + 'version' => 'Version', + ); + + foreach ( $plain_field_mappings as $field => $header ) { + if ( ! in_array( $field, $fields, true ) ) { + $data[ $field ] = $theme->get( $header ); + } + } + + if ( ! in_array( 'screenshot', $fields, true ) ) { + // Using $theme->get_screenshot() with no args to get absolute URL. + $data['screenshot'] = $theme->get_screenshot() ? $theme->get_screenshot() : ''; + } + + $rich_field_mappings = array( 'author' => 'Author', - 'author_name' => 'Author Name', - 'author_uri' => 'Author URI', + 'author_uri' => 'AuthorURI', 'description' => 'Description', 'name' => 'Name', - 'stylesheet' => 'Stylesheet', - 'template' => 'Template', - 'theme_uri' => 'Theme URI', - 'version' => 'Version', + 'tags' => 'Tags', + 'theme_uri' => 'ThemeURI', ); - foreach ( $field_mappings as $field => $theme_field ) { - $data[ $field ] = $theme[ $theme_field ]; + foreach ( $rich_field_mappings as $field => $header ) { + if ( ! in_array( $field, $fields, true ) ) { + $data[ $field ]['raw'] = $theme->display( $header, false, true ); + $data[ $field ]['rendered'] = $theme->display( $header ); + } } - // Using $theme->get_screenshot() with no args to get absolute URL. - $data['screenshot'] = $theme->get_screenshot(); - $response->set_data( $data ); return $response; } @@ -97,32 +136,17 @@ function gutenberg_filter_rest_prepare_theme( $response, $theme, $request ) { * @since 5.0.0 */ function gutenberg_register_rest_widget_updater_routes() { - $widget_forms = new WP_REST_Widget_Forms(); + $widget_forms = new WP_REST_Widget_Utils_Controller(); $widget_forms->register_routes(); } add_action( 'rest_api_init', 'gutenberg_register_rest_widget_updater_routes' ); -/** - * Registers the widget area REST API routes. - * - * @since 5.7.0 - */ -function gutenberg_register_rest_widget_areas() { - $widget_areas_controller = new WP_REST_Widget_Areas_Controller(); - $widget_areas_controller->register_routes(); -} -add_action( 'rest_api_init', 'gutenberg_register_rest_widget_areas' ); - /** * Registers the block directory. * * @since 6.5.0 */ function gutenberg_register_rest_block_directory() { - if ( ! gutenberg_is_experiment_enabled( 'gutenberg-block-directory' ) ) { - return; - } - $block_directory_controller = new WP_REST_Block_Directory_Controller(); $block_directory_controller->register_routes(); } @@ -159,15 +183,20 @@ function gutenberg_register_rest_customizer_nonces() { * Registers the Plugins REST API routes. */ function gutenberg_register_plugins_endpoint() { - if ( ! gutenberg_is_experiment_enabled( 'gutenberg-block-directory' ) ) { - return; - } - $plugins = new WP_REST_Plugins_Controller(); $plugins->register_routes(); } add_action( 'rest_api_init', 'gutenberg_register_plugins_endpoint' ); +/** + * Registers the Sidebars REST API routes. + */ +function gutenberg_register_sidebars_endpoint() { + $sidebars = new WP_REST_Sidebars_Controller(); + $sidebars->register_routes(); +} +add_action( 'rest_api_init', 'gutenberg_register_sidebars_endpoint' ); + /** * Hook in to the nav menu item post type and enable a post type rest endpoint. * @@ -285,11 +314,44 @@ function gutenberg_auto_draft_get_sample_permalink( $permalink, $id, $title, $na * @since 7.x.0 */ function gutenberg_register_image_editor() { - if ( ! gutenberg_is_experiment_enabled( 'gutenberg-rich-image-editing' ) ) { - return; - } + global $wp_version; + + // Strip '-src' from the version string. Messes up version_compare(). + $version = str_replace( '-src', '', $wp_version ); - $image_editor = new WP_REST_Image_Editor_Controller(); - $image_editor->register_routes(); + // Only register routes for versions older than WP 5.5. + if ( version_compare( $version, '5.5-beta', '<' ) ) { + $image_editor = new WP_REST_Image_Editor_Controller(); + $image_editor->register_routes(); + } } add_filter( 'rest_api_init', 'gutenberg_register_image_editor' ); + +/** + * Registers the post format search handler. + * + * @param string $search_handlers Title list of current handlers. + * + * @return array Title updated list of handlers. + */ +function gutenberg_post_format_search_handler( $search_handlers ) { + if ( current_theme_supports( 'post-formats' ) ) { + $search_handlers[] = new WP_REST_Post_Format_Search_Handler(); + } + + return $search_handlers; +} +add_filter( 'wp_rest_search_handlers', 'gutenberg_post_format_search_handler', 10, 5 ); + +/** + * Registers the terms search handler. + * + * @param string $search_handlers Title list of current handlers. + * + * @return array Title updated list of handlers. + */ +function gutenberg_term_search_handler( $search_handlers ) { + $search_handlers[] = new WP_REST_Term_Search_Handler(); + return $search_handlers; +} +add_filter( 'wp_rest_search_handlers', 'gutenberg_term_search_handler', 10, 5 ); diff --git a/lib/template-loader.php b/lib/template-loader.php index b50d83765c52f..82a86e7a539e3 100644 --- a/lib/template-loader.php +++ b/lib/template-loader.php @@ -38,10 +38,6 @@ function get_template_types() { * Adds necessary filters to use 'wp_template' posts instead of theme template files. */ function gutenberg_add_template_loader_filters() { - if ( ! post_type_exists( 'wp_template' ) ) { - return; - } - foreach ( get_template_types() as $template_type ) { if ( 'embed' === $template_type ) { // Skip 'embed' for now because it is not a regular template type. continue; @@ -91,12 +87,11 @@ function get_template_hierarchy( $template_type ) { * @return string The path to the Full Site Editing template canvas file. */ function gutenberg_override_query_template( $template, $type, array $templates = array() ) { - global $_wp_current_template_id, $_wp_current_template_content; + global $_wp_current_template_content; $current_template = gutenberg_find_template_post_and_parts( $type, $templates ); if ( $current_template ) { - $_wp_current_template_id = $current_template['template_post']->ID; $_wp_current_template_content = empty( $current_template['template_post']->post_content ) ? __( 'Empty template.', 'gutenberg' ) : $current_template['template_post']->post_content; if ( isset( $_GET['_wp-find-template'] ) ) { @@ -136,7 +131,7 @@ function gutenberg_override_query_template( $template, $type, array $templates = function create_auto_draft_for_template_part_block( $block ) { $template_part_ids = array(); - if ( 'core/template-part' === $block['blockName'] ) { + if ( 'core/template-part' === $block['blockName'] && isset( $block['attrs']['slug'] ) ) { if ( isset( $block['attrs']['postId'] ) ) { // Template part is customized. $template_part_id = $block['attrs']['postId']; @@ -153,7 +148,7 @@ function create_auto_draft_for_template_part_block( $block ) { array( 'post_type' => 'wp_template_part', 'post_status' => array( 'publish', 'auto-draft' ), - 'name' => $block['attrs']['slug'], + 'title' => $block['attrs']['slug'], 'meta_key' => 'theme', 'meta_value' => $block['attrs']['theme'], 'posts_per_page' => 1, @@ -161,10 +156,11 @@ function create_auto_draft_for_template_part_block( $block ) { ) ); $template_part_post = $template_part_query->have_posts() ? $template_part_query->next_post() : null; - if ( $template_part_post ) { + if ( $template_part_post && 'auto-draft' !== $template_part_post->post_status ) { $template_part_id = $template_part_post->ID; } else { - // Template part is not customized, get it from a file and make an auto-draft for it. + // Template part is not customized, get it from a file and make an auto-draft for it, unless one already exists + // and the underlying file hasn't changed. $template_part_file_path = get_stylesheet_directory() . '/block-template-parts/' . $block['attrs']['slug'] . '.html'; if ( ! file_exists( $template_part_file_path ) ) { @@ -172,24 +168,32 @@ function create_auto_draft_for_template_part_block( $block ) { $template_part_file_path = dirname( __FILE__ ) . '/demo-block-template-parts/' . $block['attrs']['slug'] . '.html'; if ( ! file_exists( $template_part_file_path ) ) { - return; + $template_part_file_path = false; } } else { - return; + $template_part_file_path = false; + } + } + + if ( $template_part_file_path ) { + $file_contents = file_get_contents( $template_part_file_path ); + if ( $template_part_post && $template_part_post->post_content === $file_contents ) { + $template_part_id = $template_part_post->ID; + } else { + $template_part_id = wp_insert_post( + array( + 'post_content' => $file_contents, + 'post_title' => $block['attrs']['slug'], + 'post_status' => 'auto-draft', + 'post_type' => 'wp_template_part', + 'post_name' => $block['attrs']['slug'], + 'meta_input' => array( + 'theme' => $block['attrs']['theme'], + ), + ) + ); } } - $template_part_id = wp_insert_post( - array( - 'post_content' => file_get_contents( $template_part_file_path ), - 'post_title' => $block['attrs']['slug'], - 'post_status' => 'auto-draft', - 'post_type' => 'wp_template_part', - 'post_name' => $block['attrs']['slug'], - 'meta_input' => array( - 'theme' => $block['attrs']['theme'], - ), - ) - ); } } $template_part_ids[ $block['attrs']['slug'] ] = $template_part_id; @@ -416,16 +420,20 @@ function gutenberg_strip_php_suffix( $template_file ) { * @return array Filtered editor settings. */ function gutenberg_template_loader_filter_block_editor_settings( $settings ) { - global $post, $_wp_current_template_id; + global $post; + + if ( ! $post ) { + return $settings; + } - if ( ! $post || ! post_type_exists( 'wp_template' ) || ! post_type_exists( 'wp_template_part' ) ) { + // If this is the Site Editor, auto-drafts for template parts have already been generated + // through `filter_rest_wp_template_part_query`, when called via the REST API. + if ( isset( $settings['editSiteInitialState'] ) ) { return $settings; } - // Create template part auto-drafts for the edited post. - $post = isset( $_wp_current_template_id ) - ? get_post( $_wp_current_template_id ) // It's a template. - : get_post(); // It's a post. + // Otherwise, create template part auto-drafts for the edited post. + $post = get_post(); foreach ( parse_blocks( $post->post_content ) as $block ) { create_auto_draft_for_template_part_block( $block ); } diff --git a/lib/template-parts.php b/lib/template-parts.php index 0edc337c1e968..dde7189621d9f 100644 --- a/lib/template-parts.php +++ b/lib/template-parts.php @@ -9,10 +9,6 @@ * Registers block editor 'wp_template_part' post type. */ function gutenberg_register_template_part_post_type() { - if ( ! gutenberg_is_experiment_enabled( 'gutenberg-full-site-editing' ) ) { - return; - } - $labels = array( 'name' => __( 'Template Parts', 'gutenberg' ), 'singular_name' => __( 'Template Part', 'gutenberg' ), @@ -213,6 +209,34 @@ function filter_rest_wp_template_part_query( $args, $request ) { 'value' => $request['theme'], ); + // Ensure auto-drafts of all theme supplied template parts are created. + if ( wp_get_theme()->get( 'TextDomain' ) === $request['theme'] ) { + // Get file paths for all theme supplied template parts. + $template_part_files = glob( get_stylesheet_directory() . '/block-template-parts/*.html' ); + $template_part_files = is_array( $template_part_files ) ? $template_part_files : array(); + if ( is_child_theme() ) { + $child_template_part_files = glob( get_template_directory() . '/block-template-parts/*.html' ); + $child_template_part_files = is_array( $child_template_part_files ) ? $child_template_part_files : array(); + $template_part_files = array_merge( $template_part_files, $child_template_part_files ); + } + // Build and save each template part. + foreach ( $template_part_files as $template_part_file ) { + $content = file_get_contents( $template_part_file ); + // Infer slug from filepath. + $slug = substr( + $template_part_file, + // Starting position of slug. + strpos( $template_part_file, 'block-template-parts/' ) + 21, + // Subtract ending '.html'. + -5 + ); + // Wrap content with the template part block, parse, and create auto-draft. + $template_part_string = '' . $content . ''; + $template_part_block = parse_blocks( $template_part_string )[0]; + create_auto_draft_for_template_part_block( $template_part_block ); + } + }; + $args['meta_query'] = $meta_query; } diff --git a/lib/templates.php b/lib/templates.php index 4df41ba0b06f5..971398dbd4ff8 100644 --- a/lib/templates.php +++ b/lib/templates.php @@ -9,10 +9,6 @@ * Registers block editor 'wp_template' post type. */ function gutenberg_register_template_post_type() { - if ( ! gutenberg_is_experiment_enabled( 'gutenberg-full-site-editing' ) ) { - return; - } - $labels = array( 'name' => __( 'Templates', 'gutenberg' ), 'singular_name' => __( 'Template', 'gutenberg' ), diff --git a/lib/utils.php b/lib/utils.php index 9d38be7a762a2..b5cdef7f999a9 100644 --- a/lib/utils.php +++ b/lib/utils.php @@ -24,7 +24,7 @@ function gutenberg_experimental_get( $array, $path, $default = array() ) { $path_length = count( $path ); for ( $i = 0; $i < $path_length; ++$i ) { - if ( empty( $array[ $path[ $i ] ] ) ) { + if ( ! isset( $array[ $path[ $i ] ] ) ) { return $default; } $array = $array[ $path[ $i ] ]; diff --git a/lib/widgets-page.php b/lib/widgets-page.php index a6dae5ee90bab..4d7ee91f6d000 100644 --- a/lib/widgets-page.php +++ b/lib/widgets-page.php @@ -12,7 +12,7 @@ * * @param string $page The page name the function is being called for, `'gutenberg_customizer'` for the Customizer. */ -function the_gutenberg_widgets( $page = 'gutenberg_page_gutenberg-widgets' ) { +function the_gutenberg_widgets( $page = 'appearance_page_gutenberg-widgets' ) { ?>
'; + $arg[0]['after_widget_content'] = '
'; + $arg[0]['after_form'] = '
'; + } + + return $arg; +} + +/** + * Registers the WP_Widget_Block widget + */ +function gutenberg_register_widgets() { + if ( ! gutenberg_use_widgets_block_editor() ) { + return; + } + + register_widget( 'WP_Widget_Block' ); + // By default every widget on widgets.php is wrapped with a
. + // This means that you can sometimes end up with invalid HTML, e.g. when + // one of the widgets is a Search block. + // + // To fix the problem, let's add a filter that moves the form below the actual + // widget content. + global $pagenow; + if ( 'widgets.php' === $pagenow ) { + add_filter( + 'dynamic_sidebar_params', + 'gutenberg_override_sidebar_params_for_block_widget' + ); + } +} + +add_action( 'widgets_init', 'gutenberg_register_widgets' ); diff --git a/package-lock.json b/package-lock.json index 253ed76d8dc68..67afb0b317f62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "gutenberg", - "version": "8.3.0", + "version": "8.9.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -126,7 +126,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", - "dev": true, "requires": { "@babel/types": "^7.8.3" } @@ -135,7 +134,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", - "dev": true, "requires": { "@babel/helper-explode-assignable-expression": "^7.8.3", "@babel/types": "^7.8.3" @@ -145,7 +143,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz", "integrity": "sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/types": "^7.9.0" @@ -155,7 +152,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz", "integrity": "sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-module-imports": "^7.8.3", @@ -191,7 +187,6 @@ "version": "7.8.6", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz", "integrity": "sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg==", - "dev": true, "requires": { "@babel/helper-function-name": "^7.8.3", "@babel/helper-member-expression-to-functions": "^7.8.3", @@ -205,7 +200,6 @@ "version": "7.8.8", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-regex": "^7.8.3", @@ -216,7 +210,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", - "dev": true, "requires": { "@babel/helper-function-name": "^7.8.3", "@babel/types": "^7.8.3", @@ -227,7 +220,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", - "dev": true, "requires": { "@babel/traverse": "^7.8.3", "@babel/types": "^7.8.3" @@ -307,7 +299,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", - "dev": true, "requires": { "lodash": "^4.17.13" } @@ -316,7 +307,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-wrap-function": "^7.8.3", @@ -362,7 +352,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", - "dev": true, "requires": { "@babel/helper-function-name": "^7.8.3", "@babel/template": "^7.8.3", @@ -411,7 +400,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.8.3.tgz", "integrity": "sha512-mx0WXDDiIl5DwzMtzWGRSPugXi9BxROS05GQrhLNbEamhBiicgn994ibwkyiBH+6png7bm/yA7AUsvHyCXi4Vw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -431,7 +419,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", - "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" @@ -451,7 +438,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.8.3.tgz", "integrity": "sha512-PYtv2S2OdCdp7GSPDg5ndGZFm9DmWFvuLoS5nBxZCgOBggluLnhTScspJxng96alHQzPyrrHxvC9/w4bFuspeA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-export-default-from": "^7.8.3" @@ -471,7 +457,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" @@ -491,7 +476,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz", "integrity": "sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.0" @@ -501,7 +485,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" @@ -511,7 +494,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.0" @@ -549,7 +531,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz", "integrity": "sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -558,7 +539,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -567,7 +547,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.8.3.tgz", "integrity": "sha512-a1qnnsr73KLNIQcQlcQ4ZHxqqfBKM6iNQZW2OMTyxNbA2WC7SHWHtGVpFzWtQAuS2pspkWVzdEBXXx8Ik0Za4w==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -576,7 +555,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz", "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -594,7 +572,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -612,7 +589,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -630,7 +606,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -639,7 +614,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -648,7 +622,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -666,7 +639,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -675,7 +647,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -684,7 +655,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", - "dev": true, "requires": { "@babel/helper-module-imports": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", @@ -695,7 +665,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -704,7 +673,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", "lodash": "^4.17.13" @@ -714,7 +682,6 @@ "version": "7.9.2", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz", "integrity": "sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-define-map": "^7.8.3", @@ -729,8 +696,7 @@ "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" } } }, @@ -738,7 +704,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -747,7 +712,6 @@ "version": "7.8.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz", "integrity": "sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -775,7 +739,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", - "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" @@ -785,7 +748,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz", "integrity": "sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-flow": "^7.8.3" @@ -795,7 +757,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -804,7 +765,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", - "dev": true, "requires": { "@babel/helper-function-name": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" @@ -814,7 +774,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -823,7 +782,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -843,7 +801,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz", "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.9.0", "@babel/helper-plugin-utils": "^7.8.3", @@ -895,7 +852,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.8.3.tgz", "integrity": "sha512-i3LuN8tPDqUCRFu3dkzF2r1Nx0jp4scxtm7JxtIqI9he9Vk20YD+/zshdzR9JLsoBMlJlNR82a62vQExNEVx/Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -904,7 +860,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/helper-replace-supers": "^7.8.3" @@ -914,7 +869,6 @@ "version": "7.9.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz", "integrity": "sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" @@ -924,7 +878,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -942,7 +895,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -951,7 +903,6 @@ "version": "7.9.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz", "integrity": "sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==", - "dev": true, "requires": { "@babel/helper-builder-react-jsx": "^7.9.0", "@babel/helper-builder-react-jsx-experimental": "^7.9.0", @@ -984,7 +935,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz", "integrity": "sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/plugin-syntax-jsx": "^7.8.3" @@ -994,7 +944,6 @@ "version": "7.8.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", - "dev": true, "requires": { "regenerator-transform": "^0.14.2" } @@ -1012,7 +961,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz", "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==", - "dev": true, "requires": { "@babel/helper-module-imports": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", @@ -1023,8 +971,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -1032,7 +979,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -1041,7 +987,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -1050,7 +995,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3", "@babel/helper-regex": "^7.8.3" @@ -1060,7 +1004,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" @@ -1079,7 +1022,6 @@ "version": "7.9.4", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz", "integrity": "sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w==", - "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", @@ -1090,7 +1032,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3" @@ -1227,7 +1168,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.9.0.tgz", "integrity": "sha512-Tv8Zyi2J2VRR8g7pC5gTeIN8Ihultbmk0ocyNz8H2nEZbmhp1N6q0A1UGsQbDvGP/sNinQKUHf3SqXwqjtFv4Q==", - "dev": true, "requires": { "find-cache-dir": "^2.0.0", "lodash": "^4.17.13", @@ -1240,7 +1180,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -1251,7 +1190,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, "requires": { "locate-path": "^3.0.0" } @@ -1260,7 +1198,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -1270,7 +1207,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, "requires": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -1280,7 +1216,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -1289,7 +1224,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, "requires": { "p-limit": "^2.0.0" } @@ -1297,20 +1231,17 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, "requires": { "find-up": "^3.0.0" } @@ -1318,8 +1249,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "source-map": { "version": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1437,6 +1367,14 @@ "minimist": "^1.2.0" } }, + "@egjs/hammerjs": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", + "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", + "requires": { + "@types/hammerjs": "^2.0.36" + } + }, "@egoist/vue-to-react": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@egoist/vue-to-react/-/vue-to-react-1.1.0.tgz", @@ -2071,20 +2009,17 @@ "@hapi/address": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz", - "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==", - "dev": true + "integrity": "sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==" }, "@hapi/hoek": { "version": "6.2.4", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-6.2.4.tgz", - "integrity": "sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A==", - "dev": true + "integrity": "sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A==" }, "@hapi/joi": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.0.tgz", "integrity": "sha512-n6kaRQO8S+kepUTbXL9O/UOL788Odqs38/VOfoCrATDtTvyfiO3fgjlSRaNkHabpTLgM7qru9ifqXlXbXk8SeQ==", - "dev": true, "requires": { "@hapi/address": "2.x.x", "@hapi/hoek": "6.x.x", @@ -2095,14 +2030,12 @@ "@hapi/marker": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@hapi/marker/-/marker-1.0.0.tgz", - "integrity": "sha512-JOfdekTXnJexfE8PyhZFyHvHjt81rBFSAbTIRAhF2vv/2Y1JzoKsGqxH/GpZJoF7aEfYok8JVcAHmSz1gkBieA==", - "dev": true + "integrity": "sha512-JOfdekTXnJexfE8PyhZFyHvHjt81rBFSAbTIRAhF2vv/2Y1JzoKsGqxH/GpZJoF7aEfYok8JVcAHmSz1gkBieA==" }, "@hapi/topo": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.2.tgz", "integrity": "sha512-r+aumOqJ5QbD6aLPJWqVjMAPsx5pZKz+F5yPqXZ/WWG9JTtHbQqlzrJoknJ0iJxLj9vlXtmpSdjlkszseeG8OA==", - "dev": true, "requires": { "@hapi/hoek": "8.x.x" }, @@ -2110,8 +2043,7 @@ "@hapi/hoek": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.0.2.tgz", - "integrity": "sha512-O6o6mrV4P65vVccxymuruucb+GhP2zl9NLCG8OdoFRS8BEGw3vwpPp20wpAtpbQQxz1CEUtmxJGgWhjq1XA3qw==", - "dev": true + "integrity": "sha512-O6o6mrV4P65vVccxymuruucb+GhP2zl9NLCG8OdoFRS8BEGw3vwpPp20wpAtpbQQxz1CEUtmxJGgWhjq1XA3qw==" } } }, @@ -2125,6 +2057,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "dev": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -2135,12 +2068,14 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -2150,6 +2085,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "requires": { "p-locate": "^4.1.0" } @@ -2158,6 +2094,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "requires": { "p-try": "^2.0.0" } @@ -2166,6 +2103,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "requires": { "p-limit": "^2.2.0" } @@ -2173,30 +2111,33 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true } } }, "@istanbuljs/schema": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true }, "@jest/console": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "dev": true, "requires": { "@jest/source-map": "^24.9.0", "chalk": "^2.0.1", @@ -2207,7 +2148,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2217,39 +2157,38 @@ "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" } } }, "@jest/core": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.3.0.tgz", - "integrity": "sha512-+D5a/tFf6pA/Gqft2DLBp/yeSRgXhlJ+Wpst0X/ZkfTRP54qDR3C61VfHwaex+GzZBiTcE9vQeoZ2v5T10+Mqw==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.5.4.tgz", + "integrity": "sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA==", "dev": true, "requires": { - "@jest/console": "^25.3.0", - "@jest/reporters": "^25.3.0", - "@jest/test-result": "^25.3.0", - "@jest/transform": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/console": "^25.5.0", + "@jest/reporters": "^25.5.1", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.3.0", - "jest-config": "^25.3.0", - "jest-haste-map": "^25.3.0", - "jest-message-util": "^25.3.0", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^25.5.0", + "jest-config": "^25.5.4", + "jest-haste-map": "^25.5.1", + "jest-message-util": "^25.5.0", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.3.0", - "jest-resolve-dependencies": "^25.3.0", - "jest-runner": "^25.3.0", - "jest-runtime": "^25.3.0", - "jest-snapshot": "^25.3.0", - "jest-util": "^25.3.0", - "jest-validate": "^25.3.0", - "jest-watcher": "^25.3.0", + "jest-resolve": "^25.5.1", + "jest-resolve-dependencies": "^25.5.4", + "jest-runner": "^25.5.4", + "jest-runtime": "^25.5.4", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", + "jest-watcher": "^25.5.0", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", "realpath-native": "^2.0.0", @@ -2259,94 +2198,97 @@ }, "dependencies": { "@jest/console": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.4.0.tgz", - "integrity": "sha512-CfE0erx4hdJ6t7RzAcE1wLG6ZzsHSmybvIBQDoCkDM1QaSeWL9wJMzID/2BbHHa7ll9SsbbK43HjbERbBaFX2A==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", + "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", - "jest-message-util": "^25.4.0", - "jest-util": "^25.4.0", + "jest-message-util": "^25.5.0", + "jest-util": "^25.5.0", "slash": "^3.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.4.0.tgz", - "integrity": "sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - } + } + }, + "@jest/reporters": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.5.1.tgz", + "integrity": "sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^25.5.1", + "jest-resolve": "^25.5.1", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", + "node-notifier": "^6.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^3.1.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^4.1.3" } }, "@jest/test-result": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.4.0.tgz", - "integrity": "sha512-8BAKPaMCHlL941eyfqhWbmp3MebtzywlxzV+qtngQ3FH+RBqnoSAhNEPj4MG7d2NVUrMOVfrwuzGpVIK+QnMAA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", + "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", "dev": true, "requires": { - "@jest/console": "^25.4.0", - "@jest/types": "^25.4.0", + "@jest/console": "^25.5.0", + "@jest/types": "^25.5.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.4.0.tgz", - "integrity": "sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - } } }, "@jest/transform": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.4.0.tgz", - "integrity": "sha512-t1w2S6V1sk++1HHsxboWxPEuSpN8pxEvNrZN+Ud/knkROWtf8LeUmz73A4ezE8476a5AM00IZr9a8FO9x1+j3g==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz", + "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "babel-plugin-istanbul": "^6.0.0", "chalk": "^3.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.4.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", "jest-regex-util": "^25.2.6", - "jest-util": "^25.4.0", + "jest-util": "^25.5.0", "micromatch": "^4.0.2", "pirates": "^4.0.1", "realpath-native": "^2.0.0", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.4.0.tgz", - "integrity": "sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - } + } + }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" } }, "ansi-escapes": { @@ -2356,6 +2298,14 @@ "dev": true, "requires": { "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } } }, "ansi-regex": { @@ -2406,6 +2356,12 @@ "fill-range": "^7.0.1" } }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -2440,6 +2396,16 @@ "to-regex-range": "^5.0.1" } }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, "fsevents": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", @@ -2448,9 +2414,9 @@ "optional": true }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "has-flag": { @@ -2465,67 +2431,57 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "optional": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, "jest-haste-map": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.4.0.tgz", - "integrity": "sha512-5EoCe1gXfGC7jmXbKzqxESrgRcaO3SzWXGCnvp9BcT0CFMyrB1Q6LIsjl9RmvmJGQgW297TCfrdgiy574Rl9HQ==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz", + "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", + "@types/graceful-fs": "^4.1.2", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.2.6", - "jest-util": "^25.4.0", - "jest-worker": "^25.4.0", + "graceful-fs": "^4.2.4", + "jest-serializer": "^25.5.0", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7", "which": "^2.0.2" - }, - "dependencies": { - "@jest/types": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.4.0.tgz", - "integrity": "sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - } } }, "jest-message-util": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.4.0.tgz", - "integrity": "sha512-LYY9hRcVGgMeMwmdfh9tTjeux1OjZHMusq/E5f3tJN+dAoVVkJtq5ZUEPIcB7bpxDUt2zjUsrwg0EGgPQ+OhXQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" - }, - "dependencies": { - "@jest/types": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.4.0.tgz", - "integrity": "sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - } } }, "jest-regex-util": { @@ -2534,48 +2490,84 @@ "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", "dev": true }, + "jest-resolve": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.5.1.tgz", + "integrity": "sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "browser-resolve": "^1.11.3", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.1", + "read-pkg-up": "^7.0.1", + "realpath-native": "^2.0.0", + "resolve": "^1.17.0", + "slash": "^3.0.0" + } + }, "jest-serializer": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", - "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", - "dev": true + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz", + "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4" + } }, "jest-util": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.4.0.tgz", - "integrity": "sha512-WSZD59sBtAUjLv1hMeKbNZXmMcrLRWcYqpO8Dz8b4CeCTZpfNQw2q9uwrYAD+BbJoLJlu4ezVPwtAmM/9/SlZA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" - }, - "dependencies": { - "@jest/types": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.4.0.tgz", - "integrity": "sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - } + } + }, + "jest-validate": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.5.0.tgz", + "integrity": "sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "leven": "^3.1.0", + "pretty-format": "^25.5.0" } }, "jest-worker": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.4.0.tgz", - "integrity": "sha512-ghAs/1FtfYpMmYQ0AHqxV62XPvKdUDIBBApMZfly+E9JEmYh2K45G0R5dWxx986RN12pRCxsViwQVtGl+N4whw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", "dev": true, "requires": { "merge-stream": "^2.0.0", "supports-color": "^7.0.0" } }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -2592,18 +2584,175 @@ "picomatch": "^2.0.5" } }, + "node-notifier": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", + "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", + "dev": true, + "optional": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.1.1", + "semver": "^6.3.0", + "shellwords": "^0.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, "realpath-native": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", "dev": true }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -2644,11 +2793,39 @@ } }, "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true }, + "v8-to-istanbul": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.4.tgz", + "integrity": "sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2673,29 +2850,41 @@ } }, "@jest/environment": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.3.0.tgz", - "integrity": "sha512-vgooqwJTHLLak4fE+TaCGeYP7Tz1Y3CKOsNxR1sE0V3nx3KRUHn3NUnt+wbcfd5yQWKZQKAfW6wqbuwQLrXo3g==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.5.0.tgz", + "integrity": "sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==", "dev": true, "requires": { - "@jest/fake-timers": "^25.3.0", - "@jest/types": "^25.3.0", - "jest-mock": "^25.3.0" + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0" }, "dependencies": { "@jest/fake-timers": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.3.0.tgz", - "integrity": "sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz", + "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==", "dev": true, "requires": { - "@jest/types": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-mock": "^25.3.0", - "jest-util": "^25.3.0", + "@jest/types": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", "lolex": "^5.0.0" } }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", @@ -2749,6 +2938,12 @@ "to-regex-range": "^5.0.1" } }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2762,37 +2957,39 @@ "dev": true }, "jest-message-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz", - "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" } }, "jest-mock": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.3.0.tgz", - "integrity": "sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", + "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", "dev": true, "requires": { - "@jest/types": "^25.3.0" + "@jest/types": "^25.5.0" } }, "jest-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", - "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" } @@ -2837,7 +3034,6 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "dev": true, "requires": { "@jest/types": "^24.9.0", "jest-message-util": "^24.9.0", @@ -2848,7 +3044,6 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", @@ -2859,13 +3054,278 @@ "version": "13.0.8", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, "requires": { "@types/yargs-parser": "*" } } } }, + "@jest/globals": { + "version": "25.5.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-25.5.2.tgz", + "integrity": "sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==", + "dev": true, + "requires": { + "@jest/environment": "^25.5.0", + "@jest/types": "^25.5.0", + "expect": "^25.5.0" + }, + "dependencies": { + "@jest/environment": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.5.0.tgz", + "integrity": "sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==", + "dev": true, + "requires": { + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0" + } + }, + "@jest/fake-timers": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz", + "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", + "lolex": "^5.0.0" + } + }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "expect": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.5.0.tgz", + "integrity": "sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-styles": "^4.0.0", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-regex-util": "^25.2.6" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } + }, + "jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "jest-matcher-utils": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", + "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "jest-diff": "^25.5.0", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } + }, + "jest-message-util": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.5.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", + "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0" + } + }, + "jest-regex-util": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", + "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", + "dev": true + }, + "jest-util": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "make-dir": "^3.0.0" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, "@jest/reporters": { "version": "25.3.0", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.3.0.tgz", @@ -3249,7 +3709,6 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "dev": true, "requires": { "callsites": "^3.0.0", "graceful-fs": "^4.1.15", @@ -3259,14 +3718,12 @@ "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -3274,7 +3731,6 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "dev": true, "requires": { "@jest/console": "^24.9.0", "@jest/types": "^24.9.0", @@ -3285,7 +3741,6 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", @@ -3296,7 +3751,6 @@ "version": "13.0.8", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, "requires": { "@types/yargs-parser": "*" } @@ -3304,50 +3758,53 @@ } }, "@jest/test-sequencer": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.3.0.tgz", - "integrity": "sha512-Xvns3xbji7JCvVcDGvqJ/pf4IpmohPODumoPEZJ0/VgC5gI4XaNVIBET2Dq5Czu6Gk3xFcmhtthh/MBOTljdNg==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz", + "integrity": "sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==", "dev": true, "requires": { - "@jest/test-result": "^25.3.0", - "jest-haste-map": "^25.3.0", - "jest-runner": "^25.3.0", - "jest-runtime": "^25.3.0" + "@jest/test-result": "^25.5.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", + "jest-runner": "^25.5.4", + "jest-runtime": "^25.5.4" }, "dependencies": { "@jest/console": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz", - "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", + "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", "dev": true, "requires": { - "@jest/source-map": "^25.2.6", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", - "jest-util": "^25.3.0", + "jest-message-util": "^25.5.0", + "jest-util": "^25.5.0", "slash": "^3.0.0" } }, - "@jest/source-map": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", - "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", + "@jest/test-result": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", + "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", "dev": true, "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" + "@jest/console": "^25.5.0", + "@jest/types": "^25.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" } }, - "@jest/test-result": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz", - "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==", + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", "dev": true, "requires": { - "@jest/console": "^25.3.0", - "@jest/types": "^25.3.0", "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" } }, "ansi-styles": { @@ -3414,16 +3871,16 @@ } }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, "optional": true }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "has-flag": { @@ -3439,47 +3896,68 @@ "dev": true }, "jest-haste-map": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz", - "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz", + "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", + "@types/graceful-fs": "^4.1.2", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.2.6", - "jest-util": "^25.3.0", - "jest-worker": "^25.2.6", + "graceful-fs": "^4.2.4", + "jest-serializer": "^25.5.0", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7", "which": "^2.0.2" } }, + "jest-message-util": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.5.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^1.0.1" + } + }, "jest-serializer": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", - "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", - "dev": true + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz", + "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4" + } }, "jest-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", - "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" } }, "jest-worker": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", - "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", "dev": true, "requires": { "merge-stream": "^2.0.0", @@ -3514,12 +3992,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -3639,6 +4111,7 @@ "version": "25.3.0", "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz", "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==", + "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", @@ -3650,6 +4123,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" @@ -3659,6 +4133,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3668,6 +4143,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -3675,17 +4151,20 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -6222,6 +6701,23 @@ "fastq": "^1.6.0" } }, + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, "@octokit/auth-token": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.0.tgz", @@ -6453,11 +6949,18 @@ "warning": "^3.0.0" } }, + "@react-native-community/blur": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@react-native-community/blur/-/blur-3.6.0.tgz", + "integrity": "sha512-GtDBhpX2pQcjl4VopOC8FktrVufrEfYRwVeMQ2WWckqKIv2BdwvlvWvj88L1WmEdBr9UNcm3rtgz+d+YXkmirA==", + "requires": { + "prop-types": "^15.5.10" + } + }, "@react-native-community/cli-debugger-ui": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-3.0.0.tgz", "integrity": "sha512-m3X+iWLsK/H7/b7PpbNO33eQayR/+M26la4ZbYe1KRke5Umg4PIWsvg21O8Tw4uJcY8LA5hsP+rBi/syBkBf0g==", - "dev": true, "requires": { "serve-static": "^1.13.1" } @@ -6466,7 +6969,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-3.0.3.tgz", "integrity": "sha512-rNO9DmRiVhB6aP2DVUjEJv7ecriTARDZND88ny3xNVUkrD1Y+zwF6aZu3eoT52VXOxLCSLiJzz19OiyGmfqxYg==", - "dev": true, "requires": { "@react-native-community/cli-tools": "^3.0.0", "chalk": "^2.4.2", @@ -6481,7 +6983,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -6492,7 +6993,6 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -6505,7 +7005,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -6520,7 +7019,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, "requires": { "pump": "^3.0.0" } @@ -6529,7 +7027,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -6538,14 +7035,12 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" } } }, @@ -6553,7 +7048,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-3.0.0.tgz", "integrity": "sha512-QoNVlDj8eMXRZk9uktPFsctHurQpv9jKmiu6mQii4NEtT2npE7g1hbWpRNojutBsfgmCdQGDHd9uB54eeCnYgg==", - "dev": true, "requires": { "@react-native-community/cli-tools": "^3.0.0", "chalk": "^2.4.2", @@ -6565,7 +7059,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -6578,7 +7071,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-3.0.0.tgz", "integrity": "sha512-8IhQKZdf3E4CR8T7HhkPGgorot/cLkRDgneJFDSWk/wCYZAuUh4NEAdumQV7N0jLSMWX7xxiWUPi94lOBxVY9g==", - "dev": true, "requires": { "chalk": "^2.4.2", "lodash": "^4.17.5", @@ -6590,7 +7082,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -6600,16 +7091,88 @@ "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" } } }, "@react-native-community/cli-types": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-3.0.0.tgz", - "integrity": "sha512-ng6Tm537E/M42GjE4TRUxQyL8sRfClcL7bQWblOCoxPZzJ2J3bdALsjeG3vDnVCIfI/R0AeFalN9KjMt0+Z/Zg==", - "dev": true + "integrity": "sha512-ng6Tm537E/M42GjE4TRUxQyL8sRfClcL7bQWblOCoxPZzJ2J3bdALsjeG3vDnVCIfI/R0AeFalN9KjMt0+Z/Zg==" + }, + "@react-native-community/masked-view": { + "version": "git+https://github.com/wordpress-mobile/react-native-masked-view.git#098004d0968f853fc7d96c2aa5f96afe7a133c58", + "from": "git+https://github.com/wordpress-mobile/react-native-masked-view.git#098004d0968f853fc7d96c2aa5f96afe7a133c58" + }, + "@react-native-community/slider": { + "version": "git+https://github.com/wordpress-mobile/react-native-slider.git#d263ff16cdd9fb7352b354342522ff030f220f42", + "from": "git+https://github.com/wordpress-mobile/react-native-slider.git#d263ff16cdd9fb7352b354342522ff030f220f42" + }, + "@react-navigation/core": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-5.12.0.tgz", + "integrity": "sha512-CTmYrFXCZwInN40CpEzkPxhrpzujj20qvsUgpH05+oO1flwsnaJsyBfYawIcTS62/1/Z6SAM7iW5PbKk+qw9iQ==", + "requires": { + "@react-navigation/routers": "^5.4.9", + "escape-string-regexp": "^4.0.0", + "nanoid": "^3.1.9", + "query-string": "^6.13.1", + "react-is": "^16.13.0", + "use-subscription": "^1.4.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "query-string": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.1.tgz", + "integrity": "sha512-RfoButmcK+yCta1+FuU8REvisx1oEzhMKwhLUNcepQTPGcNMp1sIqjnfCtfnvGSQZQEhaBHvccujtWoUV3TTbA==", + "requires": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" + } + } + }, + "@react-navigation/native": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-5.7.0.tgz", + "integrity": "sha512-a2JBOdRB3q20Jdc5hF8shR4Dk+ZmjF2Rr9RviErtARztu08lU+jcb1gK6c31OKL37JDuaS3xexE9Cb7dYeMy3Q==", + "requires": { + "@react-navigation/core": "^5.12.0", + "nanoid": "^3.1.9" + } + }, + "@react-navigation/routers": { + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-5.4.9.tgz", + "integrity": "sha512-dYD5qrIKUmuBEp+O98hB0tDYpEsGQgCQFQgMEoFKBmVVhx2JnJJ1zxRjU7xWcCU4VdBA8IOowgHQHJsVNKYyrg==", + "requires": { + "nanoid": "^3.1.9" + } + }, + "@react-navigation/stack": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/@react-navigation/stack/-/stack-5.6.2.tgz", + "integrity": "sha512-51Aasxg8j2eKxz4mhA0ajJXrhAyJQkk2iiNE511zcqJ3tlfxv/h70Eej3PetnbbHFMOwNsEwc2GjB3OnfQcxjQ==", + "requires": { + "color": "^3.1.2", + "react-native-iphone-x-helper": "^1.2.1" + } }, "@samverschueren/stream-to-observable": { "version": "0.3.0", @@ -6627,9 +7190,9 @@ "dev": true }, "@sinonjs/commons": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", - "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz", + "integrity": "sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -9531,9 +10094,9 @@ } }, "@types/babel__generator": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.0.tgz", - "integrity": "sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", "dev": true, "requires": { "@babel/types": "^7.0.0" @@ -9550,9 +10113,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", - "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.11.tgz", + "integrity": "sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -9609,8 +10172,7 @@ "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" }, "@types/glob": { "version": "7.1.1", @@ -9623,6 +10185,20 @@ "@types/node": "*" } }, + "@types/graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/hammerjs": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.36.tgz", + "integrity": "sha512-7TUK/k2/QGpEAv/BCwSHlYu3NXZhQ9ZwBYpzr9tjlPIL2C5BeGhH3DmVavRx3ZNyELX5TLC91JTz/cen6AAtIQ==" + }, "@types/history": { "version": "4.7.4", "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.4.tgz", @@ -9740,8 +10316,7 @@ "@types/prop-types": { "version": "15.7.3", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", - "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", - "dev": true + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==" }, "@types/q": { "version": "1.5.2", @@ -9769,7 +10344,6 @@ "version": "16.9.18", "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.18.tgz", "integrity": "sha512-MvjiKX/kUE8o49ipppg49RDZ97p4XfW1WWksp/UlTUSJpisyhzd62pZAMXxAscFLoxfYOflkGANAnGkSeHTFQg==", - "dev": true, "requires": { "@types/prop-types": "*", "csstype": "^2.2.0" @@ -9793,6 +10367,15 @@ "@types/react": "*" } }, + "@types/react-native": { + "version": "0.57.65", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.57.65.tgz", + "integrity": "sha512-7P5ulTb+/cnwbABWaAjzKmSYkRWeK7UCTfUwHhDpnwxdiL2X/KbdN1sPgo0B2E4zxfYE3MEoHv7FhB8Acfvf8A==", + "requires": { + "@types/prop-types": "*", + "@types/react": "*" + } + }, "@types/react-syntax-highlighter": { "version": "11.0.2", "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.2.tgz", @@ -10383,7 +10966,7 @@ "@wordpress/hooks": "file:packages/hooks", "@wordpress/i18n": "file:packages/i18n", "@wordpress/rich-text": "file:packages/rich-text", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "rememo": "^3.0.0", "uuid": "^7.0.2" } @@ -10412,7 +10995,7 @@ "requires": { "@babel/runtime": "^7.9.2", "gettext-parser": "^1.3.1", - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "@wordpress/babel-preset-default": { @@ -10453,10 +11036,14 @@ "@wordpress/data-controls": "file:packages/data-controls", "@wordpress/edit-post": "file:packages/edit-post", "@wordpress/element": "file:packages/element", + "@wordpress/hooks": "file:packages/hooks", + "@wordpress/html-entities": "file:packages/html-entities", "@wordpress/i18n": "file:packages/i18n", "@wordpress/icons": "file:packages/icons", + "@wordpress/notices": "file:packages/notices", "@wordpress/plugins": "file:packages/plugins", - "lodash": "^4.17.15" + "@wordpress/url": "file:packages/url", + "lodash": "^4.17.19" } }, "@wordpress/block-editor": { @@ -10479,21 +11066,25 @@ "@wordpress/is-shallow-equal": "file:packages/is-shallow-equal", "@wordpress/keyboard-shortcuts": "file:packages/keyboard-shortcuts", "@wordpress/keycodes": "file:packages/keycodes", + "@wordpress/notices": "file:packages/notices", "@wordpress/rich-text": "file:packages/rich-text", "@wordpress/shortcode": "file:packages/shortcode", "@wordpress/token-list": "file:packages/token-list", "@wordpress/url": "file:packages/url", "@wordpress/viewport": "file:packages/viewport", + "@wordpress/warning": "file:packages/warning", "@wordpress/wordcount": "file:packages/wordcount", "classnames": "^2.2.5", "css-mediaquery": "^0.1.2", "diff": "^4.0.2", "dom-scroll-into-view": "^1.2.1", "inherits": "^2.0.3", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "memize": "^1.1.0", "react-autosize-textarea": "^3.0.2", "react-spring": "^8.0.19", + "react-transition-group": "^2.9.0", + "reakit": "1.1.0", "redux-multi": "^0.1.12", "refx": "^3.0.0", "rememo": "^3.0.0", @@ -10526,6 +11117,7 @@ "@wordpress/icons": "file:packages/icons", "@wordpress/is-shallow-equal": "file:packages/is-shallow-equal", "@wordpress/keycodes": "file:packages/keycodes", + "@wordpress/notices": "file:packages/notices", "@wordpress/primitives": "file:packages/primitives", "@wordpress/rich-text": "file:packages/rich-text", "@wordpress/server-side-render": "file:packages/server-side-render", @@ -10533,7 +11125,7 @@ "@wordpress/viewport": "file:packages/viewport", "classnames": "^2.2.5", "fast-average-color": "4.3.0", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "memize": "^1.1.0", "moment": "^2.22.1", "react-easy-crop": "^3.0.0", @@ -10562,6 +11154,7 @@ "@wordpress/block-serialization-default-parser": "file:packages/block-serialization-default-parser", "@wordpress/compose": "file:packages/compose", "@wordpress/data": "file:packages/data", + "@wordpress/deprecated": "file:packages/deprecated", "@wordpress/dom": "file:packages/dom", "@wordpress/element": "file:packages/element", "@wordpress/hooks": "file:packages/hooks", @@ -10571,7 +11164,7 @@ "@wordpress/is-shallow-equal": "file:packages/is-shallow-equal", "@wordpress/shortcode": "file:packages/shortcode", "hpq": "^1.3.0", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "rememo": "^3.0.0", "showdown": "^1.9.1", "simple-html-tokenizer": "^0.5.7", @@ -10593,6 +11186,7 @@ "@emotion/styled": "^10.0.23", "@wordpress/a11y": "file:packages/a11y", "@wordpress/compose": "file:packages/compose", + "@wordpress/date": "file:packages/date", "@wordpress/deprecated": "file:packages/deprecated", "@wordpress/dom": "file:packages/dom", "@wordpress/element": "file:packages/element", @@ -10606,13 +11200,15 @@ "@wordpress/warning": "file:packages/warning", "classnames": "^2.2.5", "dom-scroll-into-view": "^1.2.1", - "downshift": "^4.0.5", + "downshift": "^5.4.0", "gradient-parser": "^0.1.5", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "memize": "^1.1.0", "moment": "^2.22.1", - "re-resizable": "^6.0.0", + "re-resizable": "^6.4.0", "react-dates": "^17.1.1", + "react-merge-refs": "^1.0.0", + "react-resize-aware": "^3.0.1", "react-spring": "^8.0.20", "react-use-gesture": "^7.0.15", "reakit": "^1.1.0", @@ -10629,16 +11225,9 @@ "@wordpress/is-shallow-equal": "file:packages/is-shallow-equal", "@wordpress/priority-queue": "file:packages/priority-queue", "clipboard": "^2.0.1", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "mousetrap": "^1.6.5", "react-resize-aware": "^3.0.1" - }, - "dependencies": { - "mousetrap": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", - "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" - } } }, "@wordpress/core-data": { @@ -10655,7 +11244,7 @@ "@wordpress/is-shallow-equal": "file:packages/is-shallow-equal", "@wordpress/url": "file:packages/url", "equivalent-key-map": "^0.2.2", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "rememo": "^3.0.0" } }, @@ -10669,7 +11258,7 @@ "execa": "^4.0.2", "fast-glob": "^2.2.7", "inquirer": "^7.1.0", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "make-dir": "^3.0.0", "mustache": "^4.0.0", "write-pkg": "^4.0.0" @@ -10694,7 +11283,7 @@ "@wordpress/redux-routine": "file:packages/redux-routine", "equivalent-key-map": "^0.2.2", "is-promise": "^4.0.0", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "memize": "^1.1.0", "redux": "^4.0.0", "turbo-combine-reducers": "^1.0.2", @@ -10713,7 +11302,17 @@ "requires": { "@babel/runtime": "^7.9.2", "moment": "^2.22.1", - "moment-timezone": "^0.5.16" + "moment-timezone": "^0.5.31" + }, + "dependencies": { + "moment-timezone": { + "version": "0.5.31", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.31.tgz", + "integrity": "sha512-+GgHNg8xRhMXfEbv81iDtrVeTcWt0kWmTEY1XQK14dICTXnWJnT0dxdlPspwqF3keKMVPXwayEsk1DI0AA/jdA==", + "requires": { + "moment": ">= 2.9.0" + } + } } }, "@wordpress/dependency-extraction-webpack-plugin": { @@ -10738,7 +11337,7 @@ "requires": { "@babel/core": "^7.9.0", "doctrine": "^2.1.0", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "mdast-util-inject": "1.1.0", "optionator": "0.8.2", "remark": "10.0.1", @@ -10750,7 +11349,7 @@ "version": "file:packages/dom", "requires": { "@babel/runtime": "^7.9.2", - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "@wordpress/dom-ready": { @@ -10766,8 +11365,8 @@ "@babel/runtime": "^7.9.2", "@wordpress/keycodes": "file:packages/keycodes", "@wordpress/url": "file:packages/url", - "lodash": "^4.17.15", - "node-fetch": "^1.7.3" + "lodash": "^4.17.19", + "node-fetch": "^2.6.0" } }, "@wordpress/e2e-tests": { @@ -10781,7 +11380,7 @@ "@wordpress/url": "file:packages/url", "chalk": "^4.0.0", "expect-puppeteer": "^4.4.0", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "uuid": "^7.0.2" } }, @@ -10795,6 +11394,7 @@ "@wordpress/blocks": "file:packages/blocks", "@wordpress/components": "file:packages/components", "@wordpress/compose": "file:packages/compose", + "@wordpress/core-data": "file:packages/core-data", "@wordpress/data": "file:packages/data", "@wordpress/data-controls": "file:packages/data-controls", "@wordpress/dom-ready": "file:packages/dom-ready", @@ -10802,13 +11402,15 @@ "@wordpress/hooks": "file:packages/hooks", "@wordpress/html-entities": "file:packages/html-entities", "@wordpress/i18n": "file:packages/i18n", + "@wordpress/icons": "file:packages/icons", "@wordpress/keyboard-shortcuts": "file:packages/keyboard-shortcuts", "@wordpress/media-utils": "file:packages/media-utils", "@wordpress/notices": "file:packages/notices", "@wordpress/url": "file:packages/url", "classnames": "^2.2.5", - "lodash": "^4.17.15", - "rememo": "^3.0.0" + "lodash": "^4.17.19", + "rememo": "^3.0.0", + "uuid": "^7.0.2" } }, "@wordpress/edit-post": { @@ -10841,7 +11443,7 @@ "@wordpress/viewport": "file:packages/viewport", "@wordpress/warning": "file:packages/warning", "classnames": "^2.2.5", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "memize": "^1.1.0", "refx": "^3.0.0", "rememo": "^3.0.0" @@ -10876,7 +11478,7 @@ "downloadjs": "^1.4.7", "file-saver": "^2.0.2", "jszip": "^3.2.2", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "rememo": "^3.0.0" } }, @@ -10901,8 +11503,9 @@ "@wordpress/keycodes": "file:packages/keycodes", "@wordpress/media-utils": "file:packages/media-utils", "@wordpress/notices": "file:packages/notices", + "@wordpress/plugins": "file:packages/plugins", "classnames": "^2.2.5", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "rememo": "^3.0.0" } }, @@ -10913,7 +11516,6 @@ "@wordpress/api-fetch": "file:packages/api-fetch", "@wordpress/autop": "file:packages/autop", "@wordpress/blob": "file:packages/blob", - "@wordpress/block-directory": "file:packages/block-directory", "@wordpress/block-editor": "file:packages/block-editor", "@wordpress/blocks": "file:packages/blocks", "@wordpress/components": "file:packages/components", @@ -10939,7 +11541,7 @@ "@wordpress/viewport": "file:packages/viewport", "@wordpress/wordcount": "file:packages/wordcount", "classnames": "^2.2.5", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "memize": "^1.1.0", "react-autosize-textarea": "^3.0.2", "redux-optimist": "^1.0.0", @@ -10952,9 +11554,9 @@ "requires": { "@babel/runtime": "^7.9.2", "@wordpress/escape-html": "file:packages/escape-html", - "lodash": "^4.17.15", - "react": "^16.9.0", - "react-dom": "^16.9.0" + "lodash": "^4.17.19", + "react": "^16.13.1", + "react-dom": "^16.13.1" } }, "@wordpress/env": { @@ -10987,9 +11589,10 @@ "requires": { "@wordpress/prettier-config": "file:packages/prettier-config", "babel-eslint": "^10.1.0", + "cosmiconfig": "^7.0.0", "eslint-config-prettier": "^6.10.1", "eslint-plugin-jest": "^23.8.2", - "eslint-plugin-jsdoc": "^26.0.0", + "eslint-plugin-jsdoc": "^30.2.2", "eslint-plugin-jsx-a11y": "^6.2.3", "eslint-plugin-prettier": "^3.1.2", "eslint-plugin-react": "^7.20.0", @@ -10997,6 +11600,61 @@ "globals": "^12.0.0", "prettier": "npm:wp-prettier@2.0.5", "requireindex": "^1.2.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "parse-json": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz", + "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==", + "dev": true + } } }, "@wordpress/format-library": { @@ -11014,7 +11672,7 @@ "@wordpress/keycodes": "file:packages/keycodes", "@wordpress/rich-text": "file:packages/rich-text", "@wordpress/url": "file:packages/url", - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "@wordpress/hooks": { @@ -11034,7 +11692,7 @@ "requires": { "@babel/runtime": "^7.9.2", "gettext-parser": "^1.3.1", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "memize": "^1.1.0", "sprintf-js": "^1.1.1", "tannin": "^1.2.0" @@ -11059,7 +11717,7 @@ "@wordpress/icons": "file:packages/icons", "@wordpress/plugins": "file:packages/plugins", "classnames": "^2.2.5", - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "@wordpress/is-shallow-equal": { @@ -11074,7 +11732,7 @@ "requires": { "@babel/runtime": "^7.9.2", "jest-matcher-utils": "^25.3.0", - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "@wordpress/jest-preset-default": { @@ -11105,7 +11763,7 @@ "@wordpress/data": "file:packages/data", "@wordpress/element": "file:packages/element", "@wordpress/keycodes": "file:packages/keycodes", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "rememo": "^3.0.0" } }, @@ -11114,7 +11772,7 @@ "requires": { "@babel/runtime": "^7.9.2", "@wordpress/i18n": "file:packages/i18n", - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "@wordpress/lazy-import": { @@ -11130,7 +11788,7 @@ "version": "file:packages/library-export-default-webpack-plugin", "dev": true, "requires": { - "lodash": "^4.17.15", + "lodash": "^4.17.19", "webpack-sources": "^1.1.0" } }, @@ -11143,7 +11801,7 @@ "@wordpress/compose": "file:packages/compose", "@wordpress/element": "file:packages/element", "@wordpress/i18n": "file:packages/i18n", - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "@wordpress/media-utils": { @@ -11154,7 +11812,7 @@ "@wordpress/blob": "file:packages/blob", "@wordpress/element": "file:packages/element", "@wordpress/i18n": "file:packages/i18n", - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "@wordpress/notices": { @@ -11163,7 +11821,7 @@ "@babel/runtime": "^7.9.2", "@wordpress/a11y": "file:packages/a11y", "@wordpress/data": "file:packages/data", - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "@wordpress/npm-package-json-lint-config": { @@ -11181,7 +11839,7 @@ "@wordpress/element": "file:packages/element", "@wordpress/i18n": "file:packages/i18n", "@wordpress/icons": "file:packages/icons", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "rememo": "^3.0.0" } }, @@ -11193,7 +11851,7 @@ "@wordpress/element": "file:packages/element", "@wordpress/hooks": "file:packages/hooks", "@wordpress/icons": "file:packages/icons", - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "@wordpress/postcss-plugins-preset": { @@ -11240,12 +11898,78 @@ "@babel/runtime": "^7.9.2" } }, + "@wordpress/react-native-aztec": { + "version": "file:packages/react-native-aztec", + "requires": { + "@wordpress/keycodes": "file:packages/keycodes" + } + }, + "@wordpress/react-native-bridge": { + "version": "file:packages/react-native-bridge", + "requires": { + "@wordpress/react-native-aztec": "file:packages/react-native-aztec" + } + }, + "@wordpress/react-native-editor": { + "version": "file:packages/react-native-editor", + "requires": { + "@babel/runtime": "^7.9.2", + "@react-native-community/blur": "3.6.0", + "@react-native-community/masked-view": "git+https://github.com/wordpress-mobile/react-native-masked-view.git#098004d0968f853fc7d96c2aa5f96afe7a133c58", + "@react-native-community/slider": "git+https://github.com/wordpress-mobile/react-native-slider.git#d263ff16cdd9fb7352b354342522ff030f220f42", + "@react-navigation/native": "^5.6.1", + "@react-navigation/stack": "5.6.2", + "@wordpress/api-fetch": "file:packages/api-fetch", + "@wordpress/block-editor": "file:packages/block-editor", + "@wordpress/block-library": "file:packages/block-library", + "@wordpress/blocks": "file:packages/blocks", + "@wordpress/components": "file:packages/components", + "@wordpress/data": "file:packages/data", + "@wordpress/edit-post": "file:packages/edit-post", + "@wordpress/element": "file:packages/element", + "@wordpress/hooks": "file:packages/hooks", + "@wordpress/i18n": "file:packages/i18n", + "@wordpress/react-native-aztec": "file:packages/react-native-aztec", + "@wordpress/react-native-bridge": "file:packages/react-native-bridge", + "fast-average-color": "^4.3.0", + "jed": "^1.1.1", + "jsc-android": "^241213.1.0", + "jsdom-jscore-rn": "git+https://github.com/iamcco/jsdom-jscore-rn.git#a562f3d57c27c13e5bfc8cf82d496e69a3ba2800", + "metro-react-native-babel-preset": "0.57.0", + "metro-react-native-babel-transformer": "0.56.0", + "node-fetch": "^2.6.0", + "react-native": "0.61.5", + "react-native-dark-mode": "git+https://github.com/wordpress-mobile/react-native-dark-mode.git#f09bf1480e7b34536413ab3300f29e4375edb2c6", + "react-native-gesture-handler": "git+https://github.com/wordpress-mobile/react-native-gesture-handler.git#b80e959908b383a26d6e35d992d6d529efad0b16", + "react-native-get-random-values": "git+https://github.com/wordpress-mobile/react-native-get-random-values.git#f03f2c16414aff4ea76064dcd00a9e3c6efc838d", + "react-native-hr": "git+https://github.com/Riglerr/react-native-hr.git#2d01a5cf77212d100e8b99e0310cce5234f977b3", + "react-native-hsv-color-picker": "git+https://github.com/wordpress-mobile/react-native-hsv-color-picker.git", + "react-native-keyboard-aware-scroll-view": "git+https://github.com/wordpress-mobile/react-native-keyboard-aware-scroll-view.git#gb-v0.8.8", + "react-native-linear-gradient": "git+https://github.com/wordpress-mobile/react-native-linear-gradient.git#52bf43077171cff8714ce3e0155f3ebb7f55bc37", + "react-native-modal": "^6.5.0", + "react-native-reanimated": "git+https://github.com/wordpress-mobile/react-native-reanimated.git#ed48f510fba751cd75da7629e92276166766be91", + "react-native-safe-area": "^0.5.0", + "react-native-safe-area-context": "git+https://github.com/wordpress-mobile/react-native-safe-area-context.git#1e3c0d34f31b59fb79f71ec0b4c39c513f684871", + "react-native-sass-transformer": "^1.1.1", + "react-native-screens": "git+https://github.com/wordpress-mobile/react-native-screens.git#835843f4c3697bba5c330d05d8fc270d50ca9d2a", + "react-native-svg": "git+https://github.com/wordpress-mobile/react-native-svg.git#a628e92990a2404e30a0086f168bd2b5b7b4ce96", + "react-native-url-polyfill": "^1.1.2", + "react-native-video": "git+https://github.com/wordpress-mobile/react-native-video.git#1b964b107863351ed744fc104d7952bbec3e2d4f" + }, + "dependencies": { + "jsc-android": { + "version": "241213.1.0", + "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-241213.1.0.tgz", + "integrity": "sha512-AH8NYyMNLNhcUEF97QbMxPNLNW+oiSBlvm1rsMNzgJ1d5TQzdh/AOJGsxeeESp3m9YIWGLCgUvGTVoVLs0p68A==" + } + } + }, "@wordpress/redux-routine": { "version": "file:packages/redux-routine", "requires": { "@babel/runtime": "^7.9.2", "is-promise": "^4.0.0", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "rungen": "^0.3.2" } }, @@ -11261,7 +11985,7 @@ "@wordpress/is-shallow-equal": "file:packages/is-shallow-equal", "@wordpress/keycodes": "file:packages/keycodes", "classnames": "^2.2.5", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "memize": "^1.1.0", "rememo": "^3.0.0" } @@ -11306,6 +12030,7 @@ "source-map-loader": "^0.2.4", "stylelint": "^13.6.0", "stylelint-config-wordpress": "^17.0.0", + "terser-webpack-plugin": "^3.0.3", "thread-loader": "^2.1.3", "url-loader": "^3.0.0", "webpack": "^4.42.0", @@ -11325,14 +12050,14 @@ "@wordpress/element": "file:packages/element", "@wordpress/i18n": "file:packages/i18n", "@wordpress/url": "file:packages/url", - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "@wordpress/shortcode": { "version": "file:packages/shortcode", "requires": { "@babel/runtime": "^7.9.2", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "memize": "^1.1.0" } }, @@ -11340,14 +12065,14 @@ "version": "file:packages/token-list", "requires": { "@babel/runtime": "^7.9.2", - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "@wordpress/url": { "version": "file:packages/url", "requires": { "@babel/runtime": "^7.9.2", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "qs": "^6.5.2", "react-native-url-polyfill": "^1.1.2" } @@ -11358,7 +12083,7 @@ "@babel/runtime": "^7.9.2", "@wordpress/compose": "file:packages/compose", "@wordpress/data": "file:packages/data", - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "@wordpress/warning": { @@ -11368,7 +12093,7 @@ "version": "file:packages/wordcount", "requires": { "@babel/runtime": "^7.9.2", - "lodash": "^4.17.15" + "lodash": "^4.17.19" } }, "@xtuc/ieee754": { @@ -11383,6 +12108,12 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, "@zkochan/cmd-shim": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz", @@ -11413,14 +12144,12 @@ "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, "requires": { "event-target-shim": "^5.0.0" } @@ -11428,14 +12157,12 @@ "absolute-path": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz", - "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=", - "dev": true + "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=" }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, "requires": { "mime-types": "~2.1.18", "negotiator": "0.6.1" @@ -11780,7 +12507,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, "requires": { "ansi-wrap": "^0.1.0" } @@ -11789,7 +12515,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, "requires": { "ansi-wrap": "0.1.0" } @@ -11797,14 +12522,12 @@ "ansi-escapes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" }, "ansi-fragments": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", - "dev": true, "requires": { "colorette": "^1.0.7", "slice-ansi": "^2.0.0", @@ -11814,14 +12537,12 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "slice-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", @@ -11832,7 +12553,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, "requires": { "ansi-regex": "^4.1.0" } @@ -11843,7 +12563,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, "requires": { "ansi-wrap": "0.1.0" } @@ -11858,7 +12577,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, "requires": { "ansi-wrap": "0.1.0" } @@ -11866,8 +12584,7 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "ansi-styles": { "version": "3.2.1", @@ -11897,8 +12614,7 @@ "ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" }, "any-observable": { "version": "0.3.0", @@ -11927,559 +12643,7242 @@ "integrity": "sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg=", "dev": true }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - } - } - }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - } - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" - }, - "array-differ": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", - "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-filter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", - "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", - "dev": true - }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.7.0" - } - }, - "array-iterate": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.2.tgz", - "integrity": "sha512-1hWSHTIlG/8wtYD+PPX5AOBtKWngpDFjrsrHgZpe+JdgNGz0udYu6ZIkAa/xuenIUEqFv7DvE2Yr60jxweJSrQ==", - "dev": true - }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "array.prototype.find": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz", - "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.13.0" + "app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==" + }, + "appium": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/appium/-/appium-1.17.1.tgz", + "integrity": "sha512-QdM7b0AAF/q79V8rauVZw24dGpU6tkLLHbbMG+yfNlsrsa8/xivOrbc3DM5Fmn8x4JjgUthHenIse7KRWCQy3w==", + "dev": true, + "requires": { + "@babel/runtime": "^7.6.0", + "appium-android-driver": "^4.20.0", + "appium-base-driver": "^5.0.0", + "appium-espresso-driver": "^1.0.0", + "appium-fake-driver": "^0.x", + "appium-flutter-driver": "^0", + "appium-ios-driver": "4.x", + "appium-mac-driver": "1.x", + "appium-support": "2.x", + "appium-tizen-driver": "^1.1.1-beta.4", + "appium-uiautomator2-driver": "^1.37.1", + "appium-windows-driver": "1.x", + "appium-xcuitest-driver": "^3.22.0", + "appium-youiengine-driver": "^1.2.0", + "argparse": "^1.0.10", + "async-lock": "^1.0.0", + "asyncbox": "2.x", + "bluebird": "3.x", + "continuation-local-storage": "3.x", + "dateformat": "^3.0.3", + "find-root": "^1.1.0", + "fsevents": "2.x", + "lodash": "^4.17.11", + "longjohn": "^0.2.12", + "npmlog": "4.x", + "request": "^2.81.0", + "request-promise": "4.x", + "semver": "^7.0.0", + "source-map-support": "0.x", + "teen_process": "1.x", + "winston": "3.x", + "word-wrap": "^1.2.3" }, "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "101": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/101/-/101-1.6.3.tgz", + "integrity": "sha512-4dmQ45yY0Dx24Qxp+zAsNLlMF6tteCyfVzgbulvSyC7tCyd3V8sW76sS0tHq8NpcbXfWTKasfyfzU1Kd86oKzw==", + "dev": true, "requires": { - "object-keys": "^1.0.12" + "clone": "^1.0.2", + "deep-eql": "^0.1.3", + "keypather": "^1.10.2" } }, - "es-abstract": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", - "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==", + "@babel/polyfill": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.8.7.tgz", + "integrity": "sha512-LeSfP9bNZH2UOZgcGcZ0PIHUt1ZuHub1L3CVmEyqLxCeDLm4C5Gi8jRH8ZX2PNpDhQCo0z6y/+DIs2JlliXW8w==", + "dev": true, "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.0", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.6.0", - "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.1.0", - "string.prototype.trimright": "^2.1.0" + "core-js": "^2.6.5", + "regenerator-runtime": "^0.13.4" }, "dependencies": { - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true } } }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "@babel/runtime": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.7.tgz", + "integrity": "sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg==", + "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "regenerator-runtime": "^0.13.4" } }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "requires": { - "has-symbols": "^1.0.0" - } - } - } - }, - "array.prototype.flat": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz", - "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.10.0", - "function-bind": "^1.1.1" - } - }, - "array.prototype.flatmap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", - "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "@jimp/bmp": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.9.5.tgz", + "integrity": "sha512-2cYdgXaNykuPe9sjm11Jihp5VomyWTWziIuDDB7xnxQtEz2HUR0bjXm2MJJOfU0TL52H+LS2JIKtAxcLPzp28w==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "bmp-js": "^0.1.0", + "core-js": "^3.4.1" } }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "@jimp/core": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.9.5.tgz", + "integrity": "sha512-P1mlB9UOeI3IAQ4lGTmRBGw+F/mHWXd3tSyBskjL4E3YJ1eNK7WRrErUj/vUOvSBIryotu7nGo8vv8Q8JZ7/8w==", "dev": true, "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "core-js": "^3.4.1", + "exif-parser": "^0.1.12", + "file-type": "^9.0.0", + "load-bmfont": "^1.3.1", + "mkdirp": "0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" }, "dependencies": { - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } } } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "@jimp/custom": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.9.5.tgz", + "integrity": "sha512-FaR7M0oxqbd7ujBL5ryyllS+mEuMKbKaDsdb8Cpu9SAo80DBiasUrYFFD/45/aRa95aM5o8t4C4Pna2bx8t3Tg==", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "@babel/runtime": "^7.7.2", + "@jimp/core": "^0.9.5", + "core-js": "^3.4.1" } }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true + "@jimp/gif": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.9.5.tgz", + "integrity": "sha512-QxjLl15nIz/QTeNgLFUJIOMLIceMO2B/xLUWF1/WqaP7Su6SGasRS6JY8OZ9QnqJLMWkodoEJmL6DxwtoOtqdg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1", + "omggif": "^1.0.9" + } }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true + "@jimp/jpeg": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.9.5.tgz", + "integrity": "sha512-cBpXqmeegsLzf/mYk1WpYov2RH1W944re5P61/ag6AMWEMQ51BoBdgBy5JABZIELg2GQxpoG+g/KxUshRzeIAg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1", + "jpeg-js": "^0.3.4" + } }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "@jimp/plugin-blit": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.9.5.tgz", + "integrity": "sha512-VmV99HeCPOyliY/uEGOaKO9EcqDxSBzKDGC7emNCLFzlbK4uty4/cYMKGKTBiZR9AS1rEd63LxrDtbHKR8CsqQ==", "dev": true, "requires": { - "has": "^1.0.3" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" } }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "@jimp/plugin-blur": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.9.5.tgz", + "integrity": "sha512-FnAEhMW9ZK8D6qCLDeMAloi4h7TCch9ZWFdonj49gwllpvLksBpnL9PTft4dFXCwZgOAq2apYwW7cwTAIfAw4A==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" } }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true + "@jimp/plugin-color": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.9.5.tgz", + "integrity": "sha512-2aFE0tRdhAKCCgh+tFLsLPOSgrk3ttl2TtTP5FAXeKmzlLj7FZ/JKj0waaGWZKdJ+uDxsVpX3EhuK3CfukIyrg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1", + "tinycolor2": "^1.4.1" + } }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "@jimp/plugin-contain": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.9.5.tgz", + "integrity": "sha512-zhaCJnUqd8hhD8IXxbRALU6ZzCWWbQDulc8Tn8Hxnub0si7dlq/DxBQT7og6kCxswBj2zPBtRAHONEwLdt7Nfw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" } }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "@jimp/plugin-cover": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.9.5.tgz", + "integrity": "sha512-rG7vtx7vV9mHCFR4YP9GzGEsaop0IkMidP3UFPULbDcBdEEkehEG7a0h2X4w/Nt07J3k8wVoXYTjrb/CXpWkaw==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" } - } - } - }, - "array.prototype.map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", - "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.4" - }, - "dependencies": { - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + }, + "@jimp/plugin-crop": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.9.5.tgz", + "integrity": "sha512-yoScC43YhYlswTKyL4fmawGwF73HyuIRpp1R3mXa6qbMA9mjX9QiqNdAIMB3UMHeBcIgkOD/Zy1f90/skBMpxg==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" } }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "@jimp/plugin-displace": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.9.5.tgz", + "integrity": "sha512-nwfB72qNP8kNyBnlaY0vgJys7RUjvI61Qp3AMMbKKaRSsthCx7aeKU9Cyv+AHMfcVkkt3NdTmh7ScE+hkNFUhA==", "dev": true, "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - }, - "dependencies": { - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - } + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" } }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "@jimp/plugin-dither": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.9.5.tgz", + "integrity": "sha512-Pp1ehm5Hon6LcttRG+d+x1UN1ww00P4cyBnMVRR3NMhIfgc0IjQgojik9ZXax3nVj7XkqXJJh8f5uxC1cvYUnA==", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" } }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true + "@jimp/plugin-flip": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.9.5.tgz", + "integrity": "sha512-rKbg8c9ePst3w2t1kxQt2H05/rUR5/pjjafhZ97s01pxH/SOJudy5d76nJGzRBYoaRnxpvDzpN+2+iA08wDY5Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" + } }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true + "@jimp/plugin-gaussian": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.9.5.tgz", + "integrity": "sha512-8HloHpVPgSsoWekslJ5uUPK2ddoLrGXQAVOyo3BT2pVgwbL317+r96NxPGKTxrY20fqex9SQrjx3kHeSWbysEA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" + } }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "@jimp/plugin-invert": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.9.5.tgz", + "integrity": "sha512-tqfMqQqsU4ulaif0Kk/BydqmG5UbjT67dmMjwnDL7rke+ypJ8tzq7j9QeZ9SDFB+PxUQcy/kPEw/R2Ys7HHi8A==", "dev": true, "requires": { - "has": "^1.0.3" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" } }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "@jimp/plugin-mask": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.9.5.tgz", + "integrity": "sha512-lIOrKb/VT1laDIA1H1nPOdtOB4TVhMRlxanXoEP8uKdE6a2goqZHXbKLn9itkm0MxtsTlT9KIXwzGxjCV38B3w==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" } }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true + "@jimp/plugin-normalize": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.9.5.tgz", + "integrity": "sha512-gayxgPLDp2gynu2IacvdCtqw0bdcC2feUqYOBjTtCpAwIz1KP2Qd6qKjV1dAVGiLO9ESW5maMa0vIBiBkYOovg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" + } }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "@jimp/plugin-print": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.9.5.tgz", + "integrity": "sha512-/BUSyCfvVhuFdf+rBdH1wbuY8r9J0qhn4Icy7HqO58By7I+V7q7jayoeiLk+zEBsAXpCUbWiZG3KWNtZhLWeQg==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1", + "load-bmfont": "^1.4.0" } }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "@jimp/plugin-resize": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.9.5.tgz", + "integrity": "sha512-vIMleLPbEv0qTE1Mnc7mg5HSFc4l4FxlbDniVUvpi8ZMFa8IkigcTeAgXUKacevNL7uZ66MrnpQ49J3tNE28dQ==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" } - } - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "art": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/art/-/art-0.10.3.tgz", - "integrity": "sha512-HXwbdofRTiJT6qZX/FnchtldzJjS3vkLJxQilc3Xj+ma2MXjY4UAyQ0ls1XZYVnDvVIBiFZbC6QsvtW86TD6tQ==", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "@jimp/plugin-rotate": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.9.5.tgz", + "integrity": "sha512-BHlhwUruHNQkOpsfzTE2uuSfmkj5eiIDRSAC8whupUGGXNgS67tZJB6u0qDRIeSP/gWV5tGGwXQNMn3AahwR1Q==", "dev": true, "requires": { - "inherits": "2.0.1" + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" - }, - "ast-types": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.12.4.tgz", - "integrity": "sha512-ky/YVYCbtVAS8TdMIaTiPFHwEpRB5z1hctepJplTr3UW5q8TDrpIMCILyk8pmLxGtn2KCtC/lSn7zOsaI7nzDw==", - "dev": true - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, + }, + "@jimp/plugin-scale": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.9.5.tgz", + "integrity": "sha512-PDU8F77EPFTcLBVDcJtGUvPXA2acG4KqJMZauHwZLZxuiDEvt9qsDQm4aTKcN/ku8oWZjfGBSOamhx/QNUqV5Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1" + } + }, + "@jimp/plugins": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.9.5.tgz", + "integrity": "sha512-3hvuXeRLj36ifpwE7I7g5Da9bKl/0y62t90ZN0hdQwhLBjRRF4u1e1JZpyu6EK98Bp+W/c8fJ2iuOsHadJOusg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/plugin-blit": "^0.9.5", + "@jimp/plugin-blur": "^0.9.5", + "@jimp/plugin-color": "^0.9.5", + "@jimp/plugin-contain": "^0.9.5", + "@jimp/plugin-cover": "^0.9.5", + "@jimp/plugin-crop": "^0.9.5", + "@jimp/plugin-displace": "^0.9.5", + "@jimp/plugin-dither": "^0.9.5", + "@jimp/plugin-flip": "^0.9.5", + "@jimp/plugin-gaussian": "^0.9.5", + "@jimp/plugin-invert": "^0.9.5", + "@jimp/plugin-mask": "^0.9.5", + "@jimp/plugin-normalize": "^0.9.5", + "@jimp/plugin-print": "^0.9.5", + "@jimp/plugin-resize": "^0.9.5", + "@jimp/plugin-rotate": "^0.9.5", + "@jimp/plugin-scale": "^0.9.5", + "core-js": "^3.4.1", + "timm": "^1.6.1" + } + }, + "@jimp/png": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.9.5.tgz", + "integrity": "sha512-0GPq/XixXcuWIA3gpMCUUj6rhxT78Hu9oDC9reaHUCcC/5cRTd5Eh7wLafZL8EfOZWV3mh2FZtWiY1xaNHHlBQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/utils": "^0.9.5", + "core-js": "^3.4.1", + "pngjs": "^3.3.3" + } + }, + "@jimp/tiff": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.9.5.tgz", + "integrity": "sha512-EcRtiHsAQ9aygRRMWhGTVfitfHwllgt93GE1L8d/iwSlu3e3IIV38MDINdluQUQMU5jcFBcX6eyVVvsgCleGiQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "core-js": "^3.4.1", + "utif": "^2.0.1" + } + }, + "@jimp/types": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.9.5.tgz", + "integrity": "sha512-62inaxx8zy24WMP+bsg6ZmgsL49oyoGUIGcjDKzvyAY/O6opD+UMNlArhl0xvCCdzriQxbljtSv/8uyHxz4Xbw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/bmp": "^0.9.5", + "@jimp/gif": "^0.9.5", + "@jimp/jpeg": "^0.9.5", + "@jimp/png": "^0.9.5", + "@jimp/tiff": "^0.9.5", + "core-js": "^3.4.1", + "timm": "^1.6.1" + } + }, + "@jimp/utils": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.9.5.tgz", + "integrity": "sha512-W9vse4/1AYmOjtIVACoBMdc/2te1zcPURhMYNEyiezCU7hWMdj/Z1mwiWFq3AYCgOG8GPVx0ZQzrgqUfUxfTHQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "core-js": "^3.4.1" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/node": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.0.tgz", + "integrity": "sha512-0ARSQootUG1RljH2HncpsY2TJBfGQIKOOi7kxzUY6z54ePu/ZD+wJA8zI2Q6v8rol2qpG/rvqsReco8zNMPvhQ==", + "dev": true, + "optional": true + }, + "@wdio/config": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-5.18.4.tgz", + "integrity": "sha512-HQugjG+BABDYG/1dPR6KA+IQilsg1MSQ/NVIg8R6I8ER9MA2JNIoaxvXZ+CnDfgY/QpyIHEeqJhfgw8GElaPdw==", + "dev": true, + "requires": { + "@wdio/logger": "5.16.10", + "deepmerge": "^4.0.0", + "glob": "^7.1.2" + } + }, + "@wdio/logger": { + "version": "5.16.10", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-5.16.10.tgz", + "integrity": "sha512-hRKhxgd9uB48Dtj2xe2ckxU4KwI/RO8IwguySuaI2SLFj6EDbdonwzpVkq111/fjBuq7R1NauAaNcm3AMEbIFA==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "@wdio/protocols": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-5.19.0.tgz", + "integrity": "sha512-6DTSZKJd/UwtiTuQ2GgfQV/LTnjVmAn6uNzUz2j5cdFxCI63vaRQ4AnaPFjjT3VuN+rJXnmRF8FKoT02jBCQrg==", + "dev": true + }, + "@wdio/repl": { + "version": "5.18.6", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-5.18.6.tgz", + "integrity": "sha512-z9UPBk/Uee0l9g0ijnOatU3WP7TcpIyNtRj9AGsJVbYZFwqMWBqPkO4nblldyNQIuqdgXAPsDo8lPGDno12/oA==", + "dev": true, + "requires": { + "@wdio/utils": "5.18.6" + } + }, + "@wdio/utils": { + "version": "5.18.6", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-5.18.6.tgz", + "integrity": "sha512-OVdK7P9Gne9tR6dl1GEKucwX4mtS47F26g4lH8r0HURvMegZLGtcchI1cqF6hjK7EpP737b+C3q4ooZSBdH9XQ==", + "dev": true, + "requires": { + "@wdio/logger": "5.16.10", + "deepmerge": "^4.0.0" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "adbkit-apkreader": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/adbkit-apkreader/-/adbkit-apkreader-3.2.0.tgz", + "integrity": "sha512-QwsxPYCqWSmCAiW/A4gq0eytb4jtZc7WNbECIhLCRfGEB38oXzIV/YkTpkOTQFKSg3S4Svb6y///qOUH7UrWWw==", + "dev": true, + "requires": { + "bluebird": "^3.4.7", + "debug": "~4.1.1", + "yauzl": "^2.7.0" + } + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "any-base": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", + "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==", + "dev": true + }, + "appium-adb": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/appium-adb/-/appium-adb-7.26.0.tgz", + "integrity": "sha512-EWVj2kaPmbnGTrr9sX+XqMmYKKdFlo94M106fEfLbb41PxJTn/e6bwJ6qwXjGMpJhlpgbjUwFGhnUkaut6lD+w==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "adbkit-apkreader": "^3.1.2", + "appium-support": "^2.37.0", + "async-lock": "^1.0.0", + "asyncbox": "^2.3.1", + "bluebird": "^3.4.7", + "lodash": "^4.0.0", + "lru-cache": "^5.0.0", + "semver": "^7.0.0", + "shell-quote": "^1.6.1", + "source-map-support": "^0.5.5", + "teen_process": "^1.11.0", + "utf7": "^1.0.2" + } + }, + "appium-android-driver": { + "version": "4.26.1", + "resolved": "https://registry.npmjs.org/appium-android-driver/-/appium-android-driver-4.26.1.tgz", + "integrity": "sha512-vczjhG0DOToBDV/++0iMdx4wXvTD/CaICH4F9IbTPa0APOTSGsL+k113vmD2Alsquvq/F/Kj5MFIq2DlpPjhgw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-adb": "^7.22.0", + "appium-base-driver": "^5.1.0", + "appium-chromedriver": "^4.13.0", + "appium-support": "^2.37.0", + "asyncbox": "^2.0.4", + "bluebird": "^3.4.7", + "io.appium.settings": "^3.1.0", + "jimp": "^0.9.3", + "lodash": "^4.17.4", + "moment": "^2.24.0", + "moment-timezone": "^0.5.26", + "portfinder": "^1.0.6", + "portscanner": "2.2.0", + "semver": "^7.0.0", + "shared-preferences-builder": "^0.0.4", + "shell-quote": "^1.6.1", + "source-map-support": "^0.5.5", + "teen_process": "^1.9.0", + "ws": "^7.0.0", + "yargs": "^15.0.1" + } + }, + "appium-base-driver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/appium-base-driver/-/appium-base-driver-5.3.1.tgz", + "integrity": "sha512-IQpmGI3+CzBzbW34x1eGRIkOuMYqJ1uHvJwmThFJBLoaYZNDPRlO37g0np2TjESwOBYpD1DSEWLxzkKQusU1rA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-support": "^2.39.0", + "async-lock": "^1.0.0", + "asyncbox": "^2.3.1", + "bluebird": "^3.5.3", + "body-parser": "^1.18.2", + "colors": "^1.1.2", + "es6-error": "^4.1.1", + "express": "^4.16.2", + "http-status-codes": "^1.3.0", + "lodash": "^4.0.0", + "lru-cache": "^5.0.0", + "method-override": "^3.0.0", + "morgan": "^1.9.0", + "request": "^2.83.0", + "request-promise": "^4.2.2", + "sanitize-filename": "^1.6.1", + "serve-favicon": "^2.4.5", + "source-map-support": "^0.5.5", + "uuid-js": "^0.7.5", + "validate.js": "^0.13.0", + "webdriverio": "^5.10.9", + "ws": "^7.0.0" + } + }, + "appium-chromedriver": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/appium-chromedriver/-/appium-chromedriver-4.21.0.tgz", + "integrity": "sha512-93LmpeC7sCqjHzMhk+1JR8VM9rNwLJ/mNWjjG26ngqfSY/xNn5fzq9ff+TUKXYVlyPqE64ODi+5UifKUZ9QZ7Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-base-driver": "^5.0.0", + "appium-support": "^2.39.0", + "asyncbox": "^2.0.2", + "bluebird": "^3.5.1", + "compare-versions": "^3.4.0", + "fancy-log": "^1.3.2", + "lodash": "^4.17.4", + "request": "^2.57.0", + "request-promise": "^4.2.2", + "semver": "^7.0.0", + "source-map-support": "^0.5.5", + "teen_process": "^1.15.0", + "xmldom": "^0.2.0", + "xpath": "^0.0.27" + }, + "dependencies": { + "xmldom": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.2.1.tgz", + "integrity": "sha512-kXXiYvmblIgEemGeB75y97FyaZavx6SQhGppLw5TKWAD2Wd0KAly0g23eVLh17YcpxZpnFym1Qk/eaRjy1APPg==", + "dev": true + } + } + }, + "appium-espresso-driver": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/appium-espresso-driver/-/appium-espresso-driver-1.23.2.tgz", + "integrity": "sha512-NY5AXM1Mo5iFOih8iXinLkuT00w3P+k0qWtkBphVc1z1u0x9dBW6CMdH9a1W25g3u/4yJZIAAdY7A4dyrCIpyw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.3", + "appium-adb": "^7.19.1", + "appium-android-driver": "^4.25.3", + "appium-base-driver": "^5.0.0", + "appium-support": "^2.20.0", + "asyncbox": "^2.3.1", + "bluebird": "^3.5.0", + "lodash": "^4.17.11", + "portscanner": "^2.1.1", + "request": "^2.88.0", + "request-promise": "^4.2.1", + "source-map-support": "^0.5.8", + "validate.js": "^0.13.0", + "yargs": "^15.0.1" + } + }, + "appium-fake-driver": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/appium-fake-driver/-/appium-fake-driver-0.9.0.tgz", + "integrity": "sha512-MwCqt1vz+bRidl9NRNcToJZostKEJQAzBizh9QyZ+5n3/N+OTBYCp5AD/pJw/MjF4Wl1u1Jhu2jFxsu+XaQpqA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-base-driver": "^5.0.0", + "appium-support": "^2.11.1", + "asyncbox": "^2.3.2", + "bluebird": "^3.5.1", + "lodash": "^4.17.4", + "source-map-support": "^0.5.5", + "xmldom": "^0.1.19", + "xpath": "0.0.27", + "yargs": "^15.0.1" + } + }, + "appium-flutter-driver": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/appium-flutter-driver/-/appium-flutter-driver-0.0.23.tgz", + "integrity": "sha512-yRZwfioaMpE2s9Av8pgv6hQkArsQ36KkrEgHaOk5uRRuTXbHSg0OB51Bm8xKdXvWYmA4DI6Oz4xWSTNjfdrJhw==", + "dev": true, + "requires": { + "appium-base-driver": "^5.0.0", + "appium-uiautomator2-driver": "^1.35.1", + "appium-xcuitest-driver": "^3.0.0", + "rpc-websockets": "^4.5.1" + } + }, + "appium-idb": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/appium-idb/-/appium-idb-0.4.1.tgz", + "integrity": "sha512-gMuZC/ndo4lGL2t/9sL+yyCGQVUV0rdpxgjvnuEdADA3GYCUFV/rUj2czJUhajUOhADGUP1Pibn0h3qtZuaBbQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-support": "^2.41.0", + "asyncbox": "^2.5.2", + "bluebird": "^3.1.1", + "lodash": "^4.0.0", + "shell-quote": "^1.6.1", + "source-map-support": "^0.5.5", + "teen_process": "^1.11.0" + }, + "dependencies": { + "appium-support": { + "version": "2.43.0", + "resolved": "https://registry.npmjs.org/appium-support/-/appium-support-2.43.0.tgz", + "integrity": "sha512-HELlIM6J0CI/ALHKbr8Z8TNjrnyw1QVdzLKCUX/l4Gw/MmaS4QvHNpuy3Bdd0MCxX/aw76q2F58HmCiwzHtAkg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "archiver": "^3.1.1", + "base64-stream": "^1.0.0", + "bluebird": "^3.5.1", + "bplist-creator": "^0", + "bplist-parser": "^0.2", + "extract-zip": "^1.6.0", + "glob": "^7.1.2", + "jimp": "^0.9.0", + "jsftp": "^2.1.2", + "klaw": "^3.0.0", + "lodash": "^4.2.1", + "md5-file": "^4.0.0", + "mjpeg-server": "^0.3.0", + "mkdirp": "^1.0.0", + "moment": "^2.24.0", + "mv": "^2.1.1", + "ncp": "^2.0.0", + "npmlog": "^4.1.2", + "plist": "^3.0.1", + "pluralize": "^8.0.0", + "pngjs": "^3.0.0", + "request": "^2.83.0", + "request-promise": "^4.2.2", + "rimraf": "^3.0.0", + "sanitize-filename": "^1.6.1", + "semver": "^7.0.0", + "shell-quote": "^1.7.2", + "source-map-support": "^0.5.5", + "teen_process": "^1.5.1", + "uuid": "^7.0.2", + "which": "^2.0.0", + "yauzl": "^2.7.0" + } + }, + "archiver": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", + "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^2.6.3", + "buffer-crc32": "^0.2.1", + "glob": "^7.1.4", + "readable-stream": "^3.4.0", + "tar-stream": "^2.1.0", + "zip-stream": "^2.1.2" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "compress-commons": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", + "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^3.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "crc32-stream": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", + "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", + "dev": true, + "requires": { + "crc": "^3.4.4", + "readable-stream": "^3.4.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "dev": true, + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true + }, + "zip-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.3.tgz", + "integrity": "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^2.1.1", + "readable-stream": "^3.4.0" + } + } + } + }, + "appium-ios-device": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/appium-ios-device/-/appium-ios-device-1.5.0.tgz", + "integrity": "sha512-s05omp42+ObeyTI6SQ2HcommWiX3Y5Bfpvn1D1ftyl01u/qr9QLyDzBn47myYB80MeDcwaR/iRADDLlXkpR4Dg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-support": "^2.35.0", + "bluebird": "^3.1.1", + "lodash": "^4.17.15", + "semver": "^7.0.0", + "source-map-support": "^0.5.5" + } + }, + "appium-ios-driver": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/appium-ios-driver/-/appium-ios-driver-4.6.0.tgz", + "integrity": "sha512-pEE8ZJYcmB3CLs+EqlAsFOJCsJ6v6K1m//UXIU8r29w2PHs9d4LmFXvOESUBK7CIrlJmwCcr6eAZhtsr0H1fuw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-base-driver": "^5.0.0", + "appium-ios-simulator": "^3.9.0", + "appium-remote-debugger": "^4.1.0", + "appium-support": "^2.25.0", + "appium-xcode": "^3.1.0", + "asyncbox": "^2.3.1", + "bluebird": "^3.5.1", + "colors": "^1.1.2", + "js2xmlparser2": "^0.2.0", + "lodash": "^4.13.1", + "moment": "^2.24.0", + "moment-timezone": "^0.5.26", + "node-idevice": "^0.1.6", + "node-simctl": "^5.0.0", + "pem": "^1.8.3", + "portfinder": "^1.0.13", + "request": "^2.79.0", + "request-promise": "^4.1.1", + "safari-launcher": "^2.0.5", + "source-map-support": "^0.5.5", + "teen_process": "^1.6.0", + "through": "^2.3.8", + "uuid-js": "^0.7.5", + "xmldom": "^0.2.0", + "xpath": "^0.0.24", + "yargs": "^15.0.1" + }, + "dependencies": { + "appium-remote-debugger": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/appium-remote-debugger/-/appium-remote-debugger-4.5.0.tgz", + "integrity": "sha512-8UhFOQJvSCHSuWloGe+FOeIObIp6wzc5oaXV8vVRANn8rqZlQl2j4dgelQcA1DoE54Lphy00Bo99M7qDsKkF7w==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-base-driver": "^4.0.0", + "appium-support": "^2.28.0", + "asyncbox": "^2.5.2", + "bluebird": "^3.4.7", + "bufferpack": "0.0.6", + "es6-error": "^4.1.1", + "lodash": "^4.17.11", + "request": "^2.79.0", + "request-promise": "^4.1.1", + "source-map-support": "^0.5.5", + "ws": "^7.0.0" + }, + "dependencies": { + "appium-base-driver": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/appium-base-driver/-/appium-base-driver-4.5.1.tgz", + "integrity": "sha512-g7sI5mzmGdZhIFg3+A5f9ewtihYKS0b33wZWbN6R/PYYTEmXbNhFPGfVqzoAzFANuLjlTlvEEsqGcUtjrMO2Bw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-support": "^2.33.1", + "async-lock": "^1.0.0", + "asyncbox": "^2.3.1", + "bluebird": "^3.5.3", + "body-parser": "^1.18.2", + "colors": "^1.1.2", + "es6-error": "^4.1.1", + "express": "^4.16.2", + "http-status-codes": "^1.3.0", + "lodash": "^4.0.0", + "lru-cache": "^5.0.0", + "method-override": "^3.0.0", + "morgan": "^1.9.0", + "request": "^2.83.0", + "request-promise": "^4.2.2", + "sanitize-filename": "^1.6.1", + "serve-favicon": "^2.4.5", + "source-map-support": "^0.5.5", + "uuid-js": "^0.7.5", + "validate.js": "^0.13.0", + "webdriverio": "^5.10.9", + "ws": "^7.0.0" + } + } + } + }, + "node-simctl": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/node-simctl/-/node-simctl-5.3.0.tgz", + "integrity": "sha512-5EJPsorg+ZLxeLk6Cc5Q3hI4WcWkWSWkqQnJEJf3DrM9UekGvpgOUE8uZtr8dTtY/GZCsI30Ksusqm+zGq3NsA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-support": "^2.37.0", + "appium-xcode": "^3.8.0", + "asyncbox": "^2.3.1", + "lodash": "^4.2.1", + "semver": "^7.0.0", + "source-map-support": "^0.5.5", + "teen_process": "^1.5.1" + } + }, + "xmldom": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.2.1.tgz", + "integrity": "sha512-kXXiYvmblIgEemGeB75y97FyaZavx6SQhGppLw5TKWAD2Wd0KAly0g23eVLh17YcpxZpnFym1Qk/eaRjy1APPg==", + "dev": true + }, + "xpath": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.24.tgz", + "integrity": "sha1-Gt4WLhzFI8jTn8fQavwW6iFvKfs=", + "dev": true + } + } + }, + "appium-ios-simulator": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/appium-ios-simulator/-/appium-ios-simulator-3.20.0.tgz", + "integrity": "sha512-RbnQrlCeRNhkftXkt97pQARfVNeCxp6v2v6RaZV1ZU5D2HrY5lEaw7I65wqUxn75w6hywiz23+y//6+OaLnfog==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-support": "^2.39.0", + "appium-xcode": "^3.1.0", + "async-lock": "^1.0.0", + "asyncbox": "^2.3.1", + "bluebird": "^3.5.1", + "fkill": "^7.0.0", + "lodash": "^4.2.1", + "node-simctl": "^6.1.0", + "openssl-wrapper": "^0.3.4", + "semver": "^7.0.0", + "shell-quote": "^1.6.1", + "source-map-support": "^0.5.3", + "teen_process": "^1.3.0" + } + }, + "appium-mac-driver": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/appium-mac-driver/-/appium-mac-driver-1.10.0.tgz", + "integrity": "sha512-+isEfxtE7FQJr418udxfHBp9OU/S/tEjG8BbMgGjcHi8TE/4B78KzQZxgewGPRKraNLFo/58by8PqgWsS6sLtA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-base-driver": "^5.0.0", + "appium-support": "^2.36.0", + "asyncbox": "^2.3.1", + "bluebird": "^3.5.1", + "lodash": "^4.17.4", + "source-map-support": "^0.5.5", + "teen_process": "^1.15.0", + "yargs": "^15.0.1" + } + }, + "appium-remote-debugger": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/appium-remote-debugger/-/appium-remote-debugger-8.9.0.tgz", + "integrity": "sha512-GSq6luI9Us6urS7K8c90R13/MU1T95GGKNBV4t+IPw7cvDcm5fpsnqKX77xrf+7z/n4claUk/8m6yce9sSskqQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-base-driver": "^5.0.0", + "appium-ios-device": "^1.2.1", + "appium-support": "^2.41.0", + "async-lock": "^1.2.2", + "asyncbox": "^2.6.0", + "bluebird": "^3.4.7", + "lodash": "^4.17.11", + "source-map-support": "^0.5.5" + }, + "dependencies": { + "appium-support": { + "version": "2.43.0", + "resolved": "https://registry.npmjs.org/appium-support/-/appium-support-2.43.0.tgz", + "integrity": "sha512-HELlIM6J0CI/ALHKbr8Z8TNjrnyw1QVdzLKCUX/l4Gw/MmaS4QvHNpuy3Bdd0MCxX/aw76q2F58HmCiwzHtAkg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "archiver": "^3.1.1", + "base64-stream": "^1.0.0", + "bluebird": "^3.5.1", + "bplist-creator": "^0", + "bplist-parser": "^0.2", + "extract-zip": "^1.6.0", + "glob": "^7.1.2", + "jimp": "^0.9.0", + "jsftp": "^2.1.2", + "klaw": "^3.0.0", + "lodash": "^4.2.1", + "md5-file": "^4.0.0", + "mjpeg-server": "^0.3.0", + "mkdirp": "^1.0.0", + "moment": "^2.24.0", + "mv": "^2.1.1", + "ncp": "^2.0.0", + "npmlog": "^4.1.2", + "plist": "^3.0.1", + "pluralize": "^8.0.0", + "pngjs": "^3.0.0", + "request": "^2.83.0", + "request-promise": "^4.2.2", + "rimraf": "^3.0.0", + "sanitize-filename": "^1.6.1", + "semver": "^7.0.0", + "shell-quote": "^1.7.2", + "source-map-support": "^0.5.5", + "teen_process": "^1.5.1", + "uuid": "^7.0.2", + "which": "^2.0.0", + "yauzl": "^2.7.0" + } + }, + "archiver": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", + "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^2.6.3", + "buffer-crc32": "^0.2.1", + "glob": "^7.1.4", + "readable-stream": "^3.4.0", + "tar-stream": "^2.1.0", + "zip-stream": "^2.1.2" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "compress-commons": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", + "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^3.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "crc32-stream": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", + "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", + "dev": true, + "requires": { + "crc": "^3.4.4", + "readable-stream": "^3.4.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "dev": true, + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true + }, + "zip-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.3.tgz", + "integrity": "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^2.1.1", + "readable-stream": "^3.4.0" + } + } + } + }, + "appium-sdb": { + "version": "1.0.1-beta", + "resolved": "https://registry.npmjs.org/appium-sdb/-/appium-sdb-1.0.1-beta.tgz", + "integrity": "sha512-vTQv52JjlKLc/D/iJuJeFeZW0DYxSo9whF2DXu5UC3+Y1qUIHX91h2UBmNzs5NSbvIJ63lGWi7vMVnu6IhMdsQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-support": "^2.4.0", + "asyncbox": "^2.3.1", + "lodash": "^4.17.11", + "source-map-support": "^0.5.9", + "teen_process": "^1.3.1" + } + }, + "appium-support": { + "version": "2.39.1", + "resolved": "https://registry.npmjs.org/appium-support/-/appium-support-2.39.1.tgz", + "integrity": "sha512-FKDvP4pkt9N2KRzf5V+w8nNquoEIdNreOzM1OuSj4TxtG7S6Ix2LbXqjXjN4/nZKC5VEz1Vh+IQrSZ2uQv6MZg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "archiver": "^1.3.0", + "bluebird": "^3.5.1", + "bplist-creator": "^0", + "bplist-parser": "^0.2", + "extract-zip": "^1.6.0", + "glob": "^7.1.2", + "jimp": "^0.9.0", + "jsftp": "^2.1.2", + "klaw": "^3.0.0", + "lodash": "^4.2.1", + "md5-file": "^4.0.0", + "mjpeg-server": "^0.3.0", + "mkdirp": "^1.0.0", + "moment": "^2.24.0", + "mv": "^2.1.1", + "ncp": "^2.0.0", + "npmlog": "^4.1.2", + "plist": "^3.0.1", + "pluralize": "^8.0.0", + "pngjs": "^3.0.0", + "request": "^2.83.0", + "request-promise": "^4.2.2", + "rimraf": "^3.0.0", + "semver": "^7.0.0", + "source-map-support": "^0.5.5", + "teen_process": "^1.5.1", + "which": "^2.0.0", + "yauzl": "^2.7.0" + } + }, + "appium-tizen-driver": { + "version": "1.1.1-beta.4", + "resolved": "https://registry.npmjs.org/appium-tizen-driver/-/appium-tizen-driver-1.1.1-beta.4.tgz", + "integrity": "sha512-lDOxwEAXUaoYwVMznFwYkHodceDahBNj2ImIGVDwSefEmEfR+1pZKvp1+SIeLRJfelsqVjnX8HQj8zRIP6lhKg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-base-driver": "^3.0.0", + "appium-sdb": "^1.0.1-beta", + "appium-support": "^2.8.0", + "asyncbox": "^2.0.4", + "bluebird": "^3.4.7", + "fancy-log": "^1.3.2", + "jimp": "^0.5.3", + "lodash": "^4.17.9", + "source-map-support": "^0.5.9", + "teen_process": "^1.9.0", + "yargs": "^12.0.2" + }, + "dependencies": { + "@jimp/bmp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.5.4.tgz", + "integrity": "sha512-P/ezH1FuoM3FwS0Dm2ZGkph4x5/rPBzFLEZor7KQkmGUnYEIEG4o0BUcAWFmJOp2HgzbT6O2SfrpJNBOcVACzQ==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "bmp-js": "^0.1.0", + "core-js": "^2.5.7" + } + }, + "@jimp/core": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.5.4.tgz", + "integrity": "sha512-n3uvHy2ndUKItmbhnRO8xmU8J6KR+v6CQxO9sbeUDpSc3VXc1PkqrA8ZsCVFCjnDFcGBXL+MJeCTyQzq5W9Crw==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "any-base": "^1.1.0", + "buffer": "^5.2.0", + "core-js": "^2.5.7", + "exif-parser": "^0.1.12", + "file-type": "^9.0.0", + "load-bmfont": "^1.3.1", + "mkdirp": "0.5.1", + "phin": "^2.9.1", + "pixelmatch": "^4.0.2", + "tinycolor2": "^1.4.1" + } + }, + "@jimp/custom": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.5.4.tgz", + "integrity": "sha512-tLfyJoyouDl2J3RPFGfDzTtE+4S8ljqJUmLzy/cmx1n7+xS5TpLPdPskp7UaeAfNTqdF4CNAm94KYoxTZdj2mg==", + "dev": true, + "requires": { + "@jimp/core": "^0.5.4", + "core-js": "^2.5.7" + } + }, + "@jimp/gif": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.5.0.tgz", + "integrity": "sha512-HVB4c7b8r/yCpjhCjVNPRFLuujTav5UPmcQcFJjU6aIxmne6e29rAjRJEv3UMamHDGSu/96PzOsPZBO5U+ZGww==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7", + "omggif": "^1.0.9" + } + }, + "@jimp/jpeg": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.5.4.tgz", + "integrity": "sha512-YaPWm+YSGCThNE/jLMckM3Qs6uaMxd/VsHOnEaqu5tGA4GFbfVaWHjKqkNGAFuiNV+HdgKlNcCOF3of+elvzqQ==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7", + "jpeg-js": "^0.3.4" + } + }, + "@jimp/plugin-blit": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.5.4.tgz", + "integrity": "sha512-WqDYOugv76hF1wnKy7+xPGf9PUbcm9vPW28/jHWn1hjbb2GnusJ2fVEFad76J/1SPfhrQ2Uebf2QCWJuLmOqZg==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugin-blur": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.5.0.tgz", + "integrity": "sha512-5k0PXCA1RTJdITL7yMAyZ5tGQjKLHqFvwdXj/PCoBo5PuMyr0x6qfxmQEySixGk/ZHdDxMi80vYxHdKHjNNgjg==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugin-color": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.5.5.tgz", + "integrity": "sha512-hWeOqNCmLguGYLhSvBrpfCvlijsMEVaLZAOod62s1rzWnujozyKOzm2eZe+W3To6mHbp5RGJNVrIwHBWMab4ug==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7", + "tinycolor2": "^1.4.1" + } + }, + "@jimp/plugin-contain": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.5.4.tgz", + "integrity": "sha512-8YJh4FI3S69unri0nJsWeqVLeVGA77N2R0Ws16iSuCCD/5UnWd9FeWRrSbKuidBG6TdMBaG2KUqSYZeHeH9GOQ==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugin-cover": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.5.4.tgz", + "integrity": "sha512-2Rur7b44WiDDgizUI2M2uYWc1RmfhU5KjKS1xXruobjQ0tXkf5xlrPXSushq0hB6Ne0Ss6wv0+/6eQ8WeGHU2w==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugin-crop": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.5.4.tgz", + "integrity": "sha512-6t0rqn4VazquGk48tO6hFBrQ+nkvC+A1RnR6UM/m8ZtG2/yjpwF0MXcpgJI1Fb+a4Ug7BY1fu2GPcZOhnAVK/g==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugin-displace": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.5.0.tgz", + "integrity": "sha512-Bec7SQvnmKia4hOXEDjeNVx7vo/1bWqjuV6NO8xbNQcAO3gaCl91c9FjMDhsfAVb0Ou6imhbIuFPrLxorXsecQ==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugin-dither": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.5.0.tgz", + "integrity": "sha512-We2WJQsD/Lm8oqBFp/vUv9/5r2avyenL+wNNu/s2b1HqA5O4sPGrjHy9K6vIov0NroQGCQ3bNznLkTmjiHKBcg==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugin-flip": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.5.0.tgz", + "integrity": "sha512-D/ehBQxLMNR7oNd80KXo4tnSET5zEm5mR70khYOTtTlfti/DlLp3qOdjPOzfLyAdqO7Ly4qCaXrIsnia+pfPrA==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugin-gaussian": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.5.0.tgz", + "integrity": "sha512-Ln4kgxblv0/YzLBDb/J8DYPLhDzKH87Y8yHh5UKv3H+LPKnLaEG3L4iKTE9ivvdocnjmrtTFMYcWv2ERSPeHcg==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugin-invert": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.5.0.tgz", + "integrity": "sha512-/vyKeIi3T7puf+8ruWovTjzDC585EnTwJ+lGOOUYiNPsdn4JDFe1B3xd+Ayv9aCQbXDIlPElZaM9vd/+wqDiIQ==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugin-mask": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.5.4.tgz", + "integrity": "sha512-mUJ04pCrUWaJGXPjgoVbzhIQB8cVobj2ZEFlGO3BEAjyylYMrdJlNlsER8dd7UuJ2L/a4ocWtFDdsnuicnBghQ==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugin-normalize": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.5.4.tgz", + "integrity": "sha512-Q5W0oEz9wxsjuhvHAJynI/OqXZcmqEAuRONQId7Aw5ulCXSOg9C4y2a67EO7aZAt55T+zMVxI9UpVUpzVvO6hw==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugin-print": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.5.4.tgz", + "integrity": "sha512-DOZr5TY9WyMWFBD37oz7KpTEBVioFIHQF/gH5b3O5jjFyj4JPMkw7k3kVBve9lIrzIYrvLqe0wH59vyAwpeEFg==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7", + "load-bmfont": "^1.4.0" + } + }, + "@jimp/plugin-resize": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.5.4.tgz", + "integrity": "sha512-lXNprNAT0QY1D1vG/1x6urUTlWuZe2dfL29P81ApW2Yfcio471+oqo45moX5FLS0q24xU600g7cHGf2/TzqSfA==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugin-rotate": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.5.4.tgz", + "integrity": "sha512-SIdUpMc8clObMchy8TnjgHgcXEQM992z5KavgiuOnCuBlsmSHtE3MrXTOyMW0Dn3gqapV9Y5vygrLm/BVtCCsg==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugin-scale": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.5.0.tgz", + "integrity": "sha512-5InIOr3cNtrS5aQ/uaosNf28qLLc0InpNGKFmGFTv8oqZqLch6PtDTjDBZ1GGWsPdA/ljy4Qyy7mJO1QBmgQeQ==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7" + } + }, + "@jimp/plugins": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.5.5.tgz", + "integrity": "sha512-9oF6LbSM/K7YkFCcxaPaD8NUkL/ZY8vT8NIGfQ/NpX+tKQtcsLHcRavHpUC+M1xXShv/QGx9OdBV/jgiu82QYg==", + "dev": true, + "requires": { + "@jimp/plugin-blit": "^0.5.4", + "@jimp/plugin-blur": "^0.5.0", + "@jimp/plugin-color": "^0.5.5", + "@jimp/plugin-contain": "^0.5.4", + "@jimp/plugin-cover": "^0.5.4", + "@jimp/plugin-crop": "^0.5.4", + "@jimp/plugin-displace": "^0.5.0", + "@jimp/plugin-dither": "^0.5.0", + "@jimp/plugin-flip": "^0.5.0", + "@jimp/plugin-gaussian": "^0.5.0", + "@jimp/plugin-invert": "^0.5.0", + "@jimp/plugin-mask": "^0.5.4", + "@jimp/plugin-normalize": "^0.5.4", + "@jimp/plugin-print": "^0.5.4", + "@jimp/plugin-resize": "^0.5.4", + "@jimp/plugin-rotate": "^0.5.4", + "@jimp/plugin-scale": "^0.5.0", + "core-js": "^2.5.7", + "timm": "^1.6.1" + } + }, + "@jimp/png": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.5.4.tgz", + "integrity": "sha512-J2NU7368zihF1HUZdmpXsL/Hhyf+I3ubmK+6Uz3Uoyvtk1VS7dO3L0io6fJQutfWmPZ4bvu6Ry022oHjbi6QCA==", + "dev": true, + "requires": { + "@jimp/utils": "^0.5.0", + "core-js": "^2.5.7", + "pngjs": "^3.3.3" + } + }, + "@jimp/tiff": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.5.4.tgz", + "integrity": "sha512-hr7Zq3eWjAZ+itSwuAObIWMRNv7oHVM3xuEDC2ouP7HfE7woBtyhCyfA7u12KlgtM57gKWeogXqTlewRGVzx6g==", + "dev": true, + "requires": { + "core-js": "^2.5.7", + "utif": "^2.0.1" + } + }, + "@jimp/types": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.5.4.tgz", + "integrity": "sha512-nbZXM6TsdpnYHIBd8ZuoxGpvmxc2SqiggY30/bhOP/VJQoDBzm2v/20Ywz5M0snpIK2SdYG52eZPNjfjqUP39w==", + "dev": true, + "requires": { + "@jimp/bmp": "^0.5.4", + "@jimp/gif": "^0.5.0", + "@jimp/jpeg": "^0.5.4", + "@jimp/png": "^0.5.4", + "@jimp/tiff": "^0.5.4", + "core-js": "^2.5.7", + "timm": "^1.6.1" + } + }, + "@jimp/utils": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.5.0.tgz", + "integrity": "sha512-7H9RFVU+Li2XmEko0GGyzy7m7JjSc7qa+m8l3fUzYg2GtwASApjKF/LSG2AUQCUmDKFLdfIEVjxvKvZUJFEmpw==", + "dev": true, + "requires": { + "core-js": "^2.5.7" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "appium-base-driver": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/appium-base-driver/-/appium-base-driver-3.21.2.tgz", + "integrity": "sha512-cA7adQK63OiZzCvuHfQ4jKcT3tFogo8dfbgbgS4xpcmIEXgUZd/6MHicQG4NdfzbJpojQXNSeeCkRvlpksQrOQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-support": "^2.24.0", + "async-lock": "^1.0.0", + "asyncbox": "^2.3.1", + "bluebird": "^3.5.3", + "body-parser": "^1.18.2", + "colors": "^1.1.2", + "es6-error": "^4.1.1", + "express": "^4.16.2", + "http-status-codes": "^1.3.0", + "lodash": "^4.0.0", + "lru-cache": "^5.0.0", + "method-override": "^3.0.0", + "morgan": "^1.9.0", + "request": "^2.83.0", + "request-promise": "^4.2.2", + "sanitize-filename": "^1.6.1", + "serve-favicon": "^2.4.5", + "source-map-support": "^0.5.5", + "uuid-js": "^0.7.5", + "validate.js": "^0.13.0", + "webdriverio": "^5.10.9", + "ws": "^7.0.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "jimp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.5.6.tgz", + "integrity": "sha512-H0nHTu6KgAgQzDxa38ew2dXbnRzKm1w5uEyhMIxqwCQVjwgarOjjkV/avbNLxfxRHAFaNp4rGIc/qm8P+uhX9A==", + "dev": true, + "requires": { + "@babel/polyfill": "^7.0.0", + "@jimp/custom": "^0.5.4", + "@jimp/plugins": "^0.5.5", + "@jimp/types": "^0.5.4", + "core-js": "^2.5.7" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "appium-uiautomator2-driver": { + "version": "1.44.2", + "resolved": "https://registry.npmjs.org/appium-uiautomator2-driver/-/appium-uiautomator2-driver-1.44.2.tgz", + "integrity": "sha512-xnfuQjXLjZP8XzUfTpnFk6nd6Qo5ixCLWK9wD10lPcmsYiqdHT8gSySaS5RglqYyCKC5mfQPwqKUMzSpCHKbig==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-adb": "^7.20.0", + "appium-android-driver": "^4.25.0", + "appium-base-driver": "^5.0.0", + "appium-support": "^2.37.0", + "appium-uiautomator2-server": "^4.4.0", + "async-lock": "^1.2.2", + "asyncbox": "^2.3.1", + "bluebird": "^3.5.1", + "lodash": "^4.17.4", + "portscanner": "2.2.0", + "request": "^2.81.0", + "request-promise": "^4.1.1", + "source-map-support": "^0.5.5", + "teen_process": "^1.3.1", + "yargs": "^14.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.2.tgz", + "integrity": "sha512-/4ld+4VV5RnrynMhPZJ/ZpOCGSCeghMykZ3BhdFBDa9Wy/RH6uEGNWDJog+aUlq+9OM1CFTgtYRW5Is1Po9NOA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.0" + } + }, + "yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "appium-uiautomator2-server": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/appium-uiautomator2-server/-/appium-uiautomator2-server-4.5.5.tgz", + "integrity": "sha512-VtgdvOoC7jElOV5b+j0A3pB8c8D3Kll7b0EW2UR0+3Qs3gi0Xkzgouj/rtYv51elGeo/4NgmQ0hrQGqsEwIcfw==", + "dev": true + }, + "appium-webdriveragent": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/appium-webdriveragent/-/appium-webdriveragent-2.14.2.tgz", + "integrity": "sha512-C5/0Gh7rRPuvzYIqa2eVZX5RNP8wUzc4JdUhADS034rRCQQuShJghf3ZRSepottDGmPR3vMSau5sh0umtLWcaA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-base-driver": "^5.0.2", + "appium-ios-simulator": "^3.14.0", + "appium-support": "^2.37.0", + "async-lock": "^1.0.0", + "asyncbox": "^2.5.3", + "bluebird": "^3.5.5", + "lodash": "^4.17.11", + "node-simctl": "^6.0.2", + "request": "^2.79.0", + "request-promise": "^4.1.1", + "source-map-support": "^0.5.12", + "stream-equal": "^1.1.1", + "teen_process": "^1.14.1" + } + }, + "appium-windows-driver": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/appium-windows-driver/-/appium-windows-driver-1.8.0.tgz", + "integrity": "sha512-z1orUQK60Pi4he+5CJ9gj3WTUYXenyk39NEsLxiuqp9uxb3DikgZ399chRmYkqg/dIQuIUKRhZmFz+VtV2Gj1g==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-base-driver": "^5.0.0", + "appium-support": "^2.5.0", + "asyncbox": "^2.3.1", + "bluebird": "^3.5.1", + "lodash": "^4.6.1", + "request-promise": "^4.2.2", + "source-map-support": "^0.5.5", + "teen_process": "^1.7.0", + "yargs": "^15.0.1" + } + }, + "appium-xcode": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/appium-xcode/-/appium-xcode-3.10.0.tgz", + "integrity": "sha512-6Db49w2UjcdMn96nUMS/EGKE/6r/sgIPcw8mr9+e4Oeb5rvROAm/VeIWmwnov3uk2JG3SGkLTQRB9tROKKRDgw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-support": "^2.4.0", + "asyncbox": "^2.3.0", + "lodash": "^4.17.4", + "plist": "^3.0.1", + "semver": "^7.0.0", + "source-map-support": "^0.5.5", + "teen_process": "^1.3.0" + } + }, + "appium-xcuitest-driver": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/appium-xcuitest-driver/-/appium-xcuitest-driver-3.22.0.tgz", + "integrity": "sha512-hhjRz8EwUBBu1V0k9CwRN5CmQwreckEjnx7DFDjX3XQd/jfCBdNp5yKxqhjYveivvhiazPLTi3uoDy/aSs7Kpw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-base-driver": "^5.1.0", + "appium-idb": "^0", + "appium-ios-device": "^1.5.0", + "appium-ios-driver": "^4.6.0", + "appium-ios-simulator": "^3.20.0", + "appium-remote-debugger": "^8.8.1", + "appium-support": "^2.41.0", + "appium-webdriveragent": "^2.14.1", + "appium-xcode": "^3.8.0", + "async-lock": "^1.0.0", + "asyncbox": "^2.3.1", + "bluebird": "^3.1.1", + "js2xmlparser2": "^0.2.0", + "lodash": "^4.17.10", + "moment": "^2.24.0", + "moment-timezone": "0.5.28", + "node-simctl": "^6.1.0", + "portscanner": "2.2.0", + "request": "^2.79.0", + "request-promise": "^4.1.1", + "semver": "^7.0.0", + "source-map-support": "^0.5.5", + "teen_process": "^1.14.0", + "ws": "^7.0.0", + "xmldom": "^0.3.0", + "yargs": "^15.0.1" + }, + "dependencies": { + "appium-support": { + "version": "2.43.0", + "resolved": "https://registry.npmjs.org/appium-support/-/appium-support-2.43.0.tgz", + "integrity": "sha512-HELlIM6J0CI/ALHKbr8Z8TNjrnyw1QVdzLKCUX/l4Gw/MmaS4QvHNpuy3Bdd0MCxX/aw76q2F58HmCiwzHtAkg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "archiver": "^3.1.1", + "base64-stream": "^1.0.0", + "bluebird": "^3.5.1", + "bplist-creator": "^0", + "bplist-parser": "^0.2", + "extract-zip": "^1.6.0", + "glob": "^7.1.2", + "jimp": "^0.9.0", + "jsftp": "^2.1.2", + "klaw": "^3.0.0", + "lodash": "^4.2.1", + "md5-file": "^4.0.0", + "mjpeg-server": "^0.3.0", + "mkdirp": "^1.0.0", + "moment": "^2.24.0", + "mv": "^2.1.1", + "ncp": "^2.0.0", + "npmlog": "^4.1.2", + "plist": "^3.0.1", + "pluralize": "^8.0.0", + "pngjs": "^3.0.0", + "request": "^2.83.0", + "request-promise": "^4.2.2", + "rimraf": "^3.0.0", + "sanitize-filename": "^1.6.1", + "semver": "^7.0.0", + "shell-quote": "^1.7.2", + "source-map-support": "^0.5.5", + "teen_process": "^1.5.1", + "uuid": "^7.0.2", + "which": "^2.0.0", + "yauzl": "^2.7.0" + } + }, + "archiver": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", + "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^2.6.3", + "buffer-crc32": "^0.2.1", + "glob": "^7.1.4", + "readable-stream": "^3.4.0", + "tar-stream": "^2.1.0", + "zip-stream": "^2.1.2" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "compress-commons": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", + "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^3.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "crc32-stream": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", + "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", + "dev": true, + "requires": { + "crc": "^3.4.4", + "readable-stream": "^3.4.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "dev": true, + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true + }, + "xmldom": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.3.0.tgz", + "integrity": "sha512-z9s6k3wxE+aZHgXYxSTpGDo7BYOUfJsIRyoZiX6HTjwpwfS2wpQBQKa2fD+ShLyPkqDYo5ud7KitmLZ2Cd6r0g==", + "dev": true + }, + "zip-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.3.tgz", + "integrity": "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^2.1.1", + "readable-stream": "^3.4.0" + } + } + } + }, + "appium-youiengine-driver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/appium-youiengine-driver/-/appium-youiengine-driver-1.2.3.tgz", + "integrity": "sha512-N0isiXzcGn1RCHjQPDDewrXHgBurweaGRD0pGIAU9aIt94YsXBs3V8VYtRasx1iYjD/wem8YCLpX8ZOT87MkGg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-android-driver": "^4.0.0", + "appium-base-driver": "^4.x", + "appium-ios-driver": "^4.3.0", + "appium-ios-simulator": "3.x", + "appium-mac-driver": "1.x", + "appium-support": "2.x", + "appium-xcuitest-driver": "^3.0.0", + "asyncbox": "2.x", + "bluebird": "3.x", + "lodash": "^4.17.11", + "node-simctl": "^5.0.2", + "selenium-webdriver": "3.x", + "shelljs": "0.8.x", + "source-map-support": "^0.5.12", + "teen_process": "^1.15.0" + }, + "dependencies": { + "appium-base-driver": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/appium-base-driver/-/appium-base-driver-4.5.1.tgz", + "integrity": "sha512-g7sI5mzmGdZhIFg3+A5f9ewtihYKS0b33wZWbN6R/PYYTEmXbNhFPGfVqzoAzFANuLjlTlvEEsqGcUtjrMO2Bw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-support": "^2.33.1", + "async-lock": "^1.0.0", + "asyncbox": "^2.3.1", + "bluebird": "^3.5.3", + "body-parser": "^1.18.2", + "colors": "^1.1.2", + "es6-error": "^4.1.1", + "express": "^4.16.2", + "http-status-codes": "^1.3.0", + "lodash": "^4.0.0", + "lru-cache": "^5.0.0", + "method-override": "^3.0.0", + "morgan": "^1.9.0", + "request": "^2.83.0", + "request-promise": "^4.2.2", + "sanitize-filename": "^1.6.1", + "serve-favicon": "^2.4.5", + "source-map-support": "^0.5.5", + "uuid-js": "^0.7.5", + "validate.js": "^0.13.0", + "webdriverio": "^5.10.9", + "ws": "^7.0.0" + } + }, + "node-simctl": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/node-simctl/-/node-simctl-5.3.0.tgz", + "integrity": "sha512-5EJPsorg+ZLxeLk6Cc5Q3hI4WcWkWSWkqQnJEJf3DrM9UekGvpgOUE8uZtr8dTtY/GZCsI30Ksusqm+zGq3NsA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-support": "^2.37.0", + "appium-xcode": "^3.8.0", + "asyncbox": "^2.3.1", + "lodash": "^4.2.1", + "semver": "^7.0.0", + "source-map-support": "^0.5.5", + "teen_process": "^1.5.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "archiver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", + "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", + "dev": true, + "requires": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "walkdir": "^0.0.11", + "zip-stream": "^1.1.0" + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + } + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-args": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/assert-args/-/assert-args-1.2.1.tgz", + "integrity": "sha1-QEEDoUUqMv53iYgR5U5ZCoqTc70=", + "dev": true, + "requires": { + "101": "^1.2.0", + "compound-subject": "0.0.1", + "debug": "^2.2.0", + "get-prototype-of": "0.0.0", + "is-capitalized": "^1.0.0", + "is-class": "0.0.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "async-listener": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz", + "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==", + "dev": true, + "requires": { + "semver": "^5.3.0", + "shimmer": "^1.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "async-lock": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.2.2.tgz", + "integrity": "sha512-uczz62z2fMWOFbyo6rG4NlV2SdxugJT6sZA2QcfB1XaSjEiOh8CuOb/TttyMnYQCda6nkWecJe465tGQDPJiKw==", + "dev": true + }, + "asyncbox": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-2.6.0.tgz", + "integrity": "sha512-x9RDH0Dk4qZIGHQc9KbnDrUnaEbtWJW2DbuSElOFOQ2ppGsT1eFEDsiconZPpRGMW6+Uv724FYaBc8SUvyWVzA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "bluebird": "^3.5.1", + "es6-mapify": "^1.1.0", + "lodash": "^4.17.4", + "source-map-support": "^0.5.5" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "base64-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", + "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==", + "dev": true + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big-integer": { + "version": "1.6.48", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", + "dev": true + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bmp-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", + "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bplist-creator": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", + "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", + "dev": true, + "requires": { + "stream-buffers": "~2.2.0" + } + }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", + "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "bufferpack": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/bufferpack/-/bufferpack-0.0.6.tgz", + "integrity": "sha1-+z2HOKDh5OA7z/mfmnX57Bip1z4=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true + }, + "circular-json": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", + "dev": true + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + }, + "dependencies": { + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colornames": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", + "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "colorspace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "dev": true, + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "compound-subject": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/compound-subject/-/compound-subject-0.0.1.tgz", + "integrity": "sha1-JxVUaYoVrmCLHfyv0wt7oeqJLEs=", + "dev": true + }, + "compress-commons": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "dev": true, + "requires": { + "async-listener": "^0.6.0", + "emitter-listener": "^1.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "requires": { + "buffer": "^5.1.0" + } + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "dev": true, + "requires": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" + } + }, + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true + }, + "css-value": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "integrity": "sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + } + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "diagnostics": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", + "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", + "dev": true, + "requires": { + "colorspace": "1.1.x", + "enabled": "1.0.x", + "kuler": "1.0.x" + } + }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", + "dev": true + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "emitter-listener": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", + "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", + "dev": true, + "requires": { + "shimmer": "^1.2.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "enabled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "dev": true, + "requires": { + "env-variable": "0.0.x" + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "env-variable": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", + "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==", + "dev": true + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "es6-mapify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es6-mapify/-/es6-mapify-1.2.0.tgz", + "integrity": "sha512-b4QYXTO1HD0MMFs+JtYrQEaynlyuEInBF3anGQK11rQ45akiIBs+3YUyTBq9FLzM7rD5P2xAglEOXz9gcdmdIw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0" + } + }, + "es6-promisify": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.0.2.tgz", + "integrity": "sha512-eO6vFm0JvqGzjWIQA6QVKjxpmELfhWbDUWHm1rPfIbn55mhKPiAa5xpLmQWJrNa629ZIeQ8ZvMAi13kvrjK6Mg==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true + }, + "execa": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", + "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=", + "dev": true + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "~1.0.1" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", + "dev": true + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "fecha": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", + "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==", + "dev": true + }, + "file-type": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", + "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==", + "dev": true + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fkill": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fkill/-/fkill-7.0.0.tgz", + "integrity": "sha512-i61SqvPdfCxl1/VQulh9SXrC+4dudCtINzTHbKaEx3Jr0kD9SvxKDeXzej7Saurnj3al/jMJwQnsUc62VrBMHQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0", + "arrify": "^2.0.1", + "execa": "^4.0.0", + "pid-from-port": "^1.1.3", + "process-exists": "^4.0.0", + "ps-list": "^7.0.0", + "taskkill": "^3.0.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "ftp-response-parser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz", + "integrity": "sha1-O50z+O3V+45HALj3eMRi5bFYH4k=", + "dev": true, + "requires": { + "readable-stream": "^1.0.31" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-prototype-of": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/get-prototype-of/-/get-prototype-of-0.0.0.tgz", + "integrity": "sha1-mHcr0QcW0W3rSzIlFsRp78oorEQ=", + "dev": true + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "http-status-codes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-1.4.0.tgz", + "integrity": "sha512-JrT3ua+WgH8zBD3HEJYbeEgnuQaAnUeRRko/YojPAJjGmIfGD3KPU/asLdsLwKjfxOmQe5nXMQ0pt/7MyapVbQ==", + "dev": true + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "io.appium.settings": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/io.appium.settings/-/io.appium.settings-3.1.0.tgz", + "integrity": "sha512-s3OqMAD1CMTvYLLTijH/u36DLR6neqPxL7q9cD7qzEYycj8E7UzmvYg2amLf//xPSeCNjGpPbuVlk+ug29jSnQ==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-capitalized": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-capitalized/-/is-capitalized-1.0.0.tgz", + "integrity": "sha1-TIRktNkdPk7rRIid0s2PGwrEwTY=", + "dev": true + }, + "is-class": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.4.tgz", + "integrity": "sha1-4FdFFwW7NOOePjNZjJOpg3KWtzY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=", + "dev": true + }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dev": true, + "requires": { + "lodash.isfinite": "^3.3.2" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jimp": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.9.5.tgz", + "integrity": "sha512-gjrzz+lT4In7shmP4LV1o/dfL0btnh4W9F5jPCXA6Qw4uEAF8+8GDwAR69hbUQCZH7R5KoCtq81tpfzydoJtSQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.7.2", + "@jimp/custom": "^0.9.5", + "@jimp/plugins": "^0.9.5", + "@jimp/types": "^0.9.5", + "core-js": "^3.4.1", + "regenerator-runtime": "^0.13.3" + } + }, + "jpeg-js": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.3.7.tgz", + "integrity": "sha512-9IXdWudL61npZjvLuVe/ktHiA41iE8qFyLB+4VDTblEsWBzeg8WQTlktdUK4CdncUqtUgUg0bbOmTE2bKBKaBQ==", + "dev": true + }, + "js2xmlparser2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/js2xmlparser2/-/js2xmlparser2-0.2.0.tgz", + "integrity": "sha1-p8ogibg9AjMdYxiS3WdDhkElAz8=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsftp": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz", + "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "ftp-response-parser": "^1.0.1", + "once": "^1.4.0", + "parse-listing": "^1.1.3", + "stream-combiner": "^0.2.2", + "unorm": "^1.4.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "keypather": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/keypather/-/keypather-1.10.2.tgz", + "integrity": "sha1-4ESWMtSz5RbyHMAUznxWRP3c5hQ=", + "dev": true, + "requires": { + "101": "^1.0.0" + } + }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "kuler": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", + "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "dev": true, + "requires": { + "colornames": "^1.1.1" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "load-bmfont": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.0.tgz", + "integrity": "sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==", + "dev": true, + "requires": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^2.9.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "dev": true + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=", + "dev": true + }, + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", + "dev": true + }, + "lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha1-7GZi5IlkCO1KtsVCo5kLcswIACA=", + "dev": true + }, + "logform": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", + "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", + "dev": true, + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^2.3.3", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + } + }, + "loglevel": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", + "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", + "dev": true + }, + "loglevel-plugin-prefix": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", + "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", + "dev": true + }, + "longjohn": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/longjohn/-/longjohn-0.2.12.tgz", + "integrity": "sha1-fKdEawg2VcN351EiE9x1TVKmSn4=", + "dev": true, + "requires": { + "source-map-support": "0.3.2 - 1.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "md5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", + "dev": true, + "requires": { + "charenc": "~0.0.1", + "crypt": "~0.0.1", + "is-buffer": "~1.1.1" + } + }, + "md5-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-4.0.0.tgz", + "integrity": "sha512-UC0qFwyAjn4YdPpKaDNw6gNxRf7Mcx7jC1UGCY4boCzgvU2Aoc1mOGzTtrjjLKhM5ivsnhoKpQVxKPp+1j1qwg==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "method-override": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", + "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", + "dev": true, + "requires": { + "debug": "3.1.0", + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mjpeg-server": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mjpeg-server/-/mjpeg-server-0.3.0.tgz", + "integrity": "sha1-rx3hP3VkJwi6bsFw36xAi9xdlzc=", + "dev": true + }, + "mkdirp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==", + "dev": true + }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "dev": true + }, + "moment-timezone": { + "version": "0.5.28", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.28.tgz", + "integrity": "sha512-TDJkZvAyKIVWg5EtVqRzU97w0Rb0YVbfpqyjgu6GwXCAohVRqwZjf4fOzDE6p1Ch98Sro/8hQQi65WDXW5STPw==", + "dev": true, + "requires": { + "moment": ">= 2.9.0" + } + }, + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "dev": true, + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "dev": true, + "requires": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "dev": true, + "requires": { + "glob": "^6.0.1" + } + } + } + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-idevice": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/node-idevice/-/node-idevice-0.1.6.tgz", + "integrity": "sha1-lBGqdotEv7fNJezlyKHItLbx+kQ=", + "dev": true + }, + "node-simctl": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-simctl/-/node-simctl-6.1.0.tgz", + "integrity": "sha512-Ec+KDabRtxP4ul3wkmyVJa0/cWbznl4JGKdpbXAaM/DM8VPSoUVwJPyZoeYKvkKeke9Ee2meDlVRIL/gidz2TA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "appium-support": "^2.37.0", + "appium-xcode": "^3.8.0", + "asyncbox": "^2.3.1", + "lodash": "^4.2.1", + "semver": "^7.0.0", + "source-map-support": "^0.5.5", + "teen_process": "^1.5.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "omggif": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", + "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "one-time": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", + "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=", + "dev": true + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "openssl-wrapper": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/openssl-wrapper/-/openssl-wrapper-0.3.4.tgz", + "integrity": "sha1-wB7Jjk3NK13+C2k/MYJyAOO4Gwc=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=", + "dev": true + }, + "parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=", + "dev": true + }, + "parse-bmfont-xml": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", + "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", + "dev": true, + "requires": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.4.5" + } + }, + "parse-headers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==", + "dev": true + }, + "parse-listing": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz", + "integrity": "sha1-qlRvV/3BKc+/mUXNS3V7FLBhgt0=", + "dev": true + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "pem": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/pem/-/pem-1.14.4.tgz", + "integrity": "sha512-v8lH3NpirgiEmbOqhx0vwQTxwi0ExsiWBGYh0jYNq7K6mQuO4gI6UEFlr6fLAdv9TPXRt6GqiwE37puQdIDS8g==", + "dev": true, + "requires": { + "es6-promisify": "^6.0.0", + "md5": "^2.2.1", + "os-tmpdir": "^1.0.1", + "which": "^2.0.2" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "phin": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==", + "dev": true + }, + "pid-from-port": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pid-from-port/-/pid-from-port-1.1.3.tgz", + "integrity": "sha512-OlE82n3yMOE5dY9RMOwxhoWefeMlxwk5IVxoj0sSzSFIlmvhN4obzTvO3s/d/b5JhcgXikjaspsy/HuUDTqbBg==", + "dev": true, + "requires": { + "execa": "^0.9.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz", + "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", + "dev": true, + "requires": { + "pngjs": "^3.0.0" + } + }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "dev": true, + "requires": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + }, + "dependencies": { + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + } + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, + "pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "dev": true + }, + "portfinder": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", + "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + } + } + }, + "portscanner": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", + "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", + "dev": true, + "requires": { + "async": "^2.6.0", + "is-number-like": "^1.0.3" + } + }, + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", + "dev": true + }, + "process-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-exists/-/process-exists-4.0.0.tgz", + "integrity": "sha512-BnlcYPiZjSW+fye12g9B7UeCzMAOdMkxuTz3zcytJ2BHwYZf2RoKvuuwUcJLeXlGj58x9YQrvhT21PmKhUc4UQ==", + "dev": true, + "requires": { + "ps-list": "^6.3.0" + }, + "dependencies": { + "ps-list": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-6.3.0.tgz", + "integrity": "sha512-qau0czUSB0fzSlBOQt0bo+I2v6R+xiQdj78e1BR/Qjfl5OHWJ/urXi8+ilw1eHe+5hSeDI1wrwVTgDp2wst4oA==", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "ps-list": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-7.0.0.tgz", + "integrity": "sha512-ZDhdxqb+kE895BAvqIdGnWwfvB43h7KHMIcJC0hw7xLbbiJoprS+bqZxuGZ0jWdDxZEvB3jpnfgJyOn3lmsH+Q==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regenerator-runtime": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz", + "integrity": "sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g==", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-promise": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.5.tgz", + "integrity": "sha512-ZgnepCykFdmpq86fKGwqntyTiUrHycALuGggpyCZwMvGaZWgxW6yagT0FHkgo5LzYvOaCNvxYwWYIjevSH1EDg==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resq": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resq/-/resq-1.7.1.tgz", + "integrity": "sha512-09u9Q5SAuJfAW5UoVAmvRtLvCOMaKP+djiixTXsZvPaojGKhuvc0Nfvp84U1rIfopJWEOXi5ywpCFwCk7mj8Xw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + } + } + }, + "rgb2hex": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.10.tgz", + "integrity": "sha512-vKz+kzolWbL3rke/xeTE2+6vHmZnNxGyDnaVW4OckntAIcc7DcZzWkQSfxMDwqHS8vhgySnIFyBUH7lIk6PxvQ==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rpc-websockets": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-4.6.1.tgz", + "integrity": "sha512-xyQC6+95hOFQJBuMRIYi2E3/ddKEMMKuql5Sd49r4578CcthP0N9nHHFkVtvrsAgz4OQH6j7zsLurLNY0nOU6g==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.5", + "assert-args": "^1.2.1", + "babel-runtime": "^6.26.0", + "circular-json": "^0.5.9", + "eventemitter3": "^3.1.2", + "uuid": "^3.3.2", + "ws": "^5.2.2" + }, + "dependencies": { + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "safari-launcher": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/safari-launcher/-/safari-launcher-2.0.5.tgz", + "integrity": "sha1-pO/6nqUS0dVB5HuAOdhScBXyre0=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz", + "integrity": "sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA==", + "dev": true, + "requires": { + "type-fest": "^0.8.0" + } + }, + "serve-favicon": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", + "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", + "dev": true, + "requires": { + "etag": "~1.8.1", + "fresh": "0.5.2", + "ms": "2.1.1", + "parseurl": "~1.3.2", + "safe-buffer": "5.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "shared-preferences-builder": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/shared-preferences-builder/-/shared-preferences-builder-0.0.4.tgz", + "integrity": "sha512-6yy1O1zVAY8HWVjsaJzFzkmvmktlSvqnjsYZpWJ0dUrFS5Rfn1a8P7h+7zyl9MTqUfSXeaE7De6Yymx3OszxlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.4", + "xmlbuilder": "^9.0.1" + }, + "dependencies": { + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + } + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", + "dev": true + }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, + "stream-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-equal/-/stream-equal-1.1.1.tgz", + "integrity": "sha512-SaZxkvxujYBR6NTumhRTg/yztw2p30fzZ/jvSgQtlZFEGI7tdSNDaPbvT47QF92hx6Tar8hAhpr7ErpTNvtuCQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, + "taskkill": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/taskkill/-/taskkill-3.1.0.tgz", + "integrity": "sha512-5KcOFzPvd1nGFVrmB7H4+QAWVjYOf//+QTbOj0GpXbqtqbKGWVczG+rq6VhXAtdtlKLTs16NAmHRyF5vbggQ2w==", + "dev": true, + "requires": { + "arrify": "^2.0.1", + "execa": "^3.3.0" + }, + "dependencies": { + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + } + } + }, + "teen_process": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-1.15.0.tgz", + "integrity": "sha512-E8DdTeffAselFMtcE56jNiof7jt+X+KJPpCn4xvbLFy0YVAT24Y9O5jSIzOFfAKIAirKkK0M9YfmQfmxmUdgGA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "bluebird": "^3.5.1", + "lodash": "^4.17.4", + "shell-quote": "^1.4.3", + "source-map-support": "^0.5.3" + } + }, + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timm": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/timm/-/timm-1.6.2.tgz", + "integrity": "sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw==", + "dev": true + }, + "tinycolor2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", + "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=", + "dev": true + }, + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==", + "dev": true + }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "dev": true, + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "utf7": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utf7/-/utf7-1.0.2.tgz", + "integrity": "sha1-lV9JCq5lO6IguUVqCod2wZk2CZE=", + "dev": true, + "requires": { + "semver": "~5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "dev": true + }, + "utif": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", + "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", + "dev": true, + "requires": { + "pako": "^1.0.5" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "uuid-js": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/uuid-js/-/uuid-js-0.7.5.tgz", + "integrity": "sha1-bIhtAqU9LUDc8l2RoXC0p7JblNA=", + "dev": true + }, + "validate.js": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.13.1.tgz", + "integrity": "sha512-PnFM3xiZ+kYmLyTiMgTYmU7ZHkjBZz2/+F0DaALc/uUtVzdCt1wAosvYJ5hFQi/hz8O4zb52FQhHZRC+uVkJ+g==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "walkdir": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", + "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", + "dev": true + }, + "webdriver": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-5.19.0.tgz", + "integrity": "sha512-lPHhLqySiwEQr61R+/UD4KjImCxPEQTgipU5nIFUJFJxo97dIBolTHpXVcGazsrQc3nSPjiHY9CrKjuxl2MjCQ==", + "dev": true, + "requires": { + "@wdio/config": "5.18.4", + "@wdio/logger": "5.16.10", + "@wdio/protocols": "5.19.0", + "@wdio/utils": "5.18.6", + "lodash.merge": "^4.6.1", + "request": "^2.83.0" + } + }, + "webdriverio": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-5.19.0.tgz", + "integrity": "sha512-0HFKkE9RqfTGlJbZ2XyxpHDH+Seya5x9wHs8USL5PSrxxnEljcrVc6qya85o6zFlcTgGzC5WM6UDycXkfa1cLg==", + "dev": true, + "requires": { + "@wdio/config": "5.18.4", + "@wdio/logger": "5.16.10", + "@wdio/repl": "5.18.6", + "@wdio/utils": "5.18.6", + "archiver": "^3.0.0", + "css-value": "^0.0.1", + "grapheme-splitter": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "lodash.isobject": "^3.0.2", + "lodash.isplainobject": "^4.0.6", + "lodash.zip": "^4.2.0", + "resq": "^1.6.0", + "rgb2hex": "^0.1.0", + "serialize-error": "^5.0.0", + "webdriver": "5.19.0" + }, + "dependencies": { + "archiver": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", + "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^2.6.3", + "buffer-crc32": "^0.2.1", + "glob": "^7.1.4", + "readable-stream": "^3.4.0", + "tar-stream": "^2.1.0", + "zip-stream": "^2.1.2" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "bl": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.1.tgz", + "integrity": "sha512-FL/TdvchukRCuWVxT0YMO/7+L5TNeNrVFvRU2IY63aUyv9mpt8splf2NEr6qXtPo5fya5a66YohQKvGNmLrWNA==", + "dev": true, + "requires": { + "readable-stream": "^3.4.0" + } + }, + "compress-commons": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", + "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^3.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + } + } + }, + "crc32-stream": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", + "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", + "dev": true, + "requires": { + "crc": "^3.4.4", + "readable-stream": "^3.4.0" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "dev": true, + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "zip-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.3.tgz", + "integrity": "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^2.1.1", + "readable-stream": "^3.4.0" + } + } + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "winston": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", + "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", + "dev": true, + "requires": { + "async": "^2.6.1", + "diagnostics": "^1.1.1", + "is-stream": "^1.1.0", + "logform": "^2.1.1", + "one-time": "0.0.4", + "readable-stream": "^3.1.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.3.0" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "winston-transport": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", + "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", + "dev": true, + "requires": { + "readable-stream": "^2.3.6", + "triple-beam": "^1.2.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "dev": true + }, + "xhr": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", + "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "dev": true, + "requires": { + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", + "dev": true + }, + "xpath": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz", + "integrity": "sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", + "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "yargs-parser": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.0.tgz", + "integrity": "sha512-o/Jr6JBOv6Yx3pL+5naWSoIA2jJ+ZkMYQG/ie9qFbukBe4uzmBatlXFOiu/tNKRWEtyf+n5w7jc/O16ufqOTdQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "dev": true, + "requires": { + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "archiver": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", + "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "async": "^2.6.3", + "buffer-crc32": "^0.2.1", + "glob": "^7.1.4", + "readable-stream": "^3.4.0", + "tar-stream": "^2.1.0", + "zip-stream": "^2.1.2" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "dev": true, + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + } + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + } + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-differ": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", + "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-iterate": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.2.tgz", + "integrity": "sha512-1hWSHTIlG/8wtYD+PPX5AOBtKWngpDFjrsrHgZpe+JdgNGz0udYu6ZIkAa/xuenIUEqFv7DvE2Yr60jxweJSrQ==", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "array.prototype.find": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz", + "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.13.0" + }, + "dependencies": { + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "es-abstract": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.15.0.tgz", + "integrity": "sha512-bhkEqWJ2t2lMeaJDuk7okMkJWI/yqgH/EoGwpcvv0XW9RWQsRspI4wt6xuyuvMvvQE3gg/D9HXppgk21w78GyQ==", + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + } + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "requires": { + "has-symbols": "^1.0.0" + } + } + } + }, + "array.prototype.flat": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.1.tgz", + "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1" + } + }, + "array.prototype.flatmap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz", + "integrity": "sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1" + }, + "dependencies": { + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + } + } + }, + "array.prototype.map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz", + "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.4" + }, + "dependencies": { + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + } + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "art": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/art/-/art-0.10.3.tgz", + "integrity": "sha512-HXwbdofRTiJT6qZX/FnchtldzJjS3vkLJxQilc3Xj+ma2MXjY4UAyQ0ls1XZYVnDvVIBiFZbC6QsvtW86TD6tQ==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "ast-types": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.12.4.tgz", + "integrity": "sha512-ky/YVYCbtVAS8TdMIaTiPFHwEpRB5z1hctepJplTr3UW5q8TDrpIMCILyk8pmLxGtn2KCtC/lSn7zOsaI7nzDw==", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" }, "async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, "requires": { "lodash": "^4.17.10" } @@ -12499,8 +19898,7 @@ "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", - "dev": true + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" }, "asynckit": { "version": "0.4.0", @@ -12785,27 +20183,41 @@ }, "dependencies": { "@jest/transform": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.3.0.tgz", - "integrity": "sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz", + "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "babel-plugin-istanbul": "^6.0.0", "chalk": "^3.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.3.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", "jest-regex-util": "^25.2.6", - "jest-util": "^25.3.0", + "jest-util": "^25.5.0", "micromatch": "^4.0.2", "pirates": "^4.0.1", "realpath-native": "^2.0.0", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + } } }, "ansi-styles": { @@ -12885,16 +20297,16 @@ } }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, "optional": true }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "has-flag": { @@ -12910,23 +20322,38 @@ "dev": true }, "jest-haste-map": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz", - "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz", + "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", + "@types/graceful-fs": "^4.1.2", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.2.6", - "jest-util": "^25.3.0", - "jest-worker": "^25.2.6", + "graceful-fs": "^4.2.4", + "jest-serializer": "^25.5.0", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7", "which": "^2.0.2" + }, + "dependencies": { + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + } } }, "jest-regex-util": { @@ -12936,27 +20363,45 @@ "dev": true }, "jest-serializer": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", - "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", - "dev": true + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz", + "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4" + } }, "jest-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", - "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + } } }, "jest-worker": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", - "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", "dev": true, "requires": { "merge-stream": "^2.0.0", @@ -13249,7 +20694,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", - "dev": true, "requires": { "object.assign": "^4.1.0" } @@ -13497,11 +20941,13 @@ } }, "babel-plugin-jest-hoist": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz", - "integrity": "sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz", + "integrity": "sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==", "dev": true, "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", "@types/babel__traverse": "^7.0.6" } }, @@ -13724,8 +21170,7 @@ "babel-plugin-syntax-trailing-function-commas": { "version": "7.0.0-beta.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", - "dev": true + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" }, "babel-plugin-transform-inline-consecutive-adds": { "version": "0.4.3", @@ -13821,7 +21266,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz", "integrity": "sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw==", - "dev": true, "requires": { "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-object-rest-spread": "^7.0.0", @@ -13853,12 +21297,12 @@ } }, "babel-preset-jest": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.3.0.tgz", - "integrity": "sha512-tjdvLKNMwDI9r+QWz9sZUQGTq1dpoxjUqFUpEasAc7MOtHg9XuLT2fx0udFG+k1nvMV0WvHHVAN7VmCZ+1Zxbw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz", + "integrity": "sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^25.2.6", + "babel-plugin-jest-hoist": "^25.5.0", "babel-preset-current-node-syntax": "^0.1.2" } }, @@ -14013,7 +21457,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, "requires": { "safe-buffer": "5.1.2" } @@ -14073,8 +21516,7 @@ "big-integer": { "version": "1.6.48", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", - "dev": true + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" }, "big.js": { "version": "3.2.0", @@ -14232,8 +21674,7 @@ "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" }, "boxen": { "version": "4.2.0", @@ -14357,7 +21798,6 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", - "dev": true, "requires": { "stream-buffers": "~2.2.0" } @@ -14366,7 +21806,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, "requires": { "big-integer": "^1.6.44" } @@ -14513,35 +21952,33 @@ } }, "browserslist": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.9.1.tgz", - "integrity": "sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.0.tgz", + "integrity": "sha512-pUsXKAF2lVwhmtpeA3LJrZ76jXuusrNyhduuQs7CDFf9foT4Y38aQOserd2lMe5DSSrjf3fx34oHwryuvxAUgQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001030", - "electron-to-chromium": "^1.3.363", - "node-releases": "^1.1.50" + "caniuse-lite": "^1.0.30001111", + "electron-to-chromium": "^1.3.523", + "escalade": "^3.0.2", + "node-releases": "^1.1.60" }, "dependencies": { "caniuse-lite": { - "version": "1.0.30001032", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001032.tgz", - "integrity": "sha512-8joOm7BwcpEN4BfVHtfh0hBXSAPVYk+eUIcNntGtMkUWy/6AKRCDZINCLe3kB1vHhT2vBxBF85Hh9VlPXi/qjA==", + "version": "1.0.30001117", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001117.tgz", + "integrity": "sha512-4tY0Fatzdx59kYjQs+bNxUwZB03ZEBgVmJ1UkFPz/Q8OLiUUbjct2EdpnXj0fvFTPej2EkbPIG0w8BWsjAyk1Q==", "dev": true }, - "node-releases": { - "version": "1.1.51", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.51.tgz", - "integrity": "sha512-1eQEs6HFYY1kMXQPOLzCf7HdjReErmvn85tZESMczdCNVWP3Y7URYLBAyYynuI7yef1zj4HN5q+oB2x67QU0lw==", - "dev": true, - "requires": { - "semver": "^6.3.0" - } + "electron-to-chromium": { + "version": "1.3.544", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.544.tgz", + "integrity": "sha512-jx6H7M1db76Q/dI3MadZC4qwNTvpiq8tdYEJswxexrIm5bH+LKRdg+VAteMF1tJJbBLrcuogE9N3nxT3Dp1gag==", + "dev": true }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node-releases": { + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==", "dev": true } } @@ -14590,8 +22027,7 @@ "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, "buffer-fill": { "version": "1.0.0", @@ -14602,8 +22038,7 @@ "buffer-from": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" }, "buffer-xor": { "version": "1.0.3", @@ -14614,8 +22049,7 @@ "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "builtin-status-codes": { "version": "3.0.0", @@ -14785,7 +22219,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, "requires": { "callsites": "^2.0.0" }, @@ -14793,8 +22226,7 @@ "callsites": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" } } }, @@ -14802,7 +22234,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, "requires": { "caller-callsite": "^2.0.0" } @@ -14831,8 +22262,7 @@ "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "camelcase-css": { "version": "2.0.1", @@ -14968,6 +22398,12 @@ } } }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, "character-entities": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz", @@ -15275,7 +22711,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, "requires": { "restore-cursor": "^2.0.0" } @@ -15283,8 +22718,7 @@ "cli-spinners": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", - "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==", - "dev": true + "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==" }, "cli-table3": { "version": "0.5.1", @@ -15356,8 +22790,7 @@ "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" }, "clipboard": { "version": "2.0.1", @@ -15373,7 +22806,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", @@ -15383,8 +22815,7 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" }, "clone-deep": { "version": "4.0.1", @@ -15464,8 +22895,7 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "collapse-white-space": { "version": "1.0.4", @@ -15488,6 +22918,15 @@ "object-visit": "^1.0.0" } }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, "color-convert": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", @@ -15501,17 +22940,24 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, "colorette": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", - "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==", - "dev": true + "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==" }, "colors": { "version": "0.5.1", @@ -15564,8 +23010,7 @@ "command-exists": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz", - "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==", - "dev": true + "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw==" }, "commander": { "version": "4.1.0", @@ -15574,16 +23019,15 @@ "dev": true }, "comment-parser": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.5.tgz", - "integrity": "sha512-iH9YA35ccw94nx5244GVkpyC9eVTsL71jZz6iz5w6RIf79JLF2AsXHXq9p6Oaohyl3sx5qSMnGsWUDFIAfWL4w==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.6.tgz", + "integrity": "sha512-GKNxVA7/iuTnAqGADlTWX4tkhzxZKXp5fLJqKTlQLHkE65XDUKutZ3BHaJC5IGcper2tT3QRD1xr4o3jNpgXXg==", "dev": true }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "compare-func": { "version": "1.3.2", @@ -15611,11 +23055,30 @@ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, + "compress-commons": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", + "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^3.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } + }, "compressible": { "version": "2.0.17", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", - "dev": true, "requires": { "mime-db": ">= 1.40.0 < 2" }, @@ -15623,8 +23086,7 @@ "mime-db": { "version": "1.42.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", - "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", - "dev": true + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" } } }, @@ -15632,7 +23094,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, "requires": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -15646,14 +23107,12 @@ "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -15661,9 +23120,9 @@ } }, "compute-scroll-into-view": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.11.tgz", - "integrity": "sha512-uUnglJowSe0IPmWOdDtrlHXof5CTIJitfJEyITHBW6zDVOGu9Pjk5puaLM73SLcwak0L4hEjO7Td88/a6P5i7A==" + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.13.tgz", + "integrity": "sha512-o+w9w7A98aAFi/GjK8cxSV+CdASuPa2rR5UWs3+yHkJzWqaKoBEufFNWYaXInCSmUfDCVhesG+v9MTWqOjsxFg==" }, "computed-style": { "version": "0.1.4", @@ -15679,7 +23138,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -15791,7 +23249,6 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, "requires": { "debug": "2.6.9", "finalhandler": "1.1.2", @@ -15803,7 +23260,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -15811,8 +23267,7 @@ "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "statuses": { "version": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -15829,8 +23284,7 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "consolidated-events": { "version": "2.0.2", @@ -16500,7 +23954,6 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.5.tgz", "integrity": "sha512-94j37OtvxS5w7qr7Ta6dt67tWdnOxigBVN4VnSxNXFez9o18PGQ0D33SchKP17r9LAcWVTYV72G6vDayAUBFIg==", - "dev": true, "requires": { "is-directory": "^0.3.1", "js-yaml": "^3.9.0", @@ -16511,7 +23964,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -16519,6 +23971,50 @@ } } }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "requires": { + "buffer": "^5.1.0" + }, + "dependencies": { + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + } + } + }, + "crc32-stream": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", + "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", + "dev": true, + "requires": { + "crc": "^3.4.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "create-ecdh": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", @@ -16560,7 +24056,6 @@ "version": "15.6.3", "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", - "dev": true, "requires": { "fbjs": "^0.8.9", "loose-envify": "^1.3.1", @@ -16591,7 +24086,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, "requires": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", @@ -16621,7 +24115,6 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, "requires": { "inherits": "^2.0.3", "source-map": "^0.6.1", @@ -16632,8 +24125,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -16852,6 +24344,16 @@ "postcss-value-parser": "^3.3.0" } }, + "css-to-react-native-transform": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/css-to-react-native-transform/-/css-to-react-native-transform-1.9.0.tgz", + "integrity": "sha512-darzotx5xx+Q0bzASkvNBasztLCssNerzf9jpMZx0H4CTY6J/y2Wh50ZtYAJ3FmESEux1bJcGa6T0zfISTuFqw==", + "requires": { + "css": "^2.2.4", + "css-mediaquery": "^0.1.2", + "css-to-react-native": "^2.3.0" + } + }, "css-tree": { "version": "1.0.0-alpha.28", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", @@ -17073,8 +24575,7 @@ "dayjs": { "version": "1.8.18", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.18.tgz", - "integrity": "sha512-JBMJZghNK8TtuoPnKNIzW9xavVVigld/zmZNpZSyQbkb2Opp55YIfZUpE4OEqPF/iyUVQTKcn1bC2HtC8B7s3g==", - "dev": true + "integrity": "sha512-JBMJZghNK8TtuoPnKNIzW9xavVVigld/zmZNpZSyQbkb2Opp55YIfZUpE4OEqPF/iyUVQTKcn1bC2HtC8B7s3g==" }, "de-indent": { "version": "1.0.2", @@ -17174,8 +24675,7 @@ "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "deep-freeze": { "version": "0.0.1", @@ -17204,7 +24704,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, "requires": { "clone": "^1.0.2" } @@ -17432,14 +24931,12 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "denodeify": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=" }, "depd": { "version": "1.1.2", @@ -17490,8 +24987,7 @@ "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, "detect-newline": { "version": "3.1.0", @@ -17536,6 +25032,11 @@ "wrappy": "1" } }, + "didyoumean": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", + "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=" + }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -17626,7 +25127,6 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "dev": true, "requires": { "@babel/runtime": "^7.1.2" } @@ -17640,7 +25140,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, "requires": { "domelementtype": "~1.1.1", "entities": "~1.1.1" @@ -17649,8 +25148,7 @@ "domelementtype": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" } } }, @@ -17684,7 +25182,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dev": true, "requires": { "domelementtype": "1" } @@ -17693,7 +25190,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, "requires": { "dom-serializer": "0", "domelementtype": "1" @@ -17744,20 +25240,20 @@ "integrity": "sha1-9p+W+UDg0FU9rCkROYZaPNAQHjw=" }, "downshift": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/downshift/-/downshift-4.0.7.tgz", - "integrity": "sha512-w6KFbpnMZrO53Lcbh21lRTSokEvz+FCdv7fAtN8+Oxvst+qUTIy/2FQCX6AQUncRb/gOqG4aBqm2fGgbsmAiGg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/downshift/-/downshift-5.4.0.tgz", + "integrity": "sha512-r3ikikP6H/2c+WSWcP/1nOwBSXwmyiuH3LeEmsjKumWjqd+FAazNUIa/ox2VA+qQ86JuaAIaA4xw79G3Sz/XMA==", "requires": { - "@babel/runtime": "^7.4.5", - "compute-scroll-into-view": "^1.0.9", + "@babel/runtime": "^7.9.1", + "compute-scroll-into-view": "^1.0.13", "prop-types": "^15.7.2", - "react-is": "^16.9.0" + "react-is": "^16.13.1" }, "dependencies": { "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" } } }, @@ -17939,8 +25435,7 @@ "envinfo": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.0.tgz", - "integrity": "sha512-jDgnJaF/Btomk+m3PZDTTCb5XIIIX3zYItnCRfF73zVgvinLoRomuhi75Y4su0PtQxWz4v66XnLLckyvyJTOIQ==", - "dev": true + "integrity": "sha512-jDgnJaF/Btomk+m3PZDTTCb5XIIIX3zYItnCRfF73zVgvinLoRomuhi75Y4su0PtQxWz4v66XnLLckyvyJTOIQ==" }, "enzyme": { "version": "3.11.0", @@ -18697,7 +26192,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", - "dev": true, "requires": { "accepts": "~1.3.7", "escape-html": "~1.0.3" @@ -18707,7 +26201,6 @@ "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, "requires": { "mime-types": "~2.1.24", "negotiator": "0.6.2" @@ -18716,14 +26209,12 @@ "mime-db": { "version": "1.42.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", - "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", - "dev": true + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" }, "mime-types": { "version": "2.1.25", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", - "dev": true, "requires": { "mime-db": "1.42.0" } @@ -18731,8 +26222,7 @@ "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" } } }, @@ -18917,6 +26407,12 @@ "integrity": "sha512-E9kK/bjtCQRpN1K28Xh4BlmP8egvZBGJJ+9GtnzOwt7mdqtrjHFuVGr7QJfdjBIKqrlU5duPf3pCBoDrkjVYFg==", "dev": true }, + "escalade": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", + "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -19557,17 +27053,17 @@ } }, "eslint-plugin-jsdoc": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-26.0.0.tgz", - "integrity": "sha512-/oEywHPBn6eVDExTgDTwdwyQlVIuJziovXOPXBROW8yW93vk6/IGezW5jbzmA2pX4tVRCQc/jz5/mZea+FCmfw==", + "version": "30.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.2.2.tgz", + "integrity": "sha512-588zVyRy+g7s8VU3D0AL75r7xBYN0UX6tZEwP5EQ4JvpVavwu2iPJRaBxwuG3QAj99WZkUBlrLU16p4qST6vSw==", "dev": true, "requires": { - "comment-parser": "^0.7.4", + "comment-parser": "^0.7.5", "debug": "^4.1.1", - "jsdoctypeparser": "^6.1.0", - "lodash": "^4.17.15", + "jsdoctypeparser": "^9.0.0", + "lodash": "^4.17.19", "regextras": "^0.7.1", - "semver": "^6.3.0", + "semver": "^7.3.2", "spdx-expression-parse": "^3.0.1" }, "dependencies": { @@ -19586,12 +27082,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", @@ -20010,14 +27500,17 @@ "event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "eventemitter2": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-1.0.5.tgz", + "integrity": "sha1-+YNhBRexc3wLncZDvsqTiTwE3xg=" }, "eventemitter3": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", - "dev": true + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" }, "events": { "version": "3.1.0", @@ -20229,19 +27722,37 @@ } }, "expect": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.3.0.tgz", - "integrity": "sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.5.0.tgz", + "integrity": "sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "ansi-styles": "^4.0.0", "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.3.0", - "jest-message-util": "^25.3.0", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", "jest-regex-util": "^25.2.6" }, "dependencies": { + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", @@ -20295,6 +27806,12 @@ "to-regex-range": "^5.0.1" } }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -20307,39 +27824,50 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } + }, "jest-get-type": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", "dev": true }, + "jest-matcher-utils": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", + "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "jest-diff": "^25.5.0", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } + }, "jest-message-util": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.4.0.tgz", - "integrity": "sha512-LYY9hRcVGgMeMwmdfh9tTjeux1OjZHMusq/E5f3tJN+dAoVVkJtq5ZUEPIcB7bpxDUt2zjUsrwg0EGgPQ+OhXQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" - }, - "dependencies": { - "@jest/types": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.4.0.tgz", - "integrity": "sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - } } }, "jest-regex-util": { @@ -20358,6 +27886,24 @@ "picomatch": "^2.0.5" } }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -20705,7 +28251,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, "requires": { "ansi-gray": "^0.1.1", "color-support": "^1.1.3", @@ -20718,6 +28263,11 @@ "resolved": "https://registry.npmjs.org/fast-average-color/-/fast-average-color-4.3.0.tgz", "integrity": "sha512-k8FXd6+JeXoItmdNqB3hMwFgArryjdYBLuzEM8fRY/oztd/051yhSHU6GUrMOfIQU9dDHyFDcIAkGrQKlYtpDA==" }, + "fast-base64-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", + "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==" + }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -20747,7 +28297,8 @@ "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -20819,14 +28370,12 @@ "fbjs-css-vars": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", - "dev": true + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" }, "fbjs-scripts": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz", "integrity": "sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ==", - "dev": true, "requires": { "@babel/core": "^7.0.0", "ansi-colors": "^1.0.1", @@ -20843,14 +28392,12 @@ "core-js": { "version": "2.6.11", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -20873,7 +28420,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } @@ -21037,7 +28583,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -21052,7 +28597,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -21060,14 +28604,12 @@ "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" } } }, @@ -21172,11 +28714,33 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, "requires": { "locate-path": "^2.0.0" } }, + "find-yarn-workspace-root": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz", + "integrity": "sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==", + "dev": true, + "requires": { + "fs-extra": "^4.0.3", + "micromatch": "^3.1.4" + }, + "dependencies": { + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, "findup": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/findup/-/findup-0.1.5.tgz", @@ -21463,7 +29027,6 @@ "version": "1.2.6", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", - "dev": true, "requires": { "minipass": "^2.2.1" } @@ -21489,7 +29052,6 @@ "version": "1.2.9", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, "optional": true, "requires": { "nan": "^2.12.1", @@ -21500,14 +29062,12 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "dev": true, "optional": true }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "optional": true, "requires": { "fs.realpath": "^1.0.0", @@ -21522,7 +29082,6 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, "optional": true, "requires": { "safe-buffer": "^5.1.2", @@ -21533,7 +29092,6 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", @@ -21552,7 +29110,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "optional": true, "requires": { "glob": "^7.1.3" @@ -21564,7 +29121,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, "optional": true, "requires": { "abbrev": "1", @@ -21575,14 +29131,12 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, "optional": true }, "tar": { "version": "4.4.13", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, "optional": true, "requires": { "chownr": "^1.1.1", @@ -21598,7 +29152,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, "optional": true } } @@ -21677,7 +29230,6 @@ "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -21692,14 +29244,12 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -21708,7 +29258,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -21719,7 +29268,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -21749,8 +29297,7 @@ "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, "get-own-enumerable-property-symbols": { "version": "3.0.0", @@ -21860,10 +29407,25 @@ "dev": true }, "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } }, "get-value": { "version": "2.0.6", @@ -22129,7 +29691,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -22448,8 +30009,7 @@ "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, "gud": { "version": "1.0.0", @@ -22561,8 +30121,7 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "has-value": { "version": "1.0.0", @@ -22727,8 +30286,7 @@ "hermes-engine": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/hermes-engine/-/hermes-engine-0.2.1.tgz", - "integrity": "sha512-eNHUQHuadDMJARpaqvlCZoK/Nitpj6oywq3vQ3wCwEsww5morX34mW5PmKWQTO7aU0ck0hgulxR+EVDlXygGxQ==", - "dev": true + "integrity": "sha512-eNHUQHuadDMJARpaqvlCZoK/Nitpj6oywq3vQ3wCwEsww5morX34mW5PmKWQTO7aU0ck0hgulxR+EVDlXygGxQ==" }, "hex-color-regex": { "version": "1.1.0", @@ -22776,8 +30334,7 @@ "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" }, "hpq": { "version": "1.3.0", @@ -22921,6 +30478,20 @@ "readable-stream": "^2.0.2" } }, + "htmlparser2-without-node-native": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2-without-node-native/-/htmlparser2-without-node-native-3.9.2.tgz", + "integrity": "sha1-s+0FDYd9D/NGWWnjOYd7f59mMfY=", + "requires": { + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "eventemitter2": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, "http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", @@ -22931,7 +30502,6 @@ "version": "1.6.3", "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -22985,7 +30555,8 @@ "human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true }, "humanize-ms": { "version": "1.2.1", @@ -23336,7 +30907,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, "requires": { "minimatch": "^3.0.4" } @@ -23344,8 +30914,7 @@ "image-size": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", - "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==", - "dev": true + "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==" }, "immediate": { "version": "3.0.6", @@ -23508,8 +31077,7 @@ "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "init-package-json": { "version": "1.10.3", @@ -23880,7 +31448,6 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, "requires": { "loose-envify": "^1.0.0" } @@ -23888,8 +31455,7 @@ "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ip": { "version": "1.1.5", @@ -23996,7 +31562,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, "requires": { "builtin-modules": "^1.0.0" } @@ -24077,8 +31642,14 @@ "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "dev": true, + "optional": true }, "is-expression": { "version": "3.0.0", @@ -24340,7 +31911,8 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, "is-url-superb": { "version": "3.0.0", @@ -24377,8 +31949,7 @@ "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "isarray": { "version": "1.0.0", @@ -24402,6 +31973,17 @@ "requires": { "node-fetch": "^1.0.1", "whatwg-fetch": ">=0.10.0" + }, + "dependencies": { + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + } } }, "isstream": { @@ -24413,12 +31995,14 @@ "istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true }, "istanbul-lib-instrument": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", + "dev": true, "requires": { "@babel/core": "^7.7.5", "@babel/parser": "^7.7.5", @@ -24432,7 +32016,8 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -24524,6 +32109,11 @@ "iterate-iterator": "^1.0.1" } }, + "jed": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jed/-/jed-1.1.1.tgz", + "integrity": "sha1-elSbvZ/+FYWwzQoZHiAwVb7ldLQ=" + }, "jest": { "version": "25.3.0", "resolved": "https://registry.npmjs.org/jest/-/jest-25.3.0.tgz", @@ -24536,108 +32126,63 @@ }, "dependencies": { "@jest/console": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz", - "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", + "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", "dev": true, "requires": { - "@jest/source-map": "^25.2.6", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", - "jest-util": "^25.3.0", + "jest-message-util": "^25.5.0", + "jest-util": "^25.5.0", "slash": "^3.0.0" } }, - "@jest/source-map": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", - "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, "@jest/test-result": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz", - "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", + "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", "dev": true, "requires": { - "@jest/console": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/console": "^25.5.0", + "@jest/types": "^25.5.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, - "@jest/transform": { - "version": "https://registry.npmjs.org/@jest/transform/-/transform-25.3.0.tgz", - "integrity": "sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg==", - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^25.3.0", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^3.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.3.0", - "jest-regex-util": "^25.2.6", - "jest-util": "^25.3.0", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "realpath-native": "^2.0.0", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - } - }, - "ansi-escapes": { - "version": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, "requires": { - "type-fest": "^0.11.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" } }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "babel-plugin-istanbul": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", - "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^4.0.0", - "test-exclude": "^6.0.0" - } - }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -24652,6 +32197,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -24672,6 +32218,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -24679,17 +32226,8 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "cross-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", - "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "emoji-regex": { "version": "8.0.0", @@ -24697,26 +32235,11 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "execa": { - "version": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -24731,47 +32254,23 @@ "path-exists": "^4.0.0" } }, - "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "optional": true - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "import-local": { "version": "3.0.2", @@ -24792,100 +32291,86 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "jest-cli": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.3.0.tgz", - "integrity": "sha512-XpNQPlW1tzpP7RGG8dxpkRegYDuLjzSiENu92+CYM87nEbmEPb3b4+yo8xcsHOnj0AG7DUt9b3uG8LuHI3MDzw==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.5.4.tgz", + "integrity": "sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw==", "dev": true, "requires": { - "@jest/core": "^25.3.0", - "@jest/test-result": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/core": "^25.5.4", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "exit": "^0.1.2", + "graceful-fs": "^4.2.4", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^25.3.0", - "jest-util": "^25.3.0", - "jest-validate": "^25.3.0", + "jest-config": "^25.5.4", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", "prompts": "^2.0.1", "realpath-native": "^2.0.0", "yargs": "^15.3.1" } }, "jest-get-type": { - "version": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==" - }, - "jest-haste-map": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz", - "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==", - "requires": { - "@jest/types": "^25.3.0", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.2.6", - "jest-util": "^25.3.0", - "jest-worker": "^25.2.6", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7", - "which": "^2.0.2" - } + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true }, "jest-message-util": { - "version": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz", - "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", + "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" } }, - "jest-regex-util": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", - "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==" - }, - "jest-serializer": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", - "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==" - }, "jest-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", - "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", + "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" } }, - "jest-worker": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", - "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", + "jest-validate": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.5.0.tgz", + "integrity": "sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==", + "dev": true, "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" + "@jest/types": "^25.5.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "leven": "^3.1.0", + "pretty-format": "^25.5.0" } }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -24895,51 +32380,16 @@ "p-locate": "^4.1.0" } }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, "requires": { "braces": "^3.0.1", "picomatch": "^2.0.5" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -24970,16 +32420,6 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -24990,33 +32430,28 @@ } }, "pretty-format": { - "version": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true }, "realpath-native": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", - "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==" + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", + "dev": true }, "require-main-filename": { "version": "2.0.0", @@ -25024,13 +32459,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "resolve": { - "version": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "requires": { - "path-parse": "^1.0.6" - } - }, "resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", @@ -25046,32 +32474,11 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true }, "string-width": { "version": "4.2.0", @@ -25097,35 +32504,20 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "requires": { "has-flag": "^4.0.0" } }, - "throat": { - "version": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "requires": { "is-number": "^7.0.0" } }, - "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -25137,17 +32529,6 @@ "strip-ansi": "^6.0.0" } }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", @@ -25174,9 +32555,9 @@ } }, "yargs-parser": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", - "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -25186,16 +32567,63 @@ } }, "jest-changed-files": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.3.0.tgz", - "integrity": "sha512-eqd5hyLbUjIVvLlJ3vQ/MoPxsxfESVXG9gvU19XXjKzxr+dXmZIqCXiY0OiYaibwlHZBJl2Vebkc0ADEMzCXew==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.5.0.tgz", + "integrity": "sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "execa": "^3.2.0", "throat": "^5.0.0" }, "dependencies": { + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "cross-spawn": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", @@ -25225,14 +32653,11 @@ "strip-final-newline": "^2.0.0" } }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "is-stream": { "version": "2.0.0", @@ -25274,23 +32699,13 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true }, "shebang-command": { "version": "2.0.0", @@ -25307,6 +32722,15 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, "throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", @@ -25325,31 +32749,68 @@ } }, "jest-config": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.3.0.tgz", - "integrity": "sha512-CmF1JnNWFmoCSPC4tnU52wnVBpuxHjilA40qH/03IHxIevkjUInSMwaDeE6ACfxMPTLidBGBCO3EbxvzPbo8wA==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.5.4.tgz", + "integrity": "sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.3.0", - "@jest/types": "^25.3.0", - "babel-jest": "^25.3.0", + "@jest/test-sequencer": "^25.5.4", + "@jest/types": "^25.5.0", + "babel-jest": "^25.5.1", "chalk": "^3.0.0", "deepmerge": "^4.2.2", "glob": "^7.1.1", - "jest-environment-jsdom": "^25.3.0", - "jest-environment-node": "^25.3.0", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^25.5.0", + "jest-environment-node": "^25.5.0", "jest-get-type": "^25.2.6", - "jest-jasmine2": "^25.3.0", + "jest-jasmine2": "^25.5.4", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.3.0", - "jest-util": "^25.3.0", - "jest-validate": "^25.3.0", + "jest-resolve": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", "micromatch": "^4.0.2", - "pretty-format": "^25.3.0", + "pretty-format": "^25.5.0", "realpath-native": "^2.0.0" }, "dependencies": { + "@jest/transform": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz", + "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^25.5.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^3.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", + "jest-regex-util": "^25.2.6", + "jest-util": "^25.5.0", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "realpath-native": "^2.0.0", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + } + }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -25366,6 +32827,66 @@ "color-convert": "^2.0.1" } }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "babel-jest": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.5.1.tgz", + "integrity": "sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==", + "dev": true, + "requires": { + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^25.5.0", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.5.0.tgz", + "integrity": "sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==", + "dev": true, + "requires": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-jest": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz", + "integrity": "sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^25.5.0", + "babel-preset-current-node-syntax": "^0.1.2" + } + }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -25375,6 +32896,12 @@ "fill-range": "^7.0.1" } }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -25415,6 +32942,29 @@ "to-regex-range": "^5.0.1" } }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -25433,24 +32983,117 @@ "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", "dev": true }, + "jest-haste-map": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz", + "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "@types/graceful-fs": "^4.1.2", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.4", + "jest-serializer": "^25.5.0", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7", + "which": "^2.0.2" + } + }, "jest-regex-util": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", "dev": true }, + "jest-resolve": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.5.1.tgz", + "integrity": "sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "browser-resolve": "^1.11.3", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.1", + "read-pkg-up": "^7.0.1", + "realpath-native": "^2.0.0", + "resolve": "^1.17.0", + "slash": "^3.0.0" + } + }, + "jest-serializer": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz", + "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4" + } + }, "jest-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", - "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" } }, + "jest-validate": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.5.0.tgz", + "integrity": "sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "leven": "^3.1.0", + "pretty-format": "^25.5.0" + } + }, + "jest-worker": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -25461,18 +33104,79 @@ "picomatch": "^2.0.5" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true }, "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -25484,6 +33188,37 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, "realpath-native": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", @@ -25491,12 +33226,32 @@ "dev": true }, "resolve": { - "version": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, "requires": { "path-parse": "^1.0.6" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -25514,6 +33269,33 @@ "requires": { "is-number": "^7.0.0" } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } } } }, @@ -25706,18 +33488,30 @@ } }, "jest-each": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.3.0.tgz", - "integrity": "sha512-aBfS4VOf/Qs95yUlX6d6WBv0szvOcTkTTyCIaLuQGj4bSHsT+Wd9dDngVHrCe5uytxpN8VM+NAloI6nbPjXfXw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.5.0.tgz", + "integrity": "sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "jest-get-type": "^25.2.6", - "jest-util": "^25.3.0", - "pretty-format": "^25.3.0" + "jest-util": "^25.5.0", + "pretty-format": "^25.5.0" }, "dependencies": { + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -25759,6 +33553,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -25772,24 +33572,25 @@ "dev": true }, "jest-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", - "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" } }, "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -25838,32 +33639,228 @@ } }, "jest-environment-jsdom": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.3.0.tgz", - "integrity": "sha512-jdE4bQN+k2QEZ9sWOxsqDJvMzbdFSCN/4tw8X0TQaCqyzKz58PyEf41oIr4WO7ERdp7WaJGBSUKF7imR3UW1lg==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz", + "integrity": "sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A==", "dev": true, "requires": { - "@jest/environment": "^25.3.0", - "@jest/fake-timers": "^25.3.0", - "@jest/types": "^25.3.0", - "jest-mock": "^25.3.0", - "jest-util": "^25.3.0", + "@jest/environment": "^25.5.0", + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", "jsdom": "^15.2.1" }, "dependencies": { "@jest/fake-timers": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.3.0.tgz", - "integrity": "sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz", + "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==", "dev": true, "requires": { - "@jest/types": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-mock": "^25.3.0", - "jest-util": "^25.3.0", + "@jest/types": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", + "lolex": "^5.0.0" + } + }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-message-util": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.5.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", + "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0" + } + }, + "jest-util": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "make-dir": "^3.0.0" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "jest-environment-node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.5.0.tgz", + "integrity": "sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA==", + "dev": true, + "requires": { + "@jest/environment": "^25.5.0", + "@jest/fake-timers": "^25.5.0", + "@jest/types": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", + "semver": "^6.3.0" + }, + "dependencies": { + "@jest/fake-timers": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.5.0.tgz", + "integrity": "sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", + "jest-util": "^25.5.0", "lolex": "^5.0.0" } }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", @@ -25917,170 +33914,12 @@ "to-regex-range": "^5.0.1" } }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "jest-message-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz", - "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.3.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.3.0.tgz", - "integrity": "sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0" - } - }, - "jest-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", - "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "chalk": "^3.0.0", - "is-ci": "^2.0.0", - "make-dir": "^3.0.0" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "jest-environment-node": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.3.0.tgz", - "integrity": "sha512-XO09S29Nx1NU7TiMPHMoDIkxoGBuKSTbE+sHp0gXbeLDXhIdhysUI25kOqFFSD9AuDgvPvxWCXrvNqiFsOH33g==", - "dev": true, - "requires": { - "@jest/environment": "^25.3.0", - "@jest/fake-timers": "^25.3.0", - "@jest/types": "^25.3.0", - "jest-mock": "^25.3.0", - "jest-util": "^25.3.0", - "semver": "^6.3.0" - }, - "dependencies": { - "@jest/fake-timers": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.3.0.tgz", - "integrity": "sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-mock": "^25.3.0", - "jest-util": "^25.3.0", - "lolex": "^5.0.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -26094,37 +33933,39 @@ "dev": true }, "jest-message-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz", - "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" } }, "jest-mock": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.3.0.tgz", - "integrity": "sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", + "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", "dev": true, "requires": { - "@jest/types": "^25.3.0" + "@jest/types": "^25.5.0" } }, "jest-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", - "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" } @@ -26238,14 +34079,12 @@ "jest-get-type": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", - "dev": true + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==" }, "jest-haste-map": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, "requires": { "@jest/types": "^24.9.0", "anymatch": "^2.0.0", @@ -26265,7 +34104,6 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", @@ -26276,7 +34114,6 @@ "version": "13.0.8", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, "requires": { "@types/yargs-parser": "*" } @@ -26284,71 +34121,83 @@ "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" } } }, "jest-jasmine2": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.3.0.tgz", - "integrity": "sha512-NCYOGE6+HNzYFSui52SefgpsnIzvxjn6KAgqw66BdRp37xpMD/4kujDHLNW5bS5i53os5TcMn6jYrzQRO8VPrQ==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz", + "integrity": "sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.3.0", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/environment": "^25.5.0", + "@jest/source-map": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "co": "^4.6.0", - "expect": "^25.3.0", + "expect": "^25.5.0", "is-generator-fn": "^2.0.0", - "jest-each": "^25.3.0", - "jest-matcher-utils": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-runtime": "^25.3.0", - "jest-snapshot": "^25.3.0", - "jest-util": "^25.3.0", - "pretty-format": "^25.3.0", + "jest-each": "^25.5.0", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-runtime": "^25.5.4", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "pretty-format": "^25.5.0", "throat": "^5.0.0" }, "dependencies": { "@jest/console": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz", - "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", + "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", "dev": true, "requires": { - "@jest/source-map": "^25.2.6", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", - "jest-util": "^25.3.0", + "jest-message-util": "^25.5.0", + "jest-util": "^25.5.0", "slash": "^3.0.0" } }, "@jest/source-map": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", - "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.5.0.tgz", + "integrity": "sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==", "dev": true, "requires": { "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", + "graceful-fs": "^4.2.4", "source-map": "^0.6.0" } }, "@jest/test-result": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz", - "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", + "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", "dev": true, "requires": { - "@jest/console": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/console": "^25.5.0", + "@jest/types": "^25.5.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -26409,9 +34258,9 @@ } }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "has-flag": { @@ -26426,37 +34275,61 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } + }, "jest-get-type": { - "version": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==" + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true + }, + "jest-matcher-utils": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", + "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "jest-diff": "^25.5.0", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } }, "jest-message-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz", - "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" } }, - "jest-regex-util": { - "version": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", - "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==" - }, "jest-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", - "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" } @@ -26471,18 +34344,13 @@ "picomatch": "^2.0.5" } }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -26494,21 +34362,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, - "realpath-native": { - "version": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", - "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==" - }, - "resolve": { - "version": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -26653,15 +34506,27 @@ } }, "jest-leak-detector": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.3.0.tgz", - "integrity": "sha512-jk7k24dMIfk8LUSQQGN8PyOy9+J0NAfHZWiDmUDYVMctY8FLJQ1eQ8+PjMoN8PgwhLIggUqgYJnyRFvUz3jLRw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz", + "integrity": "sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==", "dev": true, "requires": { "jest-get-type": "^25.2.6", - "pretty-format": "^25.3.0" + "pretty-format": "^25.5.0" }, "dependencies": { + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -26678,6 +34543,16 @@ "color-convert": "^2.0.1" } }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -26693,6 +34568,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "jest-get-type": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", @@ -26700,12 +34581,12 @@ "dev": true }, "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" @@ -26716,6 +34597,15 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -26817,7 +34707,6 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@jest/test-result": "^24.9.0", @@ -26833,7 +34722,6 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", @@ -26844,7 +34732,6 @@ "version": "13.0.8", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, "requires": { "@types/yargs-parser": "*" } @@ -26853,7 +34740,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -26863,8 +34749,7 @@ "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" } } }, @@ -26872,7 +34757,6 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "dev": true, "requires": { "@jest/types": "^24.9.0" }, @@ -26881,7 +34765,6 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", @@ -26892,7 +34775,6 @@ "version": "13.0.8", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, "requires": { "@types/yargs-parser": "*" } @@ -27009,42 +34891,43 @@ } }, "jest-resolve-dependencies": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.3.0.tgz", - "integrity": "sha512-bDUlLYmHW+f7J7KgcY2lkq8EMRqKonRl0XoD4Wp5SJkgAxKJnsaIOlrrVNTfXYf+YOu3VCjm/Ac2hPF2nfsCIA==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.5.4.tgz", + "integrity": "sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "jest-regex-util": "^25.2.6", - "jest-snapshot": "^25.3.0" + "jest-snapshot": "^25.5.1" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, "chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -27054,6 +34937,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -27061,42 +34945,14 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "jest-get-type": { - "version": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==" - }, - "jest-message-util": { - "version": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz", - "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==", - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.3.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^3.0.0", - "micromatch": "^4.0.2", - "slash": "^3.0.0", - "stack-utils": "^1.0.1" - } + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, "jest-regex-util": { "version": "25.2.6", @@ -27104,133 +34960,79 @@ "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", "dev": true }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "pretty-format": { - "version": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", - "requires": { - "@jest/types": "^25.3.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "realpath-native": { - "version": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", - "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==" - }, - "resolve": { - "version": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, "requires": { "has-flag": "^4.0.0" } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } } } }, "jest-runner": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.3.0.tgz", - "integrity": "sha512-csDqSC9qGHYWDrzrElzEgFbteztFeZJmKhSgY5jlCIcN0+PhActzRNku0DA1Xa1HxGOb0/AfbP1EGJlP4fGPtA==", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.5.4.tgz", + "integrity": "sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg==", "dev": true, "requires": { - "@jest/console": "^25.3.0", - "@jest/environment": "^25.3.0", - "@jest/test-result": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/console": "^25.5.0", + "@jest/environment": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.3", - "jest-config": "^25.3.0", + "graceful-fs": "^4.2.4", + "jest-config": "^25.5.4", "jest-docblock": "^25.3.0", - "jest-haste-map": "^25.3.0", - "jest-jasmine2": "^25.3.0", - "jest-leak-detector": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-resolve": "^25.3.0", - "jest-runtime": "^25.3.0", - "jest-util": "^25.3.0", - "jest-worker": "^25.2.6", + "jest-haste-map": "^25.5.1", + "jest-jasmine2": "^25.5.4", + "jest-leak-detector": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-resolve": "^25.5.1", + "jest-runtime": "^25.5.4", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "source-map-support": "^0.5.6", "throat": "^5.0.0" }, "dependencies": { "@jest/console": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz", - "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", + "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", "dev": true, "requires": { - "@jest/source-map": "^25.2.6", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", - "jest-util": "^25.3.0", + "jest-message-util": "^25.5.0", + "jest-util": "^25.5.0", "slash": "^3.0.0" } }, - "@jest/source-map": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", - "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", + "@jest/test-result": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", + "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", "dev": true, "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" + "@jest/console": "^25.5.0", + "@jest/types": "^25.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" } }, - "@jest/test-result": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz", - "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==", + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", "dev": true, "requires": { - "@jest/console": "^25.3.0", - "@jest/types": "^25.3.0", "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" } }, "ansi-styles": { @@ -27296,17 +35098,27 @@ "to-regex-range": "^5.0.1" } }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, "optional": true }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "has-flag": { @@ -27322,19 +35134,20 @@ "dev": true }, "jest-haste-map": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz", - "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz", + "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", + "@types/graceful-fs": "^4.1.2", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.2.6", - "jest-util": "^25.3.0", - "jest-worker": "^25.2.6", + "graceful-fs": "^4.2.4", + "jest-serializer": "^25.5.0", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7", @@ -27342,48 +35155,79 @@ } }, "jest-message-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz", - "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" } }, + "jest-resolve": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.5.1.tgz", + "integrity": "sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "browser-resolve": "^1.11.3", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.1", + "read-pkg-up": "^7.0.1", + "realpath-native": "^2.0.0", + "resolve": "^1.17.0", + "slash": "^3.0.0" + } + }, "jest-serializer": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", - "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", - "dev": true + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz", + "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4" + } }, "jest-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", - "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" } }, "jest-worker": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", - "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", "dev": true, "requires": { "merge-stream": "^2.0.0", "supports-color": "^7.0.0" } }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -27400,40 +35244,130 @@ "picomatch": "^2.0.5" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } }, "realpath-native": { - "version": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", - "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", + "dev": true }, "resolve": { - "version": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, "requires": { "path-parse": "^1.0.6" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -27458,6 +35392,12 @@ "is-number": "^7.0.0" } }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -27470,32 +35410,33 @@ } }, "jest-runtime": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.3.0.tgz", - "integrity": "sha512-gn5KYB1wxXRM3nfw8fVpthFu60vxQUCr+ShGq41+ZBFF3DRHZRKj3HDWVAVB4iTNBj2y04QeAo5cZ/boYaPg0w==", - "dev": true, - "requires": { - "@jest/console": "^25.3.0", - "@jest/environment": "^25.3.0", - "@jest/source-map": "^25.2.6", - "@jest/test-result": "^25.3.0", - "@jest/transform": "^25.3.0", - "@jest/types": "^25.3.0", + "version": "25.5.4", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.5.4.tgz", + "integrity": "sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==", + "dev": true, + "requires": { + "@jest/console": "^25.5.0", + "@jest/environment": "^25.5.0", + "@jest/globals": "^25.5.2", + "@jest/source-map": "^25.5.0", + "@jest/test-result": "^25.5.0", + "@jest/transform": "^25.5.1", + "@jest/types": "^25.5.0", "@types/yargs": "^15.0.0", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", - "graceful-fs": "^4.2.3", - "jest-config": "^25.3.0", - "jest-haste-map": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-mock": "^25.3.0", + "graceful-fs": "^4.2.4", + "jest-config": "^25.5.4", + "jest-haste-map": "^25.5.1", + "jest-message-util": "^25.5.0", + "jest-mock": "^25.5.0", "jest-regex-util": "^25.2.6", - "jest-resolve": "^25.3.0", - "jest-snapshot": "^25.3.0", - "jest-util": "^25.3.0", - "jest-validate": "^25.3.0", + "jest-resolve": "^25.5.1", + "jest-snapshot": "^25.5.1", + "jest-util": "^25.5.0", + "jest-validate": "^25.5.0", "realpath-native": "^2.0.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", @@ -27503,56 +35444,57 @@ }, "dependencies": { "@jest/console": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz", - "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", + "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", "dev": true, "requires": { - "@jest/source-map": "^25.2.6", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", - "jest-util": "^25.3.0", + "jest-message-util": "^25.5.0", + "jest-util": "^25.5.0", "slash": "^3.0.0" } }, "@jest/source-map": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", - "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.5.0.tgz", + "integrity": "sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==", "dev": true, "requires": { "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", + "graceful-fs": "^4.2.4", "source-map": "^0.6.0" } }, "@jest/test-result": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz", - "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", + "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", "dev": true, "requires": { - "@jest/console": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/console": "^25.5.0", + "@jest/types": "^25.5.0", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/transform": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.3.0.tgz", - "integrity": "sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.5.1.tgz", + "integrity": "sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "babel-plugin-istanbul": "^6.0.0", "chalk": "^3.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.3.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^25.5.1", "jest-regex-util": "^25.2.6", - "jest-util": "^25.3.0", + "jest-util": "^25.5.0", "micromatch": "^4.0.2", "pirates": "^4.0.1", "realpath-native": "^2.0.0", @@ -27561,15 +35503,29 @@ "write-file-atomic": "^3.0.0" } }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" @@ -27638,6 +35594,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "requires": { "color-name": "~1.1.4" } @@ -27645,7 +35602,8 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "emoji-regex": { "version": "8.0.0", @@ -27673,9 +35631,9 @@ } }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "dev": true, "optional": true }, @@ -27700,9 +35658,9 @@ } }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "has-flag": { @@ -27724,23 +35682,26 @@ "dev": true }, "jest-get-type": { - "version": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==" + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true }, "jest-haste-map": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz", - "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.5.1.tgz", + "integrity": "sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", + "@types/graceful-fs": "^4.1.2", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", - "graceful-fs": "^4.2.3", - "jest-serializer": "^25.2.6", - "jest-util": "^25.3.0", - "jest-worker": "^25.2.6", + "graceful-fs": "^4.2.4", + "jest-serializer": "^25.5.0", + "jest-util": "^25.5.0", + "jest-worker": "^25.5.0", "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7", @@ -27748,27 +35709,28 @@ } }, "jest-message-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz", - "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" } }, "jest-mock": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.3.0.tgz", - "integrity": "sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.5.0.tgz", + "integrity": "sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==", "dev": true, "requires": { - "@jest/types": "^25.3.0" + "@jest/types": "^25.5.0" } }, "jest-regex-util": { @@ -27777,34 +35739,75 @@ "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", "dev": true }, + "jest-resolve": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.5.1.tgz", + "integrity": "sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "browser-resolve": "^1.11.3", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.1", + "read-pkg-up": "^7.0.1", + "realpath-native": "^2.0.0", + "resolve": "^1.17.0", + "slash": "^3.0.0" + } + }, "jest-serializer": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", - "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", - "dev": true + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.5.0.tgz", + "integrity": "sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4" + } }, "jest-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", - "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" } }, + "jest-validate": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.5.0.tgz", + "integrity": "sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "jest-get-type": "^25.2.6", + "leven": "^3.1.0", + "pretty-format": "^25.5.0" + } + }, "jest-worker": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", - "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", "dev": true, "requires": { "merge-stream": "^2.0.0", "supports-color": "^7.0.0" } }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -27830,6 +35833,18 @@ "picomatch": "^2.0.5" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -27860,6 +35875,18 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -27869,22 +35896,57 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true }, "pretty-format": { - "version": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" } }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } }, "realpath-native": { "version": "2.0.0", @@ -27899,15 +35961,19 @@ "dev": true }, "resolve": { - "version": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, "requires": { "path-parse": "^1.0.6" } }, "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true }, "slash": { "version": "3.0.0", @@ -27965,6 +36031,12 @@ "is-number": "^7.0.0" } }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -28023,9 +36095,9 @@ } }, "yargs-parser": { - "version": "18.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", - "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -28037,8 +36109,7 @@ "jest-serializer": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" }, "jest-serializer-enzyme": { "version": "1.0.0", @@ -28067,27 +36138,40 @@ } }, "jest-snapshot": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.3.0.tgz", - "integrity": "sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg==", + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.5.1.tgz", + "integrity": "sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "@types/prettier": "^1.19.0", "chalk": "^3.0.0", - "expect": "^25.3.0", - "jest-diff": "^25.3.0", + "expect": "^25.5.0", + "graceful-fs": "^4.2.4", + "jest-diff": "^25.5.0", "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-resolve": "^25.3.0", + "jest-matcher-utils": "^25.5.0", + "jest-message-util": "^25.5.0", + "jest-resolve": "^25.5.1", "make-dir": "^3.0.0", "natural-compare": "^1.4.0", - "pretty-format": "^25.3.0", + "pretty-format": "^25.5.0", "semver": "^6.3.0" }, "dependencies": { + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -28147,6 +36231,22 @@ "to-regex-range": "^5.0.1" } }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -28159,39 +36259,76 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } + }, "jest-get-type": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", "dev": true }, + "jest-matcher-utils": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz", + "integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "jest-diff": "^25.5.0", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + } + }, "jest-message-util": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.4.0.tgz", - "integrity": "sha512-LYY9hRcVGgMeMwmdfh9tTjeux1OjZHMusq/E5f3tJN+dAoVVkJtq5ZUEPIcB7bpxDUt2zjUsrwg0EGgPQ+OhXQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "micromatch": "^4.0.2", "slash": "^3.0.0", "stack-utils": "^1.0.1" - }, - "dependencies": { - "@jest/types": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.4.0.tgz", - "integrity": "sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - } + } + }, + "jest-resolve": { + "version": "25.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.5.1.tgz", + "integrity": "sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "browser-resolve": "^1.11.3", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.1", + "read-pkg-up": "^7.0.1", + "realpath-native": "^2.0.0", + "resolve": "^1.17.0", + "slash": "^3.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" } }, "micromatch": { @@ -28204,30 +36341,84 @@ "picomatch": "^2.0.5" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, "pretty-format": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.4.0.tgz", - "integrity": "sha512-PI/2dpGjXK5HyXexLPZU/jw5T9Q6S1YVXxxVxco+LIqzUFHXIbKZKdUVt7GcX7QUCr31+3fzhi4gN4/wUYPVxQ==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", "dev": true, "requires": { - "@jest/types": "^25.4.0", + "@jest/types": "^25.5.0", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" - }, - "dependencies": { - "@jest/types": { - "version": "25.4.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.4.0.tgz", - "integrity": "sha512-XBeaWNzw2PPnGW5aXvZt3+VO60M+34RY3XDsCK5tW7kyj3RK0XClRutCfjqcBuaR2aBQTbluEDME9b5MB9UAPw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^15.0.0", - "chalk": "^3.0.0" - } - } } }, "react-is": { @@ -28236,6 +36427,52 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "realpath-native": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -28265,6 +36502,12 @@ "requires": { "is-number": "^7.0.0" } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true } } }, @@ -28272,7 +36515,6 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "dev": true, "requires": { "@jest/console": "^24.9.0", "@jest/fake-timers": "^24.9.0", @@ -28292,7 +36534,6 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", @@ -28303,7 +36544,6 @@ "version": "13.0.8", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, "requires": { "@types/yargs-parser": "*" } @@ -28312,7 +36552,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -28322,43 +36561,362 @@ "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "jest-validate": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.3.0.tgz", - "integrity": "sha512-3WuXgIZ4HXUvW6gk9twFFkT9j6zUorKnF2oEY8VEsHb7x5LGvVlN3WUsbqazVKuyXwvikO2zFJ/YTySMsMje2w==", - "dev": true, + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^24.9.0", "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "jest-get-type": "^25.2.6", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", "leven": "^3.1.0", - "pretty-format": "^25.3.0" + "pretty-format": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/yargs": { + "version": "13.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz", + "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + } + } + }, + "jest-watch-typeahead": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-0.6.0.tgz", + "integrity": "sha512-mY0u5D1U/mEzeO/tpcDWnWaakuQiBp8gZY1K0HxduMeKSYm4WvbBVfU15a/hWMMs4J9FrXaYjAWs5XGlOpx5IQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^26.0.0", + "jest-watcher": "^26.0.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0" }, "dependencies": { + "@jest/console": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.1.0.tgz", + "integrity": "sha512-+0lpTHMd/8pJp+Nd4lyip+/Iyf2dZJvcCqrlkeZQoQid+JlThA4M9vxHtheyrQ99jJTMQam+es4BcvZ5W5cC3A==", + "dev": true, + "requires": { + "@jest/types": "^26.1.0", + "chalk": "^4.0.0", + "jest-message-util": "^26.1.0", + "jest-util": "^26.1.0", + "slash": "^3.0.0" + } + }, + "@jest/test-result": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.1.0.tgz", + "integrity": "sha512-Xz44mhXph93EYMA8aYDz+75mFbarTV/d/x0yMdI3tfSRs/vh4CqSxgzVmCps1fPkHDCtn0tU8IH9iCKgGeGpfw==", + "dev": true, + "requires": { + "@jest/console": "^26.1.0", + "@jest/types": "^26.1.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/types": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.1.0.tgz", + "integrity": "sha512-GXigDDsp6ZlNMhXQDeuy/iYCDsRIHJabWtDzvnn36+aqFfG14JmFV0e/iXxY4SP9vbXSiPNOWdehU5MeqrYHBQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + } + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-message-util": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.1.0.tgz", + "integrity": "sha512-dY0+UlldiAJwNDJ08SF0HdF32g9PkbF2NRK/+2iMPU40O6q+iSn1lgog/u0UH8ksWoPv0+gNq8cjhYO2MFtT0g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.1.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + } + }, + "jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true + }, + "jest-util": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.1.0.tgz", + "integrity": "sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg==", + "dev": true, + "requires": { + "@jest/types": "^26.1.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "jest-watcher": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.1.0.tgz", + "integrity": "sha512-ffEOhJl2EvAIki613oPsSG11usqnGUzIiK7MMX6hE4422aXOcVEG3ySCTDFLn1+LZNXGPE8tuJxhp8OBJ1pgzQ==", + "dev": true, + "requires": { + "@jest/test-result": "^26.1.0", + "@jest/types": "^26.1.0", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.1.0", + "string-length": "^4.0.1" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + } + }, + "string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.5.0.tgz", + "integrity": "sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==", + "dev": true, + "requires": { + "@jest/test-result": "^25.5.0", + "@jest/types": "^25.5.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "jest-util": "^25.5.0", + "string-length": "^3.1.0" + }, + "dependencies": { + "@jest/console": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.5.0.tgz", + "integrity": "sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "chalk": "^3.0.0", + "jest-message-util": "^25.5.0", + "jest-util": "^25.5.0", + "slash": "^3.0.0" + } + }, + "@jest/test-result": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.5.0.tgz", + "integrity": "sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==", + "dev": true, + "requires": { + "@jest/console": "^25.5.0", + "@jest/types": "^25.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + } + }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", @@ -28369,11 +36927,14 @@ "color-convert": "^2.0.1" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } }, "chalk": { "version": "3.0.0", @@ -28400,150 +36961,19 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "jest-get-type": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", - "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "pretty-format": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz", - "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^16.12.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watcher": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.3.0.tgz", - "integrity": "sha512-dtFkfidFCS9Ucv8azOg2hkiY3sgJEHeTLtGFHS+jfBEE7eRtrO6+2r1BokyDkaG2FOD7485r/SgpC1MFAENfeA==", - "dev": true, - "requires": { - "@jest/test-result": "^25.3.0", - "@jest/types": "^25.3.0", - "ansi-escapes": "^4.2.1", - "chalk": "^3.0.0", - "jest-util": "^25.3.0", - "string-length": "^3.1.0" - }, - "dependencies": { - "@jest/console": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz", - "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==", - "dev": true, - "requires": { - "@jest/source-map": "^25.2.6", - "chalk": "^3.0.0", - "jest-util": "^25.3.0", - "slash": "^3.0.0" - } - }, - "@jest/source-map": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", - "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.3", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz", - "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==", - "dev": true, - "requires": { - "@jest/console": "^25.3.0", - "@jest/types": "^25.3.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, - "requires": { - "type-fest": "^0.11.0" - } - }, - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "color-name": "~1.1.4" + "to-regex-range": "^5.0.1" } }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "has-flag": { @@ -28552,30 +36982,57 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "jest-message-util": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.5.0.tgz", + "integrity": "sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.5.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^1.0.1" + } + }, "jest-util": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", - "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==", + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.5.0.tgz", + "integrity": "sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==", "dev": true, "requires": { - "@jest/types": "^25.3.0", + "@jest/types": "^25.5.0", "chalk": "^3.0.0", + "graceful-fs": "^4.2.4", "is-ci": "^2.0.0", "make-dir": "^3.0.0" } }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -28585,6 +37042,15 @@ "has-flag": "^4.0.0" } }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "type-fest": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", @@ -28597,7 +37063,6 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, "requires": { "merge-stream": "^2.0.0", "supports-color": "^6.1.0" @@ -28606,14 +37071,12 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -28623,8 +37086,7 @@ "jetifier": { "version": "1.6.5", "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.5.tgz", - "integrity": "sha512-T7yzBSu9PR+DqjYt+I0KVO1XTb1QhAfHnXV5Nd3xpbXM6Xg4e3vP60Q4qkNU8Fh6PHC2PivPUNN3rY7G2MxcDQ==", - "dev": true + "integrity": "sha512-T7yzBSu9PR+DqjYt+I0KVO1XTb1QhAfHnXV5Nd3xpbXM6Xg4e3vP60Q4qkNU8Fh6PHC2PivPUNN3rY7G2MxcDQ==" }, "js-base64": { "version": "2.5.2", @@ -28668,8 +37130,7 @@ "jsc-android": { "version": "245459.0.0", "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-245459.0.0.tgz", - "integrity": "sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==", - "dev": true + "integrity": "sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==" }, "jscodeshift": { "version": "0.7.0", @@ -28730,9 +37191,9 @@ } }, "jsdoctypeparser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz", - "integrity": "sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", + "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", "dev": true }, "jsdom": { @@ -28864,6 +37325,14 @@ } } }, + "jsdom-jscore-rn": { + "version": "git+https://github.com/iamcco/jsdom-jscore-rn.git#a562f3d57c27c13e5bfc8cf82d496e69a3ba2800", + "from": "git+https://github.com/iamcco/jsdom-jscore-rn.git#a562f3d57c27c13e5bfc8cf82d496e69a3ba2800", + "requires": { + "htmlparser2-without-node-native": "^3.9.2", + "querystring": "^0.2.0" + } + }, "jsesc": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", @@ -28896,7 +37365,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, "requires": { "jsonify": "~0.0.0" } @@ -28941,7 +37409,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -28949,8 +37416,7 @@ "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, "jsonparse": { "version": "1.3.1", @@ -29027,11 +37493,19 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, "requires": { "graceful-fs": "^4.1.9" } }, + "klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11" + } + }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -29071,11 +37545,19 @@ } } }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, "requires": { "invert-kv": "^1.0.0" } @@ -29612,16 +38094,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "lodash._reinterpolate": { "version": "3.0.0", @@ -29641,6 +38122,18 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "dev": true + }, "lodash.differencewith": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.differencewith/-/lodash.differencewith-4.5.0.tgz", @@ -29753,7 +38246,12 @@ "lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", "dev": true }, "lodash.uniq": { @@ -29766,7 +38264,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, "requires": { "chalk": "^2.0.1" }, @@ -29775,7 +38272,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -29811,7 +38307,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.6.1.tgz", "integrity": "sha512-cHuXN8qUZuzX/7kB6VyS7kB4xyD24e8gyHXIFNhIv+fjW3P+jEXNUhj0o/7qWJtv7UZpbnPgUqzu/AZQ8RAqxQ==", - "dev": true, "requires": { "ansi-fragments": "^0.2.1", "dayjs": "^1.8.15", @@ -29821,14 +38316,12 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -29841,7 +38334,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -29856,7 +38348,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, "requires": { "locate-path": "^3.0.0" } @@ -29865,7 +38356,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, "requires": { "pump": "^3.0.0" } @@ -29873,14 +38363,12 @@ "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, "requires": { "invert-kv": "^2.0.0" } @@ -29889,7 +38377,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -29899,7 +38386,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, "requires": { "map-age-cleaner": "^0.1.1", "mimic-fn": "^2.0.0", @@ -29909,14 +38395,12 @@ "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, "requires": { "execa": "^1.0.0", "lcid": "^2.0.0", @@ -29927,7 +38411,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -29936,7 +38419,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, "requires": { "p-limit": "^2.0.0" } @@ -29944,14 +38426,12 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -29960,14 +38440,12 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^1.2.0", @@ -29987,7 +38465,6 @@ "version": "11.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -30060,7 +38537,6 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -30076,6 +38552,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "dev": true, "requires": { "semver": "^6.0.0" }, @@ -30083,7 +38560,8 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -30257,7 +38735,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", - "dev": true, "requires": { "p-defer": "^1.0.0" } @@ -30508,7 +38985,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, "requires": { "mimic-fn": "^1.0.0" } @@ -30896,7 +39372,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, "requires": { "readable-stream": "^2.0.1" } @@ -30914,10 +39389,9 @@ "dev": true }, "metro": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.56.3.tgz", - "integrity": "sha512-mxHpvBGWanZ46wAEZVLinNO5IYMcFbTdMZIRhC7r+rvoSK6r9iPj95AujBfzLXMAl36RI2O3D7yp5hOYif/gEQ==", - "dev": true, + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.56.4.tgz", + "integrity": "sha512-Kt3OQJQtQdts0JrKnyGdLpKHDjqYBgIfzvYrvfhmFCkKuZ8aqRlVnvpfjQ4/OBm0Fmm9NyyxbNRD9VIbj7WjnA==", "requires": { "@babel/core": "^7.0.0", "@babel/generator": "^7.0.0", @@ -30946,17 +39420,17 @@ "json-stable-stringify": "^1.0.1", "lodash.throttle": "^4.1.1", "merge-stream": "^1.0.1", - "metro-babel-register": "0.56.3", - "metro-babel-transformer": "0.56.3", - "metro-cache": "0.56.3", - "metro-config": "0.56.3", - "metro-core": "0.56.3", - "metro-inspector-proxy": "0.56.3", - "metro-minify-uglify": "0.56.3", - "metro-react-native-babel-preset": "0.56.3", - "metro-resolver": "0.56.3", - "metro-source-map": "0.56.3", - "metro-symbolicate": "0.56.3", + "metro-babel-register": "^0.56.4", + "metro-babel-transformer": "^0.56.4", + "metro-cache": "^0.56.4", + "metro-config": "^0.56.4", + "metro-core": "^0.56.4", + "metro-inspector-proxy": "^0.56.4", + "metro-minify-uglify": "^0.56.4", + "metro-react-native-babel-preset": "^0.56.4", + "metro-resolver": "^0.56.4", + "metro-source-map": "^0.56.4", + "metro-symbolicate": "^0.56.4", "mime-types": "2.1.11", "mkdirp": "^0.5.1", "node-fetch": "^2.2.0", @@ -30977,14 +39451,12 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -30995,7 +39467,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1", @@ -31006,7 +39477,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -31018,14 +39488,12 @@ "core-js": { "version": "2.6.11", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -31034,7 +39502,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-1.0.0.tgz", "integrity": "sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==", - "dev": true, "requires": { "core-js": "^2.4.1", "fbjs-css-vars": "^1.0.0", @@ -31050,7 +39517,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", @@ -31061,7 +39527,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -31075,7 +39540,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -31084,7 +39548,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -31093,7 +39556,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -31101,11 +39563,19 @@ "strip-bom": "^3.0.0" } }, + "metro-babel-transformer": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.56.4.tgz", + "integrity": "sha512-IOi4ILgZvaX7GCGHBJp79paNVOq5QxhhbyqAdEJgDP8bHfl/OVHoVKSypfrsMSKSiBrqxhIjyc4XjkXsQtkx5g==", + "requires": { + "@babel/core": "^7.0.0", + "metro-source-map": "^0.56.4" + } + }, "metro-react-native-babel-preset": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.56.3.tgz", - "integrity": "sha512-tGPzX2ZwI8vQ8SiNVBPUIgKqmaRNVB6rtJtHCBQZAYRiMbxh0NHCUoFfKBej6U5qVgxiYYHyN8oB23evG4/Oow==", - "dev": true, + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.56.4.tgz", + "integrity": "sha512-CzbBDM9Rh6w8s1fq+ZqihAh7DDqUAcfo9pPww25+N/eJ7UK436Q7JdfxwdIPpBwLFn6o6MyYn+uwL9OEWBJarA==", "requires": { "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-export-default-from": "^7.0.0", @@ -31144,14 +39614,27 @@ "react-refresh": "^0.4.0" } }, + "metro-source-map": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.56.4.tgz", + "integrity": "sha512-f1P9/rpFmG3Z0Jatiw2zvLItx1TwR7mXTSDj4qLDCWeVMB3kEXAr3R0ucumTW8c6HfpJljeRBWzYFXF33fd81g==", + "requires": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "^0.56.4", + "ob1": "^0.56.4", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, "metro-symbolicate": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.56.3.tgz", - "integrity": "sha512-fSQtjjy4eiJDThSl9eloxMElhrs+5PQB+DKKzmTFXT8e2GDga+pa1xTBFRUACMO8BXGuWmxR7SnGDw0wo5Ngrw==", - "dev": true, + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.56.4.tgz", + "integrity": "sha512-8mCNNn6zV5FFKCIcRgI7736Xl+owgvYuy8qanPxZN36f7utiWRYeB+PirEBPcglBk4qQvoy2lT6oPULNXZQbbQ==", "requires": { "invariant": "^2.2.4", - "metro-source-map": "0.56.3", + "metro-source-map": "^0.56.4", "source-map": "^0.5.6", "through2": "^2.0.1", "vlq": "^1.0.0" @@ -31160,44 +39643,33 @@ "mime-db": { "version": "1.23.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", - "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=", - "dev": true + "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=" }, "mime-types": { "version": "2.1.11", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", - "dev": true, "requires": { "mime-db": "~1.23.0" } }, - "node-fetch": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", - "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", - "dev": true + "ob1": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.56.4.tgz", + "integrity": "sha512-URgFof9z2wotiYFsqlydXtQfGV81gvBI2ODy64xfd3vPo+AYom5PVDX4t4zn23t/O+S2IxqApSQM8uJAybmz7w==" }, "path-type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, "requires": { "pify": "^2.0.0" } }, - "react-refresh": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.2.tgz", - "integrity": "sha512-kv5QlFFSZWo7OlJFNYbxRtY66JImuP2LcrFgyJfQaf85gSP+byzG21UbDQEYjU7f//ny8rwiEkO6py2Y+fEgAQ==", - "dev": true - }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, "requires": { "load-json-file": "^2.0.0", "normalize-package-data": "^2.3.2", @@ -31208,7 +39680,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, "requires": { "find-up": "^2.0.0", "read-pkg": "^2.0.0" @@ -31218,7 +39689,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -31227,7 +39697,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -31235,14 +39704,12 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, "write-file-atomic": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -31253,7 +39720,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", - "dev": true, "requires": { "options": ">=0.0.5", "ultron": "1.0.x" @@ -31263,7 +39729,6 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", - "dev": true, "requires": { "camelcase": "^4.1.0", "cliui": "^3.2.0", @@ -31284,7 +39749,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, "requires": { "camelcase": "^4.1.0" } @@ -31292,10 +39756,9 @@ } }, "metro-babel-register": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.56.3.tgz", - "integrity": "sha512-ILCRtNFdW6vzqmLAG2MYWdTSE1vCAZqDKNggiNhlfViuoxmWAIL0vOqixl1CHZF5z4t55+fk46A0jSN7UgPyVw==", - "dev": true, + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.56.4.tgz", + "integrity": "sha512-Phm6hMluOWYqfykftjJ1jsTpWvbgb49AC/1taxEctxUdRCZlFgZwBleJZAhQYxJD5J+ikFkEbHDzePEXb29KVA==", "requires": { "@babel/core": "^7.0.0", "@babel/plugin-proposal-class-properties": "^7.0.0", @@ -31314,29 +39777,26 @@ "core-js": { "version": "2.6.11", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" } } }, "metro-babel-transformer": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.56.3.tgz", - "integrity": "sha512-N5/ftb3rBkt6uKlgYAv+lwtzYc4dK0tBpfZ8pjec3kcypGuGTuf4LTHEh65EuzySreLngYI0bQzoFSn3G3DYsw==", - "dev": true, + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.56.0.tgz", + "integrity": "sha512-8w/NpcKovmzkY4/++zX5v+OLOcBPXC9iygNI0ZdexA9U5/ncAY3U1VaF2ScFKzhrpkb8AJioYYioAgrRMLYStg==", "requires": { "@babel/core": "^7.0.0", - "metro-source-map": "0.56.3" + "metro-source-map": "0.56.0" } }, "metro-cache": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.56.3.tgz", - "integrity": "sha512-SsryVe/TVkt2IkEGnYhB3gQlg9iMlu8WJikQHcCEjMfPEnSIzmeymrX73fwQNPnTnN7F3E0HVjH6Wvq6fh0mcA==", - "dev": true, + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.56.4.tgz", + "integrity": "sha512-d1hiUSKwtRsuMxUhHVJ3tjK2BbpUlJGvTyMWohK8Wxx+0GbnWRWWFcI4vlCzlZfoK0VtZK2MJEl5t7Du1mIniQ==", "requires": { "jest-serializer": "^24.4.0", - "metro-core": "0.56.3", + "metro-core": "^0.56.4", "mkdirp": "^0.5.1", "rimraf": "^2.5.4" }, @@ -31345,7 +39805,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -31359,7 +39818,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -31367,115 +39825,33 @@ } }, "metro-config": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.56.3.tgz", - "integrity": "sha512-C3ZLA5y5gW5auDSQN5dsCTduJg7LXEiX/tLAADOkgXWVImr5P74x9Wt8y1MMWrKx6p+4p5RMDyEwWDMXJt/DwA==", - "dev": true, + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.56.4.tgz", + "integrity": "sha512-O85QDHwWdMn/8ERe13y4a6vbZL0AHyO8atTvL+9BCulLEO+FQBi1iJjr3+ViLa8cf0m5dRftDsa7P47m5euk4A==", "requires": { "cosmiconfig": "^5.0.5", "jest-validate": "^24.7.0", - "metro": "0.56.3", - "metro-cache": "0.56.3", - "metro-core": "0.56.3", + "metro": "^0.56.4", + "metro-cache": "^0.56.4", + "metro-core": "^0.56.4", "pretty-format": "^24.7.0" - }, - "dependencies": { - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "leven": "^3.1.0", - "pretty-format": "^24.9.0" - }, - "dependencies": { - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - } - } - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - } } }, "metro-core": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.56.3.tgz", - "integrity": "sha512-OAaHP3mBdlACMZRwDJzZzYC0o2S3qfb4BBK75L8H4Ds+y3QUSrjsDEpHACcpaMTOds8rBvjzn+jjB5tqNoHfBA==", - "dev": true, + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.56.4.tgz", + "integrity": "sha512-hMzkBdgPt5Zm9nr/1KtIT+A6H7TNiLVCEGG5OiAXj8gTRsA2yy7wAdQpwy0xbE+zi88t/pLOzXpd3ClG/YxyWg==", "requires": { "jest-haste-map": "^24.7.1", "lodash.throttle": "^4.1.1", - "metro-resolver": "0.56.3", + "metro-resolver": "^0.56.4", "wordwrap": "^1.0.0" } }, "metro-inspector-proxy": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.56.3.tgz", - "integrity": "sha512-7WtHinw+VJcunQ3q8El1MqqzYSRvXEjW5QE13VYwcLtnay3pvcqACeiQmGbWI0IqxB1+QH8tf3nkA7z7pQ7Vpw==", - "dev": true, + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.56.4.tgz", + "integrity": "sha512-E1S3MO25mWKmcLn1UQuCDiS0hf9P2Fwq8sEAX5lBLoZbehepNH+4xJ3xXSY51JX4dozBrE8GGoKL4ll3II40LA==", "requires": { "connect": "^3.6.5", "debug": "^2.2.0", @@ -31487,14 +39863,12 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1", @@ -31505,7 +39879,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -31518,7 +39891,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -31527,7 +39899,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -31536,7 +39907,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -31548,7 +39918,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, "requires": { "pify": "^2.0.0" } @@ -31557,7 +39926,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, "requires": { "load-json-file": "^2.0.0", "normalize-package-data": "^2.3.2", @@ -31568,7 +39936,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, "requires": { "find-up": "^2.0.0", "read-pkg": "^2.0.0" @@ -31578,7 +39945,6 @@ "version": "5.5.12", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, "requires": { "symbol-observable": "1.0.1" } @@ -31587,7 +39953,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -31595,20 +39960,17 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, "symbol-observable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" }, "ws": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", - "dev": true, "requires": { "options": ">=0.0.5", "ultron": "1.0.x" @@ -31618,7 +39980,6 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", - "dev": true, "requires": { "camelcase": "^4.1.0", "cliui": "^3.2.0", @@ -31639,7 +40000,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, "requires": { "camelcase": "^4.1.0" } @@ -31647,19 +40007,17 @@ } }, "metro-minify-uglify": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.56.3.tgz", - "integrity": "sha512-b9ljyeUpkJWVlFy8M/i4aNbvEBI0zN9vJh1jfU7yx+k9dX7FulLnpGmAQxxQdEszcM//sJrsKNS1oLYBxr0NMQ==", - "dev": true, + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.56.4.tgz", + "integrity": "sha512-BHgj7+BKEK2pHvWHUR730bIrsZwl8DPtr49x9L0j2grPZ5/UROWXzEr8VZgIss7fl64t845uu1HXNNyuSj2EhA==", "requires": { "uglify-es": "^3.1.9" } }, "metro-react-native-babel-preset": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.55.0.tgz", - "integrity": "sha512-HUI+dEiVym8f1NYIF1grY9PdoY0d3SSS/HED2dDDvTORwndsAEWuXiUgKFOGWX18+RUAQog8obVQuBMgrr8ZBQ==", - "dev": true, + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.57.0.tgz", + "integrity": "sha512-pvLh1QOwdxsjgYE2a+4aTKs3LSF3+t4jscxHtkND6wsJnKVVspLt8FkDaORa6zr3Fq12tVpEt5NJMdgtWqBpaA==", "requires": { "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-export-default-from": "^7.0.0", @@ -31695,121 +40053,97 @@ "@babel/plugin-transform-typescript": "^7.0.0", "@babel/plugin-transform-unicode-regex": "^7.0.0", "@babel/template": "^7.0.0", - "react-refresh": "^0.2.0" + "react-refresh": "^0.4.0" } }, "metro-react-native-babel-transformer": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.55.0.tgz", - "integrity": "sha512-K5dJh/HXkebKnSgJJ8XeWliwJFmit1u7CnswbhoYd0XTQQIYj6HV+neN/FzJV5tvkFkQC3asH+5xAW92HE6uRg==", - "dev": true, + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.56.0.tgz", + "integrity": "sha512-9eJ6kzizy80KlqNryg9TjlHdA4PZPWw0TV8Ih7H6RmYmuMzac5gjIW9FUrXsVWI56kQf+L5SdD/dCOWDqez/lQ==", "requires": { "@babel/core": "^7.0.0", "babel-preset-fbjs": "^3.1.2", - "metro-babel-transformer": "0.55.0", - "metro-react-native-babel-preset": "0.55.0", - "metro-source-map": "0.55.0" + "metro-babel-transformer": "0.56.0", + "metro-react-native-babel-preset": "0.56.0", + "metro-source-map": "0.56.0" }, "dependencies": { - "metro-babel-transformer": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.55.0.tgz", - "integrity": "sha512-eKslZokx7g0xKinJztOGELlR5N3F9oKVN5Eb9srwgFlfldY2VXN1BIYj8EBKgCA7JWgK4Rqo18/r+u+ktXzlPA==", - "dev": true, - "requires": { - "@babel/core": "^7.0.0", - "metro-source-map": "0.55.0" - } - }, - "metro-source-map": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.55.0.tgz", - "integrity": "sha512-HZODA0KPl5onJNGIztfTHHWurR2nL6Je/X8wwj+bL4ZBB/hSMVeDk7rWReCAvO3twVz7Ztp8Si0jfMmmH4Ruuw==", - "dev": true, + "metro-react-native-babel-preset": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.56.0.tgz", + "integrity": "sha512-MAo1fm0dNn6MVZmylaz6k2HC1MINHLTLfE7O3a9Xz3fAtbGbApisp06rBUfK5uUqIJDmAaKgbiT34lHJSIiE6Q==", "requires": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.55.0", - "ob1": "0.55.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-assign": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.0.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" } } } }, "metro-resolver": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.56.3.tgz", - "integrity": "sha512-VvMl4xUp0fy76WiP3YDtzMmrn6tN/jwxOBqlTy9MjN6R9sUXrGyO5thwn/uKQqp5vwBTuJev7nZL7OKzwludKA==", - "dev": true, + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.56.4.tgz", + "integrity": "sha512-Ug4ulVfpkKZ1Wu7mdYj9XLGuOqZTuWCqEhyx3siKTc/2eBwKZQXmiNo5d/IxWNvmwL/87Abeb724I6CMzMfjiQ==", "requires": { "absolute-path": "^0.0.0" } }, "metro-source-map": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.56.3.tgz", - "integrity": "sha512-CheqWbJZSM0zjcNBqELUiocwH3XArrOk6alhVuzJ2gV/WTMBQFwP0TtQssSMwjnouMHNEzY8RxErXKXBk/zJmQ==", - "dev": true, + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.56.0.tgz", + "integrity": "sha512-W3c91L+CtbQTRxOrcVteCi5XlSXh+L0Zy85YBwm+FkWTKfrYjacr/yW1S9/LutpLgWE0W0VBeQeY++aRHwpx0g==", "requires": { "@babel/traverse": "^7.0.0", "@babel/types": "^7.0.0", "invariant": "^2.2.4", - "metro-symbolicate": "0.56.3", - "ob1": "0.56.3", + "metro-symbolicate": "0.56.0", + "ob1": "0.56.0", "source-map": "^0.5.6", "vlq": "^1.0.0" - }, - "dependencies": { - "metro-symbolicate": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.56.3.tgz", - "integrity": "sha512-fSQtjjy4eiJDThSl9eloxMElhrs+5PQB+DKKzmTFXT8e2GDga+pa1xTBFRUACMO8BXGuWmxR7SnGDw0wo5Ngrw==", - "dev": true, - "requires": { - "invariant": "^2.2.4", - "metro-source-map": "0.56.3", - "source-map": "^0.5.6", - "through2": "^2.0.1", - "vlq": "^1.0.0" - } - }, - "ob1": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.56.3.tgz", - "integrity": "sha512-3JL2ZyWOHDGTEAe4kcG+TxhGPKCCikgyoUIjE82JnXnmpR1LXItM9K3WhGsi4+O7oYngMW6FjpHHoc5xJTMkTQ==", - "dev": true - } } }, "metro-symbolicate": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.55.0.tgz", - "integrity": "sha512-3r3Gpv5L4U7rBGpIqw5S1nun5MelfUMLRiScJsPRGZVTX3WY1w+zpaQKlWBi5yuHf5dMQ+ZUVbhb02IdrfJ2Fg==", - "dev": true, + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.56.0.tgz", + "integrity": "sha512-5gJtwdSS0eYlTYB7PXatohBknz1sWUTfMBhwjn6zbgoyR6Apkpl2t2TfZxwfDTauhcEV1gRLmuodrVENs01r8g==", "requires": { - "metro-source-map": "0.55.0", + "invariant": "^2.2.4", + "metro-source-map": "0.56.0", "source-map": "^0.5.6", "through2": "^2.0.1", "vlq": "^1.0.0" - }, - "dependencies": { - "metro-source-map": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.55.0.tgz", - "integrity": "sha512-HZODA0KPl5onJNGIztfTHHWurR2nL6Je/X8wwj+bL4ZBB/hSMVeDk7rWReCAvO3twVz7Ztp8Si0jfMmmH4Ruuw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "invariant": "^2.2.4", - "metro-symbolicate": "0.55.0", - "ob1": "0.55.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - } - } } }, "microevent.ts": { @@ -31851,20 +40185,17 @@ "mime": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" }, "mime-db": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" }, "mime-types": { "version": "2.1.18", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, "requires": { "mime-db": "~1.33.0" } @@ -31872,8 +40203,7 @@ "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "mimic-response": { "version": "2.1.0", @@ -31970,7 +40300,6 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -31979,8 +40308,7 @@ "yallist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" } } }, @@ -32066,7 +40394,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, "requires": { "minipass": "^2.2.1" } @@ -32130,7 +40457,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" }, @@ -32138,8 +40464,7 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } }, @@ -32169,14 +40494,6 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==" }, - "moment-timezone": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.16.tgz", - "integrity": "sha512-4d1l92plNNqnMkqI/7boWNVXJvwGL2WyByl1Hxp3h/ao3HZiAqaoQY+6KBkYdiN5QtNDpndq+58ozl8W4GVoNw==", - "requires": { - "moment": ">= 2.9.0" - } - }, "moo": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", @@ -32187,7 +40504,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", - "dev": true, "requires": { "basic-auth": "~2.0.0", "debug": "2.6.9", @@ -32200,13 +40516,17 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } } } }, + "mousetrap": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", + "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==" + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -32272,8 +40592,7 @@ "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" }, "mz": { "version": "2.7.0", @@ -32289,8 +40608,12 @@ "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "nanoid": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.10.tgz", + "integrity": "sha512-iZFMXKeXWkxzlfmMfM91gw7YhN2sdJtixY+eZh9V6QWJWTOiurhpKhBMgr82pfzgSqglQgqYSCowEYsz8D++6w==" }, "nanomatch": { "version": "1.2.13", @@ -32341,7 +40664,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "dev": true, "requires": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", @@ -32352,7 +40674,6 @@ "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, "requires": { "ms": "^2.1.1" } @@ -32360,16 +40681,14 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "neo-async": { "version": "2.5.1", @@ -32430,13 +40749,9 @@ } }, "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, "node-fetch-npm": { "version": "2.0.2", @@ -32555,7 +40870,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.3.0.tgz", "integrity": "sha512-AhENzCSGZnZJgBARsUjnQ7DnZbzyP+HxlVXuD0xqAnvL8q+OqtSX7lGg9e8nHzwXkMMXNdVeqq4E2M3EUAqX6Q==", - "dev": true, "requires": { "growly": "^1.3.0", "semver": "^5.5.0", @@ -32566,8 +40880,7 @@ "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" } } }, @@ -33002,7 +41315,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, "requires": { "hosted-git-info": "^2.1.4", "is-builtin-module": "^1.0.0", @@ -33013,8 +41325,7 @@ "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" } } }, @@ -33047,8 +41358,7 @@ "npm-bundled": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==" }, "npm-lifecycle": { "version": "3.1.4", @@ -33691,7 +42001,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.4.tgz", "integrity": "sha512-zTLo8UcVYtDU3gdeaFu2Xu0n0EvelfHDGuqtNIn5RO7yQj4H1TqNdBc/yZjxnWA0PVB8D3Woyp0i5B43JwQ6Vw==", - "dev": true, "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1" @@ -33740,7 +42049,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -33760,8 +42068,7 @@ "nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" }, "num2fraction": { "version": "1.2.2", @@ -33772,8 +42079,7 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nwsapi": { "version": "2.2.0", @@ -33788,10 +42094,9 @@ "dev": true }, "ob1": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.55.0.tgz", - "integrity": "sha512-pfyiMVsUItl8WiRKMT15eCi662pCRAuYTq2+V3UpE+PpFErJI/TvRh/M/l/9TaLlbFr7krJ7gdl+FXJNcybmvw==", - "dev": true + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.56.0.tgz", + "integrity": "sha512-3rvepvXPw+OIkcut4MaRYIoy4thTWvWhTK+Hg4+y9fOBWVF9acpBvtm2NSbH9Vw9UBG/9v+T5euwPxUSUIDPWw==" }, "object-assign": { "version": "4.1.1", @@ -33941,8 +42246,7 @@ "on-headers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" }, "once": { "version": "1.4.0", @@ -33956,7 +42260,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, "requires": { "mimic-fn": "^1.0.0" } @@ -33965,7 +42268,6 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "dev": true, "requires": { "is-wsl": "^1.1.0" } @@ -34023,8 +42325,7 @@ "options": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" }, "ora": { "version": "4.0.2", @@ -34130,14 +42431,12 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, "requires": { "execa": "^0.7.0", "lcid": "^1.0.0", @@ -34148,7 +42447,6 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, "requires": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", @@ -34158,6 +42456,11 @@ "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" } } }, @@ -34174,14 +42477,12 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" @@ -34196,8 +42497,7 @@ "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" }, "p-each-series": { "version": "2.1.0", @@ -34222,14 +42522,12 @@ "p-is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, "requires": { "p-try": "^1.0.0" } @@ -34238,7 +42536,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, "requires": { "p-limit": "^1.1.0" } @@ -34294,8 +42591,7 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "p-waterfall": { "version": "1.0.0", @@ -34377,7 +42673,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, "requires": { "error-ex": "^1.2.0" } @@ -34385,8 +42680,7 @@ "parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" }, "parse-passwd": { "version": "1.0.0", @@ -34428,14 +42722,105 @@ "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, + "patch-package": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.2.2.tgz", + "integrity": "sha512-YqScVYkVcClUY0v8fF0kWOjDYopzIM8e3bj/RU1DPeEF14+dCGm6UeOYm4jvCyxqIEQ5/eJzmbWfDWnUleFNMg==", + "dev": true, + "requires": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "find-yarn-workspace-root": "^1.2.1", + "fs-extra": "^7.0.1", + "is-ci": "^2.0.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.0", + "rimraf": "^2.6.3", + "semver": "^5.6.0", + "slash": "^2.0.0", + "tmp": "^0.0.33" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, "path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", @@ -34535,13 +42920,13 @@ "picomatch": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", - "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==" + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "dev": true }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", @@ -34603,7 +42988,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", - "dev": true, "requires": { "base64-js": "^1.2.3", "xmlbuilder": "^9.0.7", @@ -34614,7 +42998,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, "requires": { "ansi-cyan": "^0.1.1", "ansi-red": "^0.1.1", @@ -34627,7 +43010,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, "requires": { "arr-flatten": "^1.0.1", "array-slice": "^0.2.3" @@ -34636,14 +43018,12 @@ "arr-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=" }, "extend-shallow": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, "requires": { "kind-of": "^1.1.0" } @@ -34651,8 +43031,7 @@ "kind-of": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" } } }, @@ -35707,7 +44086,6 @@ "version": "24.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.7.0.tgz", "integrity": "sha512-apen5cjf/U4dj7tHetpC7UEFCvtAgnNZnBDkfPv3fokzIqyOJckAG9OlAPC1BlFALnqT/lGB2tl9EJjlK6eCsA==", - "dev": true, "requires": { "@jest/types": "^24.7.0", "ansi-regex": "^4.0.0", @@ -35719,7 +44097,6 @@ "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", @@ -35730,7 +44107,6 @@ "version": "13.0.8", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", - "dev": true, "requires": { "@types/yargs-parser": "*" } @@ -35738,8 +44114,7 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" } } }, @@ -35761,8 +44136,7 @@ "private": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" }, "process": { "version": "0.11.10", @@ -36148,8 +44522,7 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { "version": "1.1.28", @@ -36399,9 +44772,9 @@ "dev": true }, "bl": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", - "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", + "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", "dev": true, "requires": { "buffer": "^5.5.0", @@ -36463,15 +44836,6 @@ "pend": "~1.2.0" } }, - "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, "https-proxy-agent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", @@ -36537,9 +44901,9 @@ } }, "tar-stream": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", - "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.3.tgz", + "integrity": "sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==", "dev": true, "requires": { "bl": "^4.0.1", @@ -36550,9 +44914,9 @@ } }, "ws": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", - "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", "dev": true }, "yauzl": { @@ -36591,8 +44955,7 @@ "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, "querystring-es3": { "version": "0.2.1", @@ -36665,8 +45028,7 @@ "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" }, "raw-body": { "version": "2.4.0", @@ -36742,7 +45104,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -36751,17 +45112,17 @@ } }, "re-resizable": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.0.0.tgz", - "integrity": "sha512-RTrnhbGgYyZ4hTc6db4JeMnRfmloEPWtuYaXZEa2PRaEC4mreWNFnZtMVsHil3z3iX+WchD+da8BLlTJBcstMA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.5.0.tgz", + "integrity": "sha512-jOUyas/4LyVLjFJokLbcUuO/BRpo4jUpBu6Ftx9GgA30mBMTw77z4dtVYc89yOkgwfzca3H3HAFuqZBCCugb5w==", "requires": { "fast-memoize": "^2.5.1" } }, "react": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", - "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -37088,7 +45449,6 @@ "version": "3.6.3", "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-3.6.3.tgz", "integrity": "sha512-+P+eFy/yo8Z/UH9J0DqHZuUM5+RI2wl249TNvMx3J2jpUomLQa4Zxl56GEotGfw3PIP1eI+hVf1s53FlUONStQ==", - "dev": true, "requires": { "shell-quote": "^1.6.1", "ws": "^3.3.1" @@ -37097,14 +45457,12 @@ "ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" }, "ws": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, "requires": { "async-limiter": "~1.0.0", "safe-buffer": "~5.1.0", @@ -37196,14 +45554,25 @@ } }, "react-dom": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", - "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.15.0" + "scheduler": "^0.19.1" + }, + "dependencies": { + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + } } }, "react-draggable": { @@ -37323,8 +45692,12 @@ "react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "dev": true + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-merge-refs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-1.0.0.tgz", + "integrity": "sha512-VkvWuCR5VoTjb+VYUcOjkFo66HDv1Hw8VjKcwQtWr2lJnT8g7epRRyfz8+Zkl2WhwqNeqR0gIe0XYrBa9ePeXg==" }, "react-moment-proptypes": { "version": "1.6.0", @@ -37338,7 +45711,6 @@ "version": "0.61.5", "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.61.5.tgz", "integrity": "sha512-MXqE3NoGO0T3dUKIKkIppijBhRRMpfN6ANbhMXHDuyfA+fSilRWgCwYgR/YNCC7ntECoJYikKaNTUBB0DeQy6Q==", - "dev": true, "requires": { "@babel/runtime": "^7.0.0", "@react-native-community/cli": "^3.0.0", @@ -37371,11 +45743,49 @@ "whatwg-fetch": "^3.0.0" }, "dependencies": { + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "@react-native-community/cli": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-3.0.4.tgz", - "integrity": "sha512-kt+ENtC+eRUSfWPbbpx3r7fAQDcFwgM03VW/lBdVAUjkNxffPFT2GGdK23CJSBOXTjRSiGuwhvwH4Z28PdrlRA==", - "dev": true, + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-3.2.1.tgz", + "integrity": "sha512-bZ/bfZ+9r1gQSxp6t7+00DcpC6vmbVYSvzUCFM/yo5k8bhsDdcy8aocscIaXXVGG+v9Edri/Q7hH9ks7L18/Rg==", "requires": { "@hapi/joi": "^15.0.3", "@react-native-community/cli-debugger-ui": "^3.0.0", @@ -37388,6 +45798,7 @@ "connect": "^3.6.5", "cosmiconfig": "^5.1.0", "deepmerge": "^3.2.0", + "didyoumean": "^1.2.1", "envinfo": "^7.1.0", "errorhandler": "^1.5.0", "execa": "^1.0.0", @@ -37408,6 +45819,7 @@ "open": "^6.2.0", "ora": "^3.4.0", "plist": "^3.0.0", + "pretty-format": "^25.1.0", "semver": "^6.3.0", "serve-static": "^1.13.1", "shell-quote": "1.6.1", @@ -37417,42 +45829,110 @@ "ws": "^1.1.0" }, "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } } } }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, "chardet": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "core-js": { "version": "2.6.11", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", - "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", - "dev": true + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", @@ -37464,7 +45944,6 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -37476,22 +45955,27 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, "deepmerge": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", - "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", - "dev": true + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==" }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", @@ -37506,7 +45990,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, "requires": { "chardet": "^0.4.0", "iconv-lite": "^0.4.17", @@ -37517,7 +46000,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-1.0.0.tgz", "integrity": "sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==", - "dev": true, "requires": { "core-js": "^2.4.1", "fbjs-css-vars": "^1.0.0", @@ -37533,7 +46015,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -37543,7 +46024,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -37554,16 +46034,19 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, "requires": { "pump": "^3.0.0" } }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, "requires": { "caller-path": "^2.0.0", "resolve-from": "^3.0.0" @@ -37573,7 +46056,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, "requires": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.0", @@ -37591,42 +46073,126 @@ "through": "^2.3.6" }, "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" } } } }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + } + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "requires": { "p-locate": "^4.1.0" } }, + "metro-babel-transformer": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.56.4.tgz", + "integrity": "sha512-IOi4ILgZvaX7GCGHBJp79paNVOq5QxhhbyqAdEJgDP8bHfl/OVHoVKSypfrsMSKSiBrqxhIjyc4XjkXsQtkx5g==", + "requires": { + "@babel/core": "^7.0.0", + "metro-source-map": "^0.56.4" + }, + "dependencies": { + "metro-source-map": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.56.4.tgz", + "integrity": "sha512-f1P9/rpFmG3Z0Jatiw2zvLItx1TwR7mXTSDj4qLDCWeVMB3kEXAr3R0ucumTW8c6HfpJljeRBWzYFXF33fd81g==", + "requires": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "^0.56.4", + "ob1": "^0.56.4", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + } + } + }, + "metro-cache": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.56.4.tgz", + "integrity": "sha512-d1hiUSKwtRsuMxUhHVJ3tjK2BbpUlJGvTyMWohK8Wxx+0GbnWRWWFcI4vlCzlZfoK0VtZK2MJEl5t7Du1mIniQ==", + "requires": { + "jest-serializer": "^24.4.0", + "metro-core": "^0.56.4", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4" + }, + "dependencies": { + "metro-core": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.56.4.tgz", + "integrity": "sha512-hMzkBdgPt5Zm9nr/1KtIT+A6H7TNiLVCEGG5OiAXj8gTRsA2yy7wAdQpwy0xbE+zi88t/pLOzXpd3ClG/YxyWg==", + "requires": { + "jest-haste-map": "^24.7.1", + "lodash.throttle": "^4.1.1", + "metro-resolver": "^0.56.4", + "wordwrap": "^1.0.0" + } + } + } + }, + "metro-inspector-proxy": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.56.4.tgz", + "integrity": "sha512-E1S3MO25mWKmcLn1UQuCDiS0hf9P2Fwq8sEAX5lBLoZbehepNH+4xJ3xXSY51JX4dozBrE8GGoKL4ll3II40LA==", + "requires": { + "connect": "^3.6.5", + "debug": "^2.2.0", + "rxjs": "^5.4.3", + "ws": "^1.1.5", + "yargs": "^9.0.0" + } + }, + "metro-minify-uglify": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.56.4.tgz", + "integrity": "sha512-BHgj7+BKEK2pHvWHUR730bIrsZwl8DPtr49x9L0j2grPZ5/UROWXzEr8VZgIss7fl64t845uu1HXNNyuSj2EhA==", + "requires": { + "uglify-es": "^3.1.9" + } + }, "metro-react-native-babel-preset": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.56.3.tgz", - "integrity": "sha512-tGPzX2ZwI8vQ8SiNVBPUIgKqmaRNVB6rtJtHCBQZAYRiMbxh0NHCUoFfKBej6U5qVgxiYYHyN8oB23evG4/Oow==", - "dev": true, + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.56.4.tgz", + "integrity": "sha512-CzbBDM9Rh6w8s1fq+ZqihAh7DDqUAcfo9pPww25+N/eJ7UK436Q7JdfxwdIPpBwLFn6o6MyYn+uwL9OEWBJarA==", "requires": { "@babel/plugin-proposal-class-properties": "^7.0.0", "@babel/plugin-proposal-export-default-from": "^7.0.0", @@ -37665,24 +46231,69 @@ "react-refresh": "^0.4.0" } }, - "metro-react-native-babel-transformer": { - "version": "0.56.3", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.56.3.tgz", - "integrity": "sha512-T87m4jDu0gIvJo8kWEvkodWFgQ8XBzJUESs1hUUTBSMIqTa31MdWfA1gs+MipadG7OsEJpcb9m83mGr8K70MWw==", - "dev": true, + "metro-resolver": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.56.4.tgz", + "integrity": "sha512-Ug4ulVfpkKZ1Wu7mdYj9XLGuOqZTuWCqEhyx3siKTc/2eBwKZQXmiNo5d/IxWNvmwL/87Abeb724I6CMzMfjiQ==", "requires": { - "@babel/core": "^7.0.0", - "babel-preset-fbjs": "^3.1.2", - "metro-babel-transformer": "0.56.3", - "metro-react-native-babel-preset": "0.56.3", - "metro-source-map": "0.56.3" + "absolute-path": "^0.0.0" } }, + "metro-symbolicate": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.56.4.tgz", + "integrity": "sha512-8mCNNn6zV5FFKCIcRgI7736Xl+owgvYuy8qanPxZN36f7utiWRYeB+PirEBPcglBk4qQvoy2lT6oPULNXZQbbQ==", + "requires": { + "invariant": "^2.2.4", + "metro-source-map": "^0.56.4", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "dependencies": { + "metro-source-map": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.56.4.tgz", + "integrity": "sha512-f1P9/rpFmG3Z0Jatiw2zvLItx1TwR7mXTSDj4qLDCWeVMB3kEXAr3R0ucumTW8c6HfpJljeRBWzYFXF33fd81g==", + "requires": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "^0.56.4", + "ob1": "^0.56.4", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + } + } + }, + "mime-db": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", + "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=" + }, + "mime-types": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", + "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", + "requires": { + "mime-db": "~1.23.0" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "ob1": { + "version": "0.56.4", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.56.4.tgz", + "integrity": "sha512-URgFof9z2wotiYFsqlydXtQfGV81gvBI2ODy64xfd3vPo+AYom5PVDX4t4zn23t/O+S2IxqApSQM8uJAybmz7w==" + }, "ora": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", - "dev": true, "requires": { "chalk": "^2.4.2", "cli-cursor": "^2.1.0", @@ -37690,26 +46301,12 @@ "log-symbols": "^2.2.0", "strip-ansi": "^5.2.0", "wcwidth": "^1.0.1" - }, - "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } } }, "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", - "dev": true, + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } @@ -37718,7 +46315,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "requires": { "p-limit": "^2.2.0" } @@ -37726,14 +46322,12 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -37742,36 +46336,134 @@ "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + } }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, - "react-refresh": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.2.tgz", - "integrity": "sha512-kv5QlFFSZWo7OlJFNYbxRtY66JImuP2LcrFgyJfQaf85gSP+byzG21UbDQEYjU7f//ny8rwiEkO6py2Y+fEgAQ==", - "dev": true + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "requires": { + "symbol-observable": "1.0.1" + } }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, "requires": { "ansi-regex": "^4.1.0" }, @@ -37779,26 +46471,276 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" } } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, "whatwg-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", - "dev": true + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } }, "ws": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", - "dev": true, "requires": { "options": ">=0.0.5", "ultron": "1.0.x" } + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "react-native-animatable": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/react-native-animatable/-/react-native-animatable-1.3.3.tgz", + "integrity": "sha512-2ckIxZQAsvWn25Ho+DK3d1mXIgj7tITkrS4pYDvx96WyOttSvzzFeQnM2od0+FUMzILbdHDsDEqZvnz1DYNQ1w==", + "requires": { + "prop-types": "^15.7.2" + } + }, + "react-native-dark-mode": { + "version": "git+https://github.com/wordpress-mobile/react-native-dark-mode.git#f09bf1480e7b34536413ab3300f29e4375edb2c6", + "from": "git+https://github.com/wordpress-mobile/react-native-dark-mode.git#f09bf1480e7b34536413ab3300f29e4375edb2c6", + "requires": { + "@types/events": "^3.0.0", + "@types/react": "^16.8.19", + "@types/react-native": "^0.57.60", + "events": "3.0.0", + "toolkit.ts": "0.0.2" + }, + "dependencies": { + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==" + } + } + }, + "react-native-gesture-handler": { + "version": "git+https://github.com/wordpress-mobile/react-native-gesture-handler.git#b80e959908b383a26d6e35d992d6d529efad0b16", + "from": "git+https://github.com/wordpress-mobile/react-native-gesture-handler.git#b80e959908b383a26d6e35d992d6d529efad0b16", + "requires": { + "@egjs/hammerjs": "^2.0.17", + "hoist-non-react-statics": "^2.3.1", + "invariant": "^2.2.4", + "prop-types": "^15.7.2" + } + }, + "react-native-get-random-values": { + "version": "git+https://github.com/wordpress-mobile/react-native-get-random-values.git#f03f2c16414aff4ea76064dcd00a9e3c6efc838d", + "from": "git+https://github.com/wordpress-mobile/react-native-get-random-values.git#f03f2c16414aff4ea76064dcd00a9e3c6efc838d", + "requires": { + "fast-base64-decode": "^1.0.0" + } + }, + "react-native-hr": { + "version": "git+https://github.com/Riglerr/react-native-hr.git#2d01a5cf77212d100e8b99e0310cce5234f977b3", + "from": "git+https://github.com/Riglerr/react-native-hr.git#2d01a5cf77212d100e8b99e0310cce5234f977b3" + }, + "react-native-hsv-color-picker": { + "version": "git+https://github.com/wordpress-mobile/react-native-hsv-color-picker.git#163e78cd4d986a28954a626213b40daee15774e8", + "from": "git+https://github.com/wordpress-mobile/react-native-hsv-color-picker.git", + "requires": { + "react-native-linear-gradient": "git+https://github.com/wordpress-mobile/react-native-linear-gradient.git#52bf43077171cff8714ce3e0155f3ebb7f55bc37", + "tinycolor2": "^1.4.1" + } + }, + "react-native-iphone-x-helper": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.2.1.tgz", + "integrity": "sha512-/VbpIEp8tSNNHIvstuA3Swx610whci1Zpc9mqNkqn14DkMbw+ORviln2u0XyHG1kPvvwTNGZY6QpeFwxYaSdbQ==" + }, + "react-native-keyboard-aware-scroll-view": { + "version": "git+https://github.com/wordpress-mobile/react-native-keyboard-aware-scroll-view.git#678a4d459caa2f7f448202574dddc6a19954500c", + "from": "git+https://github.com/wordpress-mobile/react-native-keyboard-aware-scroll-view.git#gb-v0.8.8", + "requires": { + "prop-types": "^15.6.2", + "react-native-iphone-x-helper": "^1.0.3" + } + }, + "react-native-linear-gradient": { + "version": "git+https://github.com/wordpress-mobile/react-native-linear-gradient.git#52bf43077171cff8714ce3e0155f3ebb7f55bc37", + "from": "git+https://github.com/wordpress-mobile/react-native-linear-gradient.git#52bf43077171cff8714ce3e0155f3ebb7f55bc37" + }, + "react-native-modal": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/react-native-modal/-/react-native-modal-6.5.0.tgz", + "integrity": "sha512-ewchdETAGd32xLGLK93NETEGkRcePtN7ZwjmLSQnNW1Zd0SRUYE8NqftjamPyfKvK0i2DZjX4YAghGZTqaRUbA==", + "requires": { + "prop-types": "^15.6.1", + "react-native-animatable": "^1.2.4" + } + }, + "react-native-reanimated": { + "version": "git+https://github.com/wordpress-mobile/react-native-reanimated.git#ed48f510fba751cd75da7629e92276166766be91", + "from": "git+https://github.com/wordpress-mobile/react-native-reanimated.git#ed48f510fba751cd75da7629e92276166766be91", + "requires": { + "fbjs": "^1.0.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "fbjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-1.0.0.tgz", + "integrity": "sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==", + "requires": { + "core-js": "^2.4.1", + "fbjs-css-vars": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + } + } + }, + "react-native-safe-area": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/react-native-safe-area/-/react-native-safe-area-0.5.1.tgz", + "integrity": "sha512-gBLv93P90sM6hk5HzUwTXzFuSDazTpg2ONi5iL9pnUsUfwdw2L9SKgjgVroxX10leGB9+0zz6/ycV+mItqr8OQ==", + "requires": { + "@types/react": "^16.8.8" + } + }, + "react-native-safe-area-context": { + "version": "git+https://github.com/wordpress-mobile/react-native-safe-area-context.git#1e3c0d34f31b59fb79f71ec0b4c39c513f684871", + "from": "git+https://github.com/wordpress-mobile/react-native-safe-area-context.git#1e3c0d34f31b59fb79f71ec0b4c39c513f684871" + }, + "react-native-sass-transformer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/react-native-sass-transformer/-/react-native-sass-transformer-1.4.0.tgz", + "integrity": "sha512-PlRiaJIcDzYpIVDH0OQuabkMGy/zp7N/A14rqhBrFqhADXC0xR2W53Cb7CicL9CsOL4y7Sh2dv4pgMvqgMdwqQ==", + "requires": { + "app-root-path": "^2.1.0", + "css-to-react-native-transform": "^1.8.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "react-native-screens": { + "version": "git+https://github.com/wordpress-mobile/react-native-screens.git#835843f4c3697bba5c330d05d8fc270d50ca9d2a", + "from": "git+https://github.com/wordpress-mobile/react-native-screens.git#835843f4c3697bba5c330d05d8fc270d50ca9d2a" + }, + "react-native-svg": { + "version": "git+https://github.com/wordpress-mobile/react-native-svg.git#a628e92990a2404e30a0086f168bd2b5b7b4ce96", + "from": "git+https://github.com/wordpress-mobile/react-native-svg.git#a628e92990a2404e30a0086f168bd2b5b7b4ce96", + "requires": { + "css-select": "^2.0.2", + "css-tree": "^1.0.0-alpha.37" + }, + "dependencies": { + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz", + "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==" + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==" + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -37822,6 +46764,13 @@ } } }, + "react-native-video": { + "version": "git+https://github.com/wordpress-mobile/react-native-video.git#1b964b107863351ed744fc104d7952bbec3e2d4f", + "from": "git+https://github.com/wordpress-mobile/react-native-video.git#1b964b107863351ed744fc104d7952bbec3e2d4f", + "requires": { + "prop-types": "^15.5.10" + } + }, "react-outside-click-handler": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/react-outside-click-handler/-/react-outside-click-handler-1.2.2.tgz", @@ -37919,10 +46868,9 @@ } }, "react-refresh": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.2.0.tgz", - "integrity": "sha512-ITw8t/HOFNose2yf1y9pPFSSeB9ISOq2JdHpuZvj/Qb+iSsLml8GkkHdDlURzieO7B3dFDtMrrneZLl3N5z/hg==", - "dev": true + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.2.tgz", + "integrity": "sha512-kv5QlFFSZWo7OlJFNYbxRtY66JImuP2LcrFgyJfQaf85gSP+byzG21UbDQEYjU7f//ny8rwiEkO6py2Y+fEgAQ==" }, "react-resize-aware": { "version": "3.0.1", @@ -37980,22 +46928,32 @@ } }, "react-test-renderer": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.9.0.tgz", - "integrity": "sha512-R62stB73qZyhrJo7wmCW9jgl/07ai+YzvouvCXIJLBkRlRqLx4j9RqcLEAfNfU3OxTGucqR2Whmn3/Aad6L3hQ==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.13.1.tgz", + "integrity": "sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ==", "dev": true, "requires": { "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "react-is": "^16.9.0", - "scheduler": "^0.15.0" + "react-is": "^16.8.6", + "scheduler": "^0.19.1" }, "dependencies": { "react-is": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", - "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true + }, + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } } } }, @@ -38013,7 +46971,6 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", - "dev": true, "requires": { "dom-helpers": "^3.4.0", "loose-envify": "^1.4.0", @@ -38348,14 +47305,12 @@ "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", - "dev": true + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" }, "regenerate-unicode-properties": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", - "dev": true, "requires": { "regenerate": "^1.4.0" } @@ -38363,14 +47318,12 @@ "regenerator-runtime": { "version": "0.13.2", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", - "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", - "dev": true + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" }, "regenerator-transform": { "version": "0.14.4", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", - "dev": true, "requires": { "@babel/runtime": "^7.8.4", "private": "^0.1.8" @@ -38510,7 +47463,6 @@ "version": "4.7.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", - "dev": true, "requires": { "regenerate": "^1.4.0", "regenerate-unicode-properties": "^8.2.0", @@ -38529,14 +47481,12 @@ "regjsgen": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", - "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", - "dev": true + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" }, "regjsparser": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", - "dev": true, "requires": { "jsesc": "~0.5.0" }, @@ -38544,8 +47494,7 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" } } }, @@ -38991,8 +47940,7 @@ "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "requireindex": { "version": "1.2.0", @@ -39081,8 +48029,7 @@ "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" }, "resolve-url": { "version": "0.2.1", @@ -39102,7 +48049,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" @@ -39243,7 +48189,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, "requires": { "is-promise": "^2.1.0" }, @@ -39251,8 +48196,7 @@ "is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" } } }, @@ -39291,14 +48235,12 @@ "rx-lite": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" }, "rx-lite-aggregates": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, "requires": { "rx-lite": "*" } @@ -39605,8 +48547,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "saxes": { "version": "3.1.11", @@ -39679,7 +48620,6 @@ "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -39700,7 +48640,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -39708,16 +48647,14 @@ "mime": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" } } }, "serialize-error": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=", - "dev": true + "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=" }, "serialize-javascript": { "version": "1.5.0", @@ -39756,7 +48693,6 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -39803,8 +48739,7 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "sha.js": { "version": "2.4.11", @@ -39848,7 +48783,6 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true, "requires": { "array-filter": "~0.0.0", "array-map": "~0.0.0", @@ -39859,8 +48793,7 @@ "array-filter": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" } } }, @@ -39878,8 +48811,7 @@ "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" }, "showdown": { "version": "1.9.1", @@ -40174,7 +49106,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.0.tgz", "integrity": "sha512-2i5Tc0BYAqppM7jVzmNrI+aEUntPolIq4fDgji6WuNNn1D/qYdn2KwoLhZdzQkE04lu9L5tUoeJsjuJAvd+lFg==", - "dev": true, "requires": { "bplist-creator": "0.0.8", "bplist-parser": "0.2.0", @@ -40185,7 +49116,6 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dev": true, "requires": { "is-arrayish": "^0.3.1" }, @@ -40193,8 +49123,7 @@ "is-arrayish": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" } } }, @@ -40243,8 +49172,7 @@ "slide": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" }, "smart-buffer": { "version": "4.0.2", @@ -40473,7 +49401,6 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -40482,8 +49409,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -40528,7 +49454,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -40537,14 +49462,12 @@ "spdx-exceptions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -40553,8 +49476,7 @@ "spdx-license-ids": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" }, "specificity": { "version": "0.4.1", @@ -40571,6 +49493,11 @@ "through": "2" } }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -40634,7 +49561,6 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.8.tgz", "integrity": "sha512-ig5rHJSdJrAsVqdb3oAI/8C6aQ7dEwJXoy/TIEIOTzdJHssmn12o6RsFoeQSLHoKjq0lX+kqhmnLDpyQTuWiJA==", - "dev": true, "requires": { "type-fest": "^0.7.1" }, @@ -40642,8 +49568,7 @@ "type-fest": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" } } }, @@ -40675,8 +49600,7 @@ "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" }, "stdout-stream": { "version": "1.4.1", @@ -40712,8 +49636,7 @@ "stream-buffers": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", - "dev": true + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=" }, "stream-each": { "version": "1.2.2", @@ -40793,7 +49716,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -41573,7 +50495,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -41595,7 +50516,8 @@ "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true }, "strip-indent": { "version": "2.0.0", @@ -41606,8 +50528,7 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "strong-log-transformer": { "version": "2.1.0", @@ -42177,8 +51098,7 @@ "sudo-prompt": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz", - "integrity": "sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==", - "dev": true + "integrity": "sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==" }, "sugarss": { "version": "2.0.0", @@ -42707,7 +51627,6 @@ "version": "0.8.3", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "dev": true, "requires": { "os-tmpdir": "^1.0.0", "rimraf": "~2.2.6" @@ -42716,8 +51635,7 @@ "rimraf": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" } } }, @@ -42823,75 +51741,105 @@ } }, "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.3.tgz", + "integrity": "sha512-bZFnotuIKq5Rqzrs+qIwFzGdKdffV9epG5vDSEbYzvKAhPeR5RbbrQysfPgbIIMhNAQtZD2hGwBfSKUXjXZZZw==", "dev": true, "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", + "cacache": "^15.0.4", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.0.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.6.6", + "serialize-javascript": "^3.1.0", "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "terser": "^4.6.13", + "webpack-sources": "^1.4.3" }, "dependencies": { - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } }, "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.4.tgz", + "integrity": "sha512-YlnKQqTbD/6iyoJvEY3KJftjrdBYroCbxxYXzhOzsFLWlp6KX4BOlEf4mTx0cMUfVaTS3ENL2QtDWeRYoGLkkw==", "dev": true, "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", + "infer-owner": "^1.0.4", "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" } }, "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "dev": true, "requires": { "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" } }, "glob": { @@ -42908,20 +51856,29 @@ "path-is-absolute": "^1.0.0" } }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "jest-worker": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", + "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lru-cache": { @@ -42931,52 +51888,81 @@ "dev": true, "requires": { "yallist": "^3.0.2" + }, + "dependencies": { + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" } }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "dev": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" } }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" } }, "p-try": { @@ -42985,51 +51971,46 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "find-up": "^4.0.0" } }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", "dev": true, "requires": { - "glob": "^7.1.3" + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } }, "source-map": { "version": "0.6.1", @@ -43038,12 +52019,46 @@ "dev": true }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "minipass": "^3.1.1" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tar": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", + "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "terser": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", + "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" } }, "unique-filename": { @@ -43065,16 +52080,10 @@ "source-map": "~0.6.1" } }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } @@ -43083,6 +52092,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -43093,6 +52103,7 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -43156,8 +52167,7 @@ "throat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", - "dev": true + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" }, "throttle-debounce": { "version": "2.1.0", @@ -43168,14 +52178,12 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, "requires": { "readable-stream": "^2.1.5", "xtend": "~4.0.1" @@ -43184,8 +52192,7 @@ "time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" }, "timers-browserify": { "version": "2.0.11", @@ -43236,7 +52243,6 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -43324,6 +52330,11 @@ "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=", "dev": true }, + "toolkit.ts": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/toolkit.ts/-/toolkit.ts-0.0.2.tgz", + "integrity": "sha512-yJJTVbCwiD6AfFgReewJCGJuODmyZUeL1sDjnxp33t0UBxnezgQrLbz/F9++RC28CTlk5u5pVji4TbeondYEkw==" + }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", @@ -43528,13 +52539,13 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, "requires": { "is-typedarray": "^1.0.0" } @@ -43560,7 +52571,6 @@ "version": "3.3.9", "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, "requires": { "commander": "~2.13.0", "source-map": "~0.6.1" @@ -43569,14 +52579,12 @@ "commander": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -43623,8 +52631,7 @@ "ultron": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" }, "umask": { "version": "1.1.0", @@ -43679,14 +52686,12 @@ "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", - "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", - "dev": true + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" }, "unicode-match-property-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", - "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^1.0.4", "unicode-property-aliases-ecmascript": "^1.0.4" @@ -43695,14 +52700,12 @@ "unicode-match-property-value-ecmascript": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", - "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", - "dev": true + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" }, "unicode-property-aliases-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz", - "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==", - "dev": true + "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==" }, "unified": { "version": "7.1.0", @@ -43876,14 +52879,12 @@ "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unquote": { "version": "1.1.1", @@ -44080,6 +53081,14 @@ "tslib": "^1.9.3" } }, + "use-subscription": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.4.1.tgz", + "integrity": "sha512-7+IIwDG/4JICrWHL/Q/ZPK5yozEnvRm6vHImu0LKwQlmWGKeiF7mbAenLlK/cTNXrTtXHU/SFASQHzB6+oSJMQ==", + "requires": { + "object-assign": "^4.1.1" + } + }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", @@ -44122,8 +53131,7 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { "version": "7.0.2", @@ -44168,7 +53176,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -44183,11 +53190,16 @@ "builtins": "^1.0.3" } }, + "vargs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz", + "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=", + "dev": true + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "vendors": { "version": "1.0.2", @@ -44244,8 +53256,7 @@ "vlq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==" }, "vm-browserify": { "version": "1.1.2", @@ -44468,11 +53479,25 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, "requires": { "defaults": "^1.0.3" } }, + "wd": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/wd/-/wd-1.12.1.tgz", + "integrity": "sha512-O99X8OnOgkqfmsPyLIRzG9LmZ+rjmdGFBCyhGpnsSL4MB4xzHoeWmSVcumDiQ5QqPZcwGkszTgeJvjk2VjtiNw==", + "dev": true, + "requires": { + "archiver": "^3.0.0", + "async": "^2.0.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.1", + "q": "^1.5.1", + "request": "2.88.0", + "vargs": "^0.1.0" + } + }, "web-namespaces": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.3.tgz", @@ -44528,12 +53553,87 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, "emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -44554,24 +53654,179 @@ "json5": "^1.0.1" } }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, "tapable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, + "terser-webpack-plugin": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", + "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^3.1.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, "webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -44581,6 +53836,18 @@ "source-list-map": "^2.0.0", "source-map": "~0.6.1" } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, @@ -45172,7 +54439,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, "requires": { "string-width": "^1.0.2 || 2" } @@ -45340,8 +54606,7 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, "worker-farm": { "version": "1.7.0", @@ -45365,7 +54630,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -45374,14 +54638,12 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -45390,7 +54652,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -45401,7 +54662,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -45514,7 +54774,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.1.0.tgz", "integrity": "sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ==", - "dev": true, "requires": { "simple-plist": "^1.0.0", "uuid": "^3.3.2" @@ -45523,8 +54782,7 @@ "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, @@ -45543,8 +54801,7 @@ "xmlbuilder": { "version": "9.0.7", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, "xmlchars": { "version": "2.2.0", @@ -45556,7 +54813,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", - "dev": true, "requires": { "sax": "^1.2.1" } @@ -45564,14 +54820,12 @@ "xmldom": { "version": "0.1.31", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", - "dev": true + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" }, "xpipe": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/xpipe/-/xpipe-1.0.5.tgz", - "integrity": "sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98=", - "dev": true + "integrity": "sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98=" }, "xregexp": { "version": "4.3.0", @@ -45585,20 +54839,17 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yaml": { "version": "1.7.2", @@ -45765,6 +55016,30 @@ "fd-slicer": "~1.0.1" } }, + "zip-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.3.tgz", + "integrity": "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q==", + "dev": true, + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^2.1.1", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "zwitch": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.4.tgz", diff --git a/package.json b/package.json index 7aa809b901375..87760d2415900 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gutenberg", - "version": "8.3.0", + "version": "8.9.1", "private": true, "description": "A new WordPress editor experience.", "author": "The WordPress Contributors", @@ -14,6 +14,10 @@ "bugs": { "url": "https://github.com/WordPress/gutenberg/issues" }, + "engines": { + "node": ">=10.0.0", + "npm": ">=6.9.0" + }, "config": { "GUTENBERG_PHASE": 2 }, @@ -61,6 +65,9 @@ "@wordpress/plugins": "file:packages/plugins", "@wordpress/primitives": "file:packages/primitives", "@wordpress/priority-queue": "file:packages/priority-queue", + "@wordpress/react-native-aztec": "file:packages/react-native-aztec", + "@wordpress/react-native-bridge": "file:packages/react-native-bridge", + "@wordpress/react-native-editor": "file:packages/react-native-editor", "@wordpress/redux-routine": "file:packages/redux-routine", "@wordpress/rich-text": "file:packages/rich-text", "@wordpress/server-side-render": "file:packages/server-side-render", @@ -126,6 +133,8 @@ "@wordpress/prettier-config": "file:packages/prettier-config", "@wordpress/project-management-automation": "file:packages/project-management-automation", "@wordpress/scripts": "file:packages/scripts", + "appium": "1.17.1", + "babel-jest": "25.3.0", "babel-loader": "8.1.0", "babel-plugin-emotion": "10.0.33", "babel-plugin-inline-json-import": "0.3.2", @@ -133,7 +142,7 @@ "babel-plugin-react-native-platform-specific-extensions": "1.1.1", "babel-plugin-require-context-hook": "1.0.0", "benchmark": "2.1.4", - "browserslist": "4.9.1", + "browserslist": "4.14.0", "chalk": "4.0.0", "commander": "4.1.0", "concurrently": "3.5.0", @@ -143,6 +152,7 @@ "cssnano": "4.1.10", "deep-freeze": "0.0.1", "enzyme": "3.11.0", + "equivalent-key-map": "0.2.2", "eslint-plugin-eslint-comments": "3.1.2", "eslint-plugin-import": "2.20.2", "execa": "4.0.2", @@ -150,29 +160,32 @@ "glob": "7.1.2", "husky": "3.0.5", "inquirer": "7.1.0", + "jest": "25.3.0", "jest-emotion": "10.0.32", "jest-junit": "10.0.0", "jest-serializer-enzyme": "1.0.0", + "jest-watch-typeahead": "0.6.0", "jsdom": "15.2.1", "lerna": "3.18.2", "lint-staged": "9.2.5", - "lodash": "4.17.15", + "lodash": "4.17.19", "make-dir": "3.0.0", - "metro-react-native-babel-preset": "0.55.0", - "metro-react-native-babel-transformer": "0.55.0", + "metro-react-native-babel-preset": "0.57.0", + "metro-react-native-babel-transformer": "0.56.0", "mkdirp": "0.5.1", "nock": "12.0.3", "node-sass": "4.13.1", "node-watch": "0.6.0", + "patch-package": "6.2.2", "postcss": "7.0.32", "postcss-loader": "3.0.0", "prettier": "npm:wp-prettier@2.0.5", "progress": "2.0.3", "puppeteer": "npm:puppeteer-core@3.0.0", - "react": "16.9.0", - "react-dom": "16.9.0", + "react": "16.13.1", + "react-dom": "16.13.1", "react-native": "0.61.5", - "react-test-renderer": "16.9.0", + "react-test-renderer": "16.13.1", "rimraf": "3.0.2", "rtlcss": "2.4.0", "sass-loader": "8.0.2", @@ -182,14 +195,15 @@ "sprintf-js": "1.1.1", "style-loader": "1.0.0", "stylelint-config-wordpress": "17.0.0", + "terser-webpack-plugin": "3.0.3", "typescript": "3.8.3", "uuid": "7.0.2", + "wd": "1.12.1", "webpack": "4.42.0", "worker-farm": "1.7.0" }, "scripts": { "analyze-bundles": "npm run build -- --webpack-bundle-analyzer", - "prebuild": "npm run check-engines", "clean:packages": "rimraf \"./packages/*/@(build|build-module|build-style)\"", "clean:package-types": "tsc --build --clean", "prebuild:packages": "npm run clean:packages && lerna run build", @@ -198,11 +212,9 @@ "build:plugin-zip": "./bin/build-plugin-zip.sh", "build": "npm run build:packages && wp-scripts build", "changelog": "./bin/plugin/cli.js changelog", - "check-engines": "wp-scripts check-engines", - "check-licenses": "concurrently \"wp-scripts check-licenses --prod --gpl2\" \"wp-scripts check-licenses --dev\"", + "check-licenses": "concurrently \"wp-scripts check-licenses --prod --gpl2 --ignore=@react-native-community/cli,@react-native-community/cli-platform-ios\" \"wp-scripts check-licenses --dev\"", "precheck-local-changes": "npm run docs:build", - "check-local-changes": "( git diff -U0 | xargs -0 node bin/process-git-diff ) || ( echo \"There are local uncommitted changes after one or both of 'npm install' or 'npm run docs:build'!\" && exit 1 );", - "predev": "npm run check-engines", + "check-local-changes": "( git diff -U0 | xargs -0 node bin/process-git-diff ) || ( echo \"There are local uncommitted changes after one or both of 'npm install' or 'npm run docs:build'!\" && git diff --exit-code && exit 1 );", "dev": "npm run build:packages && concurrently \"wp-scripts start\" \"npm run dev:packages\"", "dev:packages": "node ./bin/packages/watch.js", "docs:build": "node ./docs/tool/index.js && node ./bin/api-docs/update-api-docs.js", @@ -213,17 +225,19 @@ "lint": "concurrently \"npm run lint-lockfile\" \"npm run lint-js\" \"npm run lint-pkg-json\" \"npm run lint-css\"", "lint-js": "wp-scripts lint-js", "lint-js:fix": "npm run lint-js -- --fix", - "prelint-php": "npm run wp-env run composer install -- --no-interaction", - "lint-php": "npm run wp-env run composer run-script lint", + "prelint-php": "wp-env run composer 'install --no-interaction'", + "lint-php": "wp-env run composer run-script lint", "lint-pkg-json": "wp-scripts lint-pkg-json . 'packages/*/package.json'", "lint-lockfile": "node ./bin/validate-package-lock.js", "lint-css": "wp-scripts lint-style '**/*.scss'", "lint-css:fix": "npm run lint-css -- --fix", "lint:md-js": "wp-scripts lint-md-js", "lint:md-docs": "wp-scripts lint-md-docs", + "native": "npm run --prefix packages/react-native-editor", "pot-to-php": "./bin/pot-to-php.js", + "postinstall": "patch-package", "publish:check": "lerna updated", - "publish:dev": "npm run clean:package-types && npm run build:packages && lerna publish --dist-tag next", + "publish:dev": "npm run clean:package-types && npm run build:packages && lerna publish prerelease --preid rc --dist-tag next", "publish:patch": "npm run clean:package-types && npm run build:packages && lerna publish --dist-tag patch", "publish:prod": "npm run clean:package-types && npm run build:packages && lerna publish", "test": "npm run lint && npm run test-unit", @@ -237,10 +251,12 @@ "test-unit:debug": "wp-scripts --inspect-brk test-unit-js --runInBand --no-cache --verbose --config test/unit/jest.config.js ", "test-unit:update": "npm run test-unit -- --updateSnapshot", "test-unit:watch": "npm run test-unit -- --watch", + "pretest-unit-php": "wp-env start", "test-unit-php": "wp-env run phpunit 'phpunit -c /var/www/html/wp-content/plugins/gutenberg/phpunit.xml.dist --verbose'", + "pretest-unit-php-multisite": "wp-env start", "test-unit-php-multisite": "wp-env run phpunit 'WP_MULTISITE=1 phpunit -c /var/www/html/wp-content/plugins/gutenberg/phpunit/multisite.xml --verbose'", "test-unit:native": "cd test/native/ && cross-env NODE_ENV=test jest --config ./jest.config.js", - "test-unit:native:debug": "cd test/native/ && node --inspect-brk ../../node_modules/.bin/jest --runInBand --verbose --config ./jest.config.js", + "test-unit:native:debug": "cd test/native/ && node --inspect ../../node_modules/.bin/jest --runInBand --config ./jest.config.js", "prestorybook:build": "npm run build:packages", "storybook:build": "build-storybook -c ./storybook -o ./playground/dist", "prestorybook:dev": "npm run build:packages", diff --git a/packages/a11y/package.json b/packages/a11y/package.json index d92b2523b1883..7afe03920c5e7 100644 --- a/packages/a11y/package.json +++ b/packages/a11y/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/a11y", - "version": "2.10.0", + "version": "2.11.0", "description": "Accessibility (a11y) utilities for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/annotations/package.json b/packages/annotations/package.json index 0def313df11c5..c09a275427227 100644 --- a/packages/annotations/package.json +++ b/packages/annotations/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/annotations", - "version": "1.18.0", + "version": "1.20.3", "description": "Annotate content in the Gutenberg editor.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", @@ -27,7 +27,7 @@ "@wordpress/hooks": "file:../hooks", "@wordpress/i18n": "file:../i18n", "@wordpress/rich-text": "file:../rich-text", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "rememo": "^3.0.0", "uuid": "^7.0.2" }, diff --git a/packages/annotations/src/store/reducer.js b/packages/annotations/src/store/reducer.js index 0756c3f3d8eac..d8e3c4e7451d9 100644 --- a/packages/annotations/src/store/reducer.js +++ b/packages/annotations/src/store/reducer.js @@ -1,7 +1,7 @@ /** * External dependencies */ -import { get, isNumber, mapValues } from 'lodash'; +import { isNumber, mapValues } from 'lodash'; /** * Filters an array based on the predicate, but keeps the reference the same if @@ -37,7 +37,7 @@ function isValidAnnotationRange( annotation ) { /** * Reducer managing annotations. * - * @param {Array} state The annotations currently shown in the editor. + * @param {Object} state The annotations currently shown in the editor. * @param {Object} action Dispatched action. * * @return {Array} Updated state. @@ -62,7 +62,7 @@ export function annotations( state = {}, action ) { return state; } - const previousAnnotationsForBlock = get( state, blockClientId, [] ); + const previousAnnotationsForBlock = state?.[ blockClientId ] ?? []; return { ...state, diff --git a/packages/annotations/src/store/selectors.js b/packages/annotations/src/store/selectors.js index 3c760311b7872..fd5a2d2fccfaf 100644 --- a/packages/annotations/src/store/selectors.js +++ b/packages/annotations/src/store/selectors.js @@ -2,7 +2,7 @@ * External dependencies */ import createSelector from 'rememo'; -import { get, flatMap } from 'lodash'; +import { flatMap } from 'lodash'; /** * Shared reference to an empty array for cases where it is important to avoid @@ -25,18 +25,18 @@ const EMPTY_ARRAY = []; */ export const __experimentalGetAnnotationsForBlock = createSelector( ( state, blockClientId ) => { - return get( state, blockClientId, [] ).filter( ( annotation ) => { + return ( state?.[ blockClientId ] ?? [] ).filter( ( annotation ) => { return annotation.selector === 'block'; } ); }, - ( state, blockClientId ) => [ get( state, blockClientId, EMPTY_ARRAY ) ] + ( state, blockClientId ) => [ state?.[ blockClientId ] ?? EMPTY_ARRAY ] ); export function __experimentalGetAllAnnotationsForBlock( state, blockClientId ) { - return get( state, blockClientId, EMPTY_ARRAY ); + return state?.[ blockClientId ] ?? EMPTY_ARRAY; } /** @@ -53,7 +53,7 @@ export function __experimentalGetAllAnnotationsForBlock( */ export const __experimentalGetAnnotationsForRichText = createSelector( ( state, blockClientId, richTextIdentifier ) => { - return get( state, blockClientId, [] ) + return ( state?.[ blockClientId ] ?? [] ) .filter( ( annotation ) => { return ( annotation.selector === 'range' && @@ -69,7 +69,7 @@ export const __experimentalGetAnnotationsForRichText = createSelector( }; } ); }, - ( state, blockClientId ) => [ get( state, blockClientId, EMPTY_ARRAY ) ] + ( state, blockClientId ) => [ state?.[ blockClientId ] ?? EMPTY_ARRAY ] ); /** diff --git a/packages/api-fetch/package.json b/packages/api-fetch/package.json index dd6506ab8b84a..1ef11900d6bd9 100644 --- a/packages/api-fetch/package.json +++ b/packages/api-fetch/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/api-fetch", - "version": "3.17.0", + "version": "3.18.0", "description": "Utility to make WordPress REST API requests.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/api-fetch/src/index.js b/packages/api-fetch/src/index.js index b9fe1a6d0875a..a77a6295637a9 100644 --- a/packages/api-fetch/src/index.js +++ b/packages/api-fetch/src/index.js @@ -120,36 +120,28 @@ function setFetchHandler( newFetchHandler ) { } function apiFetch( options ) { - const steps = [ ...middlewares, fetchHandler ]; - - const createRunStep = ( index ) => ( workingOptions ) => { - const step = steps[ index ]; - if ( index === steps.length - 1 ) { - return step( workingOptions ); + // creates a nested function chain that calls all middlewares and finally the `fetchHandler`, + // converting `middlewares = [ m1, m2, m3 ]` into: + // ``` + // opts1 => m1( opts1, opts2 => m2( opts2, opts3 => m3( opts3, fetchHandler ) ) ); + // ``` + const enhancedHandler = middlewares.reduceRight( ( next, middleware ) => { + return ( workingOptions ) => middleware( workingOptions, next ); + }, fetchHandler ); + + return enhancedHandler( options ).catch( ( error ) => { + if ( error.code !== 'rest_cookie_invalid_nonce' ) { + return Promise.reject( error ); } - const next = createRunStep( index + 1 ); - return step( workingOptions, next ); - }; - - return new Promise( ( resolve, reject ) => { - createRunStep( 0 )( options ) - .then( resolve ) - .catch( ( error ) => { - if ( error.code !== 'rest_cookie_invalid_nonce' ) { - return reject( error ); - } - - // If the nonce is invalid, refresh it and try again. - window - .fetch( apiFetch.nonceEndpoint ) - .then( checkStatus ) - .then( ( data ) => data.text() ) - .then( ( text ) => { - apiFetch.nonceMiddleware.nonce = text; - apiFetch( options ).then( resolve ).catch( reject ); - } ) - .catch( reject ); + // If the nonce is invalid, refresh it and try again. + return window + .fetch( apiFetch.nonceEndpoint ) + .then( checkStatus ) + .then( ( data ) => data.text() ) + .then( ( text ) => { + apiFetch.nonceMiddleware.nonce = text; + return apiFetch( options ); } ); } ); } diff --git a/packages/api-fetch/src/middlewares/http-v1.js b/packages/api-fetch/src/middlewares/http-v1.js index 87304712e4b21..cce48b5ed7942 100644 --- a/packages/api-fetch/src/middlewares/http-v1.js +++ b/packages/api-fetch/src/middlewares/http-v1.js @@ -40,7 +40,7 @@ function httpV1Middleware( options, next ) { }; } - return next( options, next ); + return next( options ); } export default httpV1Middleware; diff --git a/packages/api-fetch/src/middlewares/preloading.js b/packages/api-fetch/src/middlewares/preloading.js index b5d632e291a69..6edbf7109156c 100644 --- a/packages/api-fetch/src/middlewares/preloading.js +++ b/packages/api-fetch/src/middlewares/preloading.js @@ -45,8 +45,19 @@ function createPreloadingMiddleware( preloadedData ) { const method = options.method || 'GET'; const path = getStablePath( options.path ); - if ( parse && 'GET' === method && cache[ path ] ) { - return Promise.resolve( cache[ path ].body ); + if ( 'GET' === method && cache[ path ] ) { + return Promise.resolve( + parse + ? cache[ path ].body + : new window.Response( + JSON.stringify( cache[ path ].body ), + { + status: 200, + statusText: 'OK', + headers: cache[ path ].headers, + } + ) + ); } else if ( 'OPTIONS' === method && cache[ method ] && diff --git a/packages/api-fetch/src/middlewares/user-locale.js b/packages/api-fetch/src/middlewares/user-locale.js index 8debbde8d994a..1637a10251430 100644 --- a/packages/api-fetch/src/middlewares/user-locale.js +++ b/packages/api-fetch/src/middlewares/user-locale.js @@ -18,7 +18,7 @@ function userLocaleMiddleware( options, next ) { options.path = addQueryArgs( options.path, { _locale: 'user' } ); } - return next( options, next ); + return next( options ); } export default userLocaleMiddleware; diff --git a/packages/autop/package.json b/packages/autop/package.json index 90274dc478e36..aedd855f10fed 100644 --- a/packages/autop/package.json +++ b/packages/autop/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/autop", - "version": "2.8.0", + "version": "2.9.0", "description": "WordPress's automatic paragraph functions `autop` and `removep`.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/babel-plugin-import-jsx-pragma/package.json b/packages/babel-plugin-import-jsx-pragma/package.json index 50b87d238a32a..fc7200839852e 100644 --- a/packages/babel-plugin-import-jsx-pragma/package.json +++ b/packages/babel-plugin-import-jsx-pragma/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/babel-plugin-import-jsx-pragma", - "version": "2.6.0", + "version": "2.7.0", "description": "Babel transform plugin for automatically injecting an import to be used as the pragma for the React JSX Transform plugin.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/babel-plugin-makepot/package.json b/packages/babel-plugin-makepot/package.json index ebdc72a973b2e..9d187c7a97693 100644 --- a/packages/babel-plugin-makepot/package.json +++ b/packages/babel-plugin-makepot/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/babel-plugin-makepot", - "version": "3.6.0", + "version": "3.7.0", "description": "WordPress Babel internationalization (i18n) plugin.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", @@ -32,7 +32,7 @@ "dependencies": { "@babel/runtime": "^7.9.2", "gettext-parser": "^1.3.1", - "lodash": "^4.17.15" + "lodash": "^4.17.19" }, "peerDependencies": { "@babel/core": "^7.0.0" diff --git a/packages/babel-preset-default/package.json b/packages/babel-preset-default/package.json index 7799951a7c655..8943de5371fa5 100644 --- a/packages/babel-preset-default/package.json +++ b/packages/babel-preset-default/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/babel-preset-default", - "version": "4.15.0", + "version": "4.17.0", "description": "Default Babel preset for WordPress development.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/base-styles/CHANGELOG.md b/packages/base-styles/CHANGELOG.md index fab0cd143d253..95eb8fa85dc01 100644 --- a/packages/base-styles/CHANGELOG.md +++ b/packages/base-styles/CHANGELOG.md @@ -2,12 +2,15 @@ ## Unreleased -## Breaking Changes +## 2.0.0 (2020-07-07) -- Remove the AdminColorThemes JavaScript variables. +### Breaking Changes + +- Remove the AdminColorThemes JavaScript variables. +- Retire numerous colors and old grays, indicate others for deprecation. ## 1.2.0 (2020-01-13) ### Bug Fix -- Import `colors` into `variables` since the latter depends on the former. +- Import `colors` into `variables` since the latter depends on the former. diff --git a/packages/base-styles/_colors.native.scss b/packages/base-styles/_colors.native.scss new file mode 100644 index 0000000000000..f1b08583173ee --- /dev/null +++ b/packages/base-styles/_colors.native.scss @@ -0,0 +1,171 @@ +/** @format */ + +// Hugo's new WordPress shades of gray, from http://codepen.io/hugobaeta/pen/grJjVp. +$black: #000; +$dark-gray-900: #191e23; +$dark-gray-800: #23282d; +$dark-gray-700: #32373c; +$dark-gray-600: #40464d; +$dark-gray-500: #555d66; // Use this most of the time for dark items. +$dark-gray-400: #606a73; +$dark-gray-300: #6c7781; // Lightest gray that can be used for AA text contrast. +$dark-gray-200: #7e8993; +$dark-gray-150: #8d96a0; // Lightest gray that can be used for AA non-text contrast. +$dark-gray-100: #8f98a1; +$light-gray-900: #a2aab2; +$light-gray-800: #b5bcc2; +$light-gray-700: #ccd0d4; +$light-gray-600: #d7dade; +$light-gray-500: #e2e4e7; // Good for "grayed" items and borders. +$light-gray-400: #e8eaeb; // Good for "readonly" input fields and special text selection. +$light-gray-300: #edeff0; +$light-gray-200: #f3f4f5; +$light-gray-100: #f8f9f9; +$white: #fff; + +// Dark opacities, for use with light themes. +$dark-opacity-900: rgba(#000510, 0.9); +$dark-opacity-800: rgba(#00000a, 0.85); +$dark-opacity-700: rgba(#06060b, 0.8); +$dark-opacity-600: rgba(#000913, 0.75); +$dark-opacity-500: rgba(#0a1829, 0.7); +$dark-opacity-400: rgba(#0a1829, 0.65); +$dark-opacity-300: rgba(#0e1c2e, 0.62); +$dark-opacity-200: rgba(#162435, 0.55); +$dark-opacity-100: rgba(#223443, 0.5); +$dark-opacity-light-900: rgba(#304455, 0.45); +$dark-opacity-light-800: rgba(#425863, 0.4); +$dark-opacity-light-700: rgba(#667886, 0.35); +$dark-opacity-light-600: rgba(#7b86a2, 0.3); +$dark-opacity-light-500: rgba(#9197a2, 0.25); +$dark-opacity-light-400: rgba(#95959c, 0.2); +$dark-opacity-light-300: rgba(#829493, 0.15); +$dark-opacity-light-200: rgba(#8b8b96, 0.1); +$dark-opacity-light-100: rgba(#747474, 0.05); + +// Light opacities, for use with dark themes. +$light-opacity-900: rgba($white, 1); +$light-opacity-800: rgba($white, 0.9); +$light-opacity-700: rgba($white, 0.85); +$light-opacity-600: rgba($white, 0.8); +$light-opacity-500: rgba($white, 0.75); +$light-opacity-400: rgba($white, 0.7); +$light-opacity-300: rgba($white, 0.65); +$light-opacity-200: rgba($white, 0.6); +$light-opacity-100: rgba($white, 0.55); +$light-opacity-light-900: rgba($white, 0.5); +$light-opacity-light-800: rgba($white, 0.45); +$light-opacity-light-700: rgba($white, 0.4); +$light-opacity-light-600: rgba($white, 0.35); +$light-opacity-light-500: rgba($white, 0.3); +$light-opacity-light-400: rgba($white, 0.25); +$light-opacity-light-300: rgba($white, 0.2); +$light-opacity-light-200: rgba($white, 0.15); +$light-opacity-light-100: rgba($white, 0.1); + +// Additional colors. +// Some are from https://make.wordpress.org/design/handbook/foundations/colors/. +$blue-wordpress-700: #00669b; +$blue-dark-900: #0071a1; + +$blue-medium-900: #006589; +$blue-medium-800: #00739c; +$blue-medium-700: #007fac; +$blue-medium-600: #008dbe; +$blue-medium-500: #00a0d2; +$blue-medium-400: #33b3db; +$blue-medium-300: #66c6e4; +$blue-medium-200: #bfe7f3; +$blue-medium-100: #e5f5fa; +$blue-medium-highlight: #b3e7fe; +$blue-medium-focus: #007cba; + +// Alert colors. +$alert-yellow: #f0b849; +$alert-red: #d94f4f; +$alert-green: #4ab866; + +// Primary Accent (Blues) +$blue-wordpress: #0087be; +$blue-light: #78dcfa; +$blue-medium: #00aadc; +$blue-dark: #005082; +$blue-500: #016087; + +// Grays +$gray: #87a6bc; +$gray-light: lighten($gray, 33%); //#f3f6f8 +$gray-dark: darken($gray, 38%); //#2e4453 +$gray-900: #1a1a1a; + +// $gray-text: ideal for standard, non placeholder text +// $gray-text-min: minimum contrast needed for WCAG 2.0 AA on white background +$gray-text: $gray-dark; +$gray-text-min: darken($gray, 18%); //#537994 + +// Shades of gray +$gray-lighten-10: lighten($gray, 10%); // #a8bece +$gray-lighten-20: lighten($gray, 20%); // #c8d7e1 +$gray-lighten-30: lighten($gray, 30%); // #e9eff3 +$gray-darken-10: darken($gray, 10%); // #668eaa +$gray-darken-20: darken($gray, 20%); // #4f748e +$gray-darken-30: darken($gray, 30%); // #3d596d + +// +// See wordpress.com/design-handbook/colors/ for more info. + +// Secondary Accent (Oranges) +$orange-jazzy: #f0821e; +$orange-fire: #d54e21; + +// Alerts +$alert-yellow: #f0b849; +$alert-red: #d94f4f; +$alert-green: #4ab866; +$alert-purple: #855da6; +$red-40: #e65054; + +// Custom +$toolbar-button: #7b9ab1; +$toolbar-button-disabled: $gray-lighten-30; + +$background-dark-elevated: #2e2e2e; +$background-dark-secondary: #1e2327; + +// Primary tint color (light) +$blue-50: #2271b1; +// Primary tint color (dark) +$blue-30: #5198d9; + +$button-default-bg: #2271b1; +$button-fallback-bg: #595959; + +// color-studio +$gray-0: #f6f7f7; +$gray-5: #dcdcde; +$gray-10: #c3c4c7; +$gray-20: #a7aaad; +$gray-30: #8e9196; +$gray-40: #787c82; +$gray-50: #646970; +$gray-60: #50575e; +$gray-70: #3c434a; +$gray-90: #1d2327; +$gray-95: #1d2327; +$gray-100: #101517; + +// neutral (light) - black is a base color in light mode +$light-primary: #000d; //rgba(0, 0, 0, 0.87); +$light-secondary: #0009; //rgba(0, 0, 0, 0.6); +$light-tertiary: #0000006d; //rgba(0, 0, 0, 0.43); +$light-quaternary: #0000003f; //rgba(0, 0, 0, 0.25); +$light-dim: #0000001e; //rgba(0, 0, 0, 0.12); +$light-ultra-dim: #0000000a; //rgba(0, 0, 0, 0.04); + +// neutral (dark) - white is a base color in dark mode +$dark-primary: #fffd; //rgba(255, 255, 255, 0.87); +$dark-secondary: #fff9; //rgba(255, 255, 255, 0.6); +$dark-tertiary: #ffffff6d; //rgba(255, 255, 255, 0.43); +$dark-quaternary: #ffffff3f; //rgba(255, 255, 255, 0.25); +$dark-dim: #ffffff26; //rgba(255, 255, 255, 0.15); +$dark-ultra-dim: #ffffff14; //rgba(255, 255, 255, 0.08); diff --git a/packages/base-styles/_colors.scss b/packages/base-styles/_colors.scss index efa46eed43939..950aa826c5d16 100644 --- a/packages/base-styles/_colors.scss +++ b/packages/base-styles/_colors.scss @@ -2,107 +2,43 @@ * Colors */ -// Hugo's new WordPress shades of gray, from http://codepen.io/hugobaeta/pen/grJjVp. -$black: #000; -$dark-gray-900: #191e23; -$dark-gray-800: #23282d; +// WordPress grays. +$black: #000; // Use only when you truly need pure black. For UI, use $gray-900. +$gray-900: #1e1e1e; +$gray-700: #757575; // Meets 4.6:1 text contrast against white. +$gray-600: #949494; // Meets 3:1 UI or large text contrast against white. +$gray-400: #ccc; +$gray-200: #ddd; // Used for most borders. +$gray-100: #f0f0f0; +$white: #fff; + +// Opacities & additional colors. +$dark-theme-focus: $white; // Focus color when the theme is dark. +$dark-gray-placeholder: rgba($gray-900, 0.62); +$medium-gray-placeholder: rgba($gray-900, 0.55); +$light-gray-placeholder: rgba($white, 0.65); + +// Alert colors. +$alert-yellow: #f0b849; +$alert-red: #cc1818; +$alert-green: #4ab866; + + +/** + * Deprecated colors. + * Please avoid using these. + */ + $dark-gray-700: #32373c; $dark-gray-600: #40464d; -$dark-gray-500: #555d66; // Use this most of the time for dark items. +$dark-gray-500: #555d66; $dark-gray-400: #606a73; -$dark-gray-300: #6c7781; // Lightest gray that can be used for AA text contrast. +$dark-gray-300: #6c7781; $dark-gray-200: #7e8993; -$dark-gray-150: #8d96a0; // Lightest gray that can be used for AA non-text contrast. +$dark-gray-150: #8d96a0; $dark-gray-100: #8f98a1; + $light-gray-900: #a2aab2; $light-gray-800: #b5bcc2; $light-gray-700: #ccd0d4; $light-gray-600: #d7dade; -$light-gray-500: #e2e4e7; // Good for "grayed" items and borders. -$light-gray-400: #e8eaeb; // Good for "readonly" input fields and special text selection. -$light-gray-300: #edeff0; -$light-gray-200: #f3f4f5; -$light-gray-100: #f8f9f9; -$white: #fff; - -// G2 colors. -$dark-gray-primary: #1e1e1e; -$medium-gray-text: #757575; // Meets 4.6:1 text contrast. -$light-gray-ui: #949494; // Meets 3:1 UI contrast. -$light-gray-secondary: #ccc; -$light-gray-tertiary: #e7e8e9; -$blue-medium-focus-dark: $white; - -// Dark opacities, for use with light themes. -$dark-opacity-900: rgba(#000510, 0.9); -$dark-opacity-800: rgba(#00000a, 0.85); -$dark-opacity-700: rgba(#06060b, 0.8); -$dark-opacity-600: rgba(#000913, 0.75); -$dark-opacity-500: rgba(#0a1829, 0.7); -$dark-opacity-400: rgba(#0a1829, 0.65); -$dark-opacity-300: rgba(#0e1c2e, 0.62); -$dark-opacity-200: rgba(#162435, 0.55); -$dark-opacity-100: rgba(#223443, 0.5); -$dark-opacity-light-900: rgba(#304455, 0.45); -$dark-opacity-light-800: rgba(#425863, 0.4); -$dark-opacity-light-700: rgba(#667886, 0.35); -$dark-opacity-light-600: rgba(#7b86a2, 0.3); -$dark-opacity-light-500: rgba(#9197a2, 0.25); -$dark-opacity-light-400: rgba(#95959c, 0.2); -$dark-opacity-light-300: rgba(#829493, 0.15); -$dark-opacity-light-200: rgba(#8b8b96, 0.1); -$dark-opacity-light-100: rgba(#747474, 0.05); -$dark-opacity-background-fill: rgba($dark-gray-700, 0.7); // Similar to $dark-opacity-light-200, but more opaque. - -// Light opacities, for use with dark themes. -$light-opacity-900: rgba($white, 1); -$light-opacity-800: rgba($white, 0.9); -$light-opacity-700: rgba($white, 0.85); -$light-opacity-600: rgba($white, 0.8); -$light-opacity-500: rgba($white, 0.75); -$light-opacity-400: rgba($white, 0.7); -$light-opacity-300: rgba($white, 0.65); -$light-opacity-200: rgba($white, 0.6); -$light-opacity-100: rgba($white, 0.55); -$light-opacity-light-900: rgba($white, 0.5); -$light-opacity-light-800: rgba($white, 0.45); -$light-opacity-light-700: rgba($white, 0.4); -$light-opacity-light-600: rgba($white, 0.35); -$light-opacity-light-500: rgba($white, 0.3); -$light-opacity-light-400: rgba($white, 0.25); -$light-opacity-light-300: rgba($white, 0.2); -$light-opacity-light-200: rgba($white, 0.15); -$light-opacity-light-100: rgba($white, 0.1); -$light-opacity-background-fill: rgba($light-gray-300, 0.8); // Similar to $light-opacity-light-200, but more opaque. - -// Additional colors. -// Some are from https://make.wordpress.org/design/handbook/foundations/colors/. -$blue-wordpress-700: #00669b; -$blue-dark-900: #0071a1; - -$blue-medium-900: #006589; -$blue-medium-800: #00739c; -$blue-medium-700: #007fac; -$blue-medium-600: #008dbe; -$blue-medium-500: #00a0d2; -$blue-medium-400: #33b3db; -$blue-medium-300: #66c6e4; -$blue-medium-200: #bfe7f3; -$blue-medium-100: #e5f5fa; -$blue-medium-highlight: #b3e7fe; - -// Alert colors. -$alert-yellow: #f0b849; -$alert-red: #d94f4f; -$alert-green: #4ab866; - -// Navigation. -$light-style-sub-menu-background-color: #fff; -$light-style-sub-menu-border-color: #ddd; -$light-style-sub-menu-text-color: #111; -$light-style-sub-menu-text-color-hover: #333; - -$dark-style-sub-menu-background-color: #333; -$dark-style-sub-menu-border-color: #111; -$dark-style-sub-menu-text-color: #fff; -$dark-style-sub-menu-text-color-hover: #eee; diff --git a/packages/base-styles/_default-custom-properties.scss b/packages/base-styles/_default-custom-properties.scss new file mode 100644 index 0000000000000..9f2979ea039bb --- /dev/null +++ b/packages/base-styles/_default-custom-properties.scss @@ -0,0 +1,7 @@ + +// It is important to include these styles in all built stylesheets. +// This allows to CSS variables post CSS plugin to generate fallbacks. +// It also provides default CSS variables for npm package consumers. +:root { + @include admin-scheme(#007cba); +} diff --git a/packages/base-styles/_mixins.scss b/packages/base-styles/_mixins.scss index ba4e8ad8f7e57..26b3678d003d1 100644 --- a/packages/base-styles/_mixins.scss +++ b/packages/base-styles/_mixins.scss @@ -129,7 +129,7 @@ box-shadow: 0 0 0 transparent; transition: box-shadow 0.1s linear; border-radius: $radius-block-ui; - border: $border-width solid $medium-gray-text; + border: $border-width solid $gray-700; @include reduce-motion("transition"); } @@ -259,56 +259,58 @@ // Use opacity to work in various editor styles. &::-webkit-input-placeholder { - color: $dark-opacity-300; + color: $dark-gray-placeholder; } &::-moz-placeholder { opacity: 1; // Necessary because Firefox reduces this from 1. - color: $dark-opacity-300; + color: $dark-gray-placeholder; } &:-ms-input-placeholder { - color: $dark-opacity-300; + color: $dark-gray-placeholder; } .is-dark-theme & { &::-webkit-input-placeholder { - color: $light-opacity-300; + color: $light-gray-placeholder; } &::-moz-placeholder { opacity: 1; // Necessary because Firefox reduces this from 1. - color: $light-opacity-300; + color: $light-gray-placeholder; } &:-ms-input-placeholder { - color: $light-opacity-300; + color: $light-gray-placeholder; } } } @mixin checkbox-control { @include input-control; - border: $border-width + 1 solid $medium-gray-text; + border: $border-width solid $gray-900; margin-right: $grid-unit-15; transition: none; border-radius: $radius-block-ui; &:focus { - border-color: $medium-gray-text; - box-shadow: 0 0 0 1px $medium-gray-text; + box-shadow: 0 0 0 ($border-width * 2) $white, 0 0 0 ($border-width * 2 + $border-width-focus) var(--wp-admin-theme-color); + + // Only visible in Windows High Contrast mode. + outline: 2px solid transparent; } &:checked { background: var(--wp-admin-theme-color); border-color: var(--wp-admin-theme-color); - } - &:checked:focus { - box-shadow: 0 0 0 $border-width-focus $medium-gray-text; + // Hide default checkbox styles in IE. + &::-ms-check { + opacity: 0; + } } - &:checked::before, &[aria-checked="mixed"]::before { margin: -3px -5px; @@ -343,45 +345,43 @@ font-size: 21px; } } - - &:focus { - box-shadow: 0 0 0 $border-width-focus $dark-gray-500; - } } } @mixin radio-control { @include input-control; - border: $border-width + 1 solid $medium-gray-text; + border: $border-width solid $gray-900; margin-right: $grid-unit-15; transition: none; border-radius: $radius-round; &:checked::before { - width: 6px; - height: 6px; - margin: 6px 0 0 6px; + width: 7px; + height: 7px; + margin: 8px 0 0 8px; background-color: $white; + // This border serves as a background color in Windows High Contrast mode. + border: 3px solid $white; + @include break-medium() { - margin: 3px 0 0 3px; + width: 6px; + height: 6px; + margin: 4px 0 0 4px; } } &:focus { - border-color: $medium-gray-text; - box-shadow: 0 0 0 1px $medium-gray-text; + box-shadow: 0 0 0 ($border-width * 2) $white, 0 0 0 ($border-width * 2 + $border-width-focus) var(--wp-admin-theme-color); + + // Only visible in Windows High Contrast mode. + outline: 2px solid transparent; } &:checked { background: var(--wp-admin-theme-color); border-color: var(--wp-admin-theme-color); } - - &:checked:focus { - box-shadow: 0 0 0 $border-width-focus $medium-gray-text; - } - } /** @@ -451,6 +451,10 @@ @include admin-scheme(#0085ba); } + body.admin-color-modern { + @include admin-scheme(#3858e9); + } + body.admin-color-blue { @include admin-scheme(#096484); } @@ -476,8 +480,200 @@ } } -// It is important to include these styles in all built stylesheets -// This allows to CSS variables post CSS plugin to generate fallbacks. -:root { - @include admin-scheme(#007cba); +@mixin background-colors() { + .has-pale-pink-background-color { + background-color: #f78da7; + } + + .has-vivid-red-background-color { + background-color: #cf2e2e; + } + + .has-luminous-vivid-orange-background-color { + background-color: #ff6900; + } + + .has-luminous-vivid-amber-background-color { + background-color: #fcb900; + } + + .has-light-green-cyan-background-color { + background-color: #7bdcb5; + } + + .has-vivid-green-cyan-background-color { + background-color: #00d084; + } + + .has-pale-cyan-blue-background-color { + background-color: #8ed1fc; + } + + .has-vivid-cyan-blue-background-color { + background-color: #0693e3; + } + + .has-vivid-purple-background-color { + background-color: #9b51e0; + } + + .has-white-background-color { + background-color: #fff; + } + + // Deprecated from UI, kept for back-compat. + .has-very-light-gray-background-color { + background-color: #eee; + } + + .has-cyan-bluish-gray-background-color { + background-color: #abb8c3; + } + + // Deprecated from UI, kept for back-compat. + .has-very-dark-gray-background-color { + background-color: #313131; + } + + .has-black-background-color { + background-color: #000; + } +} + +@mixin foreground-colors() { + .has-pale-pink-color { + color: #f78da7; + } + + .has-vivid-red-color { + color: #cf2e2e; + } + + .has-luminous-vivid-orange-color { + color: #ff6900; + } + + .has-luminous-vivid-amber-color { + color: #fcb900; + } + + .has-light-green-cyan-color { + color: #7bdcb5; + } + + .has-vivid-green-cyan-color { + color: #00d084; + } + + .has-pale-cyan-blue-color { + color: #8ed1fc; + } + + .has-vivid-cyan-blue-color { + color: #0693e3; + } + + .has-vivid-purple-color { + color: #9b51e0; + } + + .has-white-color { + color: #fff; + } + + // Deprecated from UI, kept for back-compat. + .has-very-light-gray-color { + color: #eee; + } + + .has-cyan-bluish-gray-color { + color: #abb8c3; + } + + // Deprecated from UI, kept for back-compat. + .has-very-dark-gray-color { + color: #313131; + } + + .has-black-color { + color: #000; + } +} + +@mixin gradient-colors() { + // Our classes uses the same values we set for gradient value attributes, and we can not use spacing because of WP multi site kses rule. + + /* stylelint-disable function-comma-space-after */ + .has-vivid-cyan-blue-to-vivid-purple-gradient-background { + background: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%); + } + + .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background { + background: linear-gradient(135deg,rgba(0,208,132,1) 0%,rgba(6,147,227,1) 100%); + } + + .has-light-green-cyan-to-vivid-green-cyan-gradient-background { + background: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%); + } + + .has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background { + background: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%); + } + + .has-luminous-vivid-orange-to-vivid-red-gradient-background { + background: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%); + } + + .has-very-light-gray-to-cyan-bluish-gray-gradient-background { + background: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%); + } + + .has-cool-to-warm-spectrum-gradient-background { + background: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%); + } + + .has-blush-light-purple-gradient-background { + background: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%); + } + + .has-blush-bordeaux-gradient-background { + background: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%); + } + + .has-purple-crush-gradient-background { + background: linear-gradient(135deg,rgb(52,226,228) 0%,rgb(71,33,251) 50%,rgb(171,29,254) 100%); + } + + .has-luminous-dusk-gradient-background { + background: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%); + } + + .has-hazy-dawn-gradient-background { + background: linear-gradient(135deg,rgb(250,172,168) 0%,rgb(218,208,236) 100%); + } + + .has-pale-ocean-gradient-background { + background: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%); + } + + .has-electric-grass-gradient-background { + background: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%); + } + + .has-subdued-olive-gradient-background { + background: linear-gradient(135deg,rgb(250,250,225) 0%,rgb(103,166,113) 100%); + } + + .has-atomic-cream-gradient-background { + background: linear-gradient(135deg,rgb(253,215,154) 0%,rgb(0,74,89) 100%); + } + + .has-nightshade-gradient-background { + background: linear-gradient(135deg,rgb(51,9,104) 0%,rgb(49,205,207) 100%); + } + + .has-midnight-gradient-background { + background: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%); + } + /* stylelint-enable function-comma-space-after */ } diff --git a/packages/base-styles/_variables.scss b/packages/base-styles/_variables.scss index b0286b7587e1c..4f81cf05b2b66 100644 --- a/packages/base-styles/_variables.scss +++ b/packages/base-styles/_variables.scss @@ -41,9 +41,8 @@ $grid-unit-60: 6 * $grid-unit; // 48px $icon-size: 24px; $button-size: 36px; $button-size-small: 24px; -$panel-padding: 16px; $header-height: 60px; -$panel-header-height: 50px; +$panel-header-height: $grid-unit-60; $admin-bar-height: 32px; $admin-bar-height-big: 46px; $admin-sidebar-width: 160px; @@ -61,7 +60,7 @@ $mobile-color-swatch: 48px; */ $shadow-popover: 0 2px 6px rgba($black, 0.05); -$shadow-modal: 0 3px 30px rgba($dark-gray-900, 0.2); +$shadow-modal: 0 3px 30px rgba($black, 0.2); /** @@ -82,9 +81,6 @@ $block-padding: 14px; // Space between block footprint and focus boundaries. The $block-spacing: 4px; // Vertical space between blocks. $block-side-ui-width: $button-size; // Width of the movers/drag handle UI. $block-side-ui-clearance: 2px; // Space between movers/drag handle UI, and block. -$block-container-side-padding: $block-side-ui-width + $block-padding + 2 * $block-side-ui-clearance; // Total space left and right of the block footprint. -$block-bg-padding--v: $block-padding + $block-spacing + $block-side-ui-clearance; // padding for Blocks with a background color (eg: paragraph or group) -$block-bg-padding--h: $block-side-ui-width + $block-side-ui-clearance; // padding for Blocks with a background color (eg: paragraph or group) $dimmed-opacity: 1; $block-edge-to-content: 16px; @@ -96,11 +92,16 @@ $block-selected-padding: 0; $block-selected-child-margin: 5px; $block-selected-to-content: $block-edge-to-content - $block-selected-margin - $block-selected-border-width; - /** * Border radii. */ -$radius-round-rectangle: 4px; $radius-round: 50%; $radius-block-ui: 2px; + +/** + * Block paddings. + */ +// Padding for blocks with a background color (e.g. paragraph or group). +$block-bg-padding--v: 1.25em; +$block-bg-padding--h: 2.375em; diff --git a/packages/base-styles/_z-index.scss b/packages/base-styles/_z-index.scss index d519cbaeff31e..5921179e6a7ce 100644 --- a/packages/base-styles/_z-index.scss +++ b/packages/base-styles/_z-index.scss @@ -6,7 +6,7 @@ $z-layers: ( ".block-editor-block-list__block::before": 0, ".block-editor-block-switcher__arrow": 1, ".block-editor-block-list__block {core/image aligned wide or fullwide}": 20, - ".block-library-classic__toolbar": 10, + ".block-library-classic__toolbar": 31, // When scrolled to top this toolbar needs to sit over block-editor-block-toolbar ".block-editor-block-list__layout .reusable-block-indicator": 1, ".block-editor-block-list__block-selection-button": 22, ".components-form-toggle__input": 1, @@ -14,6 +14,7 @@ $z-layers: ( ".edit-post-sidebar .components-panel": -2, ".edit-post-text-editor__toolbar": 1, ".block-editor-inserter__tabs": 1, + ".edit-post-sidebar__panel-tab.is-active": 1, ".block-editor-inserter__tab.is-active": 1, ".components-panel__header": 1, ".components-modal__header": 10, @@ -32,6 +33,7 @@ $z-layers: ( ".wp-block-cover__inner-container": 1, // InnerBlocks area inside cover image block ".wp-block-cover.has-background-dim::before": 1, // Overlay area inside block cover need to be higher than the video background. ".wp-block-cover__video-background": 0, // Video background inside cover block. + ".wp-block-template-part__placeholder-preview-filter-input": 1, // Active pill button ".components-button {:focus or .is-primary}": 1, @@ -103,12 +105,13 @@ $z-layers: ( ".components-popover": 1000000, // ...Except for popovers immediately beneath wp-admin menu on large breakpoints - ".components-popover.block-editor-inserter__popover": 99998, + ".components-popover.block-editor-inserter__popover": 99999, ".components-popover.table-of-contents__popover": 99998, ".components-popover.block-editor-block-navigation__popover": 99998, ".components-popover.edit-post-more-menu__content": 99998, ".components-popover.edit-site-more-menu__content": 99998, ".components-popover.block-editor-rich-text__inline-format-toolbar": 99998, + ".components-popover.block-editor-warning__dropdown": 99998, ".components-autocomplete__results": 1000000, diff --git a/packages/base-styles/package.json b/packages/base-styles/package.json index 4c7a256abcf46..5a56c22e7ea17 100644 --- a/packages/base-styles/package.json +++ b/packages/base-styles/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/base-styles", - "version": "1.10.0", + "version": "2.0.1", "description": "Base SCSS utilities and variables for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/blob/package.json b/packages/blob/package.json index 9adc8019318d3..edd8e80badc33 100644 --- a/packages/blob/package.json +++ b/packages/blob/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/blob", - "version": "2.8.0", + "version": "2.9.0", "description": "Blob utilities for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", diff --git a/packages/block-directory/package.json b/packages/block-directory/package.json index dbb7d5dae9ba1..9dceea241fe23 100644 --- a/packages/block-directory/package.json +++ b/packages/block-directory/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/block-directory", - "version": "1.11.0", + "version": "1.13.3", "description": "Extend editor with block directory features to search, download and install blocks.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", @@ -35,10 +35,14 @@ "@wordpress/data-controls": "file:../data-controls", "@wordpress/edit-post": "file:../edit-post", "@wordpress/element": "file:../element", + "@wordpress/hooks": "file:../hooks", + "@wordpress/html-entities": "file:../html-entities", "@wordpress/i18n": "file:../i18n", "@wordpress/icons": "file:../icons", + "@wordpress/notices": "file:../notices", "@wordpress/plugins": "file:../plugins", - "lodash": "^4.17.15" + "@wordpress/url": "file:../url", + "lodash": "^4.17.19" }, "publishConfig": { "access": "public" diff --git a/packages/block-directory/src/components/auto-block-uninstaller/index.js b/packages/block-directory/src/components/auto-block-uninstaller/index.js index c7e804f9f0923..12016417bc885 100644 --- a/packages/block-directory/src/components/auto-block-uninstaller/index.js +++ b/packages/block-directory/src/components/auto-block-uninstaller/index.js @@ -11,10 +11,11 @@ export default function AutoBlockUninstaller() { const shouldRemoveBlockTypes = useSelect( ( select ) => { const { isAutosavingPost, isSavingPost } = select( 'core/editor' ); return isSavingPost() && ! isAutosavingPost(); - } ); + }, [] ); - const unusedBlockTypes = useSelect( ( select ) => - select( 'core/block-directory' ).getUnusedBlockTypes() + const unusedBlockTypes = useSelect( + ( select ) => select( 'core/block-directory' ).getUnusedBlockTypes(), + [] ); useEffect( () => { diff --git a/packages/block-directory/src/components/downloadable-block-header/index.js b/packages/block-directory/src/components/downloadable-block-header/index.js index 1bd1f002229ae..1917e68c14ee7 100644 --- a/packages/block-directory/src/components/downloadable-block-header/index.js +++ b/packages/block-directory/src/components/downloadable-block-header/index.js @@ -3,6 +3,7 @@ */ import { __ } from '@wordpress/i18n'; import { Button } from '@wordpress/components'; +import { decodeEntities } from '@wordpress/html-entities'; /** * Internal dependencies @@ -15,7 +16,8 @@ function DownloadableBlockHeader( { title, rating, ratingCount, - isLoading, + isLoading = false, + isInstallable = true, onClick, } ) { return ( @@ -24,17 +26,17 @@ function DownloadableBlockHeader( {

- { title } + { decodeEntities( title ) }

); diff --git a/packages/block-directory/src/components/downloadable-block-notice/test/index.js b/packages/block-directory/src/components/downloadable-block-notice/test/index.js index 55d53cd10d918..32b3bb8c6023a 100644 --- a/packages/block-directory/src/components/downloadable-block-notice/test/index.js +++ b/packages/block-directory/src/components/downloadable-block-notice/test/index.js @@ -35,7 +35,9 @@ describe( 'DownloadableBlockNotice', () => { } ); it( 'should return something when there are error notices', () => { - useSelect.mockImplementation( () => 'Plugin not found.' ); + useSelect.mockImplementation( () => { + return { message: 'Plugin not found.', isFatal: false }; + } ); const wrapper = shallow( { if ( success ) { onSelect( item ); + setIsInserterOpened( false ); } } ); onHover( null ); diff --git a/packages/block-directory/src/components/downloadable-blocks-panel/index.js b/packages/block-directory/src/components/downloadable-blocks-panel/index.js index 08d346d6774a5..835141927c7ba 100644 --- a/packages/block-directory/src/components/downloadable-blocks-panel/index.js +++ b/packages/block-directory/src/components/downloadable-blocks-panel/index.js @@ -21,24 +21,16 @@ function DownloadableBlocksPanel( { isWaiting, debouncedSpeak, } ) { - if ( ! hasPermission ) { - debouncedSpeak( - __( - 'No blocks found in your library. Please contact your site administrator to install new blocks.' - ) - ); + if ( false === hasPermission ) { + debouncedSpeak( __( 'No blocks found in your library.' ) ); return (

{ __( 'No blocks found in your library.' ) } -
- { __( - 'Please contact your site administrator to install new blocks.' - ) }

); } - if ( isLoading || isWaiting ) { + if ( typeof hasPermission === 'undefined' || isLoading || isWaiting ) { return (

@@ -86,15 +78,17 @@ export default compose( [ withSelect( ( select, { filterValue } ) => { const { getDownloadableBlocks, - hasInstallBlocksPermission, isRequestingDownloadableBlocks, } = select( 'core/block-directory' ); - const hasPermission = hasInstallBlocksPermission(); + const hasPermission = select( 'core' ).canUser( + 'read', + 'block-directory/search' + ); const downloadableItems = hasPermission ? getDownloadableBlocks( filterValue ) : []; - const isLoading = isRequestingDownloadableBlocks(); + const isLoading = isRequestingDownloadableBlocks( filterValue ); return { downloadableItems, diff --git a/packages/block-directory/src/components/downloadable-blocks-panel/style.scss b/packages/block-directory/src/components/downloadable-blocks-panel/style.scss index a928b5c2d7405..2dc8e77025568 100644 --- a/packages/block-directory/src/components/downloadable-blocks-panel/style.scss +++ b/packages/block-directory/src/components/downloadable-blocks-panel/style.scss @@ -8,9 +8,10 @@ } .block-directory-downloadable-blocks-panel__description.has-no-results { + $no-result-padding: $grid-unit-20 * 7; font-style: normal; padding: 0; - margin-top: 100px; + margin: $no-result-padding 0; text-align: center; color: $dark-gray-400; .components-spinner { diff --git a/packages/block-directory/src/index.js b/packages/block-directory/src/index.js index 3af7027bf74d0..1c5eccc183bc2 100644 --- a/packages/block-directory/src/index.js +++ b/packages/block-directory/src/index.js @@ -1,3 +1,8 @@ +/** + * WordPress dependencies + */ +import '@wordpress/notices'; + /** * Internal dependencies */ diff --git a/packages/block-directory/src/plugins/filter-missing/index.js b/packages/block-directory/src/plugins/filter-missing/index.js new file mode 100644 index 0000000000000..2b958ad54eb51 --- /dev/null +++ b/packages/block-directory/src/plugins/filter-missing/index.js @@ -0,0 +1,66 @@ +/** + * WordPress dependencies + */ +import { __, sprintf } from '@wordpress/i18n'; +import { Button } from '@wordpress/components'; +import { RawHTML } from '@wordpress/element'; +import { useSelect } from '@wordpress/data'; +import { Warning } from '@wordpress/block-editor'; + +/** + * Internal dependencies + */ +import InstallButton from './install-button'; + +const filterMissing = ( OriginalComponent ) => ( props ) => { + const { originalName, originalUndelimitedContent } = props.attributes; + const { block, hasPermission } = useSelect( + ( select ) => { + const { getDownloadableBlocks } = select( 'core/block-directory' ); + const blocks = getDownloadableBlocks( + 'block:' + originalName + ).filter( ( { name } ) => originalName === name ); + return { + hasPermission: select( 'core' ).canUser( + 'read', + 'block-directory/search' + ), + block: blocks.length && blocks[ 0 ], + }; + }, + [ originalName ] + ); + + if ( ! hasPermission || ! block ) { + return ; + } + + const actions = [ + , + , + ]; + + return ( + <> + + { sprintf( + /* translators: %s: block name */ + __( + 'Your site doesn’t include support for the %s block. You can try installing the block, convert it to a Custom HTML block, or remove it entirely.' + ), + block.title || originalName + ) } + + { originalUndelimitedContent } + + ); +}; + +export default filterMissing; diff --git a/packages/block-directory/src/plugins/filter-missing/install-button.js b/packages/block-directory/src/plugins/filter-missing/install-button.js new file mode 100644 index 0000000000000..f4985de41846e --- /dev/null +++ b/packages/block-directory/src/plugins/filter-missing/install-button.js @@ -0,0 +1,49 @@ +/** + * WordPress dependencies + */ +import { __, sprintf } from '@wordpress/i18n'; +import { Button } from '@wordpress/components'; +import { createBlock, getBlockType, parse } from '@wordpress/blocks'; +import { useSelect, useDispatch } from '@wordpress/data'; + +export default function InstallButton( { attributes, block, clientId } ) { + const isInstallingBlock = useSelect( ( select ) => + select( 'core/block-directory' ).isInstalling( block.id ) + ); + const { installBlockType } = useDispatch( 'core/block-directory' ); + const { replaceBlock } = useDispatch( 'core/block-editor' ); + + return ( + + ); +} diff --git a/packages/block-directory/src/plugins/index.js b/packages/block-directory/src/plugins/index.js index c35f5d811b276..beb9aac416e31 100644 --- a/packages/block-directory/src/plugins/index.js +++ b/packages/block-directory/src/plugins/index.js @@ -2,6 +2,7 @@ * WordPress dependencies */ import { registerPlugin } from '@wordpress/plugins'; +import { addFilter } from '@wordpress/hooks'; /** * Internal dependencies @@ -9,6 +10,7 @@ import { registerPlugin } from '@wordpress/plugins'; import AutoBlockUninstaller from '../components/auto-block-uninstaller'; import InserterMenuDownloadableBlocksPanel from './inserter-menu-downloadable-blocks-panel'; import InstalledBlocksPrePublishPanel from './installed-blocks-pre-publish-panel'; +import filterMissing from './filter-missing'; registerPlugin( 'block-directory', { render() { @@ -21,3 +23,9 @@ registerPlugin( 'block-directory', { ); }, } ); + +addFilter( + 'editor.missingEdit', + 'block-directory/install-missing', + filterMissing +); diff --git a/packages/block-directory/src/plugins/installed-blocks-pre-publish-panel/index.js b/packages/block-directory/src/plugins/installed-blocks-pre-publish-panel/index.js index c3c2ca5925933..59a69fa992fcf 100644 --- a/packages/block-directory/src/plugins/installed-blocks-pre-publish-panel/index.js +++ b/packages/block-directory/src/plugins/installed-blocks-pre-publish-panel/index.js @@ -11,8 +11,9 @@ import { useSelect } from '@wordpress/data'; import CompactList from '../../components/compact-list'; export default function InstalledBlocksPrePublishPanel() { - const newBlockTypes = useSelect( ( select ) => - select( 'core/block-directory' ).getNewBlockTypes() + const newBlockTypes = useSelect( + ( select ) => select( 'core/block-directory' ).getNewBlockTypes(), + [] ); if ( ! newBlockTypes.length ) { diff --git a/packages/block-directory/src/store/actions.js b/packages/block-directory/src/store/actions.js index f14fb51b17745..9f1e96d5db26b 100644 --- a/packages/block-directory/src/store/actions.js +++ b/packages/block-directory/src/store/actions.js @@ -8,6 +8,7 @@ import { apiFetch, dispatch, select } from '@wordpress/data-controls'; * Internal dependencies */ import { loadAssets } from './controls'; +import getPluginUrl from './utils/get-plugin-url'; /** * Returns an action object used in signalling that the downloadable blocks @@ -38,18 +39,6 @@ export function receiveDownloadableBlocks( downloadableBlocks, filterValue ) { }; } -/** - * Returns an action object used in signalling that the user does not have - * permission to install blocks. - * - * @param {boolean} hasPermission User has permission to install blocks. - * - * @return {Object} Action object. - */ -export function setInstallBlocksPermission( hasPermission ) { - return { type: 'SET_INSTALL_BLOCKS_PERMISSION', hasPermission }; -} - /** * Action triggered to install a block plugin. * @@ -62,27 +51,71 @@ export function* installBlockType( block ) { let success = false; yield clearErrorNotice( id ); try { - if ( ! Array.isArray( assets ) || ! assets.length ) { - throw new Error( __( 'Block has no assets.' ) ); - } yield setIsInstalling( block.id, true ); - yield apiFetch( { - path: '__experimental/block-directory/install', - data: { - slug: block.id, - }, - method: 'POST', + + // If we have a wp:plugin link, the plugin is installed but inactive. + const url = getPluginUrl( block ); + let links = {}; + if ( url ) { + yield apiFetch( { + url, + data: { + status: 'active', + }, + method: 'PUT', + } ); + } else { + const response = yield apiFetch( { + path: 'wp/v2/plugins', + data: { + slug: block.id, + status: 'active', + }, + method: 'POST', + } ); + // Add the `self` link for newly-installed blocks. + links = response._links; + } + + yield addInstalledBlockType( { + ...block, + links: { ...block.links, ...links }, } ); - yield addInstalledBlockType( block ); yield loadAssets( assets ); const registeredBlocks = yield select( 'core/blocks', 'getBlockTypes' ); - if ( ! registeredBlocks.length ) { - throw new Error( __( 'Unable to get block types.' ) ); + if ( + ! registeredBlocks.length || + ! registeredBlocks.filter( ( i ) => i.name === block.name ).length + ) { + throw new Error( + __( 'Error registering block. Try reloading the page.' ) + ); } + success = true; } catch ( error ) { - yield setErrorNotice( id, error.message || __( 'An error occurred.' ) ); + let message = error.message || __( 'An error occurred.' ); + + // Errors we throw are fatal + let isFatal = error instanceof Error; + + // Specific API errors that are fatal + const fatalAPIErrors = { + folder_exists: __( + 'This block is already installed. Try reloading the page.' + ), + unable_to_connect_to_filesystem: __( + 'Error installing block. You can reload the page and try again.' + ), + }; + + if ( fatalAPIErrors[ error.code ] ) { + isFatal = true; + message = fatalAPIErrors[ error.code ]; + } + + yield setErrorNotice( id, message, isFatal ); } yield setIsInstalling( block.id, false ); return success; @@ -94,18 +127,18 @@ export function* installBlockType( block ) { * @param {Object} block The blockType object. */ export function* uninstallBlockType( block ) { - const { id } = block; try { - const response = yield apiFetch( { - path: '__experimental/block-directory/uninstall', + yield apiFetch( { + url: getPluginUrl( block ), data: { - slug: id, + status: 'inactive', }, + method: 'PUT', + } ); + yield apiFetch( { + url: getPluginUrl( block ), method: 'DELETE', } ); - if ( response !== true ) { - throw new Error( __( 'Unable to uninstall this block.' ) ); - } yield removeInstalledBlockType( block ); } catch ( error ) { yield dispatch( @@ -164,15 +197,17 @@ export function setIsInstalling( blockId, isInstalling ) { * Sets an error notice string to be displayed to the user * * @param {string} blockId The ID of the block plugin. eg: my-block - * @param {string} notice The message shown in the notice. + * @param {string} message The message shown in the notice. + * @param {boolean} isFatal Whether the user can recover from the error * * @return {Object} Action object. */ -export function setErrorNotice( blockId, notice ) { +export function setErrorNotice( blockId, message, isFatal = false ) { return { type: 'SET_ERROR_NOTICE', blockId, - notice, + message, + isFatal, }; } @@ -185,8 +220,7 @@ export function setErrorNotice( blockId, notice ) { */ export function clearErrorNotice( blockId ) { return { - type: 'SET_ERROR_NOTICE', + type: 'CLEAR_ERROR_NOTICE', blockId, - notice: false, }; } diff --git a/packages/block-directory/src/store/controls.js b/packages/block-directory/src/store/controls.js index 19885bb224e7a..a5ee96d8e6c9d 100644 --- a/packages/block-directory/src/store/controls.js +++ b/packages/block-directory/src/store/controls.js @@ -1,45 +1,49 @@ /** - * Loads a JavaScript file. - * - * @param {string} asset The url for this file. - * - * @return {Promise} Promise which will resolve when the asset is loaded. + * WordPress dependencies */ -export const loadScript = ( asset ) => { - if ( ! asset || ! /\.js$/.test( asset ) ) { - return Promise.reject( new Error( 'No script found.' ) ); - } - return new Promise( ( resolve, reject ) => { - const existing = document.querySelector( `script[src="${ asset }"]` ); - if ( existing ) { - existing.parentNode.removeChild( existing ); - } - const script = document.createElement( 'script' ); - script.src = asset; - script.onload = () => resolve( true ); - script.onerror = () => reject( new Error( 'Error loading script.' ) ); - document.body.appendChild( script ); - } ); -}; +import apiFetch from '@wordpress/api-fetch'; /** - * Loads a CSS file. + * Load an asset for a block. * - * @param {string} asset The url for this file. + * This function returns a Promise that will resolve once the asset is loaded, + * or in the case of Stylesheets and Inline Javascript, will resolve immediately. * - * @return {Promise} Promise which will resolve when the asset is added. + * @param {HTMLElement} el A HTML Element asset to inject. + * + * @return {Promise} Promise which will resolve when the asset is loaded. */ -export const loadStyle = ( asset ) => { - if ( ! asset || ! /\.css$/.test( asset ) ) { - return Promise.reject( new Error( 'No style found.' ) ); - } +export const loadAsset = ( el ) => { return new Promise( ( resolve, reject ) => { - const link = document.createElement( 'link' ); - link.rel = 'stylesheet'; - link.href = asset; - link.onload = () => resolve( true ); - link.onerror = () => reject( new Error( 'Error loading style.' ) ); - document.body.appendChild( link ); + /* + * Reconstruct the passed element, this is required as inserting the Node directly + * won't always fire the required onload events, even if the asset wasn't already loaded. + */ + const newNode = document.createElement( el.nodeName ); + + [ 'id', 'rel', 'src', 'href', 'type' ].forEach( ( attr ) => { + if ( el[ attr ] ) { + newNode[ attr ] = el[ attr ]; + } + } ); + + // Append inline `, + 'text/html; charset=UTF-8' + ), + }, ]; function getResponseObject( obj, contentType ) { @@ -175,8 +151,6 @@ const matchUrl = ( reqUrl, urls ) => { }; describe( 'adding blocks from block directory', () => { - useExperimentalFeatures( [ '#gutenberg-block-directory' ] ); - beforeEach( async () => { await createNewPost(); } ); @@ -214,8 +188,7 @@ describe( 'adding blocks from block directory', () => { // Add the block await addBtn.click(); - // Delay to let block script load - await new Promise( ( resolve ) => setTimeout( resolve, 100 ) ); + await page.waitForSelector( `div[data-type="${ MOCK_BLOCK1.name }"]` ); // The block will auto select and get added, make sure we see it in the content expect( await getEditedPostContent() ).toMatchSnapshot(); diff --git a/packages/e2e-tests/specs/editor/plugins/block-variations.js b/packages/e2e-tests/specs/editor/plugins/block-variations.js index 2c8eb7596397c..ef4a17360284a 100644 --- a/packages/e2e-tests/specs/editor/plugins/block-variations.js +++ b/packages/e2e-tests/specs/editor/plugins/block-variations.js @@ -41,14 +41,14 @@ describe( 'Block variations', () => { ).toHaveLength( 1 ); }; - test( 'Search for the overriden default Quote block', async () => { + test( 'Search for the overridden default Quote block', async () => { await searchForBlock( 'Quote' ); expect( await page.$( '.editor-block-list-item-quote' ) ).toBeNull(); expectInserterItem( 'quote', 'Large Quote', 'large' ); } ); - test( 'Insert the overriden default Quote block variation', async () => { + test( 'Insert the overridden default Quote block variation', async () => { await insertBlock( 'Large Quote' ); expect( @@ -58,7 +58,20 @@ describe( 'Block variations', () => { ).toBeDefined(); } ); - test( 'Search for the Paragraph block with 2 additioanl variations', async () => { + test( 'Insert the Large Quote block variation with slash command', async () => { + await insertBlock( 'Paragraph' ); + + await page.keyboard.type( '/large' ); + await page.keyboard.press( 'Enter' ); + + expect( + await page.$( + '.wp-block[data-type="core/quote"] blockquote.is-style-large' + ) + ).toBeDefined(); + } ); + + test( 'Search for the Paragraph block with 2 additional variations', async () => { await searchForBlock( 'Paragraph' ); expectInserterItem( 'core/paragraph', 'Paragraph' ); diff --git a/packages/e2e-tests/specs/editor/plugins/cpt-locking.test.js b/packages/e2e-tests/specs/editor/plugins/cpt-locking.test.js index ab069ebcfed1e..08002328af1ed 100644 --- a/packages/e2e-tests/specs/editor/plugins/cpt-locking.test.js +++ b/packages/e2e-tests/specs/editor/plugins/cpt-locking.test.js @@ -9,6 +9,7 @@ import { getEditedPostContent, insertBlock, pressKeyTimes, + pressKeyWithModifier, setPostContent, } from '@wordpress/e2e-test-utils'; @@ -47,10 +48,6 @@ describe( 'cpt locking', () => { await page.click( '.block-editor-rich-text__editable[data-type="core/paragraph"]' ); - // Hover the block switcher to show the movers - await page.hover( - '.block-editor-block-toolbar .block-editor-block-toolbar__block-switcher-wrapper' - ); expect( await page.$( 'button[aria-label="Move up"]' ) ).not.toBeNull(); await page.click( 'button[aria-label="Move up"]' ); await page.type( @@ -89,6 +86,18 @@ describe( 'cpt locking', () => { expect( await getEditedPostContent() ).toMatchSnapshot(); } ); + it( 'should insert line breaks when using enter and shift-enter', async () => { + await page.click( + '.block-editor-block-list__block[data-type="core/paragraph"]' + ); + await page.keyboard.type( 'First line' ); + await pressKeyTimes( 'Enter', 1 ); + await page.keyboard.type( 'Second line' ); + await pressKeyWithModifier( 'shift', 'Enter' ); + await page.keyboard.type( 'Third line' ); + expect( await getEditedPostContent() ).toMatchSnapshot(); + } ); + it( 'should show invalid template notice if the blocks do not match the templte', async () => { const content = await getEditedPostContent(); const [ , contentWithoutImage ] = content.split( @@ -114,14 +123,14 @@ describe( 'cpt locking', () => { '.wp-block-column .block-editor-button-block-appender' ); await page.type( '.block-editor-inserter__search-input', 'image' ); - await page.keyboard.press( 'Tab' ); + await pressKeyTimes( 'Tab', 2 ); await page.keyboard.press( 'Enter' ); await page.click( '.edit-post-header-toolbar__inserter-toggle' ); await page.type( '.block-editor-inserter__search-input', 'gallery' ); - await page.keyboard.press( 'Tab' ); + await pressKeyTimes( 'Tab', 2 ); await page.keyboard.press( 'Enter' ); expect( await page.$( '.wp-block-gallery' ) ).not.toBeNull(); } ); diff --git a/packages/e2e-tests/specs/editor/plugins/inner-blocks-render-appender.test.js b/packages/e2e-tests/specs/editor/plugins/inner-blocks-render-appender.test.js index 137ac319a6800..182f224d0976f 100644 --- a/packages/e2e-tests/specs/editor/plugins/inner-blocks-render-appender.test.js +++ b/packages/e2e-tests/specs/editor/plugins/inner-blocks-render-appender.test.js @@ -11,7 +11,8 @@ import { closeGlobalBlockInserter, } from '@wordpress/e2e-test-utils'; -const INSERTER_RESULTS_SELECTOR = '.block-editor-inserter__block-list'; +const INSERTER_RESULTS_SELECTOR = + '.block-editor-inserter__quick-inserter-results'; const QUOTE_INSERT_BUTTON_SELECTOR = '//button[.="Quote"]'; const APPENDER_SELECTOR = '.my-custom-awesome-appender'; const DYNAMIC_APPENDER_SELECTOR = 'my-dynamic-blocks-appender'; diff --git a/packages/e2e-tests/specs/editor/plugins/meta-attribute-block.test.js b/packages/e2e-tests/specs/editor/plugins/meta-attribute-block.test.js index 22569268de629..a11cbb1f6872e 100644 --- a/packages/e2e-tests/specs/editor/plugins/meta-attribute-block.test.js +++ b/packages/e2e-tests/specs/editor/plugins/meta-attribute-block.test.js @@ -41,6 +41,7 @@ describe( 'Block with a meta attribute', () => { await saveDraft(); await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); expect( await getEditedPostContent() ).toMatchSnapshot(); const persistedValue = await page.evaluate( @@ -86,6 +87,7 @@ describe( 'Block with a meta attribute', () => { await saveDraft(); await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); expect( await getEditedPostContent() ).toMatchSnapshot(); const persistedValue = await page.evaluate( diff --git a/packages/e2e-tests/specs/editor/plugins/plugins-api.test.js b/packages/e2e-tests/specs/editor/plugins/plugins-api.test.js index f4a385885e09f..8592722407e9d 100644 --- a/packages/e2e-tests/specs/editor/plugins/plugins-api.test.js +++ b/packages/e2e-tests/specs/editor/plugins/plugins-api.test.js @@ -57,10 +57,11 @@ describe( 'Using Plugins API', () => { it( 'Should render publish panel inside Post-publish sidebar', async () => { await publishPost(); - - const pluginPublishPanelText = await page.$eval( - '.editor-post-publish-panel .my-publish-panel-plugin__post', - ( el ) => el.innerText + const pluginPublishPanel = await page.waitForSelector( + '.editor-post-publish-panel .my-publish-panel-plugin__post' + ); + const pluginPublishPanelText = await pluginPublishPanel.evaluate( + ( node ) => node.innerText ); expect( pluginPublishPanelText ).toMatch( 'My post publish panel' ); } ); @@ -102,11 +103,13 @@ describe( 'Using Plugins API', () => { '.interface-complementary-area-header button[aria-label="Close plugin"]' ); await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); expect( await page.$( SIDEBAR_PINNED_ITEM_BUTTON ) ).toBeNull(); await clickOnMoreMenuItem( 'Sidebar title plugin' ); await page.click( 'button[aria-label="Pin to toolbar"]' ); expect( await page.$( SIDEBAR_PINNED_ITEM_BUTTON ) ).not.toBeNull(); await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); expect( await page.$( SIDEBAR_PINNED_ITEM_BUTTON ) ).not.toBeNull(); } ); diff --git a/packages/e2e-tests/specs/editor/plugins/templates.test.js b/packages/e2e-tests/specs/editor/plugins/templates.test.js index a738ffae94da2..173acdff8c031 100644 --- a/packages/e2e-tests/specs/editor/plugins/templates.test.js +++ b/packages/e2e-tests/specs/editor/plugins/templates.test.js @@ -40,6 +40,7 @@ describe( 'templates', () => { await page.keyboard.press( 'Backspace' ); await saveDraft(); await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); expect( await getEditedPostContent() ).toMatchSnapshot(); } ); @@ -53,6 +54,7 @@ describe( 'templates', () => { await page.keyboard.press( 'Backspace' ); await saveDraft(); await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); expect( await getEditedPostContent() ).toMatchSnapshot(); } ); @@ -103,6 +105,7 @@ describe( 'templates', () => { await page.keyboard.press( 'Backspace' ); await saveDraft(); await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); expect( await getEditedPostContent() ).toMatchSnapshot(); } ); diff --git a/packages/e2e-tests/specs/editor/plugins/wp-editor-meta-box.test.js b/packages/e2e-tests/specs/editor/plugins/wp-editor-meta-box.test.js index 32286764092f1..761830e8481c7 100644 --- a/packages/e2e-tests/specs/editor/plugins/wp-editor-meta-box.test.js +++ b/packages/e2e-tests/specs/editor/plugins/wp-editor-meta-box.test.js @@ -30,6 +30,7 @@ describe( 'WP Editor Meta Boxes', () => { await publishPost(); await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); await expect( page ).toClick( '#test_tinymce_id-html' ); await page.waitForSelector( '#test_tinymce_id' ); diff --git a/packages/e2e-tests/specs/editor/various/__snapshots__/adding-blocks.test.js.snap b/packages/e2e-tests/specs/editor/various/__snapshots__/adding-blocks.test.js.snap index b8160cb3842ef..16a83b6266b96 100644 --- a/packages/e2e-tests/specs/editor/various/__snapshots__/adding-blocks.test.js.snap +++ b/packages/e2e-tests/specs/editor/various/__snapshots__/adding-blocks.test.js.snap @@ -52,3 +52,55 @@ Foo lines preserved[/myshortcode] " `; + +exports[`adding blocks inserts a block in proper place after having clicked \`Browse All\` from inline inserter 1`] = ` +" +

First paragraph

+ + + +

Heading

+ + + +

Second paragraph

+ + + +

Third paragraph

+" +`; + +exports[`adding blocks inserts a block in proper place after having clicked \`Browse All\` from inline inserter 2`] = ` +" +

First paragraph

+ + + +
+ + + +

Heading

+ + + +

Second paragraph

+ + + +

Third paragraph

+" +`; + +exports[`adding blocks inserts blocks at root level when using the root appender while selection is in an inner block 1`] = ` +" +
+ +
+ + + +

2

+" +`; diff --git a/packages/e2e-tests/specs/editor/various/__snapshots__/adding-patterns.test.js.snap b/packages/e2e-tests/specs/editor/various/__snapshots__/adding-patterns.test.js.snap index 6edf4efa96041..40ef6b14920cd 100644 --- a/packages/e2e-tests/specs/editor/various/__snapshots__/adding-patterns.test.js.snap +++ b/packages/e2e-tests/specs/editor/various/__snapshots__/adding-patterns.test.js.snap @@ -2,12 +2,12 @@ exports[`adding blocks should insert a block pattern 1`] = ` " -
- + " -`; +`; \ No newline at end of file diff --git a/packages/e2e-tests/specs/editor/various/__snapshots__/block-editor-keyboard-shortcuts.test.js.snap b/packages/e2e-tests/specs/editor/various/__snapshots__/block-editor-keyboard-shortcuts.test.js.snap new file mode 100644 index 0000000000000..a8f360f46b420 --- /dev/null +++ b/packages/e2e-tests/specs/editor/various/__snapshots__/block-editor-keyboard-shortcuts.test.js.snap @@ -0,0 +1,113 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`block editor keyboard shortcuts move blocks multiple blocks selected should move the blocks down 1`] = ` +" +

First paragraph

+ + + +

Second paragraph

+ + + +

Third paragraph

+" +`; + +exports[`block editor keyboard shortcuts move blocks multiple blocks selected should move the blocks down 2`] = ` +" +

Third paragraph

+ + + +

First paragraph

+ + + +

Second paragraph

+" +`; + +exports[`block editor keyboard shortcuts move blocks multiple blocks selected should move the blocks up 1`] = ` +" +

First paragraph

+ + + +

Second paragraph

+ + + +

Third paragraph

+" +`; + +exports[`block editor keyboard shortcuts move blocks multiple blocks selected should move the blocks up 2`] = ` +" +

Second paragraph

+ + + +

Third paragraph

+ + + +

First paragraph

+" +`; + +exports[`block editor keyboard shortcuts move blocks single block selected should move the block down 1`] = ` +" +

First paragraph

+ + + +

Second paragraph

+ + + +

Third paragraph

+" +`; + +exports[`block editor keyboard shortcuts move blocks single block selected should move the block down 2`] = ` +" +

First paragraph

+ + + +

Third paragraph

+ + + +

Second paragraph

+" +`; + +exports[`block editor keyboard shortcuts move blocks single block selected should move the block up 1`] = ` +" +

First paragraph

+ + + +

Second paragraph

+ + + +

Third paragraph

+" +`; + +exports[`block editor keyboard shortcuts move blocks single block selected should move the block up 2`] = ` +" +

Third paragraph

+ + + +

First paragraph

+ + + +

Second paragraph

+" +`; diff --git a/packages/e2e-tests/specs/editor/various/__snapshots__/editor-modes.test.js.snap b/packages/e2e-tests/specs/editor/various/__snapshots__/editor-modes.test.js.snap new file mode 100644 index 0000000000000..8b5044aeff308 --- /dev/null +++ b/packages/e2e-tests/specs/editor/various/__snapshots__/editor-modes.test.js.snap @@ -0,0 +1,7 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Editing modes (visual/HTML) saves content when using the shortcut in the Code Editor 1`] = ` +" +

Hi world!

+" +`; diff --git a/packages/e2e-tests/specs/editor/various/__snapshots__/embedding.test.js.snap b/packages/e2e-tests/specs/editor/various/__snapshots__/embedding.test.js.snap index 9672627058066..f033b781c3dd2 100644 --- a/packages/e2e-tests/specs/editor/various/__snapshots__/embedding.test.js.snap +++ b/packages/e2e-tests/specs/editor/various/__snapshots__/embedding.test.js.snap @@ -5,3 +5,63 @@ exports[`Embedding content should allow the user to convert unembeddable URLs to

https://twitter.com/wooyaygutenberg123454312

" `; + +exports[`Embedding content should allow the user to try embedding a failed URL again 1`] = ` +" +
+https://twitter.com/wooyaygutenberg123454312 +
+" +`; + +exports[`Embedding content should render embeds in the correct state 1`] = ` +" +
+https://twitter.com/notnownikki +
+ + + +
+https://twitter.com/wooyaygutenberg123454312 +
+ + + +
+https://wordpress.org/gutenberg/handbook/ +
+ + + +
+https://twitter.com/thatbunty +
+ + + +
+https://wordpress.org/gutenberg/handbook/block-api/attributes/ +
+ + + +
+https://www.youtube.com/watch?v=lXMskKTw3Bc +
+ + + +
+https://cloudup.com/cQFlxqtY4ob +
+" +`; + +exports[`Embedding content should retry embeds that could not be embedded with trailing slashes, without the trailing slashes 1`] = ` +" +
+https://twitter.com/notnownikki/ +
+" +`; diff --git a/packages/e2e-tests/specs/editor/various/__snapshots__/rtl.test.js.snap b/packages/e2e-tests/specs/editor/various/__snapshots__/rtl.test.js.snap index 19b4e8c305acc..a8b94682a4596 100644 --- a/packages/e2e-tests/specs/editor/various/__snapshots__/rtl.test.js.snap +++ b/packages/e2e-tests/specs/editor/various/__snapshots__/rtl.test.js.snap @@ -8,11 +8,11 @@ exports[`RTL should arrow navigate 1`] = ` exports[`RTL should arrow navigate between blocks 1`] = ` " -

٠
١

+

٠

-

٠
١
٢

+


١١٠

٢

" `; @@ -24,7 +24,11 @@ exports[`RTL should merge backward 1`] = ` exports[`RTL should merge forward 1`] = ` " -

٠١

+

٠

+ + + +

" `; diff --git a/packages/e2e-tests/specs/editor/various/__snapshots__/writing-flow.test.js.snap b/packages/e2e-tests/specs/editor/various/__snapshots__/writing-flow.test.js.snap index 01dc6c0b68269..13766cd2526a1 100644 --- a/packages/e2e-tests/specs/editor/various/__snapshots__/writing-flow.test.js.snap +++ b/packages/e2e-tests/specs/editor/various/__snapshots__/writing-flow.test.js.snap @@ -116,6 +116,12 @@ exports[`Writing Flow should merge forwards 1`] = ` " `; +exports[`Writing Flow should merge paragraphs 1`] = ` +" +

12

+" +`; + exports[`Writing Flow should navigate around inline boundaries 1`] = ` "

FirstAfter

diff --git a/packages/e2e-tests/specs/editor/various/adding-blocks.test.js b/packages/e2e-tests/specs/editor/various/adding-blocks.test.js index 6e222ff24e5b7..d6d1496da80a7 100644 --- a/packages/e2e-tests/specs/editor/various/adding-blocks.test.js +++ b/packages/e2e-tests/specs/editor/various/adding-blocks.test.js @@ -34,6 +34,7 @@ describe( 'adding blocks', () => { it( 'Should insert content using the placeholder and the regular inserter', async () => { // This ensures the editor is loaded in navigation mode. await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); // Set a tall viewport. The typewriter's intrinsic height can be enough // to scroll the page on a shorter viewport, thus obscuring the presence @@ -44,12 +45,17 @@ describe( 'adding blocks', () => { await clickAtBottom( await page.$( '.interface-interface-skeleton__content' ) ); - expect( await page.$( '[data-type="core/paragraph"]' ) ).not.toBeNull(); + expect( + await page.waitForSelector( '[data-type="core/paragraph"]' ) + ).not.toBeNull(); await page.keyboard.type( 'Paragraph block' ); // Using the slash command await page.keyboard.press( 'Enter' ); await page.keyboard.type( '/quote' ); + await page.waitForXPath( + `//*[contains(@class, "components-autocomplete__result") and contains(@class, "is-selected") and contains(text(), 'Quote')]` + ); await page.keyboard.press( 'Enter' ); await page.keyboard.type( 'Quote block' ); @@ -62,6 +68,9 @@ describe( 'adding blocks', () => { // append the default block. Pressing backspace on the focused block // will remove it. await page.keyboard.type( '/image' ); + await page.waitForXPath( + `//*[contains(@class, "components-autocomplete__result") and contains(@class, "is-selected") and contains(text(), 'Image')]` + ); await page.keyboard.press( 'Enter' ); await page.keyboard.press( 'Enter' ); expect( await getEditedPostContent() ).toMatchSnapshot(); @@ -152,7 +161,6 @@ describe( 'adding blocks', () => { // Tab to the block list await page.keyboard.press( 'Tab' ); - await page.keyboard.press( 'Tab' ); // Expect the block list to be the active element. activeElementClassList = await page.evaluate( @@ -184,4 +192,74 @@ describe( 'adding blocks', () => { 'block-editor-inserter__toggle' ); } ); + + // Check for regression of https://github.com/WordPress/gutenberg/issues/23263 + it( 'inserts blocks at root level when using the root appender while selection is in an inner block', async () => { + await insertBlock( 'Buttons' ); + await page.keyboard.type( '1.1' ); + + // After inserting the Buttons block the inner button block should be selected. + const selectedButtonBlocks = await page.$$( + '.wp-block-button.is-selected' + ); + expect( selectedButtonBlocks.length ).toBe( 1 ); + + // Specifically click the root container appender. + await page.click( + '.block-editor-block-list__layout.is-root-container > .block-list-appender .block-editor-inserter__toggle' + ); + + // Insert a paragraph block. + await page.waitForSelector( '.block-editor-inserter__search-input' ); + await page.keyboard.type( 'Paragraph' ); + await page.click( '.editor-block-list-item-paragraph' ); + await page.keyboard.type( '2' ); + + // The snapshot should show a buttons block followed by a paragraph. + // The buttons block should contain a single button. + expect( await getEditedPostContent() ).toMatchSnapshot(); + } ); + + // Check for regression of https://github.com/WordPress/gutenberg/issues/24262 + it( 'inserts a block in proper place after having clicked `Browse All` from inline inserter', async () => { + await insertBlock( 'Paragraph' ); + await page.keyboard.type( 'First paragraph' ); + await insertBlock( 'Heading' ); + await page.keyboard.type( 'Heading' ); + await page.keyboard.press( 'Enter' ); + await insertBlock( 'Paragraph' ); + await page.keyboard.type( 'Second paragraph' ); + await page.keyboard.press( 'Enter' ); + await page.keyboard.type( 'Third paragraph' ); + expect( await getEditedPostContent() ).toMatchSnapshot(); + + // Using the between inserter + const insertionPoint = await page.$( '[data-type="core/heading"]' ); + const rect = await insertionPoint.boundingBox(); + await page.mouse.move( rect.x + rect.width / 2, rect.y - 10, { + steps: 10, + } ); + await page.waitForSelector( + '.block-editor-block-list__insertion-point .block-editor-inserter__toggle' + ); + await page.click( + '.block-editor-block-list__insertion-point .block-editor-inserter__toggle' + ); + + const browseAll = await page.waitForSelector( + 'button.block-editor-inserter__quick-inserter-expand' + ); + await browseAll.click(); + const inserterMenuInputSelector = + '.edit-post-layout__inserter-panel .block-editor-inserter__search-input'; + const inserterMenuSearchInput = await page.waitForSelector( + inserterMenuInputSelector + ); + inserterMenuSearchInput.type( 'cover' ); + const coverBlock = await page.waitForSelector( + '.block-editor-block-types-list .editor-block-list-item-cover' + ); + await coverBlock.click(); + expect( await getEditedPostContent() ).toMatchSnapshot(); + } ); } ); diff --git a/packages/e2e-tests/specs/editor/various/adding-patterns.test.js b/packages/e2e-tests/specs/editor/various/adding-patterns.test.js index b8fe904b85178..ab6668d8bb087 100644 --- a/packages/e2e-tests/specs/editor/various/adding-patterns.test.js +++ b/packages/e2e-tests/specs/editor/various/adding-patterns.test.js @@ -15,7 +15,7 @@ describe( 'adding blocks', () => { } ); it( 'should insert a block pattern', async () => { - await insertPattern( 'Two Buttons' ); + await insertPattern( 'Two buttons' ); expect( await getEditedPostContent() ).toMatchSnapshot(); } ); diff --git a/packages/e2e-tests/specs/editor/various/autosave.test.js b/packages/e2e-tests/specs/editor/various/autosave.test.js index 5780302794aac..34822f8c680aa 100644 --- a/packages/e2e-tests/specs/editor/various/autosave.test.js +++ b/packages/e2e-tests/specs/editor/various/autosave.test.js @@ -44,7 +44,7 @@ async function clearSessionStorage() { async function readSessionStorageAutosave( postId ) { return page.evaluate( ( key ) => window.sessionStorage.getItem( key ), - `wp-autosave-block-editor-post-${ postId }` + `wp-autosave-block-editor-post-${ postId ? postId : 'auto-draft' }` ); } @@ -76,9 +76,14 @@ describe( 'autosave', () => { } ); it( 'should save to sessionStorage', async () => { + // Wait for the original timeout to kick in, it will schedule + // another run using the updated interval length of AUTOSAVE_INTERVAL_SECONDS + await sleep( 15 ); + await clickBlockAppender(); await page.keyboard.type( 'before save' ); await saveDraftWithKeyboard(); + await sleep( 1 ); await page.keyboard.type( ' after save' ); // Wait long enough for local autosave to kick in @@ -88,19 +93,6 @@ describe( 'autosave', () => { const autosave = await readSessionStorageAutosave( id ); const { content } = JSON.parse( autosave ); expect( content ).toBe( wrapParagraph( 'before save after save' ) ); - - // Test throttling by scattering typing - await page.keyboard.type( ' 1' ); - await sleep( AUTOSAVE_INTERVAL_SECONDS - 4 ); - await page.keyboard.type( '2' ); - await sleep( 2 ); - await page.keyboard.type( '3' ); - await sleep( 2 ); - - const newAutosave = await readSessionStorageAutosave( id ); - expect( JSON.parse( newAutosave ).content ).toBe( - wrapParagraph( 'before save after save 123' ) - ); } ); it( 'should recover from sessionStorage', async () => { @@ -117,6 +109,7 @@ describe( 'autosave', () => { ); // Reload without saving on the server await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); const notice = await page.$eval( '.components-notice__content', @@ -192,6 +185,7 @@ describe( 'autosave', () => { ).toBe( 1 ); await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); const notice = await page.$eval( '.components-notice__content', ( element ) => element.innerText @@ -219,7 +213,7 @@ describe( 'autosave', () => { ); expect( await page.evaluate( () => window.sessionStorage.length ) - ).toBe( 1 ); + ).toBeGreaterThanOrEqual( 1 ); // Trigger remote autosave await page.evaluate( () => @@ -295,14 +289,14 @@ describe( 'autosave', () => { ); expect( await page.evaluate( () => window.sessionStorage.length ) - ).toBe( 1 ); + ).toBeGreaterThanOrEqual( 1 ); // Bring network down and attempt to save toggleOfflineMode( true ); saveDraftWithKeyboard(); expect( await page.evaluate( () => window.sessionStorage.length ) - ).toBe( 1 ); + ).toBeGreaterThanOrEqual( 1 ); } ); it( "shouldn't conflict with server-side autosave", async () => { @@ -326,9 +320,10 @@ describe( 'autosave', () => { ); expect( await page.evaluate( () => window.sessionStorage.length ) - ).toBe( 1 ); + ).toBeGreaterThanOrEqual( 1 ); await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); // FIXME: Occasionally, upon reload, there is no server-provided // autosave value available, despite our having previously explicitly diff --git a/packages/e2e-tests/specs/editor/various/block-deletion.test.js b/packages/e2e-tests/specs/editor/various/block-deletion.test.js index 00027d94137cf..b54348fab54fd 100644 --- a/packages/e2e-tests/specs/editor/various/block-deletion.test.js +++ b/packages/e2e-tests/specs/editor/various/block-deletion.test.js @@ -66,11 +66,6 @@ describe( 'block deletion -', () => { it( 'results in two remaining blocks and positions the caret at the end of the second block', async () => { // The blocks can't be empty to trigger the toolbar await page.keyboard.type( 'Paragraph to remove' ); - - // Move the mouse to show the block toolbar - await page.mouse.move( 0, 0 ); - await page.mouse.move( 10, 10 ); - await clickOnBlockSettingsMenuRemoveBlockButton(); expect( await getEditedPostContent() ).toMatchSnapshot(); @@ -109,6 +104,9 @@ describe( 'block deletion -', () => { it( 'results in three remaining blocks and positions the caret at the end of the third block', async () => { // Add an image block since it's easier to click the wrapper on non-textual blocks. await page.keyboard.type( '/image' ); + await page.waitForXPath( + `//*[contains(@class, "components-autocomplete__result") and contains(@class, "is-selected") and contains(text(), 'Image')]` + ); await page.keyboard.press( 'Enter' ); // Click on something that's not a block. @@ -156,11 +154,6 @@ describe( 'deleting all blocks', () => { it( 'results in the default block getting selected', async () => { await clickBlockAppender(); await page.keyboard.type( 'Paragraph' ); - - // Move the mouse to show the block toolbar - await page.mouse.move( 0, 0 ); - await page.mouse.move( 10, 10 ); - await clickOnBlockSettingsMenuRemoveBlockButton(); // There is a default block: @@ -196,6 +189,7 @@ describe( 'deleting all blocks', () => { // Add and remove a block. await insertBlock( 'Image' ); + await page.waitForSelector( 'figure[data-type="core/image"]' ); await page.keyboard.press( 'Backspace' ); // Verify there is no selected block. diff --git a/packages/e2e-tests/specs/editor/various/block-editor-keyboard-shortcuts.test.js b/packages/e2e-tests/specs/editor/various/block-editor-keyboard-shortcuts.test.js new file mode 100644 index 0000000000000..6dd9938f4a681 --- /dev/null +++ b/packages/e2e-tests/specs/editor/various/block-editor-keyboard-shortcuts.test.js @@ -0,0 +1,69 @@ +/** + * WordPress dependencies + */ +import { + createNewPost, + clickBlockAppender, + getEditedPostContent, + pressKeyWithModifier, +} from '@wordpress/e2e-test-utils'; + +const createTestParagraphBlocks = async () => { + await clickBlockAppender(); + await page.keyboard.type( 'First paragraph' ); + await page.keyboard.press( 'Enter' ); + await page.keyboard.type( 'Second paragraph' ); + await page.keyboard.press( 'Enter' ); + await page.keyboard.type( 'Third paragraph' ); +}; + +describe( 'block editor keyboard shortcuts', () => { + beforeEach( async () => { + await createNewPost(); + } ); + + describe( 'move blocks', () => { + const moveUp = async () => pressKeyWithModifier( 'secondary', 't' ); + const moveDown = async () => pressKeyWithModifier( 'secondary', 'y' ); + describe( 'single block selected', () => { + it( 'should move the block up', async () => { + await createTestParagraphBlocks(); + expect( await getEditedPostContent() ).toMatchSnapshot(); + await moveUp(); + await moveUp(); + expect( await getEditedPostContent() ).toMatchSnapshot(); + } ); + + it( 'should move the block down', async () => { + await createTestParagraphBlocks(); + expect( await getEditedPostContent() ).toMatchSnapshot(); + await page.keyboard.press( 'ArrowUp' ); + await moveDown(); + expect( await getEditedPostContent() ).toMatchSnapshot(); + } ); + } ); + + describe( 'multiple blocks selected', () => { + it( 'should move the blocks up', async () => { + await createTestParagraphBlocks(); + expect( await getEditedPostContent() ).toMatchSnapshot(); + await page.keyboard.down( 'Shift' ); + await page.keyboard.press( 'ArrowUp' ); + await page.keyboard.up( 'Shift' ); + await moveUp(); + expect( await getEditedPostContent() ).toMatchSnapshot(); + } ); + + it( 'should move the blocks down', async () => { + await createTestParagraphBlocks(); + expect( await getEditedPostContent() ).toMatchSnapshot(); + await page.keyboard.press( 'ArrowUp' ); + await page.keyboard.down( 'Shift' ); + await page.keyboard.press( 'ArrowUp' ); + await page.keyboard.up( 'Shift' ); + await moveDown(); + expect( await getEditedPostContent() ).toMatchSnapshot(); + } ); + } ); + } ); +} ); diff --git a/packages/e2e-tests/specs/editor/various/block-hierarchy-navigation.test.js b/packages/e2e-tests/specs/editor/various/block-hierarchy-navigation.test.js index eceecaaf95ae8..1d268e6dc1cc4 100644 --- a/packages/e2e-tests/specs/editor/various/block-hierarchy-navigation.test.js +++ b/packages/e2e-tests/specs/editor/various/block-hierarchy-navigation.test.js @@ -30,12 +30,12 @@ describe( 'Navigating the block hierarchy', () => { await page.keyboard.press( 'Tab' ); // Tab to inserter. await page.keyboard.press( 'Enter' ); // Activate inserter. await page.keyboard.type( 'Paragraph' ); - await pressKeyTimes( 'Tab', 3 ); // Tab to paragraph result. + await pressKeyTimes( 'Tab', 2 ); // Tab to paragraph result. await page.keyboard.press( 'Enter' ); // Insert paragraph. await page.keyboard.type( 'First column' ); // Navigate to the columns blocks. - await page.click( '[aria-label="Block navigation"]' ); + await page.click( '[aria-label="Outline"]' ); const columnsBlockMenuItem = ( await page.$x( "//button[contains(@class,'block-editor-block-navigation-block-select-button') and contains(text(), 'Columns')]" @@ -46,7 +46,7 @@ describe( 'Navigating the block hierarchy', () => { // Tweak the columns count. await openDocumentSettingsSidebar(); await page.focus( - '.block-editor-block-inspector .components-range-control__number[aria-label="Columns"]' + '.block-editor-block-inspector [aria-label="Columns"][type="number"]' ); await page.keyboard.down( 'Shift' ); await page.keyboard.press( 'ArrowLeft' ); @@ -54,7 +54,7 @@ describe( 'Navigating the block hierarchy', () => { await page.keyboard.type( '3' ); // Navigate to the last column block. - await page.click( '[aria-label="Block navigation"]' ); + await page.click( '[aria-label="Outline"]' ); const lastColumnsBlockMenuItem = ( await page.$x( "//button[contains(@class,'block-editor-block-navigation-block-select-button') and contains(text(), 'Column')]" @@ -66,7 +66,7 @@ describe( 'Navigating the block hierarchy', () => { await page.keyboard.press( 'Tab' ); // Tab to inserter. await page.keyboard.press( 'Enter' ); // Activate inserter. await page.keyboard.type( 'Paragraph' ); - await pressKeyTimes( 'Tab', 3 ); // Tab to paragraph result. + await pressKeyTimes( 'Tab', 2 ); // Tab to paragraph result. await page.keyboard.press( 'Enter' ); // Insert paragraph. await page.keyboard.type( 'Third column' ); @@ -82,7 +82,7 @@ describe( 'Navigating the block hierarchy', () => { await page.keyboard.press( 'Tab' ); // Tab to inserter. await page.keyboard.press( 'Enter' ); // Activate inserter. await page.keyboard.type( 'Paragraph' ); - await pressKeyTimes( 'Tab', 3 ); // Tab to paragraph result. + await pressKeyTimes( 'Tab', 2 ); // Tab to paragraph result. await page.keyboard.press( 'Enter' ); // Insert paragraph. await page.keyboard.type( 'First column' ); @@ -109,7 +109,7 @@ describe( 'Navigating the block hierarchy', () => { await page.keyboard.press( 'Tab' ); // Tab to inserter. await page.keyboard.press( 'Enter' ); // Activate inserter. await page.keyboard.type( 'Paragraph' ); - await pressKeyTimes( 'Tab', 3 ); // Tab to paragraph result. + await pressKeyTimes( 'Tab', 2 ); // Tab to paragraph result. await page.keyboard.press( 'Enter' ); // Insert paragraph. await page.keyboard.type( 'Third column' ); @@ -159,8 +159,8 @@ describe( 'Navigating the block hierarchy', () => { // Unselect the blocks await page.click( '.editor-post-title' ); - // Try selecting the group block using the block navigation - await page.click( '[aria-label="Block navigation"]' ); + // Try selecting the group block using the Outline + await page.click( '[aria-label="Outline"]' ); const groupMenuItem = ( await page.$x( "//button[contains(@class,'block-editor-block-navigation-block-select-button') and contains(text(), 'Group')]" diff --git a/packages/e2e-tests/specs/editor/various/block-mover.test.js b/packages/e2e-tests/specs/editor/various/block-mover.test.js index 3b936f212aba0..c3a04f6f3a6c4 100644 --- a/packages/e2e-tests/specs/editor/various/block-mover.test.js +++ b/packages/e2e-tests/specs/editor/various/block-mover.test.js @@ -1,7 +1,7 @@ /** * WordPress dependencies */ -import { createNewPost } from '@wordpress/e2e-test-utils'; +import { createNewPost, showBlockToolbar } from '@wordpress/e2e-test-utils'; describe( 'block mover', () => { beforeEach( async () => { @@ -18,9 +18,7 @@ describe( 'block mover', () => { // Select a block so the block mover is rendered. await page.focus( '.block-editor-block-list__block' ); - // Move the mouse to show the block toolbar - await page.mouse.move( 0, 0 ); - await page.mouse.move( 10, 10 ); + await showBlockToolbar(); const blockMover = await page.$$( '.block-editor-block-mover' ); // There should be a block mover. @@ -35,9 +33,7 @@ describe( 'block mover', () => { // Select a block so the block mover has the possibility of being rendered. await page.focus( '.block-editor-block-list__block' ); - // Move the mouse to show the block toolbar - await page.mouse.move( 0, 0 ); - await page.mouse.move( 10, 10 ); + await showBlockToolbar(); // Ensure no block mover exists when only one block exists on the page. const blockMover = await page.$$( '.block-editor-block-mover' ); diff --git a/packages/e2e-tests/specs/editor/various/block-switcher.test.js b/packages/e2e-tests/specs/editor/various/block-switcher.test.js index c330f8680af55..f4d8e1031880a 100644 --- a/packages/e2e-tests/specs/editor/various/block-switcher.test.js +++ b/packages/e2e-tests/specs/editor/various/block-switcher.test.js @@ -24,11 +24,15 @@ describe( 'Block Switcher', () => { expect( await hasBlockSwitcher() ).toBeTruthy(); // Verify the correct block transforms appear. - expect( await getAvailableBlockTransforms() ).toEqual( [ - 'Group', - 'Paragraph', - 'Quote', - ] ); + expect( await getAvailableBlockTransforms() ).toEqual( + expect.arrayContaining( [ + 'Group', + 'Paragraph', + 'Quote', + 'Heading', + 'Pullquote', + ] ) + ); } ); it( 'Should show the expected block transforms on the list block when the quote block is removed', async () => { @@ -46,18 +50,26 @@ describe( 'Block Switcher', () => { expect( await hasBlockSwitcher() ).toBeTruthy(); // Verify the correct block transforms appear. - expect( await getAvailableBlockTransforms() ).toEqual( [ - 'Group', - 'Paragraph', - ] ); + expect( await getAvailableBlockTransforms() ).toEqual( + expect.arrayContaining( [ + 'Group', + 'Paragraph', + 'Pullquote', + 'Heading', + ] ) + ); } ); it( 'Should not show the block switcher if all the blocks the list block transforms into are removed', async () => { // Remove the paragraph and quote block from the list of registered blocks. await page.evaluate( () => { - [ 'core/quote', 'core/paragraph', 'core/group' ].map( ( block ) => - wp.blocks.unregisterBlockType( block ) - ); + [ + 'core/quote', + 'core/pullquote', + 'core/paragraph', + 'core/group', + 'core/heading', + ].map( ( block ) => wp.blocks.unregisterBlockType( block ) ); } ); // Insert a list block. diff --git a/packages/e2e-tests/specs/editor/various/dropdown-menu.test.js b/packages/e2e-tests/specs/editor/various/dropdown-menu.test.js new file mode 100644 index 0000000000000..1ab5730ab6677 --- /dev/null +++ b/packages/e2e-tests/specs/editor/various/dropdown-menu.test.js @@ -0,0 +1,143 @@ +/** + * WordPress dependencies + */ +import { createNewPost, pressKeyTimes } from '@wordpress/e2e-test-utils'; + +const moreMenuButtonSelector = '.components-button[aria-label="Options"]'; +const moreMenuDropdownSelector = + '.components-dropdown-menu__menu[aria-label="Options"]'; +const menuItemsSelector = [ 'menuitem', 'menuitemcheckbox', 'menuitemradio' ] + .map( ( role ) => `${ moreMenuDropdownSelector } [role="${ role }"]` ) + .join( ',' ); + +describe( 'Dropdown Menu', () => { + beforeEach( async () => { + await createNewPost(); + } ); + + it( 'allows navigation through each item using arrow keys', async () => { + await page.click( moreMenuButtonSelector ); + const menuItems = await page.$$( menuItemsSelector ); + + // Catch any issues with the selector, which could cause a false positive test result. + expect( menuItems.length ).toBeGreaterThan( 0 ); + + let activeElementText = await page.evaluate( + () => document.activeElement.textContent + ); + const [ firstMenuItem ] = menuItems; + const firstMenuItemText = await firstMenuItem.evaluate( + ( element ) => element.textContent + ); + + // Expect the first menu item to be focused. + expect( activeElementText ).toBeDefined(); + expect( activeElementText ).toBe( firstMenuItemText ); + + // Arrow down to the last item. + await pressKeyTimes( 'ArrowDown', menuItems.length - 1 ); + + activeElementText = await page.evaluate( + () => document.activeElement.textContent + ); + + const [ lastMenuItem ] = menuItems.slice( -1 ); + const lastMenuItemText = await lastMenuItem.evaluate( + ( element ) => element.textContent + ); + + // Expect the last menu item to be focused. + expect( activeElementText ).toBeDefined(); + expect( activeElementText ).toBe( lastMenuItemText ); + + // Arrow back up to the first item. + await pressKeyTimes( 'ArrowUp', menuItems.length - 1 ); + + activeElementText = await page.evaluate( + () => document.activeElement.textContent + ); + + // Expect the first menu item to be focused again. + expect( activeElementText ).toBeDefined(); + expect( activeElementText ).toBe( firstMenuItemText ); + } ); + + it( 'loops to the beginning and end when navigating past the boundaries of the menu', async () => { + await page.click( moreMenuButtonSelector ); + const menuItems = await page.$$( menuItemsSelector ); + + // Catch any issues with the selector, which could cause a false positive test result. + expect( menuItems.length ).toBeGreaterThan( 0 ); + + let activeElementText = await page.evaluate( + () => document.activeElement.textContent + ); + const [ firstMenuItem ] = menuItems; + const firstMenuItemText = await firstMenuItem.evaluate( + ( element ) => element.textContent + ); + + // Expect the first menu item to be focused. + expect( activeElementText ).toBeDefined(); + expect( activeElementText ).toBe( firstMenuItemText ); + + // Arrow up to the last item. + await page.keyboard.press( 'ArrowUp' ); + + activeElementText = await page.evaluate( + () => document.activeElement.textContent + ); + + const [ lastMenuItem ] = menuItems.slice( -1 ); + const lastMenuItemText = await lastMenuItem.evaluate( + ( element ) => element.textContent + ); + + // Expect the last menu item to be focused. + expect( activeElementText ).toBeDefined(); + expect( activeElementText ).toBe( lastMenuItemText ); + + // Arrow back down to the first item. + await page.keyboard.press( 'ArrowDown' ); + + activeElementText = await page.evaluate( + () => document.activeElement.textContent + ); + + // Expect the first menu item to be focused again. + expect( activeElementText ).toBeDefined(); + expect( activeElementText ).toBe( firstMenuItemText ); + } ); + + it( 'ignores arrow key navigation that is orthogonal to the orientation of the menu, but stays open', async () => { + await page.click( moreMenuButtonSelector ); + const menuItems = await page.$$( menuItemsSelector ); + + // Catch any issues with the selector, which could cause a false positive test result. + expect( menuItems.length ).toBeGreaterThan( 0 ); + + let activeElementText = await page.evaluate( + () => document.activeElement.textContent + ); + const [ firstMenuItem ] = menuItems; + const firstMenuItemText = await firstMenuItem.evaluate( + ( element ) => element.textContent + ); + + // Expect the first menu item to be focused. + expect( activeElementText ).toBeDefined(); + expect( activeElementText ).toBe( firstMenuItemText ); + + // Press left and right keys an arbitrary (but > 1) number of times. + await pressKeyTimes( 'ArrowLeft', 5 ); + await pressKeyTimes( 'ArrowRight', 5 ); + + activeElementText = await page.evaluate( + () => document.activeElement.textContent + ); + + // Expect the first menu item to still be focused. + expect( activeElementText ).toBeDefined(); + expect( activeElementText ).toBe( firstMenuItemText ); + } ); +} ); diff --git a/packages/e2e-tests/specs/editor/various/editor-modes.test.js b/packages/e2e-tests/specs/editor/various/editor-modes.test.js index 6aef17cd69594..53c280301316a 100644 --- a/packages/e2e-tests/specs/editor/various/editor-modes.test.js +++ b/packages/e2e-tests/specs/editor/various/editor-modes.test.js @@ -5,7 +5,10 @@ import { clickBlockAppender, clickBlockToolbarButton, createNewPost, + getCurrentPostContent, switchEditorModeTo, + pressKeyTimes, + pressKeyWithModifier, } from '@wordpress/e2e-test-utils'; describe( 'Editing modes (visual/HTML)', () => { @@ -22,10 +25,6 @@ describe( 'Editing modes (visual/HTML)', () => { ); expect( visualBlock ).toHaveLength( 1 ); - // Move the mouse to show the block toolbar - await page.mouse.move( 0, 0 ); - await page.mouse.move( 10, 10 ); - // Change editing mode from "Visual" to "HTML". await clickBlockToolbarButton( 'More options' ); let changeModeButton = await page.waitForXPath( @@ -39,10 +38,6 @@ describe( 'Editing modes (visual/HTML)', () => { ); expect( htmlBlock ).toHaveLength( 1 ); - // Move the mouse to show the block toolbar - await page.mouse.move( 0, 0 ); - await page.mouse.move( 10, 10 ); - // Change editing mode from "HTML" back to "Visual". await clickBlockToolbarButton( 'More options' ); changeModeButton = await page.waitForXPath( @@ -58,10 +53,6 @@ describe( 'Editing modes (visual/HTML)', () => { } ); it( 'should display sidebar in HTML mode', async () => { - // Move the mouse to show the block toolbar - await page.mouse.move( 0, 0 ); - await page.mouse.move( 10, 10 ); - // Change editing mode from "Visual" to "HTML". await clickBlockToolbarButton( 'More options' ); const changeModeButton = await page.waitForXPath( @@ -78,10 +69,6 @@ describe( 'Editing modes (visual/HTML)', () => { } ); it( 'should update HTML in HTML mode when sidebar is used', async () => { - // Move the mouse to show the block toolbar - await page.mouse.move( 0, 0 ); - await page.mouse.move( 10, 10 ); - // Change editing mode from "Visual" to "HTML". await clickBlockToolbarButton( 'More options' ); const changeModeButton = await page.waitForXPath( @@ -150,4 +137,29 @@ describe( 'Editing modes (visual/HTML)', () => { ); expect( disabledInserter ).not.toBeNull(); } ); + + // Test for regressions of https://github.com/WordPress/gutenberg/issues/24054. + it( 'saves content when using the shortcut in the Code Editor', async () => { + await switchEditorModeTo( 'Code' ); + + const textContent = await page.evaluate( + () => document.querySelector( '.editor-post-text-editor' ).value + ); + const editPosition = textContent.indexOf( 'Hello' ); + + // Replace the word 'Hello' with 'Hi'. + await page.click( '.editor-post-title__input' ); + await page.keyboard.press( 'Tab' ); + await pressKeyTimes( 'ArrowRight', editPosition ); + await pressKeyTimes( 'Delete', 5 ); + await page.keyboard.type( 'Hi' ); + + // Save the post using the shortcut. + await pressKeyWithModifier( 'primary', 's' ); + await page.waitForSelector( '.editor-post-saved-state.is-saved' ); + + await switchEditorModeTo( 'Visual' ); + + expect( await getCurrentPostContent() ).toMatchSnapshot(); + } ); } ); diff --git a/packages/e2e-tests/specs/editor/various/embedding.test.js b/packages/e2e-tests/specs/editor/various/embedding.test.js index 9e30ec116f3c3..170965215eceb 100644 --- a/packages/e2e-tests/specs/editor/various/embedding.test.js +++ b/packages/e2e-tests/specs/editor/various/embedding.test.js @@ -151,6 +151,17 @@ const MOCK_RESPONSES = [ }, ]; +async function insertEmbed( URL ) { + await clickBlockAppender(); + await page.keyboard.type( '/embed' ); + await page.waitForXPath( + `//*[contains(@class, "components-autocomplete__result") and contains(@class, "is-selected") and contains(text(), 'Embed')]` + ); + await page.keyboard.press( 'Enter' ); + await page.keyboard.type( URL ); + await page.keyboard.press( 'Enter' ); +} + describe( 'Embedding content', () => { beforeEach( async () => { await setUpResponseMocking( MOCK_RESPONSES ); @@ -159,87 +170,50 @@ describe( 'Embedding content', () => { it( 'should render embeds in the correct state', async () => { // Valid embed. Should render valid figure element. - await clickBlockAppender(); - await page.keyboard.type( '/embed' ); - await page.keyboard.press( 'Enter' ); - await page.keyboard.type( 'https://twitter.com/notnownikki' ); - await page.keyboard.press( 'Enter' ); - await page.waitForSelector( 'figure.wp-block-embed-twitter' ); + await insertEmbed( 'https://twitter.com/notnownikki' ); + await page.waitForSelector( 'figure.wp-block-embed' ); // Valid provider; invalid content. Should render failed, edit state. - await clickBlockAppender(); - await page.keyboard.type( '/embed' ); - await page.keyboard.press( 'Enter' ); - await page.keyboard.type( - 'https://twitter.com/wooyaygutenberg123454312' - ); - await page.keyboard.press( 'Enter' ); + await insertEmbed( 'https://twitter.com/wooyaygutenberg123454312' ); await page.waitForSelector( 'input[value="https://twitter.com/wooyaygutenberg123454312"]' ); // WordPress invalid content. Should render failed, edit state. - await clickBlockAppender(); - await page.keyboard.type( '/embed' ); - await page.keyboard.press( 'Enter' ); - await page.keyboard.type( 'https://wordpress.org/gutenberg/handbook/' ); - await page.keyboard.press( 'Enter' ); + await insertEmbed( 'https://wordpress.org/gutenberg/handbook/' ); await page.waitForSelector( 'input[value="https://wordpress.org/gutenberg/handbook/"]' ); // Provider whose oembed API has gone wrong. Should render failed, edit // state. - await clickBlockAppender(); - await page.keyboard.type( '/embed' ); - await page.keyboard.press( 'Enter' ); - await page.keyboard.type( 'https://twitter.com/thatbunty' ); - await page.keyboard.press( 'Enter' ); + await insertEmbed( 'https://twitter.com/thatbunty' ); await page.waitForSelector( 'input[value="https://twitter.com/thatbunty"]' ); // WordPress content that can be embedded. Should render valid figure // element. - await clickBlockAppender(); - await page.keyboard.type( '/embed' ); - await page.keyboard.press( 'Enter' ); - await page.keyboard.type( + await insertEmbed( 'https://wordpress.org/gutenberg/handbook/block-api/attributes/' ); - await page.keyboard.press( 'Enter' ); - await page.waitForSelector( 'figure.wp-block-embed-wordpress' ); + await page.waitForSelector( 'figure.wp-block-embed' ); // Video content. Should render valid figure element, and include the // aspect ratio class. - await clickBlockAppender(); - await page.keyboard.type( '/embed' ); - await page.keyboard.press( 'Enter' ); - await page.keyboard.type( - 'https://www.youtube.com/watch?v=lXMskKTw3Bc' - ); - await page.keyboard.press( 'Enter' ); + await insertEmbed( 'https://www.youtube.com/watch?v=lXMskKTw3Bc' ); await page.waitForSelector( - 'figure.wp-block-embed-youtube.wp-embed-aspect-16-9' + 'figure.wp-block-embed.is-type-video.wp-embed-aspect-16-9' ); // Photo content. Should render valid figure element. - await clickBlockAppender(); - await page.keyboard.type( '/embed' ); - await page.keyboard.press( 'Enter' ); - await page.keyboard.type( 'https://cloudup.com/cQFlxqtY4ob' ); - await page.keyboard.press( 'Enter' ); + await insertEmbed( 'https://cloudup.com/cQFlxqtY4ob' ); + expect( await getEditedPostContent() ).toMatchSnapshot(); } ); it( 'should allow the user to convert unembeddable URLs to a paragraph with a link in it', async () => { // URL that can't be embedded. - await clickBlockAppender(); - await page.keyboard.type( '/embed' ); - await page.keyboard.press( 'Enter' ); - await page.keyboard.type( - 'https://twitter.com/wooyaygutenberg123454312' - ); - await page.keyboard.press( 'Enter' ); + await insertEmbed( 'https://twitter.com/wooyaygutenberg123454312' ); // Wait for the request to fail and present an error. Since placeholder // has styles applied which depend on resize observer, wait for the @@ -254,25 +228,15 @@ describe( 'Embedding content', () => { } ); it( 'should retry embeds that could not be embedded with trailing slashes, without the trailing slashes', async () => { - await clickBlockAppender(); - await page.keyboard.type( '/embed' ); - await page.keyboard.press( 'Enter' ); - // This URL can't be embedded, but without the trailing slash, it can. - await page.keyboard.type( 'https://twitter.com/notnownikki/' ); - await page.keyboard.press( 'Enter' ); + await insertEmbed( 'https://twitter.com/notnownikki/' ); // The twitter block should appear correctly. - await page.waitForSelector( 'figure.wp-block-embed-twitter' ); + await page.waitForSelector( 'figure.wp-block-embed' ); + expect( await getEditedPostContent() ).toMatchSnapshot(); } ); it( 'should allow the user to try embedding a failed URL again', async () => { // URL that can't be embedded. - await clickBlockAppender(); - await page.keyboard.type( '/embed' ); - await page.keyboard.press( 'Enter' ); - await page.keyboard.type( - 'https://twitter.com/wooyaygutenberg123454312' - ); - await page.keyboard.press( 'Enter' ); + await insertEmbed( 'https://twitter.com/wooyaygutenberg123454312' ); // Wait for the request to fail and present an error. Since placeholder // has styles applied which depend on resize observer, wait for the @@ -294,7 +258,8 @@ describe( 'Embedding content', () => { }, ] ); await clickButton( 'Try again' ); - await page.waitForSelector( 'figure.wp-block-embed-twitter' ); + await page.waitForSelector( 'figure.wp-block-embed' ); + expect( await getEditedPostContent() ).toMatchSnapshot(); } ); it( 'should switch to the WordPress block correctly', async () => { @@ -313,13 +278,9 @@ describe( 'Embedding content', () => { // Start a new post, embed the previous post. await createNewPost(); - await clickBlockAppender(); - await page.keyboard.type( '/embed' ); - await page.keyboard.press( 'Enter' ); - await page.keyboard.type( postUrl ); - await page.keyboard.press( 'Enter' ); + await insertEmbed( postUrl ); // Check the block has become a WordPress block. - await page.waitForSelector( '.wp-block-embed-wordpress' ); + await page.waitForSelector( 'figure.wp-block-embed' ); } ); } ); diff --git a/packages/e2e-tests/specs/editor/various/invalid-block.test.js b/packages/e2e-tests/specs/editor/various/invalid-block.test.js index 7185017ddfd3c..7bb46d364e39a 100644 --- a/packages/e2e-tests/specs/editor/various/invalid-block.test.js +++ b/packages/e2e-tests/specs/editor/various/invalid-block.test.js @@ -36,8 +36,14 @@ describe( 'invalid blocks', () => { expect( console ).toHaveErrored(); expect( console ).toHaveWarned(); - // Click on the 'resolve' button - await page.click( '.block-editor-warning__actions button' ); + // Click on the 'three-dots' menu toggle + await page.click( + '.block-editor-warning__actions button[aria-label="More options"]' + ); + + // Click on the 'Resolve' button + const [ resolveButton ] = await page.$x( '//button[text()="Resolve"]' ); + await resolveButton.click(); // Check we get the resolve modal with the appropriate contents const htmlBlockContent = await page.$eval( diff --git a/packages/e2e-tests/specs/editor/various/is-typing.test.js b/packages/e2e-tests/specs/editor/various/is-typing.test.js index 8161118d65944..6f6c0f99fa73a 100644 --- a/packages/e2e-tests/specs/editor/various/is-typing.test.js +++ b/packages/e2e-tests/specs/editor/various/is-typing.test.js @@ -1,7 +1,11 @@ /** * WordPress dependencies */ -import { clickBlockAppender, createNewPost } from '@wordpress/e2e-test-utils'; +import { + clickBlockAppender, + createNewPost, + showBlockToolbar, +} from '@wordpress/e2e-test-utils'; describe( 'isTyping', () => { beforeEach( async () => { @@ -39,7 +43,7 @@ describe( 'isTyping', () => { it( 'should not close the dropdown when typing in it', async () => { // Adds a Dropdown with an input to all blocks await page.evaluate( () => { - const { Dropdown, Button, Fill } = wp.components; + const { Dropdown, ToolbarButton, Fill } = wp.components; const { createElement: el, Fragment } = wp.element; function AddDropdown( BlockListBlock ) { return ( props ) => { @@ -52,7 +56,7 @@ describe( 'isTyping', () => { el( Dropdown, { renderToggle: ( { onToggle } ) => el( - Button, + ToolbarButton, { onClick: onToggle, className: 'dropdown-open', @@ -83,8 +87,7 @@ describe( 'isTyping', () => { await page.keyboard.type( 'Type' ); // Show Toolbar - await page.mouse.move( 0, 0 ); - await page.mouse.move( 10, 10 ); + await showBlockToolbar(); // Open the dropdown await page.click( '.dropdown-open' ); diff --git a/packages/e2e-tests/specs/editor/various/keyboard-navigable-blocks.test.js b/packages/e2e-tests/specs/editor/various/keyboard-navigable-blocks.test.js index d8f4e06458bf7..99a9be8268fe1 100644 --- a/packages/e2e-tests/specs/editor/various/keyboard-navigable-blocks.test.js +++ b/packages/e2e-tests/specs/editor/various/keyboard-navigable-blocks.test.js @@ -7,6 +7,7 @@ import { pressKeyWithModifier, clickBlockAppender, getEditedPostContent, + showBlockToolbar, } from '@wordpress/e2e-test-utils'; async function getActiveLabel() { @@ -22,7 +23,6 @@ const navigateToContentEditorTop = async () => { // Use 'Ctrl+`' to return to the top of the editor await pressKeyWithModifier( 'ctrl', '`' ); await pressKeyWithModifier( 'ctrl', '`' ); - await pressKeyWithModifier( 'ctrl', '`' ); }; const tabThroughParagraphBlock = async ( paragraphText ) => { @@ -89,10 +89,7 @@ describe( 'Order of block keyboard navigation', () => { // Select the middle block. await page.keyboard.press( 'ArrowUp' ); - // Move the mouse to show the block toolbar - await page.mouse.move( 0, 0 ); - await page.mouse.move( 10, 10 ); - + await showBlockToolbar(); await navigateToContentEditorTop(); await tabThroughParagraphBlock( 'Paragraph 1' ); @@ -189,7 +186,7 @@ describe( 'Order of block keyboard navigation', () => { expect( await getActiveLabel() ).toBe( 'Multiple selected blocks' ); await page.keyboard.press( 'Tab' ); - await expect( await getActiveLabel() ).toBe( 'Document' ); + await expect( await getActiveLabel() ).toBe( 'Post' ); await pressKeyWithModifier( 'shift', 'Tab' ); await expect( await getActiveLabel() ).toBe( diff --git a/packages/e2e-tests/specs/editor/various/links.test.js b/packages/e2e-tests/specs/editor/various/links.test.js index d13f4dc4a9133..21c50094a0d1f 100644 --- a/packages/e2e-tests/specs/editor/various/links.test.js +++ b/packages/e2e-tests/specs/editor/various/links.test.js @@ -7,6 +7,7 @@ import { getEditedPostContent, createNewPost, pressKeyWithModifier, + showBlockToolbar, } from '@wordpress/e2e-test-utils'; describe( 'Links', () => { @@ -300,9 +301,7 @@ describe( 'Links', () => { // Make a collapsed selection inside the link await page.keyboard.press( 'ArrowLeft' ); await page.keyboard.press( 'ArrowRight' ); - // Move the mouse to show the block toolbar - await page.mouse.move( 0, 0 ); - await page.mouse.move( 10, 10 ); + await showBlockToolbar(); const [ editButton ] = await page.$x( '//button[text()="Edit"]' ); await editButton.click(); await waitForAutoFocus(); diff --git a/packages/e2e-tests/specs/editor/various/multi-block-selection.test.js b/packages/e2e-tests/specs/editor/various/multi-block-selection.test.js index e4537418ea693..5623878d744c6 100644 --- a/packages/e2e-tests/specs/editor/various/multi-block-selection.test.js +++ b/packages/e2e-tests/specs/editor/various/multi-block-selection.test.js @@ -306,6 +306,9 @@ describe( 'Multi-block selection', () => { await page.keyboard.type( '1' ); await page.keyboard.press( 'Enter' ); await page.keyboard.type( '/cover' ); + await page.waitForXPath( + `//*[contains(@class, "components-autocomplete__result") and contains(@class, "is-selected") and contains(text(), 'Cover')]` + ); await page.keyboard.press( 'Enter' ); await page.click( '.components-circular-option-picker__option' ); await page.keyboard.type( '2' ); diff --git a/packages/e2e-tests/specs/editor/various/new-post.test.js b/packages/e2e-tests/specs/editor/various/new-post.test.js index 41db6ce7148b2..e8baff2d573fb 100644 --- a/packages/e2e-tests/specs/editor/various/new-post.test.js +++ b/packages/e2e-tests/specs/editor/various/new-post.test.js @@ -70,6 +70,7 @@ describe( 'new editor state', () => { await page.waitForSelector( '.editor-post-saved-state.is-saved' ); // Reload the browser so a post is loaded with a title. await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); const activeElementClasses = await page.evaluate( () => { return Object.values( document.activeElement.classList ); diff --git a/packages/e2e-tests/specs/editor/various/nux.test.js b/packages/e2e-tests/specs/editor/various/nux.test.js index 76f0f1a435966..bb4ca71791030 100644 --- a/packages/e2e-tests/specs/editor/various/nux.test.js +++ b/packages/e2e-tests/specs/editor/various/nux.test.js @@ -87,6 +87,7 @@ describe( 'New User Experience (NUX)', () => { // Reload the editor await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); // Guide should be closed welcomeGuide = await page.$( '.edit-post-welcome-guide' ); @@ -108,6 +109,7 @@ describe( 'New User Experience (NUX)', () => { // Reload the editor await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); // Guide should be closed welcomeGuide = await page.$( '.edit-post-welcome-guide' ); diff --git a/packages/e2e-tests/specs/editor/various/preferences.test.js b/packages/e2e-tests/specs/editor/various/preferences.test.js index b21c850b41651..2640d382e74b7 100644 --- a/packages/e2e-tests/specs/editor/various/preferences.test.js +++ b/packages/e2e-tests/specs/editor/various/preferences.test.js @@ -30,7 +30,7 @@ describe( 'preferences', () => { it( 'remembers sidebar dismissal between sessions', async () => { // Open by default. - expect( await getActiveSidebarTabText() ).toBe( 'Document' ); + expect( await getActiveSidebarTabText() ).toBe( 'Post' ); // Change to "Block" tab. await page.click( '.edit-post-sidebar__panel-tab[aria-label="Block"]' ); @@ -41,7 +41,8 @@ describe( 'preferences', () => { // See: https://github.com/WordPress/gutenberg/issues/6377 // See: https://github.com/WordPress/gutenberg/pull/8995 await page.reload(); - expect( await getActiveSidebarTabText() ).toBe( 'Document' ); + await page.waitForSelector( '.edit-post-layout' ); + expect( await getActiveSidebarTabText() ).toBe( 'Post' ); // Dismiss await page.click( @@ -51,6 +52,7 @@ describe( 'preferences', () => { // Remember after reload. await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); expect( await getActiveSidebarTabText() ).toBe( null ); } ); } ); diff --git a/packages/e2e-tests/specs/editor/various/reusable-blocks.test.js b/packages/e2e-tests/specs/editor/various/reusable-blocks.test.js index f57b1f96c3a73..05a04312dfa3e 100644 --- a/packages/e2e-tests/specs/editor/various/reusable-blocks.test.js +++ b/packages/e2e-tests/specs/editor/various/reusable-blocks.test.js @@ -3,11 +3,13 @@ */ import { insertBlock, + insertReusableBlock, createNewPost, clickBlockToolbarButton, pressKeyWithModifier, - searchForBlock, + searchForReusableBlock, getEditedPostContent, + trashAllPosts, } from '@wordpress/e2e-test-utils'; function waitForAndAcceptDialog() { @@ -21,6 +23,10 @@ describe( 'Reusable blocks', () => { await createNewPost(); } ); + afterAll( async () => { + await trashAllPosts( 'wp_block' ); + } ); + beforeEach( async () => { // Remove all blocks from the post so that we're working with a clean slate await page.evaluate( () => { @@ -114,7 +120,7 @@ describe( 'Reusable blocks', () => { it( 'can be inserted and edited', async () => { // Insert the reusable block we created above - await insertBlock( 'Greeting block' ); + await insertReusableBlock( 'Greeting block' ); // Put the reusable block in edit mode const editButton = await page.waitForXPath( @@ -198,7 +204,7 @@ describe( 'Reusable blocks', () => { // Step 3. Insert the block created in Step 1. - await insertBlock( 'Awesome block' ); + await insertReusableBlock( 'Awesome block' ); // Check that we have a reusable block on the page const block = await page.$( @@ -216,14 +222,10 @@ describe( 'Reusable blocks', () => { it( 'can be converted to a regular block', async () => { // Insert the reusable block we edited above - await insertBlock( 'Surprised greeting block' ); + await insertReusableBlock( 'Surprised greeting block' ); // Convert block to a regular block - await clickBlockToolbarButton( 'More options' ); - const convertButton = await page.waitForXPath( - '//button[text()="Convert to Regular Block"]' - ); - await convertButton.click(); + await clickBlockToolbarButton( 'Convert to regular blocks', 'content' ); // Check that we have a paragraph block on the page const block = await page.$( @@ -241,7 +243,7 @@ describe( 'Reusable blocks', () => { it( 'can be deleted', async () => { // Insert the reusable block we edited above - await insertBlock( 'Surprised greeting block' ); + await insertReusableBlock( 'Surprised greeting block' ); // Delete the block and accept the confirmation dialog await clickBlockToolbarButton( 'More options' ); @@ -259,7 +261,7 @@ describe( 'Reusable blocks', () => { expect( await getEditedPostContent() ).toBe( '' ); // Search for the block in the inserter - await searchForBlock( 'Surprised greeting block' ); + await searchForReusableBlock( 'Surprised greeting block' ); // Check that we couldn't find it const items = await page.$$( @@ -322,14 +324,10 @@ describe( 'Reusable blocks', () => { it( 'multi-selection reusable block can be converted back to regular blocks', async () => { // Insert the reusable block we edited above - await insertBlock( 'Multi-selection reusable block' ); + await insertReusableBlock( 'Multi-selection reusable block' ); // Convert block to a regular block - await clickBlockToolbarButton( 'More options' ); - const convertButton = await page.waitForXPath( - '//button[text()="Convert to Regular Block"]' - ); - await convertButton.click(); + await clickBlockToolbarButton( 'Convert to regular blocks', 'content' ); // Check that we have two paragraph blocks on the page expect( await getEditedPostContent() ).toMatchSnapshot(); diff --git a/packages/e2e-tests/specs/editor/various/rich-text.test.js b/packages/e2e-tests/specs/editor/various/rich-text.test.js index 1ac2080a1631c..17e064b7c5852 100644 --- a/packages/e2e-tests/specs/editor/various/rich-text.test.js +++ b/packages/e2e-tests/specs/editor/various/rich-text.test.js @@ -7,6 +7,7 @@ import { insertBlock, clickBlockAppender, pressKeyWithModifier, + showBlockToolbar, } from '@wordpress/e2e-test-utils'; describe( 'RichText', () => { @@ -84,12 +85,10 @@ describe( 'RichText', () => { it( 'should return focus when pressing formatting button', async () => { await clickBlockAppender(); await page.keyboard.type( 'Some ' ); - await page.mouse.move( 0, 0 ); - await page.mouse.move( 10, 10 ); + await showBlockToolbar(); await page.click( '[aria-label="Bold"]' ); await page.keyboard.type( 'bold' ); - await page.mouse.move( 0, 0 ); - await page.mouse.move( 10, 10 ); + await showBlockToolbar(); await page.click( '[aria-label="Bold"]' ); await page.keyboard.type( '.' ); diff --git a/packages/e2e-tests/specs/editor/various/sidebar-permalink-panel.test.js b/packages/e2e-tests/specs/editor/various/sidebar-permalink-panel.test.js index 84992f997efab..35b51001788cd 100644 --- a/packages/e2e-tests/specs/editor/various/sidebar-permalink-panel.test.js +++ b/packages/e2e-tests/specs/editor/various/sidebar-permalink-panel.test.js @@ -9,6 +9,8 @@ import { publishPost, } from '@wordpress/e2e-test-utils'; +const permalinkPanelXPath = `//div[contains(@class, "edit-post-sidebar")]//button[contains(@class, "components-panel__body-toggle") and contains(text(),"Permalink")]`; + // This tests are not together with the remaining sidebar tests, // because we need to publish/save a post, to correctly test the permalink panel. // The sidebar test suit enforces that focus is never lost, but during save operations @@ -28,9 +30,7 @@ describe( 'Sidebar Permalink Panel', () => { const { removeEditorPanel } = wp.data.dispatch( 'core/edit-post' ); removeEditorPanel( 'post-link' ); } ); - expect( - await findSidebarPanelWithTitle( 'Permalink' ) - ).toBeUndefined(); + expect( await page.$x( permalinkPanelXPath ) ).toEqual( [] ); } ); it( 'should not render link panel when post is publicly queryable but not public', async () => { @@ -39,9 +39,7 @@ describe( 'Sidebar Permalink Panel', () => { await publishPost(); // Start editing again. await page.type( '.editor-post-title__input', ' (Updated)' ); - expect( - await findSidebarPanelWithTitle( 'Permalink' ) - ).toBeUndefined(); + expect( await page.$x( permalinkPanelXPath ) ).toEqual( [] ); } ); it( 'should not render link panel when post is public but not publicly queryable', async () => { @@ -50,9 +48,7 @@ describe( 'Sidebar Permalink Panel', () => { await publishPost(); // Start editing again. await page.type( '.editor-post-title__input', ' (Updated)' ); - expect( - await findSidebarPanelWithTitle( 'Permalink' ) - ).toBeUndefined(); + expect( await page.$x( permalinkPanelXPath ) ).toEqual( [] ); } ); it( 'should render link panel when post is public and publicly queryable', async () => { diff --git a/packages/e2e-tests/specs/editor/various/sidebar.test.js b/packages/e2e-tests/specs/editor/various/sidebar.test.js index a9d4dfdd2135e..2be81eac943e7 100644 --- a/packages/e2e-tests/specs/editor/various/sidebar.test.js +++ b/packages/e2e-tests/specs/editor/various/sidebar.test.js @@ -14,7 +14,7 @@ import { const SIDEBAR_SELECTOR = '.edit-post-sidebar'; const ACTIVE_SIDEBAR_TAB_SELECTOR = '.edit-post-sidebar__panel-tab.is-active'; -const ACTIVE_SIDEBAR_BUTTON_TEXT = 'Document'; +const ACTIVE_SIDEBAR_BUTTON_TEXT = 'Post'; describe( 'Sidebar', () => { afterEach( () => { @@ -99,11 +99,11 @@ describe( 'Sidebar', () => { await pressKeyWithModifier( 'ctrl', '`' ); await pressKeyWithModifier( 'ctrl', '`' ); - // Tab lands at first (presumed selected) option "Document". + // Tab lands at first (presumed selected) option "Post". await page.keyboard.press( 'Tab' ); const isActiveDocumentTab = await page.evaluate( () => - document.activeElement.textContent === 'Document' && + document.activeElement.textContent === 'Post' && document.activeElement.classList.contains( 'is-active' ) ); expect( isActiveDocumentTab ).toBe( true ); @@ -122,7 +122,6 @@ describe( 'Sidebar', () => { it( 'should be possible to programmatically remove Document Settings panels', async () => { await createNewPost(); await enableFocusLossObservation(); - await openDocumentSettingsSidebar(); expect( await findSidebarPanelWithTitle( 'Categories' ) ).toBeDefined(); @@ -147,19 +146,27 @@ describe( 'Sidebar', () => { removeEditorPanel( 'post-status' ); } ); + const getPanelToggleSelector = ( panelTitle ) => { + return `//div[contains(@class, "edit-post-sidebar")]//button[contains(@class, "components-panel__body-toggle") and contains(text(),"${ panelTitle }")]`; + }; + expect( - await findSidebarPanelWithTitle( 'Categories' ) - ).toBeUndefined(); - expect( await findSidebarPanelWithTitle( 'Tags' ) ).toBeUndefined(); + await page.$x( getPanelToggleSelector( 'Categories' ) ) + ).toEqual( [] ); + expect( await page.$x( getPanelToggleSelector( 'Tags' ) ) ).toEqual( + [] + ); expect( - await findSidebarPanelWithTitle( 'Featured image' ) - ).toBeUndefined(); - expect( await findSidebarPanelWithTitle( 'Excerpt' ) ).toBeUndefined(); + await page.$x( getPanelToggleSelector( 'Featured image' ) ) + ).toEqual( [] ); + expect( await page.$x( getPanelToggleSelector( 'Excerpt' ) ) ).toEqual( + [] + ); expect( - await findSidebarPanelWithTitle( 'Discussion' ) - ).toBeUndefined(); + await page.$x( getPanelToggleSelector( 'Discussion' ) ) + ).toEqual( [] ); expect( - await findSidebarPanelWithTitle( 'Status & visibility' ) - ).toBeUndefined(); + await page.$x( getPanelToggleSelector( 'Status & visibility' ) ) + ).toEqual( [] ); } ); } ); diff --git a/packages/e2e-tests/specs/editor/various/taxonomies.test.js b/packages/e2e-tests/specs/editor/various/taxonomies.test.js index 45ac6cbc1e320..2ed1c18d2c361 100644 --- a/packages/e2e-tests/specs/editor/various/taxonomies.test.js +++ b/packages/e2e-tests/specs/editor/various/taxonomies.test.js @@ -128,6 +128,62 @@ describe( 'Taxonomies', () => { expect( selectedCategories[ 0 ] ).toEqual( 'z rand category 1' ); } ); + it( "should be able to create a new tag with ' on the name", async () => { + await createNewPost(); + + await openDocumentSettingsSidebar(); + + await openSidebarPanelWithTitle( 'Tags' ); + + // If the user has no permission to add a new tag finish the test. + if ( ! ( await canCreatTermInTaxonomy( 'tags' ) ) ) { + return; + } + + const tagsPanel = await findSidebarPanelWithTitle( 'Tags' ); + const tagInput = await tagsPanel.$( + '.components-form-token-field__input' + ); + + // Click the tag input field. + await tagInput.click(); + + const tagName = "tag'-" + random( 1, Number.MAX_SAFE_INTEGER ); + + // Type the category name in the field. + await tagInput.type( tagName ); + + // Press enter to create a new tag. + await tagInput.press( 'Enter' ); + + await page.waitForSelector( TAG_TOKEN_SELECTOR ); + + // Get an array with the tags of the post. + let tags = await getCurrentTags(); + + // The post should only contain the tag we added. + expect( tags ).toHaveLength( 1 ); + expect( tags[ 0 ] ).toEqual( tagName ); + + // Type something in the title so we can publish the post. + await page.type( '.editor-post-title__input', 'Hello World' ); + + // Publish the post. + await publishPost(); + + // Reload the editor. + await page.reload(); + + // Wait for the tags to load. + await page.waitForSelector( '.components-form-token-field__token' ); + + tags = await getCurrentTags(); + + // The tag selection was persisted after the publish process. + expect( tags ).toHaveLength( 1 ); + expect( tags[ 0 ] ).toEqual( tagName ); + } ); + it( 'should be able to open the tags panel and create a new tag if the user has the right capabilities', async () => { await createNewPost(); diff --git a/packages/e2e-tests/specs/editor/various/typewriter.test.js b/packages/e2e-tests/specs/editor/various/typewriter.test.js index 2661d69acd905..a4ed30951220b 100644 --- a/packages/e2e-tests/specs/editor/various/typewriter.test.js +++ b/packages/e2e-tests/specs/editor/various/typewriter.test.js @@ -21,6 +21,9 @@ describe( 'TypeWriter', () => { // Create first block. await page.keyboard.press( 'Enter' ); + // Create second block. + await page.keyboard.press( 'Enter' ); + const initialPosition = await getCaretPosition(); // The page shouldn't be scrolled when it's being filled. @@ -118,8 +121,11 @@ describe( 'TypeWriter', () => { await page.keyboard.press( 'Enter' ); // Create second block. await page.keyboard.press( 'Enter' ); + // Create third block. + await page.keyboard.press( 'Enter' ); // Move to first block. await page.keyboard.press( 'ArrowUp' ); + await page.keyboard.press( 'ArrowUp' ); const initialPosition = await getCaretPosition(); diff --git a/packages/e2e-tests/specs/editor/various/undo.test.js b/packages/e2e-tests/specs/editor/various/undo.test.js index ac9864b981493..30b3a4c80d494 100644 --- a/packages/e2e-tests/specs/editor/various/undo.test.js +++ b/packages/e2e-tests/specs/editor/various/undo.test.js @@ -173,6 +173,7 @@ describe( 'undo', () => { await page.keyboard.type( 'test' ); await saveDraft(); await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); await page.click( '[data-type="core/paragraph"]' ); await pressKeyWithModifier( 'primary', 'a' ); await pressKeyWithModifier( 'primary', 'b' ); @@ -345,6 +346,7 @@ describe( 'undo', () => { await page.keyboard.type( 'original' ); await saveDraft(); await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); // Issue is demonstrated by forcing state merges (multiple inputs) on // an existing text after a fresh reload. @@ -391,6 +393,7 @@ describe( 'undo', () => { await page.keyboard.type( '1' ); await saveDraft(); await page.reload(); + await page.waitForSelector( '.edit-post-layout' ); // Expect undo button to be disabled. expect( diff --git a/packages/e2e-tests/specs/editor/various/writing-flow.test.js b/packages/e2e-tests/specs/editor/various/writing-flow.test.js index fe9df94bb2fbb..8b9ee8396257d 100644 --- a/packages/e2e-tests/specs/editor/various/writing-flow.test.js +++ b/packages/e2e-tests/specs/editor/various/writing-flow.test.js @@ -21,12 +21,15 @@ const addParagraphsAndColumnsDemo = async () => { await page.keyboard.type( 'First paragraph' ); await page.keyboard.press( 'Enter' ); await page.keyboard.type( '/columns' ); + await page.waitForXPath( + `//*[contains(@class, "components-autocomplete__result") and contains(@class, "is-selected") and contains(text(), 'Columns')]` + ); await page.keyboard.press( 'Enter' ); await page.click( ':focus [aria-label="Two columns; equal split"]' ); await page.click( ':focus .block-editor-button-block-appender' ); await page.waitForSelector( ':focus.block-editor-inserter__search-input' ); await page.keyboard.type( 'Paragraph' ); - await pressKeyTimes( 'Tab', 3 ); // Tab to paragraph result. + await pressKeyTimes( 'Tab', 2 ); // Tab to paragraph result. await page.keyboard.press( 'Enter' ); // Insert paragraph. await page.keyboard.type( '1st col' ); // If this text is too long, it may wrap to a new line and cause test failure. That's why we're using "1st" instead of "First" here. @@ -37,7 +40,7 @@ const addParagraphsAndColumnsDemo = async () => { await page.click( ':focus .block-editor-button-block-appender' ); await page.waitForSelector( ':focus.block-editor-inserter__search-input' ); await page.keyboard.type( 'Paragraph' ); - await pressKeyTimes( 'Tab', 3 ); // Tab to paragraph result. + await pressKeyTimes( 'Tab', 2 ); // Tab to paragraph result. await page.keyboard.press( 'Enter' ); // Insert paragraph. await page.keyboard.type( '2nd col' ); // If this text is too long, it may wrap to a new line and cause test failure. That's why we're using "2nd" instead of "Second" here. @@ -407,6 +410,17 @@ describe( 'Writing Flow', () => { expect( await getEditedPostContent() ).toMatchSnapshot(); } ); + it( 'should merge paragraphs', async () => { + await page.keyboard.press( 'Enter' ); + await page.keyboard.type( '1' ); + await page.keyboard.press( 'Enter' ); + await page.keyboard.type( '2' ); + await page.keyboard.press( 'ArrowLeft' ); + await page.keyboard.press( 'Backspace' ); + + expect( await getEditedPostContent() ).toMatchSnapshot(); + } ); + it( 'should merge forwards', async () => { await page.keyboard.press( 'Enter' ); await page.keyboard.type( '1' ); diff --git a/packages/e2e-tests/specs/experiments/__snapshots__/navigation.test.js.snap b/packages/e2e-tests/specs/experiments/__snapshots__/navigation.test.js.snap index c575b3297d2a2..eb7a6c163f2f3 100644 --- a/packages/e2e-tests/specs/experiments/__snapshots__/navigation.test.js.snap +++ b/packages/e2e-tests/specs/experiments/__snapshots__/navigation.test.js.snap @@ -36,11 +36,7 @@ exports[`Navigation Creating from existing Menus allows a navigation block to be " `; -exports[`Navigation Creating from existing Menus creates an empty navigation block when the selected existing menu is also empty 1`] = ` -" - -" -`; +exports[`Navigation Creating from existing Menus creates an empty navigation block when the selected existing menu is also empty 1`] = `""`; exports[`Navigation Creating from existing Menus does not display option to create from existing menus if there are no menus 1`] = `""`; diff --git a/packages/e2e-tests/specs/experiments/multi-entity-editing.test.js b/packages/e2e-tests/specs/experiments/multi-entity-editing.test.js index 11de0b508a761..df8aa129a8e7d 100644 --- a/packages/e2e-tests/specs/experiments/multi-entity-editing.test.js +++ b/packages/e2e-tests/specs/experiments/multi-entity-editing.test.js @@ -11,6 +11,7 @@ import { visitAdminPage, createNewPost, publishPost, + trashAllPosts, } from '@wordpress/e2e-test-utils'; import { addQueryArgs } from '@wordpress/url'; @@ -18,7 +19,6 @@ import { addQueryArgs } from '@wordpress/url'; * Internal dependencies */ import { useExperimentalFeatures } from '../../experimental-features'; -import { trashExistingPosts } from '../../config/setup-test-framework'; const visitSiteEditor = async () => { const query = addQueryArgs( '', { @@ -27,7 +27,7 @@ const visitSiteEditor = async () => { await visitAdminPage( 'admin.php', query ); // Waits for the template part to load... await page.waitForSelector( - '.wp-block[data-type="core/template-part"] .block-editor-inner-blocks' + '.wp-block[data-type="core/template-part"] .block-editor-block-list__layout' ); }; @@ -49,34 +49,32 @@ const getTemplateDropdownElement = async ( itemName ) => { const createTemplatePart = async ( templatePartName = 'test-template-part', - themeName = 'test-theme', isNested = false ) => { // Create new template part. await insertBlock( 'Template Part' ); const [ createNewButton ] = await page.$x( - '//button[contains(text(), "Create new")]' + '//button[contains(text(), "New template part")]' ); await createNewButton.click(); - await page.keyboard.press( 'Tab' ); - await page.keyboard.type( templatePartName ); - await page.keyboard.press( 'Tab' ); - await page.keyboard.type( themeName ); - await page.keyboard.press( 'Tab' ); - await page.keyboard.press( 'Enter' ); await page.waitForSelector( isNested - ? '.wp-block[data-type="core/template-part"] .wp-block[data-type="core/template-part"] .block-editor-inner-blocks' - : '.wp-block[data-type="core/template-part"] .block-editor-inner-blocks' + ? '.wp-block[data-type="core/template-part"] .wp-block[data-type="core/template-part"] .block-editor-block-list__layout' + : '.wp-block[data-type="core/template-part"] .block-editor-block-list__layout' ); + await page.focus( '.wp-block-template-part__name-panel input' ); + await page.keyboard.type( templatePartName ); }; const editTemplatePart = async ( textToAdd, isNested = false ) => { await page.click( - isNested - ? '.wp-block[data-type="core/template-part"] .wp-block[data-type="core/template-part"]' - : '.wp-block[data-type="core/template-part"]' + `${ + isNested + ? '.wp-block[data-type="core/template-part"] .wp-block[data-type="core/template-part"]' + : '.wp-block[data-type="core/template-part"]' + } .block-editor-button-block-appender` ); + await page.click( '.editor-block-list-item-paragraph' ); for ( const text of textToAdd ) { await page.keyboard.type( text ); await page.keyboard.press( 'Enter' ); @@ -166,8 +164,8 @@ describe( 'Multi-entity editor states', () => { ] ); beforeAll( async () => { - await trashExistingPosts( 'wp_template' ); - await trashExistingPosts( 'wp_template_part' ); + await trashAllPosts( 'wp_template' ); + await trashAllPosts( 'wp_template_part' ); } ); it( 'should not display any dirty entities when loading the site editor', async () => { @@ -196,8 +194,8 @@ describe( 'Multi-entity editor states', () => { describe( 'Multi-entity edit', () => { beforeAll( async () => { - await trashExistingPosts( 'wp_template' ); - await trashExistingPosts( 'wp_template_part' ); + await trashAllPosts( 'wp_template' ); + await trashAllPosts( 'wp_template_part' ); await createNewPost( { postType: 'wp_template', title: kebabCase( templateName ), @@ -208,7 +206,7 @@ describe( 'Multi-entity editor states', () => { 'Default template part test text.', 'Second paragraph test.', ] ); - await createTemplatePart( nestedTPName, 'test-theme', true ); + await createTemplatePart( nestedTPName, true ); await editTemplatePart( [ 'Nested Template Part Text.', 'Second Nested test.' ], true diff --git a/packages/e2e-tests/specs/experiments/multi-entity-saving.test.js b/packages/e2e-tests/specs/experiments/multi-entity-saving.test.js index 5dd1c1f14d83c..4acdae098a226 100644 --- a/packages/e2e-tests/specs/experiments/multi-entity-saving.test.js +++ b/packages/e2e-tests/specs/experiments/multi-entity-saving.test.js @@ -6,6 +6,7 @@ import { insertBlock, publishPost, visitAdminPage, + trashAllPosts, } from '@wordpress/e2e-test-utils'; import { addQueryArgs } from '@wordpress/url'; @@ -13,7 +14,6 @@ import { addQueryArgs } from '@wordpress/url'; * Internal dependencies */ import { useExperimentalFeatures } from '../../experimental-features'; -import { trashExistingPosts } from '../../config/setup-test-framework'; describe( 'Multi-entity save flow', () => { // Selectors - usable between Post/Site editors. @@ -21,10 +21,11 @@ describe( 'Multi-entity save flow', () => { const checkboxInputSelector = '.components-checkbox-control__input'; const entitiesSaveSelector = '.editor-entities-saved-states__save-button'; const templatePartSelector = '*[data-type="core/template-part"]'; - const activatedTemplatePartSelector = `${ templatePartSelector } .block-editor-inner-blocks`; + const activatedTemplatePartSelector = `${ templatePartSelector } .block-editor-block-list__layout`; const savePanelSelector = '.entities-saved-states__panel'; const closePanelButtonSelector = 'button[aria-label="Close panel"]'; - const createNewButtonSelector = '//button[contains(text(), "Create new")]'; + const createNewButtonSelector = + '//button[contains(text(), "New template part")]'; // Reusable assertions across Post/Site editors. const assertAllBoxesChecked = async () => { @@ -58,8 +59,8 @@ describe( 'Multi-entity save flow', () => { ] ); beforeAll( async () => { - await trashExistingPosts( 'wp_template' ); - await trashExistingPosts( 'wp_template_part' ); + await trashAllPosts( 'wp_template' ); + await trashAllPosts( 'wp_template_part' ); } ); describe( 'Post Editor', () => { @@ -113,16 +114,13 @@ describe( 'Multi-entity save flow', () => { createNewButtonSelector ); await createNewButton.click(); + await page.waitForSelector( activatedTemplatePartSelector ); await page.keyboard.press( 'Tab' ); await page.keyboard.type( 'test-template-part' ); - await page.keyboard.press( 'Tab' ); - await page.keyboard.type( 'test-theme' ); - await page.keyboard.press( 'Tab' ); - await page.keyboard.press( 'Enter' ); // Make some changes in new Template Part. - await page.waitForSelector( activatedTemplatePartSelector ); - await page.click( templatePartSelector ); + await page.click( '.block-editor-button-block-appender' ); + await page.click( '.editor-block-list-item-paragraph' ); await page.keyboard.type( 'some words...' ); await assertMultiSaveEnabled(); @@ -231,7 +229,7 @@ describe( 'Multi-entity save flow', () => { // Ensure we are on 'front-page' demo template. await page.click( templateDropdownSelector ); - const [ demoTemplateButton ] = await page.$x( + const demoTemplateButton = await page.waitForXPath( demoTemplateSelector ); await demoTemplateButton.click(); diff --git a/packages/e2e-tests/specs/experiments/navigation.test.js b/packages/e2e-tests/specs/experiments/navigation.test.js index 26cc1c339d4db..7b2a81824de7a 100644 --- a/packages/e2e-tests/specs/experiments/navigation.test.js +++ b/packages/e2e-tests/specs/experiments/navigation.test.js @@ -9,6 +9,7 @@ import { setUpResponseMocking, clickBlockToolbarButton, pressKeyWithModifier, + showBlockToolbar, } from '@wordpress/e2e-test-utils'; /** @@ -190,7 +191,7 @@ async function updateActiveNavigationLink( { url, label, type } ) { // Wait for the autocomplete suggestion item to appear. await page.waitForXPath( suggestionPath ); // Set the suggestion - const [ suggestion ] = await page.$x( suggestionPath ); + const suggestion = await page.waitForXPath( suggestionPath ); // Select it (so we're clicking the right one, even if it's further down the list) await suggestion.click(); @@ -217,17 +218,13 @@ async function updateActiveNavigationLink( { url, label, type } ) { } async function selectDropDownOption( optionText ) { - const buttonText = 'Select where to start from…'; - await page.waitForXPath( - `//button[text()="${ buttonText }"][not(@disabled)]` + const selectToggle = await page.waitForSelector( + '.wp-block-navigation-placeholder__select-control button' ); - const [ dropdownToggle ] = await page.$x( - `//button[text()="${ buttonText }"][not(@disabled)]` + await selectToggle.click(); + const theOption = await page.waitForXPath( + `//li[text()="${ optionText }"]` ); - await dropdownToggle.click(); - - const [ theOption ] = await page.$x( `//li[text()="${ optionText }"]` ); - await theOption.click(); } @@ -239,7 +236,7 @@ async function clickCreateButton() { ); // Then locate... - const [ createNavigationButton ] = await page.$x( + const createNavigationButton = await page.waitForXPath( `//button[text()="${ buttonText }"][not(@disabled)]` ); @@ -248,10 +245,21 @@ async function clickCreateButton() { } async function createEmptyNavBlock() { - await selectDropDownOption( 'Create empty menu' ); + await selectDropDownOption( 'Create empty Navigation' ); await clickCreateButton(); } +async function addLinkBlock() { + // Using 'click' here checks for regressions of https://github.com/WordPress/gutenberg/issues/18329, + // an issue where the block appender requires two clicks. + await page.click( '.wp-block-navigation .block-list-appender' ); + + const [ linkButton ] = await page.$x( + "//*[contains(@class, 'block-editor-inserter__quick-inserter')]//*[text()='Link']" + ); + await linkButton.click(); +} + beforeEach( async () => { await createNewPost(); } ); @@ -282,7 +290,7 @@ describe( 'Navigation', () => { // Add the navigation block. await insertBlock( 'Navigation' ); - await selectDropDownOption( 'New from all top-level pages' ); + await selectDropDownOption( 'Create from all top-level pages' ); await clickCreateButton(); @@ -297,27 +305,23 @@ describe( 'Navigation', () => { // Add the navigation block. await insertBlock( 'Navigation' ); - const dropdownButtonText = 'Select where to start from…'; - await page.waitForXPath( - `//button[text()="${ dropdownButtonText }"][not(@disabled)]` + await page.waitForSelector( + '.wp-block-navigation-placeholder__select-control button' ); - const [ dropdownToggle ] = await page.$x( - `//button[text()="${ dropdownButtonText }"][not(@disabled)]` + await page.click( + '.wp-block-navigation-placeholder__select-control button' ); - await dropdownToggle.click(); - const dropDownItemsLength = await page.$$eval( 'ul[role="listbox"] li[role="option"]', ( els ) => els.length ); // Should only be showing - // 1. Placeholder value. - // 2. Create empty menu. - expect( dropDownItemsLength ).toEqual( 2 ); + // 1. Create empty menu. + expect( dropDownItemsLength ).toEqual( 1 ); - await page.waitForXPath( '//li[text()="Create empty menu"]' ); + await page.waitForXPath( '//li[text()="Create empty Navigation"]' ); // Snapshot should contain the mocked menu items. expect( await getEditedPostContent() ).toMatchSnapshot(); @@ -335,12 +339,12 @@ describe( 'Navigation', () => { await clickCreateButton(); - // await page.waitFor( 50000000 ); + await page.waitForSelector( '.wp-block-navigation__container' ); // Scope element selector to the Editor's "Content" region as otherwise it picks up on // block previews. const navBlockItemsLength = await page.$$eval( - '[aria-label="Content"][role="region"] li[aria-label="Block: Link"]', + '[aria-label="Editor content"][role="region"] li[aria-label="Block: Link"]', ( els ) => els.length ); @@ -366,13 +370,12 @@ describe( 'Navigation', () => { // Scope element selector to the "Editor content" as otherwise it picks up on // Block Style live previews. const navBlockItemsLength = await page.$$eval( - '[aria-label="Content"][role="region"] li[aria-label="Block: Link"]', + '[aria-label="Editor content"][role="region"] li[aria-label="Block: Link"]', ( els ) => els.length ); // Assert an empty Nav Block is created. - // We expect 1 here because a "placeholder" Nav Item Block is automatically inserted - expect( navBlockItemsLength ).toEqual( 1 ); + expect( navBlockItemsLength ).toEqual( 0 ); // Snapshot should contain the mocked menu items. expect( await getEditedPostContent() ).toMatchSnapshot(); @@ -385,14 +388,12 @@ describe( 'Navigation', () => { // Add the navigation block. await insertBlock( 'Navigation' ); - const dropdownButtonText = 'Select where to start from…'; - await page.waitForXPath( - `//button[text()="${ dropdownButtonText }"][not(@disabled)]` + await page.waitForSelector( + '.wp-block-navigation-placeholder__select-control button' ); - const [ dropdownToggle ] = await page.$x( - `//button[text()="${ dropdownButtonText }"][not(@disabled)]` + await page.click( + '.wp-block-navigation-placeholder__select-control button' ); - await dropdownToggle.click(); const dropDownItemsLength = await page.$$eval( 'ul[role="listbox"] li[role="option"]', @@ -400,11 +401,10 @@ describe( 'Navigation', () => { ); // Should only be showing - // 1. Placeholder. - // 2. Create from Empty. - expect( dropDownItemsLength ).toEqual( 2 ); + // 1. Create empty menu. + expect( dropDownItemsLength ).toEqual( 1 ); - await page.waitForXPath( '//li[text()="Create empty menu"]' ); + await page.waitForXPath( '//li[text()="Create empty Navigation"]' ); // Snapshot should contain the mocked menu items. expect( await getEditedPostContent() ).toMatchSnapshot(); @@ -420,20 +420,18 @@ describe( 'Navigation', () => { await createEmptyNavBlock(); - // Add a link to the default Link block. + await addLinkBlock(); + + // Add a link to the Link block. await updateActiveNavigationLink( { url: 'https://wordpress.org', label: 'WP', type: 'url', } ); - // Move the mouse to reveal the block movers. Without this the test seems to fail. - await page.mouse.move( 100, 100 ); + await showBlockToolbar(); - // Add another Link block. - // Using 'click' here checks for regressions of https://github.com/WordPress/gutenberg/issues/18329, - // an issue where the block appender requires two clicks. - await page.click( '.wp-block-navigation .block-list-appender' ); + await addLinkBlock(); // After adding a new block, search input should be shown immediately. // Verify that Escape would close the popover. @@ -501,6 +499,8 @@ describe( 'Navigation', () => { // Create an empty nav block. await createEmptyNavBlock(); + await addLinkBlock(); + // Wait for URL input to be focused await page.waitForSelector( 'input.block-editor-url-input__input:focus' diff --git a/packages/e2e-tests/specs/experiments/template-part.test.js b/packages/e2e-tests/specs/experiments/template-part.test.js index de9e15cbc8dc8..835ea93a0a7c0 100644 --- a/packages/e2e-tests/specs/experiments/template-part.test.js +++ b/packages/e2e-tests/specs/experiments/template-part.test.js @@ -6,6 +6,7 @@ import { insertBlock, disablePrePublishChecks, visitAdminPage, + trashAllPosts, } from '@wordpress/e2e-test-utils'; import { addQueryArgs } from '@wordpress/url'; @@ -13,7 +14,6 @@ import { addQueryArgs } from '@wordpress/url'; * Internal dependencies */ import { useExperimentalFeatures } from '../../experimental-features'; -import { trashExistingPosts } from '../../config/setup-test-framework'; describe( 'Template Part', () => { useExperimentalFeatures( [ @@ -22,23 +22,24 @@ describe( 'Template Part', () => { ] ); beforeAll( async () => { - await trashExistingPosts( 'wp_template' ); - await trashExistingPosts( 'wp_template_part' ); + await trashAllPosts( 'wp_template' ); + await trashAllPosts( 'wp_template_part' ); } ); afterAll( async () => { - await trashExistingPosts( 'wp_template' ); - await trashExistingPosts( 'wp_template_part' ); + await trashAllPosts( 'wp_template' ); + await trashAllPosts( 'wp_template_part' ); } ); describe( 'Template part block', () => { - beforeEach( () => - visitAdminPage( + beforeEach( async () => { + await visitAdminPage( 'admin.php', addQueryArgs( '', { page: 'gutenberg-edit-site', } ).slice( 1 ) - ) - ); + ); + await page.waitForSelector( '.edit-site-visual-editor' ); + } ); it( 'Should load customizations when in a template even if only the slug and theme attributes are set.', async () => { // Switch to editing the header template part. @@ -80,8 +81,6 @@ describe( 'Template Part', () => { describe( 'Template part placeholder', () => { // Test constants for template part. - const testSlug = 'test-template-part'; - const testTheme = 'test-theme'; const testContent = 'some words...'; // Selectors @@ -89,12 +88,12 @@ describe( 'Template Part', () => { '.editor-entities-saved-states__save-button'; const savePostSelector = '.editor-post-publish-button__button'; const templatePartSelector = '*[data-type="core/template-part"]'; - const activatedTemplatePartSelector = `${ templatePartSelector } .block-editor-inner-blocks`; + const activatedTemplatePartSelector = `${ templatePartSelector } .block-editor-block-list__layout`; const testContentSelector = `//p[contains(., "${ testContent }")]`; const createNewButtonSelector = - '//button[contains(text(), "Create new")]'; - const disabledButtonSelector = - '.wp-block-template-part__placeholder-create-button[disabled]'; + '//button[contains(text(), "New template part")]'; + const chooseExistingButtonSelector = + '//button[contains(text(), "Choose existing")]'; it( 'Should insert new template part on creation', async () => { await createNewPost(); @@ -105,12 +104,6 @@ describe( 'Template Part', () => { createNewButtonSelector ); await createNewButton.click(); - await page.keyboard.press( 'Tab' ); - await page.keyboard.type( testSlug ); - await page.keyboard.press( 'Tab' ); - await page.keyboard.type( testTheme ); - await page.keyboard.press( 'Tab' ); - await page.keyboard.press( 'Enter' ); const newTemplatePart = await page.waitForSelector( activatedTemplatePartSelector @@ -118,7 +111,8 @@ describe( 'Template Part', () => { expect( newTemplatePart ).toBeTruthy(); // Finish creating template part, insert some text, and save. - await page.click( templatePartSelector ); + await page.click( '.block-editor-button-block-appender' ); + await page.click( '.editor-block-list-item-paragraph' ); await page.keyboard.type( testContent ); await page.click( savePostSelector ); await page.click( entitiesSaveSelector ); @@ -128,6 +122,10 @@ describe( 'Template Part', () => { await createNewPost(); // Try to insert the template part we created. await insertBlock( 'Template Part' ); + const [ chooseExistingButton ] = await page.$x( + chooseExistingButtonSelector + ); + await chooseExistingButton.click(); const preview = await page.waitForXPath( testContentSelector ); expect( preview ).toBeTruthy(); } ); @@ -141,24 +139,5 @@ describe( 'Template Part', () => { ); expect( templatePartContent ).toBeTruthy(); } ); - - it( 'Should disable create button for slug/theme combo', async () => { - await createNewPost(); - // Create new template part. - await insertBlock( 'Template Part' ); - const [ createNewButton ] = await page.$x( - createNewButtonSelector - ); - await createNewButton.click(); - await page.keyboard.press( 'Tab' ); - await page.keyboard.type( testSlug ); - await page.keyboard.press( 'Tab' ); - await page.keyboard.type( testTheme ); - - const disabledButton = await page.waitForSelector( - disabledButtonSelector - ); - expect( disabledButton ).toBeTruthy(); - } ); } ); } ); diff --git a/packages/e2e-tests/specs/performance/performance.test.js b/packages/e2e-tests/specs/performance/post-editor.test.js similarity index 94% rename from packages/e2e-tests/specs/performance/performance.test.js rename to packages/e2e-tests/specs/performance/post-editor.test.js index 9360c98a6d313..844ee6b9c0729 100644 --- a/packages/e2e-tests/specs/performance/performance.test.js +++ b/packages/e2e-tests/specs/performance/post-editor.test.js @@ -1,7 +1,7 @@ /** * External dependencies */ -import { join } from 'path'; +import { basename, join } from 'path'; import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'fs'; /** @@ -71,7 +71,7 @@ function getSelectionEventDurations( trace ) { jest.setTimeout( 1000000 ); -describe( 'Performance', () => { +describe( 'Post Editor Performance', () => { it( 'Loading, typing and selecting blocks', async () => { const results = { load: [], @@ -123,6 +123,7 @@ describe( 'Performance', () => { } // Measuring typing performance + await page.waitForSelector( '.edit-post-layout' ); await insertBlock( 'Paragraph' ); i = 200; const traceFile = __dirname + '/trace.json'; @@ -182,8 +183,10 @@ describe( 'Performance', () => { const [ focusEvents ] = getSelectionEventDurations( traceResults ); results.focus = focusEvents; + const resultsFilename = basename( __filename, '.js' ) + '.results.json'; + writeFileSync( - __dirname + '/results.json', + join( __dirname, resultsFilename ), JSON.stringify( results, null, 2 ) ); diff --git a/packages/e2e-tests/specs/performance/site-editor.test.js b/packages/e2e-tests/specs/performance/site-editor.test.js new file mode 100644 index 0000000000000..da62661f07d88 --- /dev/null +++ b/packages/e2e-tests/specs/performance/site-editor.test.js @@ -0,0 +1,80 @@ +/** + * External dependencies + */ +import { basename, join } from 'path'; +import { writeFileSync } from 'fs'; + +/** + * Internal dependencies + */ +import { useExperimentalFeatures } from '../../experimental-features'; + +/** + * WordPress dependencies + */ +import { trashAllPosts, visitAdminPage } from '@wordpress/e2e-test-utils'; +import { addQueryArgs } from '@wordpress/url'; + +jest.setTimeout( 1000000 ); + +describe( 'Site Editor Performance', () => { + useExperimentalFeatures( [ + '#gutenberg-full-site-editing', + '#gutenberg-full-site-editing-demo', + ] ); + + beforeAll( async () => { + await trashAllPosts( 'wp_template' ); + await trashAllPosts( 'wp_template_part' ); + } ); + afterAll( async () => { + await trashAllPosts( 'wp_template' ); + await trashAllPosts( 'wp_template_part' ); + } ); + + it( 'Loading', async () => { + const results = { + load: [], + domcontentloaded: [], + type: [], + focus: [], + }; + + await visitAdminPage( + 'admin.php', + addQueryArgs( '', { + page: 'gutenberg-edit-site', + } ).slice( 1 ) + ); + + let i = 3; + + // Measuring loading time + while ( i-- ) { + await page.reload( { waitUntil: [ 'domcontentloaded', 'load' ] } ); + const timings = JSON.parse( + await page.evaluate( () => + JSON.stringify( window.performance.timing ) + ) + ); + const { + navigationStart, + domContentLoadedEventEnd, + loadEventEnd, + } = timings; + results.load.push( loadEventEnd - navigationStart ); + results.domcontentloaded.push( + domContentLoadedEventEnd - navigationStart + ); + } + + const resultsFilename = basename( __filename, '.js' ) + '.results.json'; + + writeFileSync( + join( __dirname, resultsFilename ), + JSON.stringify( results, null, 2 ) + ); + + expect( true ).toBe( true ); + } ); +} ); diff --git a/packages/edit-navigation/package.json b/packages/edit-navigation/package.json index 169d803b03737..08bc66b087089 100644 --- a/packages/edit-navigation/package.json +++ b/packages/edit-navigation/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/edit-navigation", - "version": "1.1.0", + "version": "1.3.3", "private": true, "description": "Module for the Navigation page in WordPress.", "author": "The WordPress Contributors", @@ -35,6 +35,7 @@ "@wordpress/blocks": "file:../blocks", "@wordpress/components": "file:../components", "@wordpress/compose": "file:../compose", + "@wordpress/core-data": "file:../core-data", "@wordpress/data": "file:../data", "@wordpress/data-controls": "file:../data-controls", "@wordpress/dom-ready": "file:../dom-ready", @@ -42,13 +43,15 @@ "@wordpress/hooks": "file:../hooks", "@wordpress/html-entities": "file:../html-entities", "@wordpress/i18n": "file:../i18n", + "@wordpress/icons": "file:../icons", "@wordpress/keyboard-shortcuts": "file:../keyboard-shortcuts", "@wordpress/media-utils": "file:../media-utils", "@wordpress/notices": "file:../notices", "@wordpress/url": "file:../url", "classnames": "^2.2.5", - "lodash": "^4.17.15", - "rememo": "^3.0.0" + "lodash": "^4.17.19", + "rememo": "^3.0.0", + "uuid": "^7.0.2" }, "publishConfig": { "access": "public" diff --git a/packages/edit-navigation/src/components/delete-menu-button/index.js b/packages/edit-navigation/src/components/delete-menu-button/index.js index 118b1cc972fd4..9cf1799ebfaf7 100644 --- a/packages/edit-navigation/src/components/delete-menu-button/index.js +++ b/packages/edit-navigation/src/components/delete-menu-button/index.js @@ -1,20 +1,10 @@ /** * WordPress dependencies */ -import apiFetch from '@wordpress/api-fetch'; import { Button } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; -export default function DeleteMenuButton( { menuId, onDelete } ) { - const deleteMenu = async ( recordId ) => { - const path = `/__experimental/menus/${ recordId }?force=true`; - const deletedRecord = await apiFetch( { - path, - method: 'DELETE', - } ); - return deletedRecord.previous; - }; - +export default function DeleteMenuButton( { onDelete } ) { const askToDelete = async () => { if ( // eslint-disable-next-line no-alert @@ -22,8 +12,7 @@ export default function DeleteMenuButton( { menuId, onDelete } ) { __( 'Are you sure you want to delete this navigation?' ) ) ) { - const deletedMenu = await deleteMenu( menuId ); - onDelete( deletedMenu.id ); + onDelete(); } }; diff --git a/packages/edit-navigation/src/components/error-boundary/index.js b/packages/edit-navigation/src/components/error-boundary/index.js new file mode 100644 index 0000000000000..d466e3e7c4acf --- /dev/null +++ b/packages/edit-navigation/src/components/error-boundary/index.js @@ -0,0 +1,53 @@ +/** + * WordPress dependencies + */ +import { Component } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { Button } from '@wordpress/components'; +import { Warning } from '@wordpress/block-editor'; + +class ErrorBoundary extends Component { + constructor() { + super( ...arguments ); + + this.reboot = this.reboot.bind( this ); + + this.state = { + error: null, + }; + } + + componentDidCatch( error ) { + this.setState( { error } ); + } + + reboot() { + if ( this.props.onError ) { + this.props.onError(); + } + } + + render() { + const { error } = this.state; + if ( ! error ) { + return this.props.children; + } + + return ( + + { __( 'Attempt Recovery' ) } + , + ] } + > + { __( + 'The navigation editor has encountered an unexpected error.' + ) } + + ); + } +} + +export default ErrorBoundary; diff --git a/packages/edit-navigation/src/components/error-boundary/style.scss b/packages/edit-navigation/src/components/error-boundary/style.scss new file mode 100644 index 0000000000000..4f8b095dc6e89 --- /dev/null +++ b/packages/edit-navigation/src/components/error-boundary/style.scss @@ -0,0 +1,7 @@ +.navigation-editor-error-boundary { + margin: auto; + max-width: 780px; + padding: 20px; + margin-top: 60px; + box-shadow: $shadow-modal; +} diff --git a/packages/edit-navigation/src/components/layout/index.js b/packages/edit-navigation/src/components/layout/index.js index fdfcdd0e9b2f2..780afd26e22eb 100644 --- a/packages/edit-navigation/src/components/layout/index.js +++ b/packages/edit-navigation/src/components/layout/index.js @@ -16,46 +16,49 @@ import { __ } from '@wordpress/i18n'; import Notices from '../notices'; import MenusEditor from '../menus-editor'; import MenuLocationsEditor from '../menu-locations-editor'; +import ErrorBoundary from '../error-boundary'; export default function Layout( { blockEditorSettings } ) { return ( <> - - - - - - { ( tab ) => ( - <> - { tab.name === 'menus' && ( - - ) } - { tab.name === 'menu-locations' && ( - - ) } - - ) } - - - - - + + + + + + + { ( tab ) => ( + + { tab.name === 'menus' && ( + + ) } + { tab.name === 'menu-locations' && ( + + ) } + + ) } + + + + + + ); } diff --git a/packages/edit-navigation/src/components/menu-editor/block-editor-area.js b/packages/edit-navigation/src/components/menu-editor/block-editor-area.js deleted file mode 100644 index 9c06ba2c8776e..0000000000000 --- a/packages/edit-navigation/src/components/menu-editor/block-editor-area.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * External dependencies - */ -import classnames from 'classnames'; - -/** - * WordPress dependencies - */ -import { - BlockList, - BlockToolbar, - NavigableToolbar, - ObserveTyping, - WritingFlow, -} from '@wordpress/block-editor'; -import { useEffect } from '@wordpress/element'; -import { - Button, - Card, - CardHeader, - CardBody, - CardFooter, - Popover, -} from '@wordpress/components'; -import { useSelect, useDispatch } from '@wordpress/data'; -import { __ } from '@wordpress/i18n'; - -/** - * Internal dependencies - */ -import DeleteMenuButton from '../delete-menu-button'; - -export default function BlockEditorArea( { - onDeleteMenu, - menuId, - saveBlocks, -} ) { - const { rootBlockId, isNavigationModeActive, hasSelectedBlock } = useSelect( - ( select ) => { - const { - isNavigationMode, - getBlockSelectionStart, - getBlock, - getBlocks, - } = select( 'core/block-editor' ); - - const selectionStartClientId = getBlockSelectionStart(); - - return { - rootBlockId: getBlocks()[ 0 ]?.clientId, - isNavigationModeActive: isNavigationMode(), - hasSelectedBlock: - !! selectionStartClientId && - !! getBlock( selectionStartClientId ), - }; - }, - [] - ); - - // Select the navigation block when it becomes available - const { selectBlock } = useDispatch( 'core/block-editor' ); - useEffect( () => { - if ( rootBlockId ) { - selectBlock( rootBlockId ); - } - }, [ rootBlockId ] ); - - return ( - - -
- { __( 'Navigation menu' ) } -
- - -
- - - { hasSelectedBlock && } - - - - - - - - - - - -
- ); -} diff --git a/packages/edit-navigation/src/components/menu-editor/index.js b/packages/edit-navigation/src/components/menu-editor/index.js deleted file mode 100644 index ce40b46c4f6ae..0000000000000 --- a/packages/edit-navigation/src/components/menu-editor/index.js +++ /dev/null @@ -1,71 +0,0 @@ -/** - * WordPress dependencies - */ -import { - BlockEditorKeyboardShortcuts, - BlockEditorProvider, -} from '@wordpress/block-editor'; -import { useViewportMatch } from '@wordpress/compose'; -import { useMemo } from '@wordpress/element'; - -/** - * Internal dependencies - */ -import useMenuItems from './use-menu-items'; -import useNavigationBlocks from './use-navigation-blocks'; -import MenuEditorShortcuts from './shortcuts'; -import BlockEditorArea from './block-editor-area'; -import NavigationStructureArea from './navigation-structure-area'; - -export default function MenuEditor( { - menuId, - blockEditorSettings, - onDeleteMenu, -} ) { - const isLargeViewport = useViewportMatch( 'medium' ); - const query = useMemo( () => ( { menus: menuId, per_page: -1 } ), [ - menuId, - ] ); - const { - menuItems, - eventuallySaveMenuItems, - createMissingMenuItems, - } = useMenuItems( query ); - const { blocks, setBlocks, menuItemsRef } = useNavigationBlocks( - menuItems - ); - const saveMenuItems = () => eventuallySaveMenuItems( blocks, menuItemsRef ); - - return ( -
- - - - setBlocks( updatedBlocks ) } - onChange={ ( updatedBlocks ) => { - createMissingMenuItems( updatedBlocks, menuItemsRef ); - setBlocks( updatedBlocks ); - } } - settings={ { - ...blockEditorSettings, - templateLock: 'all', - hasFixedToolbar: true, - } } - > - - - - - -
- ); -} diff --git a/packages/edit-navigation/src/components/menu-editor/promise-queue.js b/packages/edit-navigation/src/components/menu-editor/promise-queue.js deleted file mode 100644 index d560164e91e76..0000000000000 --- a/packages/edit-navigation/src/components/menu-editor/promise-queue.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * A concurrency primitive that runs at most `concurrency` async tasks at once. - */ -export default class PromiseQueue { - constructor( concurrency = 1 ) { - this.concurrency = concurrency; - this.queue = []; - this.active = []; - this.listeners = []; - } - - enqueue( action ) { - this.queue.push( action ); - this.run(); - } - - run() { - while ( this.queue.length && this.active.length <= this.concurrency ) { - const action = this.queue.shift(); - const promise = action().then( () => { - this.active.splice( this.active.indexOf( promise ), 1 ); - this.run(); - this.notifyIfEmpty(); - } ); - this.active.push( promise ); - } - } - - notifyIfEmpty() { - if ( this.active.length === 0 && this.queue.length === 0 ) { - for ( const l of this.listeners ) { - l(); - } - this.listeners = []; - } - } - - /** - * Calls `callback` once all async actions in the queue are finished, - * or immediately if no actions are running. - * - * @param {Function} callback Callback to call - */ - then( callback ) { - if ( this.active.length ) { - this.listeners.push( callback ); - } else { - callback(); - } - } -} diff --git a/packages/edit-navigation/src/components/menu-editor/shortcuts.js b/packages/edit-navigation/src/components/menu-editor/shortcuts.js deleted file mode 100644 index 96889b67a8daa..0000000000000 --- a/packages/edit-navigation/src/components/menu-editor/shortcuts.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * WordPress dependencies - */ -import { useEffect, useCallback } from '@wordpress/element'; -import { useDispatch } from '@wordpress/data'; -import { useShortcut } from '@wordpress/keyboard-shortcuts'; -import { __ } from '@wordpress/i18n'; - -function MenuEditorShortcuts( { saveBlocks } ) { - useShortcut( - 'core/edit-navigation/save-menu', - useCallback( ( event ) => { - event.preventDefault(); - saveBlocks(); - } ), - { - bindGlobal: true, - } - ); - - return null; -} - -function RegisterMenuEditorShortcuts() { - const { registerShortcut } = useDispatch( 'core/keyboard-shortcuts' ); - useEffect( () => { - registerShortcut( { - name: 'core/edit-navigation/save-menu', - category: 'global', - description: __( 'Save the menu currently being edited.' ), - keyCombination: { - modifier: 'primary', - character: 's', - }, - } ); - }, [ registerShortcut ] ); - - return null; -} - -MenuEditorShortcuts.Register = RegisterMenuEditorShortcuts; - -export default MenuEditorShortcuts; diff --git a/packages/edit-navigation/src/components/menu-editor/use-create-missing-menu-items.js b/packages/edit-navigation/src/components/menu-editor/use-create-missing-menu-items.js deleted file mode 100644 index b21fa5416d1e6..0000000000000 --- a/packages/edit-navigation/src/components/menu-editor/use-create-missing-menu-items.js +++ /dev/null @@ -1,67 +0,0 @@ -/** - * WordPress dependencies - */ -import apiFetch from '@wordpress/api-fetch'; -import { useRef, useCallback } from '@wordpress/element'; - -/** - * Internal dependencies - */ -import { flattenBlocks } from './helpers'; -import PromiseQueue from './promise-queue'; - -/** - * When a new Navigation child block is added, we create a draft menuItem for it because - * the batch save endpoint expects all the menu items to have a valid id already. - * PromiseQueue is used in order to - * 1) limit the amount of requests processed at the same time - * 2) save the menu only after all requests are finalized - * - * @return {function(*=): void} Function registering it's argument to be called once all menuItems are created. - */ -export default function useCreateMissingMenuItems() { - const promiseQueueRef = useRef( new PromiseQueue() ); - const enqueuedBlocksIds = useRef( [] ); - const createMissingMenuItems = ( blocks, menuItemsRef ) => { - for ( const { clientId, name } of flattenBlocks( blocks ) ) { - // No need to create menuItems for the wrapping navigation block - if ( name === 'core/navigation' ) { - continue; - } - // Menu item was already created - if ( clientId in menuItemsRef.current ) { - continue; - } - // Menu item already in the queue - if ( enqueuedBlocksIds.current.includes( clientId ) ) { - continue; - } - enqueuedBlocksIds.current.push( clientId ); - promiseQueueRef.current.enqueue( () => - createDraftMenuItem( clientId ).then( ( menuItem ) => { - menuItemsRef.current[ clientId ] = menuItem; - enqueuedBlocksIds.current.splice( - enqueuedBlocksIds.current.indexOf( clientId ) - ); - } ) - ); - } - }; - const onCreated = useCallback( - ( callback ) => promiseQueueRef.current.then( callback ), - [ promiseQueueRef.current ] - ); - return { createMissingMenuItems, onCreated }; -} - -function createDraftMenuItem() { - return apiFetch( { - path: `/__experimental/menu-items`, - method: 'POST', - data: { - title: 'Placeholder', - url: 'Placeholder', - menu_order: 0, - }, - } ); -} diff --git a/packages/edit-navigation/src/components/menu-editor/use-menu-items.js b/packages/edit-navigation/src/components/menu-editor/use-menu-items.js deleted file mode 100644 index 250b9927153ab..0000000000000 --- a/packages/edit-navigation/src/components/menu-editor/use-menu-items.js +++ /dev/null @@ -1,172 +0,0 @@ -/** - * External dependencies - */ -import { keyBy, omit } from 'lodash'; - -/** - * WordPress dependencies - */ -import { useDispatch, useSelect } from '@wordpress/data'; -import { useEffect, useState } from '@wordpress/element'; -import { __ } from '@wordpress/i18n'; -import apiFetch from '@wordpress/api-fetch'; - -/** - * Internal dependencies - */ -import useCreateMissingMenuItems from './use-create-missing-menu-items'; - -export default function useMenuItems( query ) { - const menuItems = useFetchMenuItems( query ); - const saveMenuItems = useSaveMenuItems( query ); - const { createMissingMenuItems, onCreated } = useCreateMissingMenuItems(); - const eventuallySaveMenuItems = ( blocks, menuItemsRef ) => - onCreated( () => saveMenuItems( blocks, menuItemsRef ) ); - return { menuItems, eventuallySaveMenuItems, createMissingMenuItems }; -} - -export function useFetchMenuItems( query ) { - const { menuItems, isResolving } = useSelect( ( select ) => ( { - menuItems: select( 'core' ).getMenuItems( query ), - isResolving: select( 'core/data' ).isResolving( - 'core', - 'getMenuItems', - [ query ] - ), - } ) ); - - const [ resolvedMenuItems, setResolvedMenuItems ] = useState( null ); - - useEffect( () => { - if ( isResolving || menuItems === null ) { - return; - } - - setResolvedMenuItems( menuItems ); - }, [ isResolving, menuItems ] ); - - return resolvedMenuItems; -} - -export function useSaveMenuItems( query ) { - const { receiveEntityRecords } = useDispatch( 'core' ); - const { createSuccessNotice, createErrorNotice } = useDispatch( - 'core/notices' - ); - - const saveBlocks = async ( blocks, menuItemsRef ) => { - const result = await batchSave( - query.menus, - menuItemsRef, - blocks[ 0 ] - ); - - if ( result.success ) { - receiveEntityRecords( 'root', 'menuItem', [], query, true ); - createSuccessNotice( __( 'Navigation saved.' ), { - type: 'snackbar', - } ); - } else { - createErrorNotice( __( 'There was an error.' ), { - type: 'snackbar', - } ); - } - }; - - return saveBlocks; -} - -async function batchSave( menuId, menuItemsRef, navigationBlock ) { - const { nonce, stylesheet } = await apiFetch( { - path: '/__experimental/customizer-nonces/get-save-nonce', - } ); - - // eslint-disable-next-line no-undef - const body = new FormData(); - body.append( 'wp_customize', 'on' ); - body.append( 'customize_theme', stylesheet ); - body.append( 'nonce', nonce ); - body.append( 'customize_changeset_uuid', uuidv4() ); - body.append( 'customize_autosaved', 'on' ); - body.append( 'customize_changeset_status', 'publish' ); - body.append( 'action', 'customize_save' ); - body.append( - 'customized', - computeCustomizedAttribute( - navigationBlock.innerBlocks, - menuId, - menuItemsRef - ) - ); - - return await apiFetch( { - url: '/wp-admin/admin-ajax.php', - method: 'POST', - body, - } ); -} - -function computeCustomizedAttribute( blocks, menuId, menuItemsRef ) { - const blocksList = blocksTreeToFlatList( blocks ); - const dataList = blocksList.map( ( { block, parentId, position } ) => - linkBlockToRequestItem( block, parentId, position ) - ); - - // Create an object like { "nav_menu_item[12]": {...}} } - const computeKey = ( item ) => `nav_menu_item[${ item.id }]`; - const dataObject = keyBy( dataList, computeKey ); - - // Deleted menu items should be sent as false, e.g. { "nav_menu_item[13]": false } - for ( const clientId in menuItemsRef.current ) { - const key = computeKey( menuItemsRef.current[ clientId ] ); - if ( ! ( key in dataObject ) ) { - dataObject[ key ] = false; - } - } - - return JSON.stringify( dataObject ); - - function blocksTreeToFlatList( innerBlocks, parentId = 0 ) { - return innerBlocks.flatMap( ( block, index ) => - [ { block, parentId, position: index + 1 } ].concat( - blocksTreeToFlatList( - block.innerBlocks, - getMenuItemForBlock( block )?.id - ) - ) - ); - } - - function linkBlockToRequestItem( block, parentId, position ) { - const menuItem = omit( getMenuItemForBlock( block ), 'menus', 'meta' ); - return { - ...menuItem, - position, - title: block.attributes?.label, - url: block.attributes.url, - original_title: '', - classes: ( menuItem.classes || [] ).join( ' ' ), - xfn: ( menuItem.xfn || [] ).join( ' ' ), - nav_menu_term_id: menuId, - menu_item_parent: parentId, - status: 'publish', - _invalid: false, - }; - } - - function getMenuItemForBlock( block ) { - return omit( menuItemsRef.current[ block.clientId ] || {}, '_links' ); - } -} - -function uuidv4() { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace( /[xy]/g, ( c ) => { - // eslint-disable-next-line no-restricted-syntax - const a = Math.random() * 16; - // eslint-disable-next-line no-bitwise - const r = a | 0; - // eslint-disable-next-line no-bitwise - const v = c === 'x' ? r : ( r & 0x3 ) | 0x8; - return v.toString( 16 ); - } ); -} diff --git a/packages/edit-navigation/src/components/menu-editor/use-navigation-blocks.js b/packages/edit-navigation/src/components/menu-editor/use-navigation-blocks.js deleted file mode 100644 index 1b7899737fd78..0000000000000 --- a/packages/edit-navigation/src/components/menu-editor/use-navigation-blocks.js +++ /dev/null @@ -1,114 +0,0 @@ -/** - * External dependencies - */ -import { keyBy, groupBy, sortBy } from 'lodash'; - -/** - * WordPress dependencies - */ -import { createBlock } from '@wordpress/blocks'; -import { useState, useRef, useEffect } from '@wordpress/element'; - -/** - * Internal dependencies - */ -import { flattenBlocks } from './helpers'; - -export default function useNavigationBlocks( menuItems ) { - const [ blocks, setBlocks ] = useState( [] ); - const menuItemsRef = useRef( {} ); - - // Refresh our model whenever menuItems change - useEffect( () => { - const [ innerBlocks, clientIdToMenuItemMapping ] = menuItemsToBlocks( - menuItems, - blocks[ 0 ]?.innerBlocks, - menuItemsRef.current - ); - - const navigationBlock = blocks[ 0 ] - ? { ...blocks[ 0 ], innerBlocks } - : createBlock( 'core/navigation', {}, innerBlocks ); - - setBlocks( [ navigationBlock ] ); - menuItemsRef.current = clientIdToMenuItemMapping; - }, [ menuItems ] ); - - return { - blocks, - setBlocks, - menuItemsRef, - }; -} - -const menuItemsToBlocks = ( - menuItems, - prevBlocks = [], - prevClientIdToMenuItemMapping = {} -) => { - const blocksByMenuId = mapBlocksByMenuId( - prevBlocks, - prevClientIdToMenuItemMapping - ); - - const itemsByParentID = groupBy( menuItems, 'parent' ); - const clientIdToMenuItemMapping = {}; - const menuItemsToTreeOfBlocks = ( items ) => { - const innerBlocks = []; - if ( ! items ) { - return; - } - - const sortedItems = sortBy( items, 'menu_order' ); - for ( const item of sortedItems ) { - let menuItemInnerBlocks = []; - if ( itemsByParentID[ item.id ]?.length ) { - menuItemInnerBlocks = menuItemsToTreeOfBlocks( - itemsByParentID[ item.id ] - ); - } - const linkBlock = menuItemToLinkBlock( - item, - menuItemInnerBlocks, - blocksByMenuId[ item.id ] - ); - clientIdToMenuItemMapping[ linkBlock.clientId ] = item; - innerBlocks.push( linkBlock ); - } - return innerBlocks; - }; - - // menuItemsToTreeOfLinkBlocks takes an array of top-level menu items and recursively creates all their innerBlocks - const blocks = menuItemsToTreeOfBlocks( itemsByParentID[ 0 ] || [] ); - return [ blocks, clientIdToMenuItemMapping ]; -}; - -function menuItemToLinkBlock( - menuItem, - innerBlocks = [], - existingBlock = null -) { - const attributes = { - label: menuItem.title.rendered, - url: menuItem.url, - }; - - if ( existingBlock ) { - return { - ...existingBlock, - attributes, - innerBlocks, - }; - } - return createBlock( 'core/navigation-link', attributes, innerBlocks ); -} - -const mapBlocksByMenuId = ( blocks, menuItemsByClientId ) => { - const blocksByClientId = keyBy( flattenBlocks( blocks ), 'clientId' ); - const blocksByMenuId = {}; - for ( const clientId in menuItemsByClientId ) { - const menuItem = menuItemsByClientId[ clientId ]; - blocksByMenuId[ menuItem.id ] = blocksByClientId[ clientId ]; - } - return blocksByMenuId; -}; diff --git a/packages/edit-navigation/src/components/menus-editor/index.js b/packages/edit-navigation/src/components/menus-editor/index.js index 04507772174cb..7b22b5a295c71 100644 --- a/packages/edit-navigation/src/components/menus-editor/index.js +++ b/packages/edit-navigation/src/components/menus-editor/index.js @@ -1,8 +1,13 @@ +/** + * External dependencies + */ +import { uniqueId } from 'lodash'; + /** * WordPress dependencies */ -import { useSelect } from '@wordpress/data'; -import { useState, useEffect } from '@wordpress/element'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { useState, useEffect, useRef } from '@wordpress/element'; import { Button, Card, @@ -11,41 +16,73 @@ import { SelectControl, } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; +const { DOMParser } = window; /** * Internal dependencies */ import CreateMenuArea from './create-menu-area'; -import MenuEditor from '../menu-editor'; +import NavigationEditor from '../navigation-editor'; export default function MenusEditor( { blockEditorSettings } ) { - const { menus, hasLoadedMenus } = useSelect( ( select ) => { - const { getMenus, hasFinishedResolution } = select( 'core' ); - const query = { per_page: -1 }; - return { - menus: getMenus( query ), - hasLoadedMenus: hasFinishedResolution( 'getMenus', [ query ] ), - }; - }, [] ); - + const [ menuId, setMenuId ] = useState(); + const [ showCreateMenuPanel, setShowCreateMenuPanel ] = useState( false ); const [ hasCompletedFirstLoad, setHasCompletedFirstLoad ] = useState( false ); + const noticeId = useRef(); + + const { menus, hasLoadedMenus, menuDeleteError } = useSelect( + ( select ) => { + const { + getMenus, + hasFinishedResolution, + getLastEntityDeleteError, + } = select( 'core' ); + const query = { per_page: -1 }; + return { + menus: getMenus( query ), + hasLoadedMenus: hasFinishedResolution( 'getMenus', [ query ] ), + menuDeleteError: getLastEntityDeleteError( + 'root', + 'menu', + menuId + ), + }; + }, + [ menuId ] + ); + + const { deleteMenu } = useDispatch( 'core' ); + const { createErrorNotice, removeNotice } = useDispatch( 'core/notices' ); + useEffect( () => { if ( ! hasCompletedFirstLoad && hasLoadedMenus ) { setHasCompletedFirstLoad( true ); } }, [ hasLoadedMenus ] ); - const [ menuId, setMenuId ] = useState(); - const [ stateMenus, setStateMenus ] = useState(); - const [ showCreateMenuPanel, setShowCreateMenuPanel ] = useState( false ); + // Handle REST API Error messages. + useEffect( () => { + if ( menuDeleteError ) { + // Error messages from the REST API often contain HTML. + // createErrorNotice does not support HTML in error text, so first + // strip HTML out using DOMParser. + const document = new DOMParser().parseFromString( + menuDeleteError.message, + 'text/html' + ); + const errorText = document.body.textContent || ''; + noticeId.current = uniqueId( + 'navigation-editor/menu-editor/edit-navigation-delete-menu-error' + ); + createErrorNotice( errorText, { id: noticeId.current } ); + } + }, [ menuDeleteError ] ); useEffect( () => { if ( menus?.length ) { - setStateMenus( menus ); - // Only set menuId if it's currently unset. if ( ! menuId ) { setMenuId( menus[ 0 ].id ); @@ -57,7 +94,7 @@ export default function MenusEditor( { blockEditorSettings } ) { return ; } - const hasMenus = !! stateMenus?.length; + const hasMenus = !! menus?.length; const isCreateMenuPanelVisible = hasCompletedFirstLoad && ( ! hasMenus || showCreateMenuPanel ); @@ -75,12 +112,12 @@ export default function MenusEditor( { blockEditorSettings } ) { ( { + options={ menus?.map( ( menu ) => ( { value: menu.id, label: menu.name, } ) ) } onChange={ ( selectedMenuId ) => - setMenuId( selectedMenuId ) + setMenuId( Number( selectedMenuId ) ) } value={ menuId } /> @@ -96,7 +133,7 @@ export default function MenusEditor( { blockEditorSettings } ) { { isCreateMenuPanelVisible && ( ) } { hasMenus && ( - { - const newStateMenus = stateMenus.filter( ( menu ) => { - return menu.id !== deletedMenu; + onDeleteMenu={ async () => { + removeNotice( noticeId.current ); + const deletedMenu = await deleteMenu( menuId, { + force: 'true', } ); - setStateMenus( newStateMenus ); - if ( newStateMenus.length ) { - setMenuId( newStateMenus[ 0 ].id ); - } else { - setMenuId(); + if ( deletedMenu ) { + setMenuId( false ); } } } /> diff --git a/packages/edit-navigation/src/components/navigation-editor/block-editor-area.js b/packages/edit-navigation/src/components/navigation-editor/block-editor-area.js new file mode 100644 index 0000000000000..2bb3fe8569629 --- /dev/null +++ b/packages/edit-navigation/src/components/navigation-editor/block-editor-area.js @@ -0,0 +1,163 @@ +/** + * External dependencies + */ +import classnames from 'classnames'; + +/** + * WordPress dependencies + */ +import { + BlockList, + BlockToolbar, + NavigableToolbar, + ObserveTyping, + WritingFlow, + BlockInspector, +} from '@wordpress/block-editor'; +import { useEffect, useState } from '@wordpress/element'; +import { + Button, + Card, + CardHeader, + CardBody, + CardFooter, + CheckboxControl, + Dropdown, + Popover, +} from '@wordpress/components'; +import { useSelect, useDispatch } from '@wordpress/data'; +import { __ } from '@wordpress/i18n'; +import { cog } from '@wordpress/icons'; + +/** + * Internal dependencies + */ +import DeleteMenuButton from '../delete-menu-button'; + +export default function BlockEditorArea( { + onDeleteMenu, + menuId, + saveBlocks, +} ) { + const { + rootBlockId, + isNavigationModeActive, + isRootBlockSelected, + hasSelectedBlock, + } = useSelect( ( select ) => { + const { + isNavigationMode, + getBlockSelectionStart, + getBlock, + getBlocks, + } = select( 'core/block-editor' ); + + const selectionStartClientId = getBlockSelectionStart(); + const rootClientId = getBlocks()[ 0 ]?.clientId; + + return { + selectionStartClientId, + rootBlockId: rootClientId, + isNavigationModeActive: isNavigationMode(), + isRootBlockSelected: + !! selectionStartClientId && + rootClientId === selectionStartClientId, + hasSelectedBlock: + !! selectionStartClientId && + !! getBlock( selectionStartClientId ), + }; + }, [] ); + + const { saveMenu } = useDispatch( 'core' ); + const menu = useSelect( ( select ) => select( 'core' ).getMenu( menuId ), [ + menuId, + ] ); + + const [ autoAddPages, setAutoAddPages ] = useState( false ); + + useEffect( () => { + if ( menu ) { + setAutoAddPages( menu.auto_add ); + } + }, [ menuId ] ); + + // Select the navigation block when it becomes available + const { selectBlock } = useDispatch( 'core/block-editor' ); + useEffect( () => { + if ( rootBlockId ) { + selectBlock( rootBlockId ); + } + }, [ rootBlockId ] ); + + return ( + + +
+ { __( 'Navigation menu' ) } +
+ + + ( + ); } diff --git a/packages/edit-post/src/components/header/fullscreen-mode-close/style.scss b/packages/edit-post/src/components/header/fullscreen-mode-close/style.scss index 6846cac965113..825e2811d5c97 100644 --- a/packages/edit-post/src/components/header/fullscreen-mode-close/style.scss +++ b/packages/edit-post/src/components/header/fullscreen-mode-close/style.scss @@ -27,3 +27,8 @@ } } } + +.edit-post-fullscreen-mode-close_site-icon { + width: 36px; +} + diff --git a/packages/edit-post/src/components/header/fullscreen-mode-close/test/index.js b/packages/edit-post/src/components/header/fullscreen-mode-close/test/index.js new file mode 100644 index 0000000000000..ae3114ec2463c --- /dev/null +++ b/packages/edit-post/src/components/header/fullscreen-mode-close/test/index.js @@ -0,0 +1,70 @@ +/** + * External dependencies + */ +import { render } from '@testing-library/react'; + +/** + * WordPress dependencies + */ +import { useSelect } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import FullscreenModeClose from '../'; + +jest.mock( '@wordpress/data/src/components/use-select', () => { + // This allows us to tweak the returned value on each test + const mock = jest.fn(); + return mock; +} ); + +jest.mock( '@wordpress/core-data' ); + +describe( 'FullscreenModeClose', () => { + describe( 'when in full screen mode', () => { + it( 'should display a user uploaded site icon if it exists', () => { + useSelect.mockImplementation( ( cb ) => { + return cb( () => ( { + isResolving: () => false, + isFeatureActive: () => true, + getCurrentPostType: () => {}, + getPostType: () => true, + getEntityRecord: () => ( { + site_icon_url: 'https://fakeUrl.com', + } ), + } ) ); + } ); + + const { container } = render( ); + const siteIcon = container.querySelector( + '.edit-post-fullscreen-mode-close_site-icon' + ); + + expect( siteIcon ).toBeTruthy(); + } ); + + it( 'should display a default site icon if no user uploaded site icon exists', () => { + useSelect.mockImplementation( ( cb ) => { + return cb( () => ( { + isResolving: () => false, + isFeatureActive: () => true, + getCurrentPostType: () => {}, + getPostType: () => true, + getEntityRecord: () => ( { + site_icon_url: '', + } ), + } ) ); + } ); + + const { container } = render( ); + const siteIcon = container.querySelector( + '.edit-post-fullscreen-mode-close_site-icon' + ); + const defaultIcon = container.querySelector( 'svg' ); + + expect( siteIcon ).toBeFalsy(); + expect( defaultIcon ).toBeTruthy(); + } ); + } ); +} ); diff --git a/packages/edit-post/src/components/header/header-toolbar/index.js b/packages/edit-post/src/components/header/header-toolbar/index.js index 80bd41351abca..50959fed4fcb2 100644 --- a/packages/edit-post/src/components/header/header-toolbar/index.js +++ b/packages/edit-post/src/components/header/header-toolbar/index.js @@ -2,7 +2,7 @@ * WordPress dependencies */ import { useViewportMatch } from '@wordpress/compose'; -import { useSelect } from '@wordpress/data'; +import { useSelect, useDispatch } from '@wordpress/data'; import { __, _x } from '@wordpress/i18n'; import { BlockToolbar, @@ -17,16 +17,25 @@ import { } from '@wordpress/editor'; import { Button, - __experimentalToolbarItem as ToolbarItem, + DropdownMenu, + ToolbarItem, + MenuItemsChoice, + MenuGroup, } from '@wordpress/components'; import { plus } from '@wordpress/icons'; +import { useRef } from '@wordpress/element'; -function HeaderToolbar( { onToggleInserter, isInserterOpen } ) { +function HeaderToolbar() { + const inserterButton = useRef(); + const { setIsInserterOpened } = useDispatch( 'core/edit-post' ); const { hasFixedToolbar, isInserterEnabled, + isInserterOpened, isTextModeEnabled, previewDeviceType, + showIconLabels, + isNavigationTool, } = useSelect( ( select ) => { const { hasInserterItems, @@ -45,14 +54,21 @@ function HeaderToolbar( { onToggleInserter, isInserterOpen } ) { hasInserterItems( getBlockRootClientId( getBlockSelectionEnd() ) ), + isInserterOpened: select( 'core/edit-post' ).isInserterOpened(), isTextModeEnabled: select( 'core/edit-post' ).getEditorMode() === 'text', previewDeviceType: select( 'core/edit-post' ).__experimentalGetPreviewDeviceType(), + showIconLabels: select( 'core/edit-post' ).isFeatureActive( + 'showIconLabels' + ), + isNavigationTool: select( 'core/block-editor' ).isNavigationMode(), }; }, [] ); const isLargeViewport = useViewportMatch( 'medium' ); + const isWideViewport = useViewportMatch( 'wide' ); + const isSmallViewport = useViewportMatch( 'small', '<' ); const displayBlockToolbar = ! isLargeViewport || previewDeviceType !== 'Desktop' || hasFixedToolbar; @@ -63,35 +79,131 @@ function HeaderToolbar( { onToggleInserter, isInserterOpen } ) { : /* translators: accessibility text for the editor toolbar when Top Toolbar is off */ __( 'Document tools' ); + const { setNavigationMode } = useDispatch( 'core/block-editor' ); + + const onSwitchMode = ( mode ) => { + setNavigationMode( mode === 'edit' ? false : true ); + }; + + const overflowItems = ( + <> + + + + ); + return ( { + event.preventDefault(); + } } + onClick={ () => { + if ( isInserterOpened ) { + // Focusing the inserter button closes the inserter popover + inserterButton.current.focus(); + } else { + setIsInserterOpened( true ); + } + } } disabled={ ! isInserterEnabled } icon={ plus } + /* translators: button label text should, if possible, be under 16 + characters. */ label={ _x( 'Add block', 'Generic label for block inserter button' ) } - /> - { isLargeViewport && } - - - - + showTooltip={ ! showIconLabels } + > + { showIconLabels && __( 'Add' ) } + + { ( isWideViewport || ! showIconLabels ) && ( + <> + { isLargeViewport && ( + + ) } + + + { overflowItems } + + ) } + { ! isWideViewport && ! isSmallViewport && showIconLabels && ( + + { () => ( +
+ + + + + + + + { overflowItems } +
+ ) } +
+ ) } { displayBlockToolbar && (
diff --git a/packages/edit-post/src/components/header/header-toolbar/style.scss b/packages/edit-post/src/components/header/header-toolbar/style.scss index 015d63dd18683..41b3f596e5c8d 100644 --- a/packages/edit-post/src/components/header/header-toolbar/style.scss +++ b/packages/edit-post/src/components/header/header-toolbar/style.scss @@ -34,7 +34,7 @@ padding: 6px; &.is-pressed { - background: $dark-gray-primary; + background: $gray-900; } &:focus:not(:disabled) { @@ -56,7 +56,7 @@ left: 0; right: 0; background: $white; - border-bottom: $border-width solid $light-gray-500; + border-bottom: $border-width solid $gray-200; &:empty { display: none; @@ -93,7 +93,7 @@ } .block-editor-block-toolbar { - border-left: $border-width solid $light-gray-500; + border-left: $border-width solid $gray-200; } .block-editor-block-toolbar .components-toolbar-group, @@ -113,3 +113,27 @@ height: 32px; padding: 0; } + +.show-icon-labels { + // Always display block toolbar under main toolbar when text labels are visible + .edit-post-header-toolbar__block-toolbar { + @include break-wide { + position: absolute; + top: $header-height + $border-width; + left: 0; + right: 0; + border-bottom: $border-width solid $gray-200; + padding: 0; + background-color: $white; + + .block-editor-block-toolbar .components-toolbar-group, + .block-editor-block-toolbar .components-toolbar { + height: auto; + padding: 0; + } + } + } + .edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle.edit-post-header-toolbar__inserter-toggle { + height: 36px; + } +} diff --git a/packages/edit-post/src/components/header/index.js b/packages/edit-post/src/components/header/index.js index d4b52b0aa7ceb..631e22db0ca6d 100644 --- a/packages/edit-post/src/components/header/index.js +++ b/packages/edit-post/src/components/header/index.js @@ -7,6 +7,7 @@ import { PinnedItems, __experimentalMainDashboardButton as MainDashboardButton, } from '@wordpress/interface'; +import { useViewportMatch } from '@wordpress/compose'; /** * Internal dependencies @@ -17,32 +18,35 @@ import MoreMenu from './more-menu'; import PostPublishButtonOrToggle from './post-publish-button-or-toggle'; import { default as DevicePreview } from '../device-preview'; -function Header( { - onToggleInserter, - isInserterOpen, - setEntitiesSavedStatesCallback, -} ) { - const { hasActiveMetaboxes, isPublishSidebarOpened, isSaving } = useSelect( +function Header( { setEntitiesSavedStatesCallback } ) { + const { + hasActiveMetaboxes, + isPublishSidebarOpened, + isSaving, + showIconLabels, + } = useSelect( ( select ) => ( { hasActiveMetaboxes: select( 'core/edit-post' ).hasMetaBoxes(), isPublishSidebarOpened: select( 'core/edit-post' ).isPublishSidebarOpened(), isSaving: select( 'core/edit-post' ).isSavingMetaBoxes(), + showIconLabels: select( 'core/edit-post' ).isFeatureActive( + 'showIconLabels' + ), } ), [] ); + const isLargeViewport = useViewportMatch( 'large' ); + return (
- +
{ ! isPublishSidebarOpened && ( @@ -54,6 +58,7 @@ function Header( { ) } @@ -68,8 +73,15 @@ function Header( { setEntitiesSavedStatesCallback } /> - - + { ( isLargeViewport || ! showIconLabels ) && ( + <> + + + + ) } + { showIconLabels && ! isLargeViewport && ( + + ) }
); diff --git a/packages/edit-post/src/components/header/more-menu/index.js b/packages/edit-post/src/components/header/more-menu/index.js index dd362272a3d66..0e115cd79c73f 100644 --- a/packages/edit-post/src/components/header/more-menu/index.js +++ b/packages/edit-post/src/components/header/more-menu/index.js @@ -4,7 +4,8 @@ import { __ } from '@wordpress/i18n'; import { DropdownMenu, MenuGroup, MenuItem } from '@wordpress/components'; import { moreVertical } from '@wordpress/icons'; -import { ActionItem } from '@wordpress/interface'; +import { ActionItem, PinnedItems } from '@wordpress/interface'; +import { useViewportMatch } from '@wordpress/compose'; /** * Internal dependencies @@ -22,31 +23,46 @@ const TOGGLE_PROPS = { tooltipPosition: 'bottom', }; -const MoreMenu = () => ( - - { ( { onClose } ) => ( - <> - - - - - - - - - ) } - -); +const MoreMenu = ( { showIconLabels } ) => { + const isLargeViewport = useViewportMatch( 'large' ); + + return ( + + { ( { onClose } ) => ( + <> + { showIconLabels && ! isLargeViewport && ( + + ) } + + + + + + + + + ) } + + ); +}; export default MoreMenu; diff --git a/packages/edit-post/src/components/header/more-menu/test/__snapshots__/index.js.snap b/packages/edit-post/src/components/header/more-menu/test/__snapshots__/index.js.snap index 9296591a63859..7dfc100408121 100644 --- a/packages/edit-post/src/components/header/more-menu/test/__snapshots__/index.js.snap +++ b/packages/edit-post/src/components/header/more-menu/test/__snapshots__/index.js.snap @@ -14,7 +14,7 @@ exports[`MoreMenu should match snapshot 1`] = ` /> } - label="More tools & options" + label="Options" popoverProps={ Object { "className": "edit-post-more-menu__content", @@ -23,6 +23,8 @@ exports[`MoreMenu should match snapshot 1`] = ` } toggleProps={ Object { + "isTertiary": undefined, + "showTooltip": true, "tooltipPosition": "bottom", } } @@ -55,7 +57,7 @@ exports[`MoreMenu should match snapshot 1`] = ` /> } - label="More tools & options" + label="Options" onClick={[Function]} onKeyDown={[Function]} showTooltip={true} @@ -63,12 +65,12 @@ exports[`MoreMenu should match snapshot 1`] = ` >
-
- { - if ( isMobileViewport ) { - setIsInserterOpen( false ); + isInserterOpened && ( + setIsInserterOpened( false ) } + > +
+
+
+
+ + showInserterHelpPanel + onSelect={ () => { + if ( isMobileViewport ) { + setIsInserterOpened( + false + ); + } + } } + /> +
-
+ ) } sidebar={ diff --git a/packages/edit-post/src/components/layout/index.native.js b/packages/edit-post/src/components/layout/index.native.js index 94291b0db06e3..1b8f879711621 100644 --- a/packages/edit-post/src/components/layout/index.native.js +++ b/packages/edit-post/src/components/layout/index.native.js @@ -3,7 +3,6 @@ */ import { Platform, SafeAreaView, View } from 'react-native'; import SafeArea from 'react-native-safe-area'; -import { sendNativeEditorDidLayout } from 'react-native-gutenberg-bridge'; /** * WordPress dependencies @@ -17,8 +16,14 @@ import { FloatingToolbar, } from '@wordpress/block-editor'; import { compose, withPreferredColorScheme } from '@wordpress/compose'; -import { HTMLTextInput, KeyboardAvoidingView } from '@wordpress/components'; +import { + HTMLTextInput, + KeyboardAvoidingView, + NoticeList, + withSiteCapabilities, +} from '@wordpress/components'; import { AutosaveMonitor } from '@wordpress/editor'; +import { sendNativeEditorDidLayout } from '@wordpress/react-native-bridge'; /** * Internal dependencies @@ -124,7 +129,7 @@ class Layout extends Component { ) } onLayout={ this.onRootViewLayout } > - + ) } + children ) +); + +export default function PopoverWrapper( { onClose, children, className } ) { + // Event handlers + const maybeClose = ( event ) => { + // Close on escape + if ( event.keyCode === ESCAPE && onClose ) { + event.stopPropagation(); + onClose(); + } + }; + + // Disable reason: this stops certain events from propagating outside of the component. + // - onMouseDown is disabled as this can cause interactions with other DOM elements + /* eslint-disable jsx-a11y/no-static-element-interactions */ + return ( +
+ + { children } + +
+ ); + /* eslint-enable jsx-a11y/no-static-element-interactions */ +} diff --git a/packages/edit-post/src/components/layout/style.scss b/packages/edit-post/src/components/layout/style.scss index 65c1b49625ea1..8bbae2f3254b8 100644 --- a/packages/edit-post/src/components/layout/style.scss +++ b/packages/edit-post/src/components/layout/style.scss @@ -2,7 +2,7 @@ flex-shrink: 0; } .edit-post-layout__metaboxes:not(:empty) { - border-top: $border-width solid $light-gray-500; + border-top: $border-width solid $gray-200; padding: 10px 0 10px; clear: both; @@ -34,8 +34,8 @@ z-index: z-index(".edit-post-layout .edit-post-post-publish-panel {greater than small}"); top: $admin-bar-height; left: auto; - width: $sidebar-width; - border-left: $border-width solid $light-gray-500; + width: $sidebar-width + $border-width; + border-left: $border-width solid $gray-200; transform: translateX(+100%); animation: edit-post-post-publish-panel__slide-in-animation 0.1s forwards; @include reduce-motion("animation"); @@ -59,6 +59,7 @@ .interface-interface-skeleton__sidebar > div { height: 100%; + padding-bottom: $grid-unit-60; } .edit-post-layout .editor-post-publish-panel__header-publish-button { @@ -77,7 +78,7 @@ right: 0; width: $sidebar-width; background-color: $white; - border: 1px dotted $light-gray-500; + border: 1px dotted $gray-200; height: auto !important; // Need to override the default sidebar positionnings padding: $grid-unit-30; display: flex; @@ -111,6 +112,17 @@ background-color: $light-gray-700; } +// Ideally we don't need all these nested divs. +// Removing these requires a refactoring of the different a11y HoCs. +.edit-post-layout__inserter-panel-popover-wrapper { + &, + & > div, + & > div > div, + & > div > div > div { + height: 100%; + } +} + .edit-post-layout__inserter-panel { height: 100%; display: flex; diff --git a/packages/edit-post/src/components/manage-blocks-modal/style.scss b/packages/edit-post/src/components/manage-blocks-modal/style.scss index d09e9a4891b4c..e23efa0acf0a2 100644 --- a/packages/edit-post/src/components/manage-blocks-modal/style.scss +++ b/packages/edit-post/src/components/manage-blocks-modal/style.scss @@ -40,20 +40,20 @@ } input[type="search"].components-text-control__input { - padding: 0.75 * $grid-unit-20; - border-radius: $radius-round-rectangle; + padding: $grid-unit-10; + border-radius: $radius-block-ui; } } .edit-post-manage-blocks-modal__disabled-blocks-count { - border-top: 1px solid $light-gray-500; + border-top: 1px solid $gray-200; margin-left: -$grid-unit-30; margin-right: -$grid-unit-30; padding-top: 0.6rem; padding-bottom: 0.6rem; padding-left: $grid-unit-30; padding-right: $grid-unit-30; - background-color: $light-gray-200; + background-color: $gray-100; } .edit-post-manage-blocks-modal__category { @@ -63,7 +63,7 @@ .edit-post-manage-blocks-modal__category-title { position: sticky; top: 0; - padding: $panel-padding 0; + padding: $grid-unit-20 0; background-color: $white; z-index: z-index(".edit-post-manage-blocks-modal__category-title"); @@ -88,10 +88,10 @@ .edit-post-manage-blocks-modal__checklist-item { margin-bottom: 0; padding-left: $grid-unit-20; - border-top: 1px solid $light-gray-500; + border-top: 1px solid $gray-200; &:last-child { - border-bottom: 1px solid $light-gray-500; + border-bottom: 1px solid $gray-200; } .components-base-control__field { @@ -125,5 +125,5 @@ margin-right: -$grid-unit-30; padding-left: $grid-unit-30; padding-right: $grid-unit-30; - border-top: $border-width solid $light-gray-500; + border-top: $border-width solid $gray-200; } diff --git a/packages/edit-post/src/components/meta-boxes/meta-boxes-area/style.scss b/packages/edit-post/src/components/meta-boxes/meta-boxes-area/style.scss index 3f050647f9af6..9d7a5061d2599 100644 --- a/packages/edit-post/src/components/meta-boxes/meta-boxes-area/style.scss +++ b/packages/edit-post/src/components/meta-boxes/meta-boxes-area/style.scss @@ -30,7 +30,6 @@ #poststuff h3.hndle, #poststuff .stuffbox > h3, #poststuff h2.hndle { /* WordPress selectors yolo */ - border-bottom: $border-width solid $light-gray-500; box-sizing: border-box; color: inherit; font-weight: 600; @@ -47,7 +46,7 @@ } .postbox > .inside { - border-bottom: $border-width solid $light-gray-500; + border-bottom: $border-width solid $gray-200; color: inherit; padding: 0 $block-padding $block-padding; margin: 0; diff --git a/packages/edit-post/src/components/options-modal/index.js b/packages/edit-post/src/components/options-modal/index.js index a4fa06cc512fc..0a983af5709c4 100644 --- a/packages/edit-post/src/components/options-modal/index.js +++ b/packages/edit-post/src/components/options-modal/index.js @@ -26,6 +26,7 @@ import { EnablePluginDocumentSettingPanelOption, EnablePublishSidebarOption, EnablePanelOption, + EnableFeature, } from './options'; import MetaBoxesSection from './meta-boxes-section'; @@ -47,6 +48,22 @@ export function OptionsModal( { isModalActive, isViewable, closeModal } ) { + + + +
+
diff --git a/packages/edit-post/src/components/options-modal/options/enable-feature.js b/packages/edit-post/src/components/options-modal/options/enable-feature.js new file mode 100644 index 0000000000000..4868b2f09a7b7 --- /dev/null +++ b/packages/edit-post/src/components/options-modal/options/enable-feature.js @@ -0,0 +1,23 @@ +/** + * WordPress dependencies + */ +import { compose } from '@wordpress/compose'; +import { withSelect, withDispatch } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import BaseOption from './base'; + +export default compose( + withSelect( ( select, { featureName } ) => { + const { isFeatureActive } = select( 'core/edit-post' ); + return { + isChecked: isFeatureActive( featureName ), + }; + } ), + withDispatch( ( dispatch, { featureName } ) => ( { + onChange: () => + dispatch( 'core/edit-post' ).toggleFeature( featureName ), + } ) ) +)( BaseOption ); diff --git a/packages/edit-post/src/components/options-modal/options/index.js b/packages/edit-post/src/components/options-modal/options/index.js index 6ba7b4c54c7da..b5cb1c6c4fe1b 100644 --- a/packages/edit-post/src/components/options-modal/options/index.js +++ b/packages/edit-post/src/components/options-modal/options/index.js @@ -2,3 +2,4 @@ export { default as EnableCustomFieldsOption } from './enable-custom-fields'; export { default as EnablePanelOption } from './enable-panel'; export { default as EnablePluginDocumentSettingPanelOption } from './enable-plugin-document-setting-panel'; export { default as EnablePublishSidebarOption } from './enable-publish-sidebar'; +export { default as EnableFeature } from './enable-feature'; diff --git a/packages/edit-post/src/components/options-modal/options/test/__snapshots__/enable-custom-fields.js.snap b/packages/edit-post/src/components/options-modal/options/test/__snapshots__/enable-custom-fields.js.snap index eb27081e91dc8..018eb9e7c5f97 100644 --- a/packages/edit-post/src/components/options-modal/options/test/__snapshots__/enable-custom-fields.js.snap +++ b/packages/edit-post/src/components/options-modal/options/test/__snapshots__/enable-custom-fields.js.snap @@ -32,7 +32,7 @@ exports[`EnableCustomFieldsOption renders a checked checkbox and a confirmation xmlns="http://www.w3.org/2000/svg" > @@ -90,7 +90,7 @@ exports[`EnableCustomFieldsOption renders a checked checkbox when custom fields xmlns="http://www.w3.org/2000/svg" > diff --git a/packages/edit-post/src/components/options-modal/style.scss b/packages/edit-post/src/components/options-modal/style.scss index 8592234beb244..de3c1546acd75 100644 --- a/packages/edit-post/src/components/options-modal/style.scss +++ b/packages/edit-post/src/components/options-modal/style.scss @@ -9,10 +9,10 @@ } &__option { - border-top: 1px solid $light-gray-500; + border-top: 1px solid $gray-200; &:last-child { - border-bottom: 1px solid $light-gray-500; + border-bottom: 1px solid $gray-200; } .components-base-control__field { diff --git a/packages/edit-post/src/components/options-modal/test/__snapshots__/index.js.snap b/packages/edit-post/src/components/options-modal/test/__snapshots__/index.js.snap index 438c185faca3e..0bf5becdb51b3 100644 --- a/packages/edit-post/src/components/options-modal/test/__snapshots__/index.js.snap +++ b/packages/edit-post/src/components/options-modal/test/__snapshots__/index.js.snap @@ -12,6 +12,22 @@ exports[`OptionsModal should match snapshot when the modal is active 1`] = ` + + +
+
+
ESNext * ```jsx * // Using ESNext syntax - * const { registerPlugin } = wp.plugins; - * const { PluginDocumentSettingPanel } = wp.editPost; + * import { registerPlugin } from '@wordpress/plugins'; + * import { PluginDocumentSettingPanel } from '@wordpress/edit-post'; * * const MyDocumentSettingTest = () => ( * diff --git a/packages/edit-post/src/components/sidebar/plugin-post-publish-panel/index.js b/packages/edit-post/src/components/sidebar/plugin-post-publish-panel/index.js index 73fabe8a32f48..5a54525cf5ca2 100644 --- a/packages/edit-post/src/components/sidebar/plugin-post-publish-panel/index.js +++ b/packages/edit-post/src/components/sidebar/plugin-post-publish-panel/index.js @@ -59,8 +59,8 @@ const PluginPostPublishPanelFill = ( { * ESNext * ```jsx * // Using ESNext syntax - * const { __ } = wp.i18n; - * const { PluginPostPublishPanel } = wp.editPost; + * import { __ } from '@wordpress/i18n'; + * import { PluginPostPublishPanel } from '@wordpress/edit-post'; * * const MyPluginPostPublishPanel = () => ( *

My panel content
"`; +exports[`PluginPostPublishPanel renders fill properly 1`] = `"

My panel content
"`; diff --git a/packages/edit-post/src/components/sidebar/plugin-post-status-info/index.js b/packages/edit-post/src/components/sidebar/plugin-post-status-info/index.js index 00121bd0336ed..18208485ddea2 100644 --- a/packages/edit-post/src/components/sidebar/plugin-post-status-info/index.js +++ b/packages/edit-post/src/components/sidebar/plugin-post-status-info/index.js @@ -40,8 +40,8 @@ export const { Fill, Slot } = createSlotFill( 'PluginPostStatusInfo' ); * ESNext * ```jsx * // Using ESNext syntax - * const { __ } = wp.i18n; - * const { PluginPostStatusInfo } = wp.editPost; + * import { __ } from '@wordpress/i18n'; + * import { PluginPostStatusInfo } from '@wordpress/edit-post'; * * const MyPluginPostStatusInfo = () => ( * ESNext * ```jsx * // Using ESNext syntax - * const { __ } = wp.i18n; - * const { PluginPrePublishPanel } = wp.editPost; + * import { __ } from '@wordpress/i18n'; + * import { PluginPrePublishPanel } from '@wordpress/edit-post'; * * const MyPluginPrePublishPanel = () => ( *

My panel content"`; +exports[`PluginPrePublishPanel renders fill properly 1`] = `"

My panel content
"`; +q diff --git a/packages/edit-post/src/components/sidebar/plugin-sidebar/index.js b/packages/edit-post/src/components/sidebar/plugin-sidebar/index.js index 3034d5bab9165..27a1d7733f1b8 100644 --- a/packages/edit-post/src/components/sidebar/plugin-sidebar/index.js +++ b/packages/edit-post/src/components/sidebar/plugin-sidebar/index.js @@ -72,7 +72,7 @@ import { __ } from '@wordpress/i18n'; * ``` */ export default function PluginSidebarEditPost( { className, ...props } ) { - const { postTitle, shortcut } = useSelect( ( select ) => { + const { postTitle, shortcut, showIconLabels } = useSelect( ( select ) => { return { postTitle: select( 'core/editor' ).getEditedPostAttribute( 'title' @@ -80,6 +80,9 @@ export default function PluginSidebarEditPost( { className, ...props } ) { shortcut: select( 'core/keyboard-shortcuts' ).getShortcutRepresentation( 'core/edit-post/toggle-sidebar' ), + showIconLabels: select( 'core/edit-post' ).isFeatureActive( + 'showIconLabels' + ), }; } ); return ( @@ -89,6 +92,7 @@ export default function PluginSidebarEditPost( { className, ...props } ) { smallScreenTitle={ postTitle || __( '(no title)' ) } scope="core/edit-post" toggleShortcut={ shortcut } + showIconLabels={ showIconLabels } { ...props } /> ); diff --git a/packages/edit-post/src/components/sidebar/post-link/index.js b/packages/edit-post/src/components/sidebar/post-link/index.js index 5bf5b6bba6997..3a73af2e6da7d 100644 --- a/packages/edit-post/src/components/sidebar/post-link/index.js +++ b/packages/edit-post/src/components/sidebar/post-link/index.js @@ -23,26 +23,30 @@ function PostLink( { onTogglePanel, isEditable, postLink, - permalinkParts, + permalinkPrefix, + permalinkSuffix, editPermalink, forceEmptyField, setState, postSlug, postTypeLabel, } ) { - const { prefix, suffix } = permalinkParts; let prefixElement, postNameElement, suffixElement; if ( isEditable ) { - prefixElement = prefix && ( - { prefix } + prefixElement = permalinkPrefix && ( + + { permalinkPrefix } + ); postNameElement = postSlug && ( { postSlug } ); - suffixElement = suffix && ( - { suffix } + suffixElement = permalinkSuffix && ( + + { permalinkSuffix } + ); } @@ -137,21 +141,24 @@ export default compose( [ const postTypeName = getEditedPostAttribute( 'type' ); const postType = getPostType( postTypeName ); + const permalinkParts = getPermalinkParts(); return { postLink: link, isEditable: isPermalinkEditable(), isPublished: isCurrentPostPublished(), isOpened: isEditorPanelOpened( PANEL_NAME ), - permalinkParts: getPermalinkParts(), isEnabled: isEditorPanelEnabled( PANEL_NAME ), isViewable: get( postType, [ 'viewable' ], false ), postSlug: safeDecodeURIComponent( getEditedPostSlug() ), postTypeLabel: get( postType, [ 'labels', 'view_item' ] ), + hasPermalinkParts: !! permalinkParts, + permalinkPrefix: permalinkParts?.prefix, + permalinkSuffix: permalinkParts?.suffix, }; } ), - ifCondition( ( { isEnabled, postLink, isViewable, permalinkParts } ) => { - return isEnabled && postLink && isViewable && permalinkParts; + ifCondition( ( { isEnabled, postLink, isViewable, hasPermalinkParts } ) => { + return isEnabled && postLink && isViewable && hasPermalinkParts; } ), withDispatch( ( dispatch ) => { const { toggleEditorPanelOpened } = dispatch( 'core/edit-post' ); diff --git a/packages/edit-post/src/components/sidebar/post-schedule/index.js b/packages/edit-post/src/components/sidebar/post-schedule/index.js index ab5fb2ba668d0..cf644bc9a6ae1 100644 --- a/packages/edit-post/src/components/sidebar/post-schedule/index.js +++ b/packages/edit-post/src/components/sidebar/post-schedule/index.js @@ -23,7 +23,7 @@ export function PostSchedule() { className="edit-post-post-schedule__toggle" onClick={ onToggle } aria-expanded={ isOpen } - isLink + isTertiary > diff --git a/packages/edit-post/src/components/sidebar/post-schedule/style.scss b/packages/edit-post/src/components/sidebar/post-schedule/style.scss index cea429f48f22b..c19896af20ab6 100644 --- a/packages/edit-post/src/components/sidebar/post-schedule/style.scss +++ b/packages/edit-post/src/components/sidebar/post-schedule/style.scss @@ -1,6 +1,12 @@ .edit-post-post-schedule { width: 100%; position: relative; + justify-content: left; + + span { + display: block; + width: 45%; + } } .components-button.edit-post-post-schedule__toggle { diff --git a/packages/edit-post/src/components/sidebar/post-visibility/index.js b/packages/edit-post/src/components/sidebar/post-visibility/index.js index 3840c77b1c335..2eacd4d3042aa 100644 --- a/packages/edit-post/src/components/sidebar/post-visibility/index.js +++ b/packages/edit-post/src/components/sidebar/post-visibility/index.js @@ -29,7 +29,7 @@ export function PostVisibility() { aria-expanded={ isOpen } className="edit-post-post-visibility__toggle" onClick={ onToggle } - isLink + isTertiary > diff --git a/packages/edit-post/src/components/sidebar/post-visibility/style.scss b/packages/edit-post/src/components/sidebar/post-visibility/style.scss index ea1e09776901a..7b6be78514663 100644 --- a/packages/edit-post/src/components/sidebar/post-visibility/style.scss +++ b/packages/edit-post/src/components/sidebar/post-visibility/style.scss @@ -1,5 +1,11 @@ .edit-post-post-visibility { width: 100%; + justify-content: left; + + span { + display: block; + width: 45%; + } } .edit-post-post-visibility__dialog .components-popover__content { diff --git a/packages/edit-post/src/components/sidebar/settings-header/index.js b/packages/edit-post/src/components/sidebar/settings-header/index.js index b4317b9217906..6a144d4daeb2b 100644 --- a/packages/edit-post/src/components/sidebar/settings-header/index.js +++ b/packages/edit-post/src/components/sidebar/settings-header/index.js @@ -2,27 +2,39 @@ * WordPress dependencies */ import { Button } from '@wordpress/components'; -import { __ } from '@wordpress/i18n'; -import { withDispatch } from '@wordpress/data'; +import { __, sprintf } from '@wordpress/i18n'; +import { useDispatch, useSelect } from '@wordpress/data'; + +const SettingsHeader = ( { sidebarName } ) => { + const { openGeneralSidebar } = useDispatch( 'core/edit-post' ); + const openDocumentSettings = () => + openGeneralSidebar( 'edit-post/document' ); + const openBlockSettings = () => openGeneralSidebar( 'edit-post/block' ); + + const documentLabel = useSelect( ( select ) => { + const currentPostType = select( 'core/editor' ).getCurrentPostType(); + const postType = select( 'core' ).getPostType( currentPostType ); + + return ( + // Disable reason: Post type labels object is shaped like this. + // eslint-disable-next-line camelcase + postType?.labels?.singular_name ?? + // translators: Default label for the Document sidebar tab, not selected. + __( 'Document' ) + ); + } ); -const SettingsHeader = ( { - openDocumentSettings, - openBlockSettings, - sidebarName, -} ) => { - const blockLabel = __( 'Block' ); const [ documentAriaLabel, documentActiveClass ] = sidebarName === 'edit-post/document' - ? // translators: ARIA label for the Document sidebar tab, selected. - [ __( 'Document (selected)' ), 'is-active' ] - : // translators: ARIA label for the Document sidebar tab, not selected. - [ __( 'Document' ), '' ]; + ? // translators: ARIA label for the Document sidebar tab, selected. %s: Document label. + [ sprintf( __( '%s (selected)' ), documentLabel ), 'is-active' ] + : [ documentLabel, '' ]; const [ blockAriaLabel, blockActiveClass ] = sidebarName === 'edit-post/block' - ? // translators: ARIA label for the Settings Sidebar tab, selected. + ? // translators: ARIA label for the Block Settings Sidebar tab, selected. [ __( 'Block (selected)' ), 'is-active' ] - : // translators: ARIA label for the Settings Sidebar tab, not selected. + : // translators: ARIA label for the Block Settings Sidebar tab, not selected. [ __( 'Block' ), '' ]; /* Use a list so screen readers will announce how many tabs there are. */ @@ -33,9 +45,9 @@ const SettingsHeader = ( { onClick={ openDocumentSettings } className={ `edit-post-sidebar__panel-tab ${ documentActiveClass }` } aria-label={ documentAriaLabel } - data-label={ __( 'Document' ) } + data-label={ documentLabel } > - { __( 'Document' ) } + { documentLabel }
  • @@ -43,23 +55,17 @@ const SettingsHeader = ( { onClick={ openBlockSettings } className={ `edit-post-sidebar__panel-tab ${ blockActiveClass }` } aria-label={ blockAriaLabel } - data-label={ blockLabel } + // translators: Data label for the Block Settings Sidebar tab. + data-label={ __( 'Block' ) } > - { blockLabel } + { + // translators: Text label for the Block Settings Sidebar tab. + __( 'Block' ) + }
  • ); }; -export default withDispatch( ( dispatch ) => { - const { openGeneralSidebar } = dispatch( 'core/edit-post' ); - return { - openDocumentSettings() { - openGeneralSidebar( 'edit-post/document' ); - }, - openBlockSettings() { - openGeneralSidebar( 'edit-post/block' ); - }, - }; -} )( SettingsHeader ); +export default SettingsHeader; diff --git a/packages/edit-post/src/components/sidebar/settings-header/style.scss b/packages/edit-post/src/components/sidebar/settings-header/style.scss index cb23ee73d5f7d..64350f954cdc4 100644 --- a/packages/edit-post/src/components/sidebar/settings-header/style.scss +++ b/packages/edit-post/src/components/sidebar/settings-header/style.scss @@ -1,20 +1,6 @@ -.components-panel__header.edit-post-sidebar__panel-tabs { - justify-content: flex-start; - padding-left: 0; - padding-right: $grid-unit-05; - border-top: 0; - - ul { - display: flex; - } - li { - margin: 0; - } -} - .components-button.edit-post-sidebar__panel-tab { border-radius: 0; - height: 50px - $border-width; + height: $grid-unit-60; background: transparent; border: none; box-shadow: none; @@ -22,8 +8,7 @@ display: inline-block; padding: 3px 15px; // Use padding to offset the is-active border, this benefits Windows High Contrast mode margin-left: 0; - font-weight: 400; - color: $dark-gray-900; + font-weight: 500; // This pseudo-element "duplicates" the tab label and sets the text to bold. // This ensures that the tab doesn't change width when selected. @@ -41,8 +26,8 @@ &.is-active { // The transparent shadow ensures no jumpiness when focus animates on an active tab. box-shadow: inset 0 0 0 $border-width-focus transparent, inset 0 0 -$border-width-tab 0 0 var(--wp-admin-theme-color); - font-weight: 600; position: relative; + z-index: z-index(".edit-post-sidebar__panel-tab.is-active"); // This border appears in Windows High Contrast mode instead of the box-shadow. &::before { @@ -58,6 +43,8 @@ &:focus { box-shadow: inset 0 0 0 $border-width-focus var(--wp-admin-theme-color); + position: relative; + z-index: z-index(".edit-post-sidebar__panel-tab.is-active"); } &.is-active:focus { diff --git a/packages/edit-post/src/components/sidebar/settings-sidebar/index.js b/packages/edit-post/src/components/sidebar/settings-sidebar/index.js index 39a4a759662cd..c4548ba61820b 100644 --- a/packages/edit-post/src/components/sidebar/settings-sidebar/index.js +++ b/packages/edit-post/src/components/sidebar/settings-sidebar/index.js @@ -60,6 +60,7 @@ const SettingsSidebar = () => { header={ } closeLabel={ __( 'Close settings' ) } headerClassName="edit-post-sidebar__panel-tabs" + /* translators: button label text should, if possible, be under 16 characters. */ title={ __( 'Settings' ) } toggleShortcut={ keyboardShortcut } icon={ cog } diff --git a/packages/edit-post/src/components/sidebar/style.scss b/packages/edit-post/src/components/sidebar/style.scss index d3be8c5f30caa..7b10eaec0d224 100644 --- a/packages/edit-post/src/components/sidebar/style.scss +++ b/packages/edit-post/src/components/sidebar/style.scss @@ -1,13 +1,23 @@ .components-panel__header.edit-post-sidebar__panel-tabs { justify-content: flex-start; padding-left: 0; - padding-right: $grid-unit-05; + padding-right: $grid-unit-20; border-top: 0; margin-top: 0; + ul { + display: flex; + } + li { + margin: 0; + } + .components-button.has-icon { display: none; - margin-left: auto; + margin: 0 0 0 auto; + padding: 0; + min-width: $icon-size; + height: $icon-size; @include break-medium() { display: flex; diff --git a/packages/edit-post/src/components/text-editor/style.scss b/packages/edit-post/src/components/text-editor/style.scss index fdcbc6e578113..b10fd49040e62 100644 --- a/packages/edit-post/src/components/text-editor/style.scss +++ b/packages/edit-post/src/components/text-editor/style.scss @@ -18,7 +18,7 @@ // Always show outlines in code editor .editor-post-title__input { - border: $border-width solid $light-gray-secondary; + border: $border-width solid $gray-400; margin-bottom: -$border-width; // Same padding as body. @@ -28,7 +28,7 @@ } &:focus { - border: $border-width solid $dark-gray-primary; + border: $border-width solid $gray-900; } } @@ -75,7 +75,7 @@ line-height: $button-size; margin: 0 auto 0 0; font-size: $default-font-size; - color: $dark-gray-primary; + color: $gray-900; } .components-button svg { diff --git a/packages/edit-post/src/components/visual-editor/style.scss b/packages/edit-post/src/components/visual-editor/style.scss index 7c658842aecc9..a9a261a417eb8 100644 --- a/packages/edit-post/src/components/visual-editor/style.scss +++ b/packages/edit-post/src/components/visual-editor/style.scss @@ -12,7 +12,8 @@ font-size: $default-font-size; padding: 6px 12px; - &.is-tertiary { + &.is-tertiary, + &.has-icon { padding: 6px; } } @@ -45,20 +46,14 @@ height: 0; } -// Ideally this wrapper div is not needed but if we waant to match the positionning of blocks +// Ideally this wrapper div is not needed but if we want to match the positioning of blocks // .block-editor-block-list__layout and block-editor-block-list__block // We need to have two DOM elements. .edit-post-visual-editor__post-title-wrapper { - // This padding is needed to match the block root container padding - padding-left: $block-padding; - padding-right: $block-padding; - - @include break-small() { - padding-left: $block-side-ui-width; - padding-right: $block-side-ui-width; - } - .editor-post-title { + // Add some top margin. + margin-top: 2em; + // Center. margin-left: auto; margin-right: auto; diff --git a/packages/edit-post/src/editor.js b/packages/edit-post/src/editor.js index ba930a0e4b2f6..4ba0d7304b777 100644 --- a/packages/edit-post/src/editor.js +++ b/packages/edit-post/src/editor.js @@ -46,7 +46,9 @@ class Editor extends Component { blockTypes, preferredStyleVariations, __experimentalLocalAutosaveInterval, - updatePreferredStyleVariations + __experimentalSetIsInserterOpened, + updatePreferredStyleVariations, + keepCaretInsideBlock ) { settings = { ...settings, @@ -57,6 +59,10 @@ class Editor extends Component { hasFixedToolbar, focusMode, __experimentalLocalAutosaveInterval, + + // This is marked as experimental to give time for the quick inserter to mature. + __experimentalSetIsInserterOpened, + keepCaretInsideBlock, }; // Omit hidden block types if exists and non-empty. @@ -91,7 +97,9 @@ class Editor extends Component { blockTypes, preferredStyleVariations, __experimentalLocalAutosaveInterval, + setIsInserterOpened, updatePreferredStyleVariations, + keepCaretInsideBlock, ...props } = this.props; @@ -107,7 +115,9 @@ class Editor extends Component { blockTypes, preferredStyleVariations, __experimentalLocalAutosaveInterval, - updatePreferredStyleVariations + setIsInserterOpened, + updatePreferredStyleVariations, + keepCaretInsideBlock ); return ( @@ -163,12 +173,17 @@ export default compose( [ __experimentalLocalAutosaveInterval: getPreference( 'localAutosaveInterval' ), + keepCaretInsideBlock: isFeatureActive( 'keepCaretInsideBlock' ), }; } ), withDispatch( ( dispatch ) => { - const { updatePreferredStyleVariations } = dispatch( 'core/edit-post' ); + const { + updatePreferredStyleVariations, + setIsInserterOpened, + } = dispatch( 'core/edit-post' ); return { updatePreferredStyleVariations, + setIsInserterOpened, }; } ), ] )( Editor ); diff --git a/packages/edit-post/src/editor.native.js b/packages/edit-post/src/editor.native.js index 2d50cf76b9086..93b00ac529944 100644 --- a/packages/edit-post/src/editor.native.js +++ b/packages/edit-post/src/editor.native.js @@ -3,7 +3,6 @@ */ import memize from 'memize'; import { size, map, without } from 'lodash'; -import { subscribeSetFocusOnTitle } from 'react-native-gutenberg-bridge'; import { I18nManager } from 'react-native'; /** @@ -14,6 +13,7 @@ import { EditorProvider } from '@wordpress/editor'; import { parse, serialize } from '@wordpress/blocks'; import { withDispatch, withSelect } from '@wordpress/data'; import { compose } from '@wordpress/compose'; +import { subscribeSetFocusOnTitle } from '@wordpress/react-native-bridge'; import { SlotFillProvider, SiteCapabilitiesContext, @@ -112,6 +112,7 @@ class Editor extends Component { hiddenBlockTypes, blockTypes, post, + postId, postType, colors, gradients, @@ -129,9 +130,9 @@ class Editor extends Component { ); const normalizedPost = post || { - id: 1, + id: postId, title: { - raw: props.initialTitle, + raw: props.initialTitle || '', }, content: { // make sure the post content is in sync with gutenberg store diff --git a/packages/edit-post/src/index.native.js b/packages/edit-post/src/index.native.js index 13cf9ce44efe3..8aa2057b6c32e 100644 --- a/packages/edit-post/src/index.native.js +++ b/packages/edit-post/src/index.native.js @@ -3,30 +3,33 @@ */ import '@wordpress/core-data'; import '@wordpress/block-editor'; -import '@wordpress/editor'; import '@wordpress/viewport'; import '@wordpress/notices'; -import { registerCoreBlocks } from '@wordpress/block-library'; import '@wordpress/format-library'; +import { render } from '@wordpress/element'; /** * Internal dependencies */ import './store'; +import Editor from './editor'; -let blocksRegistered = false; +let editorInitialized = false; /** - * Initializes the Editor. + * Initializes the Editor and returns a componentProvider + * that can be registered with `AppRegistry.registerComponent` + * + * @param {string} id Unique identifier for editor instance. + * @param {Object} postType Post type of the post to edit. + * @param {Object} postId ID of the post to edit (unused right now) */ -export function initializeEditor() { - if ( blocksRegistered ) { +export function initializeEditor( id, postType, postId ) { + if ( editorInitialized ) { return; } - // register and setup blocks - registerCoreBlocks(); - blocksRegistered = true; -} + editorInitialized = true; -export { default as Editor } from './editor'; + render( , id ); +} diff --git a/packages/edit-post/src/store/actions.js b/packages/edit-post/src/store/actions.js index b76b017a85e12..df9123616c2cf 100644 --- a/packages/edit-post/src/store/actions.js +++ b/packages/edit-post/src/store/actions.js @@ -284,3 +284,16 @@ export function __experimentalSetPreviewDeviceType( deviceType ) { deviceType, }; } + +/** + * Returns an action object used to open/close the inserter. + * + * @param {boolean} value A boolean representing whether the inserter should be opened or closed. + * @return {Object} Action object. + */ +export function setIsInserterOpened( value ) { + return { + type: 'SET_IS_INSERTER_OPENED', + value, + }; +} diff --git a/packages/edit-post/src/store/defaults.js b/packages/edit-post/src/store/defaults.js index 64435c05ce74c..46949ec9cea19 100644 --- a/packages/edit-post/src/store/defaults.js +++ b/packages/edit-post/src/store/defaults.js @@ -9,6 +9,7 @@ export const PREFERENCES_DEFAULTS = { fixedToolbar: false, welcomeGuide: true, fullscreenMode: true, + showIconLabels: false, }, hiddenBlockTypes: [], preferredStyleVariations: {}, diff --git a/packages/edit-post/src/store/reducer.js b/packages/edit-post/src/store/reducer.js index 6f77bb46e0937..934de97aa73c0 100644 --- a/packages/edit-post/src/store/reducer.js +++ b/packages/edit-post/src/store/reducer.js @@ -238,6 +238,20 @@ export function deviceType( state = 'Desktop', action ) { return state; } +/** + * Reducer tracking whether the inserter is open. + * + * @param {boolean} state + * @param {Object} action + */ +function isInserterOpened( state = false, action ) { + switch ( action.type ) { + case 'SET_IS_INSERTER_OPENED': + return action.value; + } + return state; +} + const metaBoxes = combineReducers( { isSaving: isSavingMetaBoxes, locations: metaBoxLocations, @@ -250,4 +264,5 @@ export default combineReducers( { publishSidebarActive, removedPanels, deviceType, + isInserterOpened, } ); diff --git a/packages/edit-post/src/store/selectors.js b/packages/edit-post/src/store/selectors.js index 8b95f0a048b25..68dcc83671ed0 100644 --- a/packages/edit-post/src/store/selectors.js +++ b/packages/edit-post/src/store/selectors.js @@ -313,3 +313,14 @@ export function isSavingMetaBoxes( state ) { export function __experimentalGetPreviewDeviceType( state ) { return state.deviceType; } + +/** + * Returns true if the inserter is opened. + * + * @param {Object} state Global application state. + * + * @return {boolean} Whether the inserter is opened. + */ +export function isInserterOpened( state ) { + return state.isInserterOpened; +} diff --git a/packages/edit-post/src/style.scss b/packages/edit-post/src/style.scss index a671241c6293f..13b9ae6ae7ec7 100644 --- a/packages/edit-post/src/style.scss +++ b/packages/edit-post/src/style.scss @@ -57,7 +57,8 @@ body.block-editor-page { .edit-post-sidebar, .editor-post-publish-panel, .components-popover, -.components-modal__frame { +.components-modal__frame, +.edit-post-layout__inserter-panel { @include reset; } diff --git a/packages/edit-post/src/test/editor.native.js b/packages/edit-post/src/test/editor.native.js index 08866099cb3d5..e153cee4b6a4f 100644 --- a/packages/edit-post/src/test/editor.native.js +++ b/packages/edit-post/src/test/editor.native.js @@ -1,7 +1,6 @@ /** * External dependencies */ -import RNReactNativeGutenbergBridge from 'react-native-gutenberg-bridge'; import { mount } from 'enzyme'; import { act } from 'react-dom/test-utils'; @@ -9,6 +8,7 @@ import { act } from 'react-dom/test-utils'; * WordPress dependencies */ import { registerCoreBlocks } from '@wordpress/block-library'; +import RNReactNativeGutenbergBridge from '@wordpress/react-native-bridge'; // Force register 'core/editor' store. import { store } from '@wordpress/editor'; // eslint-disable-line no-unused-vars @@ -57,6 +57,7 @@ const renderEditorWith = ( content ) => { initialHtmlModeEnabled={ false } initialTitle={ '' } postType="post" + postId="1" /> ); }; diff --git a/packages/edit-site/package.json b/packages/edit-site/package.json index fcf3f0528fe1c..2c44199292ea8 100644 --- a/packages/edit-site/package.json +++ b/packages/edit-site/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/edit-site", - "version": "1.9.0", + "version": "1.11.3", "description": "Edit Site Page module for WordPress.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", @@ -53,7 +53,7 @@ "downloadjs": "^1.4.7", "file-saver": "^2.0.2", "jszip": "^3.2.2", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "rememo": "^3.0.0" }, "publishConfig": { diff --git a/packages/edit-site/src/components/block-editor/index.js b/packages/edit-site/src/components/block-editor/index.js index 6ca418a8067a1..0041ce021870b 100644 --- a/packages/edit-site/src/components/block-editor/index.js +++ b/packages/edit-site/src/components/block-editor/index.js @@ -12,7 +12,6 @@ import { WritingFlow, ObserveTyping, BlockList, - ButtonBlockerAppender, } from '@wordpress/block-editor'; /** @@ -21,17 +20,20 @@ import { import NavigateToLink from '../navigate-to-link'; import { SidebarInspectorFill } from '../sidebar'; -export default function BlockEditor() { - const { settings, templateType, page } = useSelect( ( select ) => { - const { getSettings, getTemplateType, getPage } = select( - 'core/edit-site' - ); - return { - settings: getSettings(), - templateType: getTemplateType(), - page: getPage(), - }; - }, [] ); +export default function BlockEditor( { setIsInserterOpen } ) { + const { settings, templateType, page } = useSelect( + ( select ) => { + const { getSettings, getTemplateType, getPage } = select( + 'core/edit-site' + ); + return { + settings: getSettings( setIsInserterOpen ), + templateType: getTemplateType(), + page: getPage(), + }; + }, + [ setIsInserterOpen ] + ); const [ blocks, onInput, onChange ] = useEntityBlockEditor( 'postType', templateType @@ -65,10 +67,7 @@ export default function BlockEditor() {
    - +
    diff --git a/packages/edit-site/src/components/block-editor/style.scss b/packages/edit-site/src/components/block-editor/style.scss index d386841765cb3..bd84864f61aa1 100644 --- a/packages/edit-site/src/components/block-editor/style.scss +++ b/packages/edit-site/src/components/block-editor/style.scss @@ -1,13 +1,13 @@ -.edit-site-block-editor__block-list { - padding-bottom: $grid-unit-30; - padding-top: $grid-unit-30 + 5; +// The button element easily inherits styles that are meant for the editor style. +// These rules enhance the specificity to reduce that inheritance. +// This is duplicated in visual-editor. +.edit-site-block-editor__editor-styles-wrapper .components-button { + font-family: $default-font; + font-size: $default-font-size; + padding: 6px 12px; - padding-left: $block-padding; - padding-right: $block-padding; - - // Full-wide. (to account for the padddings added above) - .wp-block[data-align="full"] { - margin-left: -$block-padding; - margin-right: -$block-padding; + &.is-tertiary, + &.has-icon { + padding: 6px; } } diff --git a/packages/edit-site/src/components/editor/index.js b/packages/edit-site/src/components/editor/index.js index 2dacc62375ab8..5758a7f2b8e9f 100644 --- a/packages/edit-site/src/components/editor/index.js +++ b/packages/edit-site/src/components/editor/index.js @@ -25,7 +25,7 @@ import { InterfaceSkeleton, ComplementaryArea, } from '@wordpress/interface'; -import { EntitiesSavedStates } from '@wordpress/editor'; +import { EntitiesSavedStates, UnsavedChangesWarning } from '@wordpress/editor'; import { __ } from '@wordpress/i18n'; import { PluginArea } from '@wordpress/plugins'; import { close } from '@wordpress/icons'; @@ -52,8 +52,7 @@ function Editor() { deviceType, sidebarIsOpened, settings, - templateId, - templatePartId, + entityId, templateType, page, template, @@ -71,6 +70,14 @@ function Editor() { const _templateId = getTemplateId(); const _templatePartId = getTemplatePartId(); const _templateType = getTemplateType(); + + // The currently selected entity to display. Typically template or template part. + let _entityId; + if ( _templateType ) { + _entityId = + _templateType === 'wp_template' ? _templateId : _templatePartId; + } + return { isFullscreenActive: isFeatureActive( 'fullscreenMode' ), deviceType: __experimentalGetPreviewDeviceType(), @@ -78,16 +85,17 @@ function Editor() { 'core/interface' ).getActiveComplementaryArea( 'core/edit-site' ), settings: getSettings(), - templateId: _templateId, - templatePartId: _templatePartId, templateType: _templateType, page: getPage(), - template: _select( 'core' ).getEntityRecord( - 'postType', - _templateType, - _templateType === 'wp_template' ? _templateId : _templatePartId - ), + template: _templateType + ? _select( 'core' ).getEntityRecord( + 'postType', + _templateType, + _entityId + ) + : null, select: _select, + entityId: _entityId, }; }, [] ); const { editEntityRecord } = useDispatch( 'core' ); @@ -109,10 +117,12 @@ function Editor() { const { getEditedEntityRecord } = select( 'core' ); entitiesToSave.forEach( ( { kind, name, key } ) => { const record = getEditedEntityRecord( kind, name, key ); - editEntityRecord( kind, name, key, { - status: 'publish', - title: record.slug, - } ); + + const edits = record.slug + ? { status: 'publish', title: record.slug } + : { status: 'publish' }; + + editEntityRecord( kind, name, key, edits ); } ); } setIsEntitiesSavedStatesOpen( false ); @@ -125,40 +135,38 @@ function Editor() { // and Query Pagination blocks. const blockContext = useMemo( () => ( { - ...page.context, - query: page.context.query || { categoryIds: [] }, + ...page?.context, + query: page?.context.query || { categoryIds: [] }, queryContext: [ - page.context.queryContext || { page: 1 }, + page?.context.queryContext || { page: 1 }, ( newQueryContext ) => setPage( { ...page, context: { - ...page.context, + ...page?.context, queryContext: { - ...page.context.queryContext, + ...page?.context.queryContext, ...newQueryContext, }, }, } ), ], } ), - [ page.context ] + [ page?.context ] ); + return ( <> + @@ -223,7 +231,13 @@ function Editor() { > - { template && } + { template && ( + + ) } } diff --git a/packages/edit-site/src/components/editor/style.scss b/packages/edit-site/src/components/editor/style.scss index 64d20d01606d4..1821fcb1021d2 100644 --- a/packages/edit-site/src/components/editor/style.scss +++ b/packages/edit-site/src/components/editor/style.scss @@ -7,7 +7,7 @@ right: 0; width: $sidebar-width; background-color: $white; - border: 1px dotted $light-gray-500; + border: 1px dotted $gray-200; height: auto !important; // Need to override the default sidebar positioning padding: $grid-unit-30; display: flex; diff --git a/packages/edit-site/src/components/header/fullscreen-mode-close/index.js b/packages/edit-site/src/components/header/fullscreen-mode-close/index.js index a56364ed5aa6c..83a0708958049 100644 --- a/packages/edit-site/src/components/header/fullscreen-mode-close/index.js +++ b/packages/edit-site/src/components/header/fullscreen-mode-close/index.js @@ -2,29 +2,61 @@ * WordPress dependencies */ import { useSelect } from '@wordpress/data'; -import { Button } from '@wordpress/components'; +import { Button, Icon } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; import { wordpress } from '@wordpress/icons'; function FullscreenModeClose( { icon } ) { - const isActive = useSelect( ( select ) => { - return select( 'core/edit-site' ).isFeatureActive( 'fullscreenMode' ); - }, [] ); + const { isActive, isRequestingSiteIcon, siteIconUrl } = useSelect( + ( select ) => { + const { isFeatureActive } = select( 'core/edit-site' ); + const { getEntityRecord } = select( 'core' ); + const { isResolving } = select( 'core/data' ); + const siteData = + getEntityRecord( 'root', '__unstableBase', undefined ) || {}; + + return { + isActive: isFeatureActive( 'fullscreenMode' ), + isRequestingSiteIcon: isResolving( 'core', 'getEntityRecord', [ + 'root', + '__unstableBase', + undefined, + ] ), + siteIconUrl: siteData.site_icon_url, + }; + }, + [] + ); if ( ! isActive ) { return null; } - const buttonIcon = icon || wordpress; + let buttonIcon = ; + + if ( siteIconUrl ) { + buttonIcon = ( + { + ); + } else if ( isRequestingSiteIcon ) { + buttonIcon = null; + } else if ( icon ) { + buttonIcon = ; + } return ( ); } diff --git a/packages/edit-site/src/components/header/fullscreen-mode-close/style.scss b/packages/edit-site/src/components/header/fullscreen-mode-close/style.scss index 79b42cad71545..01e648374d8ab 100644 --- a/packages/edit-site/src/components/header/fullscreen-mode-close/style.scss +++ b/packages/edit-site/src/components/header/fullscreen-mode-close/style.scss @@ -12,18 +12,22 @@ color: $white; border-radius: 0; height: $header-height; - width: $header-height; + min-width: $header-height; - &:hover { - background: #32373d; // WP-admin light-gray. - } - - &:active { - color: $white; - } - - &:focus { - box-shadow: inset 0 0 0 $border-width-focus var(--wp-admin-theme-color), inset 0 0 0 3px $white; + &.has-icon { + &:hover { + background: #32373d; // WP-admin light-gray. + } + &:active { + color: $white; + } + &:focus { + box-shadow: inset 0 0 0 $border-width-focus var(--wp-admin-theme-color), inset 0 0 0 3px $white; + } } } } + +.edit-site-fullscreen-mode-close_site-icon { + width: 36px; +} diff --git a/packages/edit-site/src/components/header/fullscreen-mode-close/test/index.js b/packages/edit-site/src/components/header/fullscreen-mode-close/test/index.js new file mode 100644 index 0000000000000..ee9eddcaf163e --- /dev/null +++ b/packages/edit-site/src/components/header/fullscreen-mode-close/test/index.js @@ -0,0 +1,66 @@ +/** + * External dependencies + */ +import { render } from '@testing-library/react'; + +/** + * WordPress dependencies + */ +import { useSelect } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import FullscreenModeClose from '../'; + +jest.mock( '@wordpress/data/src/components/use-select', () => { + // This allows us to tweak the returned value on each test + const mock = jest.fn(); + return mock; +} ); + +jest.mock( '@wordpress/core-data' ); + +describe( 'FullscreenModeClose', () => { + describe( 'when in full screen mode', () => { + it( 'should display a user uploaded site icon if it exists', () => { + useSelect.mockImplementation( ( cb ) => { + return cb( () => ( { + isResolving: () => false, + isFeatureActive: () => true, + getEntityRecord: () => ( { + site_icon_url: 'https://fakeUrl.com', + } ), + } ) ); + } ); + + const { container } = render( ); + const siteIcon = container.querySelector( + '.edit-site-fullscreen-mode-close_site-icon' + ); + + expect( siteIcon ).toBeTruthy(); + } ); + + it( 'should display a default site icon if no user uploaded site icon exists', () => { + useSelect.mockImplementation( ( cb ) => { + return cb( () => ( { + isResolving: () => false, + isFeatureActive: () => true, + getEntityRecord: () => ( { + site_icon_url: '', + } ), + } ) ); + } ); + + const { container } = render( ); + const siteIcon = container.querySelector( + '.edit-site-fullscreen-mode-close_site-icon' + ); + const defaultIcon = container.querySelector( 'svg' ); + + expect( siteIcon ).toBeFalsy(); + expect( defaultIcon ).toBeTruthy(); + } ); + } ); +} ); diff --git a/packages/edit-site/src/components/header/index.js b/packages/edit-site/src/components/header/index.js index fe9eb71ada311..1dcdb84737876 100644 --- a/packages/edit-site/src/components/header/index.js +++ b/packages/edit-site/src/components/header/index.js @@ -49,8 +49,12 @@ export default function Header( { getTemplatePartId, getTemplateType, getPage, - getShowOnFront, } = select( 'core/edit-site' ); + + const { show_on_front: _showOnFront } = select( + 'core' + ).getEditedEntityRecord( 'root', 'site' ); + return { deviceType: __experimentalGetPreviewDeviceType(), hasFixedToolbar: isFeatureActive( 'fixedToolbar' ), @@ -58,7 +62,7 @@ export default function Header( { templatePartId: getTemplatePartId(), templateType: getTemplateType(), page: getPage(), - showOnFront: getShowOnFront(), + showOnFront: _showOnFront, }; }, [] ); @@ -84,6 +88,7 @@ export default function Header( { ); } diff --git a/packages/edit-widgets/src/components/sidebar/style.scss b/packages/edit-widgets/src/components/sidebar/style.scss index 73096951ce0cb..fcf97194ce607 100644 --- a/packages/edit-widgets/src/components/sidebar/style.scss +++ b/packages/edit-widgets/src/components/sidebar/style.scss @@ -32,7 +32,7 @@ padding: 3px 15px; // Use padding to offset the is-active border, this benefits Windows High Contrast mode margin-left: 0; font-weight: 400; - color: $dark-gray-900; + color: $gray-900; // This pseudo-element "duplicates" the tab label and sets the text to bold. // This ensures that the tab doesn't change width when selected. @@ -90,9 +90,9 @@ li { margin: 0; - border-bottom: $border-width solid $light-gray-500; + border-bottom: $border-width solid $gray-200; &:first-child { - border-top: $border-width solid $light-gray-500; + border-top: $border-width solid $gray-200; } button { diff --git a/packages/edit-widgets/src/components/widget-areas-block-editor-content/index.js b/packages/edit-widgets/src/components/widget-areas-block-editor-content/index.js index 21e91953e5bf6..92f82f5b4325d 100644 --- a/packages/edit-widgets/src/components/widget-areas-block-editor-content/index.js +++ b/packages/edit-widgets/src/components/widget-areas-block-editor-content/index.js @@ -3,10 +3,10 @@ */ import { Popover } from '@wordpress/components'; import { + BlockList, BlockEditorKeyboardShortcuts, WritingFlow, ObserveTyping, - BlockList, } from '@wordpress/block-editor'; import { useDispatch } from '@wordpress/data'; @@ -18,6 +18,7 @@ import KeyboardShortcuts from '../keyboard-shortcuts'; export default function WidgetAreasBlockEditorContent() { const { clearSelectedBlock } = useDispatch( 'core/block-editor' ); + return ( <> diff --git a/packages/edit-widgets/src/components/widget-areas-block-editor-provider/index.js b/packages/edit-widgets/src/components/widget-areas-block-editor-provider/index.js index ebddb5a6e7977..6815470efe242 100644 --- a/packages/edit-widgets/src/components/widget-areas-block-editor-provider/index.js +++ b/packages/edit-widgets/src/components/widget-areas-block-editor-provider/index.js @@ -13,8 +13,7 @@ import { } from '@wordpress/components'; import { uploadMedia } from '@wordpress/media-utils'; import { useSelect } from '@wordpress/data'; -import { useEffect, useMemo, useState } from '@wordpress/element'; -import { createBlock } from '@wordpress/blocks'; +import { useMemo } from '@wordpress/element'; import { BlockEditorProvider, BlockEditorKeyboardShortcuts, @@ -24,37 +23,20 @@ import { * Internal dependencies */ import KeyboardShortcuts from '../keyboard-shortcuts'; - -const EMPTY_ARRAY = []; +import { useEntityBlockEditor } from '@wordpress/core-data'; +import { buildWidgetAreasPostId, KIND, POST_TYPE } from '../../store/utils'; export default function WidgetAreasBlockEditorProvider( { blockEditorSettings, ...props } ) { - const { areas, hasUploadPermissions } = useSelect( ( select ) => { - const { canUser, getEntityRecords } = select( 'core' ); - return { - areas: getEntityRecords( 'root', 'widgetArea' ) || EMPTY_ARRAY, - hasUploadPermissions: defaultTo( - canUser( 'create', 'media' ), - true - ), - }; - } ); - const [ blocks, setBlocks ] = useState( [] ); - useEffect( () => { - if ( ! areas || ! areas.length || blocks.length > 0 ) { - return; - } - setBlocks( - areas.map( ( { id, name } ) => { - return createBlock( 'core/widget-area', { - id, - name, - } ); - } ) - ); - }, [ areas, blocks ] ); + const { hasUploadPermissions } = useSelect( ( select ) => ( { + hasUploadPermissions: defaultTo( + select( 'core' ).canUser( 'create', 'media' ), + true + ), + widgetAreas: select( 'core/edit-widgets' ).getWidgetAreas(), + } ) ); const settings = useMemo( () => { let mediaUploadBlockEditor; @@ -74,6 +56,12 @@ export default function WidgetAreasBlockEditorProvider( { }; }, [ blockEditorSettings, hasUploadPermissions ] ); + const [ blocks, onInput, onChange ] = useEntityBlockEditor( + KIND, + POST_TYPE, + { id: buildWidgetAreasPostId() } + ); + return ( <> @@ -83,8 +71,8 @@ export default function WidgetAreasBlockEditorProvider( { setBlocks( newBlocks ) } - onChange={ ( newBlocks ) => setBlocks( newBlocks ) } + onInput={ onInput } + onChange={ onChange } settings={ settings } { ...props } /> diff --git a/packages/edit-widgets/src/index.js b/packages/edit-widgets/src/index.js index ef10dd0f50960..4e5adccb4db2a 100644 --- a/packages/edit-widgets/src/index.js +++ b/packages/edit-widgets/src/index.js @@ -11,6 +11,7 @@ import { /** * Internal dependencies */ +import './store'; import './hooks'; import EditWidgetsInitializer from './components/edit-widgets-initializer'; import CustomizerEditWidgetsInitializer from './components/customizer-edit-widgets-initializer'; diff --git a/packages/edit-widgets/src/store/actions.js b/packages/edit-widgets/src/store/actions.js new file mode 100644 index 0000000000000..5d000f5ac3f23 --- /dev/null +++ b/packages/edit-widgets/src/store/actions.js @@ -0,0 +1,126 @@ +/** + * External dependencies + */ +import { invert } from 'lodash'; + +/** + * WordPress dependencies + */ +import { __ } from '@wordpress/i18n'; + +/** + * Internal dependencies + */ +import { dispatch, select, getWidgetToClientIdMapping } from './controls'; +import { transformBlockToWidget } from './transformers'; +import { + buildWidgetAreaPostId, + buildWidgetAreasQuery, + KIND, + POST_TYPE, + WIDGET_AREA_ENTITY_TYPE, +} from './utils'; + +export function* saveEditedWidgetAreas() { + const editedWidgetAreas = yield select( + 'core/edit-widgets', + 'getEditedWidgetAreas' + ); + if ( ! editedWidgetAreas?.length ) { + return; + } + try { + yield* saveWidgetAreas( editedWidgetAreas ); + yield dispatch( + 'core/notices', + 'createSuccessNotice', + __( 'Widgets saved.' ), + { + type: 'snackbar', + } + ); + } catch ( e ) { + yield dispatch( + 'core/notices', + 'createErrorNotice', + __( 'There was an error.' ), + { + type: 'snackbar', + } + ); + } +} + +export function* saveWidgetAreas( widgetAreas ) { + const widgets = yield select( 'core/edit-widgets', 'getWidgets' ); + const widgetIdToClientId = yield getWidgetToClientIdMapping(); + const clientIdToWidgetId = invert( widgetIdToClientId ); + + // @TODO: Batch save / concurrency + for ( const widgetArea of widgetAreas ) { + const post = yield select( + 'core', + 'getEditedEntityRecord', + KIND, + POST_TYPE, + buildWidgetAreaPostId( widgetArea.id ) + ); + const widgetsBlocks = post.blocks; + const newWidgets = widgetsBlocks.map( ( block ) => { + const widgetId = clientIdToWidgetId[ block.clientId ]; + const oldWidget = widgets[ widgetId ]; + return transformBlockToWidget( block, oldWidget ); + } ); + + yield dispatch( + 'core', + 'editEntityRecord', + KIND, + WIDGET_AREA_ENTITY_TYPE, + widgetArea.id, + { widgets: newWidgets } + ); + + yield dispatch( + 'core', + 'saveEditedEntityRecord', + KIND, + WIDGET_AREA_ENTITY_TYPE, + widgetArea.id + ); + + yield dispatch( + 'core', + 'receiveEntityRecords', + KIND, + POST_TYPE, + post, + undefined + ); + } + + // saveEditedEntityRecord resets the resolution status, let's fix it manually + yield dispatch( + 'core', + 'finishResolution', + 'getEntityRecord', + KIND, + WIDGET_AREA_ENTITY_TYPE, + buildWidgetAreasQuery() + ); +} + +/** + * Sets the clientId stored for a particular widgetId. + * + * @param {number} clientId Client id. + * @param {number} widgetId Widget id. + * @return {Object} Action. + */ +export function setWidgetIdForClientId( clientId, widgetId ) { + return { + type: 'SET_WIDGET_ID_FOR_CLIENT_ID', + clientId, + widgetId, + }; +} diff --git a/packages/edit-widgets/src/store/controls.js b/packages/edit-widgets/src/store/controls.js new file mode 100644 index 0000000000000..1b836b5be1aaf --- /dev/null +++ b/packages/edit-widgets/src/store/controls.js @@ -0,0 +1,171 @@ +/** + * WordPress dependencies + */ +import { createRegistryControl } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import { buildWidgetAreasQuery, KIND, WIDGET_AREA_ENTITY_TYPE } from './utils'; + +/** + * Trigger an API Fetch request. + * + * @param {Object} request API Fetch Request Object. + * @return {Object} control descriptor. + */ +export function apiFetch( request ) { + return { + type: 'API_FETCH', + request, + }; +} + +/** + * Returns a list of pending actions for given post id. + * + * @param {number} postId Post ID. + * @return {Array} List of pending actions. + */ +export function getPendingActions( postId ) { + return { + type: 'GET_PENDING_ACTIONS', + postId, + }; +} + +/** + * Returns boolean indicating whether or not an action processing specified + * post is currently running. + * + * @param {number} postId Post ID. + * @return {Object} Action. + */ +export function isProcessingPost( postId ) { + return { + type: 'IS_PROCESSING_POST', + postId, + }; +} + +/** + * Selects widgetId -> clientId mapping (necessary for saving widgets). + * + * @return {Object} Action. + */ +export function getWidgetToClientIdMapping() { + return { + type: 'GET_WIDGET_TO_CLIENT_ID_MAPPING', + }; +} + +/** + * Resolves navigation post for given menuId. + * + * @see selectors.js + * @param {number} menuId Menu ID. + * @return {Object} Action. + */ +export function getNavigationPostForMenu( menuId ) { + return { + type: 'SELECT', + registryName: 'core/edit-navigation', + selectorName: 'getNavigationPostForMenu', + args: [ menuId ], + }; +} + +/** + * Resolves menu items for given menu id. + * + * @param {Object} query Query. + * @return {Object} Action. + */ +export function resolveWidgetAreas( query = buildWidgetAreasQuery() ) { + return { + type: 'RESOLVE_WIDGET_AREAS', + query, + }; +} + +/** + * Calls a selector using chosen registry. + * + * @param {string} registryName Registry name. + * @param {string} selectorName Selector name. + * @param {Array} args Selector arguments. + * @return {Object} control descriptor. + */ +export function select( registryName, selectorName, ...args ) { + return { + type: 'SELECT', + registryName, + selectorName, + args, + }; +} + +/** + * Dispatches an action using chosen registry. + * + * @param {string} registryName Registry name. + * @param {string} actionName Action name. + * @param {Array} args Selector arguments. + * @return {Object} control descriptor. + */ +export function dispatch( registryName, actionName, ...args ) { + return { + type: 'DISPATCH', + registryName, + actionName, + args, + }; +} + +const controls = { + SELECT: createRegistryControl( + ( registry ) => ( { registryName, selectorName, args } ) => { + return registry.select( registryName )[ selectorName ]( ...args ); + } + ), + + GET_PENDING_ACTIONS: createRegistryControl( + ( registry ) => ( { postId } ) => { + return ( + getState( registry ).processingQueue[ postId ] + ?.pendingActions || [] + ); + } + ), + + IS_PROCESSING_POST: createRegistryControl( + ( registry ) => ( { postId } ) => { + return getState( registry ).processingQueue[ postId ]?.inProgress; + } + ), + + GET_WIDGET_TO_CLIENT_ID_MAPPING: createRegistryControl( + ( registry ) => () => { + return getState( registry ).mapping || {}; + } + ), + + DISPATCH: createRegistryControl( + ( registry ) => ( { registryName, actionName, args } ) => { + return registry.dispatch( registryName )[ actionName ]( ...args ); + } + ), + + RESOLVE_WIDGET_AREAS: createRegistryControl( + ( registry ) => ( { query } ) => { + return registry + .__experimentalResolveSelect( 'core' ) + .getEntityRecords( KIND, WIDGET_AREA_ENTITY_TYPE, query ); + } + ), +}; + +const getState = ( registry ) => + registry.stores[ 'core/edit-widgets' ].store.getState(); + +export default controls; diff --git a/packages/edit-widgets/src/store/index.js b/packages/edit-widgets/src/store/index.js new file mode 100644 index 0000000000000..fdd2cdc915fb2 --- /dev/null +++ b/packages/edit-widgets/src/store/index.js @@ -0,0 +1,37 @@ +/** + * WordPress dependencies + */ +import { registerStore } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import reducer from './reducer'; +import * as resolvers from './resolvers'; +import * as selectors from './selectors'; +import * as actions from './actions'; +import controls from './controls'; + +/** + * Module Constants + */ +const MODULE_KEY = 'core/edit-widgets'; + +/** + * Block editor data store configuration. + * + * @see https://github.com/WordPress/gutenberg/blob/master/packages/data/README.md#registerStore + * + * @type {Object} + */ +export const storeConfig = { + reducer, + controls, + selectors, + resolvers, + actions, +}; + +const store = registerStore( MODULE_KEY, storeConfig ); + +export default store; diff --git a/packages/edit-widgets/src/store/reducer.js b/packages/edit-widgets/src/store/reducer.js new file mode 100644 index 0000000000000..f24805d59d41d --- /dev/null +++ b/packages/edit-widgets/src/store/reducer.js @@ -0,0 +1,33 @@ +/** + * WordPress dependencies + */ +import { combineReducers } from '@wordpress/data'; + +/** + * Internal to edit-widgets package. + * + * Stores widgetId -> clientId mapping which is necessary for saving the navigation. + * + * @param {Object} state Redux state + * @param {Object} action Redux action + * @return {Object} Updated state + */ +export function mapping( state, action ) { + const { type, ...rest } = action; + if ( type === 'SET_WIDGET_TO_CLIENT_ID_MAPPING' ) { + return rest.mapping; + } + if ( type === 'SET_WIDGET_ID_FOR_CLIENT_ID' ) { + const newMapping = { + ...state, + }; + newMapping[ action.widgetId ] = action.clientId; + return newMapping; + } + + return state || {}; +} + +export default combineReducers( { + mapping, +} ); diff --git a/packages/edit-widgets/src/store/resolvers.js b/packages/edit-widgets/src/store/resolvers.js new file mode 100644 index 0000000000000..49ab28864dd6e --- /dev/null +++ b/packages/edit-widgets/src/store/resolvers.js @@ -0,0 +1,98 @@ +/** + * WordPress dependencies + */ +import { createBlock } from '@wordpress/blocks'; + +/** + * Internal dependencies + */ +import { resolveWidgetAreas, select, dispatch } from './controls'; +import { + KIND, + POST_TYPE, + WIDGET_AREA_ENTITY_TYPE, + buildWidgetAreasQuery, + buildWidgetAreaPostId, + buildWidgetAreasPostId, +} from './utils'; +import { transformWidgetToBlock } from './transformers'; + +export function* getWidgetAreas() { + const query = buildWidgetAreasQuery(); + yield resolveWidgetAreas( query ); + const widgetAreas = yield select( + 'core', + 'getEntityRecords', + KIND, + WIDGET_AREA_ENTITY_TYPE, + query + ); + + const widgetAreaBlocks = []; + const widgetIdToClientId = {}; + const sortedWidgetAreas = widgetAreas.sort( ( a, b ) => { + if ( a.id === 'wp_inactive_widgets' ) { + return 1; + } + if ( b.id === 'wp_inactive_widgets' ) { + return -1; + } + return 0; + } ); + for ( const widgetArea of sortedWidgetAreas ) { + const widgetBlocks = []; + for ( const widget of widgetArea.widgets ) { + const block = transformWidgetToBlock( widget ); + widgetIdToClientId[ widget.id ] = block.clientId; + widgetBlocks.push( block ); + } + + // Persist the actual post containing the navigation block + yield persistStubPost( + buildWidgetAreaPostId( widgetArea.id ), + widgetBlocks + ); + + widgetAreaBlocks.push( + createBlock( 'core/widget-area', { + id: widgetArea.id, + name: widgetArea.name, + } ) + ); + } + + yield persistStubPost( buildWidgetAreasPostId(), widgetAreaBlocks ); + + yield { + type: 'SET_WIDGET_TO_CLIENT_ID_MAPPING', + mapping: widgetIdToClientId, + }; +} + +const persistStubPost = function* ( id, blocks ) { + const stubPost = createStubPost( id, blocks ); + const args = [ KIND, POST_TYPE, id ]; + yield dispatch( 'core', 'startResolution', 'getEntityRecord', args ); + yield dispatch( + 'core', + 'receiveEntityRecords', + KIND, + POST_TYPE, + stubPost, + { id: stubPost.id }, + false + ); + yield dispatch( 'core', 'finishResolution', 'getEntityRecord', args ); + return stubPost; +}; + +const createStubPost = ( id, blocks ) => ( { + id, + slug: id, + status: 'draft', + type: 'page', + blocks, + meta: { + widgetAreaId: id, + }, +} ); diff --git a/packages/edit-widgets/src/store/selectors.js b/packages/edit-widgets/src/store/selectors.js new file mode 100644 index 0000000000000..3fb8af255849c --- /dev/null +++ b/packages/edit-widgets/src/store/selectors.js @@ -0,0 +1,139 @@ +/** + * External dependencies + */ +import { invert, keyBy } from 'lodash'; + +/** + * WordPress dependencies + */ +import { createRegistrySelector } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import { + buildWidgetAreasQuery, + buildWidgetAreaPostId, + KIND, + POST_TYPE, + WIDGET_AREA_ENTITY_TYPE, +} from './utils'; + +export const getWidgets = createRegistrySelector( ( select ) => () => { + const initialWidgetAreas = select( 'core/edit-widgets' ).getWidgetAreas(); + + return keyBy( + initialWidgetAreas.flatMap( ( area ) => area.widgets ), + ( widget ) => widget.id + ); +} ); + +/** + * Returns API widget data for a particular widget ID. + * + * @param {number} id Widget ID + * @return {Object} API widget data for a particular widget ID. + */ +export const getWidget = createRegistrySelector( + ( select ) => ( state, id ) => { + const widgets = select( 'core/edit-widgets' ).getWidgets(); + return widgets[ id ]; + } +); + +export const getWidgetAreas = createRegistrySelector( ( select ) => () => { + if ( ! hasResolvedWidgetAreas( query ) ) { + return null; + } + + const query = buildWidgetAreasQuery(); + return select( 'core' ).getEntityRecords( + KIND, + WIDGET_AREA_ENTITY_TYPE, + query + ); +} ); + +export const getWidgetIdForClientId = ( state, clientId ) => { + const widgetIdToClientId = state.mapping; + const clientIdToWidgetId = invert( widgetIdToClientId ); + return clientIdToWidgetId[ clientId ]; +}; + +export const getEditedWidgetAreas = createRegistrySelector( + ( select ) => ( state, ids ) => { + let widgetAreas = select( 'core/edit-widgets' ).getWidgetAreas(); + if ( ! widgetAreas ) { + return []; + } + if ( ids ) { + widgetAreas = widgetAreas.filter( ( { id } ) => + ids.includes( id ) + ); + } + return widgetAreas + .filter( ( { id } ) => + select( 'core' ).hasEditsForEntityRecord( + KIND, + POST_TYPE, + buildWidgetAreaPostId( id ) + ) + ) + .map( ( { id } ) => + select( 'core' ).getEditedEntityRecord( + KIND, + WIDGET_AREA_ENTITY_TYPE, + id + ) + ); + } +); + +export const isSavingWidgetAreas = createRegistrySelector( + ( select ) => ( state, ids ) => { + if ( ! ids ) { + ids = select( 'core/edit-widgets' ) + .getWidgetAreas() + ?.map( ( { id } ) => id ); + } + if ( ! ids ) { + return false; + } + for ( const id of ids ) { + const isSaving = select( 'core' ).isSavingEntityRecord( + KIND, + WIDGET_AREA_ENTITY_TYPE, + id + ); + if ( isSaving ) { + return true; + } + } + return false; + } +); + +/** + * Returns true if the navigation post related to menuId was already resolved. + * + * @param {number} menuId The id of menu. + * @return {boolean} True if the navigation post related to menuId was already resolved, false otherwise. + */ +export const hasResolvedWidgetAreas = createRegistrySelector( + ( select, query = buildWidgetAreasQuery() ) => () => { + const areas = select( 'core' ).getEntityRecords( + KIND, + WIDGET_AREA_ENTITY_TYPE, + query + ); + if ( ! areas?.length ) { + return select( 'core' ).hasFinishedResolution( 'getEntityRecords', [ + KIND, + WIDGET_AREA_ENTITY_TYPE, + query, + ] ); + } + + return true; + } +); diff --git a/packages/edit-widgets/src/store/transformers.js b/packages/edit-widgets/src/store/transformers.js new file mode 100644 index 0000000000000..c11db0193186b --- /dev/null +++ b/packages/edit-widgets/src/store/transformers.js @@ -0,0 +1,50 @@ +/** + * WordPress dependencies + */ +import { createBlock, parse, serialize } from '@wordpress/blocks'; + +export function transformWidgetToBlock( widget ) { + if ( widget.widget_class === 'WP_Widget_Block' ) { + const parsedBlocks = parse( widget.settings.content ); + if ( ! parsedBlocks.length ) { + return createBlock( 'core/paragraph', {}, [] ); + } + return parsedBlocks[ 0 ]; + } + + return createBlock( + 'core/legacy-widget', + { + form: widget.form, + widgetClass: widget.widget_class, + instance: widget.settings, + idBase: widget.id_base, + number: widget.number, + }, + [] + ); +} + +export function transformBlockToWidget( block, relatedWidget = {} ) { + const { name, attributes } = block; + if ( name === 'core/legacy-widget' ) { + const widget = { + ...relatedWidget, + widget_class: attributes.widgetClass, + id_base: attributes.idBase, + settings: attributes.instance, + }; + delete widget.form; + delete widget.rendered; + return widget; + } + + return { + ...relatedWidget, + id_base: 'block', + widget_class: 'WP_Widget_Block', + settings: { + content: serialize( block ), + }, + }; +} diff --git a/packages/edit-widgets/src/store/utils.js b/packages/edit-widgets/src/store/utils.js new file mode 100644 index 0000000000000..ba47f57f8320e --- /dev/null +++ b/packages/edit-widgets/src/store/utils.js @@ -0,0 +1,45 @@ +/** + * "Kind" of the navigation post. + * + * @type {string} + */ +export const KIND = 'root'; + +/** + * "post type" of the navigation post. + * + * @type {string} + */ +export const WIDGET_AREA_ENTITY_TYPE = 'sidebar'; + +/** + * "post type" of the widget area post. + * + * @type {string} + */ +export const POST_TYPE = 'postType'; + +/** + * Builds an ID for a new widget area post. + * + * @param {number} widgetAreaId Widget area id. + * @return {string} An ID. + */ +export const buildWidgetAreaPostId = ( widgetAreaId ) => + `widget-area-${ widgetAreaId }`; + +/** + * Builds an ID for a global widget areas post. + * + * @return {string} An ID. + */ +export const buildWidgetAreasPostId = () => `widget-areas`; + +/** + * Builds a query to resolve sidebars. + * + * @return {Object} Query. + */ +export function buildWidgetAreasQuery() { + return {}; +} diff --git a/packages/edit-widgets/src/style.scss b/packages/edit-widgets/src/style.scss index 63cfa061dd70c..8f86692579900 100644 --- a/packages/edit-widgets/src/style.scss +++ b/packages/edit-widgets/src/style.scss @@ -11,7 +11,7 @@ html.wp-toolbar { background: $white; } -body.gutenberg_page_gutenberg-widgets { +body.appearance_page_gutenberg-widgets { @include wp-admin-reset( ".blocks-widgets-container" ); } diff --git a/packages/editor/CHANGELOG.md b/packages/editor/CHANGELOG.md index db88795795497..f78bdec0be8ca 100644 --- a/packages/editor/CHANGELOG.md +++ b/packages/editor/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Enhancement + +- The `UnsavedChangesWarning` component is now using `__experimentalGetDirtyEntityRecords` to determine if there were changes. + ## 9.4.0 (2019-06-12) ### Deprecations diff --git a/packages/editor/package.json b/packages/editor/package.json index d1847ff2ceea5..78e9d148afbf8 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,6 +1,6 @@ { "name": "@wordpress/editor", - "version": "9.18.0", + "version": "9.20.3", "description": "Building blocks for WordPress editors.", "author": "The WordPress Contributors", "license": "GPL-2.0-or-later", @@ -30,7 +30,6 @@ "@wordpress/api-fetch": "file:../api-fetch", "@wordpress/autop": "file:../autop", "@wordpress/blob": "file:../blob", - "@wordpress/block-directory": "file:../block-directory", "@wordpress/block-editor": "file:../block-editor", "@wordpress/blocks": "file:../blocks", "@wordpress/components": "file:../components", @@ -56,7 +55,7 @@ "@wordpress/viewport": "file:../viewport", "@wordpress/wordcount": "file:../wordcount", "classnames": "^2.2.5", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "memize": "^1.1.0", "react-autosize-textarea": "^3.0.2", "redux-optimist": "^1.0.0", diff --git a/packages/editor/src/components/autocompleters/style.scss b/packages/editor/src/components/autocompleters/style.scss index 1d20b34eeb870..75c9f00e26433 100644 --- a/packages/editor/src/components/autocompleters/style.scss +++ b/packages/editor/src/components/autocompleters/style.scss @@ -34,6 +34,6 @@ flex-shrink: 0; } &:hover .editor-autocompleters__user-slug { - color: $blue-medium-300; + color: var(--wp-admin-theme-color); } } diff --git a/packages/editor/src/components/autosave-monitor/index.js b/packages/editor/src/components/autosave-monitor/index.js index 1cc03a6e39ecb..ee7a9341ea0a2 100644 --- a/packages/editor/src/components/autosave-monitor/index.js +++ b/packages/editor/src/components/autosave-monitor/index.js @@ -6,63 +6,63 @@ import { compose } from '@wordpress/compose'; import { withSelect, withDispatch } from '@wordpress/data'; export class AutosaveMonitor extends Component { - componentDidUpdate( prevProps ) { - const { - isDirty, - editsReference, - isAutosaveable, - isAutosaving, - } = this.props; - - // The edits reference is held for comparison to avoid scheduling an - // autosave if an edit has not been made since the last autosave - // completion. This is assigned when the autosave completes, and reset - // when an edit occurs. - // - // See: https://github.com/WordPress/gutenberg/issues/12318 - - if ( editsReference !== prevProps.editsReference ) { - this.didAutosaveForEditsReference = false; - } + constructor( props ) { + super( props ); + this.needsAutosave = !! ( props.isDirty && props.isAutosaveable ); + } - if ( ! isAutosaving && prevProps.isAutosaving ) { - this.didAutosaveForEditsReference = true; + componentDidMount() { + if ( ! this.props.disableIntervalChecks ) { + this.setAutosaveTimer(); } + } + componentDidUpdate( prevProps ) { if ( - prevProps.isDirty !== isDirty || - prevProps.isAutosaveable !== isAutosaveable || - prevProps.editsReference !== editsReference + this.props.disableIntervalChecks && + this.props.editsReference !== prevProps.editsReference ) { - this.toggleTimer( - isDirty && isAutosaveable && ! this.didAutosaveForEditsReference - ); + this.props.autosave(); + return; + } + + if ( ! this.props.isDirty && prevProps.isDirty ) { + this.needsAutosave = false; + return; + } + + if ( this.props.isAutosaving && ! prevProps.isAutosaving ) { + this.needsAutosave = false; + return; + } + + if ( this.props.editsReference !== prevProps.editsReference ) { + this.needsAutosave = true; } } componentWillUnmount() { - this.toggleTimer( false ); + clearTimeout( this.timerId ); + } + + setAutosaveTimer( timeout = this.props.interval * 1000 ) { + this.timerId = setTimeout( () => { + this.autosaveTimerHandler(); + }, timeout ); } - toggleTimer( isPendingSave ) { - const { interval, shouldThrottle = false } = this.props; - - // By default, AutosaveMonitor will wait for a pause in editing before - // autosaving. In other words, its action is "debounced". - // - // The `shouldThrottle` props allows overriding this behaviour, thus - // making the autosave action "throttled". - if ( ! shouldThrottle && this.pendingSave ) { - clearTimeout( this.pendingSave ); - delete this.pendingSave; + autosaveTimerHandler() { + if ( ! this.props.isAutosaveable ) { + this.setAutosaveTimer( 1000 ); + return; } - if ( isPendingSave && ! ( shouldThrottle && this.pendingSave ) ) { - this.pendingSave = setTimeout( () => { - this.props.autosave(); - delete this.pendingSave; - }, interval * 1000 ); + if ( this.needsAutosave ) { + this.needsAutosave = false; + this.props.autosave(); } + + this.setAutosaveTimer(); } render() { @@ -84,9 +84,9 @@ export default compose( [ const { interval = getEditorSettings().autosaveInterval } = ownProps; return { + editsReference: getReferenceByDistinctEdits(), isDirty: isEditedPostDirty(), isAutosaveable: isEditedPostAutosaveable(), - editsReference: getReferenceByDistinctEdits(), isAutosaving: isAutosavingPost(), interval, }; diff --git a/packages/editor/src/components/autosave-monitor/test/index.js b/packages/editor/src/components/autosave-monitor/test/index.js index 68c177171f161..5ccf70d182dd5 100644 --- a/packages/editor/src/components/autosave-monitor/test/index.js +++ b/packages/editor/src/components/autosave-monitor/test/index.js @@ -9,122 +9,133 @@ import { shallow } from 'enzyme'; import { AutosaveMonitor } from '../'; describe( 'AutosaveMonitor', () => { - const toggleTimer = jest.fn(); let wrapper; + let setAutosaveTimerSpy; beforeEach( () => { - toggleTimer.mockClear(); + jest.useFakeTimers(); + setAutosaveTimerSpy = jest.spyOn( + AutosaveMonitor.prototype, + 'setAutosaveTimer' + ); wrapper = shallow( , { lifecycleExperimental: true, } ); + } ); - wrapper.instance().toggleTimer = toggleTimer; + afterEach( () => { + setAutosaveTimerSpy.mockClear(); } ); - describe( '#componentDidUpdate()', () => { - it( 'should start autosave timer when having become dirty and saveable', () => { - wrapper.setProps( { isDirty: true, isAutosaveable: true } ); + it( 'should start autosave timer after being mounted', () => { + expect( setAutosaveTimerSpy ).toHaveBeenCalled(); + } ); - expect( toggleTimer ).toHaveBeenCalledWith( true ); - } ); + it( 'should clear the autosave timer after being unmounted', () => { + wrapper.unmount(); + expect( clearTimeout ).toHaveBeenCalled(); + } ); - it( 'should restart autosave timer when edits reference changes', () => { - const beforeReference = []; - const afterReference = []; + describe( '#componentDidUpdate()', () => { + it( 'should set needsAutosave=true when editReference changes and other props stay the same (1)', () => { + expect( wrapper.instance().needsAutosave ).toBe( false ); wrapper.setProps( { - isDirty: true, - isAutosaveable: true, - editsReference: beforeReference, + editsReference: [], } ); - toggleTimer.mockClear(); + expect( wrapper.instance().needsAutosave ).toBe( true ); + } ); + it( 'should set needsAutosave=true when editReference changes and the post becomes dirty', () => { + expect( wrapper.instance().needsAutosave ).toBe( false ); wrapper.setProps( { isDirty: true, - isAutosaveable: true, - editsReference: beforeReference, + editsReference: [], } ); + expect( wrapper.instance().needsAutosave ).toBe( true ); + } ); - expect( toggleTimer ).not.toHaveBeenCalled(); - + it( 'should not set needsAutosave=true when editReference changes and the post is not dirty anymore', () => { + expect( wrapper.instance().needsAutosave ).toBe( false ); wrapper.setProps( { isDirty: true, - isAutosaveable: true, - editsReference: afterReference, + editsReference: [], } ); - - expect( toggleTimer ).toHaveBeenCalledWith( true ); - } ); - - it( 'should stop autosave timer when the autosave is up to date', () => { - wrapper.setProps( { isDirty: true, isAutosaveable: false } ); - - expect( toggleTimer ).toHaveBeenCalledWith( false ); - } ); - - it( 'should stop autosave timer when having become dirty but not autosaveable', () => { - wrapper.setProps( { isDirty: true, isAutosaveable: false } ); - - expect( toggleTimer ).toHaveBeenCalledWith( false ); - } ); - - it( 'should stop autosave timer when having become not dirty', () => { - wrapper.setProps( { isDirty: true } ); - toggleTimer.mockClear(); - wrapper.setProps( { isDirty: false } ); - - expect( toggleTimer ).toHaveBeenCalledWith( false ); + wrapper.setProps( { + isDirty: false, + editsReference: [], + } ); + expect( wrapper.instance().needsAutosave ).toBe( false ); } ); - it( 'should stop autosave timer when having become not autosaveable', () => { - wrapper.setProps( { isDirty: true } ); - toggleTimer.mockClear(); - wrapper.setProps( { isAutosaveable: false } ); - - expect( toggleTimer ).toHaveBeenCalledWith( false ); + it( 'should set needsAutosave=true when editReference changes and the post is not autosaving', () => { + expect( wrapper.instance().needsAutosave ).toBe( false ); + wrapper.setProps( { + isAutosaving: false, + editsReference: [], + } ); + expect( wrapper.instance().needsAutosave ).toBe( true ); } ); - it( 'should avoid scheduling autosave if still dirty but already autosaved for edits', () => { - // Explanation: When a published post is autosaved, it's still in a - // dirty state since the edits are not saved to the post until the - // user clicks "Update". To avoid recurring autosaves, ensure that - // an edit has occurred since the last autosave had completed. - - const beforeReference = []; - const afterReference = []; - - // A post is non-dirty while autosave is in-flight. + it( 'should not set needsAutosave=true when editReference changes and the post started autosaving', () => { + expect( wrapper.instance().needsAutosave ).toBe( false ); + wrapper.setProps( { + isAutosaving: false, + editsReference: [], + } ); wrapper.setProps( { - isDirty: false, isAutosaving: true, - isAutosaveable: true, - editsReference: beforeReference, + editsReference: [], } ); - toggleTimer.mockClear(); + expect( wrapper.instance().needsAutosave ).toBe( false ); + } ); + } ); + + describe( '#autosaveTimerHandler()', () => { + it( 'should schedule itself in another {interval} ms', () => { wrapper.setProps( { - isDirty: true, - isAutosaving: false, isAutosaveable: true, - editsReference: beforeReference, + interval: 5, } ); + expect( setAutosaveTimerSpy ).toHaveBeenCalledTimes( 1 ); + wrapper.instance().autosaveTimerHandler(); + expect( setAutosaveTimerSpy ).toHaveBeenCalledTimes( 2 ); + expect( setTimeout ).lastCalledWith( expect.any( Function ), 5000 ); + } ); - expect( toggleTimer ).toHaveBeenCalledWith( false ); + it( 'should schedule itself in 1000 ms if the post is not autosaveable at a time', () => { + wrapper.setProps( { + isAutosaveable: false, + interval: 5, + } ); + expect( setAutosaveTimerSpy ).toHaveBeenCalledTimes( 1 ); + wrapper.instance().autosaveTimerHandler(); + expect( setAutosaveTimerSpy ).toHaveBeenCalledTimes( 2 ); + expect( setTimeout ).lastCalledWith( expect.any( Function ), 1000 ); + } ); - // Once edit occurs after autosave, resume scheduling. + it( 'should call autosave if needsAutosave=true', () => { + const autosave = jest.fn(); wrapper.setProps( { - isDirty: true, - isAutosaving: false, isAutosaveable: true, - editsReference: afterReference, + interval: 5, + autosave, } ); - - expect( toggleTimer.mock.calls[ 1 ][ 0 ] ).toBe( true ); + wrapper.instance().needsAutosave = true; + expect( autosave ).toHaveBeenCalledTimes( 0 ); + wrapper.instance().autosaveTimerHandler(); + expect( autosave ).toHaveBeenCalledTimes( 1 ); } ); - } ); - - describe( '#componentWillUnmount()', () => { - it( 'should stop autosave timer', () => { - wrapper.unmount(); - expect( toggleTimer ).toHaveBeenCalledWith( false ); + it( 'should not call autosave if needsAutosave is not true', () => { + const autosave = jest.fn(); + wrapper.setProps( { + isAutosaveable: true, + interval: 5, + autosave, + } ); + wrapper.instance().needsAutosave = false; + expect( autosave ).toHaveBeenCalledTimes( 0 ); + wrapper.instance().autosaveTimerHandler(); + expect( autosave ).toHaveBeenCalledTimes( 0 ); } ); } ); diff --git a/packages/editor/src/components/character-count/index.js b/packages/editor/src/components/character-count/index.js new file mode 100644 index 0000000000000..c458196e87ac2 --- /dev/null +++ b/packages/editor/src/components/character-count/index.js @@ -0,0 +1,13 @@ +/** + * WordPress dependencies + */ +import { useSelect } from '@wordpress/data'; +import { count as characterCount } from '@wordpress/wordcount'; + +export default function CharacterCount() { + const content = useSelect( ( select ) => + select( 'core/editor' ).getEditedPostAttribute( 'content' ) + ); + + return characterCount( content, 'characters_including_spaces' ); +} diff --git a/packages/editor/src/components/document-outline/style.scss b/packages/editor/src/components/document-outline/style.scss index 0654f984cba3f..13146b071f676 100644 --- a/packages/editor/src/components/document-outline/style.scss +++ b/packages/editor/src/components/document-outline/style.scss @@ -16,7 +16,7 @@ } .document-outline__emdash::before { - color: $light-gray-500; + color: $gray-200; margin-right: 4px; } @@ -49,7 +49,7 @@ align-items: flex-start; margin: 0 0 0 -1px; padding: 2px 5px 2px 1px; - color: $dark-gray-800; + color: $gray-900; text-align: left; border-radius: $radius-block-ui; @@ -66,8 +66,8 @@ } .document-outline__level { - background: $light-gray-500; - color: $dark-gray-800; + background: $gray-200; + color: $gray-900; border-radius: 3px; font-size: $default-font-size; padding: 1px 6px; diff --git a/packages/editor/src/components/editor-history/redo.js b/packages/editor/src/components/editor-history/redo.js index 2e359963bd172..ae332e93b4389 100644 --- a/packages/editor/src/components/editor-history/redo.js +++ b/packages/editor/src/components/editor-history/redo.js @@ -3,18 +3,23 @@ */ import { __ } from '@wordpress/i18n'; import { Button } from '@wordpress/components'; -import { withSelect, withDispatch } from '@wordpress/data'; -import { compose } from '@wordpress/compose'; +import { useSelect, useDispatch } from '@wordpress/data'; import { displayShortcut } from '@wordpress/keycodes'; import { redo as redoIcon } from '@wordpress/icons'; import { forwardRef } from '@wordpress/element'; -function EditorHistoryRedo( { hasRedo, redo, innerRef, ...props } ) { +function EditorHistoryRedo( props, ref ) { + const hasRedo = useSelect( + ( select ) => select( 'core/editor' ).hasEditorRedo(), + [] + ); + const { redo } = useDispatch( 'core/editor' ); return ( ); } diff --git a/packages/editor/src/components/post-publish-button/label.js b/packages/editor/src/components/post-publish-button/label.js index e9edab7744640..17541053be0f7 100644 --- a/packages/editor/src/components/post-publish-button/label.js +++ b/packages/editor/src/components/post-publish-button/label.js @@ -20,10 +20,13 @@ export function PublishButtonLabel( { hasNonPostEntityChanges, } ) { if ( isPublishing ) { + /* translators: button label text should, if possible, be under 16 characters. */ return __( 'Publishing…' ); } else if ( isPublished && isSaving && ! isAutosaving ) { + /* translators: button label text should, if possible, be under 16 characters. */ return __( 'Updating…' ); } else if ( isBeingScheduled && isSaving && ! isAutosaving ) { + /* translators: button label text should, if possible, be under 16 characters. */ return __( 'Scheduling…' ); } diff --git a/packages/editor/src/components/post-publish-panel/index.js b/packages/editor/src/components/post-publish-panel/index.js index 232d23f5cc0a9..2ddf97e7e6436 100644 --- a/packages/editor/src/components/post-publish-panel/index.js +++ b/packages/editor/src/components/post-publish-panel/index.js @@ -17,7 +17,7 @@ import { } from '@wordpress/components'; import { withSelect, withDispatch } from '@wordpress/data'; import { compose } from '@wordpress/compose'; -import { close } from '@wordpress/icons'; +import { closeSmall } from '@wordpress/icons'; /** * Internal dependencies @@ -79,26 +79,32 @@ export class PostPublishPanel extends Component {
    { isPostPublish ? ( -
    - { isScheduled - ? __( 'Scheduled' ) - : __( 'Published' ) } -
    + +
    + ) } -
    { isPrePublish && ( diff --git a/packages/editor/src/components/post-publish-panel/style.scss b/packages/editor/src/components/post-publish-panel/style.scss index 93904e14fdbbc..e0800dcfff527 100644 --- a/packages/editor/src/components/post-publish-panel/style.scss +++ b/packages/editor/src/components/post-publish-panel/style.scss @@ -14,26 +14,40 @@ .editor-post-publish-panel__header { background: $white; - padding-left: $grid-unit-10; - padding-right: $grid-unit-10; + padding-left: $grid-unit-20; + padding-right: $grid-unit-20; height: $header-height + $border-width; - border-bottom: $border-width solid $light-gray-500; + border-bottom: $border-width solid $gray-200; display: flex; align-items: center; align-content: space-between; - .components-button.has-icon { - position: absolute; - right: $grid-unit-10; + .components-button { + width: 100%; + justify-content: center; + } + + .has-icon { + margin-left: auto; + width: auto; } } -.editor-post-publish-panel__header-publish-button { - display: flex; - justify-content: flex-end; +.editor-post-publish-panel__header-publish-button, +.editor-post-publish-panel__header-cancel-button { flex-grow: 1; - text-align: right; - flex-wrap: nowrap; + + @include break-mobile() { + max-width: $admin-sidebar-width; + } +} + +.editor-post-publish-panel__header-publish-button { + padding-right: $grid-unit-05; +} + +.editor-post-publish-panel__header-cancel-button { + padding-left: $grid-unit-05; } .editor-post-publish-panel__header-published { @@ -66,7 +80,7 @@ padding: 16px; strong { - color: $dark-gray-900; + color: $gray-900; } .components-panel__body { @@ -81,7 +95,7 @@ } .post-publish-panel__postpublish .components-panel__body { - border-bottom: $border-width solid $light-gray-500; + border-bottom: $border-width solid $gray-100; border-top: none; } @@ -115,7 +129,7 @@ input[readonly] { padding: 10px; - background: $light-gray-400; + background: $gray-200; overflow: hidden; text-overflow: ellipsis; } diff --git a/packages/editor/src/components/post-publish-panel/test/__snapshots__/index.js.snap b/packages/editor/src/components/post-publish-panel/test/__snapshots__/index.js.snap index e31518a8c6354..26979c69f90a0 100644 --- a/packages/editor/src/components/post-publish-panel/test/__snapshots__/index.js.snap +++ b/packages/editor/src/components/post-publish-panel/test/__snapshots__/index.js.snap @@ -7,11 +7,6 @@ exports[`PostPublishPanel should render the post-publish panel if the post is pu
    -
    - Published -
    } @@ -50,11 +45,6 @@ exports[`PostPublishPanel should render the post-publish panel if the post is sc
    -
    - Scheduled -
    } @@ -101,19 +91,16 @@ exports[`PostPublishPanel should render the pre-publish panel if post status is onSubmit={[Function]} />
    - - - - } - label="Close panel" - /> +
    + + Cancel + +
    - - - - } - label="Close panel" - /> +
    + + Cancel + +
    - - - - } - label="Close panel" - /> +
    + + Cancel + +
    { + const { + isEditedPostNew, + isCurrentPostPublished, + isCurrentPostScheduled, + isEditedPostDirty, + isSavingPost, + isEditedPostSaveable, + getCurrentPost, + isAutosavingPost, + getEditedPostAttribute, + } = select( 'core/editor' ); + + return { + isAutosaving: isAutosavingPost(), + isDirty: forceIsDirty || isEditedPostDirty(), + isNew: isEditedPostNew(), + isPending: 'pending' === getEditedPostAttribute( 'status' ), + isPublished: isCurrentPostPublished(), + isSaving: forceIsSaving || isSavingPost(), + isSaveable: isEditedPostSaveable(), + isScheduled: isCurrentPostScheduled(), + hasPublishAction: + getCurrentPost()?.[ '_links' ]?.[ 'wp:action-publish' ] ?? + false, + }; + }, + [ forceIsDirty, forceIsSaving ] + ); + + const { savePost } = useDispatch( 'core/editor' ); - componentDidUpdate( prevProps ) { - if ( prevProps.isSaving && ! this.props.isSaving ) { - this.setState( { forceSavedMessage: true } ); - this.props.setTimeout( () => { - this.setState( { forceSavedMessage: false } ); + const wasSaving = usePrevious( isSaving ); + + useEffect( () => { + let timeoutId; + + if ( wasSaving && ! isSaving ) { + setForceSavedMessage( true ); + timeoutId = setTimeout( () => { + setForceSavedMessage( false ); }, 1000 ); } - } - render() { - const { - post, - isNew, - isScheduled, - isPublished, - isDirty, - isSaving, - isSaveable, - onSave, - isAutosaving, - isPending, - isLargeViewport, - } = this.props; - const { forceSavedMessage } = this.state; - if ( isSaving ) { - // TODO: Classes generation should be common across all return - // paths of this function, including proper naming convention for - // the "Save Draft" button. - const classes = classnames( - 'editor-post-saved-state', - 'is-saving', - { - 'is-autosaving': isAutosaving, - } - ); - - return ( - - { ( { className: animateClassName } ) => ( - - - { isAutosaving - ? __( 'Autosaving' ) - : __( 'Saving' ) } - - ) } - - ); - } + return () => clearTimeout( timeoutId ); + }, [ isSaving ] ); - if ( isPublished || isScheduled ) { - return ; - } + if ( isSaving ) { + // TODO: Classes generation should be common across all return + // paths of this function, including proper naming convention for + // the "Save Draft" button. + const classes = classnames( 'editor-post-saved-state', 'is-saving', { + 'is-autosaving': isAutosaving, + } ); - if ( ! isSaveable ) { - return null; - } + return ( + + { ( { className: animateClassName } ) => ( + + + { isAutosaving ? __( 'Autosaving' ) : __( 'Saving' ) } + + ) } + + ); + } - if ( forceSavedMessage || ( ! isNew && ! isDirty ) ) { - return ( - - - { __( 'Saved' ) } - - ); - } + if ( isPublished || isScheduled ) { + return ; + } + + if ( ! isSaveable ) { + return null; + } - // Once the post has been submitted for review this button - // is not needed for the contributor role. - const hasPublishAction = get( - post, - [ '_links', 'wp:action-publish' ], - false + if ( forceSavedMessage || ( ! isNew && ! isDirty ) ) { + return ( + + + { __( 'Saved' ) } + ); - if ( ! hasPublishAction && isPending ) { - return null; - } + } - const label = isPending ? __( 'Save as Pending' ) : __( 'Save Draft' ); - if ( ! isLargeViewport ) { - return ( - ); } -} -export default compose( [ - withSelect( ( select, { forceIsDirty, forceIsSaving } ) => { - const { - isEditedPostNew, - isCurrentPostPublished, - isCurrentPostScheduled, - isEditedPostDirty, - isSavingPost, - isEditedPostSaveable, - getCurrentPost, - isAutosavingPost, - getEditedPostAttribute, - } = select( 'core/editor' ); - return { - post: getCurrentPost(), - isNew: isEditedPostNew(), - isPublished: isCurrentPostPublished(), - isScheduled: isCurrentPostScheduled(), - isDirty: forceIsDirty || isEditedPostDirty(), - isSaving: forceIsSaving || isSavingPost(), - isSaveable: isEditedPostSaveable(), - isAutosaving: isAutosavingPost(), - isPending: 'pending' === getEditedPostAttribute( 'status' ), - }; - } ), - withDispatch( ( dispatch ) => ( { - onSave: dispatch( 'core/editor' ).savePost, - } ) ), - withSafeTimeout, - withViewportMatch( { isLargeViewport: 'small' } ), -] )( PostSavedState ); + return ( + + ); +} diff --git a/packages/editor/src/components/post-saved-state/style.scss b/packages/editor/src/components/post-saved-state/style.scss index 9b6b8055cf9e3..71bace378fcbf 100644 --- a/packages/editor/src/components/post-saved-state/style.scss +++ b/packages/editor/src/components/post-saved-state/style.scss @@ -3,7 +3,7 @@ align-items: center; width: $button-size - $grid-unit-10; padding: #{ $grid-unit-05 * 3 } $grid-unit-05; - color: $medium-gray-text; + color: $gray-700; overflow: hidden; white-space: nowrap; diff --git a/packages/editor/src/components/post-saved-state/test/__snapshots__/index.js.snap b/packages/editor/src/components/post-saved-state/test/__snapshots__/index.js.snap index c51298cfe756a..7bdbf164f7481 100644 --- a/packages/editor/src/components/post-saved-state/test/__snapshots__/index.js.snap +++ b/packages/editor/src/components/post-saved-state/test/__snapshots__/index.js.snap @@ -9,6 +9,6 @@ exports[`PostSavedState should return Save button if edits to be saved 1`] = ` onClick={[Function]} shortcut="Ctrl+S" > - Save Draft + Save draft `; diff --git a/packages/editor/src/components/post-saved-state/test/index.js b/packages/editor/src/components/post-saved-state/test/index.js index 79636fdf0267b..7c883e5e2f972 100644 --- a/packages/editor/src/components/post-saved-state/test/index.js +++ b/packages/editor/src/components/post-saved-state/test/index.js @@ -3,75 +3,105 @@ */ import { mount, shallow } from 'enzyme'; +/** + * WordPress dependencies + */ +import { useViewportMatch } from '@wordpress/compose'; +import { useSelect } from '@wordpress/data'; + /** * Internal dependencies */ -import { PostSavedState } from '../'; +import PostSavedState from '../'; + +const mockSavePost = jest.fn(); + +jest.mock( '@wordpress/data/src/components/use-dispatch', () => { + return { + useDispatch: () => ( { savePost: mockSavePost } ), + }; +} ); + +jest.mock( '@wordpress/data/src/components/use-select', () => { + // This allows us to tweak the returned value on each test + const mock = jest.fn(); + return mock; +} ); + +jest.mock( '@wordpress/compose/src/hooks/use-viewport-match', () => { + // This allows us to tweak the returned value on each test + const mock = jest.fn(); + return mock; +} ); describe( 'PostSavedState', () => { it( 'should display saving while save in progress, even if not saveable', () => { - const wrapper = mount( - - ); + useSelect.mockImplementation( () => ( { + isDirty: false, + isNew: true, + isSaveable: false, + isSaving: true, + } ) ); + + const wrapper = mount( ); expect( wrapper.text() ).toContain( 'Saving' ); } ); it( 'returns null if the post is not saveable', () => { - const wrapper = shallow( - - ); + useSelect.mockImplementation( () => ( { + isDirty: false, + isNew: true, + isSaveable: false, + isSaving: false, + } ) ); + + const wrapper = shallow( ); expect( wrapper.type() ).toBeNull(); } ); it( 'returns a switch to draft link if the post is published', () => { - const wrapper = shallow( ); + useSelect.mockImplementation( () => ( { + isPublished: true, + } ) ); + + const wrapper = shallow( ); expect( wrapper ).toMatchSnapshot(); } ); it( 'should return Saved text if not new and not dirty', () => { - const wrapper = shallow( - - ); + useSelect.mockImplementation( () => ( { + isDirty: false, + isNew: false, + isSaveable: true, + isSaving: false, + } ) ); + + const wrapper = shallow( ); expect( wrapper.childAt( 0 ).name() ).toBe( 'Icon' ); expect( wrapper.childAt( 1 ).text() ).toBe( 'Saved' ); } ); it( 'should return Save button if edits to be saved', () => { - const saveSpy = jest.fn(); - const wrapper = shallow( - - ); + useSelect.mockImplementation( () => ( { + isDirty: true, + isNew: false, + isSaveable: true, + isSaving: false, + } ) ); + + // Simulate the viewport being considered large. + useViewportMatch.mockImplementation( () => true ); + + const wrapper = shallow( ); expect( wrapper ).toMatchSnapshot(); wrapper.simulate( 'click', {} ); - expect( saveSpy ).toHaveBeenCalled(); + expect( mockSavePost ).toHaveBeenCalled(); // Regression: Verify the event object is not passed to prop callback. - expect( saveSpy.mock.calls[ 0 ] ).toEqual( [] ); + expect( mockSavePost.mock.calls[ 0 ] ).toEqual( [] ); } ); } ); diff --git a/packages/editor/src/components/post-taxonomies/flat-term-selector.js b/packages/editor/src/components/post-taxonomies/flat-term-selector.js index c6dd5af6db853..decc8953ec9c5 100644 --- a/packages/editor/src/components/post-taxonomies/flat-term-selector.js +++ b/packages/editor/src/components/post-taxonomies/flat-term-selector.js @@ -9,7 +9,7 @@ import { isEmpty, map, throttle, - unescape as unescapeString, + unescape as lodashUnescapeString, uniqBy, } from 'lodash'; @@ -27,15 +27,21 @@ import { addQueryArgs } from '@wordpress/url'; /** * Module constants */ +const MAX_TERMS_SUGGESTIONS = 20; const DEFAULT_QUERY = { - per_page: -1, + per_page: MAX_TERMS_SUGGESTIONS, orderby: 'count', order: 'desc', _fields: 'id,name', }; -const MAX_TERMS_SUGGESTIONS = 20; + +// Lodash unescape function handles ' but not ' which may be return in some API requests. +const unescapeString = ( arg ) => { + return lodashUnescapeString( arg.replace( ''', "'" ) ); +}; const isSameTermName = ( termA, termB ) => - termA.toLowerCase() === termB.toLowerCase(); + unescapeString( termA ).toLowerCase() === + unescapeString( termB ).toLowerCase(); /** * Returns a term object with name unescaped. @@ -222,7 +228,9 @@ class FlatTermSelector extends Component { searchTerms( search = '' ) { invoke( this.searchRequest, [ 'abort' ] ); - this.searchRequest = this.fetchTerms( { search } ); + if ( search.length >= 3 ) { + this.searchRequest = this.fetchTerms( { search } ); + } } render() { diff --git a/packages/editor/src/components/post-taxonomies/style.scss b/packages/editor/src/components/post-taxonomies/style.scss index 5d9887cb742e1..232ac77059769 100644 --- a/packages/editor/src/components/post-taxonomies/style.scss +++ b/packages/editor/src/components/post-taxonomies/style.scss @@ -3,7 +3,10 @@ overflow: auto; // Extra left padding prevents checkbox focus borders from being cut off. - padding-left: 2px; + margin-left: -$border-width * 4 - $border-width-focus; + padding-left: $border-width * 4 + $border-width-focus; + margin-top: -$border-width * 4 - $border-width-focus; + padding-top: $border-width * 4 + $border-width-focus; } .editor-post-taxonomies__hierarchical-terms-choice { @@ -12,7 +15,7 @@ .editor-post-taxonomies__hierarchical-terms-subchoices { margin-top: 8px; - margin-left: $panel-padding; + margin-left: $grid-unit-20; } .components-button.editor-post-taxonomies__hierarchical-terms-submit, diff --git a/packages/editor/src/components/post-text-editor/index.js b/packages/editor/src/components/post-text-editor/index.js index d0e0626a75f16..eb8488332ee81 100644 --- a/packages/editor/src/components/post-text-editor/index.js +++ b/packages/editor/src/components/post-text-editor/index.js @@ -7,31 +7,26 @@ import Textarea from 'react-autosize-textarea'; * WordPress dependencies */ import { __ } from '@wordpress/i18n'; -import { Component } from '@wordpress/element'; +import { useState } from '@wordpress/element'; import { parse } from '@wordpress/blocks'; -import { withSelect, withDispatch } from '@wordpress/data'; -import { withInstanceId, compose } from '@wordpress/compose'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { useInstanceId } from '@wordpress/compose'; import { VisuallyHidden } from '@wordpress/components'; -export class PostTextEditor extends Component { - constructor() { - super( ...arguments ); +export default function PostTextEditor() { + const postContent = useSelect( + ( select ) => select( 'core/editor' ).getEditedPostContent(), + [] + ); - this.edit = this.edit.bind( this ); - this.stopEditing = this.stopEditing.bind( this ); + const { editPost, resetEditorBlocks } = useDispatch( 'core/editor' ); - this.state = {}; - } - - static getDerivedStateFromProps( props, state ) { - if ( state.isDirty ) { - return null; - } + const [ value, setValue ] = useState( postContent ); + const [ isDirty, setIsDirty ] = useState( false ); + const instanceId = useInstanceId( PostTextEditor ); - return { - value: props.value, - isDirty: false, - }; + if ( ! isDirty && value !== postContent ) { + setValue( postContent ); } /** @@ -45,68 +40,47 @@ export class PostTextEditor extends Component { * * @param {Event} event Change event. */ - edit( event ) { - const value = event.target.value; - this.props.onChange( value ); - this.setState( { value, isDirty: true } ); - } + const onChange = ( event ) => { + const newValue = event.target.value; + + editPost( { content: newValue } ); + + setValue( newValue ); + setIsDirty( true ); + }; /** * Function called when the user has completed their edits, responsible for * ensuring that changes, if made, are surfaced to the onPersist prop * callback and resetting dirty state. */ - stopEditing() { - if ( this.state.isDirty ) { - this.props.onPersist( this.state.value ); - this.setState( { isDirty: false } ); + const stopEditing = () => { + if ( isDirty ) { + const blocks = parse( value ); + resetEditorBlocks( blocks ); + + setIsDirty( false ); } - } + }; - render() { - const { value } = this.state; - const { instanceId } = this.props; - return ( - <> - - { __( 'Type text or HTML' ) } - - ' . "\n" . + ' ' . "\n" . + ' ', + ), + ), + ), + ), + $data + ); + } + + /** + * + */ + public function test_get_item() { + $this->setup_sidebar( + 'sidebar-1', + array( + 'name' => 'Test sidebar', + ) + ); + + $request = new WP_REST_Request( 'GET', '/__experimental/sidebars/sidebar-1' ); + $response = rest_get_server()->dispatch( $request ); + $data = $response->get_data(); + $this->assertEquals( + array( + 'id' => 'sidebar-1', + 'name' => 'Test sidebar', + 'description' => '', + 'status' => 'active', + 'widgets' => array(), + ), + $data + ); + } + + /** + * + */ + public function test_get_item_no_permission() { + wp_set_current_user( 0 ); + $this->setup_sidebar( + 'sidebar-1', + array( + 'name' => 'Test sidebar', + ) + ); + + $request = new WP_REST_Request( 'GET', '/__experimental/sidebars/sidebar-1' ); + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( 'widgets_cannot_access', $response, 401 ); + } + + /** + * + */ + public function test_get_item_wrong_permission_author() { + wp_set_current_user( self::$author_id ); + $this->setup_sidebar( + 'sidebar-1', + array( + 'name' => 'Test sidebar', + ) + ); + + $request = new WP_REST_Request( 'GET', '/__experimental/sidebars/sidebar-1' ); + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( 'widgets_cannot_access', $response, 403 ); + } + + /** + * + */ + public function test_get_item_wrong_permission_subscriber() { + wp_set_current_user( self::$subscriber_id ); + $this->setup_sidebar( + 'sidebar-1', + array( + 'name' => 'Test sidebar', + ) + ); + + $request = new WP_REST_Request( 'GET', '/__experimental/sidebars/sidebar-1' ); + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( 'widgets_cannot_access', $response, 403 ); + } + + /** + * The test_update_item() method does not exist for sidebar. + */ + public function test_create_item() { + } + + /** + * + */ + public function test_update_item() { + $this->setup_widget( + 'widget_rss', + 1, + array( + 'title' => 'RSS test', + ) + ); + $this->setup_widget( + 'widget_text', + 1, + array( + 'text' => 'Custom text test', + ) + ); + $this->setup_sidebar( + 'sidebar-1', + array( + 'name' => 'Test sidebar', + ), + array( 'text-1', 'rss-1' ) + ); + + $request = new WP_REST_Request( 'POST', '/__experimental/sidebars/sidebar-1' ); + $request->set_body_params( + array( + 'widgets' => array( + array( + 'id' => 'text-1', + 'settings' => array( + 'text' => 'Updated text test', + ), + 'id_base' => 'text', + 'widget_class' => 'WP_Widget_Text', + 'name' => 'Text', + 'description' => 'Arbitrary text.', + 'number' => 1, + ), + array( + 'id' => 'text-2', + 'settings' => array( + 'text' => 'Another text widget', + ), + 'id_base' => 'text', + 'widget_class' => 'WP_Widget_Text', + 'name' => 'Text', + 'description' => 'Arbitrary text.', + 'number' => 2, + ), + ), + ) + ); + $response = rest_get_server()->dispatch( $request ); + $data = $response->get_data(); + $this->assertEquals( + array( + 'id' => 'sidebar-1', + 'name' => 'Test sidebar', + 'description' => '', + 'status' => 'active', + 'widgets' => array( + array( + 'id' => 'text-1', + 'settings' => array( + 'text' => 'Updated text test', + 'title' => '', + 'filter' => false, + ), + 'id_base' => 'text', + 'widget_class' => 'WP_Widget_Text', + 'name' => 'Text', + 'description' => 'Arbitrary text.', + 'number' => 1, + 'rendered' => '
    Updated text test
    ', + ), + array( + 'id' => 'text-2', + 'settings' => array( + 'text' => 'Another text widget', + 'title' => '', + 'filter' => false, + ), + 'id_base' => 'text', + 'widget_class' => 'WP_Widget_Text', + 'name' => 'Text', + 'description' => 'Arbitrary text.', + 'number' => 2, + 'rendered' => '
    Another text widget
    ', + ), + ), + ), + $data + ); + } + + /** + * + */ + public function test_update_item_legacy_widget_1() { + $this->do_test_update_item_legacy_widget( 'testwidget-1' ); + } + + /** + * + */ + public function test_update_item_legacy_widget_2() { + $this->do_test_update_item_legacy_widget( 'testwidget' ); + } + + /** + * + */ + public function do_test_update_item_legacy_widget( $widget_id ) { + // @TODO: Use @dataProvider instead (it doesn't work with custom constructors like the one we have in this class) + wp_register_widget_control( + $widget_id, + 'WP test widget', + function() { + $settings = get_option( 'widget_testwidget' ); + + // check if anything's been sent. + if ( isset( $_POST['update_testwidget'] ) ) { + $settings['id'] = $_POST['test_id']; + $settings['title'] = $_POST['test_title']; + + update_option( 'widget_testwidget', $settings ); + } + }, + 100, + 200 + ); + wp_register_sidebar_widget( + $widget_id, + 'WP test widget', + function() { + $settings = get_option( 'widget_testwidget' ) ? get_option( 'widget_testwidget' ) : array( + 'id' => '', + 'title' => '', + ); + echo '

    ' . $settings['id'] . '

    ' . $settings['title'] . ''; + } + ); + $this->setup_sidebar( + 'sidebar-1', + array( + 'name' => 'Test sidebar', + ), + array( $widget_id ) + ); + + $request = new WP_REST_Request( 'POST', '/__experimental/sidebars/sidebar-1' ); + $request->set_body_params( + array( + 'widgets' => array( + array( + 'id' => $widget_id, + 'name' => 'WP test widget', + 'settings' => array( + 'test_id' => 'My test id', + 'test_title' => 'My test title', + 'update_testwidget' => true, + ), + ), + ), + ) + ); + $response = rest_get_server()->dispatch( $request ); + $data = $response->get_data(); + $this->assertEquals( + array( + 'id' => 'sidebar-1', + 'name' => 'Test sidebar', + 'description' => '', + 'status' => 'active', + 'widgets' => array( + array( + 'id' => $widget_id, + 'settings' => array(), + 'rendered' => '

    My test id

    My test title', + 'name' => 'WP test widget', + ), + ), + ), + $data + ); + } + + /** + * + */ + public function test_get_items_inactive_widgets() { + $this->setup_widget( + 'widget_rss', + 1, + array( + 'title' => 'RSS test', + ) + ); + $this->setup_widget( + 'widget_text', + 1, + array( + 'text' => 'Custom text test', + ) + ); + $this->setup_sidebar( + 'sidebar-1', + array( + 'name' => 'Test sidebar', + ), + array( 'text-1' ) + ); + update_option( + 'sidebars_widgets', + array_merge( + get_option( 'sidebars_widgets' ), + array( + 'wp_inactive_widgets' => array( 'rss-1', 'rss' ), + ) + ) + ); + + $request = new WP_REST_Request( 'GET', '/__experimental/sidebars' ); + $request->set_param( 'context', 'view' ); + $response = rest_get_server()->dispatch( $request ); + $data = $response->get_data(); + $this->assertEquals( + array( + array( + 'id' => 'sidebar-1', + 'name' => 'Test sidebar', + 'description' => '', + 'status' => 'active', + 'widgets' => array( + array( + 'id' => 'text-1', + 'settings' => array( + 'text' => 'Custom text test', + ), + 'id_base' => 'text', + 'widget_class' => 'WP_Widget_Text', + 'name' => 'Text', + 'description' => 'Arbitrary text.', + 'number' => 1, + 'rendered' => '
    Custom text test
    ', + ), + ), + ), + array( + 'id' => 'wp_inactive_widgets', + 'name' => 'Inactive widgets', + 'description' => '', + 'status' => 'inactive', + 'widgets' => array( + array( + 'id' => 'rss-1', + 'settings' => array( + 'title' => 'RSS test', + ), + 'id_base' => 'rss', + 'widget_class' => 'WP_Widget_RSS', + 'name' => 'RSS', + 'description' => 'Entries from any RSS or Atom feed.', + 'number' => 1, + 'rendered' => '', + ), + ), + ), + ), + $data + ); + } + + /** + * + */ + public function test_update_item_no_permission() { + wp_set_current_user( 0 ); + + $request = new WP_REST_Request( 'POST', '/__experimental/sidebars/sidebar-1' ); + $request->set_body_params( + array( + 'widgets' => array(), + ) + ); + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( 'widgets_cannot_access', $response, 401 ); + } + + /** + * + */ + public function test_update_item_wrong_permission_author() { + wp_set_current_user( self::$author_id ); + + $request = new WP_REST_Request( 'POST', '/__experimental/sidebars/sidebar-1' ); + $request->set_body_params( + array( + 'widgets' => array(), + ) + ); + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( 'widgets_cannot_access', $response, 403 ); + } + + /** + * + */ + public function test_update_item_wrong_permission_subscriber() { + wp_set_current_user( self::$subscriber_id ); + + $request = new WP_REST_Request( 'POST', '/__experimental/sidebars/sidebar-1' ); + $request->set_body_params( + array( + 'widgets' => array(), + ) + ); + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( 'widgets_cannot_access', $response, 403 ); + } + + /** + * Tests if the endpoint correctly handles "slashable" characters such as " or '. + */ + public function test_update_item_slashing() { + $this->setup_widget( 'widget_text', 1, array( 'text' => 'Custom text test' ) ); + $this->setup_sidebar( 'sidebar-1', array( 'name' => 'Test sidebar' ), array( 'text-1', 'rss-1' ) ); + + $request = new WP_REST_Request( 'POST', '/__experimental/sidebars/sidebar-1' ); + $request->set_body_params( + array( + 'widgets' => array( + array( + 'id' => 'text-1', + 'settings' => array( + 'text' => 'Updated \\" \\\' text test', + ), + 'id_base' => 'text', + 'widget_class' => 'WP_Widget_Text', + 'name' => 'Text', + 'description' => 'Arbitrary text.', + 'number' => 1, + ), + ), + ) + ); + $response = rest_get_server()->dispatch( $request ); + $data = $response->get_data(); + $this->assertEquals( + array( + 'id' => 'sidebar-1', + 'name' => 'Test sidebar', + 'description' => '', + 'status' => 'active', + 'widgets' => array( + array( + 'id' => 'text-1', + 'settings' => array( + 'text' => 'Updated \\" \\\' text test', + 'title' => '', + 'filter' => false, + ), + 'id_base' => 'text', + 'widget_class' => 'WP_Widget_Text', + 'name' => 'Text', + 'description' => 'Arbitrary text.', + 'number' => 1, + 'rendered' => '
    Updated \\" \\\' text test
    ', + ), + ), + ), + $data + ); + } + + /** + * The test_delete_item() method does not exist for sidebar. + */ + public function test_delete_item() { + } + + /** + * The test_prepare_item() method does not exist for sidebar. + */ + public function test_prepare_item() { + } + + /** + * + */ + public function test_get_item_schema() { + wp_set_current_user( self::$admin_id ); + $request = new WP_REST_Request( 'OPTIONS', '/__experimental/sidebars' ); + $response = rest_get_server()->dispatch( $request ); + $data = $response->get_data(); + $properties = $data['schema']['properties']; + + $this->assertEquals( 5, count( $properties ) ); + $this->assertArrayHasKey( 'id', $properties ); + $this->assertArrayHasKey( 'name', $properties ); + $this->assertArrayHasKey( 'description', $properties ); + $this->assertArrayHasKey( 'status', $properties ); + $this->assertArrayHasKey( 'widgets', $properties ); + } +} diff --git a/phpunit/class-vendor-script-filename-test.php b/phpunit/class-vendor-script-filename-test.php index b472377ec2fbf..df18863ce9e67 100644 --- a/phpunit/class-vendor-script-filename-test.php +++ b/phpunit/class-vendor-script-filename-test.php @@ -11,23 +11,23 @@ function vendor_script_filename_cases() { // Development mode scripts. array( 'react-handle', - 'https://unpkg.com/react@16.9.0/umd/react.development.js', + 'https://unpkg.com/react@16.13.1/umd/react.development.js', 'react-handle.HASH.js', ), array( 'react-dom-handle', - 'https://unpkg.com/react-dom@16.9.0/umd/react-dom.development.js', + 'https://unpkg.com/react-dom@16.13.1/umd/react-dom.development.js', 'react-dom-handle.HASH.js', ), // Production mode scripts. array( 'react-handle', - 'https://unpkg.com/react@16.9.0/umd/react.production.min.js', + 'https://unpkg.com/react@16.13.1/umd/react.production.min.js', 'react-handle.min.HASH.js', ), array( 'react-dom-handle', - 'https://unpkg.com/react-dom@16.9.0/umd/react-dom.production.min.js', + 'https://unpkg.com/react-dom@16.13.1/umd/react-dom.production.min.js', 'react-dom-handle.min.HASH.js', ), // Other cases. diff --git a/phpunit/class-wp-block-list-test.php b/phpunit/class-wp-block-list-test.php index ed6565f7a9f94..5f0d98d5b1afe 100644 --- a/phpunit/class-wp-block-list-test.php +++ b/phpunit/class-wp-block-list-test.php @@ -5,6 +5,12 @@ * @package Gutenberg */ +/** + * This test file can be removed when plugin support requires WordPress 5.5.0+. + * + * @see https://core.trac.wordpress.org/ticket/49926 + * @see https://core.trac.wordpress.org/changeset/48159 + */ class WP_Block_List_Test extends WP_UnitTestCase { /** diff --git a/phpunit/class-wp-block-test.php b/phpunit/class-wp-block-test.php index 236ed46c0cb0e..3c7752118d09a 100644 --- a/phpunit/class-wp-block-test.php +++ b/phpunit/class-wp-block-test.php @@ -5,6 +5,12 @@ * @package Gutenberg */ +/** + * This test file can be removed when plugin support requires WordPress 5.5.0+. + * + * @see https://core.trac.wordpress.org/ticket/49926 + * @see https://core.trac.wordpress.org/changeset/48159 + */ class WP_Block_Test extends WP_UnitTestCase { /** @@ -133,7 +139,7 @@ function test_constructor_assigns_context_from_block_type() { $this->registry->register( 'core/example', array( - 'context' => array( 'requested' ), + 'uses_context' => array( 'requested' ), ) ); @@ -164,12 +170,12 @@ function test_constructor_prepares_context_for_inner_blocks() { $this->registry->register( 'core/outer', array( - 'attributes' => array( + 'attributes' => array( 'recordId' => array( 'type' => 'number', ), ), - 'providesContext' => array( + 'provides_context' => array( 'core/recordId' => 'recordId', ), ) @@ -177,7 +183,7 @@ function test_constructor_prepares_context_for_inner_blocks() { $this->registry->register( 'core/inner', array( - 'context' => array( 'core/recordId' ), + 'uses_context' => array( 'core/recordId' ), ) ); @@ -197,15 +203,15 @@ function test_constructor_assigns_merged_context() { $this->registry->register( 'core/example', array( - 'attributes' => array( + 'attributes' => array( 'value' => array( 'type' => array( 'string', 'null' ), ), ), - 'providesContext' => array( + 'provides_context' => array( 'core/value' => 'value', ), - 'context' => array( 'core/value' ), + 'uses_context' => array( 'core/value' ), ) ); diff --git a/phpunit/class-wp-rest-block-directory-controller-test.php b/phpunit/class-wp-rest-block-directory-controller-test.php deleted file mode 100644 index 1675fac5fa35c..0000000000000 --- a/phpunit/class-wp-rest-block-directory-controller-test.php +++ /dev/null @@ -1,214 +0,0 @@ -user->create( - array( - 'role' => 'administrator', - ) - ); - - if ( is_multisite() ) { - grant_super_admin( self::$admin_id ); - } - - if ( ! defined( 'FS_METHOD' ) ) { - define( 'FS_METHOD', 'direct' ); - } - } - - public static function wpTearDownAfterClass() { - self::delete_user( self::$admin_id ); - } - - public function test_register_routes() { - $routes = rest_get_server()->get_routes(); - - $this->assertArrayHasKey( '/__experimental/block-directory/search', $routes ); - $this->assertArrayHasKey( '/__experimental/block-directory/install', $routes ); - $this->assertArrayHasKey( '/__experimental/block-directory/uninstall', $routes ); - } - - public function test_context_param() { - // Collection. - $request = new WP_REST_Request( 'OPTIONS', '/__experimental/block-directory/search' ); - $response = rest_get_server()->dispatch( $request ); - $data = $response->get_data(); - $this->assertEquals( 'view', $data['endpoints'][0]['args']['context']['default'] ); - $this->assertEquals( array( 'view' ), $data['endpoints'][0]['args']['context']['enum'] ); - } - - public function test_get_items() { - wp_set_current_user( self::$admin_id ); - - $request = new WP_REST_Request( 'GET', '/__experimental/block-directory/search' ); - $request->set_query_params( array( 'term' => 'foo' ) ); - - $result = rest_do_request( $request ); - $this->assertNotWPError( $result->as_error() ); - $this->assertEquals( 200, $result->status ); - } - - public function test_get_items_wdotorg_unavailable() { - wp_set_current_user( self::$admin_id ); - - $request = new WP_REST_Request( 'GET', '/__experimental/block-directory/search' ); - $request->set_query_params( array( 'term' => 'foo' ) ); - - $this->prevent_requests_to_host( 'api.wordpress.org' ); - - $this->expectException( 'PHPUnit_Framework_Error_Warning' ); - $response = rest_do_request( $request ); - $this->assertErrorResponse( 'plugins_api_failed', $response, 500 ); - } - - public function test_get_items_logged_out() { - $request = new WP_REST_Request( 'GET', '/__experimental/block-directory/search' ); - $request->set_query_params( array( 'term' => 'foo' ) ); - $response = rest_do_request( $request ); - $this->assertErrorResponse( 'rest_block_directory_cannot_view', $response ); - } - - public function test_get_items_no_results() { - wp_set_current_user( self::$admin_id ); - - $request = new WP_REST_Request( 'GET', '/__experimental/block-directory/search' ); - $request->set_query_params( array( 'term' => '0c4549ee68f24eaaed46a49dc983ecde' ) ); - $response = rest_do_request( $request ); - $data = $response->get_data(); - - // Should produce a 200 status with an empty array. - $this->assertEquals( 200, $response->status ); - $this->assertEquals( array(), $data ); - } - - public function test_get_item() { - $this->markTestSkipped( 'Controller does not have get_item route.' ); - } - - public function test_create_item() { - if ( isset( get_plugins()['hello-dolly/hello.php'] ) ) { - delete_plugins( array( 'hello-dolly/hello.php' ) ); - } - - wp_set_current_user( self::$admin_id ); - - $request = new WP_REST_Request( 'POST', '/__experimental/block-directory/install' ); - $request->set_body_params( array( 'slug' => 'hello-dolly' ) ); - - $response = rest_do_request( $request ); - $this->skip_on_filesystem_error( $response ); - $this->assertNotWPError( $response->as_error() ); - $this->assertEquals( 201, $response->get_status() ); - $this->assertEquals( 'Hello Dolly', $response->get_data()['name'] ); - } - - public function test_update_item() { - $this->markTestSkipped( 'Controller does not have update_item route.' ); - } - - public function test_delete_item() { - $this->markTestSkipped( 'Covered by Plugins controller tests.' ); - } - - public function test_prepare_item() { - wp_set_current_user( self::$admin_id ); - - // This will hit the live API. We're searching for `block` which should definitely return at least one result. - $request = new WP_REST_Request( 'GET', '/__experimental/block-directory/search' ); - $request->set_query_params( array( 'term' => 'block' ) ); - $response = rest_do_request( $request ); - $data = $response->get_data(); - - $this->assertEquals( 200, $response->status ); - // At least one result - $this->assertGreaterThanOrEqual( 1, count( $data ) ); - // Each result should be an object with important attributes set - foreach ( $data as $plugin ) { - $this->assertArrayHasKey( 'name', $plugin ); - $this->assertArrayHasKey( 'title', $plugin ); - $this->assertArrayHasKey( 'id', $plugin ); - $this->assertArrayHasKey( 'author_block_rating', $plugin ); - $this->assertArrayHasKey( 'assets', $plugin ); - $this->assertArrayHasKey( 'humanized_updated', $plugin ); - } - } - - public function test_get_item_schema() { - wp_set_current_user( self::$admin_id ); - - $request = new WP_REST_Request( 'OPTIONS', '/__experimental/block-directory/search' ); - $request->set_query_params( array( 'term' => 'foo' ) ); - $response = rest_do_request( $request ); - $data = $response->get_data(); - - // Check endpoints - $this->assertEquals( [ 'GET' ], $data['endpoints'][0]['methods'] ); - $this->assertTrue( $data['endpoints'][0]['args']['term'][ 'required'] ); - - $properties = $data['schema']['properties']; - - $this->assertCount( 13, $properties ); - $this->assertArrayHasKey( 'name', $properties ); - $this->assertArrayHasKey( 'title', $properties ); - $this->assertArrayHasKey( 'description', $properties ); - $this->assertArrayHasKey( 'id', $properties ); - $this->assertArrayHasKey( 'rating', $properties ); - $this->assertArrayHasKey( 'rating_count', $properties ); - $this->assertArrayHasKey( 'active_installs', $properties ); - $this->assertArrayHasKey( 'author_block_rating', $properties ); - $this->assertArrayHasKey( 'author_block_count', $properties ); - $this->assertArrayHasKey( 'author', $properties ); - $this->assertArrayHasKey( 'icon', $properties ); - $this->assertArrayHasKey( 'humanized_updated', $properties ); - $this->assertArrayHasKey( 'assets', $properties ); - } - - /** - * Skips the test if the response is an error due to the filesystem being unavailable. - * - * @since 5.5.0 - * - * @param WP_REST_Response $response The response object to inspect. - */ - protected function skip_on_filesystem_error( WP_REST_Response $response ) { - if ( ! $response->is_error() ) { - return; - } - - $code = $response->as_error()->get_error_code(); - - if ( 'fs_unavailable' === $code || false !== strpos( $code, 'mkdir_failed' ) ) { - $this->markTestSkipped( 'Filesystem is unavailable.' ); - } - } - - /** - * Simulate a network failure on outbound http requests to a given hostname. - * - * @param string $blocked_host The host to block connections to. - */ - private function prevent_requests_to_host( $blocked_host = 'api.wordpress.org' ) { - add_filter( - 'pre_http_request', - static function ( $return, $args, $url ) use ( $blocked_host ) { - if ( @parse_url( $url, PHP_URL_HOST ) === $blocked_host ) { - return new WP_Error( 'plugins_api_failed', "An expected error occurred connecting to $blocked_host because of a unit test", "cURL error 7: Failed to connect to $blocked_host port 80: Connection refused" ); - - } - - return $return; - }, - 10, - 3 - ); - } -} diff --git a/phpunit/class-wp-rest-block-types-controller-test.php b/phpunit/class-wp-rest-block-types-controller-test.php deleted file mode 100644 index 91c921ea33d64..0000000000000 --- a/phpunit/class-wp-rest-block-types-controller-test.php +++ /dev/null @@ -1,381 +0,0 @@ -user->create( - array( - 'role' => 'administrator', - ) - ); - self::$subscriber_id = $factory->user->create( - array( - 'role' => 'subscriber', - ) - ); - - $name = 'fake/test'; - $settings = array( - 'icon' => 'text', - ); - - register_block_type( $name, $settings ); - } - - /** - * - */ - public static function wpTearDownAfterClass() { - self::delete_user( self::$admin_id ); - self::delete_user( self::$subscriber_id ); - unregister_block_type( 'fake/test' ); - } - - /** - * - */ - public function test_register_routes() { - $routes = rest_get_server()->get_routes(); - $this->assertArrayHasKey( '/__experimental/block-types', $routes ); - $this->assertCount( 1, $routes['/__experimental/block-types'] ); - $this->assertArrayHasKey( '/__experimental/block-types/(?P[a-zA-Z0-9_-]+)', $routes ); - $this->assertCount( 1, $routes['/__experimental/block-types/(?P[a-zA-Z0-9_-]+)'] ); - $this->assertArrayHasKey( '/__experimental/block-types/(?P[a-zA-Z0-9_-]+)/(?P[a-zA-Z0-9_-]+)', $routes ); - $this->assertCount( 1, $routes['/__experimental/block-types/(?P[a-zA-Z0-9_-]+)/(?P[a-zA-Z0-9_-]+)'] ); - } - - /** - * - */ - public function test_context_param() { - // Collection. - $request = new WP_REST_Request( 'OPTIONS', '/__experimental/block-types' ); - $response = rest_get_server()->dispatch( $request ); - $data = $response->get_data(); - $this->assertEquals( 'view', $data['endpoints'][0]['args']['context']['default'] ); - $this->assertEquals( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] ); - // Single. - $request = new WP_REST_Request( 'OPTIONS', '/__experimental/block-types/fake/test' ); - $response = rest_get_server()->dispatch( $request ); - $data = $response->get_data(); - $this->assertEquals( 'view', $data['endpoints'][0]['args']['context']['default'] ); - $this->assertEquals( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] ); - } - - /** - * - */ - public function test_get_items() { - $block_name = 'fake/test'; - wp_set_current_user( self::$admin_id ); - $request = new WP_REST_Request( 'GET', '/__experimental/block-types/fake' ); - $response = rest_get_server()->dispatch( $request ); - $data = $response->get_data(); - $this->assertCount( 1, $data ); - $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block_name ); - $this->check_block_type_object( $block_type, $data[0], $data[0]['_links'] ); - } - - /** - * - */ - public function test_get_item() { - $block_name = 'fake/test'; - wp_set_current_user( self::$admin_id ); - $request = new WP_REST_Request( 'GET', '/__experimental/block-types/' . $block_name ); - $response = rest_get_server()->dispatch( $request ); - $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block_name ); - $this->check_block_type_object( $block_type, $response->get_data(), $response->get_links() ); - } - - /** - * - */ - public function test_get_item_with_styles() { - $block_name = 'fake/styles'; - $block_styles = array( - 'name' => 'fancy-quote', - 'label' => 'Fancy Quote', - 'style_handle' => 'myguten-style', - ); - register_block_type( $block_name ); - register_block_style( $block_name, $block_styles ); - wp_set_current_user( self::$admin_id ); - $request = new WP_REST_Request( 'GET', '/__experimental/block-types/' . $block_name ); - $response = rest_get_server()->dispatch( $request ); - $data = $response->get_data(); - $this->assertEqualSets( array( $block_styles ), $data['styles'] ); - - } - - /** - * - */ - public function test_get_item_with_styles_merge() { - $block_name = 'fake/styles2'; - $block_styles = array( - 'name' => 'fancy-quote', - 'label' => 'Fancy Quote', - 'style_handle' => 'myguten-style', - ); - $settings = array( - 'styles' => array( - array( - 'name' => 'blue-quote', - 'label' => 'Blue Quote', - 'style_handle' => 'myguten-style', - ), - ), - ); - register_block_type( $block_name, $settings ); - register_block_style( $block_name, $block_styles ); - wp_set_current_user( self::$admin_id ); - $request = new WP_REST_Request( 'GET', '/__experimental/block-types/' . $block_name ); - $response = rest_get_server()->dispatch( $request ); - $data = $response->get_data(); - $expected = array( - array( - 'name' => 'fancy-quote', - 'label' => 'Fancy Quote', - 'style_handle' => 'myguten-style', - ), - array( - 'name' => 'blue-quote', - 'label' => 'Blue Quote', - 'style_handle' => 'myguten-style', - ), - ); - $this->assertEqualSets( $expected, $data['styles'] ); - - } - - public function test_get_block_invalid_name() { - $block_type = 'fake/block'; - wp_set_current_user( self::$admin_id ); - $request = new WP_REST_Request( 'GET', '/__experimental/block-types/' . $block_type ); - $response = rest_get_server()->dispatch( $request ); - - $this->assertErrorResponse( 'rest_block_type_invalid', $response, 404 ); - } - - /** - * - */ - public function test_get_item_invalid() { - $block_type = 'fake/invalid'; - $settings = array( - 'keywords' => 'invalid_keywords', - 'parent' => 'invalid_parent', - 'supports' => 'invalid_supports', - 'styles' => 'invalid_styles', - 'render_callback' => 'invalid_callback', - ); - register_block_type( $block_type, $settings ); - wp_set_current_user( self::$admin_id ); - $request = new WP_REST_Request( 'GET', '/__experimental/block-types/' . $block_type ); - $response = rest_get_server()->dispatch( $request ); - $data = $response->get_data(); - $this->assertEquals( $block_type, $data['name'] ); - $this->assertEqualSets( array( 'invalid_keywords' ), $data['keywords'] ); - $this->assertEqualSets( array( 'invalid_parent' ), $data['parent'] ); - $this->assertEqualSets( array(), $data['supports'] ); - $this->assertEqualSets( array( 'invalid_styles' ), $data['styles'] ); - $this->assertEquals( false, $data['is_dynamic'] ); - } - - /** - * - */ - public function test_get_item_schema() { - wp_set_current_user( self::$admin_id ); - $request = new WP_REST_Request( 'OPTIONS', '/__experimental/block-types' ); - $response = rest_get_server()->dispatch( $request ); - $data = $response->get_data(); - $properties = $data['schema']['properties']; - $this->assertCount( 17, $properties ); - $this->assertArrayHasKey( 'title', $properties ); - $this->assertArrayHasKey( 'icon', $properties ); - $this->assertArrayHasKey( 'description', $properties ); - $this->assertArrayHasKey( 'keywords', $properties ); - $this->assertArrayHasKey( 'styles', $properties ); - $this->assertArrayHasKey( 'textdomain', $properties ); - $this->assertArrayHasKey( 'name', $properties ); - $this->assertArrayHasKey( 'attributes', $properties ); - $this->assertArrayHasKey( 'supports', $properties ); - $this->assertArrayHasKey( 'category', $properties ); - $this->assertArrayHasKey( 'is_dynamic', $properties ); - $this->assertArrayHasKey( 'editor_script', $properties ); - $this->assertArrayHasKey( 'script', $properties ); - $this->assertArrayHasKey( 'editor_style', $properties ); - $this->assertArrayHasKey( 'style', $properties ); - $this->assertArrayHasKey( 'parent', $properties ); - $this->assertArrayHasKey( 'example', $properties ); - } - - /** - * - */ - public function test_get_items_wrong_permission() { - wp_set_current_user( self::$subscriber_id ); - $request = new WP_REST_Request( 'GET', '/__experimental/block-types' ); - $response = rest_get_server()->dispatch( $request ); - $this->assertErrorResponse( 'rest_block_type_cannot_view', $response, 403 ); - } - - /** - * - */ - public function test_get_item_wrong_permission() { - wp_set_current_user( self::$subscriber_id ); - $request = new WP_REST_Request( 'GET', '/__experimental/block-types/fake/test' ); - $response = rest_get_server()->dispatch( $request ); - $this->assertErrorResponse( 'rest_block_type_cannot_view', $response, 403 ); - } - - /** - * - */ - public function test_get_items_no_permission() { - wp_set_current_user( 0 ); - $request = new WP_REST_Request( 'GET', '/__experimental/block-types' ); - $response = rest_get_server()->dispatch( $request ); - $this->assertErrorResponse( 'rest_block_type_cannot_view', $response, 401 ); - } - - /** - * - */ - public function test_get_item_no_permission() { - wp_set_current_user( 0 ); - $request = new WP_REST_Request( 'GET', '/__experimental/block-types/fake/test' ); - $response = rest_get_server()->dispatch( $request ); - $this->assertErrorResponse( 'rest_block_type_cannot_view', $response, 401 ); - } - - /** - * - */ - public function test_prepare_item() { - $registry = new WP_Block_Type_Registry; - $settings = array( - 'icon' => 'text', - 'render_callback' => '__return_null', - ); - $registry->register( 'fake/line', $settings ); - $block_type = $registry->get_registered( 'fake/line' ); - $endpoint = new WP_REST_Block_Types_Controller; - $request = new WP_REST_Request; - $request->set_param( 'context', 'edit' ); - $response = $endpoint->prepare_item_for_response( $block_type, $request ); - $this->check_block_type_object( $block_type, $response->get_data(), $response->get_links() ); - } - - /** - * - */ - public function test_prepare_item_limit_fields() { - $registry = new WP_Block_Type_Registry; - $settings = array( - 'icon' => 'text', - 'render_callback' => '__return_null', - ); - $registry->register( 'fake/line', $settings ); - $block_type = $registry->get_registered( 'fake/line' ); - $request = new WP_REST_Request; - $endpoint = new WP_REST_Block_Types_Controller; - $request->set_param( 'context', 'edit' ); - $request->set_param( '_fields', 'name' ); - $response = $endpoint->prepare_item_for_response( $block_type, $request ); - $this->assertEquals( - array( - 'name', - ), - array_keys( $response->get_data() ) - ); - } - - /** - * Util check block type object against. - * - * @param WP_Block_Type $block_type Sample block type. - * @param array $data Data to compare against. - * @param array $links Links to compare again. - */ - public function check_block_type_object( $block_type, $data, $links ) { - // Test data. - $this->assertEquals( $data['attributes'], $block_type->get_attributes() ); - $this->assertEquals( $data['is_dynamic'], $block_type->is_dynamic() ); - - $extra_fields = array( - 'name' => 'name', - 'category' => 'category', - 'editor_script' => 'editor_script', - 'script' => 'script', - 'editor_style' => 'editor_style', - 'style' => 'style', - 'supports' => 'supports', - 'title' => 'title', - 'icon' => 'icon', - 'description' => 'description', - 'keywords' => 'keywords', - 'parent' => 'parent', - 'styles' => 'styles', - 'textdomain' => 'textdomain', - 'example' => 'example', - ); - - foreach ( $extra_fields as $key => $extra_field ) { - if ( isset( $block_type->$extra_field ) ) { - $this->assertEquals( $data[ $key ], $block_type->$extra_field ); - } - } - - // Test links. - $this->assertEquals( rest_url( '__experimental/block-types' ), $links['collection'][0]['href'] ); - $this->assertEquals( rest_url( '__experimental/block-types/' . $block_type->name ), $links['self'][0]['href'] ); - if ( $block_type->is_dynamic() ) { - $this->assertArrayHasKey( 'https://api.w.org/render-block', $links ); - } - } - - /** - * The test_create_item() method does not exist for block types. - */ - public function test_create_item() {} - - /** - * The test_update_item() method does not exist for block types. - */ - public function test_update_item() {} - - /** - * The test_delete_item() method does not exist for block types. - */ - public function test_delete_item() {} -} diff --git a/phpunit/class-wp-rest-plugins-controller-test.php b/phpunit/class-wp-rest-plugins-controller-test.php deleted file mode 100644 index f0d3dbeb5064f..0000000000000 --- a/phpunit/class-wp-rest-plugins-controller-test.php +++ /dev/null @@ -1,1015 +0,0 @@ -user->create( - array( - 'role' => 'subscriber', - ) - ); - self::$super_admin = $factory->user->create( - array( - 'role' => 'administrator', - ) - ); - self::$admin = $factory->user->create( - array( - 'role' => 'administrator', - ) - ); - - if ( is_multisite() ) { - grant_super_admin( self::$super_admin ); - } - - if ( ! defined( 'FS_METHOD' ) ) { - define( 'FS_METHOD', 'direct' ); - } - } - - /** - * Clean up test fixtures. - * - * @since 5.5.0 - */ - public static function wpTearDownAfterClass() { - self::delete_user( self::$subscriber_id ); - self::delete_user( self::$super_admin ); - } - - public function tearDown() { - parent::tearDown(); - - if ( file_exists( WP_PLUGIN_DIR . '/test-plugin/test-plugin.php' ) ) { - $this->rmdir( WP_PLUGIN_DIR . '/test-plugin' ); - } - } - - public function test_register_routes() { - $routes = rest_get_server()->get_routes(); - $this->assertArrayHasKey( self::BASE, $routes ); - $this->assertArrayHasKey( self::BASE . '/(?P[^.\/]+(?:\/[^.\/]+)?)', $routes ); - } - - public function test_context_param() { - // Collection. - $request = new WP_REST_Request( 'OPTIONS', self::BASE ); - $response = rest_get_server()->dispatch( $request ); - $data = $response->get_data(); - $this->assertEquals( 'view', $data['endpoints'][0]['args']['context']['default'] ); - $this->assertEquals( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] ); - // Single. - $request = new WP_REST_Request( 'OPTIONS', self::BASE . '/' . self::PLUGIN ); - $response = rest_get_server()->dispatch( $request ); - $data = $response->get_data(); - $this->assertEquals( 'view', $data['endpoints'][0]['args']['context']['default'] ); - $this->assertEquals( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] ); - } - - public function test_get_items() { - $this->create_test_plugin(); - wp_set_current_user( self::$super_admin ); - - $response = rest_do_request( self::BASE ); - $this->assertEquals( 200, $response->get_status() ); - - $items = wp_list_filter( $response->get_data(), array( 'plugin' => self::PLUGIN_FILE ) ); - - $this->assertCount( 1, $items ); - $this->check_get_plugin_data( array_shift( $items ) ); - } - - public function test_get_items_search() { - $this->create_test_plugin(); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'GET', self::BASE ); - $request->set_query_params( array( 'search' => 'testeroni' ) ); - $response = rest_do_request( $request ); - $this->assertCount( 0, $response->get_data() ); - - $request = new WP_REST_Request( 'GET', self::BASE ); - $request->set_query_params( array( 'search' => 'Cool' ) ); - $response = rest_do_request( $request ); - $this->assertCount( 1, wp_list_filter( $response->get_data(), array( 'plugin' => self::PLUGIN_FILE ) ) ); - } - - public function test_get_items_status() { - $this->create_test_plugin(); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'GET', self::BASE ); - $request->set_query_params( array( 'status' => 'inactive' ) ); - $response = rest_do_request( $request ); - $this->assertCount( 1, wp_list_filter( $response->get_data(), array( 'plugin' => self::PLUGIN_FILE ) ) ); - - $request = new WP_REST_Request( 'GET', self::BASE ); - $request->set_query_params( array( 'status' => 'active' ) ); - $response = rest_do_request( $request ); - $this->assertCount( 0, wp_list_filter( $response->get_data(), array( 'plugin' => self::PLUGIN_FILE ) ) ); - } - - public function test_get_items_status_multiple() { - $this->create_test_plugin(); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'GET', self::BASE ); - $request->set_query_params( array( 'status' => array( 'inactive', 'active' ) ) ); - $response = rest_do_request( $request ); - - $this->assertGreaterThan( 1, count( wp_list_filter( $response->get_data(), array( 'plugin' => self::PLUGIN_FILE ), 'NOT' ) ) ); - $this->assertCount( 1, wp_list_filter( $response->get_data(), array( 'plugin' => self::PLUGIN_FILE ) ) ); - } - - /** - * @group ms-required - */ - public function test_get_items_status_network_active() { - $this->create_test_plugin(); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'GET', self::BASE ); - $request->set_query_params( array( 'status' => 'network-active' ) ); - $response = rest_do_request( $request ); - $this->assertCount( 0, wp_list_filter( $response->get_data(), array( 'plugin' => self::PLUGIN_FILE ) ) ); - - activate_plugin( self::PLUGIN_FILE, '', true ); - $request = new WP_REST_Request( 'GET', self::BASE ); - $request->set_query_params( array( 'status' => 'network-active' ) ); - $response = rest_do_request( $request ); - $this->assertCount( 1, wp_list_filter( $response->get_data(), array( 'plugin' => self::PLUGIN_FILE ) ) ); - } - - public function test_get_items_logged_out() { - $response = rest_do_request( self::BASE ); - $this->assertEquals( 401, $response->get_status() ); - } - - public function test_get_items_insufficient_permissions() { - wp_set_current_user( self::$subscriber_id ); - $response = rest_do_request( self::BASE ); - $this->assertequals( 403, $response->get_status() ); - } - - /** - * @group ms-required - */ - public function test_cannot_get_items_if_plugins_menu_not_available() { - $this->create_test_plugin(); - wp_set_current_user( self::$admin ); - - $request = new WP_REST_Request( 'GET', self::BASE ); - $response = rest_do_request( $request ); - - $this->assertErrorResponse( 'rest_cannot_view_plugins', $response->as_error(), 403 ); - } - - /** - * @group ms-required - */ - public function test_get_items_if_plugins_menu_available() { - $this->create_test_plugin(); - $this->enable_plugins_menu_item(); - wp_set_current_user( self::$admin ); - - $response = rest_do_request( self::BASE ); - $this->assertEquals( 200, $response->get_status() ); - } - - /** - * @group ms-required - */ - public function test_get_items_excludes_network_only_plugin_if_not_active() { - $this->create_test_plugin( true ); - $this->enable_plugins_menu_item(); - wp_set_current_user( self::$admin ); - - $response = rest_do_request( self::BASE ); - $this->assertEquals( 200, $response->get_status() ); - - $items = wp_list_filter( $response->get_data(), array( 'plugin' => self::PLUGIN_FILE ) ); - $this->assertCount( 0, $items ); - } - - /** - * @group ms-excluded - */ - public function test_get_items_does_not_exclude_network_only_plugin_if_not_active_on_single_site() { - $this->create_test_plugin( true ); - wp_set_current_user( self::$admin ); - - $response = rest_do_request( self::BASE ); - $this->assertEquals( 200, $response->get_status() ); - - $items = wp_list_filter( $response->get_data(), array( 'plugin' => self::PLUGIN_FILE ) ); - $this->assertCount( 1, $items ); - $this->check_get_plugin_data( array_shift( $items ), true ); - } - - /** - * @group ms-required - */ - public function test_get_items_does_not_exclude_network_only_plugin_if_not_active_but_has_network_caps() { - $this->create_test_plugin( true ); - $this->enable_plugins_menu_item(); - wp_set_current_user( self::$super_admin ); - - $response = rest_do_request( self::BASE ); - $this->assertEquals( 200, $response->get_status() ); - - $items = wp_list_filter( $response->get_data(), array( 'plugin' => self::PLUGIN_FILE ) ); - $this->assertCount( 1, $items ); - $this->check_get_plugin_data( array_shift( $items ), true ); - } - - public function test_get_item() { - $this->create_test_plugin(); - wp_set_current_user( self::$super_admin ); - - $response = rest_do_request( self::BASE . '/' . self::PLUGIN ); - $this->assertEquals( 200, $response->get_status() ); - $this->check_get_plugin_data( $response->get_data() ); - } - - public function test_get_item_logged_out() { - $response = rest_do_request( self::BASE . '/' . self::PLUGIN ); - $this->assertEquals( 401, $response->get_status() ); - } - - public function test_get_item_insufficient_permissions() { - wp_set_current_user( self::$subscriber_id ); - $response = rest_do_request( self::BASE . '/' . self::PLUGIN ); - $this->assertEquals( 403, $response->get_status() ); - } - - /** - * @group ms-required - */ - public function test_cannot_get_item_if_plugins_menu_not_available() { - $this->create_test_plugin(); - wp_set_current_user( self::$admin ); - - $request = new WP_REST_Request( 'GET', self::BASE . '/' . self::PLUGIN ); - $response = rest_do_request( $request ); - - $this->assertErrorResponse( 'rest_cannot_view_plugin', $response->as_error(), 403 ); - } - - /** - * @group ms-required - */ - public function test_get_item_if_plugins_menu_available() { - $this->create_test_plugin(); - $this->enable_plugins_menu_item(); - wp_set_current_user( self::$admin ); - - $response = rest_do_request( self::BASE . '/' . self::PLUGIN ); - $this->assertEquals( 200, $response->get_status() ); - } - - public function test_get_item_invalid_plugin() { - wp_set_current_user( self::$super_admin ); - $response = rest_do_request( self::BASE . '/' . self::PLUGIN ); - $this->assertEquals( 404, $response->get_status() ); - } - - public function test_create_item() { - if ( isset( get_plugins()['hello-dolly/hello.php'] ) ) { - delete_plugins( array( 'hello-dolly/hello.php' ) ); - } - - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'POST', self::BASE ); - $request->set_body_params( array( 'slug' => 'hello-dolly' ) ); - - $response = rest_do_request( $request ); - $this->skip_on_filesystem_error( $response ); - $this->assertNotWPError( $response->as_error() ); - $this->assertEquals( 201, $response->get_status() ); - $this->assertEquals( 'Hello Dolly', $response->get_data()['name'] ); - } - - public function test_create_item_and_activate() { - if ( isset( get_plugins()['hello-dolly/hello.php'] ) ) { - delete_plugins( array( 'hello-dolly/hello.php' ) ); - } - - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'POST', self::BASE ); - $request->set_body_params( - array( - 'slug' => 'hello-dolly', - 'status' => 'active', - ) - ); - - $response = rest_do_request( $request ); - $this->skip_on_filesystem_error( $response ); - $this->assertNotWPError( $response->as_error() ); - $this->assertEquals( 201, $response->get_status() ); - $this->assertEquals( 'Hello Dolly', $response->get_data()['name'] ); - $this->assertTrue( is_plugin_active( 'hello-dolly/hello.php' ) ); - } - - public function test_create_item_and_activate_errors_if_no_permission_to_activate_plugin() { - if ( isset( get_plugins()['hello-dolly/hello.php'] ) ) { - delete_plugins( array( 'hello-dolly/hello.php' ) ); - } - - wp_set_current_user( self::$super_admin ); - $this->disable_activate_permission( 'hello-dolly/hello.php' ); - - $request = new WP_REST_Request( 'POST', self::BASE ); - $request->set_body_params( - array( - 'slug' => 'hello-dolly', - 'status' => 'active', - ) - ); - - $response = rest_do_request( $request ); - $this->skip_on_filesystem_error( $response ); - $this->assertErrorResponse( 'rest_cannot_activate_plugin', $response ); - $this->assertFalse( is_plugin_active( 'hello-dolly/hello.php' ) ); - } - - /** - * @group ms-excluded - */ - public function test_create_item_and_network_activate_rejected_if_not_multisite() { - if ( isset( get_plugins()['hello-dolly/hello.php'] ) ) { - delete_plugins( array( 'hello-dolly/hello.php' ) ); - } - - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'POST', self::BASE ); - $request->set_body_params( - array( - 'slug' => 'hello-dolly', - 'status' => 'network-active', - ) - ); - - $response = rest_do_request( $request ); - $this->skip_on_filesystem_error( $response ); - $this->assertErrorResponse( 'rest_invalid_param', $response ); - } - - /** - * @group ms-required - */ - public function test_create_item_and_network_activate() { - if ( isset( get_plugins()['hello-dolly/hello.php'] ) ) { - delete_plugins( array( 'hello-dolly/hello.php' ) ); - } - - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'POST', self::BASE ); - $request->set_body_params( - array( - 'slug' => 'hello-dolly', - 'status' => 'network-active', - ) - ); - - $response = rest_do_request( $request ); - $this->skip_on_filesystem_error( $response ); - $this->assertNotWPError( $response->as_error() ); - $this->assertEquals( 201, $response->get_status() ); - $this->assertEquals( 'Hello Dolly', $response->get_data()['name'] ); - $this->assertTrue( is_plugin_active_for_network( 'hello-dolly/hello.php' ) ); - } - - public function test_create_item_logged_out() { - $request = new WP_REST_Request( 'POST', self::BASE ); - $request->set_body_params( array( 'slug' => 'hello-dolly' ) ); - - $response = rest_do_request( $request ); - $this->assertEquals( 401, $response->get_status() ); - } - - public function test_create_item_insufficient_permissions() { - wp_set_current_user( self::$subscriber_id ); - $request = new WP_REST_Request( 'POST', self::BASE ); - $request->set_body_params( array( 'slug' => 'hello-dolly' ) ); - - $response = rest_do_request( $request ); - $this->assertEquals( 403, $response->get_status() ); - } - - /** - * @group ms-required - */ - public function test_cannot_create_item_if_not_super_admin() { - $this->create_test_plugin(); - wp_set_current_user( self::$admin ); - - $request = new WP_REST_Request( 'POST', self::BASE ); - $request->set_body_params( array( 'slug' => 'hello-dolly' ) ); - $response = rest_do_request( $request ); - - $this->assertErrorResponse( 'rest_cannot_install_plugin', $response->as_error(), 403 ); - } - - public function test_create_item_wdotorg_unreachable() { - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'POST', self::BASE ); - $request->set_body_params( array( 'slug' => 'foo' ) ); - - $this->prevent_requests_to_host( 'api.wordpress.org' ); - - $this->expectException( 'PHPUnit_Framework_Error_Warning' ); - $response = rest_do_request( $request ); - $this->skip_on_filesystem_error( $response ); - $this->assertErrorResponse( 'plugins_api_failed', $response, 500 ); - } - - public function test_create_item_unknown_plugin() { - wp_set_current_user( self::$super_admin ); - - // This will hit the live API. - $request = new WP_REST_Request( 'POST', self::BASE ); - $request->set_body_params( array( 'slug' => 'alex-says-this-block-definitely-doesnt-exist' ) ); - $response = rest_do_request( $request ); - - $this->skip_on_filesystem_error( $response ); - // Is this an appropriate status? - $this->assertErrorResponse( 'plugins_api_failed', $response, 404 ); - } - - public function test_update_item() { - $this->create_test_plugin(); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $response = rest_do_request( $request ); - - $this->assertEquals( 200, $response->get_status() ); - } - - public function test_update_item_logged_out() { - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $response = rest_do_request( $request ); - - $this->assertEquals( 401, $response->get_status() ); - } - - public function test_update_item_insufficient_permissions() { - wp_set_current_user( self::$subscriber_id ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $response = rest_do_request( $request ); - - $this->assertEquals( 403, $response->get_status() ); - } - - /** - * @group ms-required - */ - public function test_cannot_update_item_if_plugins_menu_not_available() { - $this->create_test_plugin(); - wp_set_current_user( self::$admin ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $response = rest_do_request( $request ); - - $this->assertErrorResponse( 'rest_cannot_manage_plugins', $response->as_error(), 403 ); - } - - public function test_update_item_activate_plugin() { - $this->create_test_plugin(); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $request->set_body_params( array( 'status' => 'active' ) ); - $response = rest_do_request( $request ); - - $this->assertEquals( 200, $response->get_status() ); - $this->assertTrue( is_plugin_active( self::PLUGIN_FILE ) ); - } - - public function test_update_item_activate_plugin_fails_if_no_activate_cap() { - $this->create_test_plugin(); - wp_set_current_user( self::$super_admin ); - $this->disable_activate_permission( self::PLUGIN_FILE ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $request->set_body_params( array( 'status' => 'active' ) ); - $response = rest_do_request( $request ); - - $this->assertErrorResponse( 'rest_cannot_activate_plugin', $response, 403 ); - } - - /** - * @group ms-excluded - */ - public function test_update_item_network_activate_plugin_rejected_if_not_multisite() { - $this->create_test_plugin(); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $request->set_body_params( array( 'status' => 'network-active' ) ); - $response = rest_do_request( $request ); - - $this->assertErrorResponse( 'rest_invalid_param', $response ); - } - - /** - * @group ms-required - */ - public function test_update_item_network_activate_plugin() { - $this->create_test_plugin(); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $request->set_body_params( array( 'status' => 'network-active' ) ); - $response = rest_do_request( $request ); - - $this->assertEquals( 200, $response->get_status() ); - $this->assertTrue( is_plugin_active_for_network( self::PLUGIN_FILE ) ); - } - - /** - * @group ms-required - */ - public function test_update_item_network_activate_plugin_that_was_active_on_single_site() { - $this->create_test_plugin(); - activate_plugin( self::PLUGIN_FILE ); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $request->set_body_params( array( 'status' => 'network-active' ) ); - $response = rest_do_request( $request ); - - $this->assertEquals( 200, $response->get_status() ); - $this->assertTrue( is_plugin_active_for_network( self::PLUGIN_FILE ) ); - } - - /** - * @group ms-required - */ - public function test_update_item_activate_network_only_plugin() { - $this->create_test_plugin( true ); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $request->set_body_params( array( 'status' => 'active' ) ); - $response = rest_do_request( $request ); - - $this->assertErrorResponse( 'rest_network_only_plugin', $response, 400 ); - } - - /** - * @group ms-required - */ - public function test_update_item_network_activate_network_only_plugin() { - $this->create_test_plugin( true ); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $request->set_body_params( array( 'status' => 'network-active' ) ); - $response = rest_do_request( $request ); - - $this->assertEquals( 200, $response->get_status() ); - $this->assertTrue( is_plugin_active_for_network( self::PLUGIN_FILE ) ); - } - - /** - * @group ms-excluded - */ - public function test_update_item_activate_network_only_plugin_on_non_multisite() { - $this->create_test_plugin( true ); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $request->set_body_params( array( 'status' => 'active' ) ); - $response = rest_do_request( $request ); - - $this->assertEquals( 200, $response->get_status() ); - $this->assertTrue( is_plugin_active( self::PLUGIN_FILE ) ); - } - - /** - * @group ms-required - */ - public function test_update_item_activate_plugin_for_site_if_menu_item_available() { - $this->create_test_plugin(); - $this->enable_plugins_menu_item(); - wp_set_current_user( self::$admin ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $request->set_body_params( array( 'status' => 'active' ) ); - $response = rest_do_request( $request ); - - $this->assertNotWPError( $response->as_error() ); - $this->assertEquals( 200, $response->get_status() ); - $this->assertTrue( is_plugin_active( self::PLUGIN_FILE ) ); - } - - /** - * @group ms-required - */ - public function test_update_item_network_activate_plugin_for_site_if_menu_item_available() { - $this->create_test_plugin(); - $this->enable_plugins_menu_item(); - wp_set_current_user( self::$admin ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $request->set_body_params( array( 'status' => 'network-active' ) ); - $response = rest_do_request( $request ); - - $this->assertErrorResponse( 'rest_cannot_manage_network_plugins', $response, 403 ); - } - - public function test_update_item_deactivate_plugin() { - $this->create_test_plugin(); - activate_plugin( self::PLUGIN_FILE ); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $request->set_body_params( array( 'status' => 'inactive' ) ); - $response = rest_do_request( $request ); - - $this->assertEquals( 200, $response->get_status() ); - $this->assertTrue( is_plugin_inactive( self::PLUGIN_FILE ) ); - } - - public function test_update_item_deactivate_plugin_fails_if_no_deactivate_cap() { - $this->create_test_plugin(); - activate_plugin( self::PLUGIN_FILE ); - wp_set_current_user( self::$super_admin ); - $this->disable_deactivate_permission( self::PLUGIN_FILE ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $request->set_body_params( array( 'status' => 'inactive' ) ); - $response = rest_do_request( $request ); - - $this->assertErrorResponse( 'rest_cannot_deactivate_plugin', $response, 403 ); - } - - /** - * @group ms-required - */ - public function test_update_item_deactivate_network_active_plugin() { - $this->create_test_plugin(); - activate_plugin( self::PLUGIN_FILE, '', true ); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $request->set_body_params( array( 'status' => 'inactive' ) ); - $response = rest_do_request( $request ); - - $this->assertEquals( 200, $response->get_status() ); - $this->assertTrue( is_plugin_inactive( self::PLUGIN_FILE ) ); - } - - /** - * @group ms-required - */ - public function test_update_item_deactivate_network_active_plugin_if_not_super_admin() { - $this->enable_plugins_menu_item(); - $this->create_test_plugin(); - activate_plugin( self::PLUGIN_FILE, '', true ); - wp_set_current_user( self::$admin ); - - $request = new WP_REST_Request( 'PUT', self::BASE . '/' . self::PLUGIN ); - $request->set_body_params( array( 'status' => 'inactive' ) ); - $response = rest_do_request( $request ); - - $this->assertErrorResponse( 'rest_cannot_manage_network_plugins', $response, 403 ); - } - - public function test_delete_item() { - $this->create_test_plugin(); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'DELETE', self::BASE . '/' . self::PLUGIN ); - $response = rest_do_request( $request ); - - $this->skip_on_filesystem_error( $response ); - $this->assertNotWPError( $response->as_error() ); - $this->assertEquals( 200, $response->get_status() ); - $this->assertTrue( $response->get_data()['deleted'] ); - $this->assertEquals( 'test-plugin/test-plugin.php', $response->get_data()['previous']['plugin'] ); - $this->assertFileNotExists( WP_PLUGIN_DIR . '/' . self::PLUGIN_FILE ); - } - - public function test_delete_item_logged_out() { - $request = new WP_REST_Request( 'DELETE', self::BASE . '/' . self::PLUGIN ); - $response = rest_do_request( $request ); - - $this->assertEquals( 401, $response->get_status() ); - } - - public function test_delete_item_insufficient_permissions() { - wp_set_current_user( self::$subscriber_id ); - - $request = new WP_REST_Request( 'DELETE', self::BASE . '/' . self::PLUGIN ); - $response = rest_do_request( $request ); - - $this->assertEquals( 403, $response->get_status() ); - } - - /** - * @group ms-required - */ - public function test_cannot_delete_item_if_plugins_menu_not_available() { - wp_set_current_user( self::$admin ); - - $request = new WP_REST_Request( 'DELETE', self::BASE . '/' . self::PLUGIN ); - $response = rest_do_request( $request ); - - $this->assertErrorResponse( 'rest_cannot_manage_plugins', $response->as_error(), 403 ); - } - - /** - * @group ms-required - */ - public function test_cannot_delete_item_if_plugins_menu_is_available() { - wp_set_current_user( self::$admin ); - $this->enable_plugins_menu_item(); - - $request = new WP_REST_Request( 'DELETE', self::BASE . '/' . self::PLUGIN ); - $response = rest_do_request( $request ); - - $this->assertErrorResponse( 'rest_cannot_manage_plugins', $response->as_error(), 403 ); - } - - public function test_delete_item_active_plugin() { - $this->create_test_plugin(); - activate_plugin( self::PLUGIN_FILE ); - wp_set_current_user( self::$super_admin ); - - $request = new WP_REST_Request( 'DELETE', self::BASE . '/' . self::PLUGIN ); - $response = rest_do_request( $request ); - - $this->skip_on_filesystem_error( $response ); - $this->assertErrorResponse( 'rest_cannot_delete_active_plugin', $response ); - } - - public function test_prepare_item() { - $this->create_test_plugin(); - - $item = get_plugins()[ self::PLUGIN_FILE ]; - $item['_file'] = self::PLUGIN_FILE; - - $endpoint = new WP_REST_Plugins_Controller(); - $response = $endpoint->prepare_item_for_response( $item, new WP_REST_Request( 'GET', self::BASE . '/' . self::PLUGIN ) ); - - $this->check_get_plugin_data( $response->get_data() ); - $links = $response->get_links(); - $this->assertArrayHasKey( 'self', $links ); - $this->assertEquals( rest_url( self::BASE . '/' . self::PLUGIN ), $links['self'][0]['href'] ); - } - - /** - * @group ms-required - */ - public function test_prepare_item_network_active() { - $this->create_test_plugin(); - activate_plugin( self::PLUGIN_FILE, '', true ); - - $item = get_plugins()[ self::PLUGIN_FILE ]; - $item['_file'] = self::PLUGIN_FILE; - - $endpoint = new WP_REST_Plugins_Controller(); - $response = $endpoint->prepare_item_for_response( $item, new WP_REST_Request( 'GET', self::BASE . '/' . self::PLUGIN ) ); - - $this->assertEquals( 'network-active', $response->get_data()['status'] ); - } - - /** - * @group ms-required - */ - public function test_prepare_item_network_only() { - $this->create_test_plugin( true ); - - $item = get_plugins()[ self::PLUGIN_FILE ]; - $item['_file'] = self::PLUGIN_FILE; - - $endpoint = new WP_REST_Plugins_Controller(); - $response = $endpoint->prepare_item_for_response( $item, new WP_REST_Request( 'GET', self::BASE . '/' . self::PLUGIN ) ); - - $this->check_get_plugin_data( $response->get_data(), true ); - } - - public function test_get_item_schema() { - $request = new WP_REST_Request( 'OPTIONS', self::BASE ); - $response = rest_get_server()->dispatch( $request ); - $data = $response->get_data(); - $properties = $data['schema']['properties']; - - $this->assertCount( 12, $properties ); - $this->assertArrayHasKey( 'plugin', $properties ); - $this->assertArrayHasKey( 'status', $properties ); - $this->assertArrayHasKey( 'name', $properties ); - $this->assertArrayHasKey( 'plugin_uri', $properties ); - $this->assertArrayHasKey( 'description', $properties ); - $this->assertArrayHasKey( 'author', $properties ); - $this->assertArrayHasKey( 'author_uri', $properties ); - $this->assertArrayHasKey( 'version', $properties ); - $this->assertArrayHasKey( 'network_only', $properties ); - $this->assertArrayHasKey( 'requires_wp', $properties ); - $this->assertArrayHasKey( 'requires_php', $properties ); - $this->assertArrayHasKey( 'text_domain', $properties ); - } - - /** - * Checks the response data. - * - * @since 5.5.0 - * - * @param array $data Prepared plugin data. - * @param bool $network_only Whether the plugin is network only. - */ - protected function check_get_plugin_data( $data, $network_only = false ) { - $this->assertEquals( 'test-plugin/test-plugin.php', $data['plugin'] ); - $this->assertEquals( '1.5.4', $data['version'] ); - $this->assertEquals( 'inactive', $data['status'] ); - $this->assertEquals( 'Test Plugin', $data['name'] ); - $this->assertEquals( 'https://wordpress.org/plugins/test-plugin/', $data['plugin_uri'] ); - $this->assertEquals( 'WordPress.org', $data['author'] ); - $this->assertEquals( 'https://wordpress.org/', $data['author_uri'] ); - $this->assertEquals( "My 'Cool' Plugin", $data['description']['raw'] ); - $this->assertEquals( 'My ‘Cool’ Plugin By WordPress.org.', $data['description']['rendered'] ); - $this->assertEquals( $network_only, $data['network_only'] ); - $this->assertEquals( '5.6.0', $data['requires_php'] ); - $this->assertEquals( '5.4.0', $data['requires_wp'] ); - $this->assertEquals( 'test-plugin', $data['text_domain'] ); - } - - /** - * Skips the test if the response is an error due to the filesystem being unavailable. - * - * @since 5.5.0 - * - * @param WP_REST_Response $response The response object to inspect. - */ - protected function skip_on_filesystem_error( WP_REST_Response $response ) { - if ( ! $response->is_error() ) { - return; - } - - $code = $response->as_error()->get_error_code(); - - if ( 'fs_unavailable' === $code || false !== strpos( $code, 'mkdir_failed' ) ) { - $this->markTestSkipped( 'Filesystem is unavailable.' ); - } - } - - /** - * Disables permission for activating a specific plugin. - * - * @param string $plugin The plugin file to disable. - */ - protected function disable_activate_permission( $plugin ) { - add_filter( - 'map_meta_cap', - static function ( $caps, $cap, $user, $args ) use ( $plugin ) { - if ( 'activate_plugin' === $cap && $plugin === $args[0] ) { - $caps = array( 'do_not_allow' ); - } - - return $caps; - }, - 10, - 4 - ); - } - - /** - * Disables permission for deactivating a specific plugin. - * - * @param string $plugin The plugin file to disable. - */ - protected function disable_deactivate_permission( $plugin ) { - add_filter( - 'map_meta_cap', - static function ( $caps, $cap, $user, $args ) use ( $plugin ) { - if ( 'deactivate_plugin' === $cap && $plugin === $args[0] ) { - $caps = array( 'do_not_allow' ); - } - - return $caps; - }, - 10, - 4 - ); - } - - /** - * Enables the "plugins" as an available menu item. - * - * @since 5.5.0 - */ - protected function enable_plugins_menu_item() { - $menu_perms = get_site_option( 'menu_items', array() ); - $menu_perms['plugins'] = true; - update_site_option( 'menu_items', $menu_perms ); - } - - /** - * Creates a test plugin. - * - * @since 5.5.0 - * - * @param bool $network_only Whether to make this a network only plugin. - */ - private function create_test_plugin( $network_only = false ) { - $network = $network_only ? PHP_EOL . ' * Network: true' . PHP_EOL : ''; - - $php = <<markTestSkipped( 'Filesystem is unavailable.' ); - } - - file_put_contents( WP_PLUGIN_DIR . '/test-plugin/test-plugin.php', $php ); - } - - /** - * Simulate a network failure on outbound http requests to a given hostname. - * - * @param string $blocked_host The host to block connections to. - */ - private function prevent_requests_to_host( $blocked_host = 'api.wordpress.org' ) { - add_filter( - 'pre_http_request', - static function ( $return, $args, $url ) use ( $blocked_host ) { - if ( @parse_url( $url, PHP_URL_HOST ) === $blocked_host ) { - return new WP_Error( 'plugins_api_failed', "An expected error occurred connecting to $blocked_host because of a unit test", "cURL error 7: Failed to connect to $blocked_host port 80: Connection refused" ); - - } - - return $return; - }, - 10, - 3 - ); - } -} diff --git a/phpunit/class-wp-rest-post-format-search-handler-test.php b/phpunit/class-wp-rest-post-format-search-handler-test.php new file mode 100644 index 0000000000000..4c9837b902621 --- /dev/null +++ b/phpunit/class-wp-rest-post-format-search-handler-test.php @@ -0,0 +1,158 @@ +post->create( + array( + 'post_title' => 'Test post', + ) + ); + + set_post_format( self::$my_post_id, 'aside' ); + } + + /** + * Delete our fake data after our tests run. + */ + public static function wpTearDownAfterClass() { + wp_delete_post( self::$my_post_id ); + + remove_theme_support( 'post-formats' ); + } + + /** + * Search through terms of any type. + */ + public function test_get_items_search_type_post_format() { + $response = $this->do_request_with_params( + array( + 'per_page' => 100, + 'type' => 'post-format', + ) + ); + $this->assertEquals( 200, $response->get_status() ); + $this->assertContains( + 'Aside', + wp_list_pluck( $response->get_data(), 'title' ) + ); + } + + /** + * Search through all that matches a 'Aside' search. + */ + public function test_get_items_search_for_test_post_format() { + $response = $this->do_request_with_params( + array( + 'per_page' => 100, + 'search' => 'Aside', + 'type' => 'post-format', + ) + ); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertContains( + 'Aside', + wp_list_pluck( $response->get_data(), 'title' ) + ); + } + + /** + * Searching for a post format that doesn't exist should return an empty + * result. + */ + public function test_get_items_search_for_missing_post_format() { + $response = $this->do_request_with_params( + array( + 'per_page' => 100, + 'search' => 'Doesn\'t exist', + 'type' => 'post-format', + ) + ); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEmpty( $response->get_data() ); + } + + public function test_register_routes() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_context_param() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_get_items() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_get_item() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_create_item() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_update_item() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_delete_item() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_prepare_item() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_get_item_schema() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + /** + * Perform a REST request to our search endpoint with given parameters. + */ + private function do_request_with_params( $params = array(), $method = 'GET' ) { + $request = $this->get_request( $params, $method ); + + return rest_get_server()->dispatch( $request ); + } + + /** + * Get a REST request object for given parameters. + */ + private function get_request( $params = array(), $method = 'GET' ) { + $request = new WP_REST_Request( $method, '/wp/v2/search' ); + + foreach ( $params as $param => $value ) { + $request->set_param( $param, $value ); + } + + return $request; + } +} diff --git a/phpunit/class-wp-rest-term-search-handler-test.php b/phpunit/class-wp-rest-term-search-handler-test.php new file mode 100644 index 0000000000000..a2c248fd8bfd8 --- /dev/null +++ b/phpunit/class-wp-rest-term-search-handler-test.php @@ -0,0 +1,263 @@ +term->create( + array( + 'taxonomy' => 'category', + 'name' => 'Test Category', + ) + ); + + self::$my_tag = $factory->term->create( + array( + 'taxonomy' => 'post_tag', + 'name' => 'Test Tag', + ) + ); + + } + + /** + * Delete our fake data after our tests run. + */ + public static function wpTearDownAfterClass() { + $term_ids = array( + self::$my_category, + self::$my_tag, + ); + + foreach ( $term_ids as $term_id ) { + wp_delete_term( $term_id, true ); + } + } + + + /** + * Search through terms of any type. + */ + public function test_get_items_search_type_term() { + $response = $this->do_request_with_params( + array( + 'per_page' => 100, + 'type' => 'term', + ) + ); + $this->assertEquals( 200, $response->get_status() ); + $this->assertEqualSets( + array( + 0 => 1, // That is the default category. + self::$my_category, + self::$my_tag, + ), + wp_list_pluck( $response->get_data(), 'id' ) + ); + } + + /** + * Search through terms of subtype 'category'. + */ + public function test_get_items_search_type_term_subtype_category() { + $response = $this->do_request_with_params( + array( + 'per_page' => 100, + 'type' => 'term', + 'subtype' => 'category', + ) + ); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEqualSets( + array( + 0 => 1, // That is the default category. + self::$my_category, + ), + wp_list_pluck( $response->get_data(), 'id' ) + ); + } + + /** + * Search through posts of an invalid post type. + */ + public function test_get_items_search_term_subtype_invalid() { + $response = $this->do_request_with_params( + array( + 'per_page' => 100, + 'type' => 'term', + 'subtype' => 'invalid', + ) + ); + + $this->assertErrorResponse( 'rest_invalid_param', $response, 400 ); + } + + /** + * Search through posts and pages. + */ + public function test_get_items_search_categories_and_tags() { + $response = $this->do_request_with_params( + array( + 'per_page' => 100, + 'type' => 'term', + 'subtype' => 'category,post_tag', + ) + ); + $this->assertEquals( 200, $response->get_status() ); + $this->assertEqualSets( + array( + 0 => 1, // This is the default category. + self::$my_category, + self::$my_tag, + ), + wp_list_pluck( $response->get_data(), 'id' ) + ); + } + + /** + * Search through all that matches a 'Test Category' search. + */ + public function test_get_items_search_for_testcategory() { + $response = $this->do_request_with_params( + array( + 'per_page' => 100, + 'search' => 'Test Category', + 'type' => 'term', + ) + ); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEqualSets( + array( + self::$my_category, + ), + wp_list_pluck( $response->get_data(), 'id' ) + ); + } + + /** + * Search through all that matches a 'Test Tag' search. + */ + public function test_get_items_search_for_testtag() { + $response = $this->do_request_with_params( + array( + 'per_page' => 100, + 'search' => 'Test Tag', + 'type' => 'term', + ) + ); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEqualSets( + array( + self::$my_tag, + ), + wp_list_pluck( $response->get_data(), 'id' ) + ); + } + + /** + * Searching for a term that doesn't exist should return an empty result. + */ + public function test_get_items_search_for_missing_term() { + $response = $this->do_request_with_params( + array( + 'per_page' => 100, + 'search' => 'Doesn\'t exist', + 'type' => 'term', + ) + ); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEmpty( $response->get_data() ); + } + + public function test_register_routes() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_context_param() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_get_items() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_get_item() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_create_item() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_update_item() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_delete_item() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_prepare_item() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + public function test_get_item_schema() { + $this->markTestSkipped( 'Covered by Search controller tests.' ); + } + + /** + * Perform a REST request to our search endpoint with given parameters. + */ + private function do_request_with_params( $params = array(), $method = 'GET' ) { + $request = $this->get_request( $params, $method ); + + return rest_get_server()->dispatch( $request ); + } + + /** + * Get a REST request object for given parameters. + */ + private function get_request( $params = array(), $method = 'GET' ) { + $request = new WP_REST_Request( $method, '/wp/v2/search' ); + + foreach ( $params as $param => $value ) { + $request->set_param( $param, $value ); + } + + return $request; + } + + +} diff --git a/phpunit/fixtures/block.json b/phpunit/fixtures/block.json index 2d71b8f26a4dc..be4205ce767af 100644 --- a/phpunit/fixtures/block.json +++ b/phpunit/fixtures/block.json @@ -5,6 +5,12 @@ "parent": [ "core/group" ], + "providesContext": { + "my-plugin/message": "message" + }, + "usesContext": [ + "groupId" + ], "icon": "star", "description": "Shows warning, error or success notices…", "keywords": [ diff --git a/post-content.php b/post-content.php index f286c181f5dbb..8089bec9ea88c 100644 --- a/post-content.php +++ b/post-content.php @@ -145,11 +145,11 @@

    - +
    https://vimeo.com/22439234
    - +

    diff --git a/readme.txt b/readme.txt index c1c158a243cde..e6aa21221aaaa 100644 --- a/readme.txt +++ b/readme.txt @@ -1,7 +1,7 @@ === Gutenberg === Contributors: matveb, joen, karmatosed -Requires at least: 5.3.0 -Tested up to: 5.4 +Requires at least: 5.4.0 +Tested up to: 5.5 Requires PHP: 5.6 Stable tag: V.V.V License: GPLv2 or later @@ -50,7 +50,11 @@ The four phases of the project are Editing, Customization, Collaboration, and Mu - Documentation: Creating Blocks, Reference, and Guidelines - Additional frequently asked questions += Where can I see which Gutenberg plugin versions are included in each WordPress release? = + +View the Versions in WordPress document to get a table showing which Gutenberg plugin version is included in each WordPress release. + == Changelog == -To read the changelog for Gutenberg 8.3.0, please navigate to the release page. +To read the changelog for Gutenberg 8.9.1, please navigate to the release page. diff --git a/storybook/main.js b/storybook/main.js index 41417bd1e907e..f9d05667f4cab 100644 --- a/storybook/main.js +++ b/storybook/main.js @@ -1,5 +1,6 @@ const stories = [ process.env.NODE_ENV !== 'test' && './stories/**/*.(js|mdx)', + '../packages/block-editor/src/**/stories/*.js', '../packages/components/src/**/stories/*.js', '../packages/icons/src/**/stories/*.js', ].filter( Boolean ); diff --git a/storybook/stories/playground/editor-styles.scss b/storybook/stories/playground/editor-styles.scss index d920ea8de5ba0..d983f820afc65 100644 --- a/storybook/stories/playground/editor-styles.scss +++ b/storybook/stories/playground/editor-styles.scss @@ -2,7 +2,7 @@ font-family: $editor-font; font-size: $editor-font-size; line-height: $editor-line-height; - color: $dark-gray-900; + color: $gray-900; p { font-size: inherit; diff --git a/storybook/stories/playground/style.scss b/storybook/stories/playground/style.scss index a9dc2af8c21b8..54423bf6b122d 100644 --- a/storybook/stories/playground/style.scss +++ b/storybook/stories/playground/style.scss @@ -34,7 +34,7 @@ right: 0; bottom: 0; width: $sidebar-width; - border-left: $border-width solid $light-gray-500; + border-left: $border-width solid $gray-200; height: auto; overflow: auto; -webkit-overflow-scrolling: touch; diff --git a/test/integration/blocks-raw-handling.test.js b/test/integration/blocks-raw-handling.test.js index f3ae6e3b2d6ca..4c5129648bb30 100644 --- a/test/integration/blocks-raw-handling.test.js +++ b/test/integration/blocks-raw-handling.test.js @@ -77,7 +77,7 @@ describe( 'Blocks raw handling', () => { ); }, transform: () => { - return createBlock( 'core-embed/youtube', { + return createBlock( 'core/embed', { url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', } ); @@ -200,7 +200,7 @@ describe( 'Blocks raw handling', () => { } ); expect( filtered ).toHaveLength( 1 ); - expect( filtered[ 0 ].name ).toBe( 'core-embed/youtube' ); + expect( filtered[ 0 ].name ).toBe( 'core/embed' ); expect( console ).toHaveLogged(); } ); diff --git a/test/integration/full-content/full-content.test.js b/test/integration/full-content/full-content.test.js index 008239bd612b6..86f5f5c10e271 100644 --- a/test/integration/full-content/full-content.test.js +++ b/test/integration/full-content/full-content.test.js @@ -66,7 +66,6 @@ describe( 'full post content fixture', () => { ); unstable__bootstrapServerSideBlockDefinitions( blockDefinitions ); const settings = { - __experimentalEnableLegacyWidgetBlock: true, __experimentalEnableFullSiteEditing: true, }; // Load all hooks that modify blocks @@ -217,9 +216,7 @@ describe( 'full post content fixture', () => { // `save` functions and attributes. // The `core/template` is not worth testing here because it's never saved, it's covered better in e2e tests. .filter( - ( name ) => - name.indexOf( 'core-embed' ) !== 0 && - name !== 'core/template' + ( name ) => ! [ 'core/embed', 'core/template' ].includes( name ) ) .forEach( ( name ) => { const nameToFilename = blockNameToFixtureBasename( name ); diff --git a/test/native/__mocks__/fileMock.js b/test/native/__mocks__/fileMock.js new file mode 100644 index 0000000000000..59890f6a201a5 --- /dev/null +++ b/test/native/__mocks__/fileMock.js @@ -0,0 +1,3 @@ +// __mocks__/fileMock.js + +module.exports = 'test-file-stub'; diff --git a/test/native/jest.config.js b/test/native/jest.config.js index f4c49f33a68fe..2443e29ef5f4e 100644 --- a/test/native/jest.config.js +++ b/test/native/jest.config.js @@ -30,7 +30,10 @@ module.exports = { '/' + configPath + '/enzyme.config.js', ], testEnvironment: 'jsdom', - testMatch: [ '**/test/*.native.[jt]s?(x)' ], + testMatch: [ + '**/test/*.native.[jt]s?(x)', + '/packages/react-native-*/**/?(*.)+(spec|test).[jt]s?(x)', + ], testPathIgnorePatterns: [ '/node_modules/', '/wordpress/', @@ -46,10 +49,15 @@ module.exports = { moduleNameMapper: { // Mock the CSS modules. See https://facebook.github.io/jest/docs/en/webpack.html#handling-static-assets '\\.(scss)$': '/' + configPath + '/__mocks__/styleMock.js', + '\\.(jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': + '/' + configPath + '/__mocks__/fileMock.js', [ `@wordpress\\/(${ transpiledPackageNames.join( '|' ) })$` ]: '/packages/$1/src', }, + modulePathIgnorePatterns: [ + '/packages/react-native-editor/node_modules', + ], haste: { defaultPlatform: rnPlatform, platforms: [ 'android', 'ios', 'native' ], diff --git a/test/native/jest_ui.config.js b/test/native/jest_ui.config.js new file mode 100644 index 0000000000000..15855a1a261e0 --- /dev/null +++ b/test/native/jest_ui.config.js @@ -0,0 +1,24 @@ +const defaultPlatform = 'android'; +const rnPlatform = process.env.TEST_RN_PLATFORM || defaultPlatform; +if ( process.env.TEST_RN_PLATFORM ) { + // eslint-disable-next-line no-console + console.log( 'Setting RN platform to: ' + rnPlatform ); +} else { + // eslint-disable-next-line no-console + console.log( 'Setting RN platform to: default (' + defaultPlatform + ')' ); +} + +module.exports = { + verbose: true, + rootDir: '../../', + haste: { + defaultPlatform: rnPlatform, + platforms: [ 'android', 'ios', 'native' ], + }, + transform: { + '^.+\\.(js|ts|tsx)$': 'babel-jest', + }, + timers: 'real', + setupFiles: [], + testMatch: [ '**/__device-tests__/**/*.test.[jt]s?(x)' ], +}; diff --git a/test/native/setup.js b/test/native/setup.js index cb2070555d4bc..9ca6804e56454 100644 --- a/test/native/setup.js +++ b/test/native/setup.js @@ -2,8 +2,17 @@ * External dependencies */ import { NativeModules } from 'react-native'; +import 'react-native-gesture-handler/jestSetup'; -jest.mock( 'react-native-gutenberg-bridge', () => { +jest.mock( '@wordpress/element', () => { + return { + __esModule: true, + ...jest.requireActual( '@wordpress/element' ), + render: jest.fn(), + }; +} ); + +jest.mock( '@wordpress/react-native-bridge', () => { return { addEventListener: jest.fn(), removeEventListener: jest.fn(), @@ -70,8 +79,6 @@ jest.mock( 'react-native-safe-area', () => { }; } ); -jest.mock( 'react-native-recyclerview-list' ); - jest.mock( '@react-native-community/slider', () => () => 'Slider', { virtual: true, } ); @@ -92,6 +99,10 @@ jest.mock( 'react-native-hsv-color-picker', () => () => 'HsvColorPicker', { virtual: true, } ); +jest.mock( '@react-native-community/blur', () => () => 'BlurView', { + virtual: true, +} ); + // Overwrite some native module mocks from `react-native` jest preset: // https://github.com/facebook/react-native/blob/master/jest/setup.js // to fix issue "TypeError: Cannot read property 'Commands' of undefined" @@ -112,3 +123,16 @@ Object.keys( mockNativeModules ).forEach( ( module ) => { } ); } } ); + +jest.mock( 'react-native-reanimated', () => { + const Reanimated = require( 'react-native-reanimated/mock' ); + + // The mock for `call` immediately calls the callback which is incorrect + // So we override it with a no-op + Reanimated.default.call = () => {}; + + return Reanimated; +} ); + +// Silence the warning: Animated: `useNativeDriver` is not supported because the native animated module is missing +jest.mock( 'react-native/Libraries/Animated/src/NativeAnimatedHelper' ); diff --git a/test/unit/jest.config.js b/test/unit/jest.config.js index 0a2624d639015..fa37927d7c7c4 100644 --- a/test/unit/jest.config.js +++ b/test/unit/jest.config.js @@ -30,9 +30,14 @@ module.exports = { '/.*/build/', '/.*/build-module/', '/.+.native.js$', + '/packages/react-native-*', ], transform: { '^.+\\.[jt]sx?$': '/test/unit/scripts/babel-transformer.js', }, snapshotSerializers: [ 'enzyme-to-json/serializer', 'jest-emotion' ], + watchPlugins: [ + 'jest-watch-typeahead/filename', + 'jest-watch-typeahead/testname', + ], }; diff --git a/tsconfig.base.json b/tsconfig.base.json index afabdbaf82e30..8f9df2e1104dc 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -5,6 +5,7 @@ "allowSyntheticDefaultImports": true, "jsx": "preserve", "target": "esnext", + "types": ["react", "node", "requestidlecallback"], "module": "esnext", "lib": [ "dom", "esnext" ], "declaration": true, @@ -15,8 +16,6 @@ /* Strict Type-Checking Options */ "strict": true, - "strictNullChecks": true, - "noImplicitAny": true, /* Additional Checks */ "noUnusedLocals": true, @@ -31,7 +30,8 @@ "esModuleInterop": false, "resolveJsonModule": true, - "typeRoots": [ "./node_modules/@types" ] + "typeRoots": [ "./typings", "./node_modules/@types" ], + "types": [] }, "exclude": [ "**/benchmark", @@ -40,6 +40,7 @@ "**/build-*/**", "**/*.android.js", "**/*.ios.js", - "**/*.native.js" + "**/*.native.js", + "./packages/**/react-native-*/**" ] } diff --git a/typings/gutenberg-env/index.d.ts b/typings/gutenberg-env/index.d.ts new file mode 100644 index 0000000000000..387d4239a21c6 --- /dev/null +++ b/typings/gutenberg-env/index.d.ts @@ -0,0 +1,7 @@ +interface Environment { + NODE_ENV?: unknown; +} +interface Process { + env?: Environment; +} +declare var process: Process; diff --git a/webpack.config.js b/webpack.config.js index 84c93c9f4cf66..9ae4c4743c7df 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -4,6 +4,7 @@ const { BundleAnalyzerPlugin } = require( 'webpack-bundle-analyzer' ); const { DefinePlugin } = require( 'webpack' ); const CopyWebpackPlugin = require( 'copy-webpack-plugin' ); +const TerserPlugin = require( 'terser-webpack-plugin' ); const postcss = require( 'postcss' ); const { get, escapeRegExp, compact } = require( 'lodash' ); const { basename, sep } = require( 'path' ); @@ -35,7 +36,8 @@ const gutenbergPackages = Object.keys( dependencies ) .filter( ( packageName ) => ! BUNDLED_PACKAGES.includes( packageName ) && - packageName.startsWith( WORDPRESS_NAMESPACE ) + packageName.startsWith( WORDPRESS_NAMESPACE ) && + ! packageName.startsWith( WORDPRESS_NAMESPACE + 'react-native' ) ) .map( ( packageName ) => packageName.replace( WORDPRESS_NAMESPACE, '' ) ); @@ -44,6 +46,19 @@ module.exports = { // Only concatenate modules in production, when not analyzing bundles. concatenateModules: mode === 'production' && ! process.env.WP_BUNDLE_ANALYZER, + minimizer: [ + new TerserPlugin( { + cache: true, + parallel: true, + sourceMap: mode !== 'production', + terserOptions: { + output: { + comments: /translators:/i, + }, + }, + extractComments: false, + } ), + ], }, mode, entry: gutenbergPackages.reduce( ( memo, packageName ) => { @@ -201,6 +216,7 @@ module.exports = { ].filter( Boolean ), watchOptions: { ignored: '!packages/*/!(src)/**/*', + aggregateTimeout: 500, }, devtool, };