diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md index 20aa7016d17e90..0c5bcb7b300122 100644 --- a/.github/ISSUE_TEMPLATE/Bug_report.md +++ b/.github/ISSUE_TEMPLATE/Bug_report.md @@ -20,6 +20,11 @@ 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 has 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] + **Desktop (please complete the following information):** - OS: [e.g. iOS] - Browser [e.g. chrome, safari] @@ -32,5 +37,4 @@ If applicable, add screenshots to help explain your problem. - Version [e.g. 22] **Additional context** -- Please add the version of Gutenberg you are using in the description. - To report a security issue, please visit the WordPress HackerOne program: https://hackerone.com/wordpress. diff --git a/.travis.yml b/.travis.yml index baf9a3bb3d4318..b39f8565c5683a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,10 +24,8 @@ branches: env: global: - - PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true - WP_DEVELOP_DIR: ./wordpress - LOCAL_SCRIPT_DEBUG: false - - INSTALL_COMPOSER: false - INSTALL_WORDPRESS: true # Make sure NodeGit gets the correct C libs. @@ -89,10 +87,6 @@ install: npm run env connect npm run env cli plugin activate gutenberg fi - - | - if [[ "$INSTALL_COMPOSER" = "true" ]]; then - npm run env docker-run -- php composer install --no-interaction - fi - | if [[ "$E2E_ROLE" = "author" ]]; then npm run env cli -- user create author author@example.com --role=author --user_pass=authpass @@ -159,59 +153,58 @@ jobs: - npm run test-unit:native -- --ci --maxWorkers=2 --cacheDirectory="$HOME/.jest-cache" - name: PHP unit tests - env: INSTALL_COMPOSER=true script: - npm run test-php && npm run test-unit-php-multisite - name: PHP unit tests (PHP 5.6) - env: INSTALL_COMPOSER=true LOCAL_PHP=5.6-fpm + 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 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD= + 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 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD= + 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 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD= + 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 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD= + 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 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD= + 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 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD= + 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 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD= + 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 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD= + 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 ) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bb46ac5f3a2385..9381a3cd9f2af5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,7 +12,7 @@ To learn all about contributing to the Gutenberg project, see the [Contributor G - Documentation? See the [documentation section](/docs/contributors/document.md). -- Triage? We need help reviewing existing issues to make sure they’re relevant and actionable. Triage is an important contribution because it allows us to work on the highest priority issues. To learn more, please see the [triaging issues section](docs/contributors/repository-management.md#triaging-issues). +- Triage? We need help reviewing existing issues to make sure they’re relevant and actionable. Triage is an important contribution because it allows us to work on the highest priority issues. To learn more, please see the [triaging issues section](docs/contributors/triage.md). ## Guidelines diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index e1ed7443bbf027..9a845864a4a459 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -145,3 +145,4 @@ This list is manually curated to include valuable contributions by volunteers th | @akkspros | @passoniate | | @anthonyledesma | @paranoia1906 | | @richtabor | @richtabor | +| @mikehaydon | @intelliwolf | diff --git a/bin/api-docs/update-api-docs.js b/bin/api-docs/update-api-docs.js index fd09b901a5ab39..985ff462ba0c22 100755 --- a/bin/api-docs/update-api-docs.js +++ b/bin/api-docs/update-api-docs.js @@ -203,16 +203,31 @@ glob.stream( [ // so the tokens must be replaced in sequence to prevent the processes // from overriding each other. for ( const [ token, path ] of tokens ) { - await execa( - join( __dirname, '..', '..', 'node_modules', '.bin', 'docgen' ), - [ - relative( ROOT_DIR, resolve( dirname( file ), path ) ), - `--output ${ output }`, - '--to-token', - `--use-token "${ token }"`, - '--ignore "/unstable|experimental/i"', - ], - { shell: true } - ); + try { + await execa( + join( + __dirname, + '..', + '..', + 'node_modules', + '.bin', + 'docgen' + ), + [ + relative( ROOT_DIR, resolve( dirname( file ), path ) ), + `--output ${ output }`, + '--to-token', + `--use-token "${ token }"`, + '--ignore "/unstable|experimental/i"', + ], + { shell: true } + ); + } catch ( error ) { + // Disable reason: Errors should log to console. + + // eslint-disable-next-line no-console + console.error( error ); + process.exit( 1 ); + } } } ); diff --git a/bin/build-plugin-zip.sh b/bin/build-plugin-zip.sh index 4aea6ac016c1e8..26ef45f7b337f4 100755 --- a/bin/build-plugin-zip.sh +++ b/bin/build-plugin-zip.sh @@ -99,7 +99,7 @@ done # Run the build. status "Installing dependencies... 📦" -PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true npm install +npm install status "Generating build... 👷‍♀️" npm run build diff --git a/changelog.txt b/changelog.txt index d2002de99fb165..db0125253dfa72 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,6 +1,166 @@ == Changelog == -= 7.9.0-rc.1 = += 8.0.0 = + +### Features + +- Add subscript and superscript formatting options. ([21819](https://github.com/WordPress/gutenberg/pull/21819)) +- Move the Block Patterns UI to the inserter. ([20951](https://github.com/WordPress/gutenberg/pull/20951)) +- Improve layout and usability of code editor. ([21643](https://github.com/WordPress/gutenberg/pull/21643)) + +### Enhancements + +- Add inserter previews to more blocks. ([21740](https://github.com/WordPress/gutenberg/pull/21740)) +- Performance improvements: + - Import from individual react-dates component. ([21914](https://github.com/WordPress/gutenberg/pull/21914)) + - Upgrade showdown Markdown processor library. ([21862](https://github.com/WordPress/gutenberg/pull/21862)) +- Allow title and button-based appender to inherit styles. ([21749](https://github.com/WordPress/gutenberg/pull/21749)) +- Output float clearing for all centered blocks. ([21608](https://github.com/WordPress/gutenberg/pull/21608)) +- Update 'Welcome Guide' illustrations. ([21515](https://github.com/WordPress/gutenberg/pull/21515)) + +### New APIs + +- A new [Block Context API](https://github.com/WordPress/gutenberg/blob/master/docs/designers-developers/developers/block-api/block-context.md) has been partially implemented, currently limited to block settings and editor APIs. PHP APIs will be implemented in the next plugin releases. ([21467](https://github.com/WordPress/gutenberg/pull/21467), [21868](https://github.com/WordPress/gutenberg/pull/21868), [21921](https://github.com/WordPress/gutenberg/pull/21921)) +- Add new "G2"-styled icons to the Icons package. ([21209](https://github.com/WordPress/gutenberg/pull/21209)) + +### Bug Fixes + +- Change `wp_make_content_images_responsive` to `wp_filter_content_tags` to resolve warnings in WordPress 5.5-alpha. ([21514](https://github.com/WordPress/gutenberg/pull/21514)) +- Collapse selection to end after link insertion. ([17126](https://github.com/WordPress/gutenberg/pull/17126)) +- Fix selected category on existing Latest Posts blocks. ([21359](https://github.com/WordPress/gutenberg/pull/21359)) +- Fix overlapping column contents for embeds. ([21570](https://github.com/WordPress/gutenberg/pull/21570)) +- Fix focus styling for date picker calendar days. ([21600](https://github.com/WordPress/gutenberg/pull/21600)) +- NPM Packages + - Fix "Cannot find module '../utils'" error. ([21609](https://github.com/WordPress/gutenberg/pull/21609)) + - Types: Hide element, primitives, icons declarations. ([21613](https://github.com/WordPress/gutenberg/pull/21613), [21784](https://github.com/WordPress/gutenberg/pull/21784)) +- Inherit font styles in block appender placeholder. ([21725](https://github.com/WordPress/gutenberg/pull/21725)) +- Allow default pasting behavior in FontSizePicker. ([21812](https://github.com/WordPress/gutenberg/pull/21812)) +- Prevent negative custom text sizes. ([21815](https://github.com/WordPress/gutenberg/pull/21815)) +- Fix image center alignment behavior. ([21911](https://github.com/WordPress/gutenberg/pull/21911)) +- Fix centered buttons margins. ([21947](https://github.com/WordPress/gutenberg/pull/21947)) +- Revert the button block to the previous markup. ([21923](https://github.com/WordPress/gutenberg/pull/21923)) +- Avoid using inline RichText element for navigation link. ([21856](https://github.com/WordPress/gutenberg/pull/21856)) +- Ensure `resetEditorBlocks` is synchronous. ([21839](https://github.com/WordPress/gutenberg/pull/21839)) +- Fix the button outline style for the old button markup. ([21816](https://github.com/WordPress/gutenberg/pull/21816)) +- Fix default attribute on audio preload. ([21735](https://github.com/WordPress/gutenberg/pull/21735)) +- Fix gradient picker double-click bug. ([21732](https://github.com/WordPress/gutenberg/pull/21732)) +- Fix broken links in handbook. ([21686](https://github.com/WordPress/gutenberg/pull/21686)) +- Make `useMediaQuery` return the correct value on the first render. ([21682](https://github.com/WordPress/gutenberg/pull/21682)) +- Fix visual issue on windows with 782px. ([21661](https://github.com/WordPress/gutenberg/pull/21661)) +- Allow wrapping for Navigation block links. ([21632](https://github.com/WordPress/gutenberg/pull/21632)) +- Remove redundant margins from the columns block. ([21615](https://github.com/WordPress/gutenberg/pull/21615)) +- Fix media Text padding on inner blocks. ([21612](https://github.com/WordPress/gutenberg/pull/21612)) +- Restore floated image margins. ([21500](https://github.com/WordPress/gutenberg/pull/21500)) +- Fix URL display for scheduled posts. ([21410](https://github.com/WordPress/gutenberg/pull/21410)) +- Test keycode modifiers for keyboard event as exclusive set. ([20733](https://github.com/WordPress/gutenberg/pull/20733)) +- Fix focus loss for Guide "Finish" button in Internet Explorer. ([20599](https://github.com/WordPress/gutenberg/pull/20599)) +- Replace incorrect Snackbar `label` attribute with `aria-label`. ([20540](https://github.com/WordPress/gutenberg/pull/20540)) + +### Experiments + +- Add experimental `useEditorFeature` hook to simplify access to editor features. ([21646](https://github.com/WordPress/gutenberg/pull/21646)) +- Navigation menu page: + - Try a fixed toolbar in the navigation page. ([21340](https://github.com/WordPress/gutenberg/pull/21340)) + - Fix panel collapsing in navigation page. ([21633](https://github.com/WordPress/gutenberg/pull/21633)) + - Fix mobile layout for navigation menu page. ([21638](https://github.com/WordPress/gutenberg/pull/21638)) + - Delete empty spaces in menu REST API endpoint strings. ([21453](https://github.com/WordPress/gutenberg/pull/21453)) +- Edit site: + - Add current theme to template switcher. ([21578](https://github.com/WordPress/gutenberg/pull/21578), [21768](https://github.com/WordPress/gutenberg/pull/21768)) + - Declare attributes for Template Part block in `block.json`. ([21796](https://github.com/WordPress/gutenberg/pull/21796)) + - Update end-to-end test for multi-entity saving in site editor. ([21363](https://github.com/WordPress/gutenberg/pull/21363)) + - Add preview options component. ([21309](https://github.com/WordPress/gutenberg/pull/21309)) + - Improve template parts resolution and saving behavior. ([21766](https://github.com/WordPress/gutenberg/pull/21766)) + - Support REST API meta queries. ([21851](https://github.com/WordPress/gutenberg/pull/21851)) + - Add extra validation when loading template parts. ([21636](https://github.com/WordPress/gutenberg/pull/21636)) +- Block directory: + - Add InserterPanel around block directory results. ([21748](https://github.com/WordPress/gutenberg/pull/21748)) +- Widgets: + - Fix legacy widgets z-index issue. ([21586](https://github.com/WordPress/gutenberg/pull/21586)) + - Fix legacy widgets visual issues. ([21585](https://github.com/WordPress/gutenberg/pull/21585)) + +### Deprecations + +- Add deprecation notice to `useApiFetch` hook. ([21723](https://github.com/WordPress/gutenberg/pull/21723)) + +### Code Quality + +- Remove nested breakpoint in fullscreen mode CSS. ([21496](https://github.com/WordPress/gutenberg/pull/21496)) +- Update npm-package-json-lint from 4.0.3 to 5.0.0. ([21597](https://github.com/WordPress/gutenberg/pull/21597)) +- Update npm dependencies that warn. ([21596](https://github.com/WordPress/gutenberg/pull/21596)) +- Fix license check script to ignore sub-dependencies of ignored packages. ([21606](https://github.com/WordPress/gutenberg/pull/21606)) +- Package TypeScript types improvements: + - Mark addQueryArgs arguments parameter as optional. ([21926](https://github.com/WordPress/gutenberg/pull/21926)) + - Relax i18n sprintf arguments type. ([21919](https://github.com/WordPress/gutenberg/pull/21919)) +- Update PHPCS to latest version. ([21680](https://github.com/WordPress/gutenberg/pull/21680)) +- Unify how editor alignments are applied across blocks. ([21822](https://github.com/WordPress/gutenberg/pull/21822)) +- Remove obsolete editor alignment classes. ([21906](https://github.com/WordPress/gutenberg/pull/21906)) +- Remove old icons. ([21821](https://github.com/WordPress/gutenberg/pull/21821)) +- Implement `block.json` for blocks. ([21794](https://github.com/WordPress/gutenberg/pull/21794), [21783](https://github.com/WordPress/gutenberg/pull/21783), [21782](https://github.com/WordPress/gutenberg/pull/21782), [21775](https://github.com/WordPress/gutenberg/pull/21775), [21787](https://github.com/WordPress/gutenberg/pull/21787), [21774](https://github.com/WordPress/gutenberg/pull/21774), [21792](https://github.com/WordPress/gutenberg/pull/21792)) +- Use `register_block_type_from_metadata` in Latest Posts block. ([21788](https://github.com/WordPress/gutenberg/pull/21788)) +- Polish RSS block code. ([21773](https://github.com/WordPress/gutenberg/pull/21773)) +- Move `camelCaseDash` to the package where it is consumed. ([21736](https://github.com/WordPress/gutenberg/pull/21736)) +- Improve URLPopover code from review comments. ([21621](https://github.com/WordPress/gutenberg/pull/21621)) + +### Documentation + +- Remove duplicate sentence in glossary documentation. ([21565](https://github.com/WordPress/gutenberg/pull/21565)) +- Update `wp-env` docs to reflect current functionality of package. ([21809](https://github.com/WordPress/gutenberg/pull/21809)) +- Extract Block Transforms into its own handbook page. ([21734](https://github.com/WordPress/gutenberg/pull/21734)) +- Update the index of Block API to reflect current contents. ([21726](https://github.com/WordPress/gutenberg/pull/21726)) +- Clarify attribute type documentation. ([21694](https://github.com/WordPress/gutenberg/pull/21694)) +- Add location for components `style.css`. ([21654](https://github.com/WordPress/gutenberg/pull/21654)) +- Fix the JSDoc return type for `getEntityRecords`. ([21630](https://github.com/WordPress/gutenberg/pull/21630)) +- Update triage links to new document. ([21629](https://github.com/WordPress/gutenberg/pull/21629)) +- Update Getting Started instructions for remote server. ([21625](https://github.com/WordPress/gutenberg/pull/21625)) +- Update the "patterns" to reflect "user interface" instead. ([21562](https://github.com/WordPress/gutenberg/pull/21562)) +- Create document for contributing with triage. ([21350](https://github.com/WordPress/gutenberg/pull/21350)) +- Update triage.md to add more clarity and relevant links. ([21802](https://github.com/WordPress/gutenberg/pull/21802)) + +### Project Management + +- Update bug report template to help identify the editor version. ([21564](https://github.com/WordPress/gutenberg/pull/21564)) + +### Various + +- End-to-end tests: + - Add test for template part block creation and insertion. ([21849](https://github.com/WordPress/gutenberg/pull/21849)) + - Add test that template part block customizations are loaded from slug and theme attributes. ([21852](https://github.com/WordPress/gutenberg/pull/21852)) + - Fix tests by removing unnecessary assertions and properly install dependencies in `@wordpress/api-fetch`. ([21780](https://github.com/WordPress/gutenberg/pull/21780)) + - Add end-to-end test for pinned sidebar items. ([21652](https://github.com/WordPress/gutenberg/pull/21652)) + - Add test which verifies reusable block after refresh. ([20605](https://github.com/WordPress/gutenberg/pull/20605)) +- Update cleanForSlug() to remove additional non-word characters. ([21007](https://github.com/WordPress/gutenberg/pull/21007)) +- `@wordpress/scripts`: + - Support debugging with `test-unit-js`. ([21631](https://github.com/WordPress/gutenberg/pull/21631), [21861](https://github.com/WordPress/gutenberg/pull/21861)) + - Install Chromium on demand together with `test-e2e` script. ([20215](https://github.com/WordPress/gutenberg/pull/20215)) +- `@wordpress/create-block` block scaffold tool: + - Make it easier to provide most popular CLI options. ([21751](https://github.com/WordPress/gutenberg/pull/21751)) + - Split JavaScript source files into parts for ESNext template. ([21750](https://github.com/WordPress/gutenberg/pull/21750)) +- `@wordpress/env` development environment: + - Expose port 3306 of MySQL container. ([21545](https://github.com/WordPress/gutenberg/pull/21545)) +- `@wordpress/eslint-plugin`: + - Add the recommended Prettier config to enforce WP coding styles. ([21602](https://github.com/WordPress/gutenberg/pull/21602)) + - Fix `no-unused-vars-before-return` JSX identifier reference. ([21358](https://github.com/WordPress/gutenberg/pull/21358)) +- Navigation block: + - Revert changes to data fetching mechanics. ([21721](https://github.com/WordPress/gutenberg/pull/21721)) +- Bundle the block autocompleter in the block-editor package. ([21534](https://github.com/WordPress/gutenberg/pull/21534)) +- Storybook: + - Add FormToggle component. ([18085](https://github.com/WordPress/gutenberg/pull/18085)) +- Simplify Reusable Block description. ([21470](https://github.com/WordPress/gutenberg/pull/21470)) +- Build tooling: + - Install Composer dependencies as pre-lint step. ([21537](https://github.com/WordPress/gutenberg/pull/21537)) + - Configure Webpack to watch only build files. ([21489](https://github.com/WordPress/gutenberg/pull/21489)) + - Exit with non-zero status on docgen failed parse. ([21690](https://github.com/WordPress/gutenberg/pull/21690)) + + += 7.9.1 = + +### Bug Fixes + + - Make sidebar plugins pinned by default. + - Fix the button styles for old content. + + += 7.9.0 = ### Features @@ -25,8 +185,8 @@ - Update all block previews to use the auto-height behavior. [21014](https://github.com/WordPress/gutenberg/pull/21014) - Disable autocomplete for custom class name inputs. [21110](https://github.com/WordPress/gutenberg/pull/21110) - Several small tweaks to the new Block UI. [21476](https://github.com/WordPress/gutenberg/pull/21476) -- Unify the focus styles across the UI. [21141](https://github.com/WordPress/gutenberg/pull/21141) -- Improve block focus style. [21498](https://github.com/WordPress/gutenberg/pull/21498) +- Unify the focus styles across the UI. [21141](https://github.com/WordPress/gutenberg/pull/21141) +- Improve block focus style. [21498](https://github.com/WordPress/gutenberg/pull/21498) - Remove the post permalink UI from the post title. [21099](https://github.com/WordPress/gutenberg/pull/21099) - Style the default toolbar buttons. [21252](https://github.com/WordPress/gutenberg/pull/21252) - Style tweaks to the patterns library sidebar. [21263](https://github.com/WordPress/gutenberg/pull/21263) @@ -166,7 +326,7 @@ - Exclude native files from type checking. [21491](https://github.com/WordPress/gutenberg/pull/21491) - docgen: Optimize README update script. [18840](https://github.com/WordPress/gutenberg/pull/18840) - Check Latest NPM on npm install. [21521](https://github.com/WordPress/gutenberg/pull/21521) -- E2E Tests: +- E2E Tests: - Improve stability of image block test [21174](https://github.com/WordPress/gutenberg/pull/21174) - Improve Allowed Inner Blocks test stability [21175](https://github.com/WordPress/gutenberg/pull/21175) - Use waitForSelector to wait for sidebar presence [21180](https://github.com/WordPress/gutenberg/pull/21180) @@ -197,6 +357,7 @@ - Build: Add TypeScript version validation [21208](https://github.com/WordPress/gutenberg/pull/21208) + = 7.8.1 = @@ -357,60 +518,60 @@ ### Enhancements -- Update the Block and editor UI. [19344](https://github.com/WordPress/gutenberg/pull/19344) - - New icons. [20464](https://github.com/WordPress/gutenberg/pull/20464) +- Update the Block and editor UI. [19344](https://github.com/WordPress/gutenberg/pull/19344) + - New icons. [20464](https://github.com/WordPress/gutenberg/pull/20464) - Avoid empty menu groups. [20495](https://github.com/WordPress/gutenberg/pull/20495) - Block Placeholders. [20441](https://github.com/WordPress/gutenberg/pull/20441), [20676](https://github.com/WordPress/gutenberg/pull/20676). - Various tweaks [20679](https://github.com/WordPress/gutenberg/pull/20679), [20578](https://github.com/WordPress/gutenberg/pull/20578). -- Improve the Back to WP Admin button in Fullscreen Mode. [20603](https://github.com/WordPress/gutenberg/pull/20603) -- Make the editor Fullscreen by default. [20611](https://github.com/WordPress/gutenberg/pull/20611) -- Remove template locking from the columns block [20465](https://github.com/WordPress/gutenberg/pull/20465) -- Make the inserter full height. [20526](https://github.com/WordPress/gutenberg/pull/20526) +- Improve the Back to WP Admin button in Fullscreen Mode. [20603](https://github.com/WordPress/gutenberg/pull/20603) +- Make the editor Fullscreen by default. [20611](https://github.com/WordPress/gutenberg/pull/20611) +- Remove template locking from the columns block [20465](https://github.com/WordPress/gutenberg/pull/20465) +- Make the inserter full height. [20526](https://github.com/WordPress/gutenberg/pull/20526) ### Bug Fixes -- A11y: - - Deselect first/last gallery images on blur. [14930](https://github.com/WordPress/gutenberg/pull/14930) - - Revert top toolbar tab order [20571](https://github.com/WordPress/gutenberg/pull/20571) -- Add an overlay to the html block preview to fix block selection in Firefox. [20425](https://github.com/WordPress/gutenberg/pull/20425) +- A11y: + - Deselect first/last gallery images on blur. [14930](https://github.com/WordPress/gutenberg/pull/14930) + - Revert top toolbar tab order [20571](https://github.com/WordPress/gutenberg/pull/20571) +- Add an overlay to the html block preview to fix block selection in Firefox. [20425](https://github.com/WordPress/gutenberg/pull/20425) - Add missing accessibility attributes in the SVG icons. [20538](https://github.com/WordPress/gutenberg/pull/20538) - Fix invalid syntax error on Safari 12. [20507](https://github.com/WordPress/gutenberg/pull/20507) -- Use a consistent width for the link suggetions. [20448](https://github.com/WordPress/gutenberg/pull/20448) -- Use full labels for directional block movers. [20664](https://github.com/WordPress/gutenberg/pull/20664) +- Use a consistent width for the link suggetions. [20448](https://github.com/WordPress/gutenberg/pull/20448) +- Use full labels for directional block movers. [20664](https://github.com/WordPress/gutenberg/pull/20664) - Columns block: Force 50% column width at mid-range viewport. [20597](https://github.com/WordPress/gutenberg/pull/20597) - Media & Text block: Fix frontend styles when "Crop image to fill" is selected [20539](https://github.com/WordPress/gutenberg/pull/20539) -- Latest Post block: +- Latest Post block: - Fix the excerpt length. [20313](https://github.com/WordPress/gutenberg/pull/20313) - Don't trim manual exerptts [20432](https://github.com/WordPress/gutenberg/pull/20432) -- Fix sidebar scroll issue on small viewports. [20491](https://github.com/WordPress/gutenberg/pull/20491) -- Social Link block: - - Escape generated class name. [20479](https://github.com/WordPress/gutenberg/pull/20479) - - Fix label attribute type as string. [20468](https://github.com/WordPress/gutenberg/pull/20468) - - i18n: Use placeholder for the default label [20475](https://github.com/WordPress/gutenberg/pull/20475) +- Fix sidebar scroll issue on small viewports. [20491](https://github.com/WordPress/gutenberg/pull/20491) +- Social Link block: + - Escape generated class name. [20479](https://github.com/WordPress/gutenberg/pull/20479) + - Fix label attribute type as string. [20468](https://github.com/WordPress/gutenberg/pull/20468) + - i18n: Use placeholder for the default label [20475](https://github.com/WordPress/gutenberg/pull/20475) - Simulated Queries (Device previews): - - Check for match in stylesheet host and protocol to prevent Chrome breakage. [20673](https://github.com/WordPress/gutenberg/pull/20673) - - Fix IE11 editor breakage. [20226](https://github.com/WordPress/gutenberg/pull/20226) - - Fix incorrectly displayed preview option for private post types. [20604](https://github.com/WordPress/gutenberg/pull/20604) + - Check for match in stylesheet host and protocol to prevent Chrome breakage. [20673](https://github.com/WordPress/gutenberg/pull/20673) + - Fix IE11 editor breakage. [20226](https://github.com/WordPress/gutenberg/pull/20226) + - Fix incorrectly displayed preview option for private post types. [20604](https://github.com/WordPress/gutenberg/pull/20604) - Focus preview button after opening preview. [20570](https://github.com/WordPress/gutenberg/pull/20570) - Fix isURL regex to take account file urls. [20435](https://github.com/WordPress/gutenberg/pull/20435) -- Fix error when deleting empty paragraphs in IE11. [20594](https://github.com/WordPress/gutenberg/pull/20594) -- Fix hidden inserter toggle behind the popover. [20663](https://github.com/WordPress/gutenberg/pull/20663) +- Fix error when deleting empty paragraphs in IE11. [20594](https://github.com/WordPress/gutenberg/pull/20594) +- Fix hidden inserter toggle behind the popover. [20663](https://github.com/WordPress/gutenberg/pull/20663) - Fix block registration shared defaults reuse across blocks. [20565](https://github.com/WordPress/gutenberg/pull/20565) - Shim meta attributes for early block registrations. [20544](https://github.com/WordPress/gutenberg/pull/20544) -- Fix bouncing Custom color formatter. [20612](https://github.com/WordPress/gutenberg/pull/20612) +- Fix bouncing Custom color formatter. [20612](https://github.com/WordPress/gutenberg/pull/20612) - Fix Gallery block styles in Edge causing editor breakage. [20690](https://github.com/WordPress/gutenberg/pull/20690) ### New APIs: -- @wordpress/env: Add support for ZIP URL sources. [20426](https://github.com/WordPress/gutenberg/pull/20426) +- @wordpress/env: Add support for ZIP URL sources. [20426](https://github.com/WordPress/gutenberg/pull/20426) ### Experiments -- Lighter Block DOM: allow block types to render their own wrapper [19701](https://github.com/WordPress/gutenberg/pull/19701) - - Lighter InnerBlocks. [19910](https://github.com/WordPress/gutenberg/pull/19910) - - Automatically add block class. [20658](https://github.com/WordPress/gutenberg/pull/20658) -- BlockPreview: Add __experimentalOnReady prop. [17242](https://github.com/WordPress/gutenberg/pull/17242) -- Edit Site: +- Lighter Block DOM: allow block types to render their own wrapper [19701](https://github.com/WordPress/gutenberg/pull/19701) + - Lighter InnerBlocks. [19910](https://github.com/WordPress/gutenberg/pull/19910) + - Automatically add block class. [20658](https://github.com/WordPress/gutenberg/pull/20658) +- BlockPreview: Add __experimentalOnReady prop. [17242](https://github.com/WordPress/gutenberg/pull/17242) +- Edit Site: - Update template navigation to use new link control. [20366](https://github.com/WordPress/gutenberg/pull/20366) - Update the edit site save modal UI. [20608](https://github.com/WordPress/gutenberg/pull/20608) - Fix the block toolbar in the Widgets and Site Edit screens. [20458](https://github.com/WordPress/gutenberg/pull/20458) @@ -418,55 +579,55 @@ ### Documentation -- Add tutorial for creating a custom block editor instance. [20410](https://github.com/WordPress/gutenberg/pull/20410) -- Create a new "Gutenberg as a Platform" page. [20666](https://github.com/WordPress/gutenberg/pull/20666) +- Add tutorial for creating a custom block editor instance. [20410](https://github.com/WordPress/gutenberg/pull/20410) +- Create a new "Gutenberg as a Platform" page. [20666](https://github.com/WordPress/gutenberg/pull/20666) - Typos and tweaks: [20382](https://github.com/WordPress/gutenberg/pull/20382), [20386](https://github.com/WordPress/gutenberg/pull/20386), [20517](https://github.com/WordPress/gutenberg/pull/20517), [20662](https://github.com/WordPress/gutenberg/pull/20662), [20454](https://github.com/WordPress/gutenberg/pull/20454), [20659](https://github.com/WordPress/gutenberg/pull/20659). ### Code Quality - Refactoring to existing blocks to use a lighter DOM: - - List block. [20498](https://github.com/WordPress/gutenberg/pull/20498) - - Image block. [20576](https://github.com/WordPress/gutenberg/pull/20576) - - Heading. [20493](https://github.com/WordPress/gutenberg/pull/20493) + - List block. [20498](https://github.com/WordPress/gutenberg/pull/20498) + - Image block. [20576](https://github.com/WordPress/gutenberg/pull/20576) + - Heading. [20493](https://github.com/WordPress/gutenberg/pull/20493) - Consistent block focus behaviour on mount. [20577](https://github.com/WordPress/gutenberg/pull/20577) -- Cleanup CSS variables. [20529](https://github.com/WordPress/gutenberg/pull/20529) +- Cleanup CSS variables. [20529](https://github.com/WordPress/gutenberg/pull/20529) - Use the EditorSkeleton component in the widgets and Edit Site pages. [20440](https://github.com/WordPress/gutenberg/pull/20440), [20431](https://github.com/WordPress/gutenberg/pull/20431). - Refactor SlotFill components. [19242](https://github.com/WordPress/gutenberg/pull/19242) - Remove useless style override for floats. [20501](https://github.com/WordPress/gutenberg/pull/20501) -- Block popover: remove data-type. [20531](https://github.com/WordPress/gutenberg/pull/20531) +- Block popover: remove data-type. [20531](https://github.com/WordPress/gutenberg/pull/20531) - Resizable editor improvements. [20259](https://github.com/WordPress/gutenberg/pull/20259) ### Various - @wordpress/env: - Save the database as a volume. [20648](https://github.com/WordPress/gutenberg/pull/20648) - - Fix accidental quotes in Site Title. [20520](https://github.com/WordPress/gutenberg/pull/20520) - - Set owner of wp-content to www-data. [20406](https://github.com/WordPress/gutenberg/pull/20406) -- @wordpress/create-block: + - Fix accidental quotes in Site Title. [20520](https://github.com/WordPress/gutenberg/pull/20520) + - Set owner of wp-content to www-data. [20406](https://github.com/WordPress/gutenberg/pull/20406) +- @wordpress/create-block: - Fix system requirements checks. [20461](https://github.com/WordPress/gutenberg/pull/20461) [20456](https://github.com/WordPress/gutenberg/pull/20456) -- Fix React warning triggered by the BlockToolbar component. [20546](https://github.com/WordPress/gutenberg/pull/20546) +- Fix React warning triggered by the BlockToolbar component. [20546](https://github.com/WordPress/gutenberg/pull/20546) - Skip the Type Writer effect component in IE 11. [20485](https://github.com/WordPress/gutenberg/pull/20485) -- Update browserslist to fix out-of-date caniuse-lite messages [20709](https://github.com/WordPress/gutenberg/pull/20709) +- Update browserslist to fix out-of-date caniuse-lite messages [20709](https://github.com/WordPress/gutenberg/pull/20709) - Add storybook stories: - TextControl [20467](https://github.com/WordPress/gutenberg/pull/20467) - - TextAreaControl [20472](https://github.com/WordPress/gutenberg/pull/20472) - - SelectControl [20482](https://github.com/WordPress/gutenberg/pull/20482) + - TextAreaControl [20472](https://github.com/WordPress/gutenberg/pull/20472) + - SelectControl [20482](https://github.com/WordPress/gutenberg/pull/20482) - Tooltip [20322](https://github.com/WordPress/gutenberg/pull/20322) - E2E Tests: - Add test for the Image block. [20622](https://github.com/WordPress/gutenberg/pull/20622) - - More stable embed test. [20668](https://github.com/WordPress/gutenberg/pull/20668) - - Fix intermittent RichText e2e test failure. [20457](https://github.com/WordPress/gutenberg/pull/20457) -- Travis: Avoid skipping Puppeteer download. [20547](https://github.com/WordPress/gutenberg/pull/20547) -- Plugin: Bump minimum WordPress version to 5.3 [20628](https://github.com/WordPress/gutenberg/pull/20628) -- @wordrpess/priority-queue: Fix for environments that don't have `window` defined. [20486](https://github.com/WordPress/gutenberg/pull/20486) -- Update jest configuration to only ignore tests from /wordpress/ as a subdirectory [20420](https://github.com/WordPress/gutenberg/pull/20420) + - More stable embed test. [20668](https://github.com/WordPress/gutenberg/pull/20668) + - Fix intermittent RichText e2e test failure. [20457](https://github.com/WordPress/gutenberg/pull/20457) +- Travis: Avoid skipping Puppeteer download. [20547](https://github.com/WordPress/gutenberg/pull/20547) +- Plugin: Bump minimum WordPress version to 5.3 [20628](https://github.com/WordPress/gutenberg/pull/20628) +- @wordrpess/priority-queue: Fix for environments that don't have `window` defined. [20486](https://github.com/WordPress/gutenberg/pull/20486) +- Update jest configuration to only ignore tests from /wordpress/ as a subdirectory [20420](https://github.com/WordPress/gutenberg/pull/20420) = 7.6.0 = ## Features -- Add a rotating list of tips to the inserter help panel [20163](https://github.com/WordPress/gutenberg/pull/20163) +- Add a rotating list of tips to the inserter help panel [20163](https://github.com/WordPress/gutenberg/pull/20163) ## Enhancements - Improve find-ability for social/video embeds [20224](https://github.com/WordPress/gutenberg/pull/20224) @@ -475,7 +636,7 @@ - Ensure packages-update wp-scripts command works with missing dependencies [20408](https://github.com/WordPress/gutenberg/pull/20408) - Add new option in dependencies webpack plugin to combine assets files into one file [20330](https://github.com/WordPress/gutenberg/pull/20330) - Environment: - - Add custom port numbers to .wp-env.json [20158](https://github.com/WordPress/gutenberg/pull/20158) + - Add custom port numbers to .wp-env.json [20158](https://github.com/WordPress/gutenberg/pull/20158) - Add support for local override files. [20341](https://github.com/WordPress/gutenberg/pull/20341) - Add debug mode. [20348](https://github.com/WordPress/gutenberg/pull/20348) @@ -493,42 +654,42 @@ - Show error when resolved block template is empty [20239](https://github.com/WordPress/gutenberg/pull/20239) ## Bug Fixes -- Overflowing `LinkControl` block editor component. [20154](https://github.com/WordPress/gutenberg/pull/20154) -- Broken gallery to image transform and inconsistent types used in the gallery block [20084](https://github.com/WordPress/gutenberg/pull/20084) -- Missing label on heading toolbar. [20248](https://github.com/WordPress/gutenberg/pull/20248) -- Sidebar jumpiness. [20355](https://github.com/WordPress/gutenberg/pull/20355) -- Fix wrong imports in PluginBlockSettingsMenuItem [20356](https://github.com/WordPress/gutenberg/pull/20356) -- Color formatter appears when color choosing is not possible [20222](https://github.com/WordPress/gutenberg/pull/20222) -- Crash when updating a post with the latest post block [20289](https://github.com/WordPress/gutenberg/pull/20289) -- Inconsistency on Import from JSON button look [20416](https://github.com/WordPress/gutenberg/pull/20416) -- Inline image width pop-up 'wanders' down page [20232](https://github.com/WordPress/gutenberg/pull/20232) -- Styling problem on vertically aligned blocks [20368](https://github.com/WordPress/gutenberg/pull/20368) -- Remove unnecessary aria-label from link formatter [18742](https://github.com/WordPress/gutenberg/pull/18742) -- Make navigation button expand to fit longer nav link text [20230](https://github.com/WordPress/gutenberg/pull/20230) +- Overflowing `LinkControl` block editor component. [20154](https://github.com/WordPress/gutenberg/pull/20154) +- Broken gallery to image transform and inconsistent types used in the gallery block [20084](https://github.com/WordPress/gutenberg/pull/20084) +- Missing label on heading toolbar. [20248](https://github.com/WordPress/gutenberg/pull/20248) +- Sidebar jumpiness. [20355](https://github.com/WordPress/gutenberg/pull/20355) +- Fix wrong imports in PluginBlockSettingsMenuItem [20356](https://github.com/WordPress/gutenberg/pull/20356) +- Color formatter appears when color choosing is not possible [20222](https://github.com/WordPress/gutenberg/pull/20222) +- Crash when updating a post with the latest post block [20289](https://github.com/WordPress/gutenberg/pull/20289) +- Inconsistency on Import from JSON button look [20416](https://github.com/WordPress/gutenberg/pull/20416) +- Inline image width pop-up 'wanders' down page [20232](https://github.com/WordPress/gutenberg/pull/20232) +- Styling problem on vertically aligned blocks [20368](https://github.com/WordPress/gutenberg/pull/20368) +- Remove unnecessary aria-label from link formatter [18742](https://github.com/WordPress/gutenberg/pull/18742) +- Make navigation button expand to fit longer nav link text [20230](https://github.com/WordPress/gutenberg/pull/20230) - Flow for gallery creation and editing [20287](https://github.com/WordPress/gutenberg/pull/20287) -- Fix background color for dark themes on the spacer block [20296](https://github.com/WordPress/gutenberg/pull/20296) -- Show metaboxes peeking in even on tiny screens. [20262](https://github.com/WordPress/gutenberg/pull/20262) +- Fix background color for dark themes on the spacer block [20296](https://github.com/WordPress/gutenberg/pull/20296) +- Show metaboxes peeking in even on tiny screens. [20262](https://github.com/WordPress/gutenberg/pull/20262) - Add an edit state to media frames to fix an issue when opening a new tab. [17642](https://github.com/WordPress/gutenberg/pull/17642) ## Documentation -- Add a basic storybook story listing all the @wordpress/icons [20266](https://github.com/WordPress/gutenberg/pull/20266) -- Add docs for variations in the block registration section [20145](https://github.com/WordPress/gutenberg/pull/20145) -- Improve README for `` component. [19677](https://github.com/WordPress/gutenberg/pull/19677) -- Remove the devhub manifest file [20175](https://github.com/WordPress/gutenberg/pull/20175) +- Add a basic storybook story listing all the @wordpress/icons [20266](https://github.com/WordPress/gutenberg/pull/20266) +- Add docs for variations in the block registration section [20145](https://github.com/WordPress/gutenberg/pull/20145) +- Improve README for `` component. [19677](https://github.com/WordPress/gutenberg/pull/19677) +- Remove the devhub manifest file [20175](https://github.com/WordPress/gutenberg/pull/20175) - Several documentation improvements and typo fixes: [20385](https://github.com/WordPress/gutenberg/pull/20385), [20378](https://github.com/WordPress/gutenberg/pull/20378), [20392](https://github.com/WordPress/gutenberg/pull/20392), [20381](https://github.com/WordPress/gutenberg/pull/20381), [20388](https://github.com/WordPress/gutenberg/pull/20388), [20371](https://github.com/WordPress/gutenberg/pull/20371), [20380](https://github.com/WordPress/gutenberg/pull/20380), [20384](https://github.com/WordPress/gutenberg/pull/20384), [20379](https://github.com/WordPress/gutenberg/pull/20379), [20391](https://github.com/WordPress/gutenberg/pull/20391), [20251](https://github.com/WordPress/gutenberg/pull/20251) ## Various - Create block: Add support for `format:js` to ESNext template [20335](https://github.com/WordPress/gutenberg/pull/20335) - Add check for minimum system requirements on create block [20398](https://github.com/WordPress/gutenberg/pull/20398) -- Conditionally apply Editor Skeleton html element styles [20245](https://github.com/WordPress/gutenberg/pull/20245) +- Conditionally apply Editor Skeleton html element styles [20245](https://github.com/WordPress/gutenberg/pull/20245) - Environment: - Check for legacy installs and provide the option to delete them. [20340](https://github.com/WordPress/gutenberg/pull/20340) - Fix testsPath on local sources [20353](https://github.com/WordPress/gutenberg/pull/20353) - Use user with UID=33 to run WP CLI commands [20403](https://github.com/WordPress/gutenberg/pull/20403) - - Fix issue where docker & wp had different URLs [20228](https://github.com/WordPress/gutenberg/pull/20228) + - Fix issue where docker & wp had different URLs [20228](https://github.com/WordPress/gutenberg/pull/20228) - No longer show error message twice [20157](https://github.com/WordPress/gutenberg/pull/20157) - - Support wp-config.php overrides. [20352](https://github.com/WordPress/gutenberg/pull/20352) - - Support overwriting generated file directory with an environment variable [20253](https://github.com/WordPress/gutenberg/pull/20253) + - Support wp-config.php overrides. [20352](https://github.com/WordPress/gutenberg/pull/20352) + - Support overwriting generated file directory with an environment variable [20253](https://github.com/WordPress/gutenberg/pull/20253) = 7.5.0 = @@ -552,7 +713,7 @@ - Improve colors handling [20022](https://github.com/WordPress/gutenberg/pull/20022) - Rename background color CSS class [20018](https://github.com/WordPress/gutenberg/pull/20018) - Block Library: Avoid column width auto-adjustment when sibling width changes [19515](https://github.com/WordPress/gutenberg/pull/19515) [20169](https://github.com/WordPress/gutenberg/pull/20169) -- A11y: +- A11y: - Incorporate settings in the edit state of the LinkControl component [20052](https://github.com/WordPress/gutenberg/pull/20052) - Announce all Notice components messages [15745](https://github.com/WordPress/gutenberg/pull/15745) - Button block: Remove title attribute [19735](https://github.com/WordPress/gutenberg/pull/19735) @@ -918,7 +1079,7 @@ - Use tabs for gradient and color. [#19133](https://github.com/wordpress/gutenberg/pull/19133) - Add "download" keyword to the File block. [#18995](https://github.com/wordpress/gutenberg/pull/18995) - Add "poem" keyword to the Verse block. [#19355](https://github.com/wordpress/gutenberg/pull/19355) -- Convert to blocks: +- Convert to blocks: - preserve text alignment. [#19097](https://github.com/wordpress/gutenberg/pull/19097) - Skip shortcode if not on its own line. [#19059](https://github.com/wordpress/gutenberg/pull/19059) - Writing flow: Improve tabbing for Edit mode. [#19235](https://github.com/wordpress/gutenberg/pull/19235) @@ -928,7 +1089,7 @@ - Use the default cursor for Select Tool [#19157](https://github.com/wordpress/gutenberg/pull/19157) - Round position attributes on cover focal point save. [#19183](https://github.com/wordpress/gutenberg/pull/19183) - Remove block inserter shortcuts. [#19045](https://github.com/wordpress/gutenberg/pull/19045) -- Navigation block: +- Navigation block: - Clarify the placeholder label. [#19105](https://github.com/wordpress/gutenberg/pull/19105) - Removes the reusable block option from the items. [#19250](https://github.com/wordpress/gutenberg/pull/19250) - Sub-items white background adjustment. [#18976](https://github.com/wordpress/gutenberg/pull/18976) @@ -938,7 +1099,7 @@ - Block examples: concatenate strings and add translators notes. [#19048](https://github.com/wordpress/gutenberg/pull/19048) - Show the trash button as a link. [#19131](https://github.com/wordpress/gutenberg/pull/19131) - Removed the bottom-margin for the RadioControl component. [#19340](https://github.com/wordpress/gutenberg/pull/19340) -- Copy: +- Copy: - Capitalize "Manager" in Block Manager. [#19375](https://github.com/wordpress/gutenberg/pull/19375) - Expand on sentence case usage. [#18758](https://github.com/wordpress/gutenberg/pull/18758) [#19377](https://github.com/wordpress/gutenberg/pull/19377) - Update the copy of the Experiments page [#18233](https://github.com/wordpress/gutenberg/pull/18233) @@ -952,7 +1113,7 @@ ### Bugs: -- A11y: +- A11y: - Make text alignment items radio menu items. [#19233](https://github.com/wordpress/gutenberg/pull/19233) - Add group role to the block wrapper element. [#19213](https://github.com/wordpress/gutenberg/pull/19213) - Prevent tabbing to the block drag handle. [#19211](https://github.com/wordpress/gutenberg/pull/19211) @@ -965,7 +1126,7 @@ - Remove windows paste markers. [#19040](https://github.com/wordpress/gutenberg/pull/19040) - Strip HTML formatting space for inline text. [#19043](https://github.com/wordpress/gutenberg/pull/19043) - Apply active formats when pasting inline. [#14815](https://github.com/wordpress/gutenberg/pull/14815) -- Rich Text: +- Rich Text: - Fix applying a format across 2 other formats. [#19053](https://github.com/wordpress/gutenberg/pull/19053) - Fix using composed characters on Safari. [#19171](https://github.com/wordpress/gutenberg/pull/19171) - Fix block navigation using the up arrow key. [#19135](https://github.com/wordpress/gutenberg/pull/19135) @@ -992,7 +1153,7 @@ - Translate block example strings. [#18162](https://github.com/wordpress/gutenberg/pull/18162) - Writing flow: simplify & fix tabbing out of block. [#19312](https://github.com/wordpress/gutenberg/pull/19312) -### New APIs: +### New APIs: - Button component: - Support the icon prop and use a consistent button height. [#19193](https://github.com/wordpress/gutenberg/pull/19193) [#19366](https://github.com/wordpress/gutenberg/pull/19366) [#19123](https://github.com/wordpress/gutenberg/pull/19123) [#19058](https://github.com/wordpress/gutenberg/pull/19058) @@ -1018,7 +1179,7 @@ - Fix Drag & Drop not working on the widgets screen. [#19029](https://github.com/wordpress/gutenberg/pull/19029) - Allow parent Block to consume child Block's toolbar. [#18440](https://github.com/wordpress/gutenberg/pull/18440) - Allow disabling the Block UI. [#18173](https://github.com/wordpress/gutenberg/pull/18173) -- Block Directory: +- Block Directory: - Update the regular expression that determines whether the plugin is using an img URL or an icon slug. [#19316](https://github.com/wordpress/gutenberg/pull/19316) - Use the block's title for alt text on block directory plugin items. [#19263](https://github.com/wordpress/gutenberg/pull/19263) @@ -1054,7 +1215,7 @@ - Popover: remove buffer options [#19283](https://github.com/wordpress/gutenberg/pull/19283) - Refactor the MediaReplaceFlow component to use Dropdown. [#19126](https://github.com/wordpress/gutenberg/pull/19126) - Remove unused is-hovered class from the block wrapper. [#19390](https://github.com/wordpress/gutenberg/pull/19390) -- RichText: +- RichText: - Rewrite withFilters with hooks. [#19117](https://github.com/wordpress/gutenberg/pull/19117) - split out boundary style calculation. [#19319](https://github.com/wordpress/gutenberg/pull/19319) - WritingFlow: rewrite with hooks. [#19393](https://github.com/wordpress/gutenberg/pull/19393) @@ -1676,14 +1837,14 @@ Add knobs to the [ColorIndicator Story](https://github.com/WordPress/gutenberg/p * Update the [Post Schedule label](https://github.com/WordPress/gutenberg/pull/15757) to correctly reflect the date and time display settings. * Clean up the [block toolbar position](https://github.com/WordPress/gutenberg/pull/17197) for wide full blocks. * Fix the [cropped focus indicator](https://github.com/WordPress/gutenberg/pull/17215) in the block inserter. -* Browser incompatibilities: +* Browser incompatibilities: * [Fallback to setTimeout in RichText](https://github.com/WordPress/gutenberg/pull/17213) if no requestIdleCallback is not supported. * [Block toolbar fixes](https://github.com/WordPress/gutenberg/pull/17214) for IE11. * Fix [Backspace usage in RichText](https://github.com/WordPress/gutenberg/pull/17256) for IE11. * Prevent clicking the [next/previous month in the Post Schedule](https://github.com/WordPress/gutenberg/pull/17201) popover from closing it. * Prevent the [private posts from triggering the unsaved changes](https://github.com/WordPress/gutenberg/pull/17210) [warnings](https://github.com/WordPress/gutenberg/pull/17257) after saving. * Fix the usage of the [useReducedMotion hook in Node.js](https://github.com/WordPress/gutenberg/pull/17165) context. -* A11y: +* A11y: * Use [darker form field borders](https://github.com/WordPress/gutenberg/pull/17218). * Fix the [modal escape key propagation](https://github.com/WordPress/gutenberg/pull/17297). * [Move focus back from the Modal to the More Menu](https://github.com/WordPress/gutenberg/pull/16964) when it was used to open the Modal. @@ -1748,20 +1909,20 @@ Add knobs to the [ColorIndicator Story](https://github.com/WordPress/gutenberg/p - Add the option to [resize Cover Block ](https://github.com/WordPress/gutenberg/pull/17143). - Allow directly setting a [solid background color on Cover](https://github.com/WordPress/gutenberg/pull/17041) block. - Add [list start, reversed settings](https://github.com/WordPress/gutenberg/pull/15113). -- Add a [help panel to the inserter available in all blocks](https://github.com/WordPress/gutenberg/pull/16813). -- [Typewriter experience](https://github.com/WordPress/gutenberg/pull/16460). +- Add a [help panel to the inserter available in all blocks](https://github.com/WordPress/gutenberg/pull/16813). +- [Typewriter experience](https://github.com/WordPress/gutenberg/pull/16460). - Add [circle-crop variation](https://github.com/WordPress/gutenberg/pull/16475) to Image block. ### Enhancements -- Add [overflow support inside block switcher](https://github.com/WordPress/gutenberg/pull/16984). -- Update [GitHub action exit codes.](https://github.com/WordPress/gutenberg/pull/17002) -- Core Data: [return updated record in saveEntityRecord](https://github.com/WordPress/gutenberg/pull/17030). -- Latest Posts Block: [(no title) instead of (Untitled) for a post without a title](https://github.com/WordPress/gutenberg/pull/17074). -- [Remove borders around inserter items for blocks with children blocks](https://github.com/WordPress/gutenberg/pull/17083). -- Add [disabled block count](https://github.com/WordPress/gutenberg/pull/17103) in the block manager. -- Writing Flow: - - Add [splitting in the quote block](https://github.com/WordPress/gutenberg/pull/17121). - - Allow [undoing of patterns with BACKSPACE and ESC.](https://github.com/WordPress/gutenberg/pull/14776) +- Add [overflow support inside block switcher](https://github.com/WordPress/gutenberg/pull/16984). +- Update [GitHub action exit codes.](https://github.com/WordPress/gutenberg/pull/17002) +- Core Data: [return updated record in saveEntityRecord](https://github.com/WordPress/gutenberg/pull/17030). +- Latest Posts Block: [(no title) instead of (Untitled) for a post without a title](https://github.com/WordPress/gutenberg/pull/17074). +- [Remove borders around inserter items for blocks with children blocks](https://github.com/WordPress/gutenberg/pull/17083). +- Add [disabled block count](https://github.com/WordPress/gutenberg/pull/17103) in the block manager. +- Writing Flow: + - Add [splitting in the quote block](https://github.com/WordPress/gutenberg/pull/17121). + - Allow [undoing of patterns with BACKSPACE and ESC.](https://github.com/WordPress/gutenberg/pull/14776) ### Experiments - Widgets Screen: @@ -1769,10 +1930,10 @@ Add knobs to the [ColorIndicator Story](https://github.com/WordPress/gutenberg/p - Add [Button block appender](https://github.com/WordPress/gutenberg/pull/16971). ### New APIs -- Add [callbacks to ServerSideRenderer](https://github.com/WordPress/gutenberg/pull/16512) to handle failures with custom renderers. +- Add [callbacks to ServerSideRenderer](https://github.com/WordPress/gutenberg/pull/16512) to handle failures with custom renderers. - Add the [block example API](https://github.com/WordPress/gutenberg/pull/17124) and use it for inserter and switcher previews. - Enable an [optional namespace parameter for hasAction & hasFilter ](https://github.com/WordPress/gutenberg/pull/15362). - + ### Bug Fixes - The [duplicate button appears even if the block is not allowed](https://github.com/WordPress/gutenberg/pull/17007). @@ -1794,14 +1955,14 @@ Add knobs to the [ColorIndicator Story](https://github.com/WordPress/gutenberg/p ### Various -- Update [re-resizable dependency](https://github.com/WordPress/gutenberg/pull/17011) -- Use [mixins in button styles instead of media queries.](https://github.com/WordPress/gutenberg/pull/17012) -- [Fix performance tests with the introduction of the navigation mode](https://github.com/WordPress/gutenberg/pull/17034) +- Update [re-resizable dependency](https://github.com/WordPress/gutenberg/pull/17011) +- Use [mixins in button styles instead of media queries.](https://github.com/WordPress/gutenberg/pull/17012) +- [Fix performance tests with the introduction of the navigation mode](https://github.com/WordPress/gutenberg/pull/17034) - RichText code improvements: [#16905](https://github.com/WordPress/gutenberg/pull/16905), [#16962](https://github.com/WordPress/gutenberg/pull/16962). - Scripts: - Improve the way [test files are discovered](https://github.com/WordPress/gutenberg/pull/17033). - Improve [recommended settings](https://github.com/WordPress/gutenberg/pull/17027) included in the package. - - Use [the SCSS shared stylelint-config-wordpress config](https://github.com/WordPress/gutenberg/pull/17060). + - Use [the SCSS shared stylelint-config-wordpress config](https://github.com/WordPress/gutenberg/pull/17060). - [Ignore the WordPress directory](https://github.com/WordPress/gutenberg/pull/16243) in stylelint. - Fix: [edit post sets some default block appender styles](https://github.com/WordPress/gutenberg/pull/16943). - Build: [remove global install of latest npm](https://github.com/WordPress/gutenberg/pull/17134). @@ -1810,7 +1971,7 @@ Add knobs to the [ColorIndicator Story](https://github.com/WordPress/gutenberg/p - Fix: [Add first-time contributor label](https://github.com/WordPress/gutenberg/pull/17156). - Fix: [Add milestone](https://github.com/WordPress/gutenberg/pull/17157). - Remove [unused CSS from ColorPalette](https://github.com/WordPress/gutenberg/pull/17152) component. - + ### Documentation - Add [examples for the lockPostSaving and unlockPostSaving](https://github.com/WordPress/gutenberg/pull/16713)actions. @@ -1818,7 +1979,7 @@ Add knobs to the [ColorIndicator Story](https://github.com/WordPress/gutenberg/p - Add section about [updating package after new releases](https://github.com/WordPress/gutenberg/pull/17026). - Add [ESNext examples to format API](https://github.com/WordPress/gutenberg/pull/16804) tutorial. - Document [server-side functions that allow registering block styles](https://github.com/WordPress/gutenberg/pull/16997). - + ### Mobile - [Reset toolbar scroll on content change](https://github.com/WordPress/gutenberg/pull/16945). @@ -1942,13 +2103,13 @@ Add knobs to the [ColorIndicator Story](https://github.com/WordPress/gutenberg/p ### Mobile -- Refactor [BlockToolbar out of](https://github.com/WordPress/gutenberg/pull/16677) [BlockList](https://github.com/WordPress/gutenberg/pull/16906). +- Refactor [BlockToolbar out of](https://github.com/WordPress/gutenberg/pull/16677) [BlockList](https://github.com/WordPress/gutenberg/pull/16906). - Fix [toolbar bottom inset for iPhone X](https://github.com/WordPress/gutenberg/pull/16961) devices. = 6.2.0 = ### Enhancements -- Introduce [Link Target](https://github.com/WordPress/gutenberg/pull/10128) [support](https://github.com/WordPress/gutenberg/pull/16497) in Button block. +- Introduce [Link Target](https://github.com/WordPress/gutenberg/pull/10128) [support](https://github.com/WordPress/gutenberg/pull/16497) in Button block. - Limit the [maximum height of the HTML block](https://github.com/WordPress/gutenberg/pull/16187). - Show the [preview button on mobile viewports](http://update/show-post-preview-button-on-mobile). - [Remove nested block restrictions](https://github.com/WordPress/gutenberg/pull/16751) from the Cover and Media & Text blocks. @@ -2347,7 +2508,7 @@ Add knobs to the [ColorIndicator Story](https://github.com/WordPress/gutenberg/p - Support the all hook in non-production environments. - Expose hasResolver property on the data module selectors. - Support multiple pattern replacement for the custom-templated-path-webpack-plugin package. -- Update node-sass dependency to support the latest Node.js version. +- Update node-sass dependency to support the latest Node.js version. - Fix React warning showing when loading the editor (Fill component). - Fix React warning message when using the Image block. - Refactor the popover component using React Hooks. @@ -2357,8 +2518,8 @@ Add knobs to the [ColorIndicator Story](https://github.com/WordPress/gutenberg/p - Rewrite Node.js packages to use CommonJS exports. - Speed up Docker and e2e tests setup Travis. - Extracted the deprecated block version declarations to their own files. -- Add missing file from the published @wordpress/dependency-extraction-webpack-plugin-files package. -- Upgrade package dependencies: Lerna and Webpack Bundle Analyzer. +- Add missing file from the published @wordpress/dependency-extraction-webpack-plugin-files package. +- Upgrade package dependencies: Lerna and Webpack Bundle Analyzer. # Mobile diff --git a/composer.json b/composer.json index 3d3098abaff758..f94b3c18e89fd6 100644 --- a/composer.json +++ b/composer.json @@ -11,11 +11,11 @@ "issues": "https://github.com/WordPress/gutenberg/issues" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", - "squizlabs/php_codesniffer": "^3.4.2", - "phpcompatibility/php-compatibility": "^9.2.0", - "wp-coding-standards/wpcs": "^2.1.1", - "sirbrillig/phpcs-variable-analysis": "^2.7" + "dealerdirect/phpcodesniffer-composer-installer": "^0.6", + "squizlabs/php_codesniffer": "^3.5", + "phpcompatibility/php-compatibility": "^9.3", + "wp-coding-standards/wpcs": "^2.2", + "sirbrillig/phpcs-variable-analysis": "^2.8" }, "require": { "composer/installers": "~1.0" diff --git a/composer.lock b/composer.lock index 594d8bb48c929d..3ac63fed05df15 100644 --- a/composer.lock +++ b/composer.lock @@ -1,35 +1,38 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f802871495ce4d7ed5928e17524d0cdb", + "content-hash": "9745a2b1c8d1005bf9f7617061e4fc7d", "packages": [ { "name": "composer/installers", - "version": "v1.6.0", + "version": "v1.9.0", "source": { "type": "git", "url": "https://github.com/composer/installers.git", - "reference": "cfcca6b1b60bc4974324efb5783c13dca6932b5b" + "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/installers/zipball/cfcca6b1b60bc4974324efb5783c13dca6932b5b", - "reference": "cfcca6b1b60bc4974324efb5783c13dca6932b5b", + "url": "https://api.github.com/repos/composer/installers/zipball/b93bcf0fa1fccb0b7d176b0967d969691cd74cca", + "reference": "b93bcf0fa1fccb0b7d176b0967d969691cd74cca", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0" + "composer-plugin-api": "^1.0 || ^2.0" }, "replace": { "roundcube/plugin-installer": "*", "shama/baton": "*" }, "require-dev": { - "composer/composer": "1.0.*@dev", - "phpunit/phpunit": "^4.8.36" + "composer/composer": "1.6.* || 2.0.*@dev", + "composer/semver": "1.0.* || 2.0.*@dev", + "phpunit/phpunit": "^4.8.36", + "sebastian/comparator": "^1.2.4", + "symfony/process": "^2.3" }, "type": "composer-plugin", "extra": { @@ -65,6 +68,7 @@ "Kanboard", "Lan Management System", "MODX Evo", + "MantisBT", "Mautic", "Maya", "OXID", @@ -73,6 +77,7 @@ "RadPHP", "SMF", "Thelia", + "Whmcs", "WolfCMS", "agl", "aimeos", @@ -95,6 +100,7 @@ "installer", "itop", "joomla", + "known", "kohana", "laravel", "lavalite", @@ -117,6 +123,7 @@ "shopware", "silverstripe", "sydes", + "sylius", "symfony", "typo3", "wordpress", @@ -124,22 +131,22 @@ "zend", "zikula" ], - "time": "2018-08-27T06:10:37+00:00" + "time": "2020-04-07T06:57:05+00:00" } ], "packages-dev": [ { "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v0.5.0", + "version": "v0.6.2", "source": { "type": "git", "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", - "reference": "e749410375ff6fb7a040a68878c656c2e610b132" + "reference": "8001af8eb107fbfcedc31a8b51e20b07d85b457a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/e749410375ff6fb7a040a68878c656c2e610b132", - "reference": "e749410375ff6fb7a040a68878c656c2e610b132", + "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/8001af8eb107fbfcedc31a8b51e20b07d85b457a", + "reference": "8001af8eb107fbfcedc31a8b51e20b07d85b457a", "shasum": "" }, "require": { @@ -192,20 +199,20 @@ "stylecheck", "tests" ], - "time": "2018-10-26T13:21:45+00:00" + "time": "2020-01-29T20:22:20+00:00" }, { "name": "phpcompatibility/php-compatibility", - "version": "9.2.0", + "version": "9.3.5", "source": { "type": "git", "url": "https://github.com/PHPCompatibility/PHPCompatibility.git", - "reference": "3db1bf1e28123fd574a4ae2e9a84072826d51b5e" + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/3db1bf1e28123fd574a4ae2e9a84072826d51b5e", - "reference": "3db1bf1e28123fd574a4ae2e9a84072826d51b5e", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/9fb324479acf6f39452e0655d2429cc0d3914243", + "reference": "9fb324479acf6f39452e0655d2429cc0d3914243", "shasum": "" }, "require": { @@ -228,10 +235,6 @@ "LGPL-3.0-or-later" ], "authors": [ - { - "name": "Contributors", - "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" - }, { "name": "Wim Godden", "homepage": "https://github.com/wimg", @@ -241,6 +244,10 @@ "name": "Juliette Reinders Folmer", "homepage": "https://github.com/jrfnl", "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" } ], "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.", @@ -250,32 +257,32 @@ "phpcs", "standards" ], - "time": "2019-06-27T19:58:56+00:00" + "time": "2019-12-27T09:44:58+00:00" }, { "name": "sirbrillig/phpcs-variable-analysis", - "version": "v2.7.0", + "version": "v2.8.1", "source": { "type": "git", "url": "https://github.com/sirbrillig/phpcs-variable-analysis.git", - "reference": "1b1b2b503a19bb56fa75f4a2d959b12c8ed28c12" + "reference": "5be26b4d719acaf7a433d1cad469159cbf034f2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sirbrillig/phpcs-variable-analysis/zipball/1b1b2b503a19bb56fa75f4a2d959b12c8ed28c12", - "reference": "1b1b2b503a19bb56fa75f4a2d959b12c8ed28c12", + "url": "https://api.github.com/repos/sirbrillig/phpcs-variable-analysis/zipball/5be26b4d719acaf7a433d1cad469159cbf034f2a", + "reference": "5be26b4d719acaf7a433d1cad469159cbf034f2a", "shasum": "" }, "require": { - "php": ">=5.6.0" + "php": ">=5.6.0", + "squizlabs/php_codesniffer": "^3.1" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4", + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4 || ^0.5 || ^0.6", "limedeck/phpunit-detailed-printer": "^3.1", "phpstan/phpstan": "^0.11.8", - "phpunit/phpunit": "^6.5", - "sirbrillig/phpcs-import-detection": "^1.1", - "squizlabs/php_codesniffer": "^3.1" + "phpunit/phpunit": "^5.0 || ^6.5", + "sirbrillig/phpcs-import-detection": "^1.1" }, "type": "phpcodesniffer-standard", "autoload": { @@ -288,30 +295,30 @@ "BSD-2-Clause" ], "authors": [ - { - "name": "Payton Swick", - "email": "payton@foolord.com" - }, { "name": "Sam Graham", "email": "php-codesniffer-variableanalysis@illusori.co.uk" + }, + { + "name": "Payton Swick", + "email": "payton@foolord.com" } ], "description": "A PHPCS sniff to detect problems with variables.", - "time": "2019-06-24T23:57:11+00:00" + "time": "2020-02-11T22:18:48+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.4.2", + "version": "3.5.5", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "b8a7362af1cc1aadb5bd36c3defc4dda2cf5f0a8" + "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/b8a7362af1cc1aadb5bd36c3defc4dda2cf5f0a8", - "reference": "b8a7362af1cc1aadb5bd36c3defc4dda2cf5f0a8", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/73e2e7f57d958e7228fce50dc0c61f58f017f9f6", + "reference": "73e2e7f57d958e7228fce50dc0c61f58f017f9f6", "shasum": "" }, "require": { @@ -349,20 +356,20 @@ "phpcs", "standards" ], - "time": "2019-04-10T23:49:02+00:00" + "time": "2020-04-17T01:09:41+00:00" }, { "name": "wp-coding-standards/wpcs", - "version": "2.1.1", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", - "reference": "bd9c33152115e6741e3510ff7189605b35167908" + "reference": "b5a453203114cc2284b1a614c4953456fbe4f546" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/bd9c33152115e6741e3510ff7189605b35167908", - "reference": "bd9c33152115e6741e3510ff7189605b35167908", + "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/b5a453203114cc2284b1a614c4953456fbe4f546", + "reference": "b5a453203114cc2284b1a614c4953456fbe4f546", "shasum": "" }, "require": { @@ -370,12 +377,12 @@ "squizlabs/php_codesniffer": "^3.3.1" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || ^0.6", "phpcompatibility/php-compatibility": "^9.0", "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically." + "dealerdirect/phpcodesniffer-composer-installer": "^0.6 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically." }, "type": "phpcodesniffer-standard", "notification-url": "https://packagist.org/downloads/", @@ -385,7 +392,7 @@ "authors": [ { "name": "Contributors", - "homepage": "https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards/graphs/contributors" + "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" } ], "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", @@ -394,7 +401,7 @@ "standards", "wordpress" ], - "time": "2019-05-21T02:50:00+00:00" + "time": "2020-02-04T02:52:06+00:00" } ], "aliases": [], diff --git a/docs/contributors/getting-started.md b/docs/contributors/getting-started.md index 46938b11f75847..a4414814ed3491 100644 --- a/docs/contributors/getting-started.md +++ b/docs/contributors/getting-started.md @@ -56,9 +56,13 @@ See the [relevant section in `wp-env` docs](https://github.com/WordPress/gutenbe ## On A Remote Server -Open a terminal (or if on Windows, a command prompt) and navigate to the repository you cloned. Now type `npm install` to get the dependencies all set up. Once that finishes, you can type `npm run build`. You can now upload the entire repository to your `wp-content/plugins` directory on your web server and activate the plugin from the WordPress admin. +You can use a remote server in development by building locally and then uploading the built files as a plugin to the remote server. -You can also type `npm run package-plugin` which will run the two commands above and create a zip file automatically for you which you can use to install Gutenberg through the WordPress admin. +To build: open a terminal (or if on Windows, a command prompt) and navigate to the repository you cloned. Now type `npm install` to get the dependencies all set up. Once that finishes, you can type `npm run build`. + +After building the cloned gutenberg directory contains the complete plugin, you can upload the entire repository to your `wp-content/plugins` directory and activate the plugin from the WordPress admin. + +Another way to upload after building is to run `npm run package-plugin` to create a plugin zip file — this requires `bash` and `php` to run. The script creates `gutenberg.zip` that you can use to install Gutenberg through the WordPress admin. [npm]: https://www.npmjs.com/ [nvm]: https://github.com/creationix/nvm diff --git a/docs/contributors/managing-packages.md b/docs/contributors/managing-packages.md index 7b38b811054c85..9032af8cf3acbe 100644 --- a/docs/contributors/managing-packages.md +++ b/docs/contributors/managing-packages.md @@ -1,8 +1,8 @@ # Managing Packages -This repository uses [lerna] to manage Gutenberg modules and publish them as packages to [npm]. This enforces certain steps in the workflow which are described in details in [packages](/packages/README.md) documentation. +This repository uses [lerna] to manage Gutenberg modules and publish them as packages to [npm]. This enforces certain steps in the workflow which are described in details in [packages](https://github.com/WordPress/gutenberg/blob/master/packages/README.md) documentation. -Maintaining dozens of npm packages is difficult—it can be tough to keep track of changes. That's why we use `CHANGELOG.md` files for each package to simplify the release process. As a contributor, you should add an entry to the aforementioned file each time you contribute adding production code as described in [Maintaining Changelogs](/packages/README.md#maintaining-changelogs) section. +Maintaining dozens of npm packages is difficult—it can be tough to keep track of changes. That's why we use `CHANGELOG.md` files for each package to simplify the release process. As a contributor, you should add an entry to the aforementioned file each time you contribute adding production code as described in [Maintaining Changelogs](https://github.com/WordPress/gutenberg/blob/master/packages/README.md#maintaining-changelogs) section. [lerna]: https://lerna.js.org [npm]: https://www.npmjs.com/ diff --git a/docs/contributors/readme.md b/docs/contributors/readme.md index b04de2a382c606..e51702b7248424 100644 --- a/docs/contributors/readme.md +++ b/docs/contributors/readme.md @@ -14,7 +14,7 @@ Find the section below based on what you are looking to contribute: - **Documentation?** See the [documentation section](/docs/contributors/document.md) -- **Triage Support?** See the [triaging issues section](/docs/contributors/repository-management/#triaging-issues) +- **Triage Support?** See the [triaging issues section](/docs/contributors/triage.md) - **Internationalization?** See the [localizing and translating section](/docs/contributors/localizing.md) diff --git a/docs/contributors/repository-management.md b/docs/contributors/repository-management.md index cf7dbcee1b25eb..e9149f033204bf 100644 --- a/docs/contributors/repository-management.md +++ b/docs/contributors/repository-management.md @@ -23,7 +23,7 @@ Any issues that are irrelevant or not actionable should be closed, because they ### Labels -All issues should have [one or more labels](https://github.com/WordPress/gutenberg/labels). +All issues should have [one or more labels](https://github.com/WordPress/gutenberg/labels). Workflow labels start with “Needs” and may be applied as needed. Ideally, each workflow label will have a group that follows it, such as the Accessibility Team for `Needs Accessibility Feedback`, the Testing Team for `Needs Testing`, etc. @@ -60,32 +60,7 @@ To keep the issue list healthy, it needs to be triaged regularly. *Triage* is th Anyone can help triage, although you’ll need contributor permission on the Gutenberg repository to modify an issue’s labels or edit its title. -To start simply choose from one of these filtered lists of issues: - -- [All Gutenberg issues without an assigned label](https://github.com/wordpress/gutenberg/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-asc+no%3Alabel). Triaging by simply adding labels helps people focused on certain aspects of Gutenberg find relevant issues easier and start working on them. -- [The least recently updated Gutenberg issues](https://github.com/WordPress/gutenberg/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-asc). Triaging issues that are getting old and possibly out of date keeps important work from being overlooked. -- [All Gutenberg issues with no comments](https://github.com/WordPress/gutenberg/issues?q=is%3Aopen+is%3Aissue+sort%3Acomments-asc) Triaging this list helps make sure all issues are acknowledged, and can help identify issues that may need more information or discussion before they are actionable. -- [The least commented on issues](https://github.com/WordPress/gutenberg/issues?q=is%3Aopen+is%3Aissue+sort%3Acomments-asc) Triaging this list helps the community figure out things like traction for certain proposals. - -You can also create your own custom set of filters on GitHub. If you have a filter you think might be useful for the community, feel free to submit a PR to add it to this list. - -When triaging, either one of the lists above or issues in general, here are some steps you can perform: - -- First search for duplicates. If the issue is duplicate, close it by commenting with “Duplicate of #” and add any relevant new details to the existing issue. -- If the issue is missing labels, add some to better categorize it (requires proper permissions). -- If the title doesn’t communicate the issue, edit it for clarity (requires proper permissions). -- If it’s a bug report, test to confirm the report or add the `Needs Testing` label. If there is not enough information to confirm the report, add the `[Status] Needs More Info` label and ask for the details needed. -- Remove the `[Status] Needs More Info` if the author of the issue has responded with enough details. -- Close the issue with a note if it has a `[Status] Needs More Info` label but the author didn't respond in 2+ weeks. -- If there was conversation on the issue but no actionable steps identified, follow up with the participants to see what’s actionable. -- If you feel comfortable triaging the issue further, then you can also: - - Check that the bug report is valid by debugging it to see if you can track down the technical specifics. - - Check if the issue is missing some detail and see if you can fill in those details. For instance, if a bug report is missing visual detail, it’s helpful to reproduce the issue locally and upload a screenshot or GIF. - -For triaging there are some labels which are very useful: -- `Needs Technical Feedback` - you can apply them when you see new features or API changes proposed -- `Needs More Info` - when it’s not clear what the issue is or it would help to provide additional details -- `Needs Testing` - it’s useful for old bugs where it seems like they are no longer relevant +See the [Triage Contributors guide](/docs/contributors/triage.md) for details. ## Pull Requests diff --git a/docs/contributors/testing-overview.md b/docs/contributors/testing-overview.md index 5c7d2a642b81b8..8a84aa20de12eb 100644 --- a/docs/contributors/testing-overview.md +++ b/docs/contributors/testing-overview.md @@ -344,12 +344,6 @@ test( 'should contain mars if planets is true', () => { It's tempting to snapshot deep renders, but that makes for huge snapshots. Additionally, deep renders no longer test a single component, but an entire tree. With `shallow`, we snapshot just the components that are directly rendered by the component we want to test. -### StoryShots - -> [StoryShots](https://www.npmjs.com/package/@storybook/addon-storyshots) adds automatic Jest Snapshot Testing for [Storybook](https://storybook.js.org/). - -Whenever a new story is added to Storybook, `npm run test-unit` needs to be executed to generate the corresponding snapshots. In the case when the existing story gets updated or removed, please refer to [Working with snapshots](#working-with-snapshots) section. - #### Troubleshooting Sometimes we need to mock refs for some stories which use them. Check the following documents to learn more: @@ -357,6 +351,11 @@ Sometimes we need to mock refs for some stories which use them. Check the follow - [Using createNodeMock to mock refs](https://github.com/storybookjs/storybook/tree/master/addons/storyshots/storyshots-core#using-createnodemock-to-mock-refs) with StoryShots. In that case, you might see test failures and `TypeError` reported by Jest in the lines which try to access a property from `ref.current`. If this happens, search for `initStoryshots` method call, which contains all necessary configurations to adjust. + +### Debugging Jest unit tests + +Running `npm run test-unit:debug` will start the tests in debug mode so a [node inspector client](https://nodejs.org/en/docs/guides/debugging-getting-started/#inspector-clients) can connect to the process and inspect the execution. Instructions for using Google Chrome or Visual Studio Code as an inspector client can be found in the [wp-scripts documentation](/packages/scripts/README.md#debugging-jest-unit-tests). + ## Native mobile testing Part of the unit-tests suite is a set of Jest tests run exercise native-mobile codepaths, developed in React Native. Since those tests run on Node, they can be launched locally on your development machine without the need for specific native Android or iOS dev tools or SDKs. It also means that they can be debugged using typical dev tools. Read on for instructions how to debug. @@ -421,7 +420,7 @@ Related: https://chromedevtools.github.io/devtools-protocol/tot/Network#method-e ### Core Block Testing -Every core block is required to have at least one set of fixture files for its main save function and one for each deprecation. These fixtures test the parsing and serialization of the block. See [the e2e tests fixtures readme](/packages/e2e-tests/fixtures/blocks/README.md) for more information and instructions. +Every core block is required to have at least one set of fixture files for its main save function and one for each deprecation. These fixtures test the parsing and serialization of the block. See [the e2e tests fixtures readme](https://github.com/wordpress/gutenberg/blob/master/packages/e2e-tests/fixtures/blocks/README.md) for more information and instructions. ## PHP Testing diff --git a/docs/contributors/triage.md b/docs/contributors/triage.md new file mode 100644 index 00000000000000..c1155bdfd8086c --- /dev/null +++ b/docs/contributors/triage.md @@ -0,0 +1,68 @@ +## Get involved in triage +To keep the issue list healthy, it needs to be triaged regularly. Triage is the practice of reviewing existing issues to make sure they’re relevant, actionable, and have all the information they need. Anyone can help triage, although you’ll need to be a member of the triage team for the Gutenberg repository to modify an issue’s labels or edit its title. + +## Join the triage team +The triage team is an open group of people with a particular role of making sure triage is done consistently across the Gutenberg repo. There are various types of triage which happen: + +* Regular self triage sessions done by members on their own time. +* Organised triage sessions done as a group at a set time. You can [review the meetings page](https://make.wordpress.org/meetings/) to find these triage sessions and appropriate slack channels. +* Focused triage sessions on a specific board, label or feature. + +These are the expectations of being a triage team member: + +* You are expected to do some triage even if it is self triage at least once a week. +* As you can, try to join organized triage sessions. +* If you join the triage team to focus on a specific label or board, the expectation is that your focus will be there. Please make this known to fellow triage team members. + +If you would like to join this team, simply ask in #core-editor [Slack](https://make.wordpress.org/chat/) at any time. + +## Getting started +To start simply choose from one of these filtered lists of issues below. Note: You can find these filters by selecting the “Sort” option from the [overall Issues page](https://github.com/wordpress/gutenberg/issues). + +* All Gutenberg issues [without an assigned label](https://github.com/WordPress/gutenberg/issues?q=is%3Aopen+is%3Aissue+no%3Alabel+sort%3Aupdated-asc). Triaging by simply adding labels helps people focused on certain aspects of Gutenberg find relevant issues easier and start working on them. +* [The least recently updated](https://github.com/WordPress/gutenberg/issues?q=is%3Aopen+is%3Aissue+sort%3Aupdated-asc) Gutenberg issues. Triaging issues that are getting old and possibly out of date keeps important work from being overlooked. +* All Gutenberg issues [with no comments](https://github.com/wordpress/gutenberg/issues?q=is%3Aissue+is%3Aopen+comments%3A0+). Triaging this list helps make sure all issues are acknowledged, and can help identify issues that may need more information or discussion before they are actionable. +* [The least commented](https://github.com/wordpress/gutenberg/issues?q=is%3Aissue+is%3Aopen+sort%3Acomments-asc) on Gutenberg issues. Triaging this list helps the community figure out what things might still need traction for certain proposals. +* You can also create your own custom set of filters on GitHub. If you have a filter you think might be useful for the community, feel free to submit a PR to add it to this list. + + +### General triage process +When triaging, either one of the lists above or issues in general, work through issues one-by-one. Here are some steps you can perform for each issue: + +* First search for duplicates. If the issue is duplicate, close it by commenting with “Duplicate of #” and add any relevant new details to the existing issue. (Don’t forget to search for duplicates among closed issues as well!). +* If the issue is missing labels, add some to better categorize it (requires proper permissions given after joining the triage team). A good starting place when adding labels is to apply one of the labels prefixed [Type] (e.g. [Type] Enhancement or [Type] Bug) to indicate what kind of issue it is. After that consider adding more descriptive labels. If the issue concerns a particular core block, add one of the labels prefixed [Block]. Or if the issue affects a particular feature there are [Feature] labels. Finally, there are labels that affect particular interest areas, like Accessibility and Internationalization. You can view all possible labels [here](https://github.com/WordPress/gutenberg/labels). +* Consider adding priority if you can confidently determine what the likely level should be: + * Priority OMGWTFBBQ: Major issues that are causing failures and are reported frequently. Typically, these are issues that are critical because they break important behaviour or functionality. An example might be, “Unable to remove a block after it is added to the editor”. + * Priority: High: Fits one of the current focuses and is causing a major broken experience (including flow, visual bugs and blocks). + * Priority: Low: Enhancements that aren’t part of focuses, iche bugs, problems with old browsers. + * Note that it’s on purpose that no priority label infers a normal level. +* If the title doesn’t communicate the issue clearly enough, edit it for clarity (requires proper permissions). Specifically, we’d recommend having the main feature the issue relates to in the beginning of the title ([example](https://github.com/WordPress/gutenberg/issues/6193)) and for the title to generally be as succinct yet descriptive as possible ([example](https://github.com/WordPress/gutenberg/issues/6193)). +* If it’s a bug report, test to confirm the report or add the Needs Testing label. If there is not enough information to confirm the report, add the [Status] Needs More Info label and ask for the details needed. It’s particularly beneficial when a bug report has steps for reproduction so ask the reporter to add those if they’re missing. +* Remove the [Status] Needs More Info if the author of the issue has responded with enough details. +* Close the issue with a note if it has a [Status] Needs More Info label but the author didn't respond in 2+ weeks. +* If there was a conversation on the issue but no actionable steps identified, follow up with the participants to see what’s actionable. Make sure to @ each participant when responding in a comment. +* If you feel comfortable triaging the issue further, then you can also: + * Check that the bug report is valid by debugging it to see if you can track down the technical specifics. + * Check if the issue is missing some detail and see if you can fill in those details. For instance, if a bug report is missing visual detail, it’s helpful to reproduce the issue locally and upload a screenshot or GIF. + * Consider adding the Good First Issue label if you believe this is a relatively easy issue for a first-time contributor to try to solve. + +Generally speaking, the following labels are very useful for triaging issues and will likely be the ones you use the most consistently: +* Needs Technical Feedback - when you see new features or API changes proposed. +* Needs More Info - when it’s not clear what the issue is or it would help to provide additional details. +* Needs Testing - when old bugs seem like they are no longer relevant. +* [Type] Help Request - when someone is asking for general help with setup/implementation. + +## Design specific triage +Along with the general triage flows listed previously, there are some specific additions to the flows for more design-centric triage for design minded folks participating in triage. + +* PR testing and reviews: this should be your first stop for daily self triage. +* Needs design feedback: check if the issue does need design feedback and, if possible, give it. You can organise this by priority, project boards or by least commented. Once there are enough opinions, please remove this label and decide on next steps (ie adding the Needs Design label). +* Needs design: Does it really need a design? Does this fit a focus? If it has a design mark as ‘needs design feedback’ to better categorize the issue. + +Reminders: +* Ask for screenshots as needed. +* Ask for iterations and note any changes before merging. +* If the issue isn’t in a board, check to see if it doesn’t fit in a specific focus. +* If the issue/pull has not been prioritized yet, consider adding a priority to help move the issue forward. + +For more detailed information about weekly design triage and to join in, please [review this guide](https://make.wordpress.org/design/handbook/workflows/weekly-gutenberg-design-triage/). diff --git a/docs/designers-developers/designers/block-design.md b/docs/designers-developers/designers/block-design.md index 93660a307eb9fe..b1f73d30c959d1 100644 --- a/docs/designers-developers/designers/block-design.md +++ b/docs/designers-developers/designers/block-design.md @@ -76,7 +76,7 @@ Avoid long, multi-line block names. Every block should include a description that clearly explains the block's function. The description will display in the Settings Sidebar. -You can add a description by using the description attribute in the [registerBlockType function](/docs/designers-developers/developers/block-api/block-registration/). +You can add a description by using the description attribute in the [registerBlockType function](/docs/designers-developers/developers/block-api/block-registration.md). Stick to a single imperative sentence with an action + subject format. Examples: diff --git a/docs/designers-developers/designers/design-patterns.md b/docs/designers-developers/designers/user-interface.md similarity index 72% rename from docs/designers-developers/designers/design-patterns.md rename to docs/designers-developers/designers/user-interface.md index bf06df6da5e9df..1d688e27838d64 100644 --- a/docs/designers-developers/designers/design-patterns.md +++ b/docs/designers-developers/designers/user-interface.md @@ -1,18 +1,18 @@ -# Patterns +# User Interface -## Basic Editor Interface +## The Block Editor -The block editor’s general layout uses on a bar at the top, with content below. +The block editor’s general layout uses a bar at the top, with content below. ![Editor Interface](https://cldup.com/VWA_jMcIRw-3000x3000.png) -The **Toolbar** contains document-level actions: Editor mode, save status, global actions for undo/redo/insert, the settings toggle, and publish options. +The **Toolbar** contains document-level actions: Editor/Select modes, save status, global actions for undo/redo/insert, the settings toggle, and publish options. The **Content Area** contains the document itself. The **Settings Sidebar** contains additional settings for the document (tags, categories, schedule etc.) and for blocks in the “Block” tab. A cog button in the toolbar hides the Settings Sidebar, allowing the user to enjoy a more immersive writing experience. On small screens, the sidebar is hidden by default. -## The Block Interface +## The Block The block itself is the most basic unit of the editor. Generally speaking, everything is a block. Users build posts and pages using blocks, mimicking the vertical flow of the underlying HTML markup. @@ -24,11 +24,11 @@ A selected block shows a number of contextual actions: The block interface has basic actions. The block editor aims for good, common defaults, so users should be able to create a complete document without actually needing the advanced actions in the Settings Sidebar. -**The Block Toolbar** highlights commonly-used actions. The **Block Chip** lives in the block toolbar, and contains high-level controls for the selected block. It primarily allows users to transform a block into another type of compatible block. Some blocks also use the block chip to users to choose from a set of alternate block styles. +**The Block Toolbar** highlights commonly-used actions. The **Block Icon** lives in the block toolbar, and contains high-level controls for the selected block. It primarily allows users to transform a block into another type of compatible block. Some blocks also use the block icon for users to choose from a set of alternate block styles. The **Block Formatting** options let users adjust block-level settings, and the **Inline Formatting** options allow adjustments to elements inside the block. When a block is long, the block toolbar pins itself to the top of the screen as the user scrolls down the page. -Blocks can be moved up and down via the **Block Mover** icons on the left. Additional block actions are available on the right via an ellipsis menu: deleting and duplicating blocks, as well as **advanced actions** like “Edit as HTML” and “Convert to Reusable Block.” +Blocks can be moved up and down via the **Block Mover** icons. Additional block actions are available via an ellipsis menu: deleting and duplicating blocks, as well as **advanced actions** like “Edit as HTML” and “Convert to Reusable Block.” An unselected block does not show the block toolbar or any other contextual controls. In effect, an unselected block is a preview of the content itself: @@ -47,7 +47,7 @@ The sidebar has two tabs, Document and Block: Each tab has sets of editable fields (**Sidebar Sections**) that users can toggle open or closed. -If a block requires advanced configuration, those settings should live in the Settings sidebar (Editor block settings can also be reached directly by clicking the cog icon next to a block). Don’t put anything in the sidebar block tab that is necessary for the basic operation of your block; your user might dismiss the sidebar for an immersive writing experience. Pick good defaults, and make important actions available in the block toolbar. +If a block requires advanced configuration, those settings should live in the Settings Sidebar. Don’t put anything in the sidebar block tab that is necessary for the basic operation of your block; your user might dismiss the sidebar for an immersive writing experience. Pick good defaults, and make important actions available in the block toolbar. Actions that could go in the block tab of the sidebar could be: @@ -60,6 +60,4 @@ Actions that could go in the block tab of the sidebar could be: ![Block Library](https://cldup.com/7QoQIoLk-A-3000x3000.png) -The **Block Library** appears when someone inserts a block, whether via the toolbar, or contextually within the content area. Inside, blocks are organized into expandable sections. The block library’s search bar auto-filters the list of blocks as the user types. Users can choose a block by selecting the **Block Button** or the **Block Name**. - -**Parent Blocks** (Blocks that contain children blocks) are represented by a layered block button. +The **Block Library** appears when someone inserts a block, whether via the toolbar, or contextually within the content area. Inside, blocks are organized into expandable sections. The block library’s search bar auto-filters the list of blocks as the user types. Users can choose a block by selecting the **Block Button** or the **Block Name**. diff --git a/docs/designers-developers/developers/backward-compatibility/deprecations.md b/docs/designers-developers/developers/backward-compatibility/deprecations.md index cf721c44875c6c..9947d262b243cb 100644 --- a/docs/designers-developers/developers/backward-compatibility/deprecations.md +++ b/docs/designers-developers/developers/backward-compatibility/deprecations.md @@ -241,11 +241,11 @@ For features included in the Gutenberg plugin, the deprecation policy is intende ## 3.0.0 - `wp.blocks.registerCoreBlocks` function removed. Please use `wp.coreBlocks.registerCoreBlocks` instead. - - Raw TinyMCE event handlers for `RichText` have been deprecated. Please use [documented props](/packages/editor/src/components/rich-text/README.md), ancestor event handler, or onSetup access to the internal editor instance event hub instead. + - Raw TinyMCE event handlers for `RichText` have been deprecated. Please use [documented props](https://github.com/WordPress/gutenberg/blob/v3.0.0/editor/components/rich-text/README.md), ancestor event handler, or onSetup access to the internal editor instance event hub instead. ## 2.8.0 - - `Original autocompleter interface in wp.components.Autocomplete` updated. Please use `latest autocompleter interface` instead. See [autocomplete](/packages/components/src/autocomplete/README.md) for more info. + - `Original autocompleter interface in wp.components.Autocomplete` updated. Please use `latest autocompleter interface` instead. See [autocomplete](https://github.com/WordPress/gutenberg/blob/v2.8.0/components/autocomplete/README.md) for more info. - `getInserterItems`: the `allowedBlockTypes` argument is now mandatory. - `getFrecentInserterItems`: the `allowedBlockTypes` argument is now mandatory. diff --git a/docs/designers-developers/developers/block-api/README.md b/docs/designers-developers/developers/block-api/README.md index 52ed3a17a4493b..13dbd344bc89fa 100644 --- a/docs/designers-developers/developers/block-api/README.md +++ b/docs/designers-developers/developers/block-api/README.md @@ -2,10 +2,13 @@ Blocks are the fundamental element of the editor. They are the primary way in which plugins and themes can register their own functionality and extend the capabilities of the editor. -## Registering a block - -All blocks must be registered before they can be used in the editor. You can learn about block registration, and the available options, in the [block registration](/docs/designers-developers/developers/block-api/block-registration.md) documentation. - -## Block `edit` and `save` - -The `edit` function defines the components for the block in the editor interface the user interacts with. The `save` function defines the markup to be serialized back when a post is saved. They are the heart of how a block operates, so they are [covered separately](/docs/designers-developers/developers/block-api/block-edit-save.md). +The following sections will walk you through the existing block APIs: + +- [Block registration](/docs/designers-developers/developers/block-api/block-registration.md). +- [Edit and Save](/docs/designers-developers/developers/block-api/block-edit-save.md) +- [Attributes](/docs/designers-developers/developers/block-api/block-attributes.md) +- [Deprecated blocks](/docs/designers-developers/developers/block-api/block-deprecation.md) +- [Transformations](./docs/designers-developers/developers/block-transforms.md) +- [Templates](/docs/designers-developers/developers/block-api/block-templates.md) +- [Annotations](/docs/designers-developers/developers/block-api/block-annotations.md) +- [Patterns (experimental)](/docs/designers-developers/developers/block-api/block-patterns.md) diff --git a/docs/designers-developers/developers/block-api/block-attributes.md b/docs/designers-developers/developers/block-api/block-attributes.md index 386210c6e998ac..5d60dbc9306b7b 100644 --- a/docs/designers-developers/developers/block-api/block-attributes.md +++ b/docs/designers-developers/developers/block-api/block-attributes.md @@ -1,5 +1,21 @@ # Attributes +## Type Validation + +The only required field for an attribute is the `type` field. It indicates the type of data that is stored within the attribute. + +Accepted values in the `type` field MUST be one of the following: + +* null +* boolean +* object +* array +* number +* string +* integer + +See [WordPress's REST API documentation](https://developer.wordpress.org/rest-api/extending-the-rest-api/schema/) for additional details. + ## Common Sources Attribute sources are used to define how the block attribute values are extracted from saved post content. They provide a mechanism to map from the saved markup to a JavaScript representation of a block. @@ -33,19 +49,33 @@ _Example_: Extract the `src` attribute from an image found in the block's markup // { "url": "https://lorempixel.com/1200/800/" } ``` -#### `attribute` Type Validation +Most attributes from markup will be of type `string`. Numeric attributes in HTML are still stored as strings, and are not converted automatically. -Accepted values in the `type` field of an `attribute` MUST be one of the following: +```js +{ + width: { + type: 'string', + source: 'attribute', + selector: 'img', + attribute: 'width', + } +} +// { "width": "50" } +``` -* null -* boolean -* object -* array -* number -* string -* integer +The only exception is when checking for the existence of an attribute (for example, the `disabled` attribute on a `button`). In that case type `boolean` can be used and the stored value will be a boolean. -See [WordPress's REST API documentation](https://developer.wordpress.org/rest-api/extending-the-rest-api/schema/) for additional details. +```js +{ + disabled: { + type: 'boolean', + source: 'attribute', + selector: 'button', + attribute: 'disabled', + } +} +// { "disabled": true } +``` ### `text` diff --git a/docs/designers-developers/developers/block-api/block-context.md b/docs/designers-developers/developers/block-api/block-context.md new file mode 100644 index 00000000000000..0b95807ffc24ee --- /dev/null +++ b/docs/designers-developers/developers/block-api/block-context.md @@ -0,0 +1,66 @@ +# Block Context + +Block context is a feature which enables ancestor blocks to provide values which can be consumed by descendent blocks within its own hierarchy. Those descendent blocks can inherit these values without resorting to hard-coded values and without an explicit awareness of the block which provides those values. + +This is especially useful in full-site editing where, for example, the contents of a block may depend on the context of the post in which it is displayed. A blogroll template may show excerpts of many different posts. Using block context, there can still be one single "Post Excerpt" block which displays the contents of the post based on an inherited post ID. + +If you are familiar with [React Context](https://reactjs.org/docs/context.html), block context adopts many of the same ideas. In fact, the client-side block editor implementation of block context is a very simple application of React Context. Block context is also supported in server-side `render_callback` implementations, demonstrated in the examples below. + +## Defining Block Context + +Block context is defined in the registered settings of a block. A block can provide a context value, or consume a value it seeks to inherit. + +### Providing Block Context + +A block can provide a context value by assigning a `providesContext` property in its registered settings. This is an object which maps a context name to one of the block's own attribute. The value corresponding to that attribute value is made available to descendent blocks and can be referenced by the same context name. Currently, block context only supports values derived from the block's own attributes. This could be enhanced in the future to support additional sources of context values. + +`record/block.json` + +```json +{ + "name": "my-plugin/record", + "attributes": { + "recordId": { + "type": "number" + } + }, + "providesContext": { + "my-plugin/recordId": "recordId" + } +} +``` + +As seen in the above example, it is recommended that you include a namespace as part of the name of the context key so as to avoid potential conflicts with other plugins or default context values provided by WordPress. The context namespace should be specific to your plugin, and in most cases can be the same as used in the name of the block itself. + +### Consuming Block Context + +A block can inherit a context value from an ancestor provider by assigning a `context` property in its registered settings. This should be assigned as an array of the context names the block seeks to inherit. + +`record-title/block.json` + +```json +{ + "name": "my-plugin/record-title", + "context": [ "my-plugin/recordId" ] +} +``` + +## Using Block Context + +Once a block has defined the context it seeks to inherit, this can be accessed in the implementation of `edit` (JavaScript) and `render_callback` (PHP). It is provided as an object (JavaScript) or associative array (PHP) of the context values which have been defined for the block. Note that a context value will only be made available if the block explicitly defines a desire to inherit that value. + +### JavaScript + +`record-title/index.js` + +```js +registerBlockType( 'my-plugin/record-title', { + edit( { context } ) { + return 'The current record ID is: ' + context[ 'my-plugin/recordId' ]; + }, +} ); +``` + +### PHP + +_The PHP implementation of block context is currently experimental and subject to breaking changes. It will be documented in the future once the API has stabilized._ diff --git a/docs/designers-developers/developers/block-api/block-deprecation.md b/docs/designers-developers/developers/block-api/block-deprecation.md index b07ae89e1a0a7c..067885f0708efd 100644 --- a/docs/designers-developers/developers/block-api/block-deprecation.md +++ b/docs/designers-developers/developers/block-api/block-deprecation.md @@ -277,4 +277,4 @@ registerBlockType( 'gutenberg/block-with-deprecated-version', { In the example above we updated the block to use an inner Paragraph block with a title instead of a title attribute. -*Above are example cases of block deprecation. For more, real-world examples, check for deprecations in the [core block library](/packages/block-library/src/README.md). Core blocks have been updated across releases and contain simple and complex deprecations.* +*Above are example cases of block deprecation. For more, real-world examples, check for deprecations in the [core block library](https://github.com/WordPress/gutenberg/tree/master/packages/block-library/src). Core blocks have been updated across releases and contain simple and complex deprecations.* diff --git a/docs/designers-developers/developers/block-api/block-registration.md b/docs/designers-developers/developers/block-api/block-registration.md index e2c9f6ff71afcb..6a64ecd165e4a0 100644 --- a/docs/designers-developers/developers/block-api/block-registration.md +++ b/docs/designers-developers/developers/block-api/block-registration.md @@ -267,402 +267,9 @@ An object describing a variation defined for the block type can contain the foll #### transforms (optional) -- **Type:** `Array` - -Transforms provide rules for what a block can be transformed from and what it can be transformed to. A block can be transformed from another block, a shortcode, a regular expression, a file or a raw DOM node. - -For example, a Paragraph block can be transformed into a Heading block. This uses the `createBlock` function from the [`wp-blocks` package](/packages/blocks/README.md#createBlock). - -{% codetabs %} -{% ES5 %} - -```js -transforms: { - from: [ - { - type: 'block', - blocks: [ 'core/paragraph' ], - transform: function ( attributes ) { - return createBlock( 'core/heading', { - content: attributes.content, - } ); - }, - }, - ] -}, -``` - -{% ESNext %} - -```js -transforms: { - from: [ - { - type: 'block', - blocks: [ 'core/paragraph' ], - transform: ( { content } ) => { - return createBlock( 'core/heading', { - content, - } ); - }, - }, - ] -}, -``` - -{% end %} - -An existing shortcode can be transformed into its block counterpart. - -{% codetabs %} -{% ES5 %} - -```js -transforms: { - from: [ - { - type: 'shortcode', - // Shortcode tag can also be an array of shortcode aliases - tag: 'caption', - attributes: { - // An attribute can be source from a tag attribute in the shortcode content - url: { - type: 'string', - source: 'attribute', - attribute: 'src', - selector: 'img', - }, - // An attribute can be source from the shortcode attributes - align: { - type: 'string', - shortcode: function( attributes ) { - var align = attributes.named.align ? attributes.named.align : 'alignnone'; - return align.replace( 'align', '' ); - }, - }, - }, - }, - ] -}, -``` - -{% ESNext %} - -```js -transforms: { - from: [ - { - type: 'shortcode', - // Shortcode tag can also be an array of shortcode aliases - tag: 'caption', - attributes: { - // An attribute can be source from a tag attribute in the shortcode content - url: { - type: 'string', - source: 'attribute', - attribute: 'src', - selector: 'img', - }, - // An attribute can be source from the shortcode attributes - align: { - type: 'string', - shortcode: ( { named: { align = 'alignnone' } } ) => { - return align.replace( 'align', '' ); - }, - }, - }, - }, - ] -}, - -``` - -{% end %} - -A block can also be transformed into another block type. For example, a Heading block can be transformed into a Paragraph block. - -{% codetabs %} -{% ES5 %} - -```js -transforms: { - to: [ - { - type: 'block', - blocks: [ 'core/paragraph' ], - transform: function( attributes ) { - return createBlock( 'core/paragraph', { - content: attributes.content, - } ); - }, - }, - ], -}, -``` - -{% ESNext %} - -```js -transforms: { - to: [ - { - type: 'block', - blocks: [ 'core/paragraph' ], - transform: ( { content } ) => { - return createBlock( 'core/paragraph', { - content, - } ); - }, - }, - ], -}, -``` - -{% end %} - -In addition to accepting an array of known block types, the `blocks` option also accepts a "wildcard" (`"*"`). This allows for transformations which apply to _all_ block types (eg: all blocks can transform into `core/group`): - -{% codetabs %} -{% ES5 %} - -```js -transforms: { - from: [ - { - type: 'block', - blocks: [ '*' ], // wildcard - match any block - transform: function( attributes, innerBlocks ) { - // transform logic here - }, - }, - ], -}, -``` - -{% ESNext %} - -```js -transforms: { - from: [ - { - type: 'block', - blocks: [ '*' ], // wildcard - match any block - transform: ( attributes, innerBlocks ) => { - // transform logic here - }, - }, - ], -}, -``` - -{% end %} - -A block with InnerBlocks can also be transformed from and to another block with InnerBlocks. - -{% codetabs %} -{% ES5 %} - -```js -transforms: { - to: [ - { - type: 'block', - blocks: [ 'some/block-with-innerblocks' ], - transform: function( attributes, innerBlocks ) { - return createBlock( 'some/other-block-with-innerblocks', attributes, innerBlocks ); - }, - }, - ], -}, -``` - -{% ESNext %} - -```js -transforms: { - to: [ - { - type: 'block', - blocks: [ 'some/block-with-innerblocks' ], - transform: ( attributes, innerBlocks ) => { - return createBlock( 'some/other-block-with-innerblocks', attributes, innerBlocks); - }, - }, - ], -}, -``` - -{% end %} - -An optional `isMatch` function can be specified on a transform object. This provides an opportunity to perform additional checks on whether a transform should be possible. Returning `false` from this function will prevent the transform from being displayed as an option to the user. - -{% codetabs %} -{% ES5 %} - -```js -transforms: { - to: [ - { - type: 'block', - blocks: [ 'core/paragraph' ], - isMatch: function( attributes ) { - return attributes.isText; - }, - transform: function( attributes ) { - return createBlock( 'core/paragraph', { - content: attributes.content, - } ); - }, - }, - ], -}, -``` - -{% ESNext %} - -```js -transforms: { - to: [ - { - type: 'block', - blocks: [ 'core/paragraph' ], - isMatch: ( { isText } ) => isText, - transform: ( { content } ) => { - return createBlock( 'core/paragraph', { - content, - } ); - }, - }, - ], -}, -``` - -{% end %} - -In the case of shortcode transforms, `isMatch` receives shortcode attributes per the [Shortcode API](https://codex.wordpress.org/Shortcode_API): - -{% codetabs %} -{% ES5 %} - -```js -isMatch: function( attributes ) { - return attributes.named.id === 'my-id'; -}, -``` - -{% ESNext %} - -```js -isMatch( { named: { id } } ) { - return id === 'my-id'; -}, -``` - -{% end %} - -To control the priority with which a transform is applied, define a `priority` numeric property on your transform object, where a lower value will take precedence over higher values. This behaves much like a [WordPress hook](https://codex.wordpress.org/Plugin_API#Hook_to_WordPress). Like hooks, the default priority is `10` when not otherwise set. - -A file can be dropped into the editor and converted into a block with a matching transform. - -{% codetabs %} -{% ES5 %} - -```js -transforms: { - from: [ - { - type: 'files', - isMatch: function( files ) { - return files.length === 1; - }, - // We define a lower priority (higher number) than the default of 10. This - // ensures that the File block is only created as a fallback. - priority: 15, - transform: function( files ) { - var file = files[ 0 ]; - var blobURL = createBlobURL( file ); - - // File will be uploaded in componentDidMount() - return createBlock( 'core/file', { - href: blobURL, - fileName: file.name, - textLinkHref: blobURL, - } ); - }, - }, - ]; -} -``` - -{% ESNext %} - -```js -transforms: { - from: [ - { - type: 'files', - isMatch: ( files ) => files.length === 1, - // We define a lower priority (higher number) than the default of 10. This - // ensures that the File block is only created as a fallback. - priority: 15, - transform: ( files ) => { - const file = files[ 0 ]; - const blobURL = createBlobURL( file ); - - // File will be uploaded in componentDidMount() - return createBlock( 'core/file', { - href: blobURL, - fileName: file.name, - textLinkHref: blobURL, - } ); - }, - }, - ]; -} -``` - -{% end %} - -A prefix transform is a transform that will be applied if the user prefixes some text in e.g. the Paragraph block with a given pattern and a trailing space. - -{% codetabs %} -{% ES5 %} - -```js -transforms: { - from: [ - { - type: 'prefix', - prefix: '?', - transform: function( content ) { - return createBlock( 'my-plugin/question', { - content, - } ); - }, - }, - ]; -} -``` - -{% ESNext %} - -```js -transforms: { - from: [ - { - type: 'prefix', - prefix: '?', - transform( content ) { - return createBlock( 'my-plugin/question', { - content, - } ); - }, - }, - ]; -} -``` +- **Type:** `Object` -{% end %} +Transforms provide rules for what a block can be transformed from and what it can be transformed to. A block can be transformed from another block, a shortcode, a regular expression, a file or a raw DOM node. Take a look at the [Block Transforms API](./block-transforms.md) for more info about each available transformation. #### parent (optional) diff --git a/docs/designers-developers/developers/block-api/block-templates.md b/docs/designers-developers/developers/block-api/block-templates.md index 49279a86595ed1..ad961e8f8066d1 100644 --- a/docs/designers-developers/developers/block-api/block-templates.md +++ b/docs/designers-developers/developers/block-api/block-templates.md @@ -32,7 +32,7 @@ function myplugin_register_template() { add_action( 'init', 'myplugin_register_template' ); ``` -The following example in JavaScript creates a new block using [InnerBlocks](/packages/block-editor/src/components/inner-blocks/README.md) and templates, when inserted creates a set of blocks based off the template. +The following example in JavaScript creates a new block using [InnerBlocks](https://github.com/WordPress/gutenberg/blob/master/packages/block-editor/src/components/inner-blocks/README.md) and templates, when inserted creates a set of blocks based off the template. ```js const el = wp.element.createElement; diff --git a/docs/designers-developers/developers/block-api/block-transforms.md b/docs/designers-developers/developers/block-api/block-transforms.md new file mode 100644 index 00000000000000..cd3a88e2be252e --- /dev/null +++ b/docs/designers-developers/developers/block-api/block-transforms.md @@ -0,0 +1,462 @@ +# Block Transforms + +Block Transforms is the API that allows a block to be transformed _from_ and _to_ other blocks, as well as _from_ other entities. Existing entities that work with this API include shortcodes, files, regular expressions, and raw DOM nodes. + +## Transform direction: `to` and `from` + +A block declares which transformations it supports via the optional `transforms` key of the block configuration, whose subkeys `to` and `from` hold an array of available transforms for every direction. Example: + +```js +export const settings = { + title: 'My Block Title', + description: 'My block description', + /* ... */ + transforms: { + from: [ /* supported from transforms */ ], + to: [ /* supported to transforms */ ], + } +} +``` + +## Transformations Types + +This section goes through the existing types of transformations blocks support: + +* block +* enter +* files +* prefix +* raw +* shortcode + +### Block + +This type of transformations support both _from_ and _to_ directions, allowing blocks to be converted into a different one. It has a corresponding UI control within the block toolbar. + +A transformation of type `block` is an object that takes the following parameters: + +- **type** _(string)_: the value `block`. +- **blocks** _(array)_: a list of known block types. It also accepts the wildcard value (`"*"`), meaning that the transform is available to _all_ block types (eg: all blocks can transform into `core/group`). +- **transform** _(function)_: a callback that receives the attributes and inner blocks of the block being processed. It should return a block object or an array of block objects. +- **isMatch** _(function, optional)_: a callback that receives the block attributes and should return a boolean. Returning `false` from this function will prevent the transform from being available and displayed as an option to the user. +- **priority** _(number, optional)_: controls the priority with which a transformation is applied, where a lower value will take precedence over higher values. This behaves much like a [WordPress hook](https://codex.wordpress.org/Plugin_API#Hook_to_WordPress). Like hooks, the default priority is `10` when not otherwise set. + +**Example: from Paragraph block to Heading block** + +To declare this transformation we add the following code into the heading block configuration, which uses the `createBlock` function from the [`wp-blocks` package](/packages/blocks/README.md#createBlock). + +{% codetabs %} +{% ES5 %} + +```js +transforms: { + from: [ + { + type: 'block', + blocks: [ 'core/paragraph' ], + transform: function ( attributes ) { + return createBlock( 'core/heading', { + content: attributes.content, + } ); + }, + }, + ] +}, +``` + +{% ESNext %} + +```js +transforms: { + from: [ + { + type: 'block', + blocks: [ 'core/paragraph' ], + transform: ( { content } ) => { + return createBlock( 'core/heading', { + content, + } ); + }, + }, + ] +}, +``` + +{% end %} + +**Example: blocks that have InnerBlocks** + +A block with InnerBlocks can also be transformed from and to another block with InnerBlocks. + +{% codetabs %} +{% ES5 %} + +```js +transforms: { + to: [ + { + type: 'block', + blocks: [ 'some/block-with-innerblocks' ], + transform: function( attributes, innerBlocks ) { + return createBlock( + 'some/other-block-with-innerblocks', + attributes, + innerBlocks + ); + }, + }, + ], +}, +``` + +{% ESNext %} + +```js +transforms: { + to: [ + { + type: 'block', + blocks: [ 'some/block-with-innerblocks' ], + transform: ( attributes, innerBlocks ) => { + return createBlock( + 'some/other-block-with-innerblocks', + attributes, + innerBlocks + ); + }, + }, + ], +}, +``` + +{% end %} + +### Enter + +This type of transformations support the _from_ direction, allowing blocks to be created from some content introduced by the user. They're applied in a new block line after the user has introduced some content and hit the ENTER key. + +A transformation of type `enter` is an object that takes the following parameters: + +- **type** _(string)_: the value `enter`. +- **regExp** _(RegExp)_: the Regular Expression to use as a matcher. If the value matches, the transformation will be applied. +- **transform** _(function)_: a callback that receives the value that has been entered. It should return a block object or an array of block objects. +- **priority** _(number, optional)_: controls the priority with which a transform is applied, where a lower value will take precedence over higher values. This behaves much like a [WordPress hook](https://codex.wordpress.org/Plugin_API#Hook_to_WordPress). Like hooks, the default priority is `10` when not otherwise set. + +**Example: from --- to Separator block** + +To create a separator block when the user types the hypen three times and then hits the ENTER key we can use the following code: + +{% codetabs %} + +{% ES5 %} + +```js +transforms = { + from: [ + { + type: 'enter', + regExp: /^-{3,}$/, + transform: function( value ) { + return createBlock( 'core/separator' ); + }, + }, + ] +} +``` + +{% ESNext %} + +```js +transforms = { + from: [ + { + type: 'enter', + regExp: /^-{3,}$/, + transform: () => createBlock( 'core/separator' ), + }, + ] +} +``` + +{% end %} + +### Files + +This type of transformations support the _from_ direction, allowing blocks to be created from files dropped into the editor. + +A transformation of type `files` is an object that takes the following parameters: + +- **type** _(string)_: the value `files`. +- **transform** _(function)_: a callback that receives the array of files being processed. It should return a block object or an array of block objects. +- **isMatch** _(function, optional)_: a callback that receives the array of files being processed and should return a boolean. Returning `false` from this function will prevent the transform from being applied. +- **priority** _(number, optional)_: controls the priority with which a transform is applied, where a lower value will take precedence over higher values. This behaves much like a [WordPress hook](https://codex.wordpress.org/Plugin_API#Hook_to_WordPress). Like hooks, the default priority is `10` when not otherwise set. + +**Example: from file to File block** + +To create a File block when the user drops a file into the editor we can use the following code: + +{% codetabs %} +{% ES5 %} + +```js +transforms: { + from: [ + { + type: 'files', + isMatch: function( files ) { + return files.length === 1; + }, + // By defining a lower priority than the default of 10, + // we make that the File block to be created as a fallback, + // if no other transform is found. + priority: 15, + transform: function( files ) { + var file = files[ 0 ]; + var blobURL = createBlobURL( file ); + // File will be uploaded in componentDidMount() + return createBlock( 'core/file', { + href: blobURL, + fileName: file.name, + textLinkHref: blobURL, + } ); + }, + }, + ]; +} +``` + +{% ESNext %} + +```js +transforms: { + from: [ + { + type: 'files', + isMatch: ( files ) => files.length === 1, + // By defining a lower priority than the default of 10, + // we make that the File block to be created as a fallback, + // if no other transform is found. + priority: 15, + transform: ( files ) => { + const file = files[ 0 ]; + const blobURL = createBlobURL( file ); + // File will be uploaded in componentDidMount() + return createBlock( 'core/file', { + href: blobURL, + fileName: file.name, + textLinkHref: blobURL, + } ); + }, + }, + ]; +} +``` + +{% end %} + +### Prefix + +This type of transformations support the _from_ direction, allowing blocks to be created from some text typed by the user. They're applied when, in a new block line, the user types some text and then adds a trailing space. + +A transformation of type `prefix` is an object that takes the following parameters: + +- **type** _(string)_: the value `files`. +- **prefix** _(string)_: the character or sequence of characters that match this transfrom. +- **transform** _(function)_: a callback that receives the content introduced. It should return a block object or an array of block objects. +- **priority** _(number, optional)_: controls the priority with which a transform is applied, where a lower value will take precedence over higher values. This behaves much like a [WordPress hook](https://codex.wordpress.org/Plugin_API#Hook_to_WordPress). Like hooks, the default priority is `10` when not otherwise set. + +**Example: from text to custom block** + +If we want to create a custom block when the user types the question mark, we could use this code: + +{% codetabs %} +{% ES5 %} + +```js +transforms: { + from: [ + { + type: 'prefix', + prefix: '?', + transform: function( content ) { + return createBlock( 'my-plugin/question', { + content, + } ); + }, + }, + ]; +} +``` + +{% ESNext %} + +```js +transforms: { + from: [ + { + type: 'prefix', + prefix: '?', + transform( content ) { + return createBlock( 'my-plugin/question', { + content, + } ); + }, + }, + ]; +} +``` + +{% end %} + +### Raw + +This type of transformations support the _from_ direction, allowing blocks to be created from raw HTML nodes. They're applied when the user executes the "Convert to Blocks" action frow within the block setting UI menu, as well as when some content is pasted or dropped into the editor. + +A transformation of type `raw` is an object that takes the following parameters: + +- **type** _(string)_: the value `raw`. +- **transform** _(function, optional)_: a callback that receives the node being processed. It should return a block object or an array of block objects. +- **schema** _(object|function, optional)_: it defines the attributes and children of the node that will be preserved on paste, according to its [HTML content model](https://html.spec.whatwg.org/multipage/dom.html#content-models). Take a look at [pasteHandler](/packages/blocks/README.md#pasteHandler) for more info. +- **selector** _(string, optional)_: a CSS selector string to determine whether the element matches according to the [element.matches](https://developer.mozilla.org/en-US/docs/Web/API/Element/matches) method. The transform won't be executed if the element doesn't match. This is a shorthand and alternative to using `isMatch`, which, if present, will take precedence. +- **isMatch** _(function, optional)_: a callback that receives the node being processed and should return a boolean. Returning `false` from this function will prevent the transform from being applied. +- **priority** _(number, optional)_: controls the priority with which a transform is applied, where a lower value will take precedence over higher values. This behaves much like a [WordPress hook](https://codex.wordpress.org/Plugin_API#Hook_to_WordPress). Like hooks, the default priority is `10` when not otherwise set. + +**Example: from URLs to Embed block** + +If we want to create an Embed block when the user pastes some URL in the editor, we could use this code: + +{% codetabs %} +{% ES5 %} + +```js +transforms: { + from: [ + { + type: 'raw', + isMatch: function( node ) { + return node.nodeName === 'P' && + /^\s*(https?:\/\/\S+)\s*$/i.test( node.textContent ); + }, + transform: function( node ) { + return createBlock( 'core/embed', { + url: node.textContent.trim(), + } ); + }, + }, + ], +} +``` + +{% ESNext %} + +```js +transforms: { + from: [ + { + type: 'raw', + isMatch: ( node ) => + node.nodeName === 'P' && + /^\s*(https?:\/\/\S+)\s*$/i.test( node.textContent ), + transform: ( node ) => { + return createBlock( 'core/embed', { + url: node.textContent.trim(), + } ); + }, + }, + ], +} +``` + +{% end %} + +### Shortcode + +This type of transformations support the _from_ direction, allowing blocks to be created from shortcodes. It's applied as part of the `raw` transformation process. + +A transformation of type `shortcode` is an object that takes the following parameters: + +- **type** _(string)_: the value `shortcode`. +- **tag** _(string|array)_: the shortcode tag or list of shortcode aliases this transform can work with. +- **attributes** _(object)_: object representing where the block attributes should be sourced from, according to the attributes shape defined by the [block configuration object](./block-registration.md). If a particular attribute contains a `shortcode` key, it should be a function that receives the shortcode attributes as the first arguments and the [WPShortcodeMatch](/packages/shortcode/README.md#next) as second, and returns a value for the attribute that will be sourced in the block's comment. +- **isMatch** _(function, optional)_: a callback that receives the shortcode attributes per the [Shortcode API](https://codex.wordpress.org/Shortcode_API) and should return a boolean. Returning `false` from this function will prevent the shortcode to be transformed into this block. +- **priority** _(number, optional)_: controls the priority with which a transform is applied, where a lower value will take precedence over higher values. This behaves much like a [WordPress hook](https://codex.wordpress.org/Plugin_API#Hook_to_WordPress). Like hooks, the default priority is `10` when not otherwise set. + +**Example: from shortcode to block** + +An existing shortcode can be transformed into its block counterpart. + +{% codetabs %} +{% ES5 %} + +```js +transforms: { + from: [ + { + type: 'shortcode', + tag: 'caption', + attributes: { + url: { + type: 'string', + source: 'attribute', + attribute: 'src', + selector: 'img', + }, + align: { + type: 'string', + // The shortcode function will extract + // the shortcode atts into a value + // to be sourced in the block's comment. + shortcode: function( attributes ) { + var align = attributes.named.align ? attributes.named.align : 'alignnone'; + return align.replace( 'align', '' ); + }, + }, + }, + // Prevent the shortcode to be converted + // into this block when it doesn't + // have the proper ID. + isMatch: function( attributes ) { + return attributes.named.id === 'my-id'; + }, + }, + ] +}, +``` + +{% ESNext %} + +```js +transforms: { + from: [ + { + type: 'shortcode', + tag: 'caption', + attributes: { + url: { + type: 'string', + source: 'attribute', + attribute: 'src', + selector: 'img', + }, + align: { + type: 'string', + // The shortcode function will extract + // the shortcode atts into a value + // to be sourced in the block's comment. + shortcode: ( { named: { align = 'alignnone' } } ) => { + return align.replace( 'align', '' ); + }, + }, + }, + // Prevent the shortcode to be converted + // into this block when it doesn't + // have the proper ID. + isMatch( { named: { id } } ) { + return id === 'my-id'; + }, + }, + ] +}, +``` + +{% end %} diff --git a/docs/designers-developers/developers/data/data-core.md b/docs/designers-developers/developers/data/data-core.md index 54ab79f95f1e54..142538c6354687 100644 --- a/docs/designers-developers/developers/data/data-core.md +++ b/docs/designers-developers/developers/data/data-core.md @@ -71,6 +71,18 @@ _Returns_ - `?Array`: An array of autosaves for the post, or undefined if there is none. +# **getCurrentTheme** + +Return the current theme. + +_Parameters_ + +- _state_ `Object`: Data state. + +_Returns_ + +- `Object`: The current theme. + # **getCurrentUser** Returns the current user. @@ -200,7 +212,7 @@ _Parameters_ _Returns_ -- `Array`: Records. +- `?Array`: Records. # **getLastEntitySaveError** @@ -491,6 +503,18 @@ _Returns_ - `Object`: Action object. +# **receiveCurrentTheme** + +Returns an action object used in signalling that the current theme has been received. + +_Parameters_ + +- _currentTheme_ `Object`: The current theme. + +_Returns_ + +- `Object`: Action object. + # **receiveCurrentUser** Returns an action used in signalling that the current user has been received. diff --git a/docs/designers-developers/developers/platform/README.md b/docs/designers-developers/developers/platform/README.md index dae0944cb1ef0d..5bd14bbb2bd18c 100644 --- a/docs/designers-developers/developers/platform/README.md +++ b/docs/designers-developers/developers/platform/README.md @@ -5,7 +5,7 @@ The Gutenberg Project is not only building a better editor for WordPress, but al ## UI Components -The [WordPress Components package](/docs/components/) contains a set of UI components you can use in your project. See the [WordPress Storybook site](https://wordpress.github.io/gutenberg/) for an interactive guide to the available components and settings. +The [WordPress Components package](/packages/components/README.md) contains a set of UI components you can use in your project. See the [WordPress Storybook site](https://wordpress.github.io/gutenberg/) for an interactive guide to the available components and settings. Here is a quick example, how to use components in your project. @@ -27,6 +27,8 @@ function MyApp() { } ``` +Many components include CSS to add style, you will need to include for the components to appear correctly. The component stylesheet can be found in `node_modules/@wordpress/components/build-style/style.css`, you can link directly or copy and include it in your project. + ## Development Scripts The [wp-scripts package](https://developer.wordpress.org/block-editor/packages/packages-scripts/) is a collection of reusable scripts for JavaScript development — includes scripts for building, linting, and testing — all with no additional configuration files. diff --git a/docs/designers-developers/developers/tutorials/block-tutorial/creating-dynamic-blocks.md b/docs/designers-developers/developers/tutorials/block-tutorial/creating-dynamic-blocks.md index d481c5e3f0d627..c48315515e5b4a 100644 --- a/docs/designers-developers/developers/tutorials/block-tutorial/creating-dynamic-blocks.md +++ b/docs/designers-developers/developers/tutorials/block-tutorial/creating-dynamic-blocks.md @@ -99,7 +99,7 @@ Because it is a dynamic block it doesn't need to override the default `save` imp * Plugin Name: Gutenberg examples dynamic */ -function gutenberg_examples_dynamic_render_callback( $attributes, $content ) { +function gutenberg_examples_dynamic_render_callback( $block_attributes, $content ) { $recent_posts = wp_get_recent_posts( array( 'numberposts' => 1, 'post_status' => 'publish', @@ -141,11 +141,11 @@ There are a few things to notice: * The `edit` function still shows a representation of the block in the editor's context (this could be very different from the rendered version, it's up to the block's author) * The built-in `save` function just returns `null` because the rendering is performed server-side. -* The server-side rendering is a function taking the block attributes and the block inner content as arguments, and returning the markup (quite similar to shortcodes) +* The server-side rendering is a function taking the block and the block inner content as arguments, and returning the markup (quite similar to shortcodes) ## Live rendering in the block editor -Gutenberg 2.8 added the [``](/packages/components/src/server-side-render) block which enables rendering to take place on the server using PHP rather than in JavaScript. +Gutenberg 2.8 added the [``](/packages/server-side-render/README.md) block which enables rendering to take place on the server using PHP rather than in JavaScript. *Server-side render is meant as a fallback; client-side rendering in JavaScript is always preferred (client rendering is faster and allows better editor manipulation).* diff --git a/docs/designers-developers/developers/tutorials/block-tutorial/nested-blocks-inner-blocks.md b/docs/designers-developers/developers/tutorials/block-tutorial/nested-blocks-inner-blocks.md index 8807f02596e242..41748c56995bfe 100644 --- a/docs/designers-developers/developers/tutorials/block-tutorial/nested-blocks-inner-blocks.md +++ b/docs/designers-developers/developers/tutorials/block-tutorial/nested-blocks-inner-blocks.md @@ -1,6 +1,6 @@ # Nested Blocks: Using InnerBlocks -You can create a single block that nests other blocks using the [InnerBlocks](/packages/block-editor/src/components/inner-blocks) component. This is used in the Columns block, Social Links block, or any block you want to contain other blocks. +You can create a single block that nests other blocks using the [InnerBlocks](https://github.com/WordPress/gutenberg/tree/master/packages/block-editor/src/components/inner-blocks/README.md) component. This is used in the Columns block, Social Links block, or any block you want to contain other blocks. Note: A single block can only contain one `InnerBlock` component. @@ -125,7 +125,7 @@ const MY_TEMPLATE = [ ``` {% end %} -Use the `templateLock` property to lock down the template. Using `all` locks the template complete, no changes can be made. Using `insert` prevents additional blocks to be inserted, but existing blocks can be reorderd. See [templateLock documentation](/packages/block-editor/src/components/inner-blocks#templatelock) for additional information. +Use the `templateLock` property to lock down the template. Using `all` locks the template complete, no changes can be made. Using `insert` prevents additional blocks to be inserted, but existing blocks can be reorderd. See [templateLock documentation](https://github.com/WordPress/gutenberg/tree/master/packages/block-editor/src/components/inner-blocks/README.md#templatelock) for additional information. ### Post Template diff --git a/docs/designers-developers/developers/tutorials/format-api/2-toolbar-button.md b/docs/designers-developers/developers/tutorials/format-api/2-toolbar-button.md index a3ded1c493bfea..88840f1059020a 100644 --- a/docs/designers-developers/developers/tutorials/format-api/2-toolbar-button.md +++ b/docs/designers-developers/developers/tutorials/format-api/2-toolbar-button.md @@ -1,6 +1,6 @@ # Add a Button to the Toolbar -Now that the format is available, the next step is to surface it to the UI. You can make use of the [`RichTextToolbarButton`](/packages/editor/src/components/rich-text/README.md#RichTextToolbarButton) component to extend the format toolbar. +Now that the format is available, the next step is to surface it to the UI. You can make use of the [`RichTextToolbarButton`](https://github.com/WordPress/gutenberg/tree/master/packages/block-editor/src/components/rich-text#richtexttoolbarbutton) component to extend the format toolbar. Paste this code in `my-custom-format.js`: diff --git a/docs/designers-developers/developers/tutorials/metabox/meta-block-3-add.md b/docs/designers-developers/developers/tutorials/metabox/meta-block-3-add.md index 1804a346f052c9..9d5eaf2e403e5c 100644 --- a/docs/designers-developers/developers/tutorials/metabox/meta-block-3-add.md +++ b/docs/designers-developers/developers/tutorials/metabox/meta-block-3-add.md @@ -2,7 +2,7 @@ With the meta field registered in the previous step, next you will create a new block used to display the field value to the user. See the [Block Tutorial](/docs/designers-developers/developers/tutorials/block-tutorial/readme.md) for a deeper understanding of creating custom blocks. -For this block, you will use the TextControl component, which is similar to an HTML input text field. For additional components, check out the [components](/packages/components/src) and [editor](/packages/editor/src/components) packages repositories. +For this block, you will use the TextControl component, which is similar to an HTML input text field. For additional components, check out the [Component Reference](/packages/components/README.md). The hook `useEntityProp` can be used by the blocks to get or change meta values. diff --git a/docs/designers-developers/developers/tutorials/metabox/meta-block-4-use-data.md b/docs/designers-developers/developers/tutorials/metabox/meta-block-4-use-data.md index 6e7d5b92d4d405..e0f5ccd5f15905 100644 --- a/docs/designers-developers/developers/tutorials/metabox/meta-block-4-use-data.md +++ b/docs/designers-developers/developers/tutorials/metabox/meta-block-4-use-data.md @@ -25,7 +25,7 @@ You can also use the post meta data in other blocks. For this example the data i In PHP, use the [register_block_type](https://developer.wordpress.org/reference/functions/register_block_type/) function to set a callback when the block is rendered to include the meta value. ```php -function myguten_render_paragraph( $attributes, $content ) { +function myguten_render_paragraph( $block_attributes, $content ) { $value = get_post_meta( get_the_ID(), 'myguten_meta_block_field', true ); // check value is set before outputting if ( $value ) { diff --git a/docs/designers-developers/glossary.md b/docs/designers-developers/glossary.md index 876bd077e75547..5a53c51bf2f5fb 100644 --- a/docs/designers-developers/glossary.md +++ b/docs/designers-developers/glossary.md @@ -19,8 +19,8 @@
Block name
A unique identifier for a block type, consisting of a plugin-specific namespace and a short label describing the block's intent. e.g. core/image
-
Block patterns
-
Block patterns are predefined layouts of blocks that can be inserted as starter content that are meant to be changed by the user every time. Once inserted, they exist as a local save and are not global.
+
Patterns
+
Patterns are predefined layouts of blocks that can be inserted as starter content that are meant to be changed by the user every time. Once inserted, they exist as a local save and are not global.
Block type
In contrast with the blocks composing a particular post, a block type describes the blueprint by which any block of that type should behave. So while there may be many images within a post, each behaves consistent with a unified image block type definition.
@@ -59,7 +59,7 @@
A set of button controls. In the context of a block, usually referring to the toolbar of block controls shown above the selected block.
Template
-
A template is a pre-defined arrangement of blocks, possibly with predefined attributes or placeholder content. You can provide a template for a post type, to give users a starting point when creating a new piece of content, or inside a custom block with the InnerBlocks component. See the templates documentation for more information. See templates documentation for more information.
+
A template is a pre-defined arrangement of blocks, possibly with predefined attributes or placeholder content. You can provide a template for a post type, to give users a starting point when creating a new piece of content, or inside a custom block with the InnerBlocks component. See the templates documentation for more information.
Template part
Template parts are equivalent – in blocks – of theme template parts. They are generally defined by a theme first. They carry some semantic meaning (could be swapped between themes such as a header) and can only be inserted in the site editor context (within “templates”). They are primarily site structure and are never to be mixed with the post content editor.
diff --git a/docs/manifest.json b/docs/manifest.json index 537f6ea671988d..8bb99966f29b52 100644 --- a/docs/manifest.json +++ b/docs/manifest.json @@ -71,12 +71,24 @@ "markdown_source": "../docs/designers-developers/developers/block-api/block-attributes.md", "parent": "block-api" }, + { + "title": "Block Context", + "slug": "block-context", + "markdown_source": "../docs/designers-developers/developers/block-api/block-context.md", + "parent": "block-api" + }, { "title": "Deprecated Blocks", "slug": "block-deprecation", "markdown_source": "../docs/designers-developers/developers/block-api/block-deprecation.md", "parent": "block-api" }, + { + "title": "Block Transforms", + "slug": "block-transforms", + "markdown_source": "../docs/designers-developers/developers/block-api/block-transforms.md", + "parent": "block-api" + }, { "title": "Templates", "slug": "block-templates", @@ -270,9 +282,9 @@ "parent": "designers" }, { - "title": "Patterns", - "slug": "design-patterns", - "markdown_source": "../docs/designers-developers/designers/design-patterns.md", + "title": "User Interface", + "slug": "user-interface", + "markdown_source": "../docs/designers-developers/designers/user-interface.md", "parent": "designers" }, { @@ -383,6 +395,12 @@ "markdown_source": "../docs/contributors/copy-guide.md", "parent": "document" }, + { + "title": "Triage", + "slug": "triage", + "markdown_source": "../docs/contributors/triage.md", + "parent": "contributors" + }, { "title": "Localizing Gutenberg Plugin", "slug": "localizing", diff --git a/docs/toc.json b/docs/toc.json index 2e5d2af87e422a..4b804c3ee6e510 100644 --- a/docs/toc.json +++ b/docs/toc.json @@ -13,7 +13,9 @@ { "docs/designers-developers/developers/block-api/block-registration.md": [] }, { "docs/designers-developers/developers/block-api/block-edit-save.md": [] }, { "docs/designers-developers/developers/block-api/block-attributes.md": [] }, - {"docs/designers-developers/developers/block-api/block-deprecation.md": [] }, + { "docs/designers-developers/developers/block-api/block-context.md": [] }, + { "docs/designers-developers/developers/block-api/block-deprecation.md": [] }, + { "docs/designers-developers/developers/block-api/block-transforms.md": [] }, { "docs/designers-developers/developers/block-api/block-templates.md": [] }, { "docs/designers-developers/developers/block-api/block-patterns.md": [] }, { "docs/designers-developers/developers/block-api/block-annotations.md": [] } @@ -54,7 +56,7 @@ ] }, { "docs/designers-developers/designers/README.md": [ { "docs/designers-developers/designers/block-design.md": [] }, - { "docs/designers-developers/designers/design-patterns.md": [] }, + { "docs/designers-developers/designers/user-interface.md": [] }, { "docs/designers-developers/designers/design-resources.md": [] }, { "docs/designers-developers/designers/animation.md": [] } ] }, @@ -77,6 +79,7 @@ { "docs/contributors/document.md": [ { "docs/contributors/copy-guide.md": [] } ] }, + { "docs/contributors/triage.md": [] }, { "docs/contributors/localizing.md": [] }, { "docs/contributors/repository-management.md": [] } ] }, diff --git a/gutenberg.php b/gutenberg.php index 4dc2ea3e862c23..af05625e838a55 100644 --- a/gutenberg.php +++ b/gutenberg.php @@ -3,7 +3,7 @@ * Plugin Name: Gutenberg * Plugin URI: https://github.com/WordPress/gutenberg * Description: Printing since 1440. This is the development plugin for the new block editor in core. - * Version: 7.9.0-rc.1 + * Version: 8.0.0 * Author: Gutenberg Team * Text Domain: gutenberg * diff --git a/lib/class-wp-block.php b/lib/class-wp-block.php new file mode 100644 index 00000000000000..55bcb9ecc5d4fb --- /dev/null +++ b/lib/class-wp-block.php @@ -0,0 +1,183 @@ + testing..." -> "Just testing..." + * + * @var string + */ + public $inner_html = ''; + + /** + * List of string fragments and null markers where inner blocks were found + * + * @example array( + * 'inner_html' => 'BeforeInnerAfter', + * 'inner_blocks' => array( block, block ), + * 'inner_content' => array( 'Before', null, 'Inner', null, 'After' ), + * ) + * + * @var array + */ + public $inner_content = array(); + + /** + * Constructor. + * + * Populates object properties from the provided block instance argument. + * + * The given array of context values will not necessarily be available on + * the instance itself, but is treated as the full set of values provided by + * the block's ancestry. This is assigned to the private `available_context` + * property. Only values which are configured to consumed by the block via + * its registered type will be assigned to the block's `context` property. + * + * @param array $block Array of parsed block properties. + * @param array $available_context Optional array of ancestry context values. + * @param WP_Block_Type_Registry $registry Optional block type registry. + */ + public function __construct( $block, $available_context = array(), $registry = null ) { + $this->name = $block['blockName']; + + if ( is_null( $registry ) ) { + $registry = WP_Block_Type_Registry::get_instance(); + } + + $this->block_type = $registry->get_registered( $this->name ); + + if ( ! empty( $block['attrs'] ) ) { + $this->attributes = $block['attrs']; + } + + if ( ! is_null( $this->block_type ) ) { + $this->attributes = $this->block_type->prepare_attributes_for_render( $this->attributes ); + } + + $this->available_context = $available_context; + + if ( ! empty( $this->block_type->context ) ) { + foreach ( $this->block_type->context as $context_name ) { + if ( array_key_exists( $context_name, $this->available_context ) ) { + $this->context[ $context_name ] = $this->available_context[ $context_name ]; + } + } + } + + 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 ( array_key_exists( $attribute_name, $this->attributes ) ) { + $child_context[ $context_name ] = $this->attributes[ $attribute_name ]; + } + } + } + /* phpcs:enable */ + + $this->inner_blocks = array_map( + function( $inner_block ) use ( $child_context, $registry ) { + return new WP_Block( $inner_block, $child_context, $registry ); + }, + $block['innerBlocks'] + ); + } + + if ( ! empty( $block['innerHTML'] ) ) { + $this->inner_html = $block['innerHTML']; + } + + if ( ! empty( $block['innerContent'] ) ) { + $this->inner_content = $block['innerContent']; + } + } + + /** + * Generates the render output for the block. + * + * @return string Rendered block output. + */ + public function render() { + global $post, $_experimental_block; + + $is_dynamic = $this->name && null !== $this->block_type && $this->block_type->is_dynamic(); + $block_content = ''; + + $index = 0; + foreach ( $this->inner_content as $chunk ) { + $block_content .= is_string( $chunk ) ? + $chunk : + $this->inner_blocks[ $index++ ]->render(); + } + + if ( $is_dynamic ) { + $global_post = $post; + $global_block = $_experimental_block; + $_experimental_block = $this; + $block_content = (string) call_user_func( $this->block_type->render_callback, $this->attributes, $block_content ); + $_experimental_block = $global_block; + $post = $global_post; + } + + return $block_content; + } + +} diff --git a/lib/class-wp-rest-block-directory-controller.php b/lib/class-wp-rest-block-directory-controller.php index 7360fa9d2533ff..9c2c2f96160cfe 100644 --- a/lib/class-wp-rest-block-directory-controller.php +++ b/lib/class-wp-rest-block-directory-controller.php @@ -303,7 +303,7 @@ private static function parse_block_metadata( $plugin ) { $block->humanized_updated = sprintf( /* translators: %s: Human-readable time difference. */ __( '%s ago', 'gutenberg' ), - human_time_diff( strtotime( $plugin['last_updated'] ), current_time( 'timestamp' ) ) + human_time_diff( strtotime( $plugin['last_updated'] ), time() ) ); return $block; diff --git a/lib/class-wp-rest-menu-items-controller.php b/lib/class-wp-rest-menu-items-controller.php index f645b7d1b46d9f..cd592046fe661f 100644 --- a/lib/class-wp-rest-menu-items-controller.php +++ b/lib/class-wp-rest-menu-items-controller.php @@ -853,7 +853,7 @@ public function get_item_schema() { ); $schema['properties']['object_id'] = array( - 'description' => __( 'The DB ID of the original object this menu item represents, e . g . ID for posts and term_id for categories .', 'gutenberg' ), + 'description' => __( 'The DB ID of the original object this menu item represents, e . g . ID for posts and term_id for categories.', 'gutenberg' ), 'context' => array( 'view', 'edit', 'embed' ), 'type' => 'integer', 'minimum' => 0, @@ -899,7 +899,7 @@ public function get_item_schema() { ); $schema['properties']['_invalid'] = array( - 'description' => __( 'Whether the menu item represents an object that no longer exists .', 'gutenberg' ), + 'description' => __( 'Whether the menu item represents an object that no longer exists.', 'gutenberg' ), 'context' => array( 'view', 'edit', 'embed' ), 'type' => 'boolean', 'readonly' => true, diff --git a/lib/client-assets.php b/lib/client-assets.php index 609627dc1e3ed0..4a0b6c3824f1d0 100644 --- a/lib/client-assets.php +++ b/lib/client-assets.php @@ -636,7 +636,7 @@ function gutenberg_load_block_pattern( $name ) { } /** - * Extends block editor settings to include a list of default block patterns. + * Extends block editor settings to include a list of default patterns. * * @param array $settings Default editor settings. * @@ -644,7 +644,7 @@ function gutenberg_load_block_pattern( $name ) { */ function gutenberg_extend_settings_block_patterns( $settings ) { if ( empty( $settings['__experimentalBlockPatterns'] ) ) { - $settings['__experimentalBlockPatterns'] = []; + $settings['__experimentalBlockPatterns'] = array(); } $settings['__experimentalBlockPatterns'] = array_merge( diff --git a/lib/compat.php b/lib/compat.php index f05a9b102feb34..e38f339030cb5b 100644 --- a/lib/compat.php +++ b/lib/compat.php @@ -44,6 +44,20 @@ function register_block_type_from_metadata( $path, $args = array() ) { } } +/** + * Extends block editor settings to determine whether to use drop cap feature. + * + * @param array $settings Default editor settings. + * + * @return array Filtered editor settings. + */ +function gutenberg_extend_settings_drop_cap( $settings ) { + $settings['__experimentalDisableDropCap'] = false; + return $settings; +} +add_filter( 'block_editor_settings', 'gutenberg_extend_settings_drop_cap' ); + + /** * Extends block editor settings to include a list of image dimensions per size. * diff --git a/lib/load.php b/lib/load.php index 7207dbbed184c6..1dca8b64972c56 100644 --- a/lib/load.php +++ b/lib/load.php @@ -63,6 +63,10 @@ function gutenberg_is_experiment_enabled( $name ) { require dirname( __FILE__ ) . '/class-wp-patterns-registry.php'; } +if ( ! class_exists( 'WP_Block' ) ) { + require dirname( __FILE__ ) . '/class-wp-block.php'; +} + require dirname( __FILE__ ) . '/compat.php'; require dirname( __FILE__ ) . '/blocks.php'; diff --git a/lib/rest-api.php b/lib/rest-api.php index eba3685e4cdd7a..6ca1e10cd00a42 100644 --- a/lib/rest-api.php +++ b/lib/rest-api.php @@ -52,7 +52,41 @@ function gutenberg_filter_oembed_result( $response, $handler, $request ) { } add_filter( 'rest_request_after_callbacks', 'gutenberg_filter_oembed_result', 10, 3 ); +/** + * 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 + * + * @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( + 'author' => 'Author', + 'author_name' => 'Author Name', + 'author_uri' => 'Author URI', + 'description' => 'Description', + 'name' => 'Name', + 'stylesheet' => 'Stylesheet', + 'template' => 'Template', + 'theme_uri' => 'Theme URI', + 'version' => 'Version', + ); + foreach ( $field_mappings as $field => $theme_field ) { + $data[ $field ] = $theme[ $theme_field ]; + } + + // Using $theme->get_screenshot() with no args to get absolute URL. + $data['screenshot'] = $theme->get_screenshot(); + + $response->set_data( $data ); + return $response; +} +add_filter( 'rest_prepare_theme', 'gutenberg_filter_rest_prepare_theme', 10, 3 ); /** * Start: Include for phase 2 diff --git a/lib/template-loader.php b/lib/template-loader.php index 183480ce821561..2525e25d7c94c2 100644 --- a/lib/template-loader.php +++ b/lib/template-loader.php @@ -84,34 +84,60 @@ function create_auto_draft_for_template_part_block( $block ) { global $_wp_current_template_part_ids; if ( 'core/template-part' === $block['blockName'] ) { - if ( ! isset( $block['attrs']['postId'] ) ) { - $template_part_file_path = + if ( isset( $block['attrs']['postId'] ) ) { + // Template part is customized. + $template_part_id = $block['attrs']['postId']; + } else { + // A published post might already exist if this template part + // was customized elsewhere or if it's part of a customized + // template. We also check if an auto-draft was already created + // because preloading can make this run twice, so, different code + // paths can end up with different posts for the same template part. + // E.g. The server could send back post ID 1 to the client, preload, + // and create another auto-draft. So, if the client tries to resolve the + // post ID from the slug and theme, it won't match with what the server sent. + $template_part_query = new WP_Query( + array( + 'post_type' => 'wp_template_part', + 'post_status' => array( 'publish', 'auto-draft' ), + 'name' => $block['attrs']['slug'], + 'meta_key' => 'theme', + 'meta_value' => $block['attrs']['theme'], + 'posts_per_page' => 1, + 'no_found_rows' => true, + ) + ); + $template_part_post = $template_part_query->have_posts() ? $template_part_query->next_post() : null; + if ( $template_part_post ) { + $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_file_path = get_stylesheet_directory() . '/block-template-parts/' . $block['attrs']['slug'] . '.html'; - if ( ! file_exists( $template_part_file_path ) ) { - if ( gutenberg_is_experiment_enabled( 'gutenberg-full-site-editing-demo' ) ) { - $template_part_file_path = - dirname( __FILE__ ) . '/demo-block-template-parts/' . $block['attrs']['slug'] . '.html'; - if ( ! file_exists( $template_part_file_path ) ) { + if ( ! file_exists( $template_part_file_path ) ) { + if ( gutenberg_is_experiment_enabled( 'gutenberg-full-site-editing-demo' ) ) { + $template_part_file_path = + dirname( __FILE__ ) . '/demo-block-template-parts/' . $block['attrs']['slug'] . '.html'; + if ( ! file_exists( $template_part_file_path ) ) { + return; + } + } else { return; } - } else { - return; } + $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_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'], - ), - ) - ); - } else { - $template_part_id = $block['attrs']['postId']; } if ( isset( $_wp_current_template_part_ids ) ) { @@ -167,12 +193,17 @@ function gutenberg_find_template( $template_file ) { // See if there is a theme block template with higher priority than the resolved template post. $higher_priority_block_template_path = null; $higher_priority_block_template_priority = PHP_INT_MAX; - $block_template_files = glob( get_stylesheet_directory() . '/block-templates/*.html' ) ?: array(); + $block_template_files = glob( get_stylesheet_directory() . '/block-templates/*.html' ); + $block_template_files = is_array( $block_template_files ) ? $block_template_files : array(); if ( is_child_theme() ) { - $block_template_files = array_merge( $block_template_files, glob( get_template_directory() . '/block-templates/*.html' ) ?: array() ); + $child_block_template_files = glob( get_template_directory() . '/block-templates/*.html' ); + $child_block_template_files = is_array( $child_block_template_files ) ? $child_block_template_files : array(); + $block_template_files = array_merge( $block_template_files, $child_block_template_files ); } if ( gutenberg_is_experiment_enabled( 'gutenberg-full-site-editing-demo' ) ) { - $block_template_files = array_merge( $block_template_files, glob( dirname( __FILE__ ) . '/demo-block-templates/*.html' ) ?: array() ); + $demo_block_template_files = glob( dirname( __FILE__ ) . '/demo-block-templates/*.html' ); + $demo_block_template_files = is_array( $demo_block_template_files ) ? $demo_block_template_files : array(); + $block_template_files = array_merge( $block_template_files, $demo_block_template_files ); } foreach ( $block_template_files as $path ) { if ( ! isset( $slug_priorities[ basename( $path, '.html' ) ] ) ) { @@ -265,7 +296,11 @@ function gutenberg_render_the_template() { $content = $wp_embed->autoembed( $content ); $content = do_blocks( $content ); $content = wptexturize( $content ); - $content = wp_make_content_images_responsive( $content ); + if ( function_exists( 'wp_filter_content_tags' ) ) { + $content = wp_filter_content_tags( $content ); + } else { + $content = wp_make_content_images_responsive( $content ); + } $content = str_replace( ']]>', ']]>', $content ); // Wrap block template in .wp-site-blocks to allow for specific descendant styles diff --git a/lib/template-parts.php b/lib/template-parts.php index 62b892e8129098..7edf730bcaacd0 100644 --- a/lib/template-parts.php +++ b/lib/template-parts.php @@ -68,6 +68,26 @@ function gutenberg_register_template_part_post_type() { } add_action( 'init', 'gutenberg_register_template_part_post_type' ); +/** + * Filters `wp_template_part` posts slug resolution to bypass deduplication logic as + * template part slugs should be unique. + * + * @param string $slug The resolved slug (post_name). + * @param int $post_ID Post ID. + * @param string $post_status No uniqueness checks are made if the post is still draft or pending. + * @param string $post_type Post type. + * @param int $post_parent Post parent ID. + * @param int $original_slug The desired slug (post_name). + * @return string The original, desired slug. + */ +function gutenberg_filter_wp_template_part_wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) { + if ( 'wp_template_part' === $post_type ) { + return $original_slug; + } + return $slug; +} +add_filter( 'wp_unique_post_slug', 'gutenberg_filter_wp_template_part_wp_unique_post_slug', 10, 6 ); + /** * Fixes the label of the 'wp_template_part' admin menu entry. */ @@ -118,3 +138,42 @@ function gutenberg_render_template_part_list_table_column( $column_name, $post_i echo esc_html( $post->post_name ); } add_action( 'manage_wp_template_part_posts_custom_column', 'gutenberg_render_template_part_list_table_column', 10, 2 ); + + +/** + * Filter for adding a `theme` parameter to `wp_template_part` queries. + * + * @param array $query_params The query parameters. + * @return array Filtered $query_params. + */ +function filter_rest_wp_template_part_collection_params( $query_params ) { + $query_params += array( + 'theme' => array( + 'description' => __( 'The theme slug for the theme that created the template part.', 'gutenberg' ), + 'type' => 'string', + ), + ); + return $query_params; +} +apply_filters( 'rest_wp_template_part_collection_params', 'filter_rest_wp_template_part_collection_params', 99, 1 ); + +/** + * Filter for supporting the `theme` parameter in `wp_template_part` queries. + * + * @param array $args The query arguments. + * @param WP_REST_Request $request The request object. + * @return array Filtered $args. + */ +function filter_rest_wp_template_part_query( $args, $request ) { + if ( $request['theme'] ) { + $meta_query = isset( $args['meta_query'] ) ? $args['meta_query'] : array(); + $meta_query[] = array( + 'key' => 'theme', + 'value' => $request['theme'], + ); + + $args['meta_query'] = $meta_query; + } + return $args; +} +add_filter( 'rest_wp_template_part_query', 'filter_rest_wp_template_part_query', 99, 2 ); diff --git a/package-lock.json b/package-lock.json index 5b3985b08eb670..daecc11e32686e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "gutenberg", - "version": "7.9.0-rc.1", + "version": "8.0.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -51,7 +51,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", - "dev": true, "requires": { "@babel/code-frame": "^7.8.3", "@babel/generator": "^7.9.0", @@ -75,7 +74,6 @@ "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" } @@ -84,7 +82,6 @@ "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" } @@ -93,7 +90,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, "requires": { "minimist": "^1.2.5" } @@ -101,20 +97,17 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "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==" }, "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==" } } }, @@ -122,7 +115,6 @@ "version": "7.9.4", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", - "dev": true, "requires": { "@babel/types": "^7.9.0", "jsesc": "^2.5.1", @@ -186,17 +178,7 @@ "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 - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, "semver": { "version": "5.7.1", @@ -256,7 +238,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.8.3", "@babel/template": "^7.8.3", @@ -267,7 +248,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, "requires": { "@babel/types": "^7.8.3" } @@ -285,7 +265,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "dev": true, "requires": { "@babel/types": "^7.8.3" } @@ -302,7 +281,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", - "dev": true, "requires": { "@babel/helper-module-imports": "^7.8.3", "@babel/helper-replace-supers": "^7.8.6", @@ -317,7 +295,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "dev": true, "requires": { "@babel/types": "^7.8.3" } @@ -325,8 +302,7 @@ "@babel/helper-plugin-utils": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" }, "@babel/helper-regex": { "version": "7.8.3", @@ -354,7 +330,6 @@ "version": "7.8.6", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", - "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", @@ -366,7 +341,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", - "dev": true, "requires": { "@babel/template": "^7.8.3", "@babel/types": "^7.8.3" @@ -376,7 +350,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, "requires": { "@babel/types": "^7.8.3" } @@ -402,7 +375,6 @@ "version": "7.9.2", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", - "dev": true, "requires": { "@babel/template": "^7.8.3", "@babel/traverse": "^7.9.0", @@ -434,8 +406,7 @@ "@babel/parser": { "version": "7.9.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", - "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", - "dev": true + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==" }, "@babel/plugin-external-helpers": { "version": "7.8.3", @@ -1197,17 +1168,7 @@ "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 - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "dev": true, - "requires": { - "leven": "^3.1.0" - } + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" }, "semver": { "version": "5.7.1", @@ -1365,18 +1326,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 - }, - "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" - } + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -1417,7 +1367,6 @@ "version": "7.8.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", - "dev": true, "requires": { "@babel/code-frame": "^7.8.3", "@babel/parser": "^7.8.6", @@ -1428,7 +1377,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", - "dev": true, "requires": { "@babel/code-frame": "^7.8.3", "@babel/generator": "^7.9.0", @@ -1445,7 +1393,6 @@ "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" } @@ -1453,14 +1400,12 @@ "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==" }, "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==" } } }, @@ -1490,7 +1435,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", - "dev": true, "requires": { "exec-sh": "^0.3.2", "minimist": "^1.2.0" @@ -1506,6 +1450,7 @@ "version": "10.0.19", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.19.tgz", "integrity": "sha512-BoiLlk4vEsGBg2dAqGSJu0vJl/PgVtCYLBFJaEO8RmQzPugXewQCXZJNXTDFaRlfCs0W+quesayav4fvaif5WQ==", + "dev": true, "requires": { "@emotion/sheet": "0.9.3", "@emotion/stylis": "0.8.4", @@ -1514,47 +1459,48 @@ } }, "@emotion/core": { - "version": "10.0.22", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.22.tgz", - "integrity": "sha512-7eoP6KQVUyOjAkE6y4fdlxbZRA4ILs7dqkkm6oZUJmihtHv0UBq98VgPirq9T8F9K2gKu0J/au/TpKryKMinaA==", + "version": "10.0.28", + "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.28.tgz", + "integrity": "sha512-pH8UueKYO5jgg0Iq+AmCLxBsvuGtvlmiDCOuv8fGNYn3cowFpLN98L8zO56U0H1PjDIyAlXymgL3Wu7u7v6hbA==", "requires": { "@babel/runtime": "^7.5.5", - "@emotion/cache": "^10.0.17", - "@emotion/css": "^10.0.22", - "@emotion/serialize": "^0.11.12", - "@emotion/sheet": "0.9.3", - "@emotion/utils": "0.11.2" + "@emotion/cache": "^10.0.27", + "@emotion/css": "^10.0.27", + "@emotion/serialize": "^0.11.15", + "@emotion/sheet": "0.9.4", + "@emotion/utils": "0.11.3" }, "dependencies": { - "@babel/runtime": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", - "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "@emotion/cache": { + "version": "10.0.29", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", + "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", "requires": { - "regenerator-runtime": "^0.13.2" + "@emotion/sheet": "0.9.4", + "@emotion/stylis": "0.8.5", + "@emotion/utils": "0.11.3", + "@emotion/weak-memoize": "0.2.5" } }, - "@emotion/css": { - "version": "10.0.22", - "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.22.tgz", - "integrity": "sha512-8phfa5mC/OadBTmGpMpwykIVH0gFCbUoO684LUkyixPq4F1Wwri7fK5Xlm8lURNBrd2TuvTbPUGxFsGxF9UacA==", - "requires": { - "@emotion/serialize": "^0.11.12", - "@emotion/utils": "0.11.2", - "babel-plugin-emotion": "^10.0.22" - } + "@emotion/sheet": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", + "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" }, - "@emotion/serialize": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.14.tgz", - "integrity": "sha512-6hTsySIuQTbDbv00AnUO6O6Xafdwo5GswRlMZ5hHqiFx+4pZ7uGWXUQFW46Kc2taGhP89uXMXn/lWQkdyTosPA==", - "requires": { - "@emotion/hash": "0.7.3", - "@emotion/memoize": "0.7.3", - "@emotion/unitless": "0.7.4", - "@emotion/utils": "0.11.2", - "csstype": "^2.5.7" - } + "@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "@emotion/utils": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", + "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + }, + "@emotion/weak-memoize": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" } } }, @@ -1582,31 +1528,9 @@ "version": "0.11.3", "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" - }, - "babel-plugin-emotion": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.27.tgz", - "integrity": "sha512-SUNYcT4FqhOqvwv0z1oeYhqgheU8qrceLojuHyX17ngo7WtWqN5I9l3IGHzf21Xraj465CVzF4IvOlAF+3ed0A==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.7.4", - "@emotion/memoize": "0.7.4", - "@emotion/serialize": "^0.11.15", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^1.0.5", - "find-root": "^1.1.0", - "source-map": "^0.5.7" - } } } }, - "@emotion/hash": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.3.tgz", - "integrity": "sha512-14ZVlsB9akwvydAdaEnVnvqu6J2P6ySv39hYyl/aoB6w/V+bXX0tay8cF6paqbgZsN2n5Xh15uF4pE+GvE+itw==" - }, "@emotion/is-prop-valid": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.5.tgz", @@ -1673,7 +1597,8 @@ "@emotion/sheet": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.3.tgz", - "integrity": "sha512-c3Q6V7Df7jfwSq5AzQWbXHa5soeE4F5cbqi40xn0CzXxWW9/6Mxq48WJEtqfWzbZtW9odZdnRAkwCQwN12ob4A==" + "integrity": "sha512-c3Q6V7Df7jfwSq5AzQWbXHa5soeE4F5cbqi40xn0CzXxWW9/6Mxq48WJEtqfWzbZtW9odZdnRAkwCQwN12ob4A==", + "dev": true }, "@emotion/styled": { "version": "10.0.23", @@ -1693,39 +1618,13 @@ "@emotion/is-prop-valid": "0.8.5", "@emotion/serialize": "^0.11.14", "@emotion/utils": "0.11.2" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", - "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@emotion/serialize": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.14.tgz", - "integrity": "sha512-6hTsySIuQTbDbv00AnUO6O6Xafdwo5GswRlMZ5hHqiFx+4pZ7uGWXUQFW46Kc2taGhP89uXMXn/lWQkdyTosPA==", - "requires": { - "@emotion/hash": "0.7.3", - "@emotion/memoize": "0.7.3", - "@emotion/unitless": "0.7.4", - "@emotion/utils": "0.11.2", - "csstype": "^2.5.7" - } - } } }, "@emotion/stylis": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.4.tgz", - "integrity": "sha512-TLmkCVm8f8gH0oLv+HWKiu7e8xmBIaokhxcEKPh1m8pXiV/akCiq50FvYgOwY42rjejck8nsdQxZlXZ7pmyBUQ==" - }, - "@emotion/unitless": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.4.tgz", - "integrity": "sha512-kBa+cDHOR9jpRJ+kcGMsysrls0leukrm68DmFQoMIWQcXdr2cZvyvypWuGYT7U+9kAExUE7+T7r6G3C3A6L8MQ==" + "integrity": "sha512-TLmkCVm8f8gH0oLv+HWKiu7e8xmBIaokhxcEKPh1m8pXiV/akCiq50FvYgOwY42rjejck8nsdQxZlXZ7pmyBUQ==", + "dev": true }, "@emotion/utils": { "version": "0.11.2", @@ -1735,7 +1634,8 @@ "@emotion/weak-memoize": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.4.tgz", - "integrity": "sha512-6PYY5DVdAY1ifaQW6XYTnOMihmBVT27elqSjEoodchsGjzYlEsTQMcEhSud99kVawatyTZRTiVkJ/c6lwbQ7nA==" + "integrity": "sha512-6PYY5DVdAY1ifaQW6XYTnOMihmBVT27elqSjEoodchsGjzYlEsTQMcEhSud99kVawatyTZRTiVkJ/c6lwbQ7nA==", + "dev": true }, "@evocateur/libnpmaccess": { "version": "3.1.2", @@ -2170,7 +2070,6 @@ "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", @@ -2181,14 +2080,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==" }, "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" @@ -2198,7 +2095,6 @@ "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" } @@ -2207,7 +2103,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" } @@ -2216,7 +2111,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" } @@ -2224,28 +2118,24 @@ "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==" }, "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==" }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" } } }, "@istanbuljs/schema": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", - "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", - "dev": true + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==" }, "@jest/console": { "version": "24.9.0", @@ -2277,283 +2167,733 @@ } } }, - "@jest/environment": { + "@jest/core": { "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.3.0.tgz", - "integrity": "sha512-vgooqwJTHLLak4fE+TaCGeYP7Tz1Y3CKOsNxR1sE0V3nx3KRUHn3NUnt+wbcfd5yQWKZQKAfW6wqbuwQLrXo3g==", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.3.0.tgz", + "integrity": "sha512-+D5a/tFf6pA/Gqft2DLBp/yeSRgXhlJ+Wpst0X/ZkfTRP54qDR3C61VfHwaex+GzZBiTcE9vQeoZ2v5T10+Mqw==", "dev": true, "requires": { - "@jest/fake-timers": "^25.3.0", - "@jest/types": "^25.3.0", - "jest-mock": "^25.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==", - "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", - "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/fake-timers": { - "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", - "jest-mock": "^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==", - "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": "*" - } - } - } - }, - "@jest/reporters": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.3.0.tgz", - "integrity": "sha512-1u0ZBygs0C9DhdYgLCrRfZfNKQa+9+J7Uo+Z9z0RWLHzgsxhoG32lrmMOtUw48yR6bLNELdvzormwUqSk4H4Vg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", "@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", + "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", - "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", - "glob": "^7.1.2", - "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", + "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", + "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-worker": "^25.2.6", - "node-notifier": "^6.0.0", + "jest-validate": "^25.3.0", + "jest-watcher": "^25.3.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "realpath-native": "^2.0.0", + "rimraf": "^3.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.0.1" + "strip-ansi": "^6.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.4.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.4.0.tgz", + "integrity": "sha512-CfE0erx4hdJ6t7RzAcE1wLG6ZzsHSmybvIBQDoCkDM1QaSeWL9wJMzID/2BbHHa7ll9SsbbK43HjbERbBaFX2A==", "dev": true, "requires": { - "@jest/source-map": "^25.2.6", + "@jest/types": "^25.4.0", "chalk": "^3.0.0", - "jest-util": "^25.3.0", + "jest-message-util": "^25.4.0", + "jest-util": "^25.4.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" + }, + "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/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.4.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.4.0.tgz", + "integrity": "sha512-8BAKPaMCHlL941eyfqhWbmp3MebtzywlxzV+qtngQ3FH+RBqnoSAhNEPj4MG7d2NVUrMOVfrwuzGpVIK+QnMAA==", "dev": true, "requires": { - "@jest/console": "^25.3.0", - "@jest/types": "^25.3.0", + "@jest/console": "^25.4.0", + "@jest/types": "^25.4.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.3.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.3.0.tgz", - "integrity": "sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.4.0.tgz", + "integrity": "sha512-t1w2S6V1sk++1HHsxboWxPEuSpN8pxEvNrZN+Ud/knkROWtf8LeUmz73A4ezE8476a5AM00IZr9a8FO9x1+j3g==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^25.3.0", + "@jest/types": "^25.4.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-haste-map": "^25.4.0", "jest-regex-util": "^25.2.6", - "jest-util": "^25.3.0", + "jest-util": "^25.4.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" + } + } + } + }, + "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 + }, + "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==", + "dev": true, + "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==", + "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" + } + }, + "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" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "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-haste-map": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.4.0.tgz", + "integrity": "sha512-5EoCe1gXfGC7jmXbKzqxESrgRcaO3SzWXGCnvp9BcT0CFMyrB1Q6LIsjl9RmvmJGQgW297TCfrdgiy574Rl9HQ==", + "dev": true, + "requires": { + "@jest/types": "^25.4.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.4.0", + "jest-worker": "^25.4.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==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.4.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "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": { + "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-serializer": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", + "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "@jest/types": "^25.4.0", + "chalk": "^3.0.0", + "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-worker": { + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.4.0.tgz", + "integrity": "sha512-ghAs/1FtfYpMmYQ0AHqxV62XPvKdUDIBBApMZfly+E9JEmYh2K45G0R5dWxx986RN12pRCxsViwQVtGl+N4whw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.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", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + } + } + }, + "@jest/environment": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.3.0.tgz", + "integrity": "sha512-vgooqwJTHLLak4fE+TaCGeYP7Tz1Y3CKOsNxR1sE0V3nx3KRUHn3NUnt+wbcfd5yQWKZQKAfW6wqbuwQLrXo3g==", + "dev": true, + "requires": { + "@jest/fake-timers": "^25.3.0", + "@jest/types": "^25.3.0", + "jest-mock": "^25.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==", + "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", + "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/fake-timers": { + "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", + "jest-mock": "^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==", + "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": "*" + } + } + } + }, + "@jest/reporters": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.3.0.tgz", + "integrity": "sha512-1u0ZBygs0C9DhdYgLCrRfZfNKQa+9+J7Uo+Z9z0RWLHzgsxhoG32lrmMOtUw48yR6bLNELdvzormwUqSk4H4Vg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^25.3.0", + "@jest/test-result": "^25.3.0", + "@jest/transform": "^25.3.0", + "@jest/types": "^25.3.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "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.3.0", + "jest-resolve": "^25.3.0", + "jest-util": "^25.3.0", + "jest-worker": "^25.2.6", + "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.0.1" + }, + "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" + } + }, + "@jest/transform": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.3.0.tgz", + "integrity": "sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg==", + "dev": true, + "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", @@ -2670,16 +3010,6 @@ "dev": true, "optional": true }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, "jest-haste-map": { "version": "25.3.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz", @@ -2706,20 +3036,6 @@ "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", "dev": true }, - "jest-resolve": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz", - "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^2.0.0", - "resolve": "^1.15.1" - } - }, "jest-serializer": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", @@ -2799,8 +3115,7 @@ "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 + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "realpath-native": { "version": "2.0.0", @@ -2812,7 +3127,6 @@ "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" } @@ -2845,33 +3159,6 @@ "has-flag": "^4.0.0" } }, - "test-exclude": { - "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", - "minimatch": "^3.0.4" - }, - "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" - } - } - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3298,7 +3585,6 @@ "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", @@ -3310,7 +3596,6 @@ "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" @@ -3320,7 +3605,6 @@ "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" @@ -3330,7 +3614,6 @@ "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" } @@ -3338,20 +3621,17 @@ "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 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "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 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "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" } @@ -3421,12 +3701,6 @@ "semver": "^6.2.0" }, "dependencies": { - "get-port": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", - "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", - "dev": true - }, "p-map": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", @@ -3897,17 +4171,6 @@ "semver": "^6.2.0" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -4027,22 +4290,10 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, "pify": { "version": "4.0.1", @@ -4061,17 +4312,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } } } }, @@ -4180,22 +4420,10 @@ "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", "dev": true }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, "minipass": { "version": "2.9.0", @@ -4375,17 +4603,6 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } } } }, @@ -4429,22 +4646,10 @@ "p-map-series": "^1.0.0" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" } } }, @@ -4461,22 +4666,10 @@ "write-json-file": "^3.2.0" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, "p-map": { "version": "2.1.0", @@ -4621,17 +4814,6 @@ "write-pkg": "^3.1.0" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", @@ -4696,22 +4878,10 @@ "read-package-json": "^2.0.13" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, "pify": { "version": "4.0.1", @@ -5175,22 +5345,10 @@ "semver": "^6.2.0" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, "p-map": { "version": "2.1.0", @@ -5236,22 +5394,10 @@ "read-cmd-shim": "^1.0.1" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" } } }, @@ -5351,22 +5497,10 @@ "p-map": "^2.1.0" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, "p-map": { "version": "2.1.0", @@ -5391,22 +5525,10 @@ "p-map-series": "^1.0.0" }, "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, "p-map": { "version": "2.1.0", @@ -5612,15 +5734,6 @@ "unist-util-visit": "2.0.1" }, "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, "@babel/core": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.0.tgz", @@ -5644,94 +5757,6 @@ "source-map": "^0.5.0" } }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", - "dev": true - }, "@babel/plugin-syntax-jsx": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.0.tgz", @@ -5750,45 +5775,6 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -5810,8 +5796,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==" }, "is-buffer": { "version": "2.0.4", @@ -6502,12 +6487,6 @@ "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", "dev": true }, - "acorn-walk": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz", - "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==", - "dev": true - }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -6517,25 +6496,6 @@ "esutils": "^2.0.2" } }, - "escodegen": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.13.0.tgz", - "integrity": "sha512-eYk2dCkxR07DsHA/X2hRBj0CFAZeri/LyDMc0C8JT1Hqi6JnVpMhJ7XFITbb0+yZS3lVkaPL2oCkZ3AVmeVbMw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "html-tags": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", @@ -6545,9 +6505,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, - "optional": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -6585,191 +6543,6 @@ } } }, - "@storybook/addon-storyshots": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@storybook/addon-storyshots/-/addon-storyshots-5.3.2.tgz", - "integrity": "sha512-83imS+T5UVthV246FCD468lYWJjqDXPjAafDegJ5a2BDFkQvsNpIYU3E4qpLM9c6I8tVPAf/o7KMwkXC2ciXqA==", - "dev": true, - "requires": { - "@jest/transform": "^24.9.0", - "@storybook/addons": "5.3.2", - "@storybook/client-api": "5.3.2", - "@storybook/core": "5.3.2", - "@types/glob": "^7.1.1", - "@types/jest": "^24.0.16", - "@types/jest-specific-snapshot": "^0.5.3", - "babel-plugin-require-context-hook": "^1.0.0", - "core-js": "^3.0.1", - "glob": "^7.1.3", - "global": "^4.3.2", - "jest-specific-snapshot": "^2.0.0", - "read-pkg-up": "^7.0.0", - "regenerator-runtime": "^0.13.3", - "ts-dedent": "^1.1.0" - }, - "dependencies": { - "@types/jest": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.9.1.tgz", - "integrity": "sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q==", - "dev": true, - "requires": { - "jest-diff": "^24.3.0" - } - }, - "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" - } - }, - "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" - } - }, - "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" - } - }, - "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" - } - }, - "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 - }, - "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 - }, - "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" - } - }, - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", - "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" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "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 - } - } - }, "@storybook/addon-storysource": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/@storybook/addon-storysource/-/addon-storysource-5.3.2.tgz", @@ -7089,218 +6862,10 @@ "webpack-virtual-modules": "^0.2.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", - "dev": true - }, - "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", - "dev": true - }, - "@babel/plugin-proposal-class-properties": { - "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" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.0" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "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" - } - }, - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.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" @@ -7310,7 +6875,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "dev": true, "requires": { "type-fest": "^0.8.1" } @@ -7318,8 +6882,7 @@ "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 + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "autoprefixer": { "version": "9.7.4", @@ -7349,64 +6912,12 @@ } } }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "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 - } - } - }, "braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -7416,23 +6927,6 @@ "fill-range": "^7.0.1" } }, - "browserslist": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.5.tgz", - "integrity": "sha512-4LMHuicxkabIB+n9874jZX/az1IaZ5a+EUuvD7KFOu9x/Bd5YHyO0DIz2ls/Kl8g0ItS4X/ilEgf4T1Br0lgSg==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001022", - "electron-to-chromium": "^1.3.338", - "node-releases": "^1.1.46" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, "cacache": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", @@ -7512,7 +7006,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, "requires": { "restore-cursor": "^3.1.0" } @@ -7532,32 +7025,10 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "commander": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.0.tgz", - "integrity": "sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==", - "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" - } - }, - "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 - }, "cosmiconfig": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dev": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", @@ -7570,95 +7041,19 @@ "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" } }, - "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.339", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.339.tgz", - "integrity": "sha512-C1i/vH6/kQx9YV8RddMkmW216GwW4pTrnYIlKmDFIqXA4fPwqDxIdGyHsuG+fgurHoljRz7/oaD+tztcryW/9g==", - "dev": true - }, "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 - }, - "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 - } - } + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "figures": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", - "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } @@ -7672,38 +7067,6 @@ "to-regex-range": "^5.0.1" } }, - "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-cache-dir": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", @@ -7751,8 +7114,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==" }, "graceful-fs": { "version": "4.2.3", @@ -7764,7 +7126,6 @@ "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", @@ -7777,45 +7138,10 @@ "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" } }, - "inquirer": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.3.tgz", - "integrity": "sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "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" - } - } - } - }, "interpret": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.0.0.tgz", @@ -7825,14 +7151,12 @@ "ipaddr.js": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", - "dev": true + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" }, "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 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-number": { "version": "7.0.0", @@ -7846,27 +7170,6 @@ "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", "dev": true }, - "jest-worker": { - "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" - }, - "dependencies": { - "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" - } - } - } - }, "json5": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", @@ -7927,8 +7230,7 @@ "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==" }, "micromatch": { "version": "4.0.2", @@ -7943,20 +7245,17 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "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 + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" }, "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" } @@ -7964,8 +7263,7 @@ "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==" }, "minipass": { "version": "3.1.1", @@ -7979,20 +7277,17 @@ "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==" }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "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==" }, "node-fetch": { "version": "2.6.0", @@ -8004,7 +7299,6 @@ "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" } @@ -8046,7 +7340,6 @@ "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", @@ -8057,8 +7350,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==" }, "path-exists": { "version": "4.0.0", @@ -8075,8 +7367,7 @@ "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 + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pkg-dir": { "version": "4.2.0", @@ -8143,16 +7434,6 @@ "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==", "dev": true }, - "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" - } - }, "qs": { "version": "6.9.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz", @@ -8162,20 +7443,7 @@ "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" - } + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "regenerator-runtime": { "version": "0.13.3", @@ -8202,7 +7470,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, "requires": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -8221,7 +7488,6 @@ "version": "6.5.4", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, "requires": { "tslib": "^1.9.0" } @@ -8240,7 +7506,6 @@ "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", @@ -8261,7 +7526,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" }, @@ -8269,16 +7533,14 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "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 + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -8292,7 +7554,6 @@ "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", @@ -8303,8 +7564,7 @@ "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "ssri": { "version": "7.1.0", @@ -8319,14 +7579,12 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "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", @@ -8337,7 +7595,6 @@ "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" } @@ -8348,7 +7605,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" }, @@ -8356,8 +7612,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==" } } }, @@ -8397,18 +7652,7 @@ "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" - } + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" }, "unique-filename": { "version": "1.1.1", @@ -9665,15 +8909,6 @@ "pretty-format": "^25.1.0" }, "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", @@ -9736,8 +8971,7 @@ "regenerator-runtime": { "version": "0.13.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" } } }, @@ -9752,20 +8986,10 @@ "@types/testing-library__react": "^10.0.0" }, "dependencies": { - "@babel/runtime": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", - "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, "regenerator-runtime": { "version": "0.13.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", - "dev": true + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" } } }, @@ -9846,8 +9070,7 @@ "@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 + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, "@types/events": { "version": "3.0.0", @@ -9887,14 +9110,12 @@ "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", - "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", - "dev": true + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==" }, "@types/istanbul-lib-report": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", - "dev": true, "requires": { "@types/istanbul-lib-coverage": "*" } @@ -9903,142 +9124,16 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", - "dev": true, "requires": { "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, "@types/jest": { - "version": "25.2.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.2.1.tgz", - "integrity": "sha512-msra1bCaAeEdkSyA0CZ6gW1ukMIvZ5YoJkdXw/qhQdsuuDlFTcEUrUw8CLCPt2rVRUfXlClVvK2gvPs9IokZaA==", - "dev": true, - "requires": { - "jest-diff": "^25.2.1", - "pretty-format": "^25.2.1" - }, - "dependencies": { - "@jest/types": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.2.6.tgz", - "integrity": "sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ==", - "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" - } - }, - "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 - }, - "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "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-diff": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.2.6.tgz", - "integrity": "sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.2.6" - } - }, - "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 - }, - "pretty-format": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", - "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", - "dev": true, - "requires": { - "@jest/types": "^25.2.6", - "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" - } - } - } - }, - "@types/jest-specific-snapshot": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@types/jest-specific-snapshot/-/jest-specific-snapshot-0.5.4.tgz", - "integrity": "sha512-1qISn4fH8wkOOPFEx+uWRRjw6m/pP/It3OHLm8Ee1KQpO7Z9ZGYDtWPU5AgK05UXsNTAgOK+dPQvJKGdy9E/1g==", - "dev": true, - "requires": { - "@types/jest": "*" - } + "version": "23.3.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-23.3.14.tgz", + "integrity": "sha512-Q5hTcfdudEL2yOmluA1zaSyPbzWPmJ3XfSWeP3RyoYvS9hnje1ZyagrZOuQ6+1nQC1Gw+7gap3pLNL3xL6UBug==", + "dev": true }, "@types/json-schema": { "version": "7.0.4", @@ -10061,12 +9156,24 @@ "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==", "dev": true }, + "@types/mime-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", + "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=", + "dev": true + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "dev": true + }, "@types/node": { "version": "12.7.11", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.11.tgz", @@ -10188,8 +9295,7 @@ "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", - "dev": true + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" }, "@types/testing-library__dom": { "version": "7.0.1", @@ -10350,7 +9456,6 @@ "version": "15.0.4", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", - "dev": true, "requires": { "@types/yargs-parser": "*" } @@ -10358,8 +9463,17 @@ "@types/yargs-parser": { "version": "13.1.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", - "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", - "dev": true + "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==" + }, + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } }, "@typescript-eslint/experimental-utils": { "version": "2.26.0", @@ -10652,6 +9766,7 @@ "version": "file:packages/api-fetch", "requires": { "@babel/runtime": "^7.9.2", + "@wordpress/deprecated": "file:packages/deprecated", "@wordpress/element": "file:packages/element", "@wordpress/i18n": "file:packages/i18n", "@wordpress/url": "file:packages/url" @@ -10830,7 +9945,7 @@ "hpq": "^1.3.0", "lodash": "^4.17.15", "rememo": "^3.0.0", - "showdown": "^1.8.6", + "showdown": "^1.9.1", "simple-html-tokenizer": "^0.5.7", "tinycolor2": "^1.4.1", "uuid": "^7.0.2" @@ -10896,6 +10011,7 @@ "@wordpress/api-fetch": "file:packages/api-fetch", "@wordpress/blocks": "file:packages/blocks", "@wordpress/data": "file:packages/data", + "@wordpress/data-controls": "file:packages/data-controls", "@wordpress/deprecated": "file:packages/deprecated", "@wordpress/element": "file:packages/element", "@wordpress/i18n": "file:packages/i18n", @@ -11049,6 +10165,7 @@ "@wordpress/keyboard-shortcuts": "file:packages/keyboard-shortcuts", "@wordpress/media-utils": "file:packages/media-utils", "@wordpress/notices": "file:packages/notices", + "classnames": "^2.2.5", "lodash": "^4.17.15", "rememo": "^3.0.0" } @@ -11324,7 +10441,7 @@ "dev": true, "requires": { "@babel/runtime": "^7.9.2", - "axe-puppeteer": "^1.0.0" + "axe-puppeteer": "^1.1.0" } }, "@wordpress/keyboard-shortcuts": { @@ -11508,9 +10625,9 @@ "markdownlint": "^0.18.0", "markdownlint-cli": "^0.21.0", "minimist": "^1.2.0", - "npm-package-json-lint": "^4.0.3", + "npm-package-json-lint": "^5.0.0", "prettier": "npm:wp-prettier@1.19.1", - "puppeteer": "^2.0.0", + "puppeteer": "npm:puppeteer-core@3.0.0", "read-pkg-up": "^1.0.1", "resolve-bin": "^0.4.0", "source-map-loader": "^0.2.4", @@ -11615,6 +10732,12 @@ "through": ">=2.2.7 <3" } }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -11652,6 +10775,30 @@ "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", "dev": true }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + } + } + }, "acorn-jsx": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz", @@ -12056,7 +11203,8 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true }, "ansi-styles": { "version": "3.2.1", @@ -12105,7 +11253,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -12137,7 +11284,6 @@ "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" }, @@ -12145,8 +11291,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" } } }, @@ -12171,20 +11316,17 @@ "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "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==", - "dev": true + "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=", - "dev": true + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, "array-differ": { "version": "2.1.0", @@ -12274,8 +11416,7 @@ "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, "array.prototype.find": { "version": "2.1.0", @@ -12651,8 +11792,7 @@ "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "ast-types": { "version": "0.12.4", @@ -12708,8 +11848,7 @@ "atob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=" }, "atob-lite": { "version": "2.0.0", @@ -12806,18 +11945,18 @@ "dev": true }, "axe-core": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.4.0.tgz", - "integrity": "sha512-5C0OdgxPv/DrQguO6Taj5F1dY5OlkWg4SVmZIVABFYKWlnAc5WTLPzG+xJSgIwf2fmY+NiNGiZXhXx2qT0u/9Q==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.3.tgz", + "integrity": "sha512-HZpLE7xu05+8AbpqXITGdxp1Xwk8ysAXrg7MiKRY27py3DAyEJpoJQo1727pWF3F+O79V3r+cTWhOzfB49P89w==", "dev": true }, "axe-puppeteer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/axe-puppeteer/-/axe-puppeteer-1.0.0.tgz", - "integrity": "sha512-hTF3u4mtatgTN7fsLVyVgbRdNc15ngjDcTEuqhn9A7ugqLhLCryJWp9fzqZkNlrW8awPcxugyTwLPR7mRdPZmA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/axe-puppeteer/-/axe-puppeteer-1.1.0.tgz", + "integrity": "sha512-VS17Y1rDQe6A0PdeTPxwOSBfmOdj6efgxyre9cN1du1snnVilczSDtQsgifBKBlzoL/3DKfGpgIi+N+zrzODOg==", "dev": true, "requires": { - "axe-core": "^3.1.2" + "axe-core": "^3.5.3" } }, "axobject-query": { @@ -13865,12 +13004,6 @@ "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==", "dev": true }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "recast": { "version": "0.14.7", "resolved": "https://registry.npmjs.org/recast/-/recast-0.14.7.tgz", @@ -14154,7 +13287,6 @@ "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -14169,7 +13301,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -14178,7 +13309,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -14187,7 +13317,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -14196,7 +13325,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -14556,12 +13684,6 @@ "has-flag": "^4.0.0" } }, - "term-size": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", - "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", - "dev": true - }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -14601,7 +13723,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -14619,7 +13740,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -14769,7 +13889,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", - "dev": true, "requires": { "node-int64": "^0.4.0" } @@ -14931,7 +14050,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -15058,7 +14176,8 @@ "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true }, "camelcase-css": { "version": "2.0.1", @@ -15110,7 +14229,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, "requires": { "rsvp": "^4.8.4" } @@ -15291,6 +14409,32 @@ "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", "dev": true }, + "cheerio": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", + "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", + "dev": true, + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.1", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + }, + "dependencies": { + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + } + } + }, "chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -15316,12 +14460,6 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true } } }, @@ -15343,8 +14481,7 @@ "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "cipher-base": { "version": "1.0.4", @@ -15360,7 +14497,6 @@ "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -15372,7 +14508,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -15515,6 +14650,7 @@ "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", @@ -15610,7 +14746,8 @@ "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=" + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true }, "collapse-white-space": { "version": "1.0.4", @@ -15628,7 +14765,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -15775,8 +14911,7 @@ "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, "compressible": { "version": "2.0.17", @@ -15975,21 +15110,6 @@ "ms": "2.0.0" } }, - "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" - } - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -15999,8 +15119,7 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" } } }, @@ -16550,8 +15669,7 @@ "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "copy-dir": { "version": "1.2.0", @@ -16609,21 +15727,6 @@ } } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -16780,21 +15883,11 @@ "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" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - } } }, "crypto-browserify": { @@ -16976,47 +16069,6 @@ } } }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", - "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", - "dev": true, - "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.16", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.0.0" - } - }, - "postcss-modules-scope": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", - "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", - "dev": true, - "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" - } - }, "postcss-value-parser": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", @@ -17215,6 +16267,12 @@ } } }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, "cssstyle": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", @@ -17222,14 +16280,6 @@ "dev": true, "requires": { "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } } }, "csstype": { @@ -17286,6 +16336,17 @@ "assert-plus": "^1.0.0" } }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, "date-fns": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", @@ -17360,8 +16421,7 @@ "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "decompress-response": { "version": "5.0.0", @@ -17498,7 +16558,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -17508,7 +16567,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -17517,7 +16575,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -17526,7 +16583,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -17572,15 +16628,6 @@ "fill-range": "^7.0.1" } }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, "fast-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.0.4.tgz", @@ -17670,12 +16717,6 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-path-inside": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.1.tgz", - "integrity": "sha512-CKstxrctq1kUesU6WhtZDbYKzzYBuRH0UYInAVrkc/EYdB9ltbfE0gOoayG9nhohG6447sOOVGhHqsdmBvkbNg==", - "dev": true - }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -17689,17 +16730,7 @@ "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 - }, - "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "slash": { "version": "3.0.0", @@ -17744,8 +16775,7 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "deprecation": { "version": "2.0.0", @@ -17766,8 +16796,7 @@ "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detab": { "version": "2.0.2", @@ -17844,9 +16873,9 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", "dev": true }, "diffie-hellman": { @@ -17971,8 +17000,7 @@ "domelementtype": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" }, "domexception": { "version": "1.0.1", @@ -18096,8 +17124,7 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "ejs": { "version": "2.7.4", @@ -18144,8 +17171,7 @@ "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 + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "emojis-list": { "version": "2.1.0", @@ -18164,15 +17190,6 @@ "hoist-non-react-statics": "^3.3.0" }, "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, "@emotion/weak-memoize": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", @@ -18193,8 +17210,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "encoding": { "version": "0.1.12", @@ -18208,7 +17224,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -18239,8 +17254,7 @@ "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" }, "env-paths": { "version": "1.0.0", @@ -18321,20 +17335,6 @@ } } }, - "cheerio": { - "version": "1.0.0-rc.3", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", - "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", - "dev": true, - "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.1", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash": "^4.15.0", - "parse5": "^3.0.1" - } - }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -18348,7 +17348,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", - "dev": true, "requires": { "domelementtype": "^1.3.0", "entities": "^1.1.1" @@ -18823,15 +17822,308 @@ "string.prototype.trimright": "^2.1.1" }, "dependencies": { - "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-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" + } + }, + "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" + } + }, + "function.prototype.name": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.2.tgz", + "integrity": "sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "functions-have-names": "^1.2.0" + } + }, + "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-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 + }, + "object.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "react-is": { + "version": "16.13.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz", + "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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" + } + } + } + }, + "enzyme-shallow-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.1.tgz", + "integrity": "sha512-hGA3i1so8OrYOZSM9whlkNmVHOicJpsjgTzC+wn2JMJXhq1oO4kA4bJ5MsfzSIcC71aLDKzJ6gZpIxrqt3QTAQ==", + "dev": true, + "requires": { + "has": "^1.0.3", + "object-is": "^1.0.2" + }, + "dependencies": { + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", + "dev": true + } + } + }, + "enzyme-to-json": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.4.4.tgz", + "integrity": "sha512-50LELP/SCPJJGic5rAARvU7pgE3m1YaNj7JLM+Qkhl5t7PAs6fiyc8xzc50RnkKPFQCv0EeFVjEWdIFRGPWMsA==", + "dev": true, + "requires": { + "lodash": "^4.17.15", + "react-is": "^16.12.0" + }, + "dependencies": { + "react-is": { + "version": "16.13.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz", + "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==", + "dev": true + } + } + }, + "equivalent-key-map": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/equivalent-key-map/-/equivalent-key-map-0.2.2.tgz", + "integrity": "sha512-xvHeyCDbZzkpN4VHQj/n+j2lOwL0VWszG30X4cOrc9Y7Tuo2qCdZK/0AMod23Z5dCtNUbaju6p0rwOhHUk05ew==" + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", + "dev": true, + "requires": { + "string-template": "~0.2.1", + "xtend": "~4.0.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "errorhandler": { + "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" + }, + "dependencies": { + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "requires": { + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-get-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.0.2.tgz", + "integrity": "sha512-ZHb4fuNK3HKHEOvDGyHPKf5cSWh/OvAMskeM/+21NMnTuvqFvz8uHatolu+7Kf6b6oK9C+3Uo1T37pSGPWv0MA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.0", + "is-set": "^2.0.0", + "is-string": "^1.0.4", + "isarray": "^2.0.5" + }, + "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", @@ -18851,291 +18143,6 @@ "is-symbol": "^1.0.2" } }, - "function.prototype.name": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.2.tgz", - "integrity": "sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "functions-have-names": "^1.2.0" - } - }, - "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-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 - }, - "object.entries": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", - "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "object.fromentries": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", - "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "react-is": { - "version": "16.13.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz", - "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "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" - } - } - } - }, - "enzyme-shallow-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.1.tgz", - "integrity": "sha512-hGA3i1so8OrYOZSM9whlkNmVHOicJpsjgTzC+wn2JMJXhq1oO4kA4bJ5MsfzSIcC71aLDKzJ6gZpIxrqt3QTAQ==", - "dev": true, - "requires": { - "has": "^1.0.3", - "object-is": "^1.0.2" - }, - "dependencies": { - "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", - "dev": true - } - } - }, - "enzyme-to-json": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.4.4.tgz", - "integrity": "sha512-50LELP/SCPJJGic5rAARvU7pgE3m1YaNj7JLM+Qkhl5t7PAs6fiyc8xzc50RnkKPFQCv0EeFVjEWdIFRGPWMsA==", - "dev": true, - "requires": { - "lodash": "^4.17.15", - "react-is": "^16.12.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz", - "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==", - "dev": true - } - } - }, - "equivalent-key-map": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/equivalent-key-map/-/equivalent-key-map-0.2.2.tgz", - "integrity": "sha512-xvHeyCDbZzkpN4VHQj/n+j2lOwL0VWszG30X4cOrc9Y7Tuo2qCdZK/0AMod23Z5dCtNUbaju6p0rwOhHUk05ew==" - }, - "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", - "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", - "dev": true, - "requires": { - "string-template": "~0.2.1", - "xtend": "~4.0.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "errorhandler": { - "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" - }, - "dependencies": { - "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" - } - }, - "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 - }, - "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" - } - }, - "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 - } - } - }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } - }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "es-get-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.0.2.tgz", - "integrity": "sha512-ZHb4fuNK3HKHEOvDGyHPKf5cSWh/OvAMskeM/+21NMnTuvqFvz8uHatolu+7Kf6b6oK9C+3Uo1T37pSGPWv0MA==", - "dev": true, - "requires": { - "es-abstract": "^1.17.0-next.1", - "has-symbols": "^1.0.1", - "is-arguments": "^1.0.4", - "is-map": "^2.0.0", - "is-set": "^2.0.0", - "is-string": "^1.0.4", - "isarray": "^2.0.5" - }, - "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" - } - }, - "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", @@ -19178,12 +18185,6 @@ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", "dev": true }, - "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 - }, "string.prototype.trimleft": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", @@ -19246,14 +18247,35 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "escodegen": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.13.0.tgz", + "integrity": "sha512-eYk2dCkxR07DsHA/X2hRBj0CFAZeri/LyDMc0C8JT1Hqi6JnVpMhJ7XFITbb0+yZS3lVkaPL2oCkZ3AVmeVbMw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "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, + "optional": true + } + } + }, "eslint": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", @@ -20229,6 +19251,11 @@ "acorn-jsx": "^4.1.1" } }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, "esquery": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz", @@ -20270,8 +19297,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "event-target-shim": { "version": "5.0.1", @@ -20313,8 +19339,7 @@ "exec-sh": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", - "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", - "dev": true + "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==" }, "execa": { "version": "4.0.0", @@ -20450,7 +19475,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -20465,7 +19489,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" } @@ -20474,7 +19497,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -20483,7 +19505,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -20500,78 +19521,157 @@ } }, "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.3.0.tgz", + "integrity": "sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" + "@jest/types": "^25.3.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-regex-util": "^25.2.6" }, "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==", + "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/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "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": { - "@types/yargs-parser": "*" + "fill-range": "^7.0.1" } }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "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 }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "to-regex-range": "^5.0.1" } }, - "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "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-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-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==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.4.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "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" + } + } } }, - "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "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 + }, + "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": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "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" } } } @@ -20768,7 +19868,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -20778,7 +19877,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -20811,7 +19909,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -20827,7 +19924,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -20836,7 +19932,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -20845,7 +19940,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -20854,7 +19948,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -20863,7 +19956,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -20947,8 +20039,7 @@ "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=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fast-levenshtein": { "version": "2.0.6", @@ -20992,7 +20083,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", - "dev": true, "requires": { "bser": "^2.0.0" } @@ -21218,7 +20308,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -21230,7 +20319,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -21376,6 +20464,7 @@ "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" } @@ -21528,8 +20617,7 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "for-own": { "version": "0.1.5", @@ -21613,7 +20701,6 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, "requires": { "map-cache": "^0.2.2" } @@ -21621,8 +20708,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "from2": { "version": "2.3.0", @@ -21950,13 +21036,13 @@ "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", - "dev": true + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" }, "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==" + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true }, "get-own-enumerable-property-symbols": { "version": "3.0.0", @@ -22053,6 +21139,12 @@ } } }, + "get-port": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", + "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", + "dev": true + }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -22062,13 +21154,13 @@ "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, "getpass": { "version": "0.1.7", @@ -22706,6 +21798,12 @@ "har-schema": "^2.0.0" } }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -22751,7 +21849,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -22762,7 +21859,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -22772,7 +21868,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -23031,14 +22126,6 @@ "param-case": "^2.1.1", "relateurl": "^0.2.7", "terser": "^4.3.9" - }, - "dependencies": { - "commander": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.0.tgz", - "integrity": "sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==", - "dev": true - } } }, "html-tags": { @@ -23179,8 +22266,7 @@ "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 + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" }, "humanize-ms": { "version": "1.2.1", @@ -23962,6 +23048,14 @@ "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": { @@ -24011,12 +23105,6 @@ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", "dev": true }, - "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 - }, "string.prototype.trimleft": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", @@ -24057,7 +23145,8 @@ "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=" + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true }, "ip": { "version": "1.1.5", @@ -24078,9 +23167,9 @@ "dev": true }, "irregular-plurals": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz", - "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.2.0.tgz", + "integrity": "sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q==", "dev": true }, "is-absolute-url": { @@ -24093,7 +23182,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -24102,7 +23190,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -24160,8 +23247,7 @@ "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 + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-builtin-module": { "version": "1.0.0", @@ -24181,7 +23267,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, "requires": { "ci-info": "^2.0.0" } @@ -24204,7 +23289,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -24213,7 +23297,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -24235,7 +23318,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -24245,8 +23327,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, @@ -24286,8 +23367,7 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "2.1.1", @@ -24352,7 +23432,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -24361,7 +23440,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -24395,6 +23473,12 @@ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true }, + "is-path-inside": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.1.tgz", + "integrity": "sha512-CKstxrctq1kUesU6WhtZDbYKzzYBuRH0UYInAVrkc/EYdB9ltbfE0gOoayG9nhohG6447sOOVGhHqsdmBvkbNg==", + "dev": true + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -24404,7 +23488,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "requires": { "isobject": "^3.0.1" } @@ -24515,8 +23598,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", @@ -24533,8 +23615,7 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, "is-word-character": { "version": "1.0.4", @@ -24561,8 +23642,7 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "isomorphic-fetch": { "version": "2.2.1", @@ -24582,14 +23662,12 @@ "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==", - "dev": true + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==" }, "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", @@ -24603,8 +23681,7 @@ "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==" } } }, @@ -24670,6 +23747,16 @@ } } }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, "iterate-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", @@ -24709,42 +23796,6 @@ "slash": "^3.0.0" } }, - "@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==", - "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", - "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", - "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", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "realpath-native": "^2.0.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, "@jest/source-map": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", @@ -24772,7 +23823,6 @@ "version": "25.3.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.3.0.tgz", "integrity": "sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg==", - "dev": true, "requires": { "@babel/core": "^7.1.0", "@jest/types": "^25.3.0", @@ -24796,7 +23846,6 @@ "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" } @@ -24804,14 +23853,12 @@ "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 + "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==", - "dev": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" @@ -24821,7 +23868,6 @@ "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" @@ -24831,7 +23877,6 @@ "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", @@ -24844,7 +23889,6 @@ "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" } @@ -24859,7 +23903,6 @@ "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" @@ -24880,7 +23923,6 @@ "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" } @@ -24888,26 +23930,18 @@ "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 + "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==", - "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, - "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -24918,7 +23952,6 @@ "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", @@ -24932,25 +23965,10 @@ "strip-final-newline": "^2.0.0" } }, - "expect": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.3.0.tgz", - "integrity": "sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==", - "dev": true, - "requires": { - "@jest/types": "^25.3.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-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" } @@ -24969,7 +23987,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", - "dev": true, "optional": true }, "get-caller-file": { @@ -24982,7 +23999,6 @@ "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" } @@ -24991,7 +24007,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", @@ -25004,14 +24019,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==" }, "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 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "import-local": { "version": "3.0.2", @@ -25032,25 +24045,12 @@ "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 + "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "execa": "^3.2.0", - "throat": "^5.0.0" - } + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" }, "jest-cli": { "version": "25.3.0", @@ -25073,29 +24073,15 @@ "yargs": "^15.3.1" } }, - "jest-diff": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz", - "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.3.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 + "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==", - "dev": true, "requires": { "@jest/types": "^25.3.0", "anymatch": "^3.0.3", @@ -25115,7 +24101,6 @@ "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", @@ -25129,56 +24114,17 @@ "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.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz", - "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^2.0.0", - "resolve": "^1.15.1" - } + "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==", - "dev": true - }, - "jest-snapshot": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.3.0.tgz", - "integrity": "sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^25.3.0", - "@types/prettier": "^1.19.0", - "chalk": "^3.0.0", - "expect": "^25.3.0", - "jest-diff": "^25.3.0", - "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-resolve": "^25.3.0", - "make-dir": "^3.0.0", - "natural-compare": "^1.4.0", - "pretty-format": "^25.3.0", - "semver": "^6.3.0" - } + "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==", - "dev": true, "requires": { "@jest/types": "^25.3.0", "chalk": "^3.0.0", @@ -25190,7 +24136,6 @@ "version": "25.2.6", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", - "dev": true, "requires": { "merge-stream": "^2.0.0", "supports-color": "^7.0.0" @@ -25208,14 +24153,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==" }, "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" @@ -25224,20 +24167,17 @@ "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==" }, "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 + "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==", - "dev": true, "requires": { "path-key": "^3.0.0" } @@ -25246,7 +24186,6 @@ "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" } @@ -25254,8 +24193,7 @@ "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 + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==" }, "p-limit": { "version": "2.3.0", @@ -25290,14 +24228,12 @@ "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 + "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==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "pkg-dir": { "version": "4.2.0", @@ -25312,7 +24248,6 @@ "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", @@ -25324,7 +24259,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" @@ -25333,14 +24267,12 @@ "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 + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "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 + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==" }, "require-main-filename": { "version": "2.0.0", @@ -25352,7 +24284,6 @@ "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" } @@ -25375,14 +24306,12 @@ "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==" }, "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" } @@ -25390,20 +24319,17 @@ "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 + "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==", - "dev": true + "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==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "string-width": { "version": "4.2.0", @@ -25429,33 +24355,19 @@ "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" } }, - "test-exclude": { - "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", - "minimatch": "^3.0.4" - } - }, "throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": true + "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" } @@ -25463,14 +24375,12 @@ "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 + "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==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -25490,7 +24400,6 @@ "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", @@ -25535,6 +24444,145 @@ } } }, + "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==", + "dev": true, + "requires": { + "@jest/types": "^25.3.0", + "execa": "^3.2.0", + "throat": "^5.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + }, + "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 + }, + "throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "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" + } + } + } + }, "jest-config": { "version": "25.3.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.3.0.tgz", @@ -25650,20 +24698,6 @@ "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", "dev": true }, - "jest-resolve": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz", - "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^2.0.0", - "resolve": "^1.15.1" - } - }, "jest-util": { "version": "25.3.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", @@ -25689,8 +24723,7 @@ "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 + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "pretty-format": { "version": "25.3.0", @@ -25720,7 +24753,6 @@ "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" } @@ -25819,64 +24851,107 @@ } }, "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz", + "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==", "dev": true, "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.3.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==", + "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": "^13.0.0" + "@types/yargs": "^15.0.0", + "chalk": "^3.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==", + "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/yargs-parser": "*" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "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 - }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "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": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "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 + }, + "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 + }, "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "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==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "@jest/types": "^25.4.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" } } } @@ -26009,12 +25084,6 @@ "css": "^2.2.1" }, "dependencies": { - "@types/jest": { - "version": "23.3.14", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-23.3.14.tgz", - "integrity": "sha512-Q5hTcfdudEL2yOmluA1zaSyPbzWPmJ3XfSWeP3RyoYvS9hnje1ZyagrZOuQ6+1nQC1Gw+7gap3pLNL3xL6UBug==", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -26590,26 +25659,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true - }, - "expect": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.3.0.tgz", - "integrity": "sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==", - "dev": true, - "requires": { - "@jest/types": "^25.3.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-regex-util": "^25.2.6" - } - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -26637,23 +25686,10 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "jest-diff": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz", - "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.3.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 + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==" }, "jest-message-util": { "version": "25.3.0", @@ -26673,44 +25709,7 @@ "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.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz", - "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^2.0.0", - "resolve": "^1.15.1" - } - }, - "jest-snapshot": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.3.0.tgz", - "integrity": "sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^25.3.0", - "@types/prettier": "^1.19.0", - "chalk": "^3.0.0", - "expect": "^25.3.0", - "jest-diff": "^25.3.0", - "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-resolve": "^25.3.0", - "make-dir": "^3.0.0", - "natural-compare": "^1.4.0", - "pretty-format": "^25.3.0", - "semver": "^6.3.0" - } + "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==" }, "jest-util": { "version": "25.3.0", @@ -26737,8 +25736,7 @@ "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 + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "pretty-format": { "version": "25.3.0", @@ -26761,14 +25759,12 @@ "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 + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==" }, "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" } @@ -26776,8 +25772,7 @@ "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==" }, "slash": { "version": "3.0.0", @@ -27042,30 +26037,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "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-diff": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz", - "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.3.0" - } - }, "jest-get-type": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", @@ -27210,47 +26187,88 @@ "dev": true }, "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz", + "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==", "dev": true, "requires": { - "@jest/types": "^24.9.0", + "@jest/types": "^25.3.0", "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", + "chalk": "^3.0.0", "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" + "realpath-native": "^2.0.0", + "resolve": "^1.15.1" }, "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==", + "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/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "@types/yargs-parser": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "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 + }, + "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 + }, + "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 + }, + "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" + } + }, + "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" } } } @@ -27269,14 +26287,12 @@ "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 + "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==", - "dev": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" @@ -27286,7 +26302,6 @@ "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" } @@ -27295,7 +26310,6 @@ "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" @@ -27305,7 +26319,6 @@ "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" } @@ -27313,34 +26326,12 @@ "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 - }, - "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true - }, - "expect": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.3.0.tgz", - "integrity": "sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==", - "dev": true, - "requires": { - "@jest/types": "^25.3.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-regex-util": "^25.2.6" - } + "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==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -27348,38 +26339,22 @@ "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 + "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==", - "dev": true - }, - "jest-diff": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz", - "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.3.0" - } + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "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 + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==" }, "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", @@ -27396,47 +26371,10 @@ "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", "dev": true }, - "jest-resolve": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz", - "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^2.0.0", - "resolve": "^1.15.1" - } - }, - "jest-snapshot": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.3.0.tgz", - "integrity": "sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^25.3.0", - "@types/prettier": "^1.19.0", - "chalk": "^3.0.0", - "expect": "^25.3.0", - "jest-diff": "^25.3.0", - "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-resolve": "^25.3.0", - "make-dir": "^3.0.0", - "natural-compare": "^1.4.0", - "pretty-format": "^25.3.0", - "semver": "^6.3.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" @@ -27445,14 +26383,12 @@ "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 + "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==", - "dev": true, "requires": { "@jest/types": "^25.3.0", "ansi-regex": "^5.0.0", @@ -27463,20 +26399,17 @@ "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 + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "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 + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==" }, "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" } @@ -27484,20 +26417,17 @@ "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==" }, "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==" }, "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" } @@ -27506,7 +26436,6 @@ "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" } @@ -27698,20 +26627,6 @@ "stack-utils": "^1.0.1" } }, - "jest-resolve": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz", - "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^2.0.0", - "resolve": "^1.15.1" - } - }, "jest-serializer": { "version": "25.2.6", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", @@ -27765,20 +26680,17 @@ "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 + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "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 + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==" }, "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" } @@ -27925,14 +26837,12 @@ "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 + "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==", - "dev": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" @@ -28001,7 +26911,6 @@ "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" } @@ -28009,14 +26918,7 @@ "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 - }, - "diff-sequences": { - "version": "25.2.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", - "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "emoji-regex": { "version": "8.0.0", @@ -28024,20 +26926,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "expect": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.3.0.tgz", - "integrity": "sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==", - "dev": true, - "requires": { - "@jest/types": "^25.3.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-regex-util": "^25.2.6" - } - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -28108,23 +26996,10 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "jest-diff": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz", - "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==", - "dev": true, - "requires": { - "chalk": "^3.0.0", - "diff-sequences": "^25.2.6", - "jest-get-type": "^25.2.6", - "pretty-format": "^25.3.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 + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==" }, "jest-haste-map": { "version": "25.3.0", @@ -28176,48 +27051,12 @@ "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", "dev": true }, - "jest-resolve": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz", - "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==", - "dev": true, - "requires": { - "@jest/types": "^25.3.0", - "browser-resolve": "^1.11.3", - "chalk": "^3.0.0", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^2.0.0", - "resolve": "^1.15.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 }, - "jest-snapshot": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.3.0.tgz", - "integrity": "sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^25.3.0", - "@types/prettier": "^1.19.0", - "chalk": "^3.0.0", - "expect": "^25.3.0", - "jest-diff": "^25.3.0", - "jest-get-type": "^25.2.6", - "jest-matcher-utils": "^25.3.0", - "jest-message-util": "^25.3.0", - "jest-resolve": "^25.3.0", - "make-dir": "^3.0.0", - "natural-compare": "^1.4.0", - "pretty-format": "^25.3.0", - "semver": "^6.3.0" - } - }, "jest-util": { "version": "25.3.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz", @@ -28304,14 +27143,12 @@ "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 + "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==", - "dev": true, "requires": { "@jest/types": "^25.3.0", "ansi-regex": "^5.0.0", @@ -28322,8 +27159,7 @@ "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 + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "realpath-native": { "version": "2.0.0", @@ -28341,7 +27177,6 @@ "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" } @@ -28349,8 +27184,7 @@ "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==" }, "slash": { "version": "3.0.0", @@ -28399,17 +27233,6 @@ "has-flag": "^4.0.0" } }, - "test-exclude": { - "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", - "minimatch": "^3.0.4" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -28521,104 +27344,207 @@ } }, "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.3.0.tgz", + "integrity": "sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "mkdirp": "^0.5.1", + "@jest/types": "^25.3.0", + "@types/prettier": "^1.19.0", + "chalk": "^3.0.0", + "expect": "^25.3.0", + "jest-diff": "^25.3.0", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.3.0", + "jest-message-util": "^25.3.0", + "jest-resolve": "^25.3.0", + "make-dir": "^3.0.0", "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" + "pretty-format": "^25.3.0", + "semver": "^6.3.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==", + "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/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "@types/yargs": { - "version": "13.0.8", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz", - "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==", + "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": { - "@types/yargs-parser": "*" + "fill-range": "^7.0.1" } }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "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 }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "to-regex-range": "^5.0.1" } }, - "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "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-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-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==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "@babel/code-frame": "^7.0.0", + "@jest/types": "^25.4.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^3.0.0", + "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" + } + } + } + }, + "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": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "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==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "@jest/types": "^25.4.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": { + "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 + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "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-specific-snapshot": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-specific-snapshot/-/jest-specific-snapshot-2.0.0.tgz", - "integrity": "sha512-aXaNqBg/svwEpY5iQEzEHc5I85cUBKgfeVka9KmpznxLnatpjiqjr7QLb/BYNYlsrZjZzgRHTjQJ+Svx+dbdvg==", - "dev": true, - "requires": { - "jest-snapshot": "^24.1.0" - } - }, "jest-util": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", @@ -29004,18 +27930,9 @@ "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } } }, "jsbn": { @@ -29069,12 +27986,6 @@ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "recast": { "version": "0.18.5", "resolved": "https://registry.npmjs.org/recast/-/recast-0.18.5.tgz", @@ -29135,41 +28046,16 @@ "xml-name-validator": "^3.0.0" }, "dependencies": { - "abab": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", - "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", - "dev": true - }, "acorn": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "dev": true, - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", - "dev": true - } - } - }, "acorn-walk": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "dev": true + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" }, "cssom": { "version": "0.4.4", @@ -29177,36 +28063,6 @@ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", "dev": true }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - } - }, - "escodegen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -29257,9 +28113,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, - "optional": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "tough-cookie": { "version": "3.0.1", @@ -29281,23 +28135,6 @@ "iconv-lite": "0.4.24" } }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, "ws": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", @@ -29309,8 +28146,7 @@ "jsesc": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", - "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=", - "dev": true + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=" }, "json-buffer": { "version": "3.0.1", @@ -29456,8 +28292,7 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" }, "klaw": { "version": "1.3.1", @@ -29511,6 +28346,7 @@ "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" } @@ -29546,6 +28382,23 @@ "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", "dev": true }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + }, + "dependencies": { + "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 + } + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -30024,6 +28877,7 @@ "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" @@ -30340,12 +29194,6 @@ "mem": "^4.0.0" } }, - "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.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", @@ -30499,17 +29347,8 @@ "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" - }, - "dependencies": { - "semver": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", - "dev": true - } } }, "make-fetch-happen": { @@ -30668,7 +29507,6 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", - "dev": true, "requires": { "tmpl": "1.0.x" } @@ -30691,8 +29529,7 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, "map-obj": { "version": "2.0.0", @@ -30716,7 +29553,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, "requires": { "object-visit": "^1.0.0" } @@ -30936,6 +29772,7 @@ "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" } @@ -31966,12 +30803,6 @@ "source-map": "^0.5.6", "vlq": "^1.0.0" } - }, - "vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true } } }, @@ -32046,12 +30877,6 @@ "source-map": "^0.5.6", "vlq": "^1.0.0" } - }, - "vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "dev": true } } }, @@ -32065,7 +30890,6 @@ "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -32116,7 +30940,8 @@ "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==" + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true }, "mimic-response": { "version": "2.1.0", @@ -32197,8 +31022,7 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "minimist-options": { "version": "3.0.2", @@ -32337,7 +31161,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -32347,7 +31170,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -32389,6 +31211,12 @@ } } }, + "mkdirp-classic": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.2.tgz", + "integrity": "sha512-ejdnDQcR75gwknmMw/tx02AuRs8jCtqFoFqDZMjiNxsu85sRIJVXDKHuLYvUUPRBUtV2FpSZa9bL1BUa3BdR2g==", + "dev": true + }, "mkdirp-promise": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", @@ -32500,8 +31328,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multimatch": { "version": "3.0.0", @@ -32542,14 +31369,12 @@ "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true + "dev": true }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, "requires": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -32634,8 +31459,7 @@ "nice-try": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", - "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", - "dev": true + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==" }, "no-case": { "version": "2.3.2", @@ -32760,8 +31584,7 @@ "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" }, "node-libs-browser": { "version": "2.2.1", @@ -32805,8 +31628,7 @@ "node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "dev": true + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" }, "node-notifier": { "version": "5.3.0", @@ -32966,18 +31788,6 @@ "true-case-path": "^1.0.2" }, "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -32990,12 +31800,6 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", @@ -33035,28 +31839,6 @@ "which": "^1.2.9" } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "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 - }, - "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" - } - }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", @@ -33066,12 +31848,6 @@ "repeating": "^2.0.0" } }, - "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 - }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", @@ -33099,30 +31875,16 @@ "mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" }, "mime-types": { "version": "2.1.24", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, "requires": { "mime-db": "1.40.0" } }, - "nan": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", - "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", - "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 - }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -33133,42 +31895,6 @@ "strip-indent": "^1.0.1" } }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "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.0", - "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.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -33261,12 +31987,6 @@ "yallist": "^3.0.0" } }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true - }, "node-gyp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-4.0.0.tgz", @@ -33394,7 +32114,6 @@ "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" } @@ -33563,24 +32282,26 @@ } }, "npm-package-json-lint": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-4.0.3.tgz", - "integrity": "sha512-cuvTR2l5dOjjlRR3a1CCp+mh2A2HyQRxydwdcYi0Z77NRlADpf7wF3Jf8XFLGZM7J6afXNRBofBjQ1UWFyOtKA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-5.0.0.tgz", + "integrity": "sha512-a7meq98EnSqniPWNhTj0TMJbTFKr8SPEkQep3iPCQVJWfhQ8fKI5+bUSgNyEbYfzfIrIjMTb0r/tCkX7FX+bYQ==", "dev": true, "requires": { - "ajv": "^6.10.2", + "ajv": "^6.12.0", "ajv-errors": "^1.0.1", - "chalk": "^2.4.2", - "cosmiconfig": "^5.2.1", + "chalk": "^4.0.0", + "cosmiconfig": "^6.0.0", "debug": "^4.1.1", - "globby": "^10.0.1", + "globby": "^11.0.0", "ignore": "^5.1.4", - "is-plain-obj": "^2.0.0", + "is-plain-obj": "^2.1.0", + "jsonc-parser": "^2.2.1", "log-symbols": "^3.0.0", - "meow": "^5.0.0", - "plur": "^3.1.1", - "semver": "^6.3.0", - "strip-json-comments": "^3.0.1" + "meow": "^6.1.0", + "plur": "^4.0.0", + "semver": "^7.2.2", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.0" }, "dependencies": { "@nodelib/fs.stat": { @@ -33589,6 +32310,18 @@ "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", "dev": true }, + "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" + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -33604,27 +32337,34 @@ "fill-range": "^7.0.1" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" } }, "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" } }, "debug": { @@ -33636,14 +32376,11 @@ "ms": "^2.1.1" } }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.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-glob": { "version": "3.1.1", @@ -33656,14 +32393,6 @@ "glob-parent": "^5.1.0", "merge2": "^1.3.0", "micromatch": "^4.0.2" - }, - "dependencies": { - "merge2": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", - "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", - "dev": true - } } }, "fill-range": { @@ -33675,18 +32404,14 @@ "to-regex-range": "^5.0.1" } }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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": { - "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" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "glob-parent": { @@ -33699,18 +32424,16 @@ } }, "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", + "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==", "dev": true, "requires": { - "@types/glob": "^7.1.1", "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", "slash": "^3.0.0" } }, @@ -33720,15 +32443,11 @@ "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", "dev": true }, - "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" - } + "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 }, "is-glob": { "version": "4.0.1", @@ -33746,11 +32465,26 @@ "dev": true }, "is-plain-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.0.0.tgz", - "integrity": "sha512-EYisGhpgSCwspmIuRHGjROWTon2Xp8Z7U03Wubk/bTL5TTRC5R1rGVgyjzBrk9+ULdH6cRD06KRcw/xfqhVYKQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, + "jsonc-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz", + "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==", + "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" + } + }, "log-symbols": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", @@ -33758,8 +32492,52 @@ "dev": true, "requires": { "chalk": "^2.4.2" + }, + "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" + } + } } }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "dev": true + }, + "meow": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.0.tgz", + "integrity": "sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.1.1", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.0.0", + "minimist-options": "^4.0.1", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.0", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.8.1", + "yargs-parser": "^18.1.1" + } + }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", + "dev": true + }, "micromatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", @@ -33770,32 +32548,164 @@ "picomatch": "^2.0.5" } }, + "minimist-options": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.0.2.tgz", + "integrity": "sha512-seq4hpWkYSUh1y7NXxzucwAN9yVlBc3Upgdjz8vLCP97jG8kaOmzYrVH/m7tQ1NYD1wdtZbSLfdy4zFmRWuc/w==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "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 }, + "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": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "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" + "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 + }, "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 }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "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" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "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" + } + }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", "dev": true }, "slash": { @@ -33804,10 +32714,19 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", "dev": true }, "to-regex-range": { @@ -33818,6 +32737,28 @@ "requires": { "is-number": "^7.0.0" } + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "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 + }, + "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==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -33894,7 +32835,8 @@ "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=" + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true }, "nwsapi": { "version": "2.2.0", @@ -33923,7 +32865,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -33934,7 +32875,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -33943,7 +32883,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -33981,7 +32920,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, "requires": { "isobject": "^3.0.0" } @@ -34034,7 +32972,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, "requires": { "isobject": "^3.0.1" } @@ -34060,7 +32997,6 @@ "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" } @@ -34264,6 +33200,7 @@ "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", @@ -34274,6 +33211,7 @@ "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", @@ -34354,6 +33292,7 @@ "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" } @@ -34362,6 +33301,7 @@ "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" } @@ -34417,7 +33357,8 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true }, "p-waterfall": { "version": "1.0.0", @@ -34556,8 +33497,7 @@ "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, "path-browserify": { "version": "0.0.1", @@ -34589,8 +33529,7 @@ "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" }, "path-to-regexp": { "version": "0.1.7", @@ -34653,8 +33592,7 @@ "picomatch": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", - "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", - "dev": true + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==" }, "pify": { "version": "2.3.0", @@ -34681,7 +33619,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dev": true, "requires": { "node-modules-regexp": "^1.0.0" } @@ -34777,12 +33714,12 @@ } }, "plur": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz", - "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", + "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", "dev": true, "requires": { - "irregular-plurals": "^2.0.0" + "irregular-plurals": "^3.2.0" } }, "pn": { @@ -34807,17 +33744,6 @@ "dev": true, "requires": { "@babel/runtime": "^7.6.3" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - } } }, "popper.js": { @@ -34866,8 +33792,7 @@ "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { "version": "7.0.13", @@ -35135,119 +34060,10 @@ "@babel/core": ">=7.1.0" }, "dependencies": { - "@babel/core": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz", - "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.2.2", - "@babel/helpers": "^7.2.0", - "@babel/parser": "^7.2.2", - "@babel/template": "^7.2.2", - "@babel/traverse": "^7.2.2", - "@babel/types": "^7.2.2", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.10", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.2.tgz", - "integrity": "sha512-f3QCuPppXxtZOEm5GWPra/uYUjmNQlu9pbAD8D/9jze4pTY83rTtB1igTBSwvkeNlC5gR24zFFkz+2WHLFQhqQ==", - "dev": true, - "requires": { - "@babel/types": "^7.3.2", - "jsesc": "^2.5.1", - "lodash": "^4.17.10", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.2.tgz", - "integrity": "sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.10", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/helpers": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.3.1.tgz", - "integrity": "sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA==", - "dev": true, - "requires": { - "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.5", - "@babel/types": "^7.3.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.2.tgz", - "integrity": "sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.10", - "to-fast-properties": "^2.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz", - "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==", - "dev": true - }, - "@babel/template": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", - "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.2.2", - "@babel/types": "^7.2.2" - } - }, - "@babel/types": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz", - "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.10", - "to-fast-properties": "^2.0.0" - } - }, "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" } @@ -35256,7 +34072,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "dev": true, "requires": { "minimist": "^1.2.0" } @@ -35264,8 +34079,7 @@ "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 + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -35422,6 +34236,103 @@ } } }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.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, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", + "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": "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" + } + } + } + }, + "postcss-modules-scope": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", + "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, "postcss-normalize-charset": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", @@ -36136,9 +35047,9 @@ } }, "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, "prr": { @@ -36150,7 +35061,8 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "psl": { "version": "1.1.28", @@ -36374,21 +35286,66 @@ "dev": true }, "puppeteer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.0.0.tgz", - "integrity": "sha512-t3MmTWzQxPRP71teU6l0jX47PHXlc4Z52sQv4LJQSZLq1ttkKS2yGM3gaI57uQwZkNaoGd0+HPPMELZkcyhlqA==", + "version": "npm:puppeteer-core@3.0.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-3.0.0.tgz", + "integrity": "sha512-oWjZFGMc0q2ak+8OxdmMffS79LIT0UEtmpV4h1/AARvESIqqKljf8mrfP+dQ2kas7XttsAZIxRBuWu7Y5JH8KQ==", "dev": true, "requires": { + "@types/mime-types": "^2.1.0", "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^3.0.0", + "extract-zip": "^2.0.0", + "https-proxy-agent": "^4.0.0", "mime": "^2.0.3", + "mime-types": "^2.1.25", "progress": "^2.0.1", "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" }, "dependencies": { + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true + }, + "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" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -36398,39 +35355,59 @@ "ms": "^2.1.1" } }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "extract-zip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.0.tgz", + "integrity": "sha512-i42GQ498yibjdvIhivUsRslx608whtGoFIhF26Z7O4MYncBxp8CwalOs1lnHy21A9sIohWO2+uiE4SRtC9JXDg==", "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" + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "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" + } + }, + "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": "3.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", - "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "dev": true, "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "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" - } - } + "agent-base": "5", + "debug": "4" + } + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" } }, "ms": { @@ -36439,22 +35416,66 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "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": { - "glob": "^7.1.3" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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-fs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", + "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "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" } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", + "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==", + "dev": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", "dev": true, "requires": { - "async-limiter": "~1.0.0" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } } } @@ -36872,24 +35893,6 @@ } } }, - "gzip-size": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", - "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^4.0.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } - } - }, "inquirer": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", @@ -37039,168 +36042,6 @@ "strip-indent": "^3.0.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, - "@babel/core": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz", - "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helpers": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", - "lodash": "^4.17.13", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" - } - }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", - "dev": true - }, - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, "ast-types": { "version": "0.13.2", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", @@ -37217,7 +36058,6 @@ "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" } @@ -37226,7 +36066,6 @@ "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" } @@ -37243,14 +36082,12 @@ "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==" }, "json5": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", - "dev": true, "requires": { "minimist": "^1.2.0" } @@ -37258,14 +36095,12 @@ "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==" }, "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==" }, "strip-indent": { "version": "3.0.0", @@ -37945,17 +36780,6 @@ "requires": { "@babel/runtime": "^7.7.4", "react-popper": "^1.3.6" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - } } }, "react-portal": { @@ -37980,15 +36804,6 @@ "react-is": "^16.9.0" }, "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.2" - } - }, "hoist-non-react-statics": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", @@ -38341,12 +37156,6 @@ "source-map": "~0.6.1" }, "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -38452,7 +37261,8 @@ "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==" + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", + "dev": true }, "regenerator-transform": { "version": "0.14.4", @@ -38468,7 +37278,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, "requires": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -38692,15 +37501,6 @@ "unified": "8.4.2" }, "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.8.3" - } - }, "@babel/core": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.0.tgz", @@ -38724,94 +37524,12 @@ "source-map": "^0.5.0" } }, - "@babel/generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz", - "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, "@babel/helper-plugin-utils": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.0.tgz", "integrity": "sha512-+hAlRGdf8fHQAyNnDBqTHQhwdLURLdrCROoWaEQYiQhk2sV9Rhs+GoFZZfMJExTq9HG8o2NX3uN2G90bFtmFdA==", "dev": true }, - "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", - "dev": true, - "requires": { - "@babel/types": "^7.8.3" - } - }, - "@babel/helpers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz", - "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==", - "dev": true, - "requires": { - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } - } - }, - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", - "dev": true - }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.0.tgz", @@ -38831,54 +37549,6 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-object-rest-spread": { - "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" - } - }, - "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" - } - }, - "@babel/traverse": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz", - "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.3", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -38900,8 +37570,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==" }, "is-alphabetical": { "version": "1.0.3", @@ -39085,8 +37754,7 @@ "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 + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "renderkid": { "version": "2.0.3", @@ -39121,14 +37789,12 @@ "repeat-element": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { "version": "2.0.1", @@ -39224,7 +37890,8 @@ "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=" + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true }, "requireindex": { "version": "1.2.0", @@ -39248,7 +37915,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "dev": true, "requires": { "path-parse": "^1.0.5" } @@ -39320,8 +37986,7 @@ "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, "responselike": { "version": "2.0.0", @@ -39345,8 +38010,7 @@ "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "retry": { "version": "0.10.1", @@ -39435,8 +38099,7 @@ "rsvp": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", - "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==", - "dev": true + "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==" }, "rtlcss": { "version": "2.4.0", @@ -39561,7 +38224,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, "requires": { "ret": "~0.1.10" } @@ -39575,7 +38237,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, "requires": { "@cnakazawa/watch": "^1.0.3", "anymatch": "^2.0.0", @@ -39592,7 +38253,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", @@ -39604,8 +38264,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==" } } }, @@ -39613,7 +38272,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", @@ -39628,7 +38286,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" } @@ -39637,7 +38294,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" @@ -39841,8 +38497,7 @@ "semver": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", - "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", - "dev": true + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==" }, "semver-compare": { "version": "1.0.0", @@ -39953,7 +38608,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -39965,7 +38619,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -40081,38 +38734,139 @@ "dev": true }, "showdown": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.8.6.tgz", - "integrity": "sha1-kepO47elRIqspoIKTifmkMatdxw=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz", + "integrity": "sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==", "requires": { - "yargs": "^10.0.3" + "yargs": "^14.2" }, "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==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.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==", + "requires": { + "locate-path": "^3.0.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==" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "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" + } + }, + "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==", + "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==" + }, + "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==" + }, + "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==", + "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==", + "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==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "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==" + }, "yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", + "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": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^8.1.0" + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" } }, "yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", "requires": { - "camelcase": "^4.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -40153,6 +38907,14 @@ "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": { @@ -40202,12 +38964,6 @@ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", "dev": true }, - "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 - }, "string.prototype.trimleft": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", @@ -40352,7 +39108,6 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -40368,7 +39123,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" } @@ -40377,7 +39131,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -40386,7 +39139,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -40397,7 +39149,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -40408,7 +39159,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -40417,7 +39167,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -40426,7 +39175,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -40435,7 +39183,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -40448,7 +39195,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, "requires": { "kind-of": "^3.2.0" }, @@ -40457,7 +39203,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -40568,7 +39313,6 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, "requires": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", @@ -40598,8 +39342,7 @@ "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, "space-separated-tokens": { "version": "1.1.4", @@ -40684,7 +39427,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, "requires": { "extend-shallow": "^3.0.0" } @@ -40738,8 +39480,7 @@ "stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", - "dev": true + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=" }, "stacktrace-parser": { "version": "0.1.8", @@ -40768,7 +39509,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -40778,7 +39518,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -40906,6 +39645,7 @@ "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" @@ -41685,6 +40425,7 @@ "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" } @@ -41706,8 +40447,7 @@ "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 + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" }, "strip-indent": { "version": "2.0.0", @@ -42326,6 +41066,14 @@ "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": { @@ -42375,12 +41123,6 @@ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", "dev": true }, - "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 - }, "string.prototype.trimleft": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", @@ -42415,30 +41157,6 @@ "string-width": "^2.1.1" }, "dependencies": { - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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 - }, - "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 - }, "slice-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz", @@ -42616,6 +41334,12 @@ } } }, + "term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", + "dev": true + }, "terminal-link": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.0.0.tgz", @@ -42665,16 +41389,6 @@ "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" - } } } }, @@ -42939,7 +41653,6 @@ "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", @@ -42950,7 +41663,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", @@ -43096,8 +41808,7 @@ "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", - "dev": true + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" }, "to-arraybuffer": { "version": "1.0.1", @@ -43120,7 +41831,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -43129,7 +41839,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -43146,7 +41855,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -43158,7 +41866,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -43173,8 +41880,7 @@ "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, "token-stream": { "version": "0.0.1", @@ -43264,12 +41970,6 @@ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "trim-trailing-lines": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz", @@ -43318,8 +42018,7 @@ "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" }, "tsutils": { "version": "3.17.1", @@ -43420,7 +42119,6 @@ "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" } @@ -43518,6 +42216,28 @@ "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=", "dev": true }, + "unbzip2-stream": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.2.tgz", + "integrity": "sha512-pZMVAofMrrHX6Ik39hCk470kulCbmZ2SWfQLPmTWqfJV/oUm0gn1CblvHdUu4+54Je6Jq34x8kY6XjTy6dMkOg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + }, + "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" + } + } + } + }, "underscore": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", @@ -43588,7 +42308,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -43752,7 +42471,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -43762,7 +42480,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -43773,7 +42490,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, "requires": { "isarray": "1.0.0" } @@ -43783,11 +42499,16 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" } } }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", @@ -43806,8 +42527,7 @@ "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, "url": { "version": "0.11.0", @@ -43895,8 +42615,7 @@ "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "use-callback-ref": { "version": "1.2.1", @@ -44062,12 +42781,6 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true } } }, @@ -44121,23 +42834,6 @@ "vue-template-compiler": "^2.0.0" }, "dependencies": { - "@babel/parser": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz", - "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==", - "dev": true - }, - "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -44302,7 +42998,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, "requires": { "makeerror": "1.0.x" } @@ -44986,6 +43681,23 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "whatwg-url-without-unicode": { "version": "8.0.0-1", "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-1.tgz", @@ -45211,6 +43923,7 @@ "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" @@ -45219,12 +43932,14 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "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" } @@ -45233,6 +43948,7 @@ "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", @@ -45243,6 +43959,7 @@ "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" } @@ -45432,12 +44149,14 @@ "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true }, "yaml": { "version": "1.7.2", @@ -45445,16 +44164,6 @@ "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", "requires": { "@babel/runtime": "^7.6.3" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz", - "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==", - "requires": { - "regenerator-runtime": "^0.13.2" - } - } } }, "yargs": { diff --git a/package.json b/package.json index b2a95e5213b517..6e90c3ad6880f8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gutenberg", - "version": "7.9.0-rc.1", + "version": "8.0.0", "private": true, "description": "A new WordPress editor experience.", "author": "The WordPress Contributors", @@ -84,7 +84,6 @@ "@storybook/addon-a11y": "5.3.2", "@storybook/addon-docs": "5.3.2", "@storybook/addon-knobs": "5.3.2", - "@storybook/addon-storyshots": "5.3.2", "@storybook/addon-storysource": "5.3.2", "@storybook/addon-viewport": "5.3.2", "@storybook/react": "5.3.2", @@ -162,6 +161,7 @@ "postcss-loader": "3.0.0", "prettier": "npm:wp-prettier@1.19.1", "progress": "2.0.3", + "puppeteer": "npm:puppeteer-core@3.0.0", "react": "16.9.0", "react-dom": "16.9.0", "react-native": "0.61.5", @@ -207,6 +207,7 @@ "lint": "concurrently \"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", "lint-pkg-json": "wp-scripts lint-pkg-json . 'packages/*/package.json'", "lint-css": "wp-scripts lint-style '**/*.scss'", @@ -225,6 +226,7 @@ "test-performance": "wp-scripts test-e2e --config packages/e2e-tests/jest.performance.config.js", "test-php": "npm run lint-php && npm run test-unit-php", "test-unit": "wp-scripts test-unit-js --config test/unit/jest.config.js", + "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", "test-unit-php": "wp-scripts env test-php", diff --git a/packages/api-fetch/CHANGELOG.md b/packages/api-fetch/CHANGELOG.md index d89748053a6cfa..34d8c1b6dc521c 100644 --- a/packages/api-fetch/CHANGELOG.md +++ b/packages/api-fetch/CHANGELOG.md @@ -1,3 +1,8 @@ +## 3.8.1 (2019-04-22) + +- Added deprecation to `useApiFetch` hook. +- Added `@wordpress/deprecation` package to add deprecation notice to `useApiFetch` hook. + ## 3.8.0 (2019-12-19) ### Bug Fixes diff --git a/packages/api-fetch/package.json b/packages/api-fetch/package.json index 5d5d52358d69a3..670ee9f81ba807 100644 --- a/packages/api-fetch/package.json +++ b/packages/api-fetch/package.json @@ -23,6 +23,7 @@ "react-native": "src/index", "dependencies": { "@babel/runtime": "^7.9.2", + "@wordpress/deprecated": "file:../deprecated", "@wordpress/element": "file:../element", "@wordpress/i18n": "file:../i18n", "@wordpress/url": "file:../url" diff --git a/packages/api-fetch/src/index.js b/packages/api-fetch/src/index.js index 64fc3ef09e0c33..f16fe6c65b4d08 100644 --- a/packages/api-fetch/src/index.js +++ b/packages/api-fetch/src/index.js @@ -3,6 +3,7 @@ */ import { __ } from '@wordpress/i18n'; import { useEffect, useState } from '@wordpress/element'; +import deprecated from '@wordpress/deprecated'; /** * Internal dependencies @@ -163,6 +164,12 @@ function apiFetch( options ) { * @param {string} path Query path. */ function useApiFetch( path ) { + deprecated( 'useApiFetch', { + version: '8.1.0', + alternative: 'apiFetch', + plugin: 'Gutenberg', + } ); + // Indicate the fetching status const [ isLoading, setIsLoading ] = useState( true ); const [ data, setData ] = useState( null ); diff --git a/packages/base-styles/_mixins.scss b/packages/base-styles/_mixins.scss index 2e1b4d957e0132..b2902274839e2a 100644 --- a/packages/base-styles/_mixins.scss +++ b/packages/base-styles/_mixins.scss @@ -151,13 +151,13 @@ #{$selector} { /* Set left position when auto-fold is not on the body element. */ left: 0; - @include break-medium() { + @media (min-width: #{ ($break-medium + 1) }) { left: $admin-sidebar-width; } } .auto-fold #{$selector} { /* Auto fold is when on smaller breakpoints, nav menu auto collapses. */ - @include break-medium() { + @media (min-width: #{ ($break-medium + 1) }) { left: $admin-sidebar-width-collapsed; } @@ -170,13 +170,13 @@ .folded #{$selector} { left: 0; - @include break-medium() { + @media (min-width: #{ ($break-medium + 1) }) { left: $admin-sidebar-width-collapsed; } } /* Mobile menu opened. */ - @media (max-width: #{ ($break-medium) }) { + @media (max-width: #{ ($break-medium + 1) }) { .auto-fold .wp-responsive-open #{$selector} { left: $admin-sidebar-width-big; } diff --git a/packages/base-styles/_variables.scss b/packages/base-styles/_variables.scss index 1d33712cc44e65..276bd120ab0b59 100644 --- a/packages/base-styles/_variables.scss +++ b/packages/base-styles/_variables.scss @@ -38,6 +38,7 @@ $grid-unit-60: 6 * $grid-unit; // 48px * Dimensions. */ +$icon-size: 24px; $button-size: 36px; $button-size-small: 24px; $panel-padding: 16px; @@ -51,6 +52,8 @@ $admin-sidebar-width-collapsed: 36px; $modal-min-width: 360px; $spinner-size: 18px; $mobile-header-toolbar-height: 44px; +$mobile-floating-toolbar-height: 44px; +$mobile-floating-toolbar-margin: 8px; /** diff --git a/packages/base-styles/_z-index.scss b/packages/base-styles/_z-index.scss index b0b09d483dab9f..cb3fc857703208 100644 --- a/packages/base-styles/_z-index.scss +++ b/packages/base-styles/_z-index.scss @@ -46,8 +46,8 @@ $z-layers: ( ".components-drop-zone": 40, ".components-drop-zone__content": 50, - // The block mover for floats should overlap the controls of adjacent blocks. - ".block-editor-block-list__block {core/image aligned left or right}": 21, + // The floated blocks should be above the other blocks to allow selection. + "{core/image aligned left or right} .wp-block": 21, // Small screen inner blocks overlay must be displayed above drop zone, // settings menu, and movers. diff --git a/packages/block-directory/src/components/downloadable-block-list-item/style.scss b/packages/block-directory/src/components/downloadable-block-list-item/style.scss index b32b58356c4fd4..84521724a1da0c 100644 --- a/packages/block-directory/src/components/downloadable-block-list-item/style.scss +++ b/packages/block-directory/src/components/downloadable-block-list-item/style.scss @@ -10,7 +10,7 @@ justify-content: center; background: transparent; word-break: break-word; - border-radius: $radius-round-rectangle; + border-radius: $radius-block-ui; border: $border-width solid $light-gray-500; transition: all 0.05s ease-in-out; @include reduce-motion("transition"); 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 62a6a11c0fcabe..ae00544bca3639 100644 --- a/packages/block-directory/src/components/downloadable-blocks-panel/style.scss +++ b/packages/block-directory/src/components/downloadable-blocks-panel/style.scss @@ -2,7 +2,6 @@ .block-directory-downloadable-blocks-panel__description { font-style: italic; padding: 0; - margin-top: 0; text-align: left; color: $dark-gray-400; } diff --git a/packages/block-editor/README.md b/packages/block-editor/README.md index 820137bd973fa8..4c9673524d397e 100644 --- a/packages/block-editor/README.md +++ b/packages/block-editor/README.md @@ -93,6 +93,18 @@ _Returns_ - `WPElement`: Block Breadcrumb. +# **BlockContextProvider** + +Component which merges passed value with current consumed block context. + +_Related_ + +- + +_Parameters_ + +- _props_ `BlockContextProviderProps`: + # **BlockControls** Undocumented declaration. diff --git a/packages/editor/src/components/autocompleters/block.js b/packages/block-editor/src/autocompleters/block.js similarity index 91% rename from packages/editor/src/components/autocompleters/block.js rename to packages/block-editor/src/autocompleters/block.js index d4fb7507477d05..db17bd51b4d84c 100644 --- a/packages/editor/src/components/autocompleters/block.js +++ b/packages/block-editor/src/autocompleters/block.js @@ -6,9 +6,13 @@ import { once } from 'lodash'; /** * WordPress dependencies */ -import { select, dispatch } from '@wordpress/data'; +import { select } from '@wordpress/data'; import { createBlock } from '@wordpress/blocks'; -import { BlockIcon } from '@wordpress/block-editor'; + +/** + * Internal dependencies + */ +import BlockIcon from '../components/block-icon'; /** @typedef {import('@wordpress/block-editor').WPEditorInserterItem} WPEditorInserterItem */ @@ -68,7 +72,13 @@ function defaultGetSelectedBlockName() { * @return {Promise} Promise resolving once reusable blocks fetched. */ const fetchReusableBlocks = once( () => { - dispatch( 'core/editor' ).__experimentalFetchReusableBlocks(); + const { __experimentalFetchReusableBlocks } = select( + 'core/block-editor' + ).getSettings(); + + if ( __experimentalFetchReusableBlocks ) { + __experimentalFetchReusableBlocks(); + } } ); /** @@ -84,7 +94,7 @@ export function createBlockCompleter( { } = {} ) { return { name: 'blocks', - className: 'editor-autocompleters__block', + className: 'block-editor-autocompleters__block', triggerPrefix: '/', options() { fetchReusableBlocks(); diff --git a/packages/block-editor/src/autocompleters/style.scss b/packages/block-editor/src/autocompleters/style.scss new file mode 100644 index 00000000000000..fc51b518435e50 --- /dev/null +++ b/packages/block-editor/src/autocompleters/style.scss @@ -0,0 +1,5 @@ +.block-editor-autocompleters__block { + .block-editor-block-icon { + margin-right: 8px; + } +} diff --git a/packages/editor/src/components/autocompleters/test/block.js b/packages/block-editor/src/autocompleters/test/block.js similarity index 99% rename from packages/editor/src/components/autocompleters/test/block.js rename to packages/block-editor/src/autocompleters/test/block.js index 87534d69d159d2..91a7c164cf396e 100644 --- a/packages/editor/src/components/autocompleters/test/block.js +++ b/packages/block-editor/src/autocompleters/test/block.js @@ -7,7 +7,7 @@ import { shallow } from 'enzyme'; * Internal dependencies */ import blockCompleter, { createBlockCompleter } from '../block'; -import '../../../'; +import '../../store'; describe( 'block', () => { let originalFetch; diff --git a/packages/block-editor/src/components/autocomplete/index.js b/packages/block-editor/src/components/autocomplete/index.js index 2deea118054500..acba4f26729233 100644 --- a/packages/block-editor/src/components/autocomplete/index.js +++ b/packages/block-editor/src/components/autocomplete/index.js @@ -9,11 +9,22 @@ import { clone } from 'lodash'; import { applyFilters, hasFilter } from '@wordpress/hooks'; import { compose } from '@wordpress/compose'; import { Autocomplete as OriginalAutocomplete } from '@wordpress/components'; +import { useMemo } from '@wordpress/element'; +import { getDefaultBlockName } from '@wordpress/blocks'; /** * Internal dependencies */ import { withBlockEditContext } from '../block-edit/context'; +import blockAutocompleter from '../../autocompleters/block'; + +/** + * Shared reference to an empty array for cases where it is important to avoid + * returning a new array reference on every invocation. + * + * @type {Array} + */ +const EMPTY_ARRAY = []; /** * Wrap the default Autocomplete component with one that @@ -26,7 +37,13 @@ import { withBlockEditContext } from '../block-edit/context'; */ export function withFilteredAutocompleters( Autocomplete ) { return ( props ) => { - let { completers = [] } = props; + let { completers = EMPTY_ARRAY, blockName } = props; + completers = useMemo( () => { + if ( blockName === getDefaultBlockName() ) { + return completers.concat( [ blockAutocompleter ] ); + } + return completers; + }, [ completers, blockName ] ); if ( hasFilter( 'editor.Autocomplete.completers' ) ) { completers = applyFilters( diff --git a/packages/block-editor/src/components/block-context/README.md b/packages/block-editor/src/components/block-context/README.md new file mode 100644 index 00000000000000..acb51b48e14576 --- /dev/null +++ b/packages/block-editor/src/components/block-context/README.md @@ -0,0 +1,57 @@ +Block Context +============= + +Block Context is a React implementation of WordPress's block context. Block context, much like [React's context](https://reactjs.org/docs/context.html), is a method for passing and inheriting values deeply through a hierarchy of blocks. Because of the similarities with React's context, the client-side implementation here is quite minimal. It is complemented by equivalent behaviors in the server-side rendering of a block. + +Note that the implementation of Block Context is distinct from [the `BlockEdit` context](../block-edit). While it is true that both provide context relevant for the editing of a block, Block Context is implemented separately so as to prioritize it as most identifiable amongst the machinery of block context, and not amongst other client-side editing context of a block. + +## Usage + +Currently, only the [Provider component](https://reactjs.org/docs/context.html#contextprovider) is made available on the public interface of the `@wordpress/block-editor` module. This can be used to add or override context which can then be consumed by blocks rendered within that context in the block editor. + +```js +import { BlockContextProvider } from '@wordpress/block-editor'; + +function MyCustomPostEditor() { + return ( + + + + ); +} +``` + +Internal to the `@wordpress/block-editor` module, a component can access the [full Context object](https://reactjs.org/docs/context.html#api), typically for use in combination with [`useContext`](https://reactjs.org/docs/hooks-reference.html#usecontext). + +```js +import { useContext } from '@wordpress/element'; + +// Only available internally within `@wordpress/block-editor`! +import BlockContext from '../block-context'; + +function MyBlockComponent() { + const { postId } = useContext( BlockContext ); + + return 'The current post ID is: ' + postId; +} +``` + +The reason `BlockContext` is only internally available within the `@wordpress/block-editor` module is to reinforce the expectation that external consumption of values from block context should be declared on the block registration using the `context` property. + +## Props + +`BlockContextProvider` behaves like a standard [`Context.Provider` component](https://reactjs.org/docs/context.html#contextprovider). It receives `value` and `children` props. The `value` is merged with the current block context value. + +### `value` + +- Type: `Record` +- Required: Yes + +Context value to merge with current value. + +### `children` + +- Type: `ReactNode` +- Required: Yes + +Component children. diff --git a/packages/block-editor/src/components/block-context/index.js b/packages/block-editor/src/components/block-context/index.js new file mode 100644 index 00000000000000..617ae2ef2a8ed5 --- /dev/null +++ b/packages/block-editor/src/components/block-context/index.js @@ -0,0 +1,36 @@ +/** + * WordPress dependencies + */ +import { createContext, useContext, useMemo } from '@wordpress/element'; + +/** @typedef {import('react').ReactNode} ReactNode */ + +/** + * @typedef BlockContextProviderProps + * + * @property {Record} value Context value to merge with current + * value. + * @property {ReactNode} children Component children. + */ + +/** @type {import('react').Context>} */ +const Context = createContext( {} ); + +/** + * Component which merges passed value with current consumed block context. + * + * @see https://github.com/WordPress/gutenberg/blob/master/packages/block-editor/src/components/block-context/README.md + * + * @param {BlockContextProviderProps} props + */ +export function BlockContextProvider( { value, children } ) { + const context = useContext( Context ); + const nextValue = useMemo( () => ( { ...context, ...value } ), [ + context, + value, + ] ); + + return ; +} + +export default Context; diff --git a/packages/block-editor/src/components/block-edit/edit.js b/packages/block-editor/src/components/block-edit/edit.js index a4f08d0c96a36f..936fb24c4fc2a1 100644 --- a/packages/block-editor/src/components/block-edit/edit.js +++ b/packages/block-editor/src/components/block-edit/edit.js @@ -2,6 +2,7 @@ * External dependencies */ import classnames from 'classnames'; +import { pick } from 'lodash'; /** * WordPress dependencies @@ -12,10 +13,36 @@ import { hasBlockSupport, getBlockType, } from '@wordpress/blocks'; +import { useContext, useMemo } from '@wordpress/element'; + +/** + * Internal dependencies + */ +import BlockContext from '../block-context'; + +/** + * Default value used for blocks which do not define their own context needs, + * used to guarantee that a block's `context` prop will always be an object. It + * is assigned as a constant since it is always expected to be an empty object, + * and in order to avoid unnecessary React reconciliations of a changing object. + * + * @type {{}} + */ +const DEFAULT_BLOCK_CONTEXT = {}; export const Edit = ( props ) => { const { attributes = {}, name } = props; const blockType = getBlockType( name ); + const blockContext = useContext( BlockContext ); + + // Assign context values using the block type's declared context needs. + const context = useMemo( + () => + blockType && blockType.context + ? pick( blockContext, blockType.context ) + : DEFAULT_BLOCK_CONTEXT, + [ blockType, blockContext ] + ); if ( ! blockType ) { return null; @@ -32,7 +59,7 @@ export const Edit = ( props ) => { ); if ( lightBlockWrapper ) { - return ; + return ; } // Generate a class name for the block's editable form @@ -41,7 +68,9 @@ export const Edit = ( props ) => { : null; const className = classnames( generatedClassName, attributes.className ); - return ; + return ( + + ); }; export default withFilters( 'editor.BlockEdit' )( Edit ); diff --git a/packages/block-editor/src/components/block-edit/test/edit.js b/packages/block-editor/src/components/block-edit/test/edit.js index 0b07eb03b2aad6..6c273de2351961 100644 --- a/packages/block-editor/src/components/block-edit/test/edit.js +++ b/packages/block-editor/src/components/block-edit/test/edit.js @@ -1,7 +1,7 @@ /** * External dependencies */ -import { shallow } from 'enzyme'; +import { shallow, mount } from 'enzyme'; import { noop } from 'lodash'; /** @@ -17,6 +17,7 @@ import { * Internal dependencies */ import { Edit } from '../edit'; +import { BlockContextProvider } from '../../block-context'; describe( 'Edit', () => { afterEach( () => { @@ -79,4 +80,47 @@ describe( 'Edit', () => { ); expect( wrapper.find( edit ).hasClass( 'my-class' ) ).toBe( true ); } ); + + it( 'should assign context', () => { + const edit = ( { context } ) => context.value; + registerBlockType( 'core/test-block', { + category: 'common', + title: 'block title', + context: [ 'value' ], + edit, + save: noop, + } ); + + const wrapper = mount( + + + + ); + + expect( wrapper.html() ).toBe( 'Ok' ); + } ); + + describe( 'light wrapper', () => { + it( 'should assign context', () => { + const edit = ( { context } ) => context.value; + registerBlockType( 'core/test-block', { + category: 'common', + title: 'block title', + context: [ 'value' ], + supports: { + lightBlockWrapper: true, + }, + edit, + save: noop, + } ); + + const wrapper = mount( + + + + ); + + expect( wrapper.html() ).toBe( 'Ok' ); + } ); + } ); } ); diff --git a/packages/block-editor/src/components/block-list/block-mobile-floating-toolbar.native.js b/packages/block-editor/src/components/block-list/block-mobile-floating-toolbar.native.js deleted file mode 100644 index fc8876253734c2..00000000000000 --- a/packages/block-editor/src/components/block-list/block-mobile-floating-toolbar.native.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * External dependencies - */ -import { View, TouchableWithoutFeedback } from 'react-native'; - -/** - * Internal dependencies - */ -import styles from './block-mobile-floating-toolbar.scss'; - -const FloatingToolbar = ( { children } ) => { - return ( - - { children } - - ); -}; - -export default FloatingToolbar; diff --git a/packages/block-editor/src/components/block-list/block-mobile-floating-toolbar.native.scss b/packages/block-editor/src/components/block-list/block-mobile-floating-toolbar.native.scss deleted file mode 100644 index 5b12591ec44361..00000000000000 --- a/packages/block-editor/src/components/block-list/block-mobile-floating-toolbar.native.scss +++ /dev/null @@ -1,24 +0,0 @@ -$floating-toolbar-height: 44; - -.floatingToolbar { - background-color: $dark-gray-500; - margin: auto; - min-width: 100; - max-height: $floating-toolbar-height; - border-radius: 22px; - flex-direction: row; - z-index: 100; - height: $floating-toolbar-height; - align-items: center; - justify-content: center; - align-self: center; - margin-bottom: 8px; -} - -.floatingToolbarFillColor { - background-color: rgba(#1d2327, 0.85); -} - -.floatingToolbarFillColorDark { - background-color: rgba(#3c434a, 0.85); -} diff --git a/packages/block-editor/src/components/block-list/block-popover.js b/packages/block-editor/src/components/block-list/block-popover.js index 7adf7c5ea3449f..daf7151244ee72 100644 --- a/packages/block-editor/src/components/block-list/block-popover.js +++ b/packages/block-editor/src/components/block-list/block-popover.js @@ -111,11 +111,6 @@ function BlockPopover( { return null; } - // A block may specify a different target element for the toolbar. - if ( node.classList.contains( 'is-block-collapsed' ) ) { - node = node.querySelector( '.is-block-content' ) || node; - } - let anchorRef = node; if ( hasMultiSelection ) { diff --git a/packages/block-editor/src/components/block-list/block-wrapper.js b/packages/block-editor/src/components/block-list/block-wrapper.js index 52f353428e23f0..2d116f696ab983 100644 --- a/packages/block-editor/src/components/block-list/block-wrapper.js +++ b/packages/block-editor/src/components/block-list/block-wrapper.js @@ -69,7 +69,7 @@ const BlockComponent = forwardRef( 'core/block-editor' ); const fallbackRef = useRef(); - + const isAligned = wrapperProps && !! wrapperProps[ 'data-align' ]; wrapper = wrapper || fallbackRef; // Provide the selected node, or the first and last nodes of a multi- @@ -196,19 +196,20 @@ const BlockComponent = forwardRef( const blockElementId = `block-${ clientId }${ htmlSuffix }`; const Animated = animated[ tagName ]; - return ( + const blockWrapper = ( ); + + // For aligned blocks, provide a wrapper element so the block can be + // positioned relative to the block column. + if ( isAligned ) { + const alignmentWrapperProps = { + 'data-align': wrapperProps[ 'data-align' ], + }; + return ( +
+ { blockWrapper } +
+ ); + } + + return blockWrapper; } ); diff --git a/packages/block-editor/src/components/block-list/block.js b/packages/block-editor/src/components/block-list/block.js index 448f4b74514565..4471cff82a7db4 100644 --- a/packages/block-editor/src/components/block-list/block.js +++ b/packages/block-editor/src/components/block-list/block.js @@ -94,7 +94,6 @@ function BlockListBlock( { }; } - const isAligned = wrapperProps && wrapperProps[ 'data-align' ]; const generatedClassName = lightBlockWrapper && hasBlockSupport( blockType, 'className', true ) ? getBlockDefaultClassName( name ) @@ -107,7 +106,7 @@ function BlockListBlock( { const wrapperClassName = classnames( generatedClassName, customClassName, - 'wp-block block-editor-block-list__block', + 'block-editor-block-list__block', { 'has-warning': ! isValid || !! hasError || isUnregisteredBlock, 'is-selected': isSelected, @@ -120,7 +119,6 @@ function BlockListBlock( { isFocusMode && ( isSelected || isAncestorOfSelectedBlock ), 'is-focus-mode': isFocusMode, 'has-child-selected': isAncestorOfSelectedBlock, - 'is-block-collapsed': isAligned, }, className ); @@ -144,13 +142,6 @@ function BlockListBlock( { /> ); - // For aligned blocks, provide a wrapper element so the block can be - // positioned relative to the block column. This is enabled with the - // .is-block-content className. - if ( ! lightBlockWrapper && isAligned ) { - blockEdit =
{ blockEdit }
; - } - if ( mode !== 'visual' ) { blockEdit =
{ blockEdit }
; } diff --git a/packages/block-editor/src/components/block-list/block.native.js b/packages/block-editor/src/components/block-list/block.native.js index 918c414ba833ce..773c6d19fb9913 100644 --- a/packages/block-editor/src/components/block-list/block.native.js +++ b/packages/block-editor/src/components/block-list/block.native.js @@ -7,14 +7,12 @@ import { View, Text, TouchableWithoutFeedback } from 'react-native'; * WordPress dependencies */ import { Component } from '@wordpress/element'; -import { ToolbarButton, Toolbar } from '@wordpress/components'; import { withDispatch, withSelect } from '@wordpress/data'; import { compose, withPreferredColorScheme } from '@wordpress/compose'; import { getBlockType, __experimentalGetAccessibleBlockLabel as getAccessibleBlockLabel, } from '@wordpress/blocks'; -import { __ } from '@wordpress/i18n'; /** * Internal dependencies @@ -23,9 +21,6 @@ import styles from './block.scss'; import BlockEdit from '../block-edit'; import BlockInvalidWarning from './block-invalid-warning'; import BlockMobileToolbar from '../block-mobile-toolbar'; -import FloatingToolbar from './block-mobile-floating-toolbar'; -import Breadcrumbs from './breadcrumb'; -import NavigateUpSVG from './nav-up-icon'; class BlockListBlock extends Component { constructor() { @@ -66,7 +61,9 @@ class BlockListBlock extends Component { this.props.onCaretVerticalPositionChange } clientId={ this.props.clientId } + parentWidth={ this.props.parentWidth } contentStyle={ this.props.contentStyle } + onDeleteBlock={ this.props.onDeleteBlock } /> ); } @@ -89,15 +86,11 @@ class BlockListBlock extends Component { isValid, order, title, - parentId, isDimmed, isTouchable, onDeleteBlock, - horizontalDirection, - hasParent, + isStackedHorizontally, isParentSelected, - onSelect, - showFloatingToolbar, getStylesFromColorScheme, marginVertical, marginHorizontal, @@ -122,21 +115,6 @@ class BlockListBlock extends Component { style={ { flex: 1 } } accessibilityLabel={ accessibilityLabel } > - { showFloatingToolbar && ( - - { hasParent && ( - - onSelect( parentId ) } - icon={ NavigateUpSVG } - /> - - - ) } - - - ) } ) } @@ -199,7 +179,6 @@ export default compose( [ __unstableGetBlockWithoutInnerBlocks, getBlockHierarchyRootClientId, getSelectedBlockClientId, - getBlock, getBlockRootClientId, getLowestCommonAncestorWithSelectedBlock, getBlockParents, @@ -220,10 +199,6 @@ export default compose( [ const parentId = parents[ 0 ] || ''; const rootBlockId = getBlockHierarchyRootClientId( clientId ); - const rootBlock = getBlock( rootBlockId ); - const hasRootInnerBlocks = rootBlock.innerBlocks.length !== 0; - - const showFloatingToolbar = isSelected && hasRootInnerBlocks; const selectedBlockClientId = getSelectedBlockClientId(); @@ -235,7 +210,6 @@ export default compose( [ ? parents[ commonAncestorIndex ] : parents[ parents.length - 1 ]; - const hasParent = !! parentId; const isParentSelected = selectedBlockClientId && selectedBlockClientId === parentId; const isAncestorSelected = @@ -273,14 +247,11 @@ export default compose( [ isSelected, isInnerBlockSelected, isValid, - parentId, isParentSelected, firstToSelectId, - hasParent, isAncestorSelected, isTouchable, isDimmed, - showFloatingToolbar, }; } ), withDispatch( ( dispatch, ownProps, { select } ) => { diff --git a/packages/block-editor/src/components/block-list/block.native.scss b/packages/block-editor/src/components/block-list/block.native.scss index 0d1c60fe4f1f19..aa3d6d1248f595 100644 --- a/packages/block-editor/src/components/block-list/block.native.scss +++ b/packages/block-editor/src/components/block-list/block.native.scss @@ -41,23 +41,6 @@ min-height: 50px; } -.toolbar { - border-left-width: 0; - margin-right: auto; - padding-left: 2px; - height: 44px; -} - -.pipe { - margin-top: auto; - margin-bottom: auto; - margin-left: 2px; - height: 28px; - width: 1px; - background-color: #e9eff3; - opacity: 0.4; -} - .neutralToolbar { margin-left: -$block-edge-to-content; margin-right: -$block-edge-to-content; diff --git a/packages/block-editor/src/components/block-list/breadcrumb.native.js b/packages/block-editor/src/components/block-list/breadcrumb.native.js index 0084d8485a326b..027b93abf6b7d3 100644 --- a/packages/block-editor/src/components/block-list/breadcrumb.native.js +++ b/packages/block-editor/src/components/block-list/breadcrumb.native.js @@ -9,7 +9,7 @@ import { getBlockType } from '@wordpress/blocks'; /** * External dependencies */ -import { View, Text, TouchableOpacity } from 'react-native'; +import { View, Text, TouchableOpacity, I18nManager } from 'react-native'; /** * Internal dependencies @@ -50,7 +50,10 @@ const BlockBreadcrumb = ( { fill={ styles.icon.color } />, - + , ] } 0; } render() { + const { isRootList } = this.props; + + // Use of Context to propagate the main scroll ref to its children e.g InnerBlocks + return isRootList ? ( + + { this.renderList() } + + ) : ( + + { ( ref ) => + this.renderList( { + parentScrollRef: ref, + } ) + } + + ); + } + + renderList( extraProps = {} ) { const { clearSelectedBlock, blockClientIds, title, header, - withFooter = true, isReadOnly, isRootList, horizontal, - scrollEnabled, shouldShowInsertionPointBefore, shouldShowInsertionPointAfter, marginVertical = styles.defaultBlock.marginTop, marginHorizontal = styles.defaultBlock.marginLeft, + isFloatingToolbarVisible, + isStackedHorizontally, + horizontalAlignment, } = this.props; + const { parentScrollRef } = extraProps; - const { blockToolbar, blockBorder, headerToolbar } = styles; + const { + blockToolbar, + blockBorder, + headerToolbar, + floatingToolbar, + } = styles; const forceRefresh = shouldShowInsertionPointBefore || shouldShowInsertionPointAfter; @@ -129,22 +158,34 @@ export class BlockList extends Component { : {} ) } // Disable clipping on Android to fix focus losing. See https://github.com/wordpress-mobile/gutenberg-mobile/pull/741#issuecomment-472746541 accessibilityLabel="block-list" autoScroll={ this.props.autoScroll } - innerRef={ this.scrollViewInnerRef } + innerRef={ ( ref ) => { + this.scrollViewInnerRef( parentScrollRef || ref ); + } } extraScrollHeight={ blockToolbar.height + blockBorder.width } - inputAccessoryViewHeight={ headerToolbar.height } + inputAccessoryViewHeight={ + headerToolbar.height + + ( isFloatingToolbarVisible + ? floatingToolbar.height + : 0 ) + } keyboardShouldPersistTaps="always" scrollViewStyle={ [ { flex: isRootList ? 1 : 0 }, ! isRootList && styles.overflowVisible, ] } horizontal={ horizontal } - scrollEnabled={ scrollEnabled } + scrollEnabled={ isRootList } contentContainerStyle={ horizontal && styles.horizontalContentContainer } - style={ ! isRootList && styles.overflowVisible } + style={ [ + ! isRootList && styles.overflowVisible, + isStackedHorizontally && styles.horizontal, + horizontalAlignment && + styles[ `is-aligned-${ horizontalAlignment }` ], + ] } data={ blockClientIds } keyExtractor={ identity } extraData={ forceRefresh } @@ -157,9 +198,7 @@ export class BlockList extends Component { ListEmptyComponent={ ! isReadOnly && this.renderDefaultBlockAppender } - ListFooterComponent={ - ! isReadOnly && withFooter && this.renderBlockListFooter - } + ListFooterComponent={ this.renderBlockListFooter } /> { this.shouldShowInnerBlockAppender() && ( @@ -188,7 +227,7 @@ export class BlockList extends Component { shouldShowInsertionPointAfter, marginVertical = styles.defaultBlock.marginTop, marginHorizontal = styles.defaultBlock.marginLeft, - horizontalDirection, + isStackedHorizontally, contentResizeMode, contentStyle, onAddBlock, @@ -218,7 +257,8 @@ export class BlockList extends Component { onCaretVerticalPositionChange={ this.onCaretVerticalPositionChange } - horizontalDirection={ horizontalDirection } + parentWidth={ this.props.parentWidth } + isStackedHorizontally={ isStackedHorizontally } contentStyle={ contentStyle } onAddBlock={ onAddBlock } onDeleteBlock={ onDeleteBlock } @@ -234,18 +274,29 @@ export class BlockList extends Component { renderBlockListFooter() { const paragraphBlock = createBlock( 'core/paragraph' ); - return ( - <> - { - this.addBlockToEndOfPost( paragraphBlock ); - } } - > - - - - ); + const { + isReadOnly, + withFooter = true, + renderFooterAppender, + } = this.props; + + if ( ! isReadOnly && withFooter ) { + return ( + <> + { + this.addBlockToEndOfPost( paragraphBlock ); + } } + > + + + + ); + } else if ( renderFooterAppender ) { + return renderFooterAppender(); + } + return null; } } @@ -258,9 +309,10 @@ export default compose( [ getBlockInsertionPoint, isBlockInsertionPointVisible, getSettings, + getBlockHierarchyRootClientId, } = select( 'core/block-editor' ); - const horizontalDirection = + const isStackedHorizontally = __experimentalMoverDirection === 'horizontal'; const selectedBlockClientId = getSelectedBlockClientId(); @@ -269,7 +321,7 @@ export default compose( [ const blockInsertionPointIsVisible = isBlockInsertionPointVisible(); const shouldShowInsertionPointBefore = ( clientId ) => { return ( - ! horizontalDirection && + ! isStackedHorizontally && blockInsertionPointIsVisible && insertionPoint.rootClientId === rootClientId && // if list is empty, show the insertion point (via the default appender) @@ -280,7 +332,7 @@ export default compose( [ }; const shouldShowInsertionPointAfter = ( clientId ) => { return ( - ! horizontalDirection && + ! isStackedHorizontally && blockInsertionPointIsVisible && insertionPoint.rootClientId === rootClientId && // if the insertion point is at the end of the list @@ -292,6 +344,14 @@ export default compose( [ const isReadOnly = getSettings().readOnly; + const rootBlockId = getBlockHierarchyRootClientId( + selectedBlockClientId + ); + const hasRootInnerBlocks = !! getBlockCount( rootBlockId ); + + const isFloatingToolbarVisible = + !! selectedBlockClientId && hasRootInnerBlocks; + return { blockClientIds, blockCount: getBlockCount( rootClientId ), @@ -301,7 +361,8 @@ export default compose( [ selectedBlockClientId, isReadOnly, isRootList: rootClientId === undefined, - horizontalDirection, + isFloatingToolbarVisible, + isStackedHorizontally, }; } ), withDispatch( ( dispatch ) => { diff --git a/packages/block-editor/src/components/block-list/style.native.scss b/packages/block-editor/src/components/block-list/style.native.scss index 78994455ca0f30..f2b07c5226916e 100644 --- a/packages/block-editor/src/components/block-list/style.native.scss +++ b/packages/block-editor/src/components/block-list/style.native.scss @@ -81,6 +81,27 @@ height: $mobile-block-toolbar-height; } +.floatingToolbar { + height: $mobile-floating-toolbar-height + 2 * $mobile-floating-toolbar-margin; +} + +.horizontal { + flex-direction: row; + flex-wrap: wrap; +} + +.is-aligned-left { + justify-content: flex-start; +} + +.is-aligned-center { + justify-content: center; +} + +.is-aligned-right { + justify-content: flex-end; +} + .overflowVisible { overflow: visible; } diff --git a/packages/block-editor/src/components/block-list/style.scss b/packages/block-editor/src/components/block-list/style.scss index c6a7caeee341b2..63bc8101cf39ac 100644 --- a/packages/block-editor/src/components/block-list/style.scss +++ b/packages/block-editor/src/components/block-list/style.scss @@ -138,7 +138,6 @@ right: $border-width; } - .is-block-content, // Floats. &::after { // Everything else. // 2px outside. box-shadow: 0 0 0 $border-width-focus $blue-medium-focus; @@ -162,12 +161,6 @@ } } } - - // Hide the focus indicator for collapsed blocks. - // These serve as only as column containers for floated blocks. - .block-editor-block-list__block.is-block-collapsed::after { - content: none; - } } @@ -243,17 +236,31 @@ cursor: default; } - .alignleft, - .alignright { - // Without z-index, won't be clickable as "above" adjacent content. - z-index: z-index(".block-editor-block-list__block {core/image aligned left or right}"); + // Clear floats. + &[data-clear="true"] { + float: none; } + // This essentially duplicates the mobile styles for the appender component. + // It would be nice to be able to use element queries in that component instead https://github.com/tomhodgins/element-queries-spec + .block-editor-block-list__layout { + .block-editor-default-block-appender .block-editor-inserter { + left: auto; + right: $grid-unit-10; + } + } +} + +// Extra specificity needed to override default element margins like lists (ul). +.block-editor-block-list__layout .wp-block { + margin-left: auto; + margin-right: auto; +} + +.wp-block { // Alignments. &[data-align="left"], &[data-align="right"] { - // Without z-index, won't be clickable as "above" adjacent content. - z-index: z-index(".block-editor-block-list__block {core/image aligned left or right}"); width: 100%; // When images are floated, the block itself should collapse to zero height. @@ -264,8 +271,14 @@ } } + &[data-align="left"] > *, + &[data-align="right"] > * { + // Without z-index, won't be clickable as "above" adjacent content. + z-index: z-index("{core/image aligned left or right} .wp-block"); + } + // Left. - &[data-align="left"] > .is-block-content { + &[data-align="left"] > * { // This is in the editor only; the image should be floated on the frontend. /*!rtl:begin:ignore*/ float: left; @@ -274,7 +287,7 @@ } // Right. - &[data-align="right"] > .is-block-content { + &[data-align="right"] > * { // Right: This is in the editor only; the image should be floated on the frontend. /*!rtl:begin:ignore*/ float: right; @@ -284,25 +297,9 @@ // Wide and full-wide. &[data-align="full"], - &[data-align="wide"], - &.alignfull, - &.alignwide { + &[data-align="wide"] { clear: both; } - - // Clear floats. - &[data-clear="true"] { - float: none; - } - - // This essentially duplicates the mobile styles for the appender component. - // It would be nice to be able to use element queries in that component instead https://github.com/tomhodgins/element-queries-spec - .block-editor-block-list__layout { - .block-editor-default-block-appender .block-editor-inserter { - left: auto; - right: $grid-unit-10; - } - } } /** @@ -608,6 +605,8 @@ // The purpose of this padding is to ensure that on small viewports, there is // room for the block border that sits 14px ($block-padding) offset from the // block footprint. +// These paddings and margins are removed from the BlockPreview component's style +// Any change need to be reflected there. .block-editor-block-list__layout.is-root-container { padding-left: $block-padding; padding-right: $block-padding; @@ -616,15 +615,9 @@ padding-left: $block-side-ui-width; padding-right: $block-side-ui-width; } -} -.block-editor-block-list__layout.is-root-container { - // Full-wide. (to account for the padddings added above) - // The first two rules account for the alignment wrapper div for the image block. - > div:not(.block-editor-block-list__block) > .block-editor-block-list__block[data-align="full"], - > div:not(.block-editor-block-list__block) > .block-editor-block-list__block.alignfull, - > .block-editor-block-list__block[data-align="full"], - > .block-editor-block-list__block.alignfull { + // Full-wide. (to account for the paddings added above) + > .wp-block[data-align="full"] { margin-left: -$block-padding; margin-right: -$block-padding; diff --git a/packages/block-editor/src/components/block-list/subdirectory-icon.js b/packages/block-editor/src/components/block-list/subdirectory-icon.js index f024c51880e4b2..432f545e4524d8 100644 --- a/packages/block-editor/src/components/block-list/subdirectory-icon.js +++ b/packages/block-editor/src/components/block-list/subdirectory-icon.js @@ -3,7 +3,7 @@ */ import { SVG, Path } from '@wordpress/components'; -const Subdirectory = ( { ...extraProps } ) => ( +const Subdirectory = ( { isRTL, ...extraProps } ) => ( ( viewBox="0 0 20 20" { ...extraProps } > - + ); export default Subdirectory; diff --git a/packages/block-editor/src/components/block-mobile-toolbar/index.native.js b/packages/block-editor/src/components/block-mobile-toolbar/index.native.js index b4a56abc4df1b0..6e3fc8aaa1fdd2 100644 --- a/packages/block-editor/src/components/block-mobile-toolbar/index.native.js +++ b/packages/block-editor/src/components/block-mobile-toolbar/index.native.js @@ -23,12 +23,12 @@ const BlockMobileToolbar = ( { clientId, onDelete, order, - horizontalDirection, + isStackedHorizontally, } ) => ( diff --git a/packages/block-editor/src/components/block-mover/index.native.js b/packages/block-editor/src/components/block-mover/index.native.js index 5ca80153bee052..818d7b35f3ac23 100644 --- a/packages/block-editor/src/components/block-mover/index.native.js +++ b/packages/block-editor/src/components/block-mover/index.native.js @@ -52,7 +52,7 @@ const BlockMover = ( { onMoveUp, firstIndex, rootClientId, - horizontalDirection, + isStackedHorizontally, } ) => { const { backwardButtonIcon, @@ -61,7 +61,7 @@ const BlockMover = ( { forwardButtonHint, firstBlockTitle, lastBlockTitle, - } = horizontalDirection ? horizontalMover : verticalMover; + } = isStackedHorizontally ? horizontalMover : verticalMover; if ( isLocked || ( isFirst && isLast && ! rootClientId ) ) { return null; @@ -72,7 +72,7 @@ const BlockMover = ( { forwardButtonProp, backwardButtonProp ) => { - if ( isRTL && horizontalDirection ) { + if ( isRTL && isStackedHorizontally ) { // for RTL and horizontal direction switch prop between forward and backward button if ( isBackwardButton ) { return forwardButtonProp; // set forwardButtonProp for backward button @@ -89,9 +89,10 @@ const BlockMover = ( { const direction = isBackwardButton ? -1 : 1; const toIndex = fromIndex + direction; // position after move - const { backwardButtonTitle, forwardButtonTitle } = horizontalDirection - ? horizontalMover - : verticalMover; + const { + backwardButtonTitle, + forwardButtonTitle, + } = isStackedHorizontally ? horizontalMover : verticalMover; const buttonTitle = switchButtonPropIfRTL( isBackwardButton, diff --git a/packages/block-editor/src/components/block-patterns/style.scss b/packages/block-editor/src/components/block-patterns/style.scss deleted file mode 100644 index 3d668004212c98..00000000000000 --- a/packages/block-editor/src/components/block-patterns/style.scss +++ /dev/null @@ -1,40 +0,0 @@ -.block-editor-patterns { - background: $light-gray-200; - padding: $grid-unit-20; -} - -.block-editor-patterns__item { - background: $white; - border-radius: $radius-block-ui; - - &.is-placeholder .block-editor-patterns__item-preview { - min-height: 100px; - } -} - -.block-editor-patterns__item { - border-radius: $radius-block-ui; - cursor: pointer; - margin-bottom: $grid-unit-20; - border: 1px solid $light-gray-500; - transition: all 0.05s ease-in-out; - position: relative; - - &:hover { - background: $white; - box-shadow: 0 0 0 1px $white, 0 0 0 3px $dark-gray-500; - } - - &:focus { - box-shadow: inset 0 0 0 1px $white, 0 0 0 $border-width-focus $theme-color; - - // Windows High Contrast mode will show this outline, but not the box-shadow. - outline: 2px solid transparent; - } -} - -.block-editor-patterns__item-title { - text-align: center; - padding: 10px 0; - padding: $grid-unit-20; -} diff --git a/packages/block-editor/src/components/block-preview/auto.js b/packages/block-editor/src/components/block-preview/auto.js index d819680b24053e..b02b362390e46a 100644 --- a/packages/block-editor/src/components/block-preview/auto.js +++ b/packages/block-editor/src/components/block-preview/auto.js @@ -31,7 +31,6 @@ function AutoBlockPreview( { viewportWidth, __experimentalPadding } ) { aria-hidden style={ { height: contentHeight * scale + 2 * __experimentalPadding, - padding: __experimentalPadding, } } > { containerResizeListener } diff --git a/packages/block-editor/src/components/block-preview/style.scss b/packages/block-editor/src/components/block-preview/style.scss index c6ef74f6c28b60..b3f344c4127c85 100644 --- a/packages/block-editor/src/components/block-preview/style.scss +++ b/packages/block-editor/src/components/block-preview/style.scss @@ -38,4 +38,16 @@ .block-list-appender { display: none; } + + // Reset default editor padding + .block-editor-block-list__layout.is-root-container { + padding-left: 0; + padding-right: 0; + + > .wp-block[data-align="full"] { + margin-left: 0; + margin-right: 0; + } + } } + diff --git a/packages/block-editor/src/components/block-styles/style.scss b/packages/block-editor/src/components/block-styles/style.scss index 0be7aab8113c90..ab720c9495d992 100644 --- a/packages/block-editor/src/components/block-styles/style.scss +++ b/packages/block-editor/src/components/block-styles/style.scss @@ -10,7 +10,7 @@ flex-shrink: 0; cursor: pointer; overflow: hidden; - border-radius: $radius-round-rectangle; + border-radius: $radius-block-ui; padding: $grid-unit-05 * 1.5; display: flex; flex-direction: column; @@ -42,7 +42,7 @@ outline: $border-width solid transparent; // Shown in Windows High Contrast mode. padding: 0; border: $border-width solid rgba($dark-gray-primary, 0.2); - border-radius: $radius-round-rectangle; + border-radius: $radius-block-ui; display: flex; overflow: hidden; background: $white; diff --git a/packages/block-editor/src/components/button-block-appender/index.native.js b/packages/block-editor/src/components/button-block-appender/index.native.js index 4a3be1a5b5ac06..e879ef243a0ca8 100644 --- a/packages/block-editor/src/components/button-block-appender/index.native.js +++ b/packages/block-editor/src/components/button-block-appender/index.native.js @@ -20,6 +20,7 @@ function ButtonBlockAppender( { rootClientId, getStylesFromColorScheme, showSeparator, + isFloating = false, onAddBlock, } ) { const appenderStyle = { @@ -31,7 +32,9 @@ function ButtonBlockAppender( { }; const addBlockButtonStyle = getStylesFromColorScheme( styles.addBlockButton, - styles.addBlockButtonDark + isFloating + ? styles.floatingAddBlockButtonDark + : styles.addBlockButtonDark ); return ( @@ -45,7 +48,12 @@ function ButtonBlockAppender( { disabled={ disabled } fixedRatio={ false } > - + - { children } - - ); -} +function CopyHandler( { children } ) { + const containerRef = useRef(); + + const { + getBlocksByClientId, + getSelectedBlockClientIds, + hasMultiSelection, + getSettings, + } = useSelect( ( select ) => select( 'core/block-editor' ), [] ); + + const { removeBlocks, replaceBlocks } = useDispatch( 'core/block-editor' ); -export default compose( [ - withDispatch( ( dispatch, ownProps, { select } ) => { - const { - getBlocksByClientId, - getSelectedBlockClientIds, - hasMultiSelection, - getSettings, - } = select( 'core/block-editor' ); - const { removeBlocks, replaceBlocks } = dispatch( 'core/block-editor' ); - const { - __experimentalCanUserUseUnfilteredHTML: canUserUseUnfilteredHTML, - } = getSettings(); + const { + __experimentalCanUserUseUnfilteredHTML: canUserUseUnfilteredHTML, + } = getSettings(); - return { - handler( event ) { - const selectedBlockClientIds = getSelectedBlockClientIds(); + const handler = ( event ) => { + const selectedBlockClientIds = getSelectedBlockClientIds(); - if ( selectedBlockClientIds.length === 0 ) { - return; - } + if ( selectedBlockClientIds.length === 0 ) { + return; + } - // Always handle multiple selected blocks. - // Let native copy behaviour take over in input fields. - if ( ! hasMultiSelection() && documentHasSelection() ) { - return; - } + // Always handle multiple selected blocks. + // Let native copy behaviour take over in input fields. + if ( ! hasMultiSelection() && documentHasSelection() ) { + return; + } - event.preventDefault(); + if ( ! containerRef.current.contains( event.target ) ) { + return; + } + event.preventDefault(); - if ( event.type === 'copy' || event.type === 'cut' ) { - const blocks = getBlocksByClientId( - selectedBlockClientIds - ); - const serialized = serialize( blocks ); + if ( event.type === 'copy' || event.type === 'cut' ) { + const blocks = getBlocksByClientId( selectedBlockClientIds ); + const serialized = serialize( blocks ); - event.clipboardData.setData( 'text/plain', serialized ); - event.clipboardData.setData( 'text/html', serialized ); - } + event.clipboardData.setData( 'text/plain', serialized ); + event.clipboardData.setData( 'text/html', serialized ); + } - if ( event.type === 'cut' ) { - removeBlocks( selectedBlockClientIds ); - } else if ( event.type === 'paste' ) { - const { plainText, html } = getPasteEventData( event ); - const blocks = pasteHandler( { - HTML: html, - plainText, - mode: 'BLOCKS', - canUserUseUnfilteredHTML, - } ); + if ( event.type === 'cut' ) { + removeBlocks( selectedBlockClientIds ); + } else if ( event.type === 'paste' ) { + const { plainText, html } = getPasteEventData( event ); + const blocks = pasteHandler( { + HTML: html, + plainText, + mode: 'BLOCKS', + canUserUseUnfilteredHTML, + } ); + + replaceBlocks( selectedBlockClientIds, blocks ); + } + }; + + return ( +
+ { children } +
+ ); +} - replaceBlocks( selectedBlockClientIds, blocks ); - } - }, - }; - } ), -] )( CopyHandler ); +export default CopyHandler; diff --git a/packages/block-editor/src/components/default-block-appender/style.scss b/packages/block-editor/src/components/default-block-appender/style.scss index 2e3fcffde51a88..fa805cad81d0d7 100644 --- a/packages/block-editor/src/components/default-block-appender/style.scss +++ b/packages/block-editor/src/components/default-block-appender/style.scss @@ -13,8 +13,8 @@ } textarea.block-editor-default-block-appender__content { // Needs specificity in order to override input field styles from WP-admin styles. - font-family: $editor-font; - font-size: $editor-font-size; // It should match the default paragraph size. + font-family: inherit; + font-size: inherit; border: none; background: none; box-shadow: none; @@ -55,7 +55,7 @@ .block-editor-block-list__empty-block-inserter.block-editor-block-list__empty-block-inserter, // Empty paragraph, needs specificity to override inherited popover styles. .block-editor-default-block-appender .block-editor-inserter { // Empty appender. position: absolute; - top: 2px; // Centers it in the default paragraph height. + top: 0; height: $button-size-small + $grid-unit-10; .block-editor-inserter__toggle { diff --git a/packages/block-editor/src/components/floating-toolbar/floatingToolbar.android.scss b/packages/block-editor/src/components/floating-toolbar/floatingToolbar.android.scss new file mode 100644 index 00000000000000..e593022f0db97e --- /dev/null +++ b/packages/block-editor/src/components/floating-toolbar/floatingToolbar.android.scss @@ -0,0 +1,4 @@ +.floatingToolbarOffset { + top: 0; + margin-top: 8px; +} diff --git a/packages/block-editor/src/components/floating-toolbar/floatingToolbar.ios.scss b/packages/block-editor/src/components/floating-toolbar/floatingToolbar.ios.scss new file mode 100644 index 00000000000000..c25157540286d0 --- /dev/null +++ b/packages/block-editor/src/components/floating-toolbar/floatingToolbar.ios.scss @@ -0,0 +1,3 @@ +.floatingToolbarOffset { + top: - ($mobile-floating-toolbar-height + $mobile-floating-toolbar-margin); +} diff --git a/packages/block-editor/src/components/floating-toolbar/index.native.js b/packages/block-editor/src/components/floating-toolbar/index.native.js new file mode 100644 index 00000000000000..3d3b49f0d9471d --- /dev/null +++ b/packages/block-editor/src/components/floating-toolbar/index.native.js @@ -0,0 +1,77 @@ +/** + * External dependencies + */ +import { View, TouchableWithoutFeedback, I18nManager } from 'react-native'; + +/** + * WordPress dependencies + */ +import { ToolbarButton, Toolbar } from '@wordpress/components'; +import { withSelect, withDispatch } from '@wordpress/data'; +import { compose } from '@wordpress/compose'; +import { __ } from '@wordpress/i18n'; + +/** + * Internal dependencies + */ +import styles from './styles.scss'; +import NavigateUpSVG from './nav-up-icon'; +import Breadcrumb from '../block-list/breadcrumb.native'; + +const FloatingToolbar = ( { + selectedClientId, + parentId, + showFloatingToolbar, + onNavigateUp, +} ) => + !! showFloatingToolbar && ( + + + { !! parentId && ( + + onNavigateUp( parentId ) } + icon={ + + } + /> + + + ) } + + + + ); + +export default compose( [ + withSelect( ( select ) => { + const { + getSelectedBlockClientId, + getBlockHierarchyRootClientId, + getBlockRootClientId, + getBlockCount, + } = select( 'core/block-editor' ); + + const selectedClientId = getSelectedBlockClientId(); + + if ( ! selectedClientId ) return; + + const rootBlockId = getBlockHierarchyRootClientId( selectedClientId ); + + return { + selectedClientId, + showFloatingToolbar: !! getBlockCount( rootBlockId ), + parentId: getBlockRootClientId( selectedClientId ), + }; + } ), + withDispatch( ( dispatch ) => { + const { selectBlock } = dispatch( 'core/block-editor' ); + + return { + onNavigateUp( clientId, initialPosition ) { + selectBlock( clientId, initialPosition ); + }, + }; + } ), +] )( FloatingToolbar ); diff --git a/packages/block-editor/src/components/block-list/nav-up-icon.js b/packages/block-editor/src/components/floating-toolbar/nav-up-icon.js similarity index 80% rename from packages/block-editor/src/components/block-list/nav-up-icon.js rename to packages/block-editor/src/components/floating-toolbar/nav-up-icon.js index ae1d897660af7b..029b667dfb498c 100644 --- a/packages/block-editor/src/components/block-list/nav-up-icon.js +++ b/packages/block-editor/src/components/floating-toolbar/nav-up-icon.js @@ -3,7 +3,7 @@ */ import { SVG, Path } from '@wordpress/components'; -const NavigateUp = ( +const NavigateUp = ( { isRTL } ) => ( ); diff --git a/packages/block-editor/src/components/floating-toolbar/styles.native.scss b/packages/block-editor/src/components/floating-toolbar/styles.native.scss new file mode 100644 index 00000000000000..8a4b7a1f821374 --- /dev/null +++ b/packages/block-editor/src/components/floating-toolbar/styles.native.scss @@ -0,0 +1,43 @@ +@import "floatingToolbar"; + +.floatingToolbar { + position: absolute; + @extend .floatingToolbarOffset; + background-color: $background-dark-elevated; + margin-left: auto; + margin-right: auto; + min-width: 100; + max-height: $mobile-floating-toolbar-height; + border-radius: 22px; + flex-direction: row; + z-index: 100; + height: $mobile-floating-toolbar-height; + align-items: center; + justify-content: center; + align-self: center; +} + +.floatingToolbarFillColor { + background-color: $background-dark-elevated; +} + +.floatingToolbarFillColorDark { + background-color: $background-dark-elevated; +} + +.toolbar { + border-left-width: 0; + margin-right: auto; + padding-left: 2px; + height: $mobile-floating-toolbar-height; +} + +.pipe { + margin-top: auto; + margin-bottom: auto; + margin-left: 2px; + height: 28px; + width: 1px; + background-color: #e9eff3; + opacity: 0.4; +} diff --git a/packages/block-editor/src/components/index.js b/packages/block-editor/src/components/index.js index ae163f11df919f..ad92c523174d1b 100644 --- a/packages/block-editor/src/components/index.js +++ b/packages/block-editor/src/components/index.js @@ -9,13 +9,13 @@ export { default as AlignmentToolbar } from './alignment-toolbar'; export { default as Autocomplete } from './autocomplete'; export { default as BlockAlignmentToolbar } from './block-alignment-toolbar'; export { default as BlockBreadcrumb } from './block-breadcrumb'; +export { BlockContextProvider } from './block-context'; export { default as BlockControls } from './block-controls'; export { default as BlockEdit, useBlockEditContext } from './block-edit'; export { default as BlockFormatControls } from './block-format-controls'; export { default as BlockIcon } from './block-icon'; export { default as BlockNavigationDropdown } from './block-navigation/dropdown'; export { default as __experimentalBlockNavigationList } from './block-navigation/list'; -export { default as __experimentalBlockPatterns } from './block-patterns'; export { default as __experimentalBlockVariationPicker } from './block-variation-picker'; export { default as BlockVerticalAlignmentToolbar } from './block-vertical-alignment-toolbar'; export { default as ButtonBlockerAppender } from './button-block-appender'; @@ -60,6 +60,8 @@ export { default as withColorContext } from './color-palette/with-color-context' export { default as __experimentalBlockSettingsMenuFirstItem } from './block-settings-menu/block-settings-menu-first-item'; export { default as __experimentalInserterMenuExtension } from './inserter-menu-extension'; +export { default as __experimentalPreviewOptions } from './preview-options'; +export { default as __experimentalUseResizeCanvas } from './resize-canvas'; export { default as BlockInspector } from './block-inspector'; export { default as BlockList } from './block-list'; export { Block as __experimentalBlock } from './block-list/block-wrapper'; @@ -74,6 +76,7 @@ export { default as CopyHandler } from './copy-handler'; export { default as DefaultBlockAppender } from './default-block-appender'; export { default as __unstableEditorStyles } from './editor-styles'; export { default as Inserter } from './inserter'; +export { default as __experimentalLibrary } from './inserter/library'; export { default as BlockEditorKeyboardShortcuts } from './keyboard-shortcuts'; export { default as MultiSelectScrollIntoView } from './multi-select-scroll-into-view'; export { default as NavigableToolbar } from './navigable-toolbar'; @@ -90,3 +93,4 @@ export { default as WritingFlow } from './writing-flow'; export { default as BlockEditorProvider } from './provider'; export { default as useSimulatedMediaQuery } from './use-simulated-media-query'; +export { default as __experimentalUseEditorFeature } from './use-editor-feature'; diff --git a/packages/block-editor/src/components/index.native.js b/packages/block-editor/src/components/index.native.js index 5f8ec865a4b32f..f2e9e2ed82c688 100644 --- a/packages/block-editor/src/components/index.native.js +++ b/packages/block-editor/src/components/index.native.js @@ -1,5 +1,6 @@ // Block Creation Components export { default as BlockAlignmentToolbar } from './block-alignment-toolbar'; +export { BlockContextProvider } from './block-context'; export { default as BlockControls } from './block-controls'; export { default as BlockEdit, useBlockEditContext } from './block-edit'; export { default as BlockFormatControls } from './block-format-controls'; @@ -48,6 +49,7 @@ export { default as DefaultBlockAppender } from './default-block-appender'; export { default as __unstableEditorStyles } from './editor-styles'; export { default as Inserter } from './inserter'; export { Block as __experimentalBlock } from './block-list/block-wrapper'; +export { default as FloatingToolbar } from './floating-toolbar'; // State Related Components export { default as BlockEditorProvider } from './provider'; diff --git a/packages/block-editor/src/components/inner-blocks/button-block-appender.js b/packages/block-editor/src/components/inner-blocks/button-block-appender.js index 874366015abd16..88bd12bd46b771 100644 --- a/packages/block-editor/src/components/inner-blocks/button-block-appender.js +++ b/packages/block-editor/src/components/inner-blocks/button-block-appender.js @@ -7,12 +7,14 @@ import withClientId from './with-client-id'; export const ButtonBlockAppender = ( { clientId, showSeparator, + isFloating, onAddBlock, } ) => { return ( ); diff --git a/packages/block-editor/src/components/inner-blocks/index.js b/packages/block-editor/src/components/inner-blocks/index.js index 1e5672b6c7fc40..64b958d7f8bf10 100644 --- a/packages/block-editor/src/components/inner-blocks/index.js +++ b/packages/block-editor/src/components/inner-blocks/index.js @@ -1,7 +1,7 @@ /** * External dependencies */ -import { pick, isEqual } from 'lodash'; +import { mapValues, pick, isEqual } from 'lodash'; import classnames from 'classnames'; /** @@ -11,6 +11,7 @@ import { withViewportMatch } from '@wordpress/viewport'; import { Component, forwardRef, useRef } from '@wordpress/element'; import { withSelect, withDispatch } from '@wordpress/data'; import { + getBlockType, synchronizeBlocksWithTemplate, withBlockContentContext, } from '@wordpress/blocks'; @@ -27,8 +28,44 @@ import DefaultBlockAppender from './default-block-appender'; * Internal dependencies */ import BlockList from '../block-list'; +import { BlockContextProvider } from '../block-context'; import { withBlockEditContext } from '../block-edit/context'; +/** + * Block context cache, implemented as a WeakMap mapping block types to a + * WeakMap mapping attributes object to context value. + * + * @type {WeakMap>} + */ +const BLOCK_CONTEXT_CACHE = new WeakMap(); + +/** + * Returns a cached context object value for a given set of attributes for the + * block type. + * + * @param {Record} attributes Block attributes object. + * @param {WPBlockType} blockType Block type settings. + * + * @return {Record} Context value. + */ +function getBlockContext( attributes, blockType ) { + if ( ! BLOCK_CONTEXT_CACHE.has( blockType ) ) { + BLOCK_CONTEXT_CACHE.set( blockType, new WeakMap() ); + } + + const blockTypeCache = BLOCK_CONTEXT_CACHE.get( blockType ); + if ( ! blockTypeCache.has( attributes ) ) { + const context = mapValues( + blockType.providesContext, + ( attributeName ) => attributes[ attributeName ] + ); + + blockTypeCache.set( attributes, context ); + } + + return blockTypeCache.get( attributes ); +} + class InnerBlocks extends Component { constructor() { super( ...arguments ); @@ -148,6 +185,7 @@ class InnerBlocks extends Component { hasOverlay, __experimentalCaptureToolbars: captureToolbars, forwardedRef, + block, ...props } = this.props; const { templateInProcess } = this.state; @@ -161,7 +199,7 @@ class InnerBlocks extends Component { 'is-capturing-toolbar': captureToolbars, } ); - const blockList = ( + let blockList = ( ); + // Wrap context provider if (and only if) block has context to provide. + const blockType = getBlockType( block.name ); + if ( blockType && blockType.providesContext ) { + const context = getBlockContext( block.attributes, blockType ); + + blockList = ( + + { blockList } + + ); + } + if ( props.__experimentalTagName ) { return blockList; } diff --git a/packages/block-editor/src/components/inner-blocks/index.native.js b/packages/block-editor/src/components/inner-blocks/index.native.js index d462fa40d04865..3f078de90dff97 100644 --- a/packages/block-editor/src/components/inner-blocks/index.native.js +++ b/packages/block-editor/src/components/inner-blocks/index.native.js @@ -20,10 +20,6 @@ import { compose } from '@wordpress/compose'; */ import ButtonBlockAppender from './button-block-appender'; import DefaultBlockAppender from './default-block-appender'; - -/** - * Internal dependencies - */ import BlockList from '../block-list'; import { withBlockEditContext } from '../block-edit/context'; @@ -112,15 +108,17 @@ class InnerBlocks extends Component { const { clientId, renderAppender, + renderFooterAppender, __experimentalMoverDirection, + parentWidth, horizontal, - scrollEnabled, contentResizeMode, contentStyle, onAddBlock, onDeleteBlock, marginVertical, marginHorizontal, + horizontalAlignment, } = this.props; const { templateInProcess } = this.state; @@ -132,12 +130,14 @@ class InnerBlocks extends Component { marginHorizontal={ marginHorizontal } rootClientId={ clientId } renderAppender={ renderAppender } + renderFooterAppender={ renderFooterAppender } withFooter={ false } __experimentalMoverDirection={ __experimentalMoverDirection } + parentWidth={ parentWidth } + horizontalAlignment={ horizontalAlignment } horizontal={ horizontal } - scrollEnabled={ scrollEnabled } contentResizeMode={ contentResizeMode } contentStyle={ contentStyle } onAddBlock={ onAddBlock } diff --git a/packages/block-editor/src/components/inserter-list-item/style.scss b/packages/block-editor/src/components/inserter-list-item/style.scss index 00c9eae4ed38fe..745caa0ed1ff7a 100644 --- a/packages/block-editor/src/components/inserter-list-item/style.scss +++ b/packages/block-editor/src/components/inserter-list-item/style.scss @@ -2,7 +2,7 @@ display: block; width: 33.33%; padding: 0; - margin: 0 0 12px; + margin: 0; } .components-button.block-editor-block-types-list__item { @@ -11,13 +11,13 @@ width: 100%; font-size: $default-font-size; color: $dark-gray-700; - padding: 0 4px; + padding: $grid-unit-10; align-items: stretch; justify-content: center; cursor: pointer; background: transparent; word-break: break-word; - border-radius: $radius-round-rectangle; + border-radius: $radius-block-ui; border: $border-width solid transparent; transition: all 0.05s ease-in-out; @include reduce-motion("transition"); @@ -48,7 +48,7 @@ .block-editor-block-types-list__item-icon { padding: 12px 20px; - border-radius: $radius-round-rectangle; + border-radius: $radius-block-ui; color: $dark-gray-primary; transition: all 0.05s ease-in-out; @include reduce-motion("transition"); @@ -66,4 +66,5 @@ .block-editor-block-types-list__item-title { padding: 4px 2px 8px; + font-size: 12px; } diff --git a/packages/block-editor/src/components/inserter/block-list.js b/packages/block-editor/src/components/inserter/block-list.js index acb1a68c55ee2a..60e57c98ab35a1 100644 --- a/packages/block-editor/src/components/inserter/block-list.js +++ b/packages/block-editor/src/components/inserter/block-list.js @@ -3,7 +3,6 @@ */ import { map, - pick, includes, filter, findIndex, @@ -11,22 +10,20 @@ import { sortBy, groupBy, isEmpty, - without, } from 'lodash'; -import scrollIntoView from 'dom-scroll-into-view'; /** * WordPress dependencies */ import { __, _x, _n, sprintf } from '@wordpress/i18n'; -import { PanelBody, withSpokenMessages } from '@wordpress/components'; +import { withSpokenMessages } from '@wordpress/components'; import { addQueryArgs } from '@wordpress/url'; import { controlsRepeat } from '@wordpress/icons'; import { speak } from '@wordpress/a11y'; -import { createBlock, isUnmodifiedDefaultBlock } from '@wordpress/blocks'; -import { useMemo, useEffect, useState, useRef } from '@wordpress/element'; -import { useSelect, useDispatch } from '@wordpress/data'; -import { compose, withSafeTimeout } from '@wordpress/compose'; +import { createBlock } from '@wordpress/blocks'; +import { useMemo, useEffect } from '@wordpress/element'; +import { useSelect } from '@wordpress/data'; +import { compose } from '@wordpress/compose'; /** * Internal dependencies @@ -35,6 +32,7 @@ import BlockTypesList from '../block-types-list'; import ChildBlocks from './child-blocks'; import __experimentalInserterMenuExtension from '../inserter-menu-extension'; import { searchItems } from './search-items'; +import InserterPanel from './panel'; // Copied over from the Columns block. It seems like it should become part of public API. const createBlocksFromInnerBlocksTemplate = ( innerBlocksTemplate ) => { @@ -54,76 +52,42 @@ const getBlockNamespace = ( item ) => item.name.split( '/' )[ 0 ]; const MAX_SUGGESTED_ITEMS = 9; function InserterBlockList( { - clientId, - isAppender, rootClientId, - onSelect, + onInsert, onHover, __experimentalSelectBlockOnInsert: selectBlockOnInsert, filterValue, debouncedSpeak, - setTimeout: safeSetTimeout, } ) { const { categories, collections, items, rootChildBlocks, - getSelectedBlock, - destinationRootClientId, - getBlockIndex, - getBlockSelectionEnd, - getBlockOrder, fetchReusableBlocks, } = useSelect( ( select ) => { - const { - getInserterItems, - getBlockName, - getBlockRootClientId, - getBlockSelectionEnd: _getBlockSelectionEnd, - getSettings, - } = select( 'core/block-editor' ); + const { getInserterItems, getBlockName, getSettings } = select( + 'core/block-editor' + ); const { getCategories, getCollections, getChildBlockNames, } = select( 'core/blocks' ); - - let destRootClientId = rootClientId; - if ( ! destRootClientId && ! clientId && ! isAppender ) { - const end = _getBlockSelectionEnd(); - if ( end ) { - destRootClientId = getBlockRootClientId( end ) || undefined; - } - } - const destinationRootBlockName = getBlockName( destRootClientId ); - + const rootBlockName = getBlockName( rootClientId ); const { __experimentalFetchReusableBlocks } = getSettings(); return { categories: getCategories(), collections: getCollections(), - rootChildBlocks: getChildBlockNames( destinationRootBlockName ), - items: getInserterItems( destRootClientId ), - destinationRootClientId: destRootClientId, + rootChildBlocks: getChildBlockNames( rootBlockName ), + items: getInserterItems( rootClientId ), fetchReusableBlocks: __experimentalFetchReusableBlocks, - ...pick( select( 'core/block-editor' ), [ - 'getSelectedBlock', - 'getBlockIndex', - 'getBlockSelectionEnd', - 'getBlockOrder', - ] ), }; }, - [ clientId, isAppender, rootClientId ] + [ rootClientId ] ); - const { - replaceBlocks, - insertBlock, - showInsertionPoint, - hideInsertionPoint, - } = useDispatch( 'core/block-editor' ); // Fetch resuable blocks on mount useEffect( () => { @@ -132,68 +96,21 @@ function InserterBlockList( { } }, [] ); - // To avoid duplication, getInsertionIndex is extracted and used in two event handlers - // This breaks the withDispatch not containing any logic rule. - // Since it's a function only called when the event handlers are called, - // it's fine to extract it. - // eslint-disable-next-line no-restricted-syntax - function getInsertionIndex() { - // If the clientId is defined, we insert at the position of the block. - if ( clientId ) { - return getBlockIndex( clientId, destinationRootClientId ); - } - - // If there a selected block, we insert after the selected block. - const end = getBlockSelectionEnd(); - if ( ! isAppender && end ) { - return getBlockIndex( end, destinationRootClientId ) + 1; - } - - // Otherwise, we insert at the end of the current rootClientId - return getBlockOrder( destinationRootClientId ).length; - } - - const onHoverItem = ( item ) => { - onHover( item ); - if ( item ) { - const index = getInsertionIndex(); - showInsertionPoint( destinationRootClientId, index ); - } else { - hideInsertionPoint(); - } - }; - const onSelectItem = ( item ) => { const { name, title, initialAttributes, innerBlocks } = item; - const selectedBlock = getSelectedBlock(); const insertedBlock = createBlock( name, initialAttributes, createBlocksFromInnerBlocksTemplate( innerBlocks ) ); - if ( - ! isAppender && - selectedBlock && - isUnmodifiedDefaultBlock( selectedBlock ) - ) { - replaceBlocks( selectedBlock.clientId, insertedBlock ); - } else { - insertBlock( - insertedBlock, - getInsertionIndex(), - destinationRootClientId, - selectBlockOnInsert - ); - if ( ! selectBlockOnInsert ) { - // translators: %s: the name of the block that has been added - const message = sprintf( __( '%s block added' ), title ); - speak( message ); - } - } + onInsert( insertedBlock ); - onSelect(); - return insertedBlock; + if ( ! selectBlockOnInsert ) { + // translators: %s: the name of the block that has been added + const message = sprintf( __( '%s block added' ), title ); + speak( message ); + } }; const filteredItems = useMemo( () => { @@ -248,61 +165,6 @@ function InserterBlockList( { return result; }, [ filteredItems, collections ] ); - const inserterResults = useRef(); - const panels = useRef( [] ); - const bindPanel = ( name ) => ( ref ) => { - panels.current[ name ] = ref; - }; - const [ openPanels, setOpenPanels ] = useState( [ 'suggested' ] ); - - const onTogglePanel = ( panel ) => { - return () => { - const isOpened = openPanels.indexOf( panel ) !== -1; - if ( isOpened ) { - setOpenPanels( without( openPanels, panel ) ); - } else { - setOpenPanels( [ ...openPanels, panel ] ); - - safeSetTimeout( () => { - // We need a generic way to access the panel's container - scrollIntoView( - panels.current[ panel ], - inserterResults.current, - { - alignWithTop: true, - } - ); - } ); - } - }; - }; - - // Update the open panels on search - useEffect( () => { - if ( ! filterValue ) { - setOpenPanels( [ 'suggested' ] ); - return; - } - let newOpenPanels = []; - if ( reusableItems.length > 0 ) { - newOpenPanels.push( 'reusable' ); - } - if ( filteredItems.length > 0 ) { - newOpenPanels = newOpenPanels.concat( - Object.keys( itemsPerCategory ), - Object.keys( itemsPerCollection ) - ); - } - - setOpenPanels( newOpenPanels ); - }, [ - filterValue, - filteredItems, - reusableItems, - itemsPerCategory, - itemsPerCollection, - ] ); - // Announce search results on change useEffect( () => { const resultCount = Object.keys( itemsPerCategory ).reduce( @@ -322,100 +184,81 @@ function InserterBlockList( { debouncedSpeak( resultsFoundMessage ); }, [ itemsPerCategory, debouncedSpeak ] ); - const isPanelOpen = ( panel ) => openPanels.indexOf( panel ) !== -1; - const hasItems = ! isEmpty( filteredItems ); + const hasChildItems = childItems.length > 0; return ( -
+
- { !! suggestedItems.length && ! filterValue && ( - + { ! hasChildItems && !! suggestedItems.length && ! filterValue && ( + - + ) } - { map( categories, ( category ) => { - const categoryItems = itemsPerCategory[ category.slug ]; - if ( ! categoryItems || ! categoryItems.length ) { - return null; - } - return ( - - - - ); - } ) } + { ! hasChildItems && + map( categories, ( category ) => { + const categoryItems = itemsPerCategory[ category.slug ]; + if ( ! categoryItems || ! categoryItems.length ) { + return null; + } + return ( + + + + ); + } ) } - { map( collections, ( collection, namespace ) => { - const collectionItems = itemsPerCollection[ namespace ]; - if ( ! collectionItems || ! collectionItems.length ) { - return null; - } + { ! hasChildItems && + map( collections, ( collection, namespace ) => { + const collectionItems = itemsPerCollection[ namespace ]; + if ( ! collectionItems || ! collectionItems.length ) { + return null; + } - return ( - - - - ); - } ) } + return ( + + + + ); + } ) } - { !! reusableItems.length && ( - { __( 'Manage all reusable blocks' ) } - + ) } <__experimentalInserterMenuExtension.Slot fillProps={ { onSelect: onSelectItem, - onHover: onHoverItem, + onHover, filterValue, hasItems, } } > { ( fills ) => { if ( fills.length ) { - return fills; + return ( + + { fills } + + ); } if ( ! hasItems ) { return ( @@ -454,7 +303,4 @@ function InserterBlockList( { ); } -export default compose( - withSpokenMessages, - withSafeTimeout -)( InserterBlockList ); +export default compose( withSpokenMessages )( InserterBlockList ); diff --git a/packages/block-editor/src/components/block-patterns/index.js b/packages/block-editor/src/components/inserter/block-patterns.js similarity index 53% rename from packages/block-editor/src/components/block-patterns/index.js rename to packages/block-editor/src/components/inserter/block-patterns.js index 729065ff06d04f..56288df4be228a 100644 --- a/packages/block-editor/src/components/block-patterns/index.js +++ b/packages/block-editor/src/components/inserter/block-patterns.js @@ -8,23 +8,24 @@ import { map } from 'lodash'; */ import { useMemo, useCallback } from '@wordpress/element'; import { parse, cloneBlock } from '@wordpress/blocks'; -import { useSelect, useDispatch } from '@wordpress/data'; +import { useDispatch } from '@wordpress/data'; import { ENTER, SPACE } from '@wordpress/keycodes'; -import { __, sprintf } from '@wordpress/i18n'; +import { __, sprintf, _x } from '@wordpress/i18n'; /** * Internal dependencies */ import BlockPreview from '../block-preview'; import useAsyncList from './use-async-list'; +import InserterPanel from './panel'; function BlockPattern( { pattern, onClick } ) { - const { title, content } = pattern; + const { content } = pattern; const blocks = useMemo( () => parse( content ), [ content ] ); return (
onClick( pattern, blocks ) } onKeyDown={ ( event ) => { @@ -33,41 +34,24 @@ function BlockPattern( { pattern, onClick } ) { } } } tabIndex={ 0 } + aria-label={ pattern.title } > -
- -
-
{ title }
+
); } -function BlockPatternPlaceholder( { pattern } ) { - const { title } = pattern; - +function BlockPatternPlaceholder() { return ( -
-
-
{ title }
-
+
); } -function BlockPatterns( { patterns } ) { +function BlockPatterns( { patterns, onInsert } ) { const currentShownPatterns = useAsyncList( patterns ); - const getBlockInsertionPoint = useSelect( ( select ) => { - return select( 'core/block-editor' ).getBlockInsertionPoint; - } ); - const { insertBlocks } = useDispatch( 'core/block-editor' ); const { createSuccessNotice } = useDispatch( 'core/notices' ); const onClickPattern = useCallback( ( pattern, blocks ) => { - const { index, rootClientId } = getBlockInsertionPoint(); - insertBlocks( - map( blocks, ( block ) => cloneBlock( block ) ), - index, - rootClientId, - false - ); + onInsert( map( blocks, ( block ) => cloneBlock( block ) ) ); createSuccessNotice( sprintf( /* translators: %s: block pattern title. */ @@ -81,7 +65,7 @@ function BlockPatterns( { patterns } ) { }, [] ); return ( -
+ { patterns.map( ( pattern, index ) => currentShownPatterns[ index ] === pattern ? ( ) : ( - + ) ) } -
+ ); } diff --git a/packages/block-editor/src/components/inserter/library.js b/packages/block-editor/src/components/inserter/library.js new file mode 100644 index 00000000000000..a5e7094f54d4a7 --- /dev/null +++ b/packages/block-editor/src/components/inserter/library.js @@ -0,0 +1,47 @@ +/** + * External dependencies + */ +import { noop } from 'lodash'; + +/** + * WordPress dependencies + */ +import { useSelect } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import InserterMenu from './menu'; + +function InserterLibrary( { + rootClientId, + clientId, + isAppender, + showInserterHelpPanel, + __experimentalSelectBlockOnInsert: selectBlockOnInsert, + onSelect = noop, +} ) { + const { destinationRootClientId } = useSelect( ( select ) => { + const { getBlockRootClientId } = select( 'core/block-editor' ); + + rootClientId = + rootClientId || getBlockRootClientId( clientId ) || undefined; + + return { + rootClientId, + }; + } ); + + return ( + + ); +} + +export default InserterLibrary; diff --git a/packages/block-editor/src/components/inserter/menu.js b/packages/block-editor/src/components/inserter/menu.js index 5698b278e211dd..6e446717f37517 100644 --- a/packages/block-editor/src/components/inserter/menu.js +++ b/packages/block-editor/src/components/inserter/menu.js @@ -1,13 +1,17 @@ /** * External dependencies */ -import { includes } from 'lodash'; +import { includes, pick } from 'lodash'; /** * WordPress dependencies */ import { useState } from '@wordpress/element'; import { LEFT, RIGHT, UP, DOWN, BACKSPACE, ENTER } from '@wordpress/keycodes'; +import { TabPanel } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; +import { useSelect, useDispatch } from '@wordpress/data'; +import { isUnmodifiedDefaultBlock } from '@wordpress/blocks'; /** * Internal dependencies @@ -16,6 +20,7 @@ import Tips from './tips'; import InserterSearchForm from './search-form'; import InserterPreviewPanel from './preview-panel'; import InserterBlockList from './block-list'; +import BlockPatterns from './block-patterns'; const stopKeyPropagation = ( event ) => event.stopPropagation(); @@ -29,6 +34,49 @@ function InserterMenu( { } ) { const [ filterValue, setFilterValue ] = useState( '' ); const [ hoveredItem, setHoveredItem ] = useState( null ); + const { + destinationRootClientId, + patterns, + getSelectedBlock, + getBlockIndex, + getBlockSelectionEnd, + getBlockOrder, + } = useSelect( ( select ) => { + const { + getSettings, + getBlockRootClientId, + getBlockSelectionEnd: _getBlockSelectionEnd, + } = select( 'core/block-editor' ); + + let destRootClientId = rootClientId; + if ( ! destRootClientId && ! clientId && ! isAppender ) { + const end = _getBlockSelectionEnd(); + if ( end ) { + destRootClientId = getBlockRootClientId( end ) || undefined; + } + } + return { + patterns: getSettings().__experimentalBlockPatterns, + destinationRootClientId: destRootClientId, + ...pick( select( 'core/block-editor' ), [ + 'getSelectedBlock', + 'getBlockIndex', + 'getBlockSelectionEnd', + 'getBlockOrder', + ] ), + }; + }, [] ); + const { + replaceBlocks, + insertBlocks, + showInsertionPoint, + hideInsertionPoint, + } = useDispatch( 'core/block-editor' ); + const hasPatterns = + ! destinationRootClientId && + !! patterns && + !! patterns.length && + ! filterValue; const onKeyDown = ( event ) => { if ( includes( @@ -41,6 +89,86 @@ function InserterMenu( { } }; + // To avoid duplication, getInsertionIndex is extracted and used in two event handlers + // This breaks the withDispatch not containing any logic rule. + // Since it's a function only called when the event handlers are called, + // it's fine to extract it. + // eslint-disable-next-line no-restricted-syntax + function getInsertionIndex() { + // If the clientId is defined, we insert at the position of the block. + if ( clientId ) { + return getBlockIndex( clientId, destinationRootClientId ); + } + + // If there a selected block, we insert after the selected block. + const end = getBlockSelectionEnd(); + if ( ! isAppender && end ) { + return getBlockIndex( end, destinationRootClientId ) + 1; + } + + // Otherwise, we insert at the end of the current rootClientId + return getBlockOrder( destinationRootClientId ).length; + } + + const onInsertBlocks = ( blocks ) => { + const selectedBlock = getSelectedBlock(); + if ( + ! isAppender && + selectedBlock && + isUnmodifiedDefaultBlock( selectedBlock ) + ) { + replaceBlocks( selectedBlock.clientId, blocks ); + } else { + insertBlocks( + blocks, + getInsertionIndex(), + destinationRootClientId, + __experimentalSelectBlockOnInsert + ); + } + + onSelect(); + }; + + const onHover = ( item ) => { + setHoveredItem( item ); + if ( item ) { + const index = getInsertionIndex(); + showInsertionPoint( destinationRootClientId, index ); + } else { + hideInsertionPoint(); + } + }; + + const blocksTab = ( + <> +
+
+ +
+
+ { showInserterHelpPanel && ( +
+ +
+ ) } + + ); + + const patternsTab = ( +
+ +
+ ); + // Disable reason (no-autofocus): The inserter menu is a modal display, not one which // is always visible, and one which already incurs this behavior of autoFocus via // Popover's focusOnMount. @@ -55,25 +183,36 @@ function InserterMenu( { >
- - { showInserterHelpPanel && ( -
- -
+ { hasPatterns && ( + + { ( tab ) => { + if ( tab.name === 'blocks' ) { + return blocksTab; + } + return patternsTab; + } } + ) } + { ! hasPatterns && blocksTab }
{ showInserterHelpPanel && hoveredItem && ( - +
+ +
) }
); diff --git a/packages/block-editor/src/components/inserter/panel.js b/packages/block-editor/src/components/inserter/panel.js new file mode 100644 index 00000000000000..aa53395d55dd65 --- /dev/null +++ b/packages/block-editor/src/components/inserter/panel.js @@ -0,0 +1,22 @@ +/** + * WordPress dependencies + */ +import { Icon } from '@wordpress/components'; + +function InserterPanel( { title, icon, children } ) { + return ( + <> +
+ + { title } + + +
+
+ { children } +
+ + ); +} + +export default InserterPanel; diff --git a/packages/block-editor/src/components/inserter/preview-panel.js b/packages/block-editor/src/components/inserter/preview-panel.js index 06f989a2a9bb06..763edbbd506377 100644 --- a/packages/block-editor/src/components/inserter/preview-panel.js +++ b/packages/block-editor/src/components/inserter/preview-panel.js @@ -18,12 +18,12 @@ import BlockPreview from '../block-preview'; function InserterPreviewPanel( { item } ) { const hoveredItemBlockType = getBlockType( item.name ); return ( -
- { ! isReusableBlock( item ) && } +
{ isReusableBlock( item ) || hoveredItemBlockType.example ? (
) }
+ { ! isReusableBlock( item ) && }
); } diff --git a/packages/block-editor/src/components/inserter/search-form.js b/packages/block-editor/src/components/inserter/search-form.js index ca326e003d7090..6c1f140a98ac7f 100644 --- a/packages/block-editor/src/components/inserter/search-form.js +++ b/packages/block-editor/src/components/inserter/search-form.js @@ -4,6 +4,7 @@ import { useInstanceId } from '@wordpress/compose'; import { __ } from '@wordpress/i18n'; import { VisuallyHidden } from '@wordpress/components'; +import { Icon, search } from '@wordpress/icons'; function InserterSearchForm( { onChange } ) { const instanceId = useInstanceId( InserterSearchForm ); @@ -13,7 +14,7 @@ function InserterSearchForm( { onChange } ) { // Popover's focusOnMount. /* eslint-disable jsx-a11y/no-autofocus */ return ( - <> +
onChange( event.target.value ) } + autoComplete="off" /> - + +
); /* eslint-enable jsx-a11y/no-autofocus */ } diff --git a/packages/block-editor/src/components/inserter/style.scss b/packages/block-editor/src/components/inserter/style.scss index 7adfb07c597f64..000f3c2cf99bd4 100644 --- a/packages/block-editor/src/components/inserter/style.scss +++ b/packages/block-editor/src/components/inserter/style.scss @@ -1,6 +1,6 @@ $block-inserter-preview-height: 350px; +$block-inserter-width: 350px; $block-inserter-tabs-height: 44px; -$block-inserter-search-height: 38px; .block-editor-inserter { display: inline-block; @@ -37,6 +37,8 @@ $block-inserter-search-height: 38px; .block-editor-inserter__menu { height: 100%; + position: relative; + overflow: visible; } .block-editor-inserter__main-area { @@ -45,8 +47,7 @@ $block-inserter-search-height: 38px; flex-direction: column; height: 100%; @include break-medium { - width: 400px; - position: relative; + width: $block-inserter-width; } } @@ -62,43 +63,98 @@ $block-inserter-search-height: 38px; z-index: z-index(".components-popover.block-editor-inserter__popover"); } -.components-popover input[type="search"].block-editor-inserter__search { - display: block; - margin: $grid-unit-20; - padding: 11px $grid-unit-20; - position: relative; +.block-editor-inserter__search { + padding: $grid-unit-20; z-index: 1; - border-radius: $radius-round-rectangle; flex-shrink: 0; + position: relative; - /* Fonts smaller than 16px causes mobile safari to zoom. */ - font-size: $mobile-text-min-font-size; - @include break-small { - font-size: $default-font-size; - } + input[type="search"].block-editor-inserter__search-input { + display: block; + padding: $grid-unit-20 $grid-unit-60 $grid-unit-20 $grid-unit-20; + border-radius: $radius-block-ui; + background: $light-gray-200; + border: none; + width: 100%; + height: $grid-unit-60; + + /* Fonts smaller than 16px causes mobile safari to zoom. */ + font-size: $mobile-text-min-font-size; + @include break-small { + font-size: $default-font-size; + } - &:focus { - @include input-style__focus(); + &:focus { + background: $white; + box-shadow: 0 0 0 $border-width-focus $theme-color; + } } } -.block-editor-inserter__results { +.block-editor-inserter__search-icon { + position: absolute; + top: $grid-unit-20 + ($grid-unit-60 - $icon-size) / 2; + right: $grid-unit-20 + ($grid-unit-60 - $icon-size) / 2; +} + +.block-editor-inserter__tabs { + display: flex; flex-grow: 1; - overflow: auto; - position: relative; - z-index: 1; // Necessary for the stacked card below parent blocks to show up. - padding: 0 $grid-unit-20 $grid-unit-20 $grid-unit-20; + flex-direction: column; + margin-top: -$grid-unit-10; - &:focus { - outline: $border-width dotted $dark-gray-500; + .components-tab-panel__tabs { + border-bottom: $border-width solid $light-gray-500; + + .components-tab-panel__tabs-item { + flex-grow: 1; + margin-bottom: -$border-width; + } } - // Don't show the top border on the first panel, let the Search border be the border. - [role="presentation"] + .components-panel__body { - border-top: none; + .components-tab-panel__tab-content { + display: flex; + flex-grow: 1; + flex-direction: column; + position: relative; } } +.block-editor-inserter__panel-header { + display: inline-flex; + align-items: center; + padding: $grid-unit-20 $grid-unit-20 0; +} + +.block-editor-inserter__panel-content { + padding: 0 $grid-unit-20; +} + +.block-editor-inserter__panel-title { + color: $theme-color; + text-transform: uppercase; + font-size: 11px; + font-weight: 500; + margin-right: $grid-unit-10; +} + +.block-editor-inserter__block-list { + flex-grow: 1; + position: relative; +} + +// This extra div is needed because +// flex grow and overflow auto doesn't work well together. +.block-editor-inserter__scrollable { + overflow: auto; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + overflow-y: scroll; +} + .block-editor-inserter__popover .block-editor-block-types-list { margin: 0 -8px; } @@ -109,7 +165,8 @@ $block-inserter-search-height: 38px; } .block-editor-inserter__manage-reusable-blocks { - margin: $grid-unit-20 0 0 $grid-unit-20; + display: inline-block; + margin: $grid-unit-20; } .block-editor-inserter__no-results { @@ -135,95 +192,73 @@ $block-inserter-search-height: 38px; } } -.block-editor-inserter__menu-help-panel { +.block-editor-inserter__preview-container { display: none; - border: $border-width solid $light-gray-secondary; width: 300px; - margin-right: 20px; - padding: 20px; background: $white; - box-shadow: $shadow-popover; border-radius: $radius-block-ui; + border: $border-width solid $light-gray-500; + position: absolute; + top: $grid-unit-20; + left: calc(100% + #{$grid-unit-20}); @include break-medium { - position: absolute; - top: -$border-width; - left: calc(100% + #{$grid-unit-15}); display: block; } .block-editor-block-card { - padding-bottom: 20px; - margin-bottom: 20px; - border-bottom: $border-width solid $light-gray-500; - @include edit-post__fade-in-animation(); + padding: $grid-unit-20; } -} -.block-editor-inserter__menu-help-panel-no-block { - display: flex; - height: 100%; - flex-direction: column; - @include edit-post__fade-in-animation(); - - .block-editor-inserter__menu-help-panel-no-block-text { - flex-grow: 1; - - h4 { - font-size: $big-font-size; - } - } - - .components-notice { - margin: 0; - } - - h4 { - margin-top: 0; + .block-editor-block-card__title { + font-size: $default-font-size; } } -.block-editor-inserter__menu-help-panel-hover-area { - flex-grow: 1; - margin-top: 20px; - padding: 20px; - border: 1px dotted $light-gray-500; - display: flex; - align-items: center; - text-align: center; -} - -.block-editor-inserter__menu-help-panel-title { - font-size: $big-font-size; - font-weight: 600; - margin-bottom: 20px; -} - .block-editor-inserter__preview-content { - border: $border-width solid $light-gray-500; - border-radius: $radius-round-rectangle; min-height: $grid-unit-60 * 3; + background: $light-gray-200; display: grid; flex-grow: 1; align-items: center; - - .block-editor-block-preview__container { - padding: 10px; - } } .block-editor-inserter__preview-content-missing { flex: 1; display: flex; justify-content: center; - color: $dark-gray-400; - border: $border-width solid $light-gray-500; - border-radius: $radius-round-rectangle; align-items: center; min-height: $grid-unit-60 * 3; + color: $dark-gray-400; + background: $light-gray-200; } .block-editor-inserter__tips { + border-top: $border-width solid $light-gray-500; padding: $grid-unit-20; flex-shrink: 0; } + +.block-editor-inserter__patterns-item { + border-radius: $radius-block-ui; + cursor: pointer; + margin-top: $grid-unit-20; + transition: all 0.05s ease-in-out; + position: relative; + border: $border-width solid transparent; + + &:hover { + border: $border-width solid $theme-color; + } + + &:focus { + box-shadow: inset 0 0 0 1px $white, 0 0 0 $border-width-focus $theme-color; + + // Windows High Contrast mode will show this outline, but not the box-shadow. + outline: 2px solid transparent; + } + + &.is-placeholder { + min-height: 100px; + } +} diff --git a/packages/block-editor/src/components/inserter/test/block-list.js b/packages/block-editor/src/components/inserter/test/block-list.js index 54e35f17462a51..65b70a70902100 100644 --- a/packages/block-editor/src/components/inserter/test/block-list.js +++ b/packages/block-editor/src/components/inserter/test/block-list.js @@ -65,23 +65,6 @@ const assertNoResultsMessageNotToBePresent = ( element ) => { expect( noResultsMessage ).toBe( null ); }; -const assertOpenedPanels = ( element, expectedOpen = 0 ) => { - expect( - element.querySelectorAll( '.components-panel__body.is-opened ' ) - ).toHaveLength( expectedOpen ); -}; - -const getTabButtonWithContent = ( element, content ) => { - let foundButton; - const buttons = element.querySelectorAll( '.components-button' ); - buttons.forEach( ( button ) => { - if ( button.textContent === content ) { - foundButton = button; - } - } ); - return foundButton; -}; - describe( 'InserterMenu', () => { beforeEach( () => { useSelect.mockImplementation( () => ( { @@ -91,14 +74,6 @@ describe( 'InserterMenu', () => { } ) ); } ); - it( 'should show the suggested tab by default', () => { - const element = initializeMenuDefaultStateAndReturnElement(); - const activeCategory = element.querySelector( - '.components-panel__body.is-opened > .components-panel__body-title' - ); - expect( activeCategory.textContent ).toBe( 'Most used' ); - } ); - it( 'should show nothing if there are no items', () => { const noItems = []; useSelect.mockImplementation( () => ( { @@ -118,7 +93,10 @@ describe( 'InserterMenu', () => { it( 'should show only high utility items in the suggested tab', () => { const element = initializeMenuDefaultStateAndReturnElement(); - const visibleBlocks = element.querySelectorAll( + const firstPanel = element.querySelector( + '.block-editor-inserter__panel-content' + ); + const visibleBlocks = firstPanel.querySelectorAll( '.block-editor-block-types-list__item-title' ); expect( visibleBlocks ).toHaveLength( 3 ); @@ -129,71 +107,70 @@ describe( 'InserterMenu', () => { it( 'should show items from the embed category in the embed tab', () => { const element = initializeAllClosedMenuStateAndReturnElement(); - const embedTab = getTabButtonWithContent( element, 'Embeds' ); - - TestUtils.Simulate.click( embedTab ); - - assertOpenedPanels( element, 1 ); - - const visibleBlocks = element.querySelectorAll( + const embedTabContent = element.querySelectorAll( + '.block-editor-inserter__panel-content' + )[ 4 ]; + const embedTabTitle = element.querySelectorAll( + '.block-editor-inserter__panel-title' + )[ 4 ]; + const blocks = embedTabContent.querySelectorAll( '.block-editor-block-types-list__item-title' ); - expect( visibleBlocks ).toHaveLength( 2 ); - expect( visibleBlocks[ 0 ].textContent ).toBe( 'YouTube' ); - expect( visibleBlocks[ 1 ].textContent ).toBe( 'A Text Embed' ); + expect( embedTabTitle.textContent ).toBe( 'Embeds' ); + expect( blocks ).toHaveLength( 2 ); + expect( blocks[ 0 ].textContent ).toBe( 'YouTube' ); + expect( blocks[ 1 ].textContent ).toBe( 'A Text Embed' ); assertNoResultsMessageNotToBePresent( element ); } ); it( 'should show reusable items in the reusable tab', () => { const element = initializeAllClosedMenuStateAndReturnElement(); - const reusableTab = getTabButtonWithContent( element, 'Reusable' ); - - TestUtils.Simulate.click( reusableTab ); - - assertOpenedPanels( element, 1 ); - - const visibleBlocks = element.querySelectorAll( + const reusableTabContent = element.querySelectorAll( + '.block-editor-inserter__panel-content' + )[ 6 ]; + const reusableTabTitle = element.querySelectorAll( + '.block-editor-inserter__panel-title' + )[ 6 ]; + const blocks = reusableTabContent.querySelectorAll( '.block-editor-block-types-list__item-title' ); - expect( visibleBlocks ).toHaveLength( 1 ); - expect( visibleBlocks[ 0 ].textContent ).toBe( 'My reusable block' ); + expect( reusableTabTitle.textContent ).toBe( 'Reusable' ); + expect( blocks ).toHaveLength( 1 ); + expect( blocks[ 0 ].textContent ).toBe( 'My reusable block' ); assertNoResultsMessageNotToBePresent( element ); } ); it( 'should show the common category blocks', () => { const element = initializeAllClosedMenuStateAndReturnElement(); - const commonBlocksTab = getTabButtonWithContent( - element, - 'Common blocks' - ); - - TestUtils.Simulate.click( commonBlocksTab ); - - assertOpenedPanels( element, 1 ); - - const visibleBlocks = element.querySelectorAll( + const commonTabContent = element.querySelectorAll( + '.block-editor-inserter__panel-content' + )[ 1 ]; + const commonTabTitle = element.querySelectorAll( + '.block-editor-inserter__panel-title' + )[ 1 ]; + const blocks = commonTabContent.querySelectorAll( '.block-editor-block-types-list__item-title' ); - expect( visibleBlocks ).toHaveLength( 3 ); - expect( visibleBlocks[ 0 ].textContent ).toBe( 'Text' ); - expect( visibleBlocks[ 1 ].textContent ).toBe( 'Advanced Text' ); - expect( visibleBlocks[ 2 ].textContent ).toBe( 'Some Other Block' ); + expect( commonTabTitle.textContent ).toBe( 'Common blocks' ); + expect( blocks ).toHaveLength( 3 ); + expect( blocks[ 0 ].textContent ).toBe( 'Text' ); + expect( blocks[ 1 ].textContent ).toBe( 'Advanced Text' ); + expect( blocks[ 2 ].textContent ).toBe( 'Some Other Block' ); assertNoResultsMessageNotToBePresent( element ); } ); it( 'should disable items with `isDisabled`', () => { - const element = initializeMenuDefaultStateAndReturnElement(); - const layoutTab = getTabButtonWithContent( element, 'Layout elements' ); - - TestUtils.Simulate.click( layoutTab ); - - const disabledBlocks = element.querySelectorAll( + const element = initializeAllClosedMenuStateAndReturnElement(); + const layoutTabContent = element.querySelectorAll( + '.block-editor-inserter__panel-content' + )[ 2 ]; + const disabledBlocks = layoutTabContent.querySelectorAll( '.block-editor-block-types-list__item[disabled], .block-editor-block-types-list__item[aria-disabled="true"]' ); @@ -206,24 +183,22 @@ describe( 'InserterMenu', () => { filterValue: 'text', } ); - assertOpenedPanels( element, 3 ); - const matchingCategories = element.querySelectorAll( - '.components-panel__body-toggle' + '.block-editor-inserter__panel-title' ); expect( matchingCategories ).toHaveLength( 3 ); expect( matchingCategories[ 0 ].textContent ).toBe( 'Common blocks' ); expect( matchingCategories[ 1 ].textContent ).toBe( 'Embeds' ); - const visibleBlocks = element.querySelectorAll( + const blocks = element.querySelectorAll( '.block-editor-block-types-list__item-title' ); - expect( visibleBlocks ).toHaveLength( 5 ); - expect( visibleBlocks[ 0 ].textContent ).toBe( 'Text' ); - expect( visibleBlocks[ 1 ].textContent ).toBe( 'Advanced Text' ); - expect( visibleBlocks[ 2 ].textContent ).toBe( 'A Text Embed' ); + expect( blocks ).toHaveLength( 5 ); + expect( blocks[ 0 ].textContent ).toBe( 'Text' ); + expect( blocks[ 1 ].textContent ).toBe( 'Advanced Text' ); + expect( blocks[ 2 ].textContent ).toBe( 'A Text Embed' ); assertNoResultsMessageNotToBePresent( element ); } ); @@ -233,24 +208,22 @@ describe( 'InserterMenu', () => { filterValue: ' text', } ); - assertOpenedPanels( element, 3 ); - const matchingCategories = element.querySelectorAll( - '.components-panel__body-toggle' + '.block-editor-inserter__panel-title' ); expect( matchingCategories ).toHaveLength( 3 ); expect( matchingCategories[ 0 ].textContent ).toBe( 'Common blocks' ); expect( matchingCategories[ 1 ].textContent ).toBe( 'Embeds' ); - const visibleBlocks = element.querySelectorAll( + const blocks = element.querySelectorAll( '.block-editor-block-types-list__item-title' ); - expect( visibleBlocks ).toHaveLength( 5 ); - expect( visibleBlocks[ 0 ].textContent ).toBe( 'Text' ); - expect( visibleBlocks[ 1 ].textContent ).toBe( 'Advanced Text' ); - expect( visibleBlocks[ 2 ].textContent ).toBe( 'A Text Embed' ); + expect( blocks ).toHaveLength( 5 ); + expect( blocks[ 0 ].textContent ).toBe( 'Text' ); + expect( blocks[ 1 ].textContent ).toBe( 'Advanced Text' ); + expect( blocks[ 2 ].textContent ).toBe( 'A Text Embed' ); assertNoResultsMessageNotToBePresent( element ); } ); diff --git a/packages/block-editor/src/components/block-patterns/use-async-list.js b/packages/block-editor/src/components/inserter/use-async-list.js similarity index 100% rename from packages/block-editor/src/components/block-patterns/use-async-list.js rename to packages/block-editor/src/components/inserter/use-async-list.js diff --git a/packages/block-editor/src/components/line-height-control/index.js b/packages/block-editor/src/components/line-height-control/index.js index cb0f8ebed1f876..545b73e3e596b4 100644 --- a/packages/block-editor/src/components/line-height-control/index.js +++ b/packages/block-editor/src/components/line-height-control/index.js @@ -8,17 +8,19 @@ import { ZERO } from '@wordpress/keycodes'; /** * Internal dependencies */ +import useEditorFeature from '../use-editor-feature'; import { BASE_DEFAULT_VALUE, RESET_VALUE, STEP, - useIsLineHeightControlsDisabled, isLineHeightDefined, } from './utils'; export default function LineHeightControl( { value: lineHeight, onChange } ) { // Don't render the controls if disabled by editor settings - const isDisabled = useIsLineHeightControlsDisabled(); + const isDisabled = useEditorFeature( + '__experimentalDisableCustomLineHeight' + ); if ( isDisabled ) { return null; } diff --git a/packages/block-editor/src/components/line-height-control/utils.js b/packages/block-editor/src/components/line-height-control/utils.js index 351a35a66a6a0a..a232394540d2f6 100644 --- a/packages/block-editor/src/components/line-height-control/utils.js +++ b/packages/block-editor/src/components/line-height-control/utils.js @@ -1,8 +1,3 @@ -/** - * WordPress dependencies - */ -import { useSelect } from '@wordpress/data'; - export const BASE_DEFAULT_VALUE = 1.5; export const STEP = 0.1; /** @@ -17,21 +12,6 @@ export const STEP = 0.1; */ export const RESET_VALUE = ''; -/** - * Retrieves whether custom lineHeight controls should be disabled from editor settings. - * - * @return {boolean} Whether lineHeight controls should be disabled. - */ -export function useIsLineHeightControlsDisabled() { - const isDisabled = useSelect( ( select ) => { - const { getSettings } = select( 'core/block-editor' ); - - return !! getSettings().__experimentalDisableCustomLineHeight; - }, [] ); - - return isDisabled; -} - /** * Determines if the lineHeight attribute has been properly defined. * diff --git a/packages/block-editor/src/components/media-upload-progress/index.native.js b/packages/block-editor/src/components/media-upload-progress/index.native.js index 0692077c8595e3..a417ad107339e7 100644 --- a/packages/block-editor/src/components/media-upload-progress/index.native.js +++ b/packages/block-editor/src/components/media-upload-progress/index.native.js @@ -117,7 +117,12 @@ export class MediaUploadProgress extends React.Component { } render() { - const { coverUrl, width, height } = this.props; + const { + coverUrl, + width, + height, + renderContent = () => {}, + } = this.props; const { isUploadInProgress, isUploadFailed } = this.state; const showSpinner = this.state.isUploadInProgress; const progress = this.state.progress * 100; @@ -156,7 +161,7 @@ export class MediaUploadProgress extends React.Component { ) { finalWidth = width; } - return this.props.renderContent( { + return renderContent( { isUploadInProgress, isUploadFailed, finalWidth, @@ -168,7 +173,7 @@ export class MediaUploadProgress extends React.Component { ) } { ! coverUrl && - this.props.renderContent( { + renderContent( { isUploadInProgress, isUploadFailed, retryMessage, diff --git a/packages/block-editor/src/components/media-upload-progress/styles.native.scss b/packages/block-editor/src/components/media-upload-progress/styles.native.scss index 22355ccc1ad02b..2178be1968b1c5 100644 --- a/packages/block-editor/src/components/media-upload-progress/styles.native.scss +++ b/packages/block-editor/src/components/media-upload-progress/styles.native.scss @@ -1,5 +1,6 @@ .mediaUploadProgress { flex: 1; + z-index: 1; } .progressBar { diff --git a/packages/block-editor/src/components/preview-options/index.js b/packages/block-editor/src/components/preview-options/index.js new file mode 100644 index 00000000000000..8a3563fbc11a9b --- /dev/null +++ b/packages/block-editor/src/components/preview-options/index.js @@ -0,0 +1,70 @@ +/** + * External dependencies + */ +import classnames from 'classnames'; + +/** + * WordPress dependencies + */ +import { Button, Dropdown, MenuGroup, MenuItem } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; +import { Icon, check, chevronDown } from '@wordpress/icons'; + +export default function PreviewOptions( { + children, + className, + isEnabled = true, + deviceType, + setDeviceType, +} ) { + return ( + ( + + ) } + renderContent={ () => ( + <> + + setDeviceType( 'Desktop' ) } + icon={ deviceType === 'Desktop' && check } + > + { __( 'Desktop' ) } + + setDeviceType( 'Tablet' ) } + icon={ deviceType === 'Tablet' && check } + > + { __( 'Tablet' ) } + + setDeviceType( 'Mobile' ) } + icon={ deviceType === 'Mobile' && check } + > + { __( 'Mobile' ) } + + + { children } + + ) } + /> + ); +} diff --git a/packages/edit-post/src/components/preview-options/style.scss b/packages/block-editor/src/components/preview-options/style.scss similarity index 60% rename from packages/edit-post/src/components/preview-options/style.scss rename to packages/block-editor/src/components/preview-options/style.scss index de88a83faa7b2b..48b44bfa091517 100644 --- a/packages/edit-post/src/components/preview-options/style.scss +++ b/packages/block-editor/src/components/preview-options/style.scss @@ -1,10 +1,10 @@ -.editor-post-preview__dropdown { +.block-editor-post-preview__dropdown { display: none; margin-right: $grid-unit-15; padding: 0; } -.editor-post-preview__button-toggle { +.block-editor-post-preview__button-toggle { display: flex; justify-content: space-between; padding: 0 $grid-unit-10 0 $grid-unit-15; @@ -18,7 +18,7 @@ } } -.editor-post-preview__button-resize.editor-post-preview__button-resize { +.block-editor-post-preview__button-resize.block-editor-post-preview__button-resize { padding-left: $button-size-small + $grid-unit-10 + $grid-unit-10; &.has-icon { @@ -26,10 +26,9 @@ } } -.editor-post-preview__dropdown-content { +.block-editor-post-preview__dropdown-content { .components-popover__content { overflow-y: visible; - padding-bottom: 0; } .components-menu-group + .components-menu-group { @@ -40,29 +39,12 @@ } } -.editor-post-preview__grouping-external { - display: flex; - position: relative; -} - -.editor-post-preview__button-external { - padding-left: $grid-unit-10; - margin-right: auto; - width: 100%; - display: flex; - justify-content: flex-start; - - svg { - margin-right: $grid-unit-10; - } -} - @include break-small() { .editor-post-preview { display: none; } - .editor-post-preview__dropdown { + .block-editor-post-preview__dropdown { display: flex; } } diff --git a/packages/edit-post/src/components/resize-canvas/index.js b/packages/block-editor/src/components/resize-canvas/index.js similarity index 82% rename from packages/edit-post/src/components/resize-canvas/index.js rename to packages/block-editor/src/components/resize-canvas/index.js index f09214edc8f102..2f9723d08a355c 100644 --- a/packages/edit-post/src/components/resize-canvas/index.js +++ b/packages/block-editor/src/components/resize-canvas/index.js @@ -1,20 +1,21 @@ /** * WordPress dependencies */ -import { useSimulatedMediaQuery } from '@wordpress/block-editor'; -import { useSelect } from '@wordpress/data'; import { useEffect, useState } from '@wordpress/element'; +/** + * Internal dependencies + */ +import { default as useSimulatedMediaQuery } from '../../components/use-simulated-media-query'; + /** * Function to resize the editor window. * + * @param {string} deviceType Used for determining the size of the container (e.g. Desktop, Tablet, Mobile) + * * @return {Object} Inline styles to be added to resizable container. */ -export function useResizeCanvas() { - const deviceType = useSelect( ( select ) => { - return select( 'core/edit-post' ).__experimentalGetPreviewDeviceType(); - }, [] ); - +export default function useResizeCanvas( deviceType ) { const [ actualWidth, updateActualWidth ] = useState( window.innerWidth ); useEffect( () => { diff --git a/packages/block-editor/src/components/unit-control/index.js b/packages/block-editor/src/components/unit-control/index.js index e5a1fb3e902473..eb1bf24eb44fee 100644 --- a/packages/block-editor/src/components/unit-control/index.js +++ b/packages/block-editor/src/components/unit-control/index.js @@ -2,12 +2,16 @@ * WordPress dependencies */ import { __experimentalUnitControl as BaseUnitControl } from '@wordpress/components'; -import { useSelect } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import useEditorFeature from '../use-editor-feature'; const { __defaultUnits } = BaseUnitControl; export default function UnitControl( { units: unitsProp, ...props } ) { - const settings = useCustomUnitsSettings(); + const settings = useEditorFeature( '__experimentalDisableCustomUnits' ); const isDisabled = !! settings; // Adjust units based on add_theme_support( 'experimental-custom-units' ); @@ -34,18 +38,6 @@ export default function UnitControl( { units: unitsProp, ...props } ) { // Hoisting statics from the BaseUnitControl UnitControl.__defaultUnits = __defaultUnits; -/** - * Hook that retrieves the 'experimental-custom-units' setting from add_theme_support() - */ -function useCustomUnitsSettings() { - const settings = useSelect( ( select ) => { - const { getSettings } = select( 'core/block-editor' ); - return getSettings().__experimentalDisableCustomUnits; - }, [] ); - - return settings; -} - /** * Filters available units based on values defined by settings. * diff --git a/packages/block-editor/src/components/url-popover/link-viewer-url.js b/packages/block-editor/src/components/url-popover/link-viewer-url.js new file mode 100644 index 00000000000000..5cf710f2030097 --- /dev/null +++ b/packages/block-editor/src/components/url-popover/link-viewer-url.js @@ -0,0 +1,27 @@ +/** + * External dependencies + */ +import classnames from 'classnames'; + +/** + * WordPress dependencies + */ +import { ExternalLink } from '@wordpress/components'; +import { safeDecodeURI, filterURLForDisplay } from '@wordpress/url'; + +export default function LinkViewerURL( { url, urlLabel, className } ) { + const linkClassName = classnames( + className, + 'block-editor-url-popover__link-viewer-url' + ); + + if ( ! url ) { + return ; + } + + return ( + + { urlLabel || filterURLForDisplay( safeDecodeURI( url ) ) } + + ); +} diff --git a/packages/block-editor/src/components/url-popover/link-viewer.js b/packages/block-editor/src/components/url-popover/link-viewer.js index f5cbd7459355f8..09e1487bc4dcaf 100644 --- a/packages/block-editor/src/components/url-popover/link-viewer.js +++ b/packages/block-editor/src/components/url-popover/link-viewer.js @@ -7,26 +7,13 @@ import classnames from 'classnames'; * WordPress dependencies */ import { __ } from '@wordpress/i18n'; -import { ExternalLink, Button } from '@wordpress/components'; -import { safeDecodeURI, filterURLForDisplay } from '@wordpress/url'; +import { Button } from '@wordpress/components'; import { pencil } from '@wordpress/icons'; -function LinkViewerUrl( { url, urlLabel, className } ) { - const linkClassName = classnames( - className, - 'block-editor-url-popover__link-viewer-url' - ); - - if ( ! url ) { - return ; - } - - return ( - - { urlLabel || filterURLForDisplay( safeDecodeURI( url ) ) } - - ); -} +/** + * Internal dependencies + */ +import LinkViewerURL from './link-viewer-url'; export default function LinkViewer( { className, @@ -44,7 +31,7 @@ export default function LinkViewer( { ) } { ...props } > - { + const { getSettings } = select( 'core/block-editor' ); + + return getSettings()[ featureName ]; + }, + [ featureName ] + ); + + return setting; +} diff --git a/packages/block-editor/src/hooks/index.native.js b/packages/block-editor/src/hooks/index.native.js index 43c5327b4fa5c3..f0d8c10b92b63b 100644 --- a/packages/block-editor/src/hooks/index.native.js +++ b/packages/block-editor/src/hooks/index.native.js @@ -1,6 +1,8 @@ /** * Internal dependencies */ +export { AlignmentHookSettingsProvider } from './align'; + import './custom-class-name'; import './generated-class-name'; import './style'; diff --git a/packages/block-editor/src/style.scss b/packages/block-editor/src/style.scss index 1ae8c940910fa0..a04b2cc8cd26be 100644 --- a/packages/block-editor/src/style.scss +++ b/packages/block-editor/src/style.scss @@ -5,6 +5,7 @@ // Only add styles for components that are used inside the editing canvas here: +@import "./autocompleters/style.scss"; @import "./components/block-icon/style.scss"; @import "./components/block-inspector/style.scss"; @import "./components/block-list/style.scss"; @@ -15,7 +16,6 @@ @import "./components/block-mobile-toolbar/style.scss"; @import "./components/block-mover/style.scss"; @import "./components/block-navigation/style.scss"; -@import "./components/block-patterns/style.scss"; @import "./components/block-preview/style.scss"; @import "./components/block-settings-menu/style.scss"; @import "./components/block-styles/style.scss"; @@ -55,4 +55,4 @@ @import "./components/block-toolbar/style.scss"; @import "./components/inserter/style.scss"; - +@import "./components/preview-options/style.scss"; diff --git a/packages/block-library/src/archives/block.json b/packages/block-library/src/archives/block.json new file mode 100644 index 00000000000000..32b5902b185cfd --- /dev/null +++ b/packages/block-library/src/archives/block.json @@ -0,0 +1,21 @@ +{ + "name": "core/archives", + "category": "widgets", + "attributes": { + "align": { + "type": "string", + "enum": [ "left", "center", "right", "wide", "full" ] + }, + "className": { + "type": "string" + }, + "displayAsDropdown": { + "type": "boolean", + "default": false + }, + "showPostCounts": { + "type": "boolean", + "default": false + } + } +} diff --git a/packages/block-library/src/archives/index.js b/packages/block-library/src/archives/index.js index ef8f1c484d15dc..5873b50d7568ea 100644 --- a/packages/block-library/src/archives/index.js +++ b/packages/block-library/src/archives/index.js @@ -1,24 +1,27 @@ /** * WordPress dependencies */ -import { __ } from '@wordpress/i18n'; import { archive as icon } from '@wordpress/icons'; +import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ +import metadata from './block.json'; import edit from './edit'; -export const name = 'core/archives'; +const { name } = metadata; + +export { metadata, name }; export const settings = { title: __( 'Archives' ), description: __( 'Display a monthly archive of your posts.' ), icon, - category: 'widgets', supports: { align: true, html: false, }, + example: {}, edit, }; diff --git a/packages/block-library/src/archives/index.php b/packages/block-library/src/archives/index.php index 172b1c7c8407ed..3499c8599c899d 100644 --- a/packages/block-library/src/archives/index.php +++ b/packages/block-library/src/archives/index.php @@ -116,26 +116,9 @@ function render_block_core_archives( $attributes ) { * Register archives block. */ function register_block_core_archives() { - register_block_type( - 'core/archives', + register_block_type_from_metadata( + __DIR__ . '/archives', array( - 'attributes' => array( - 'align' => array( - 'type' => 'string', - 'enum' => array( 'left', 'center', 'right', 'wide', 'full' ), - ), - 'className' => array( - 'type' => 'string', - ), - 'displayAsDropdown' => array( - 'type' => 'boolean', - 'default' => false, - ), - 'showPostCounts' => array( - 'type' => 'boolean', - 'default' => false, - ), - ), 'render_callback' => 'render_block_core_archives', ) ); diff --git a/packages/block-library/src/audio/edit.js b/packages/block-library/src/audio/edit.js index 5736a7d027570f..0732d4812c985e 100644 --- a/packages/block-library/src/audio/edit.js +++ b/packages/block-library/src/audio/edit.js @@ -170,15 +170,15 @@ class AudioEdit extends Component { /> setAttributes( { - preload: - 'none' !== value ? value : undefined, + preload: value || undefined, } ) } options={ [ + { value: '', label: __( 'Browser default' ) }, { value: 'auto', label: __( 'Auto' ) }, { value: 'metadata', label: __( 'Metadata' ) }, { value: 'none', label: __( 'None' ) }, diff --git a/packages/block-library/src/block/block.json b/packages/block-library/src/block/block.json new file mode 100644 index 00000000000000..7908e63241b598 --- /dev/null +++ b/packages/block-library/src/block/block.json @@ -0,0 +1,9 @@ +{ + "name": "core/block", + "category": "reusable", + "attributes": { + "ref": { + "type": "number" + } + } +} diff --git a/packages/block-library/src/block/index.js b/packages/block-library/src/block/index.js index 585333c696a6f5..4ddb8fb27b9c11 100644 --- a/packages/block-library/src/block/index.js +++ b/packages/block-library/src/block/index.js @@ -6,15 +6,17 @@ import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ +import metadata from './block.json'; import edit from './edit'; -export const name = 'core/block'; +const { name } = metadata; + +export { metadata, name }; export const settings = { title: __( 'Reusable Block' ), - category: 'reusable', description: __( - 'Create content, and save it for you and other contributors to reuse across your site. Update the block, and the changes apply everywhere it’s used.' + 'Create and save content to reuse across your site. Update the block, and the changes apply everywhere it’s used.' ), supports: { customClassName: false, diff --git a/packages/block-library/src/block/index.php b/packages/block-library/src/block/index.php index 24d2ab570a9ecc..5fed48bd9a7c74 100644 --- a/packages/block-library/src/block/index.php +++ b/packages/block-library/src/block/index.php @@ -33,14 +33,9 @@ function render_block_core_block( $attributes ) { * Registers the `core/block` block. */ function register_block_core_block() { - register_block_type( - 'core/block', + register_block_type_from_metadata( + __DIR__ . '/block', array( - 'attributes' => array( - 'ref' => array( - 'type' => 'number', - ), - ), 'render_callback' => 'render_block_core_block', ) ); diff --git a/packages/block-library/src/button/block.json b/packages/block-library/src/button/block.json index 6bd96a3edd4da3..ff6b3d3390fc80 100644 --- a/packages/block-library/src/button/block.json +++ b/packages/block-library/src/button/block.json @@ -36,6 +36,18 @@ }, "borderRadius": { "type": "number" + }, + "style": { + "type": "object" + }, + "backgroundColor": { + "type": "string" + }, + "textColor": { + "type": "string" + }, + "gradient": { + "type": "string" } } } diff --git a/packages/block-library/src/button/color-edit.js b/packages/block-library/src/button/color-edit.js new file mode 100644 index 00000000000000..72d8b356acdc0e --- /dev/null +++ b/packages/block-library/src/button/color-edit.js @@ -0,0 +1,222 @@ +/** + * External dependencies + */ +import { pickBy, isEqual, isObject, identity, mapValues } from 'lodash'; + +/** + * WordPress dependencies + */ +import { __ } from '@wordpress/i18n'; +import { useState, useEffect, useRef } from '@wordpress/element'; +import { useSelect } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import { + getColorObjectByColorValue, + getColorObjectByAttributeValues, + getGradientValueBySlug, + getGradientSlugByValue, + __experimentalPanelColorGradientSettings as PanelColorGradientSettings, + ContrastChecker, + InspectorControls, +} from '@wordpress/block-editor'; + +// The code in this file is copied entirely from the "color" and "style" support flags +// The flag can't be used at the moment because of the extra wrapper around +// the button block markup. + +function getBlockDOMNode( clientId ) { + return document.getElementById( 'block-' + clientId ); +} + +/** + * Removed undefined values from nested object. + * + * @param {*} object + * @return {*} Object cleaned from undefined values + */ +const cleanEmptyObject = ( object ) => { + if ( ! isObject( object ) ) { + return object; + } + const cleanedNestedObjects = pickBy( + mapValues( object, cleanEmptyObject ), + identity + ); + return isEqual( cleanedNestedObjects, {} ) + ? undefined + : cleanedNestedObjects; +}; + +function ColorPanel( { settings, clientId, enableContrastChecking = true } ) { + const { getComputedStyle, Node } = window; + + const [ detectedBackgroundColor, setDetectedBackgroundColor ] = useState(); + const [ detectedColor, setDetectedColor ] = useState(); + + useEffect( () => { + if ( ! enableContrastChecking ) { + return; + } + + const colorsDetectionElement = getBlockDOMNode( clientId ); + if ( ! colorsDetectionElement ) { + return; + } + setDetectedColor( getComputedStyle( colorsDetectionElement ).color ); + + let backgroundColorNode = colorsDetectionElement; + let backgroundColor = getComputedStyle( backgroundColorNode ) + .backgroundColor; + while ( + backgroundColor === 'rgba(0, 0, 0, 0)' && + backgroundColorNode.parentNode && + backgroundColorNode.parentNode.nodeType === Node.ELEMENT_NODE + ) { + backgroundColorNode = backgroundColorNode.parentNode; + backgroundColor = getComputedStyle( backgroundColorNode ) + .backgroundColor; + } + + setDetectedBackgroundColor( backgroundColor ); + } ); + + return ( + + + { enableContrastChecking && ( + + ) } + + + ); +} + +/** + * Inspector control panel containing the color related configuration + * + * @param {Object} props + * + * @return {WPElement} Color edit element. + */ +function ColorEdit( props ) { + const { attributes } = props; + const { colors, gradients } = useSelect( ( select ) => { + return select( 'core/block-editor' ).getSettings(); + }, [] ); + // Shouldn't be needed but right now the ColorGradientsPanel + // can trigger both onChangeColor and onChangeBackground + // synchronously causing our two callbacks to override changes + // from each other. + const localAttributes = useRef( attributes ); + useEffect( () => { + localAttributes.current = attributes; + }, [ attributes ] ); + + const { style, textColor, backgroundColor, gradient } = attributes; + let gradientValue; + if ( gradient ) { + gradientValue = getGradientValueBySlug( gradients, gradient ); + } else { + gradientValue = style?.color?.gradient; + } + + const onChangeColor = ( name ) => ( value ) => { + const colorObject = getColorObjectByColorValue( colors, value ); + const attributeName = name + 'Color'; + const newStyle = { + ...localAttributes.current.style, + color: { + ...localAttributes.current?.style?.color, + [ name ]: colorObject?.slug ? undefined : value, + }, + }; + + const newNamedColor = colorObject?.slug ? colorObject.slug : undefined; + const newAttributes = { + style: cleanEmptyObject( newStyle ), + [ attributeName ]: newNamedColor, + }; + + props.setAttributes( newAttributes ); + localAttributes.current = { + ...localAttributes.current, + ...newAttributes, + }; + }; + + const onChangeGradient = ( value ) => { + const slug = getGradientSlugByValue( gradients, value ); + let newAttributes; + if ( slug ) { + const newStyle = { + ...localAttributes.current?.style, + color: { + ...localAttributes.current?.style?.color, + gradient: undefined, + }, + }; + newAttributes = { + style: cleanEmptyObject( newStyle ), + gradient: slug, + }; + } else { + const newStyle = { + ...localAttributes.current?.style, + color: { + ...localAttributes.current?.style?.color, + gradient: value, + }, + }; + newAttributes = { + style: cleanEmptyObject( newStyle ), + gradient: undefined, + }; + } + props.setAttributes( newAttributes ); + localAttributes.current = { + ...localAttributes.current, + ...newAttributes, + }; + }; + + return ( + + ); +} + +export default ColorEdit; diff --git a/packages/block-library/src/button/color-props.js b/packages/block-library/src/button/color-props.js new file mode 100644 index 00000000000000..cc96f9f78d3899 --- /dev/null +++ b/packages/block-library/src/button/color-props.js @@ -0,0 +1,55 @@ +/** + * External dependencies + */ +import classnames from 'classnames'; + +/** + * WordPress dependencies + */ +import { + getColorClassName, + __experimentalGetGradientClass, +} from '@wordpress/block-editor'; + +// The code in this file is copied entirely from the "color" and "style" support flags +// The flag can't be used at the moment because of the extra wrapper around +// the button block markup. + +export default function getColorAndStyleProps( attributes ) { + // I'd have prefered to avoid the "style" attribute usage here + const { backgroundColor, textColor, gradient, style } = attributes; + + const backgroundClass = getColorClassName( + 'background-color', + backgroundColor + ); + const gradientClass = __experimentalGetGradientClass( gradient ); + const textClass = getColorClassName( 'color', textColor ); + const className = classnames( textClass, gradientClass, { + // Don't apply the background class if there's a custom gradient + [ backgroundClass ]: ! style?.color?.gradient && !! backgroundClass, + 'has-text-color': textColor || style?.color?.text, + 'has-background': + backgroundColor || + style?.color?.background || + gradient || + style?.color?.gradient, + } ); + const styleProp = + style?.color?.background || style?.color?.text || style?.color?.gradient + ? { + background: style?.color?.gradient + ? style.color.gradient + : undefined, + backgroundColor: style?.color?.background + ? style.color.background + : undefined, + color: style?.color?.text ? style.color.text : undefined, + } + : {}; + + return { + className: !! className ? className : undefined, + style: styleProp, + }; +} diff --git a/packages/block-library/src/button/deprecated.js b/packages/block-library/src/button/deprecated.js index e0915201a0b2a3..5316e590bd50fb 100644 --- a/packages/block-library/src/button/deprecated.js +++ b/packages/block-library/src/button/deprecated.js @@ -81,6 +81,75 @@ const blockAttributes = { }; const deprecated = [ + { + supports: { + align: true, + alignWide: false, + __experimentalColor: { gradients: true }, + }, + attributes: { + ...blockAttributes, + linkTarget: { + type: 'string', + source: 'attribute', + selector: 'a', + attribute: 'target', + }, + rel: { + type: 'string', + source: 'attribute', + selector: 'a', + attribute: 'rel', + }, + placeholder: { + type: 'string', + }, + borderRadius: { + type: 'number', + }, + backgroundColor: { + type: 'string', + }, + textColor: { + type: 'string', + }, + gradient: { + type: 'string', + }, + style: { + type: 'object', + }, + }, + save( { attributes } ) { + const { + borderRadius, + linkTarget, + rel, + text, + title, + url, + } = attributes; + const buttonClasses = classnames( 'wp-block-button__link', { + 'no-border-radius': borderRadius === 0, + } ); + const buttonStyle = { + borderRadius: borderRadius ? borderRadius + 'px' : undefined, + }; + + return ( + + ); + }, + }, { supports: { align: true, @@ -125,6 +194,11 @@ const deprecated = [ type: 'string', }, }, + + isEligible: ( attributes ) => + !! attributes.customTextColor || + !! attributes.customBackgroundColor || + !! attributes.customGradient, migrate: migrateCustomColorsAndGradients, save( { attributes } ) { const { diff --git a/packages/block-library/src/button/edit.js b/packages/block-library/src/button/edit.js index 38b5b43f96d684..2078e437b06879 100644 --- a/packages/block-library/src/button/edit.js +++ b/packages/block-library/src/button/edit.js @@ -28,6 +28,12 @@ import { import { rawShortcut, displayShortcut } from '@wordpress/keycodes'; import { link } from '@wordpress/icons'; +/** + * Internal dependencies + */ +import ColorEdit from './color-edit'; +import getColorAndStyleProps from './color-props'; + const NEW_TAB_REL = 'noreferrer noopener'; const MIN_BORDER_RADIUS_VALUE = 0; const MAX_BORDER_RADIUS_VALUE = 50; @@ -113,7 +119,8 @@ function URLPicker( { ); } -function ButtonEdit( { attributes, setAttributes, className, isSelected } ) { +function ButtonEdit( props ) { + const { attributes, setAttributes, className, isSelected } = props; const { borderRadius, linkTarget, @@ -148,23 +155,33 @@ function ButtonEdit( { attributes, setAttributes, className, isSelected } ) { [ rel, setAttributes ] ); + const colorProps = getColorAndStyleProps( attributes ); + return ( <> - setAttributes( { text: value } ) } - withoutInteractiveFormatting - className={ classnames( className, 'wp-block-button__link', { - 'no-border-radius': borderRadius === 0, - } ) } - style={ { - borderRadius: borderRadius - ? borderRadius + 'px' - : undefined, - } } - /> + + + setAttributes( { text: value } ) } + withoutInteractiveFormatting + className={ classnames( + className, + 'wp-block-button__link', + colorProps.className, + { + 'no-border-radius': borderRadius === 0, + } + ) } + style={ { + borderRadius: borderRadius + ? borderRadius + 'px' + : undefined, + ...colorProps.style, + } } + /> + { + const textWidth = + nativeEvent.lines[ 0 ] && nativeEvent.lines[ 0 ].width; + if ( textWidth && textWidth !== placeholderTextWidth ) { + this.setState( { + placeholderTextWidth: Math.min( + textWidth, + maxWidth + ), + } ); + } + } } + > + { placeholderText } + + ); + } + render() { const { attributes, - textColor, isSelected, clientId, onReplace, + mergeBlocks, + parentWidth, } = this.props; const { placeholder, @@ -308,7 +392,16 @@ class ButtonEdit extends Component { linkTarget, rel, } = attributes; - const { maxWidth, isLinkSheetVisible, isButtonFocused } = this.state; + const { + maxWidth, + isLinkSheetVisible, + isButtonFocused, + placeholderTextWidth, + } = this.state; + + if ( parentWidth === 0 ) { + return null; + } const borderRadiusValue = borderRadius !== undefined @@ -327,7 +420,7 @@ class ButtonEdit extends Component { const minWidth = isButtonFocused || ( ! isButtonFocused && text && text !== '' ) ? 1 - : styles.button.minWidth; + : placeholderTextWidth; // To achieve proper expanding and shrinking `RichText` on Android, there is a need to set // a `placeholder` as an empty string when `RichText` is focused, // because `AztecView` is calculating a `minWidth` based on placeholder text. @@ -339,7 +432,8 @@ class ButtonEdit extends Component { const backgroundColor = this.getBackgroundColor(); return ( - + + { this.getPlaceholderWidth( placeholderText ) } { + this.onToggleButtonFocus( false ); + this.onSetMaxWidth(); + } } + selectionColor={ this.getTextColor() } onReplace={ onReplace } - onRemove={ () => onReplace( [] ) } + onRemove={ this.onRemove } + onMerge={ mergeBlocks } /> @@ -446,19 +544,22 @@ class ButtonEdit extends Component { export default compose( [ withInstanceId, withColors( 'backgroundColor', { textColor: 'color' } ), - withSelect( ( select ) => { + withSelect( ( select, { clientId } ) => { const { isEditorSidebarOpened } = select( 'core/edit-post' ); - const { getSelectedBlockClientId, getBlockParents } = select( - 'core/block-editor' - ); + const { + getSelectedBlockClientId, + getBlockCount, + getBlockRootClientId, + } = select( 'core/block-editor' ); + const parentId = getBlockRootClientId( clientId ); const selectedId = getSelectedBlockClientId(); - const hasParents = getBlockParents( selectedId ).length > 0; + const numOfButtons = getBlockCount( parentId ); return { selectedId, editorSidebarOpened: isEditorSidebarOpened(), - hasParents, + numOfButtons, }; } ), withDispatch( ( dispatch ) => { diff --git a/packages/block-library/src/button/editor.native.scss b/packages/block-library/src/button/editor.native.scss index ef2e1a54b69519..47194070090401 100644 --- a/packages/block-library/src/button/editor.native.scss +++ b/packages/block-library/src/button/editor.native.scss @@ -4,6 +4,12 @@ } .outline { + // Border Width has to be spread since width is thicker + // on Android when border radius is decreased to 0 + border-left-width: $border-width; + border-right-width: $border-width; + border-top-width: $border-width; + border-bottom-width: $border-width; position: absolute; left: -($block-spacing + $border-width); right: -($block-spacing + $border-width); @@ -25,11 +31,12 @@ padding: $block-spacing; max-width: 580px; min-width: 108px; - margin: $panel-padding; + margin: 2 * $panel-padding; } .fallbackButton { background-color: $button-fallback-bg; + color: $white; } .clearLinkButton { @@ -39,3 +46,10 @@ .placeholderTextColor { color: rgba($color: $white, $alpha: 0.43); } + +.placeholder { + font-family: $default-regular-font; + min-height: 22px; + font-size: 16px; + display: none; +} diff --git a/packages/block-library/src/button/editor.scss b/packages/block-library/src/button/editor.scss index efed2d4910b1a1..b5b8a185731053 100644 --- a/packages/block-library/src/button/editor.scss +++ b/packages/block-library/src/button/editor.scss @@ -1,14 +1,12 @@ -.block-editor-block-list__block[data-type="core/button"] { - &[data-align="center"] { - text-align: center; - margin-left: auto; - margin-right: auto; - } +.wp-block[data-align="center"] > .wp-block-button { + text-align: center; + margin-left: auto; + margin-right: auto; +} - &[data-align="right"] { - /*!rtl:ignore*/ - text-align: right; - } +.wp-block[data-align="right"] > .wp-block-button { + /*!rtl:ignore*/ + text-align: right; } .wp-block-button { diff --git a/packages/block-library/src/button/index.js b/packages/block-library/src/button/index.js index fab563649938fb..6f2fed0d5bea74 100644 --- a/packages/block-library/src/button/index.js +++ b/packages/block-library/src/button/index.js @@ -35,7 +35,6 @@ export const settings = { alignWide: false, reusable: false, lightBlockWrapper: true, - __experimentalColor: { gradients: true }, }, parent: [ 'core/buttons' ], styles: [ diff --git a/packages/block-library/src/button/index.native.js b/packages/block-library/src/button/index.native.js deleted file mode 100644 index b3a3b7c131dfe1..00000000000000 --- a/packages/block-library/src/button/index.native.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Internal dependencies - */ -import { settings as webSettings } from './index.js'; - -export { metadata, name } from './index.js'; - -export const settings = { - ...webSettings, - parent: undefined, -}; diff --git a/packages/block-library/src/button/save.js b/packages/block-library/src/button/save.js index 6a7aeb8088c1a7..3fcf98e6edb129 100644 --- a/packages/block-library/src/button/save.js +++ b/packages/block-library/src/button/save.js @@ -8,15 +8,24 @@ import classnames from 'classnames'; */ import { RichText } from '@wordpress/block-editor'; +/** + * Internal dependencies + */ +import getColorAndStyleProps from './color-props'; + export default function save( { attributes } ) { const { borderRadius, linkTarget, rel, text, title, url } = attributes; - - const buttonClasses = classnames( 'wp-block-button__link', { - 'no-border-radius': borderRadius === 0, - } ); - + const colorProps = getColorAndStyleProps( attributes ); + const buttonClasses = classnames( + 'wp-block-button__link', + colorProps.className, + { + 'no-border-radius': borderRadius === 0, + } + ); const buttonStyle = { borderRadius: borderRadius ? borderRadius + 'px' : undefined, + ...colorProps.style, }; // The use of a `title` attribute here is soft-deprecated, but still applied @@ -24,15 +33,17 @@ export default function save( { attributes } ) { // A title will no longer be assigned for new or updated button block links. return ( - +
+ +
); } diff --git a/packages/block-library/src/button/style.scss b/packages/block-library/src/button/style.scss index 69c651422c517f..69fc1a80f85dec 100644 --- a/packages/block-library/src/button/style.scss +++ b/packages/block-library/src/button/style.scss @@ -1,6 +1,8 @@ $blocks-button__height: 56px; -.wp-block-button { +// Prefer the link selector instead of the regular button classname +// to support the previous markup in addition to the new one. +.wp-block-button__link { color: $white; background-color: $dark-gray-700; border: none; @@ -9,7 +11,6 @@ $blocks-button__height: 56px; cursor: pointer; display: inline-block; font-size: $big-font-size; - margin: 0; padding: 12px 24px; text-align: center; text-decoration: none; @@ -32,15 +33,22 @@ $blocks-button__height: 56px; } } -.wp-block-button.is-style-squared { +// the first selector is required for old buttons markup +.wp-block-button.is-style-squared, +.wp-block-button__link.wp-block-button.is-style-squared { border-radius: 0; } -.wp-block-button.no-border-radius { + +// the first selector is required for old buttons markup + +.wp-block-button.no-border-radius, +.wp-block-button__link.wp-block-button.no-border-radius { border-radius: 0 !important; } -.wp-block-button.is-style-outline { +.wp-block-button.is-style-outline .wp-block-button__link, +.wp-block-button__link.is-style-outline { color: $dark-gray-700; background-color: transparent; border: 2px solid; diff --git a/packages/block-library/src/buttons/edit.js b/packages/block-library/src/buttons/edit.js index d9b76ed8f1bcb6..f6aa94582b3a6c 100644 --- a/packages/block-library/src/buttons/edit.js +++ b/packages/block-library/src/buttons/edit.js @@ -4,6 +4,7 @@ import { __experimentalAlignmentHookSettingsProvider as AlignmentHookSettingsProvider, InnerBlocks, + __experimentalBlock as Block, } from '@wordpress/block-editor'; /** @@ -19,9 +20,9 @@ const alignmentHooksSetting = { isEmbedButton: true, }; -function ButtonsEdit( { className } ) { +function ButtonsEdit() { return ( -
+ -
+ ); } diff --git a/packages/block-library/src/buttons/edit.native.js b/packages/block-library/src/buttons/edit.native.js new file mode 100644 index 00000000000000..c80c844afd41e6 --- /dev/null +++ b/packages/block-library/src/buttons/edit.native.js @@ -0,0 +1,142 @@ +/** + * External dependencies + */ +import { View } from 'react-native'; +/** + * WordPress dependencies + */ +import { + InnerBlocks, + __experimentalAlignmentHookSettingsProvider as AlignmentHookSettingsProvider, +} from '@wordpress/block-editor'; +import { withSelect, withDispatch } from '@wordpress/data'; +import { compose, useResizeObserver } from '@wordpress/compose'; +import { createBlock } from '@wordpress/blocks'; +import { useState, useEffect } from '@wordpress/element'; + +/** + * Internal dependencies + */ +import { name as buttonBlockName } from '../button/'; +import styles from './editor.scss'; + +const ALLOWED_BLOCKS = [ buttonBlockName ]; +const BUTTONS_TEMPLATE = [ [ 'core/button' ] ]; + +function ButtonsEdit( { + isSelected, + attributes, + onDelete, + onAddNextButton, + shouldDelete, + isInnerButtonSelected, +} ) { + const { align } = attributes; + const [ resizeObserver, sizes ] = useResizeObserver(); + const [ maxWidth, setMaxWidth ] = useState( 0 ); + const shouldRenderFooterAppender = isSelected || isInnerButtonSelected; + const { marginLeft: spacing } = styles.spacing; + + useEffect( () => { + const margins = 2 * styles.parent.marginRight; + const { width } = sizes || {}; + if ( width ) { + setMaxWidth( width - margins ); + } + }, [ sizes ] ); + + function renderFooterAppender() { + return ( + + + + ); + } + + // Inside buttons block alignment options are not supported. + const alignmentHooksSetting = { + isEmbedButton: true, + }; + + return ( + + { resizeObserver } + + + ); +} + +export default compose( + withSelect( ( select, { clientId } ) => { + const { + getBlockCount, + getBlockParents, + getSelectedBlockClientId, + } = select( 'core/block-editor' ); + const selectedBlockClientId = getSelectedBlockClientId(); + const selectedBlockParents = getBlockParents( + selectedBlockClientId, + true + ); + + return { + // The purpose of `shouldDelete` check is giving the ability to pass to + // mobile toolbar function called `onDelete` which removes the whole + // `Buttons` container along with the last inner button when + // there is exactly one button. + shouldDelete: getBlockCount( clientId ) === 1, + isInnerButtonSelected: selectedBlockParents[ 0 ] === clientId, + }; + } ), + withDispatch( ( dispatch, { clientId }, registry ) => { + const { replaceInnerBlocks, selectBlock, removeBlock } = dispatch( + 'core/block-editor' + ); + const { getBlocks, getBlockOrder } = registry.select( + 'core/block-editor' + ); + const innerBlocks = getBlocks( clientId ); + + return { + // The purpose of `onAddNextButton` is giving the ability to automatically + // adding `Button` inside `Buttons` block on the appender press event. + onAddNextButton: ( selectedId ) => { + const order = getBlockOrder( clientId ); + const selectedButtonIndex = order.findIndex( + ( i ) => i === selectedId + ); + + const index = + selectedButtonIndex === -1 + ? order.length + 1 + : selectedButtonIndex; + + const insertedBlock = createBlock( 'core/button' ); + + innerBlocks.splice( index + 1, 0, insertedBlock ); + + replaceInnerBlocks( clientId, innerBlocks, true ); + selectBlock( insertedBlock.clientId ); + }, + onDelete: () => { + removeBlock( clientId ); + }, + }; + } ) +)( ButtonsEdit ); diff --git a/packages/block-library/src/buttons/editor.native.scss b/packages/block-library/src/buttons/editor.native.scss new file mode 100644 index 00000000000000..f4816da8494d41 --- /dev/null +++ b/packages/block-library/src/buttons/editor.native.scss @@ -0,0 +1,12 @@ +.parent { + margin: $block-edge-to-content; +} + +.appenderContainer { + flex: 1; + margin: $block-selected-margin; +} + +.spacing { + margin: 2 * $block-selected-margin; +} diff --git a/packages/block-library/src/buttons/editor.scss b/packages/block-library/src/buttons/editor.scss index 10838d577f0743..2a07114b65ad50 100644 --- a/packages/block-library/src/buttons/editor.scss +++ b/packages/block-library/src/buttons/editor.scss @@ -3,20 +3,18 @@ width: auto; } -.wp-block-buttons { - &[data-align="center"] .block-editor-block-list__layout { - display: flex; - align-items: center; - flex-wrap: wrap; - justify-content: center; - } +.wp-block[data-align="center"] > .wp-block-buttons { + display: flex; + align-items: center; + flex-wrap: wrap; + justify-content: center; +} - &[data-align="right"] .block-editor-block-list__layout { - display: flex; - justify-content: flex-end; - } +.wp-block[data-align="right"] > .wp-block-buttons { + display: flex; + justify-content: flex-end; +} - .block-editor-block-list__layout > div:last-child { - display: inline-block; - } +.wp-block-buttons .block-list-appender { + display: inline-block; } diff --git a/packages/block-library/src/buttons/icon.js b/packages/block-library/src/buttons/icon.js deleted file mode 100644 index 73208af2f03f84..00000000000000 --- a/packages/block-library/src/buttons/icon.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * WordPress dependencies - */ -import { G, Path, SVG } from '@wordpress/components'; - -export default ( - - - - - - -); diff --git a/packages/block-library/src/buttons/index.js b/packages/block-library/src/buttons/index.js index 4777968dd1e710..c9b6b6a7a74f89 100644 --- a/packages/block-library/src/buttons/index.js +++ b/packages/block-library/src/buttons/index.js @@ -26,6 +26,7 @@ export const settings = { supports: { align: true, alignWide: false, + lightBlockWrapper: true, }, transforms, edit, diff --git a/packages/block-library/src/calendar/block.json b/packages/block-library/src/calendar/block.json new file mode 100644 index 00000000000000..945965be1b3bde --- /dev/null +++ b/packages/block-library/src/calendar/block.json @@ -0,0 +1,19 @@ +{ + "name": "core/calendar", + "category": "widgets", + "attributes": { + "align": { + "type": "string", + "enum": [ "left", "center", "right", "wide", "full" ] + }, + "className": { + "type": "string" + }, + "month": { + "type": "integer" + }, + "year": { + "type": "integer" + } + } +} diff --git a/packages/block-library/src/calendar/icon.js b/packages/block-library/src/calendar/icon.js deleted file mode 100644 index c89c33a333ea53..00000000000000 --- a/packages/block-library/src/calendar/icon.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * WordPress dependencies - */ -import { G, Path, SVG } from '@wordpress/components'; - -export default ( - - - - - - -); diff --git a/packages/block-library/src/calendar/index.js b/packages/block-library/src/calendar/index.js index e49460b0ebafe5..f04f16f409b98b 100644 --- a/packages/block-library/src/calendar/index.js +++ b/packages/block-library/src/calendar/index.js @@ -1,21 +1,23 @@ /** * WordPress dependencies */ -import { __ } from '@wordpress/i18n'; import { calendar as icon } from '@wordpress/icons'; +import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ +import metadata from './block.json'; import edit from './edit'; -export const name = 'core/calendar'; +const { name } = metadata; + +export { metadata, name }; export const settings = { title: __( 'Calendar' ), description: __( 'A calendar of your site’s posts.' ), icon, - category: 'widgets', keywords: [ __( 'posts' ), __( 'archive' ) ], supports: { align: true, diff --git a/packages/block-library/src/calendar/index.php b/packages/block-library/src/calendar/index.php index 3d2e8061ba5d69..169adf2131edad 100644 --- a/packages/block-library/src/calendar/index.php +++ b/packages/block-library/src/calendar/index.php @@ -52,24 +52,9 @@ function render_block_core_calendar( $attributes ) { * Registers the `core/calendar` block on server. */ function register_block_core_calendar() { - register_block_type( - 'core/calendar', + register_block_type_from_metadata( + __DIR__ . '/calendar', array( - 'attributes' => array( - 'align' => array( - 'type' => 'string', - 'enum' => array( 'left', 'center', 'right', 'wide', 'full' ), - ), - 'className' => array( - 'type' => 'string', - ), - 'month' => array( - 'type' => 'integer', - ), - 'year' => array( - 'type' => 'integer', - ), - ), 'render_callback' => 'render_block_core_calendar', ) ); diff --git a/packages/block-library/src/categories/block.json b/packages/block-library/src/categories/block.json new file mode 100644 index 00000000000000..ccc12b34336b90 --- /dev/null +++ b/packages/block-library/src/categories/block.json @@ -0,0 +1,25 @@ +{ + "name": "core/categories", + "category": "widgets", + "attributes": { + "align": { + "type": "string", + "enum": [ "left", "center", "right", "wide", "full" ] + }, + "className": { + "type": "string" + }, + "displayAsDropdown": { + "type": "boolean", + "default": false + }, + "showHierarchy": { + "type": "boolean", + "default": false + }, + "showPostCounts": { + "type": "boolean", + "default": false + } + } +} diff --git a/packages/block-library/src/categories/index.js b/packages/block-library/src/categories/index.js index 42b863d5c87458..517f348a34178e 100644 --- a/packages/block-library/src/categories/index.js +++ b/packages/block-library/src/categories/index.js @@ -1,24 +1,27 @@ /** * WordPress dependencies */ -import { __ } from '@wordpress/i18n'; import { category as icon } from '@wordpress/icons'; +import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ +import metadata from './block.json'; import edit from './edit'; -export const name = 'core/categories'; +const { name } = metadata; + +export { metadata, name }; export const settings = { title: __( 'Categories' ), description: __( 'Display a list of all categories.' ), icon, - category: 'widgets', supports: { align: true, html: false, }, + example: {}, edit, }; diff --git a/packages/block-library/src/categories/index.php b/packages/block-library/src/categories/index.php index 159bb8b799c469..34dc2c959d0bf7 100644 --- a/packages/block-library/src/categories/index.php +++ b/packages/block-library/src/categories/index.php @@ -89,30 +89,9 @@ function onCatChange() { * Registers the `core/categories` block on server. */ function register_block_core_categories() { - register_block_type( - 'core/categories', + register_block_type_from_metadata( + __DIR__ . '/categories', array( - 'attributes' => array( - 'align' => array( - 'type' => 'string', - 'enum' => array( 'left', 'center', 'right', 'wide', 'full' ), - ), - 'className' => array( - 'type' => 'string', - ), - 'displayAsDropdown' => array( - 'type' => 'boolean', - 'default' => false, - ), - 'showHierarchy' => array( - 'type' => 'boolean', - 'default' => false, - ), - 'showPostCounts' => array( - 'type' => 'boolean', - 'default' => false, - ), - ), 'render_callback' => 'render_block_core_categories', ) ); diff --git a/packages/block-library/src/column/edit.native.js b/packages/block-library/src/column/edit.native.js index d10d2374d0fb77..70d519ca2e78c6 100644 --- a/packages/block-library/src/column/edit.native.js +++ b/packages/block-library/src/column/edit.native.js @@ -64,7 +64,6 @@ function ColumnEdit( { ] } > - @@ -143,7 +144,6 @@ function ColumnsEditContainer( { columnsInRow > 1 ? 'horizontal' : undefined } horizontal={ true } - scrollEnabled={ false } allowedBlocks={ ALLOWED_BLOCKS } contentResizeMode="stretch" onAddBlock={ onAddNextColumn } diff --git a/packages/block-library/src/columns/editor.scss b/packages/block-library/src/columns/editor.scss index 73231a940dd83c..d4928ac611d83a 100644 --- a/packages/block-library/src/columns/editor.scss +++ b/packages/block-library/src/columns/editor.scss @@ -4,14 +4,6 @@ max-width: none; } -// Ideally this shouldn't be necessary. There should be no default margins in -// the editor. -.editor-styles-wrapper .block-editor-block-list__block.wp-block-column, -.editor-styles-wrapper .block-editor-block-list__block.wp-block-columns { - margin-top: 0; - margin-bottom: 0; -} - // To do: remove horizontal margin override by the editor. @include break-small() { .editor-styles-wrapper diff --git a/packages/block-library/src/cover/edit.native.js b/packages/block-library/src/cover/edit.native.js index 230a129123c083..fd1443168352cd 100644 --- a/packages/block-library/src/cover/edit.native.js +++ b/packages/block-library/src/cover/edit.native.js @@ -2,6 +2,11 @@ * External dependencies */ import { View, TouchableWithoutFeedback } from 'react-native'; +import { + requestImageFailedRetryDialog, + requestImageUploadCancelDialog, + mediaUploadSync, +} from 'react-native-gutenberg-bridge'; import Video from 'react-native-video'; /** @@ -31,8 +36,9 @@ import { } from '@wordpress/block-editor'; import { compose, withPreferredColorScheme } from '@wordpress/compose'; import { withSelect } from '@wordpress/data'; -import { useEffect } from '@wordpress/element'; +import { useEffect, useState } from '@wordpress/element'; import { cover as icon, replace } from '@wordpress/icons'; +import { getProtocol } from '@wordpress/url'; /** * Internal dependencies @@ -102,7 +108,22 @@ const Cover = ( { } }, [ setAttributes ] ); + // sync with local media store + useEffect( mediaUploadSync, [] ); + + // initialize uploading flag to false, awaiting sync + const [ isUploadInProgress, setIsUploadInProgress ] = useState( false ); + + // initialize upload failure flag to true if url is local + const [ didUploadFail, setDidUploadFail ] = useState( + id && getProtocol( url ) === 'file:' + ); + + // don't show failure if upload is in progress + const shouldShowFailure = didUploadFail && ! isUploadInProgress; + const onSelectMedia = ( media ) => { + setDidUploadFail( false ); const onSelect = attributesFromMedia( setAttributes ); // Remove gradient attribute setAttributes( { gradient: undefined, customGradient: undefined } ); @@ -119,6 +140,29 @@ const Cover = ( { setAttributes( { dimRatio: value } ); }; + const onMediaPressed = () => { + if ( isUploadInProgress ) { + requestImageUploadCancelDialog( id ); + } else if ( shouldShowFailure ) { + requestImageFailedRetryDialog( id ); + } + }; + + const [ isVideoLoading, setIsVideoLoading ] = useState( true ); + + const onVideoLoadStart = () => { + setIsVideoLoading( true ); + }; + + const onVideoLoad = () => { + setIsVideoLoading( false ); + }; + + const backgroundColor = getStylesFromColorScheme( + styles.backgroundSolid, + styles.backgroundSolidDark + ); + const overlayStyles = [ styles.overlay, url && { opacity: dimRatio / 100 }, @@ -129,12 +173,7 @@ const Cover = ( { styles.overlay.color, }, // While we don't support theme colors we add a default bg color - ! overlayColor.color && ! url - ? getStylesFromColorScheme( - styles.backgroundSolid, - styles.backgroundSolidDark - ) - : {}, + ! overlayColor.color && ! url ? backgroundColor : {}, ]; const placeholderIconStyle = getStylesFromColorScheme( @@ -191,45 +230,62 @@ const Cover = ( { } ) => ( - + { getMediaOptions() } { isParentSelected && toolbarControls( openMediaOptions ) } { + setIsUploadInProgress( true ); + } } onFinishMediaUploadWithSuccess={ ( { mediaServerId, mediaUrl, } ) => { + setIsUploadInProgress( false ); + setDidUploadFail( false ); setAttributes( { id: mediaServerId, url: mediaUrl, backgroundType, } ); } } - renderContent={ () => ( - <> - { IMAGE_BACKGROUND_TYPE === backgroundType && ( - - ) } - { VIDEO_BACKGROUND_TYPE === backgroundType && ( - ); @@ -238,8 +294,6 @@ const Cover = ( { return ( + + { shouldShowFailure && ( + + + + + + ) } ); }; diff --git a/packages/block-library/src/cover/editor.scss b/packages/block-library/src/cover/editor.scss index 31faa3872936d0..1037fbf89158ab 100644 --- a/packages/block-library/src/cover/editor.scss +++ b/packages/block-library/src/cover/editor.scss @@ -1,6 +1,5 @@ .wp-block-cover-image, .wp-block-cover { - &.components-placeholder h2 { color: inherit; } @@ -23,13 +22,14 @@ .wp-block-cover__placeholder-background-options { width: 100%; } +} - // Apply max-width to floated items that have no intrinsic width. - [data-align="left"] &, - [data-align="right"] & { - max-width: $content-width / 2; - width: 100%; - } +[data-align="left"] > .wp-block-cover, +[data-align="right"] > .wp-block-cover, +[data-align="left"] > .wp-block-cover-image, +[data-align="right"] > .wp-block-cover-image { + max-width: $content-width / 2; + width: 100%; } .block-library-cover__reset-button { diff --git a/packages/block-library/src/cover/style.native.scss b/packages/block-library/src/cover/style.native.scss index b1e7b5bad9257d..59d23d8999b31d 100644 --- a/packages/block-library/src/cover/style.native.scss +++ b/packages/block-library/src/cover/style.native.scss @@ -46,3 +46,28 @@ .backgroundSolidDark { background-color: $background-dark-secondary; } + +.uploadFailedContainer { + position: absolute; + width: 100%; + height: 100%; + padding: 8px; + justify-content: flex-start; + align-items: flex-end; + z-index: 3; +} + +.uploadFailed { + width: 24px; + height: 24px; + border-radius: 12px; + justify-content: center; + align-items: center; + background-color: #fff; +} + +.uploadFailedIcon { + fill: $red-40; + width: 100%; + height: 100%; +} diff --git a/packages/block-library/src/embed/editor.scss b/packages/block-library/src/embed/editor.scss index 342b4fe1b116b2..f84b5b886bd10d 100644 --- a/packages/block-library/src/embed/editor.scss +++ b/packages/block-library/src/embed/editor.scss @@ -7,17 +7,6 @@ // therefore the video doesn't intrinsically clear floats like an image does. clear: both; - // Apply a min-width, or the embed can collapse when floated. - // Instagram widgets have a min-width of 326px, so go a bit beyond that. - @include break-small() { - min-width: 360px; - - // The placeholder should not have this min-width. - &.components-placeholder { - min-width: 0; - } - } - &.is-loading { display: flex; flex-direction: column; diff --git a/packages/block-library/src/embed/style.scss b/packages/block-library/src/embed/style.scss index 4abaf5b7778f57..3028e00a8bd51a 100644 --- a/packages/block-library/src/embed/style.scss +++ b/packages/block-library/src/embed/style.scss @@ -1,6 +1,6 @@ // Apply max-width to floated items that have no intrinsic width -.block-editor-block-list__block[data-type="core/embed"][data-align="left"], -.block-editor-block-list__block[data-type="core/embed"][data-align="right"], +.wp-block[data-align="left"] > .wp-block-embed, +.wp-block[data-align="right"] > .wp-block-embed, .wp-block-embed.alignleft, .wp-block-embed.alignright { // Instagram widgets have a min-width of 326px, so go a bit beyond that. diff --git a/packages/block-library/src/gallery/columns-control/index.js b/packages/block-library/src/gallery/columns-control/index.js deleted file mode 100644 index 8eb15c87037bbc..00000000000000 --- a/packages/block-library/src/gallery/columns-control/index.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * WordPress dependencies - */ -import { RangeControl } from '@wordpress/components'; - -const ColumnsControl = ( { label, value, onChange, min, max } ) => ( - -); - -export default ColumnsControl; diff --git a/packages/block-library/src/gallery/columns-control/index.native.js b/packages/block-library/src/gallery/columns-control/index.native.js deleted file mode 100644 index ab819c916a9988..00000000000000 --- a/packages/block-library/src/gallery/columns-control/index.native.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * WordPress dependencies - */ -import { StepperControl } from '@wordpress/components'; - -const ColumnsControl = ( { label, value, onChange, min, max } ) => ( - -); - -export default ColumnsControl; diff --git a/packages/block-library/src/gallery/edit.js b/packages/block-library/src/gallery/edit.js index ac031e6c34085f..3f77212f71990a 100644 --- a/packages/block-library/src/gallery/edit.js +++ b/packages/block-library/src/gallery/edit.js @@ -23,6 +23,7 @@ import { SelectControl, ToggleControl, withNotices, + RangeControl, } from '@wordpress/components'; import { MediaPlaceholder, InspectorControls } from '@wordpress/block-editor'; import { Component, Platform } from '@wordpress/element'; @@ -37,7 +38,6 @@ import { withViewportMatch } from '@wordpress/viewport'; import { sharedIcon } from './shared-icon'; import { defaultColumnsNumber, pickRelevantMediaFiles } from './shared'; import Gallery from './gallery'; -import ColumnsControl from './columns-control'; const MAX_COLUMNS = 8; const linkOptions = [ @@ -65,6 +65,11 @@ const MOBILE_CONTROL_PROPS_SEPARATOR_NONE = Platform.select( { native: { separatorType: 'none' }, } ); +const MOBILE_CONTROL_PROPS_RANGE_CONTROL = Platform.select( { + web: {}, + native: { type: 'stepper' }, +} ); + class GalleryEdit extends Component { constructor() { super( ...arguments ); @@ -391,12 +396,14 @@ class GalleryEdit extends Component { { images.length > 1 && ( - ) } diff --git a/packages/block-library/src/group/edit.native.js b/packages/block-library/src/group/edit.native.js index 6545600f939040..257ba8b4e628c7 100644 --- a/packages/block-library/src/group/edit.native.js +++ b/packages/block-library/src/group/edit.native.js @@ -36,9 +36,6 @@ function GroupEdit( { hasInnerBlocks, isSelected, getStylesFromColorScheme } ) { ); diff --git a/packages/block-library/src/group/editor.scss b/packages/block-library/src/group/editor.scss index 9371d7671bb8f3..6e414ad520b7e3 100644 --- a/packages/block-library/src/group/editor.scss +++ b/packages/block-library/src/group/editor.scss @@ -48,7 +48,7 @@ /** * Group: Full Width Alignment */ -.wp-block[data-type="core/group"][data-align="full"] { +.wp-block[data-align="full"] .wp-block-group { // First tier of InnerBlocks must act like the container of the standard canvas > div > .wp-block-group > .wp-block-group__inner-container > .block-editor-inner-blocks { diff --git a/packages/block-library/src/group/icon.js b/packages/block-library/src/group/icon.js deleted file mode 100644 index 8ec4a84f778a20..00000000000000 --- a/packages/block-library/src/group/icon.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * WordPress dependencies - */ -import { Path, SVG } from '@wordpress/components'; - -export default ( - - - - -); diff --git a/packages/block-library/src/heading/edit.js b/packages/block-library/src/heading/edit.js index 28f9a6da5be576..b0f078c91e5374 100644 --- a/packages/block-library/src/heading/edit.js +++ b/packages/block-library/src/heading/edit.js @@ -26,11 +26,6 @@ import { Platform } from '@wordpress/element'; function HeadingEdit( { attributes, setAttributes, mergeBlocks, onReplace } ) { const { align, content, level, placeholder, style } = attributes; const tagName = 'h' + level; - const isAndroid = Platform.select( { - android: true, - native: false, - web: false, - } ); const styles = { color: style && style.color && style.color.text, @@ -47,14 +42,12 @@ function HeadingEdit( { attributes, setAttributes, mergeBlocks, onReplace } ) { setAttributes( { level: newLevel } ) } /> - { ! isAndroid && ( - { - setAttributes( { align: nextAlign } ); - } } - /> - ) } + { + setAttributes( { align: nextAlign } ); + } } + /> { Platform.OS === 'web' && ( diff --git a/packages/block-library/src/image/edit.js b/packages/block-library/src/image/edit.js index 30ddaefd89602e..10ea6dbb3a15c6 100644 --- a/packages/block-library/src/image/edit.js +++ b/packages/block-library/src/image/edit.js @@ -399,9 +399,6 @@ export class ImageEdit extends Component { src={ url } /> ); - const needsAlignmentWrapper = [ 'center', 'left', 'right' ].includes( - align - ); const mediaPlaceholder = ( { controls } - - { needsAlignmentWrapper ? ( -
- { mediaPlaceholder } -
- ) : ( - mediaPlaceholder - ) } -
+ { mediaPlaceholder } ); } @@ -445,7 +429,6 @@ export class ImageEdit extends Component { 'is-resized': !! width || !! height, 'is-focused': isSelected, [ `size-${ sizeSlug }` ]: sizeSlug, - [ `align${ align }` ]: align, } ); const isResizable = @@ -514,198 +497,185 @@ export class ImageEdit extends Component { return ( <> { controls } -
- - - { ( sizes ) => { - const { - imageWidthWithinContainer, - imageHeightWithinContainer, - imageWidth, - imageHeight, - } = sizes; - - const filename = this.getFilename( url ); - let defaultedAlt; - if ( alt ) { - defaultedAlt = alt; - } else if ( filename ) { - defaultedAlt = sprintf( - /* translators: %s: file name */ - __( - 'This image has an empty alt attribute; its file name is %s' - ), - filename - ); - } else { - defaultedAlt = __( - 'This image has an empty alt attribute' - ); - } - - const img = ( - // Disable reason: Image itself is not meant to be interactive, but - // should direct focus to block. - /* eslint-disable jsx-a11y/no-noninteractive-element-interactions */ - <> - { - this.onImageError( url ) - } - /> - { isBlobURL( url ) && } - - /* eslint-enable jsx-a11y/no-noninteractive-element-interactions */ + + + { ( sizes ) => { + const { + imageWidthWithinContainer, + imageHeightWithinContainer, + imageWidth, + imageHeight, + } = sizes; + + const filename = this.getFilename( url ); + let defaultedAlt; + if ( alt ) { + defaultedAlt = alt; + } else if ( filename ) { + defaultedAlt = sprintf( + /* translators: %s: file name */ + __( + 'This image has an empty alt attribute; its file name is %s' + ), + filename ); + } else { + defaultedAlt = __( + 'This image has an empty alt attribute' + ); + } - if ( - ! isResizable || - ! imageWidthWithinContainer - ) { - return ( - <> - { getInspectorControls( - imageWidth, - imageHeight - ) } -
- { img } -
- - ); - } - - const currentWidth = - width || imageWidthWithinContainer; - const currentHeight = - height || imageHeightWithinContainer; - - const ratio = imageWidth / imageHeight; - const minWidth = - imageWidth < imageHeight - ? MIN_SIZE - : MIN_SIZE * ratio; - const minHeight = - imageHeight < imageWidth - ? MIN_SIZE - : MIN_SIZE / ratio; - - // With the current implementation of ResizableBox, an image needs an explicit pixel value for the max-width. - // In absence of being able to set the content-width, this max-width is currently dictated by the vanilla editor style. - // The following variable adds a buffer to this vanilla style, so 3rd party themes have some wiggleroom. - // This does, in most cases, allow you to scale the image beyond the width of the main column, though not infinitely. - // @todo It would be good to revisit this once a content-width variable becomes available. - const maxWidthBuffer = maxWidth * 2.5; - - let showRightHandle = false; - let showLeftHandle = false; - - /* eslint-disable no-lonely-if */ - // See https://github.com/WordPress/gutenberg/issues/7584. - if ( align === 'center' ) { - // When the image is centered, show both handles. - showRightHandle = true; - showLeftHandle = true; - } else if ( isRTL ) { - // In RTL mode the image is on the right by default. - // Show the right handle and hide the left handle only when it is aligned left. - // Otherwise always show the left handle. - if ( align === 'left' ) { - showRightHandle = true; - } else { - showLeftHandle = true; - } - } else { - // Show the left handle and hide the right handle only when the image is aligned right. - // Otherwise always show the right handle. - if ( align === 'right' ) { - showLeftHandle = true; - } else { - showRightHandle = true; - } - } - /* eslint-enable no-lonely-if */ + const img = ( + // Disable reason: Image itself is not meant to be interactive, but + // should direct focus to block. + /* eslint-disable jsx-a11y/no-noninteractive-element-interactions */ + <> + { + this.onImageError( url ) + } + /> + { isBlobURL( url ) && } + + /* eslint-enable jsx-a11y/no-noninteractive-element-interactions */ + ); + if ( + ! isResizable || + ! imageWidthWithinContainer + ) { return ( <> { getInspectorControls( imageWidth, imageHeight ) } - { - onResizeStop(); - setAttributes( { - width: parseInt( - currentWidth + - delta.width, - 10 - ), - height: parseInt( - currentHeight + - delta.height, - 10 - ), - } ); - } } - > +
{ img } - +
); - } } -
- { ( ! RichText.isEmpty( caption ) || isSelected ) && ( - - setAttributes( { caption: value } ) + } + + const currentWidth = + width || imageWidthWithinContainer; + const currentHeight = + height || imageHeightWithinContainer; + + const ratio = imageWidth / imageHeight; + const minWidth = + imageWidth < imageHeight + ? MIN_SIZE + : MIN_SIZE * ratio; + const minHeight = + imageHeight < imageWidth + ? MIN_SIZE + : MIN_SIZE / ratio; + + // With the current implementation of ResizableBox, an image needs an explicit pixel value for the max-width. + // In absence of being able to set the content-width, this max-width is currently dictated by the vanilla editor style. + // The following variable adds a buffer to this vanilla style, so 3rd party themes have some wiggleroom. + // This does, in most cases, allow you to scale the image beyond the width of the main column, though not infinitely. + // @todo It would be good to revisit this once a content-width variable becomes available. + const maxWidthBuffer = maxWidth * 2.5; + + let showRightHandle = false; + let showLeftHandle = false; + + /* eslint-disable no-lonely-if */ + // See https://github.com/WordPress/gutenberg/issues/7584. + if ( align === 'center' ) { + // When the image is centered, show both handles. + showRightHandle = true; + showLeftHandle = true; + } else if ( isRTL ) { + // In RTL mode the image is on the right by default. + // Show the right handle and hide the left handle only when it is aligned left. + // Otherwise always show the left handle. + if ( align === 'left' ) { + showRightHandle = true; + } else { + showLeftHandle = true; + } + } else { + // Show the left handle and hide the right handle only when the image is aligned right. + // Otherwise always show the right handle. + if ( align === 'right' ) { + showLeftHandle = true; + } else { + showRightHandle = true; } - isSelected={ this.state.captionFocused } - inlineToolbar - /> - ) } - - { mediaPlaceholder } -
-
+ } + /* eslint-enable no-lonely-if */ + + return ( + <> + { getInspectorControls( + imageWidth, + imageHeight + ) } + { + onResizeStop(); + setAttributes( { + width: parseInt( + currentWidth + delta.width, + 10 + ), + height: parseInt( + currentHeight + + delta.height, + 10 + ), + } ); + } } + > + { img } + + + ); + } } + + { ( ! RichText.isEmpty( caption ) || isSelected ) && ( + + setAttributes( { caption: value } ) + } + isSelected={ this.state.captionFocused } + inlineToolbar + /> + ) } + + { mediaPlaceholder } + ); /* eslint-enable jsx-a11y/click-events-have-key-events */ diff --git a/packages/block-library/src/image/edit.native.js b/packages/block-library/src/image/edit.native.js index 90c4b4707df689..f8bcdd2c5f5b06 100644 --- a/packages/block-library/src/image/edit.native.js +++ b/packages/block-library/src/image/edit.native.js @@ -294,6 +294,7 @@ export class ImageEdit extends React.Component { const mediaAttributes = { id: media.id, url: media.url, + caption: media.caption, }; let additionalAttributes; diff --git a/packages/block-library/src/image/editor.scss b/packages/block-library/src/image/editor.scss index e23efffc0eb4da..961941e5b6dfc0 100644 --- a/packages/block-library/src/image/editor.scss +++ b/packages/block-library/src/image/editor.scss @@ -1,10 +1,10 @@ +figure.wp-block-image:not(.wp-block) { + margin: 0; +} + .wp-block-image { position: relative; - // This resets the intrinsic margin on the figure in non-floated, wide, and full-wide alignments. - margin-left: 0; - margin-right: 0; - &.is-transient img { opacity: 0.3; } @@ -39,18 +39,6 @@ display: block; } -.block-editor-block-list__block[data-type="core/image"][data-align="center"] { - .wp-block-image { - margin-left: auto; - margin-right: auto; - } - - &[data-resized="false"] .wp-block-image > div { - margin-left: auto; - margin-right: auto; - } -} - .block-editor-block-list__block[data-type="core/image"] .block-editor-block-toolbar .block-editor-url-input__button-modal { position: absolute; left: 0; @@ -62,26 +50,29 @@ } } -// Although the float markup is different in the editor compared to the frontend, -// this CSS uses the same technique to allow floats in a wide images context. -// That is, the block retains its centering and max-width, and a child inside -// is floated instead of the block itself. -[data-type="core/image"][data-align="center"], -[data-type="core/image"][data-align="left"], -[data-type="core/image"][data-align="right"] { - figure { - margin: 0; +[data-align="wide"] > .wp-block-image, +[data-align="full"] > .wp-block-image { + img { + width: 100%; } } -[data-type="core/image"][data-align="wide"], -[data-type="core/image"][data-align="full"] { - figure img { - width: 100%; - } +.wp-block[data-align="left"] > .wp-block-image { + margin-right: 1em; + margin-left: 0; + margin-top: 0.5em; + margin-bottom: 0.5em; } -// This is similar to above but for resized unfloated images only, where the markup is different. -[data-type="core/image"] figure.is-resized { - margin: 0; +.wp-block[data-align="right"] > .wp-block-image { + margin-left: 1em; + margin-right: 0; + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +.wp-block[data-align="center"] > .wp-block-image { + margin-left: auto; + margin-right: auto; + text-align: center; } diff --git a/packages/block-library/src/image/index.js b/packages/block-library/src/image/index.js index 4d855ca15cd107..6b0c1fcb0b9b97 100644 --- a/packages/block-library/src/image/index.js +++ b/packages/block-library/src/image/index.js @@ -61,6 +61,11 @@ export const settings = { return alt + ( caption ? '. ' + caption : '' ); } }, + getEditWrapperProps( attributes ) { + return { + 'data-align': attributes.align, + }; + }, transforms, edit, save, diff --git a/packages/block-library/src/image/style.scss b/packages/block-library/src/image/style.scss index 98620035a445e3..26bc158c9224ca 100644 --- a/packages/block-library/src/image/style.scss +++ b/packages/block-library/src/image/style.scss @@ -16,18 +16,12 @@ width: 100%; } - // Floats get an extra wrapping
element, so the
becomes a child. .alignleft, .alignright, .aligncenter, &.is-resized { display: table; - // The figure is born with left and right margin. - // We remove this by default, and then customize it for left, right, and center. - margin-left: 0; - margin-right: 0; - > figcaption { display: table-caption; caption-side: bottom; @@ -38,14 +32,20 @@ /*rtl:ignore*/ float: left; /*rtl:ignore*/ + margin-left: 0; margin-right: 1em; + margin-top: 0.5em; + margin-bottom: 0.5em; } .alignright { /*rtl:ignore*/ float: right; /*rtl:ignore*/ + margin-right: 0; margin-left: 1em; + margin-top: 0.5em; + margin-bottom: 0.5em; } .aligncenter { diff --git a/packages/block-library/src/index.native.js b/packages/block-library/src/index.native.js index 4efee4a3deda82..6f6c5049eb7662 100644 --- a/packages/block-library/src/index.native.js +++ b/packages/block-library/src/index.native.js @@ -50,6 +50,7 @@ import * as verse from './verse'; import * as video from './video'; import * as tagCloud from './tag-cloud'; import * as group from './group'; +import * as buttons from './buttons'; export const coreBlocks = [ // Common blocks are grouped at the top to prioritize their display @@ -96,6 +97,7 @@ export const coreBlocks = [ textColumns, verse, video, + buttons, ].reduce( ( accumulator, block ) => { accumulator[ block.name ] = block; return accumulator; @@ -154,6 +156,7 @@ export const registerCoreBlocks = () => { button, spacer, shortcode, + buttons, latestPosts, devOnly( verse ), cover, diff --git a/packages/block-library/src/latest-comments/block.json b/packages/block-library/src/latest-comments/block.json new file mode 100644 index 00000000000000..a9ff05c39919f6 --- /dev/null +++ b/packages/block-library/src/latest-comments/block.json @@ -0,0 +1,31 @@ +{ + "name": "core/latest-comments", + "category": "widgets", + "attributes": { + "align": { + "type": "string", + "enum": [ "left", "center", "right", "wide", "full" ] + }, + "className": { + "type": "string" + }, + "commentsToShow": { + "type": "number", + "default": 5, + "minimum": 1, + "maximum": 100 + }, + "displayAvatar": { + "type": "boolean", + "default": true + }, + "displayDate": { + "type": "boolean", + "default": true + }, + "displayExcerpt": { + "type": "boolean", + "default": true + } + } +} diff --git a/packages/block-library/src/latest-comments/index.js b/packages/block-library/src/latest-comments/index.js index f8516e59567a59..b50e9e7b075605 100644 --- a/packages/block-library/src/latest-comments/index.js +++ b/packages/block-library/src/latest-comments/index.js @@ -1,25 +1,28 @@ /** * WordPress dependencies */ -import { __ } from '@wordpress/i18n'; import { comment as icon } from '@wordpress/icons'; +import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ +import metadata from './block.json'; import edit from './edit'; -export const name = 'core/latest-comments'; +const { name } = metadata; + +export { metadata, name }; export const settings = { title: __( 'Latest Comments' ), description: __( 'Display a list of your most recent comments.' ), icon, - category: 'widgets', keywords: [ __( 'recent comments' ) ], supports: { align: true, html: false, }, + example: {}, edit, }; diff --git a/packages/block-library/src/latest-comments/index.php b/packages/block-library/src/latest-comments/index.php index d68e89a152fc48..20a38627929d0c 100644 --- a/packages/block-library/src/latest-comments/index.php +++ b/packages/block-library/src/latest-comments/index.php @@ -152,42 +152,9 @@ function render_block_core_latest_comments( $attributes = array() ) { * Registers the `core/latest-comments` block. */ function register_block_core_latest_comments() { - register_block_type( - 'core/latest-comments', + register_block_type_from_metadata( + __DIR__ . '/latest-comments', array( - 'attributes' => array( - 'align' => array( - 'type' => 'string', - 'enum' => array( - 'left', - 'center', - 'right', - 'wide', - 'full', - ), - ), - 'className' => array( - 'type' => 'string', - ), - 'commentsToShow' => array( - 'type' => 'number', - 'default' => 5, - 'minimum' => 1, - 'maximum' => 100, - ), - 'displayAvatar' => array( - 'type' => 'boolean', - 'default' => true, - ), - 'displayDate' => array( - 'type' => 'boolean', - 'default' => true, - ), - 'displayExcerpt' => array( - 'type' => 'boolean', - 'default' => true, - ), - ), 'render_callback' => 'render_block_core_latest_comments', ) ); diff --git a/packages/block-library/src/latest-posts/block.json b/packages/block-library/src/latest-posts/block.json index e730d861626502..96285d1f2705ef 100644 --- a/packages/block-library/src/latest-posts/block.json +++ b/packages/block-library/src/latest-posts/block.json @@ -10,7 +10,10 @@ "type": "string" }, "categories": { - "type": "array" + "type": "array", + "items": { + "type": "object" + } }, "postsToShow": { "type": "number", diff --git a/packages/block-library/src/latest-posts/deprecated.js b/packages/block-library/src/latest-posts/deprecated.js new file mode 100644 index 00000000000000..d49b8abab56c08 --- /dev/null +++ b/packages/block-library/src/latest-posts/deprecated.js @@ -0,0 +1,31 @@ +/** + * Internal dependencies + */ +import metadata from './block.json'; + +const { attributes } = metadata; + +export default [ + { + attributes: { + ...attributes, + categories: { + type: 'string', + }, + }, + supports: { + align: true, + html: false, + }, + migrate: ( oldAttributes ) => { + // This needs the full category object, not just the ID. + return { + ...oldAttributes, + categories: [ { id: Number( oldAttributes.categories ) } ], + }; + }, + isEligible: ( { categories } ) => + categories && 'string' === typeof categories, + save: () => null, + }, +]; diff --git a/packages/block-library/src/latest-posts/edit.js b/packages/block-library/src/latest-posts/edit.js index 8e58ddd7260554..9f21499510367f 100644 --- a/packages/block-library/src/latest-posts/edit.js +++ b/packages/block-library/src/latest-posts/edit.js @@ -104,13 +104,6 @@ class LatestPostsEdit extends Component { featuredImageSizeWidth, featuredImageSizeHeight, } = attributes; - const suggestions = categoriesList.reduce( - ( accumulator, category ) => ( { - ...accumulator, - [ category.name ]: category, - } ), - {} - ); const categorySuggestions = categoriesList.reduce( ( accumulator, category ) => ( { ...accumulator, @@ -120,7 +113,8 @@ class LatestPostsEdit extends Component { ); const selectCategories = ( tokens ) => { const hasNoSuggestion = tokens.some( - ( token ) => typeof token === 'string' && ! suggestions[ token ] + ( token ) => + typeof token === 'string' && ! categorySuggestions[ token ] ); if ( hasNoSuggestion ) { return; @@ -128,7 +122,9 @@ class LatestPostsEdit extends Component { // Categories that are already will be objects, while new additions will be strings (the name). // allCategories nomalizes the array so that they are all objects. const allCategories = tokens.map( ( token ) => { - return typeof token === 'string' ? suggestions[ token ] : token; + return typeof token === 'string' + ? categorySuggestions[ token ] + : token; } ); // We do nothing if the category is not selected // from suggestions. diff --git a/packages/block-library/src/latest-posts/icon.js b/packages/block-library/src/latest-posts/icon.js deleted file mode 100644 index 726e01e9c06402..00000000000000 --- a/packages/block-library/src/latest-posts/icon.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * WordPress dependencies - */ -import { Path, SVG } from '@wordpress/components'; - -export default ( - - - -); diff --git a/packages/block-library/src/latest-posts/index.js b/packages/block-library/src/latest-posts/index.js index 63f7b7bfae638a..cd337692eb40da 100644 --- a/packages/block-library/src/latest-posts/index.js +++ b/packages/block-library/src/latest-posts/index.js @@ -7,6 +7,7 @@ import { postList as icon } from '@wordpress/icons'; /** * Internal dependencies */ +import deprecated from './deprecated'; import edit from './edit'; import metadata from './block.json'; @@ -22,5 +23,7 @@ export const settings = { align: true, html: false, }, + example: {}, edit, + deprecated, }; diff --git a/packages/block-library/src/latest-posts/index.php b/packages/block-library/src/latest-posts/index.php index f9002ebde627da..7bdc612b4039c1 100644 --- a/packages/block-library/src/latest-posts/index.php +++ b/packages/block-library/src/latest-posts/index.php @@ -159,17 +159,42 @@ function render_block_core_latest_posts( $attributes ) { * Registers the `core/latest-posts` block on server. */ function register_block_core_latest_posts() { - $path = __DIR__ . '/latest-posts/block.json'; - $metadata = json_decode( file_get_contents( $path ), true ); - - register_block_type( - $metadata['name'], - array_merge( - $metadata, - array( - 'render_callback' => 'render_block_core_latest_posts', - ) + register_block_type_from_metadata( + __DIR__ . '/latest-posts', + array( + 'render_callback' => 'render_block_core_latest_posts', ) ); } add_action( 'init', 'register_block_core_latest_posts' ); + +/** + * Handles outdated versions of the `core/latest-posts` block by converting + * attribute `categories` from a numeric string to an array with key `id`. + * + * This is done to accommodate the changes introduced in #20781 that sought to + * add support for multiple categories to the block. However, given that this + * block is dynamic, the usual provisions for block migration are insufficient, + * as they only act when a block is loaded in the editor. + * + * TODO: Remove when and if the bottom client-side deprecation for this block + * is removed. + * + * @param array $block A single parsed block object. + * + * @return array The migrated block object. + */ +function block_core_latest_posts_migrate_categories( $block ) { + if ( + 'core/latest-posts' === $block['blockName'] && + ! empty( $block['attrs']['categories'] ) && + is_string( $block['attrs']['categories'] ) + ) { + $block['attrs']['categories'] = array( + array( 'id' => absint( $block['attrs']['categories'] ) ), + ); + } + + return $block; +} +add_filter( 'render_block_data', 'block_core_latest_posts_migrate_categories' ); diff --git a/packages/block-library/src/legacy-widget/block.json b/packages/block-library/src/legacy-widget/block.json new file mode 100644 index 00000000000000..416bb7ad60c1b7 --- /dev/null +++ b/packages/block-library/src/legacy-widget/block.json @@ -0,0 +1,21 @@ +{ + "name": "core/legacy-widget", + "category": "widgets", + "attributes": { + "widgetClass": { + "type": "string" + }, + "id": { + "type": "string" + }, + "idBase": { + "type": "string" + }, + "number": { + "type": "number" + }, + "instance": { + "type": "object" + } + } +} diff --git a/packages/block-library/src/legacy-widget/editor.scss b/packages/block-library/src/legacy-widget/editor.scss index 2d5539be15112c..f838cfe63433cc 100644 --- a/packages/block-library/src/legacy-widget/editor.scss +++ b/packages/block-library/src/legacy-widget/editor.scss @@ -1,15 +1,13 @@ -.wp-block-legacy-widget__edit-container, -.wp-block-legacy-widget__preview { - padding-left: 2.5em; - padding-right: 2.5em; -} - .wp-block-legacy-widget__edit-container { .widget-inside { border: none; display: block; box-shadow: none; } + // Reset z-index set on https://github.com/WordPress/wordpress-develop/commit/f26d4d37351a55fd1fc5dad0f5fef8f0f964908c. + .widget.open { + z-index: 0; + } } .wp-block-legacy-widget__update-button { @@ -21,12 +19,15 @@ overflow: auto; } +.wp-block-legacy-widget__preview, +.wp-block-legacy-widget__edit-container, +.wp-block-legacy-widget__edit-widget-title { + padding: $grid-unit-10 $block-padding; +} + .wp-block-legacy-widget__edit-widget-title { - margin: 0 -$block-padding 0 -$block-padding+1px 0; background: $light-gray-100; color: $dark-gray-500; - top: -$block-padding+1px; - position: relative; font-family: $default-font; font-size: $default-font-size; padding: $grid-unit-10 $block-padding; diff --git a/packages/block-library/src/legacy-widget/index.js b/packages/block-library/src/legacy-widget/index.js index 0b070a8d9d92a6..52353cd9778c2d 100644 --- a/packages/block-library/src/legacy-widget/index.js +++ b/packages/block-library/src/legacy-widget/index.js @@ -1,21 +1,23 @@ /** * WordPress dependencies */ -import { __ } from '@wordpress/i18n'; import { widget as icon } from '@wordpress/icons'; +import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ +import metadata from './block.json'; import edit from './edit'; -export const name = 'core/legacy-widget'; +const { name } = metadata; + +export { metadata, name }; export const settings = { title: __( 'Legacy Widget (Experimental)' ), description: __( 'Display a legacy widget.' ), icon, - category: 'widgets', supports: { html: false, customClassName: false, diff --git a/packages/block-library/src/legacy-widget/index.php b/packages/block-library/src/legacy-widget/index.php index 39e88c29dc1c3c..96d0ea82029ad7 100644 --- a/packages/block-library/src/legacy-widget/index.php +++ b/packages/block-library/src/legacy-widget/index.php @@ -101,26 +101,9 @@ function render_block_core_legacy_widget( $attributes ) { * Register legacy widget block. */ function register_block_core_legacy_widget() { - register_block_type( - 'core/legacy-widget', + register_block_type_from_metadata( + __DIR__ . '/legacy-widget', array( - 'attributes' => array( - 'widgetClass' => array( - 'type' => 'string', - ), - 'id' => array( - 'type' => 'string', - ), - 'idBase' => array( - 'type' => 'string', - ), - 'number' => array( - 'type' => 'number', - ), - 'instance' => array( - 'type' => 'object', - ), - ), 'render_callback' => 'render_block_core_legacy_widget', ) ); diff --git a/packages/block-library/src/media-text/editor.scss b/packages/block-library/src/media-text/editor.scss index 115fdfc564d34a..785966ae363d3d 100644 --- a/packages/block-library/src/media-text/editor.scss +++ b/packages/block-library/src/media-text/editor.scss @@ -42,7 +42,7 @@ grid-row: 1; } -.wp-block-media-text .block-editor-inner-blocks { +.wp-block-media-text > .block-editor-inner-blocks { word-break: break-word; grid-column: 2; grid-row: 1; diff --git a/packages/block-library/src/more/icon.js b/packages/block-library/src/more/icon.js deleted file mode 100644 index 3e24c0d3d471e0..00000000000000 --- a/packages/block-library/src/more/icon.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * WordPress dependencies - */ -import { G, Path, SVG } from '@wordpress/components'; - -export default ( - - - - - - -); diff --git a/packages/block-library/src/navigation-link/edit.js b/packages/block-library/src/navigation-link/edit.js index b20ca1e528eef6..60ebdb45a68c7a 100644 --- a/packages/block-library/src/navigation-link/edit.js +++ b/packages/block-library/src/navigation-link/edit.js @@ -212,7 +212,6 @@ function NavigationLinkEdit( {
diff --git a/packages/block-library/src/navigation/edit.js b/packages/block-library/src/navigation/edit.js index 357811b021c91a..79b610c42dfa3c 100644 --- a/packages/block-library/src/navigation/edit.js +++ b/packages/block-library/src/navigation/edit.js @@ -32,8 +32,7 @@ import { import { compose } from '@wordpress/compose'; import { __ } from '@wordpress/i18n'; import { menu } from '@wordpress/icons'; -import { addQueryArgs } from '@wordpress/url'; -import { useApiFetch } from '@wordpress/api-fetch'; + /** * Internal dependencies */ @@ -47,6 +46,9 @@ function Navigation( { clientId, fontSize, hasExistingNavItems, + hasResolvedPages, + isRequestingPages, + pages, setAttributes, setFontSize, updateNavItemBlocks, @@ -55,6 +57,7 @@ function Navigation( { // // HOOKS // + const ref = useRef(); const { selectBlock } = useDispatch( 'core/block-editor' ); const { TextColor, BackgroundColor, ColorPanel } = __experimentalUseColors( @@ -82,31 +85,9 @@ function Navigation( { clientId ); - const baseUrl = '/wp/v2/pages'; - - // "view" is required to ensure Pages are returned by REST API - // for users with lower capabilities such as "Contributor" otherwise - // Pages are not returned in the request if "edit" context is set - const context = 'view'; - - const filterDefaultPages = { - parent: 0, - order: 'asc', - orderby: 'id', - context, - }; - - const queryPath = addQueryArgs( baseUrl, filterDefaultPages ); - - const { isLoading: isRequestingPages, data: pages } = useApiFetch( - queryPath - ); - - const hasPages = !! pages; - // Builds navigation links from default Pages. const defaultPagesNavigationItems = useMemo( () => { - if ( ! hasPages ) { + if ( ! pages ) { return null; } @@ -146,6 +127,8 @@ function Navigation( { selectBlock( clientId ); } + const hasPages = hasResolvedPages && pages && pages.length; + const blockInlineStyles = { fontSize: fontSize.size ? fontSize.size + 'px' : undefined, }; @@ -307,8 +290,31 @@ export default compose( [ withSelect( ( select, { clientId } ) => { const innerBlocks = select( 'core/block-editor' ).getBlocks( clientId ); + const filterDefaultPages = { + parent: 0, + order: 'asc', + orderby: 'id', + }; + + const pagesSelect = [ + 'core', + 'getEntityRecords', + [ 'postType', 'page', filterDefaultPages ], + ]; + return { hasExistingNavItems: !! innerBlocks.length, + pages: select( 'core' ).getEntityRecords( + 'postType', + 'page', + filterDefaultPages + ), + isRequestingPages: select( 'core/data' ).isResolving( + ...pagesSelect + ), + hasResolvedPages: select( 'core/data' ).hasFinishedResolution( + ...pagesSelect + ), }; } ), withDispatch( ( dispatch, { clientId } ) => { diff --git a/packages/block-library/src/navigation/style.scss b/packages/block-library/src/navigation/style.scss index 0f824d083670a6..3c7488427ed76a 100644 --- a/packages/block-library/src/navigation/style.scss +++ b/packages/block-library/src/navigation/style.scss @@ -75,15 +75,16 @@ .wp-block-navigation-link__content { padding: $grid-unit-10 * 0.75 $grid-unit-10 * 2; - @include break-small { - width: max-content; - } - .has-text-color & { color: inherit; } } +.wp-block-navigation-link__label { + word-break: normal; + overflow-wrap: break-word; +} + .wp-block-navigation-link__submenu-icon { padding: $grid-unit-10 * 0.75 $grid-unit-10 * 2; diff --git a/packages/block-library/src/paragraph/edit.js b/packages/block-library/src/paragraph/edit.js index bcae630f0e5ac9..7a942e7301110c 100644 --- a/packages/block-library/src/paragraph/edit.js +++ b/packages/block-library/src/paragraph/edit.js @@ -15,6 +15,7 @@ import { RichText, __experimentalBlock as Block, getFontSize, + __experimentalUseEditorFeature as useEditorFeature, } from '@wordpress/block-editor'; import { createBlock } from '@wordpress/blocks'; import { useSelect } from '@wordpress/data'; @@ -55,9 +56,21 @@ function ParagraphRTLToolbar( { direction, setDirection } ) { ); } -function useDropCapMinimumHeight( isDropCap, deps ) { +function useDropCap( isDropCap, fontSize, styleFontSize ) { + const isDisabled = useEditorFeature( '__experimentalDisableDropCap' ); + const [ minimumHeight, setMinimumHeight ] = useState(); + + const { fontSizes } = useSelect( ( select ) => + select( 'core/block-editor' ).getSettings() + ); + + const fontSizeObject = getFontSize( fontSizes, fontSize, styleFontSize ); useEffect( () => { + if ( isDisabled ) { + return; + } + const element = querySelector( PARAGRAPH_DROP_CAP_SELECTOR ); if ( isDropCap && element ) { setMinimumHeight( @@ -66,8 +79,15 @@ function useDropCapMinimumHeight( isDropCap, deps ) { } else if ( minimumHeight ) { setMinimumHeight( undefined ); } - }, [ isDropCap, minimumHeight, setMinimumHeight, ...deps ] ); - return minimumHeight; + }, [ + isDisabled, + isDropCap, + minimumHeight, + setMinimumHeight, + fontSizeObject.size, + ] ); + + return [ ! isDisabled, minimumHeight ]; } function ParagraphBlock( { @@ -85,14 +105,12 @@ function ParagraphBlock( { fontSize, style, } = attributes; - const { fontSizes } = useSelect( ( select ) => - select( 'core/block-editor' ).getSettings() - ); const ref = useRef(); - const fontSizeObject = getFontSize( fontSizes, fontSize, style?.fontSize ); - const dropCapMinimumHeight = useDropCapMinimumHeight( dropCap, [ - fontSizeObject.size, - ] ); + const [ isDropCapEnabled, dropCapMinimumHeight ] = useDropCap( + dropCap, + fontSize, + style?.fontSize + ); const styles = { direction, @@ -116,20 +134,24 @@ function ParagraphBlock( { /> - - - setAttributes( { dropCap: ! dropCap } ) - } - help={ - dropCap - ? __( 'Showing large initial letter.' ) - : __( 'Toggle to show a large initial letter.' ) - } - /> - + { isDropCapEnabled && ( + + + setAttributes( { dropCap: ! dropCap } ) + } + help={ + dropCap + ? __( 'Showing large initial letter.' ) + : __( + 'Toggle to show a large initial letter.' + ) + } + /> + + ) } { 'Hello world!' }; +/** + * WordPress dependencies + */ +import { useSelect } from '@wordpress/data'; + +export default function PostTitleEdit( { context } ) { + const { postType, postId } = context; + + const post = useSelect( + ( select ) => + select( 'core' ).getEditedEntityRecord( + 'postType', + postType, + postId + ), + [ postType, postId ] + ); + + if ( ! post ) { + return null; + } + + return

{ post.title }

; } diff --git a/packages/block-library/src/post-title/index.php b/packages/block-library/src/post-title/index.php index d1b6f245b2e627..d6218034553f32 100644 --- a/packages/block-library/src/post-title/index.php +++ b/packages/block-library/src/post-title/index.php @@ -15,6 +15,7 @@ function render_block_core_post_title() { if ( ! $post ) { return ''; } + return '

' . get_the_title( $post ) . '

'; } diff --git a/packages/block-library/src/pullquote/editor.scss b/packages/block-library/src/pullquote/editor.scss index db0e7989f59507..89c66a518fcb2b 100644 --- a/packages/block-library/src/pullquote/editor.scss +++ b/packages/block-library/src/pullquote/editor.scss @@ -1,9 +1,7 @@ -.block-editor-block-list__block[data-type="core/pullquote"] { - &[data-align="left"], - &[data-align="right"] { - & p { - font-size: 20px; - } +.wp-block[data-align="left"] > .wp-block-pullquote, +.wp-block[data-align="right"] > .wp-block-pullquote { + & p { + font-size: 20px; } } diff --git a/packages/block-library/src/quote/edit.js b/packages/block-library/src/quote/edit.js index e2bfc902cc0359..4253a1ef6e16d9 100644 --- a/packages/block-library/src/quote/edit.js +++ b/packages/block-library/src/quote/edit.js @@ -71,6 +71,7 @@ export default function QuoteEdit( { __unstableOnSplitMiddle={ () => createBlock( 'core/paragraph' ) } + textAlign={ align } /> { ( ! RichText.isEmpty( citation ) || isSelected ) && ( ) } diff --git a/packages/block-library/src/rss/block.json b/packages/block-library/src/rss/block.json new file mode 100644 index 00000000000000..8b4805cc062ca3 --- /dev/null +++ b/packages/block-library/src/rss/block.json @@ -0,0 +1,45 @@ +{ + "name": "core/rss", + "category": "widgets", + "attributes": { + "align": { + "type": "string", + "enum": [ "left", "center", "right", "wide", "full" ] + }, + "className": { + "type": "string" + }, + "columns": { + "type": "number", + "default": 2 + }, + "blockLayout": { + "type": "string", + "default": "list" + }, + "feedURL": { + "type": "string", + "default": "" + }, + "itemsToShow": { + "type": "number", + "default": 5 + }, + "displayExcerpt": { + "type": "boolean", + "default": false + }, + "displayAuthor": { + "type": "boolean", + "default": false + }, + "displayDate": { + "type": "boolean", + "default": false + }, + "excerptLength": { + "type": "number", + "default": 55 + } + } +} diff --git a/packages/block-library/src/rss/edit.js b/packages/block-library/src/rss/edit.js index 5c0a2ac6c74956..9e8ebe788d9743 100644 --- a/packages/block-library/src/rss/edit.js +++ b/packages/block-library/src/rss/edit.js @@ -1,7 +1,7 @@ /** * WordPress dependencies */ -import { Component } from '@wordpress/element'; +import { BlockControls, InspectorControls } from '@wordpress/block-editor'; import { Button, Disabled, @@ -12,169 +12,148 @@ import { ToggleControl, ToolbarGroup, } from '@wordpress/components'; +import { useState } from '@wordpress/element'; +import { grid, list, pencil, rss } from '@wordpress/icons'; import { __ } from '@wordpress/i18n'; -import { BlockControls, InspectorControls } from '@wordpress/block-editor'; import ServerSideRender from '@wordpress/server-side-render'; -import { rss, pencil, grid, list } from '@wordpress/icons'; const DEFAULT_MIN_ITEMS = 1; const DEFAULT_MAX_ITEMS = 10; -class RSSEdit extends Component { - constructor() { - super( ...arguments ); +export default function RSSEdit( { attributes, setAttributes } ) { + const [ isEditing, setIsEditing ] = useState( ! attributes.feedURL ); - this.state = { - editing: ! this.props.attributes.feedURL, - }; + const { + blockLayout, + columns, + displayAuthor, + displayDate, + displayExcerpt, + excerptLength, + feedURL, + itemsToShow, + } = attributes; - this.toggleAttribute = this.toggleAttribute.bind( this ); - this.onSubmitURL = this.onSubmitURL.bind( this ); - } - - toggleAttribute( propName ) { + function toggleAttribute( propName ) { return () => { - const value = this.props.attributes[ propName ]; - const { setAttributes } = this.props; + const value = attributes[ propName ]; setAttributes( { [ propName ]: ! value } ); }; } - onSubmitURL( event ) { + function onSubmitURL( event ) { event.preventDefault(); - const { feedURL } = this.props.attributes; if ( feedURL ) { - this.setState( { editing: false } ); + setIsEditing( false ); } } - render() { - const { - blockLayout, - columns, - displayAuthor, - displayExcerpt, - displayDate, - excerptLength, - feedURL, - itemsToShow, - } = this.props.attributes; - const { setAttributes } = this.props; + if ( isEditing ) { + return ( + +
+ + setAttributes( { feedURL: value } ) + } + className="wp-block-rss__placeholder-input" + /> + + +
+ ); + } + + const toolbarControls = [ + { + icon: pencil, + title: __( 'Edit RSS URL' ), + onClick: () => setIsEditing( true ), + }, + { + icon: list, + title: __( 'List view' ), + onClick: () => setAttributes( { blockLayout: 'list' } ), + isActive: blockLayout === 'list', + }, + { + icon: grid, + title: __( 'Grid view' ), + onClick: () => setAttributes( { blockLayout: 'grid' } ), + isActive: blockLayout === 'grid', + }, + ]; - if ( this.state.editing ) { - return ( - -
- + + + + + + + setAttributes( { itemsToShow: value } ) + } + min={ DEFAULT_MIN_ITEMS } + max={ DEFAULT_MAX_ITEMS } + required + /> + + + + { displayExcerpt && ( + - setAttributes( { feedURL: value } ) + setAttributes( { excerptLength: value } ) } - className="blocks-rss__placeholder-input" + min={ 10 } + max={ 100 } + required /> - - -
- ); - } - - const toolbarControls = [ - { - icon: pencil, - title: __( 'Edit RSS URL' ), - onClick: () => this.setState( { editing: true } ), - }, - { - icon: list, - title: __( 'List view' ), - onClick: () => setAttributes( { blockLayout: 'list' } ), - isActive: blockLayout === 'list', - }, - { - icon: grid, - title: __( 'Grid view' ), - onClick: () => setAttributes( { blockLayout: 'grid' } ), - isActive: blockLayout === 'grid', - }, - ]; - - return ( - <> - - - - - + ) } + { blockLayout === 'grid' && ( - setAttributes( { itemsToShow: value } ) + setAttributes( { columns: value } ) } - min={ DEFAULT_MIN_ITEMS } - max={ DEFAULT_MAX_ITEMS } + min={ 2 } + max={ 6 } required /> - - - - { displayExcerpt && ( - - setAttributes( { excerptLength: value } ) - } - min={ 10 } - max={ 100 } - required - /> - ) } - { blockLayout === 'grid' && ( - - setAttributes( { columns: value } ) - } - min={ 2 } - max={ 6 } - required - /> - ) } - - - - - - - ); - } + ) } + + + + + + + ); } - -export default RSSEdit; diff --git a/packages/block-library/src/rss/editor.scss b/packages/block-library/src/rss/editor.scss index cff2b35ae36db6..7b08c85d3b55f8 100644 --- a/packages/block-library/src/rss/editor.scss +++ b/packages/block-library/src/rss/editor.scss @@ -8,7 +8,7 @@ display: inline; } -.blocks-rss__placeholder-form { +.wp-block-rss__placeholder-form { display: flex; align-items: stretch; @@ -23,7 +23,7 @@ } } -.blocks-rss__placeholder-input { +.wp-block-rss__placeholder-input { display: flex; align-items: stretch; flex-grow: 1; diff --git a/packages/block-library/src/rss/index.js b/packages/block-library/src/rss/index.js index 461bc6c59bff63..fc0144be2efb36 100644 --- a/packages/block-library/src/rss/index.js +++ b/packages/block-library/src/rss/index.js @@ -1,21 +1,23 @@ /** * WordPress dependencies */ -import { __ } from '@wordpress/i18n'; import { rss as icon } from '@wordpress/icons'; +import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ +import metadata from './block.json'; import edit from './edit'; -export const name = 'core/rss'; +const { name } = metadata; + +export { metadata, name }; export const settings = { title: __( 'RSS' ), description: __( 'Display entries from any RSS or Atom feed.' ), icon, - category: 'widgets', keywords: [ __( 'atom' ), __( 'feed' ) ], supports: { align: true, diff --git a/packages/block-library/src/rss/index.php b/packages/block-library/src/rss/index.php index 07ddb3d007e53e..f98f6343c121b2 100644 --- a/packages/block-library/src/rss/index.php +++ b/packages/block-library/src/rss/index.php @@ -92,57 +92,16 @@ function render_block_core_rss( $attributes ) { $class .= ' ' . $attributes['className']; } - return sprintf( "
    %s
", esc_attr( $class ), $list_items ); + return sprintf( '
    %s
', esc_attr( $class ), $list_items ); } /** * Registers the `core/rss` block on server. */ function register_block_core_rss() { - register_block_type( - 'core/rss', + register_block_type_from_metadata( + __DIR__ . '/rss', array( - 'attributes' => array( - 'align' => array( - 'type' => 'string', - 'enum' => array( 'left', 'center', 'right', 'wide', 'full' ), - ), - 'className' => array( - 'type' => 'string', - ), - 'columns' => array( - 'type' => 'number', - 'default' => 2, - ), - 'blockLayout' => array( - 'type' => 'string', - 'default' => 'list', - ), - 'feedURL' => array( - 'type' => 'string', - 'default' => '', - ), - 'itemsToShow' => array( - 'type' => 'number', - 'default' => 5, - ), - 'displayExcerpt' => array( - 'type' => 'boolean', - 'default' => false, - ), - 'displayAuthor' => array( - 'type' => 'boolean', - 'default' => false, - ), - 'displayDate' => array( - 'type' => 'boolean', - 'default' => false, - ), - 'excerptLength' => array( - 'type' => 'number', - 'default' => 55, - ), - ), 'render_callback' => 'render_block_core_rss', ) ); diff --git a/packages/block-library/src/social-link/edit.js b/packages/block-library/src/social-link/edit.js index 7d6dace9ef0c7a..3a02741fce0b15 100644 --- a/packages/block-library/src/social-link/edit.js +++ b/packages/block-library/src/social-link/edit.js @@ -33,11 +33,6 @@ const SocialLinkEdit = ( { attributes, setAttributes, isSelected } ) => { 'wp-social-link__is-incomplete': ! url, } ); - // Disable reason: The rule is currently not considering use as JSX tagName. - // - // See: https://github.com/WordPress/gutenberg/issues/16418 - - // eslint-disable-next-line @wordpress/no-unused-vars-before-return const IconComponent = getIconBySite( service ); const socialLinkName = getNameBySite( service ); diff --git a/packages/block-library/src/social-links/editor.scss b/packages/block-library/src/social-links/editor.scss index 878bd952a11863..d1a7018ffa3525 100644 --- a/packages/block-library/src/social-links/editor.scss +++ b/packages/block-library/src/social-links/editor.scss @@ -29,7 +29,7 @@ } // Center flex items. This has an equivalent in style.scss. -[data-type="core/social-links"][data-align="center"] .wp-block-social-links { +.wp-block[data-align="center"] > .wp-block-social-links { justify-content: center; } diff --git a/packages/block-library/src/style.scss b/packages/block-library/src/style.scss index 2cedc194e3b2e6..19b1d3208d4e52 100644 --- a/packages/block-library/src/style.scss +++ b/packages/block-library/src/style.scss @@ -260,3 +260,8 @@ #end-resizable-editor-section { display: none; } + +// Block alignments. +.aligncenter { + clear: both; +} diff --git a/packages/block-library/src/table/editor.scss b/packages/block-library/src/table/editor.scss index 6aedff7549c2d0..6a9ef15b19d27e 100644 --- a/packages/block-library/src/table/editor.scss +++ b/packages/block-library/src/table/editor.scss @@ -1,7 +1,7 @@ -.block-editor-block-list__block[data-type="core/table"] { - &[data-align="left"], - &[data-align="right"], - &[data-align="center"] { +.wp-block-table { + .wp-block[data-align="left"] > &, + .wp-block[data-align="right"] > &, + .wp-block[data-align="center"] > & { // Stop table block from collapsing when tables are floated. height: auto; @@ -16,7 +16,7 @@ } } - &[data-align="center"] { + .wp-block[data-align="center"] > & { text-align: initial; table { diff --git a/packages/block-library/src/tag-cloud/block.json b/packages/block-library/src/tag-cloud/block.json new file mode 100644 index 00000000000000..5f76ff7c11e36f --- /dev/null +++ b/packages/block-library/src/tag-cloud/block.json @@ -0,0 +1,21 @@ +{ + "name": "core/tag-cloud", + "category": "widgets", + "attributes": { + "align": { + "type": "string", + "enum": [ "left", "center", "right", "wide", "full" ] + }, + "className": { + "type": "string" + }, + "taxonomy": { + "type": "string", + "default": "post_tag" + }, + "showTagCounts": { + "type": "boolean", + "default": false + } + } +} diff --git a/packages/block-library/src/tag-cloud/index.js b/packages/block-library/src/tag-cloud/index.js index 62291e0ad81d45..32fbfbbb91c985 100644 --- a/packages/block-library/src/tag-cloud/index.js +++ b/packages/block-library/src/tag-cloud/index.js @@ -7,18 +7,21 @@ import { tag as icon } from '@wordpress/icons'; /** * Internal dependencies */ +import metadata from './block.json'; import edit from './edit'; -export const name = 'core/tag-cloud'; +const { name } = metadata; + +export { metadata, name }; export const settings = { title: __( 'Tag Cloud' ), description: __( 'A cloud of your most used tags.' ), icon, - category: 'widgets', supports: { html: false, align: true, }, + example: {}, edit, }; diff --git a/packages/block-library/src/tag-cloud/index.php b/packages/block-library/src/tag-cloud/index.php index cf9c4d24537dbd..419ef3477ed257 100644 --- a/packages/block-library/src/tag-cloud/index.php +++ b/packages/block-library/src/tag-cloud/index.php @@ -51,26 +51,9 @@ function render_block_core_tag_cloud( $attributes ) { * Registers the `core/tag-cloud` block on server. */ function register_block_core_tag_cloud() { - register_block_type( - 'core/tag-cloud', + register_block_type_from_metadata( + __DIR__ . '/tag-cloud', array( - 'attributes' => array( - 'align' => array( - 'type' => 'string', - 'enum' => array( 'left', 'center', 'right', 'wide', 'full' ), - ), - 'className' => array( - 'type' => 'string', - ), - 'taxonomy' => array( - 'type' => 'string', - 'default' => 'post_tag', - ), - 'showTagCounts' => array( - 'type' => 'boolean', - 'default' => false, - ), - ), 'render_callback' => 'render_block_core_tag_cloud', ) ); diff --git a/packages/block-library/src/template-part/edit/use-template-part-post.js b/packages/block-library/src/template-part/edit/use-template-part-post.js index bef260ffd3a7b1..7ef0f705da2dc9 100644 --- a/packages/block-library/src/template-part/edit/use-template-part-post.js +++ b/packages/block-library/src/template-part/edit/use-template-part-post.js @@ -26,20 +26,25 @@ export default function useTemplatePartPost( postId, slug, theme ) { 'postType', 'wp_template_part', { - status: 'auto-draft', + status: [ 'publish', 'auto-draft' ], slug, - meta: { theme }, + theme, } ); + const foundPosts = posts?.filter( + ( post ) => + post.slug === slug && + post.meta && + post.meta.theme === theme + ); + // A published post might already exist if this template part was customized elsewhere + // or if it's part of a customized template. const foundPost = - posts && - posts.find( - ( post ) => - post.slug === slug && - post.meta && - post.meta.theme === theme + foundPosts?.find( ( post ) => post.status === 'publish' ) || + foundPosts?.find( + ( post ) => post.status === 'auto-draft' ); - return foundPost && foundPost.id; + return foundPost?.id; } }, [ postId, slug, theme ] diff --git a/packages/block-library/src/template-part/index.php b/packages/block-library/src/template-part/index.php index 1a2c4403ba10f4..bf40670885f9d1 100644 --- a/packages/block-library/src/template-part/index.php +++ b/packages/block-library/src/template-part/index.php @@ -20,12 +20,29 @@ function render_block_core_template_part( $attributes ) { // is user-customized, render the corresponding post content. $content = get_post( $attributes['postId'] )->post_content; } elseif ( wp_get_theme()->get( 'TextDomain' ) === $attributes['theme'] ) { - // Else, if the template part was provided by the active theme, - // render the corresponding file content. - $template_part_file_path = - get_stylesheet_directory() . '/block-template-parts/' . $attributes['slug'] . '.html'; - if ( file_exists( $template_part_file_path ) ) { - $content = file_get_contents( $template_part_file_path ); + $template_part_query = new WP_Query( + array( + 'post_type' => 'wp_template_part', + 'post_status' => 'publish', + 'name' => $attributes['slug'], + 'meta_key' => 'theme', + 'meta_value' => $attributes['theme'], + 'posts_per_page' => 1, + 'no_found_rows' => true, + ) + ); + $template_part_post = $template_part_query->have_posts() ? $template_part_query->next_post() : null; + if ( $template_part_post ) { + // A published post might already exist if this template part was customized elsewhere + // or if it's part of a customized template. + $content = $template_part_post->post_content; + } else { + // Else, if the template part was provided by the active theme, + // render the corresponding file content. + $template_part_file_path = get_stylesheet_directory() . '/block-template-parts/' . $attributes['slug'] . '.html'; + if ( 0 === validate_file( $template_part_file_path ) && file_exists( $template_part_file_path ) ) { + $content = file_get_contents( $template_part_file_path ); + } } } @@ -39,7 +56,11 @@ function render_block_core_template_part( $attributes ) { $content = convert_smilies( $content ); $content = wpautop( $content ); $content = shortcode_unautop( $content ); - $content = wp_make_content_images_responsive( $content ); + if ( function_exists( 'wp_filter_content_tags' ) ) { + $content = wp_filter_content_tags( $content ); + } else { + $content = wp_make_content_images_responsive( $content ); + } $content = do_shortcode( $content ); return str_replace( ']]>', ']]>', $content ); @@ -49,20 +70,9 @@ function render_block_core_template_part( $attributes ) { * Registers the `core/template-part` block on the server. */ function register_block_core_template_part() { - register_block_type( - 'core/template-part', + register_block_type_from_metadata( + __DIR__ . '/template-part', array( - 'attributes' => array( - 'postId' => array( - 'type' => 'number', - ), - 'slug' => array( - 'type' => 'string', - ), - 'theme' => array( - 'type' => 'string', - ), - ), 'render_callback' => 'render_block_core_template_part', ) ); diff --git a/packages/block-library/src/verse/edit.js b/packages/block-library/src/verse/edit.js index 2c33afb53fd818..4ca8374fa08d20 100644 --- a/packages/block-library/src/verse/edit.js +++ b/packages/block-library/src/verse/edit.js @@ -46,6 +46,7 @@ export default function VerseEdit( { [ `has-text-align-${ textAlign }` ]: textAlign, } ) } onMerge={ mergeBlocks } + textAlign={ textAlign } /> ); diff --git a/packages/block-library/src/video/editor.scss b/packages/block-library/src/video/editor.scss index dd93768200fbb7..a9eca779a24c08 100644 --- a/packages/block-library/src/video/editor.scss +++ b/packages/block-library/src/video/editor.scss @@ -1,4 +1,4 @@ -.block-editor-block-list__block[data-align="center"] { +.wp-block[data-align="center"] > .wp-block-video { text-align: center; } diff --git a/packages/blocks/CHANGELOG.md b/packages/blocks/CHANGELOG.md index c44c5bb24fe715..9e6d1bbcf40fc7 100644 --- a/packages/blocks/CHANGELOG.md +++ b/packages/blocks/CHANGELOG.md @@ -1,6 +1,6 @@ ## Master -## 6.14.0 (2020-04-15) +## 6.13.0 (2020-04-01) ### New Feature diff --git a/packages/blocks/package.json b/packages/blocks/package.json index 2fc125781fde76..a5d684773e9eac 100644 --- a/packages/blocks/package.json +++ b/packages/blocks/package.json @@ -38,7 +38,7 @@ "hpq": "^1.3.0", "lodash": "^4.17.15", "rememo": "^3.0.0", - "showdown": "^1.8.6", + "showdown": "^1.9.1", "simple-html-tokenizer": "^0.5.7", "tinycolor2": "^1.4.1", "uuid": "^7.0.2" diff --git a/packages/components/README.md b/packages/components/README.md index fb82b7f526f860..a035497b5d59db 100644 --- a/packages/components/README.md +++ b/packages/components/README.md @@ -27,6 +27,8 @@ export default function MyButton() { } ``` -Many components also include styles which will need to be output in order to appear correctly. Within WordPress, you can [add the `wp-components` stylesheet as a dependency of your plugin's stylesheet](https://developer.wordpress.org/reference/functions/wp_enqueue_style/#parameters). In other projects, you can link to the `build-style/style.css` file directly. +Many components include CSS to add style, you will need to add in order to appear correctly. Within WordPress, add the `wp-components` stylesheet as a dependency of your plugin's stylesheet. See [wp_enqueue_style documentation](https://developer.wordpress.org/reference/functions/wp_enqueue_style/#parameters) for how to specify dependencies. + +In non-WordPress projects, link to the `build-style/style.css` file directly, it is located at `node_modules/@wordpress/components/build-style/style.css`.

Code is Poetry.

diff --git a/packages/components/src/animate/style.scss b/packages/components/src/animate/style.scss index b6932156b244ac..1d64423e42f1f0 100644 --- a/packages/components/src/animate/style.scss +++ b/packages/components/src/animate/style.scss @@ -36,6 +36,10 @@ &.is-from-left { transform: translateX(+100%); } + + &.is-from-right { + transform: translateX(-100%); + } } @keyframes components-animate__slide-in-animation { diff --git a/packages/components/src/button/style.scss b/packages/components/src/button/style.scss index 1ad73b8d4f142c..559d207972bb91 100644 --- a/packages/components/src/button/style.scss +++ b/packages/components/src/button/style.scss @@ -258,6 +258,23 @@ } } + // Toggled style. + &.is-pressed { + color: $white; + background: $dark-gray-primary; + + &:focus:not(:disabled) { + box-shadow: inset 0 0 0 1px $white, 0 0 0 $border-width-focus $theme-color; + + // Windows High Contrast mode will show this outline, but not the box-shadow. + outline: 2px solid transparent; + } + + &:hover:not(:disabled) { + background: $dark-gray-primary; + } + } + svg { fill: currentColor; outline: none; diff --git a/packages/components/src/custom-gradient-picker/control-points.js b/packages/components/src/custom-gradient-picker/control-points.js index b83093ef4475e1..7eaf9ecae250fe 100644 --- a/packages/components/src/custom-gradient-picker/control-points.js +++ b/packages/components/src/custom-gradient-picker/control-points.js @@ -214,7 +214,11 @@ export default function ControlPoints( { ) { return; } - onStartControlPointChange(); + if ( isOpen ) { + onStopControlPointChange(); + } else { + onStartControlPointChange(); + } onToggle(); } } onMouseDown={ () => { diff --git a/packages/components/src/custom-gradient-picker/custom-gradient-bar.js b/packages/components/src/custom-gradient-picker/custom-gradient-bar.js index 9b7a1a6527ada0..6bf81d83f0082a 100644 --- a/packages/components/src/custom-gradient-picker/custom-gradient-bar.js +++ b/packages/components/src/custom-gradient-picker/custom-gradient-bar.js @@ -51,8 +51,12 @@ function InsertPoint( {
Sidebar title plugin
"`; +exports[`Using Plugins API Sidebar Medium screen Should open plugins sidebar using More Menu item and render content 1`] = `"
(no title)
Sidebar title plugin
"`; -exports[`Using Plugins API Sidebar Should open plugins sidebar using More Menu item and render content 1`] = `"
(no title)
Sidebar title plugin
"`; +exports[`Using Plugins API Sidebar Should open plugins sidebar using More Menu item and render content 1`] = `"
(no title)
Sidebar title plugin
"`; diff --git a/packages/e2e-tests/specs/editor/plugins/block-context.test.js b/packages/e2e-tests/specs/editor/plugins/block-context.test.js new file mode 100644 index 00000000000000..9f933f8150cf6e --- /dev/null +++ b/packages/e2e-tests/specs/editor/plugins/block-context.test.js @@ -0,0 +1,113 @@ +/** + * External dependencies + */ +import { last } from 'lodash'; + +/** + * WordPress dependencies + */ +import { + activatePlugin, + createNewPost, + deactivatePlugin, + insertBlock, + saveDraft, +} from '@wordpress/e2e-test-utils'; + +async function openPreviewPage( editorPage ) { + let openTabs = await browser.pages(); + const expectedTabsCount = openTabs.length + 1; + await editorPage.click( '.block-editor-post-preview__button-toggle' ); + await editorPage.waitFor( '.edit-post-header-preview__button-external' ); + await editorPage.click( '.edit-post-header-preview__button-external' ); + + // Wait for the new tab to open. + while ( openTabs.length < expectedTabsCount ) { + await editorPage.waitFor( 1 ); + openTabs = await browser.pages(); + } + + const previewPage = last( openTabs ); + // Wait for the preview to load. We can't do interstitial detection here, + // because it might load too quickly for us to pick up, so we wait for + // the preview to load by waiting for the content to appear. + await previewPage.waitForSelector( '.entry-content' ); + return previewPage; +} + +describe( 'Block context', () => { + beforeAll( async () => { + await activatePlugin( 'gutenberg-test-block-context' ); + } ); + + beforeEach( async () => { + await createNewPost(); + } ); + + afterAll( async () => { + await deactivatePlugin( 'gutenberg-test-block-context' ); + } ); + + test( 'Block context propagates to inner blocks', async () => { + await insertBlock( 'Test Context Provider' ); + + // Inserting the context provider block should select the first inner + // block of the template. Verify the contents of the consumer. + let innerBlockText = await page.evaluate( + () => document.activeElement.textContent + ); + expect( innerBlockText ).toBe( 'The record ID is: 0' ); + + // Change the attribute value associated with the context. + await page.keyboard.press( 'ArrowUp' ); + await page.keyboard.type( '123' ); + + // Verify propagated context changes. + await page.keyboard.press( 'ArrowDown' ); + innerBlockText = await page.evaluate( + () => document.activeElement.textContent + ); + expect( innerBlockText ).toBe( 'The record ID is: 123' ); + } ); + + // Disable reason: Block context PHP implementation is temporarily reverted. + // This will be unskipped once the implementation is restored. Skipping was + // the most direct option for revert given time constraints. + + /* eslint-disable-next-line jest/no-disabled-tests */ + test.skip( 'Block context is reflected in the preview', async () => { + await insertBlock( 'Test Context Provider' ); + const editorPage = page; + const previewPage = await openPreviewPage( editorPage ); + + // Check default context values are populated. + let content = await previewPage.$eval( + '.entry-content', + ( contentWrapper ) => contentWrapper.textContent.trim() + ); + expect( content ).toBe( 'The record ID is: 0' ); + + // Return to editor to change context value to non-default. + await editorPage.bringToFront(); + await editorPage.focus( + '[data-type="gutenberg/test-context-provider"] input' + ); + await editorPage.keyboard.press( 'ArrowRight' ); + await editorPage.keyboard.type( '123' ); + await editorPage.waitForSelector( '.editor-post-save-draft' ); // Not entirely clear why it's asynchronous, but likely React scheduling prioritizing keyboard event and deferring the UI update. + await saveDraft(); + + // Check non-default context values are populated. + await previewPage.bringToFront(); + await previewPage.reload(); + content = await previewPage.$eval( + '.entry-content', + ( contentWrapper ) => contentWrapper.textContent.trim() + ); + expect( content ).toBe( 'The record ID is: 123' ); + + // Clean up + await editorPage.bringToFront(); + await previewPage.close(); + } ); +} ); diff --git a/packages/e2e-tests/specs/editor/plugins/block-icons.test.js b/packages/e2e-tests/specs/editor/plugins/block-icons.test.js index 2e5bcf666bb2bc..fd506d98fb3f7a 100644 --- a/packages/e2e-tests/specs/editor/plugins/block-icons.test.js +++ b/packages/e2e-tests/specs/editor/plugins/block-icons.test.js @@ -8,10 +8,11 @@ import { insertBlock, pressKeyWithModifier, searchForBlock, + openDocumentSettingsSidebar, } from '@wordpress/e2e-test-utils'; const INSERTER_BUTTON_SELECTOR = - '.components-popover__content .block-editor-block-types-list__item'; + '.block-editor-inserter__block-list .block-editor-block-types-list__item'; const INSERTER_ICON_WRAPPER_SELECTOR = `${ INSERTER_BUTTON_SELECTOR } .block-editor-block-types-list__item-icon`; const INSERTER_ICON_SELECTOR = `${ INSERTER_BUTTON_SELECTOR } .block-editor-block-icon`; const INSPECTOR_ICON_SELECTOR = '.edit-post-sidebar .block-editor-block-icon'; @@ -89,6 +90,7 @@ describe( 'Correctly Renders Block Icons on Inserter and Inspector', () => { it( 'Renders correctly the icon on the inspector', async () => { await insertBlock( blockTitle ); + await openDocumentSettingsSidebar(); await selectFirstBlock(); validateIcon( await getInnerHTML( INSPECTOR_ICON_SELECTOR ) ); } ); @@ -127,6 +129,7 @@ describe( 'Correctly Renders Block Icons on Inserter and Inspector', () => { it( 'Renders the icon in the inspector with the correct colors', async () => { await insertBlock( blockTitle ); + await openDocumentSettingsSidebar(); await selectFirstBlock(); validateDashIcon( await getInnerHTML( INSPECTOR_ICON_SELECTOR ) ); expect( @@ -153,6 +156,7 @@ describe( 'Correctly Renders Block Icons on Inserter and Inspector', () => { it( 'Renders correctly the icon on the inspector', async () => { await insertBlock( blockTitle ); + await openDocumentSettingsSidebar(); await selectFirstBlock(); validateSvgIcon( await getInnerHTML( INSPECTOR_ICON_SELECTOR ) ); expect( diff --git a/packages/e2e-tests/specs/editor/plugins/inner-blocks-allowed-blocks.test.js b/packages/e2e-tests/specs/editor/plugins/inner-blocks-allowed-blocks.test.js index ec7396b2dc30fc..1e02d4369f1b3b 100644 --- a/packages/e2e-tests/specs/editor/plugins/inner-blocks-allowed-blocks.test.js +++ b/packages/e2e-tests/specs/editor/plugins/inner-blocks-allowed-blocks.test.js @@ -7,8 +7,8 @@ import { deactivatePlugin, getAllBlockInserterItemTitles, insertBlock, - openAllBlockInserterCategories, openGlobalBlockInserter, + closeGlobalBlockInserter, } from '@wordpress/e2e-test-utils'; describe( 'Allowed Blocks Setting on InnerBlocks ', () => { @@ -30,11 +30,11 @@ describe( 'Allowed Blocks Setting on InnerBlocks ', () => { const parentBlockSelector = '[data-type="test/allowed-blocks-unset"]'; const childParagraphSelector = `${ parentBlockSelector } ${ paragraphSelector }`; await insertBlock( 'Allowed Blocks Unset' ); + await closeGlobalBlockInserter(); await page.waitForSelector( childParagraphSelector ); await page.click( childParagraphSelector ); await openGlobalBlockInserter(); - await openAllBlockInserterCategories(); - expect( + await expect( ( await getAllBlockInserterItemTitles() ).length ).toBeGreaterThan( 20 ); } ); @@ -43,10 +43,10 @@ describe( 'Allowed Blocks Setting on InnerBlocks ', () => { const parentBlockSelector = '[data-type="test/allowed-blocks-set"]'; const childParagraphSelector = `${ parentBlockSelector } ${ paragraphSelector }`; await insertBlock( 'Allowed Blocks Set' ); + await closeGlobalBlockInserter(); await page.waitForSelector( childParagraphSelector ); await page.click( childParagraphSelector ); await openGlobalBlockInserter(); - await openAllBlockInserterCategories(); expect( await getAllBlockInserterItemTitles() ).toEqual( [ 'Button', 'Gallery', @@ -58,12 +58,12 @@ describe( 'Allowed Blocks Setting on InnerBlocks ', () => { it( 'correctly applies dynamic allowed blocks restrictions', async () => { await insertBlock( 'Allowed Blocks Dynamic' ); + await closeGlobalBlockInserter(); const parentBlockSelector = '[data-type="test/allowed-blocks-dynamic"]'; const blockAppender = '.block-list-appender button'; const appenderSelector = `${ parentBlockSelector } ${ blockAppender }`; await page.waitForSelector( appenderSelector ); await page.click( appenderSelector ); - await openAllBlockInserterCategories(); expect( await getAllBlockInserterItemTitles() ).toEqual( [ 'Image', 'List', @@ -73,9 +73,9 @@ describe( 'Allowed Blocks Setting on InnerBlocks ', () => { )[ 0 ]; await insertButton.click(); await insertBlock( 'Image' ); + await closeGlobalBlockInserter(); await page.waitForSelector( '.product[data-number-of-children="2"]' ); await page.click( appenderSelector ); - await openAllBlockInserterCategories(); expect( await getAllBlockInserterItemTitles() ).toEqual( [ 'Gallery', 'Video', 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 ad27838a4a8ed1..137ac319a6800a 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 @@ -8,10 +8,10 @@ import { getAllBlockInserterItemTitles, getEditedPostContent, insertBlock, - openAllBlockInserterCategories, + closeGlobalBlockInserter, } from '@wordpress/e2e-test-utils'; -const INSERTER_RESULTS_SELECTOR = '.block-editor-inserter__results'; +const INSERTER_RESULTS_SELECTOR = '.block-editor-inserter__block-list'; const QUOTE_INSERT_BUTTON_SELECTOR = '//button[.="Quote"]'; const APPENDER_SELECTOR = '.my-custom-awesome-appender'; const DYNAMIC_APPENDER_SELECTOR = 'my-dynamic-blocks-appender'; @@ -32,6 +32,7 @@ describe( 'RenderAppender prop of InnerBlocks ', () => { it( 'Users can customize the appender and can still insert blocks using exposed components', async () => { // Insert the InnerBlocks renderAppender block. await insertBlock( 'InnerBlocks renderAppender' ); + await closeGlobalBlockInserter(); // Wait for the custom block appender to appear. await page.waitForSelector( APPENDER_SELECTOR ); // Verify if the custom block appender text is the expected one. @@ -46,8 +47,6 @@ describe( 'RenderAppender prop of InnerBlocks ', () => { await page.click( `${ APPENDER_SELECTOR } .block-editor-button-block-appender` ); - await openAllBlockInserterCategories(); - // Verify if the blocks the custom inserter is rendering are the expected ones. expect( await getAllBlockInserterItemTitles() ).toEqual( [ 'Quote', @@ -69,6 +68,7 @@ describe( 'RenderAppender prop of InnerBlocks ', () => { it( 'Users can dynamically customize the appender', async () => { // Insert the InnerBlocks renderAppender dynamic block. await insertBlock( 'InnerBlocks renderAppender dynamic' ); + await closeGlobalBlockInserter(); // Wait for the custom dynamic block appender to appear. await page.waitForSelector( '.' + DYNAMIC_APPENDER_SELECTOR ); @@ -81,7 +81,6 @@ describe( 'RenderAppender prop of InnerBlocks ', () => { // Open the inserter of our custom block appender and expand all the categories. const blockAppenderButtonSelector = `.${ DYNAMIC_APPENDER_SELECTOR } .block-editor-button-block-appender`; await page.click( blockAppenderButtonSelector ); - await openAllBlockInserterCategories(); // Verify if the blocks the custom inserter is rendering are the expected ones. expect( await getAllBlockInserterItemTitles() ).toEqual( [ 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 627d3a7493f078..f4a385885e09f9 100644 --- a/packages/e2e-tests/specs/editor/plugins/plugins-api.test.js +++ b/packages/e2e-tests/specs/editor/plugins/plugins-api.test.js @@ -67,6 +67,9 @@ describe( 'Using Plugins API', () => { } ); describe( 'Sidebar', () => { + const SIDEBAR_PINNED_ITEM_BUTTON = + '.interface-pinned-items button[aria-label="Sidebar title plugin"]'; + const SIDEBAR_PANEL_SELECTOR = '.sidebar-title-plugin-panel'; it( 'Should open plugins sidebar using More Menu item and render content', async () => { await clickOnMoreMenuItem( 'Sidebar title plugin' ); @@ -77,6 +80,36 @@ describe( 'Using Plugins API', () => { expect( pluginSidebarContent ).toMatchSnapshot(); } ); + it( 'Should be pinned by default and can be opened and closed using pinned items', async () => { + const sidebarPinnedItem = await page.$( + SIDEBAR_PINNED_ITEM_BUTTON + ); + expect( sidebarPinnedItem ).not.toBeNull(); + await sidebarPinnedItem.click(); + expect( await page.$( SIDEBAR_PANEL_SELECTOR ) ).not.toBeNull(); + await sidebarPinnedItem.click(); + expect( await page.$( SIDEBAR_PANEL_SELECTOR ) ).toBeNull(); + } ); + + it( 'Can be pinned and unpinned', async () => { + await ( await page.$( SIDEBAR_PINNED_ITEM_BUTTON ) ).click(); + const unpinButton = await page.$( + 'button[aria-label="Unpin from toolbar"]' + ); + await unpinButton.click(); + expect( await page.$( SIDEBAR_PINNED_ITEM_BUTTON ) ).toBeNull(); + await page.click( + '.interface-complementary-area-header button[aria-label="Close plugin"]' + ); + await page.reload(); + 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(); + expect( await page.$( SIDEBAR_PINNED_ITEM_BUTTON ) ).not.toBeNull(); + } ); + it( 'Should close plugins sidebar using More Menu item', async () => { await clickOnMoreMenuItem( 'Sidebar title plugin' ); diff --git a/packages/e2e-tests/specs/editor/various/a11y.test.js b/packages/e2e-tests/specs/editor/various/a11y.test.js index 0ca44d7fb7114a..a25b5d9760c3ce 100644 --- a/packages/e2e-tests/specs/editor/various/a11y.test.js +++ b/packages/e2e-tests/specs/editor/various/a11y.test.js @@ -23,7 +23,7 @@ describe( 'a11y', () => { ':focus', ( focusedElement ) => { return focusedElement.classList.contains( - 'block-editor-inserter__toggle' + 'edit-post-header-toolbar__inserter-toggle' ); } ); 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 11f78fe278ab8a..65fd287650b462 100644 --- a/packages/e2e-tests/specs/editor/various/adding-blocks.test.js +++ b/packages/e2e-tests/specs/editor/various/adding-blocks.test.js @@ -6,8 +6,8 @@ import { insertBlock, getEditedPostContent, pressKeyTimes, - switchEditorModeTo, setBrowserViewport, + closeGlobalBlockInserter, } from '@wordpress/e2e-test-utils'; /** @typedef {import('puppeteer').ElementHandle} ElementHandle */ @@ -92,6 +92,7 @@ describe( 'adding blocks', () => { // Unselect blocks to avoid conflicts with the inbetween inserter await page.click( '.editor-post-title__input' ); + await closeGlobalBlockInserter(); // Using the between inserter const insertionPoint = await page.$( '[data-type="core/quote"]' ); @@ -111,16 +112,14 @@ describe( 'adding blocks', () => { () => document.activeElement && document.activeElement.classList.contains( - 'block-editor-inserter__search' + 'block-editor-inserter__search-input' ) ); await page.keyboard.type( 'para' ); - await pressKeyTimes( 'Tab', 3 ); + await pressKeyTimes( 'Tab', 4 ); await page.keyboard.press( 'Enter' ); await page.keyboard.type( 'Second paragraph' ); - await switchEditorModeTo( 'Code' ); - expect( await getEditedPostContent() ).toMatchSnapshot(); } ); @@ -137,7 +136,7 @@ describe( 'adding blocks', () => { () => document.activeElement.classList ); expect( Object.values( activeElementClassList ) ).toContain( - 'block-editor-inserter__search' + 'block-editor-inserter__search-input' ); // Try using the up arrow key (vertical navigation triggers the issue described in #9583). @@ -148,29 +147,30 @@ describe( 'adding blocks', () => { () => document.activeElement.classList ); expect( Object.values( activeElementClassList ) ).toContain( - 'block-editor-inserter__search' + 'block-editor-inserter__search-input' ); - // Tab to the block search results + // Tab to the block list + await page.keyboard.press( 'Tab' ); await page.keyboard.press( 'Tab' ); - // Expect the search results to be the active element. + // Expect the block list to be the active element. activeElementClassList = await page.evaluate( () => document.activeElement.classList ); expect( Object.values( activeElementClassList ) ).toContain( - 'block-editor-inserter__results' + 'block-editor-block-types-list__item' ); // Try using the up arrow key await page.keyboard.press( 'ArrowUp' ); - // Expect the search results to still be the active element. + // Expect the block list to still be the active element. activeElementClassList = await page.evaluate( () => document.activeElement.classList ); expect( Object.values( activeElementClassList ) ).toContain( - 'block-editor-inserter__results' + 'block-editor-block-types-list__item' ); // Press escape to close the block inserter. 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 5aab0d85e31b91..63ae6d57ecd1fb 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 @@ -7,6 +7,7 @@ import { getEditedPostContent, pressKeyTimes, pressKeyWithModifier, + openDocumentSettingsSidebar, } from '@wordpress/e2e-test-utils'; async function openBlockNavigator() { @@ -43,6 +44,7 @@ describe( 'Navigating the block hierarchy', () => { await columnsBlockMenuItem.click(); // Tweak the columns count. + await openDocumentSettingsSidebar(); await page.focus( '.block-editor-block-inspector .components-range-control__number[aria-label="Columns"]' ); @@ -73,6 +75,7 @@ describe( 'Navigating the block hierarchy', () => { it( 'should navigate block hierarchy using only the keyboard', async () => { await insertBlock( 'Columns' ); + await openDocumentSettingsSidebar(); await page.click( '[aria-label="Two columns; equal split"]' ); // Add a paragraph in the first column. 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 12c40442195160..c330f8680af551 100644 --- a/packages/e2e-tests/specs/editor/various/block-switcher.test.js +++ b/packages/e2e-tests/specs/editor/various/block-switcher.test.js @@ -9,7 +9,7 @@ import { pressKeyWithModifier, } from '@wordpress/e2e-test-utils'; -describe( 'adding blocks', () => { +describe( 'Block Switcher', () => { beforeEach( async () => { await createNewPost(); } ); 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 15d767cd6cc2c9..6aef17cd69594d 100644 --- a/packages/e2e-tests/specs/editor/various/editor-modes.test.js +++ b/packages/e2e-tests/specs/editor/various/editor-modes.test.js @@ -146,7 +146,7 @@ describe( 'Editing modes (visual/HTML)', () => { // The inserter is disabled const disabledInserter = await page.$( - '.block-editor-inserter > button:disabled, .block-editor-inserter > button[aria-disabled="true"]' + '.edit-post-header-toolbar__inserter-toggle:disabled, .edit-post-header-toolbar__inserter-toggle[aria-disabled="true"]' ); expect( disabledInserter ).not.toBeNull(); } ); 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 8f3854fb8ef4f1..8f7d6818d380d3 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 @@ -22,6 +22,7 @@ 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 ) => { @@ -38,7 +39,7 @@ const tabThroughParagraphBlock = async ( paragraphText ) => { ).toBe( paragraphText ); await page.keyboard.press( 'Tab' ); - await expect( await getActiveLabel() ).toBe( 'Document' ); + await expect( await getActiveLabel() ).toBe( 'Open document settings' ); }; const tabThroughBlockMoverControl = async () => { @@ -133,7 +134,7 @@ describe( 'Order of block keyboard navigation', () => { ); await page.keyboard.press( 'Tab' ); - await expect( await getActiveLabel() ).toBe( 'Document (selected)' ); + await expect( await getActiveLabel() ).toBe( 'Open document settings' ); } ); it( 'allows tabbing in navigation mode if no block is selected (reverse)', async () => { diff --git a/packages/e2e-tests/specs/editor/various/links.test.js b/packages/e2e-tests/specs/editor/various/links.test.js index c0df0b5f31f8fd..b1b7aa3b208e07 100644 --- a/packages/e2e-tests/specs/editor/various/links.test.js +++ b/packages/e2e-tests/specs/editor/various/links.test.js @@ -152,6 +152,9 @@ describe( 'Links', () => { await pressKeyWithModifier( 'shiftAlt', 'ArrowLeft' ); await pressKeyWithModifier( 'shiftAlt', 'ArrowLeft' ); await pressKeyWithModifier( 'shiftAlt', 'ArrowLeft' ); + await pressKeyWithModifier( 'shiftAlt', 'ArrowLeft' ); + await pressKeyWithModifier( 'shiftAlt', 'ArrowLeft' ); + await pressKeyWithModifier( 'shiftAlt', 'ArrowLeft' ); // Click on the Link button await page.click( 'button[aria-label="Link"]' ); @@ -200,6 +203,9 @@ describe( 'Links', () => { // Click on the Submit button await page.keyboard.press( 'Enter' ); + + // Reselect the link. + await pressKeyWithModifier( 'shiftAlt', 'ArrowLeft' ); }; it( 'can be edited', async () => { @@ -490,13 +496,6 @@ describe( 'Links', () => { await waitForAutoFocus(); await page.keyboard.type( 'w.org' ); - // Insert the link - await page.keyboard.press( 'Enter' ); - - // Navigate back to the popover - await pressKeyWithModifier( 'primary', 'k' ); - await waitForAutoFocus(); - // Navigate to and toggle the "Open in new tab" checkbox. await page.keyboard.press( 'Tab' ); await page.keyboard.press( 'Tab' ); @@ -508,7 +507,8 @@ describe( 'Links', () => { // Close dialog. Expect that "Open in new tab" would have been applied // immediately. - await page.keyboard.press( 'Escape' ); + await page.keyboard.press( 'Tab' ); + await page.keyboard.press( 'Enter' ); expect( await getEditedPostContent() ).toMatchSnapshot(); @@ -519,9 +519,10 @@ describe( 'Links', () => { // // See: https://github.com/WordPress/gutenberg/pull/15573 - // Collapse selection. + // Move caret back into the link. await page.keyboard.press( 'ArrowLeft' ); - await page.keyboard.press( 'ArrowRight' ); + await page.keyboard.press( 'ArrowLeft' ); + // Edit link. await pressKeyWithModifier( 'primary', 'k' ); await waitForAutoFocus(); @@ -532,6 +533,10 @@ describe( 'Links', () => { await page.keyboard.press( 'Enter' ); // Navigate back to the popover + await page.keyboard.press( 'ArrowLeft' ); + await page.keyboard.press( 'ArrowLeft' ); + + // Navigate back to inputs to verify appears as changed. await pressKeyWithModifier( 'primary', 'k' ); await waitForAutoFocus(); diff --git a/packages/e2e-tests/specs/editor/various/preview.test.js b/packages/e2e-tests/specs/editor/various/preview.test.js index c45e7cced2e7b4..e53cc7f742426c 100644 --- a/packages/e2e-tests/specs/editor/various/preview.test.js +++ b/packages/e2e-tests/specs/editor/various/preview.test.js @@ -22,9 +22,9 @@ import { async function openPreviewPage( editorPage ) { let openTabs = await browser.pages(); const expectedTabsCount = openTabs.length + 1; - await editorPage.click( '.editor-post-preview__button-toggle' ); - await editorPage.waitFor( '.editor-post-preview__button-external' ); - await editorPage.click( '.editor-post-preview__button-external' ); + await editorPage.click( '.block-editor-post-preview__button-toggle' ); + await editorPage.waitFor( '.edit-post-header-preview__button-external' ); + await editorPage.click( '.edit-post-header-preview__button-external' ); // Wait for the new tab to open. while ( openTabs.length < expectedTabsCount ) { @@ -49,9 +49,9 @@ async function openPreviewPage( editorPage ) { * @return {Promise} Promise resolving once selector is visible on page. */ async function waitForPreviewDropdownOpen( editorPage ) { - await editorPage.click( '.editor-post-preview__button-toggle' ); + await editorPage.click( '.block-editor-post-preview__button-toggle' ); return editorPage.waitForSelector( - '.editor-post-preview__button-external' + '.edit-post-header-preview__button-external' ); } @@ -64,7 +64,7 @@ async function waitForPreviewDropdownOpen( editorPage ) { * @return {Promise} Promise resolving once navigation completes. */ async function waitForPreviewNavigation( previewPage ) { - await page.click( '.editor-post-preview__button-external' ); + await page.click( '.edit-post-header-preview__button-external' ); return previewPage.waitForNavigation(); } @@ -115,7 +115,7 @@ describe( 'Preview', () => { // Disabled until content present. const isPreviewDisabled = await editorPage.$$eval( - '.editor-post-preview__button-toggle:not( :disabled ):not( [aria-disabled="true"] )', + '.block-editor-post-preview__button-toggle:not( :disabled ):not( [aria-disabled="true"] )', ( enabledButtons ) => ! enabledButtons.length ); expect( isPreviewDisabled ).toBe( true ); @@ -342,10 +342,10 @@ describe( 'Preview with private custom post type', () => { await page.keyboard.press( 'Tab' ); // Open the preview menu. - await page.click( '.editor-post-preview__button-toggle' ); + await page.click( '.block-editor-post-preview__button-toggle' ); const previewDropdownContents = await page.$( - '.editor-post-preview__dropdown-content' + '.block-editor-post-preview__dropdown-content' ); // Expect the Preview Externally link not to be present. 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 291e5852ce34e4..f57b1f96c3a73e 100644 --- a/packages/e2e-tests/specs/editor/various/reusable-blocks.test.js +++ b/packages/e2e-tests/specs/editor/various/reusable-blocks.test.js @@ -164,6 +164,56 @@ describe( 'Reusable blocks', () => { expect( text ).toMatch( 'Oh! Hello there!' ); } ); + it( 'can be inserted after refresh', async () => { + // Step 1. Insert a paragraph block + + await insertBlock( 'Paragraph' ); + await page.keyboard.type( 'Awesome Paragraph' ); + + await clickBlockToolbarButton( 'More options' ); + + const convertButton = await page.waitForXPath( + '//button[text()="Add to Reusable blocks"]' + ); + await convertButton.click(); + + // Wait for creation to finish + await page.waitForXPath( + '//*[contains(@class, "components-snackbar")]/*[text()="Block created."]' + ); + + // Select all of the text in the title field. + await pressKeyWithModifier( 'primary', 'a' ); + + // Give the reusable block a title + await page.keyboard.type( 'Awesome block' ); + + // Save the reusable block + const [ saveButton ] = await page.$x( '//button[text()="Save"]' ); + await saveButton.click(); + + // Step 2. Create new post. + + await createNewPost(); + + // Step 3. Insert the block created in Step 1. + + await insertBlock( 'Awesome block' ); + + // Check that we have a reusable block on the page + const block = await page.$( + '.block-editor-block-list__block[data-type="core/block"]' + ); + expect( block ).not.toBeNull(); + + // Check that its title is displayed + const title = await page.$eval( + '.reusable-block-edit-panel__info', + ( element ) => element.innerText + ); + expect( title ).toBe( 'Awesome block' ); + } ); + it( 'can be converted to a regular block', async () => { // Insert the reusable block we edited above await insertBlock( 'Surprised greeting block' ); 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 cd3fa85e62fdcf..e29475984b7f88 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, + openDocumentSettingsSidebar, } from '@wordpress/e2e-test-utils'; describe( 'RichText', () => { @@ -22,6 +23,7 @@ describe( 'RichText', () => { // // See: https://github.com/WordPress/gutenberg/issues/3091 await insertBlock( 'Heading' ); + await openDocumentSettingsSidebar(); await page.click( '[aria-label="Heading 3"]' ); expect( await getEditedPostContent() ).toMatchSnapshot(); 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 d06176cc7de460..7a379731f8789a 100644 --- a/packages/e2e-tests/specs/editor/various/writing-flow.test.js +++ b/packages/e2e-tests/specs/editor/various/writing-flow.test.js @@ -39,7 +39,9 @@ describe( 'Writing Flow', () => { 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' ); + await page.waitForSelector( + ':focus.block-editor-inserter__search-input' + ); await page.keyboard.type( 'Paragraph' ); await pressKeyTimes( 'Tab', 3 ); // Tab to paragraph result. await page.keyboard.press( 'Enter' ); // Insert paragraph. @@ -50,7 +52,9 @@ describe( 'Writing Flow', () => { // is a temporary solution. await page.focus( '.wp-block[data-type="core/column"]:nth-child(2)' ); await page.click( ':focus .block-editor-button-block-appender' ); - await page.waitForSelector( ':focus.block-editor-inserter__search' ); + await page.waitForSelector( + ':focus.block-editor-inserter__search-input' + ); await page.keyboard.type( 'Paragraph' ); await pressKeyTimes( 'Tab', 3 ); // Tab to paragraph result. await page.keyboard.press( 'Enter' ); // Insert paragraph. 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 9f98918c20868b..20f7611b05341e 100644 --- a/packages/e2e-tests/specs/experiments/multi-entity-saving.test.js +++ b/packages/e2e-tests/specs/experiments/multi-entity-saving.test.js @@ -17,17 +17,34 @@ import { enableExperimentalFeatures, disableExperimentalFeatures, } from '../../experimental-features'; +import { trashExistingPosts } from '../../config/setup-test-framework'; describe( 'Multi-entity save flow', () => { // Selectors. - const checkboxSelector = '.components-checkbox-control__checked'; - const templatePartSelector = '*[data-type="core/template-part"]'; - const saveButtonSelector = '.editor-post-publish-button__button'; - const multisaveSelector = - '.editor-post-publish-button__button.has-changes-dot'; + const checkedBoxSelector = '.components-checkbox-control__checked'; + const checkboxInputSelector = '.components-checkbox-control__input'; + const demoTemplateSelector = '//button[contains(., "front-page")]'; + const draftSavedSelector = '.editor-post-saved-state.is-saved'; const entitiesSaveSelector = '.editor-entities-saved-states__save-button'; + const multiSaveSelector = + '.editor-post-publish-button__button.has-changes-dot'; + const savePostSelector = '.editor-post-publish-button__button'; + const disabledSavePostSelector = `${ savePostSelector }[aria-disabled=true]`; + const enabledSavePostSelector = `${ savePostSelector }[aria-disabled=false]`; const saveSiteSelector = '.edit-site-save-button__button'; - + const activeSaveSiteSelector = `${ saveSiteSelector }[aria-disabled=false]`; + const disabledSaveSiteSelector = `${ saveSiteSelector }[aria-disabled=true]`; + const templateDropdownSelector = + '.components-dropdown-menu__toggle[aria-label="Switch Template"]'; + const templatePartSelector = '*[data-type="core/template-part"]'; + const activatedTemplatePartSelector = `${ templatePartSelector } .block-editor-inner-blocks`; + + // Reusable assertions across Post/Site editors. + const assertAllBoxesChecked = async () => { + const checkedBoxes = await page.$$( checkedBoxSelector ); + const checkboxInputs = await page.$$( checkboxInputSelector ); + expect( checkedBoxes.length - checkboxInputs.length ).toBe( 0 ); + }; // Setup & Teardown. const requiredExperiments = [ '#gutenberg-full-site-editing', @@ -35,21 +52,23 @@ describe( 'Multi-entity save flow', () => { ]; beforeAll( async () => { await enableExperimentalFeatures( requiredExperiments ); + await trashExistingPosts( 'wp_template' ); + await trashExistingPosts( 'wp_template_part' ); } ); afterAll( async () => { await disableExperimentalFeatures( requiredExperiments ); } ); describe( 'Post Editor', () => { + // Reusable assertions inside Post editor. const assertMultiSaveEnabled = async () => { const multiSaveButton = await page.waitForSelector( - multisaveSelector + multiSaveSelector ); expect( multiSaveButton ).not.toBeNull(); }; - const assertMultiSaveDisabled = async () => { - const multiSaveButton = await page.$( multisaveSelector ); + const multiSaveButton = await page.$( multiSaveSelector ); expect( multiSaveButton ).toBeNull(); }; @@ -75,9 +94,7 @@ describe( 'Multi-entity save flow', () => { await page.keyboard.press( 'Enter' ); // Make some changes in new Template Part. - await page.waitForSelector( - `${ templatePartSelector } .block-editor-inner-blocks` - ); + await page.waitForSelector( activatedTemplatePartSelector ); await page.click( templatePartSelector ); await page.keyboard.type( 'some words...' ); @@ -85,9 +102,8 @@ describe( 'Multi-entity save flow', () => { } ); it( 'Clicking should open modal with boxes checked by default', async () => { - await page.click( saveButtonSelector ); - const checkedBoxes = await page.$$( checkboxSelector ); - expect( checkedBoxes.length ).toBe( 2 ); + await page.click( savePostSelector ); + await assertAllBoxesChecked(); } ); it( 'Saving should result in items being saved', async () => { @@ -95,7 +111,7 @@ describe( 'Multi-entity save flow', () => { // Verify post is saved. const draftSaved = await page.waitForSelector( - '.editor-post-saved-state.is-saved' + draftSavedSelector ); expect( draftSaved ).not.toBeNull(); @@ -108,7 +124,7 @@ describe( 'Multi-entity save flow', () => { it( 'Update button disabled after publish', async () => { await publishPostWithPrePublishChecksDisabled(); const disabledSaveButton = await page.$( - `${ saveButtonSelector }[aria-disabled=true]` + disabledSavePostSelector ); expect( disabledSaveButton ).not.toBeNull(); } ); @@ -119,7 +135,7 @@ describe( 'Multi-entity save flow', () => { // Verify update button is enabled. const enabledSaveButton = await page.$( - `${ saveButtonSelector }[aria-disabled=false]` + enabledSavePostSelector ); expect( enabledSaveButton ).not.toBeNull(); @@ -136,43 +152,42 @@ describe( 'Multi-entity save flow', () => { } ); } ); - describe.skip( 'Site Editor', () => { - async function assertSaveDisabled() { - const disabledButton = await page.waitForSelector( - `${ saveSiteSelector }[aria-disabled=true]` - ); - expect( disabledButton ).not.toBeNull(); - } - const activeButtonSelector = `${ saveSiteSelector }[aria-disabled=false]`; - - it( 'Save button should be disabled by default', async () => { + describe( 'Site Editor', () => { + it( 'Should be enabled after edits', async () => { // Navigate to site editor. const query = addQueryArgs( '', { page: 'gutenberg-edit-site', } ).slice( 1 ); await visitAdminPage( 'admin.php', query ); - await assertSaveDisabled(); - } ); + // Ensure we are on 'front-page' demo template. + await page.click( templateDropdownSelector ); + const [ demoTemplateButton ] = await page.$x( + demoTemplateSelector + ); + await demoTemplateButton.click(); + + // Insert a new template part placeholder. + await insertBlock( 'Template Part' ); - it( 'Should be enabled after edits', async () => { - await page.click( templatePartSelector ); - await page.keyboard.type( 'some words...' ); const enabledButton = await page.waitForSelector( - activeButtonSelector + activeSaveSiteSelector ); + expect( enabledButton ).not.toBeNull(); } ); it( 'Clicking button should open modal with boxes checked', async () => { - await page.click( activeButtonSelector ); - const checkedBoxes = await page.$$( checkboxSelector ); - expect( checkedBoxes ).not.toHaveLength( 0 ); + await page.click( activeSaveSiteSelector ); + await assertAllBoxesChecked(); } ); it( 'Saving should result in items being saved', async () => { await page.click( entitiesSaveSelector ); - await assertSaveDisabled(); + const disabledButton = await page.waitForSelector( + disabledSaveSiteSelector + ); + expect( disabledButton ).not.toBeNull(); } ); } ); } ); diff --git a/packages/e2e-tests/specs/experiments/navigation.test.js b/packages/e2e-tests/specs/experiments/navigation.test.js index dab5989d0439ab..948158e30dbd4c 100644 --- a/packages/e2e-tests/specs/experiments/navigation.test.js +++ b/packages/e2e-tests/specs/experiments/navigation.test.js @@ -312,6 +312,7 @@ describe( 'Navigation', () => { document.activeElement.innerText === 'A really long page name that will not exist' ); + expect( isInLinkRichText ).toBe( true ); // Expect a Navigation Block with a link for "A really long page name that will not exist". diff --git a/packages/e2e-tests/specs/experiments/template-part.test.js b/packages/e2e-tests/specs/experiments/template-part.test.js new file mode 100644 index 00000000000000..4a65b6c9c6f357 --- /dev/null +++ b/packages/e2e-tests/specs/experiments/template-part.test.js @@ -0,0 +1,168 @@ +/** + * WordPress dependencies + */ +import { + createNewPost, + insertBlock, + disablePrePublishChecks, + visitAdminPage, + pressKeyWithModifier, +} from '@wordpress/e2e-test-utils'; +import { addQueryArgs } from '@wordpress/url'; + +/** + * Internal dependencies + */ +import { + enableExperimentalFeatures, + disableExperimentalFeatures, +} from '../../experimental-features'; +import { trashExistingPosts } from '../../config/setup-test-framework'; + +describe( 'Template Part', () => { + beforeAll( async () => { + await enableExperimentalFeatures( [ + '#gutenberg-full-site-editing', + '#gutenberg-full-site-editing-demo', + ] ); + await trashExistingPosts( 'wp_template' ); + await trashExistingPosts( 'wp_template_part' ); + } ); + afterAll( async () => { + await trashExistingPosts( 'wp_template' ); + await trashExistingPosts( 'wp_template_part' ); + await disableExperimentalFeatures( [ + '#gutenberg-full-site-editing', + '#gutenberg-full-site-editing-demo', + ] ); + } ); + + describe( 'Template part block', () => { + beforeEach( () => + visitAdminPage( + 'admin.php', + addQueryArgs( '', { + page: 'gutenberg-edit-site', + } ).slice( 1 ) + ) + ); + + 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. + await page.click( + '.components-dropdown-menu__toggle[aria-label="Switch Template"]' + ); + const [ switchToHeaderTemplatePartButton ] = await page.$x( + '//button[contains(text(), "header")]' + ); + await switchToHeaderTemplatePartButton.click(); + + // Edit it. + await page.click( '*[data-type="core/paragraph"]' ); + await pressKeyWithModifier( 'primary', 'ArrowRight' ); + await page.keyboard.type( '123' ); + + // Save it, without saving the front page template. + await page.click( '.edit-site-save-button__button' ); + const [ frontPageCheckbox ] = await page.$x( + '//strong[contains(text(),"Front Page")]/../preceding-sibling::span/input' + ); + await frontPageCheckbox.click(); + await page.click( '.editor-entities-saved-states__save-button' ); + await page.waitForSelector( + '.edit-site-save-button__button:not(.is-busy)' + ); + + // Switch back to the front page template. + await page.click( + '.components-dropdown-menu__toggle[aria-label="Switch Template"]' + ); + const [ switchToFrontPageTemplateButton ] = await page.$x( + '//button[contains(text(), "front-page")]' + ); + await switchToFrontPageTemplateButton.click(); + + // Verify that the header template part is updated. + const [ headerTemplatePart ] = await page.$x( + '//*[@data-type="core/template-part"][//p[text()="Header Template Part123"]]' + ); + expect( headerTemplatePart ).not.toBeNull(); + } ); + } ); + + describe( 'Template part placeholder', () => { + // Test constants for template part. + const testSlug = 'test-template-part'; + const testTheme = 'test-theme'; + const testContent = 'some words...'; + + // Selectors + const chooseButtonSelector = + '//div[contains(@class,"is-selected")]//button[text()="Choose"]'; + const entitiesSaveSelector = + '.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 templatePartButtonSelector = `${ templatePartSelector } button`; + const testContentSelector = `//p[contains(., "${ testContent }")]`; + + it( 'Should prompt to create when no match found', async () => { + await createNewPost(); + await disablePrePublishChecks(); + // Create new template part. + await insertBlock( 'Template Part' ); + await page.keyboard.type( testSlug ); + await page.keyboard.press( 'Tab' ); + await page.keyboard.type( testTheme ); + // Should say 'Create' + const placeholderButton = await page.$( + templatePartButtonSelector + ); + const text = await page.evaluate( + ( element ) => element.textContent, + placeholderButton + ); + expect( text ).toBe( 'Create' ); + + // Finish creating template part, insert some text, and save. + await page.keyboard.press( 'Tab' ); + await page.keyboard.press( 'Enter' ); + await page.waitForSelector( activatedTemplatePartSelector ); + await page.click( templatePartSelector ); + await page.keyboard.type( testContent ); + await page.click( savePostSelector ); + await page.click( entitiesSaveSelector ); + } ); + + it( 'Should prompt to Choose when match found', async () => { + await createNewPost(); + await disablePrePublishChecks(); + // Try to insert the template part we created. + await insertBlock( 'Template Part' ); + await page.keyboard.type( testSlug ); + await page.keyboard.press( 'Tab' ); + await page.keyboard.type( testTheme ); + // Should say 'Choose' + const placeholderButton = await page.waitForXPath( + chooseButtonSelector + ); + expect( placeholderButton ).not.toBeNull(); + } ); + + it( 'Should dispaly a preview when match is found', async () => { + const [ preview ] = await page.$x( testContentSelector ); + expect( preview ).toBeTruthy(); + } ); + + it( 'Should insert the desired template part', async () => { + const [ placeholderButton ] = await page.$x( chooseButtonSelector ); + await placeholderButton.click(); + await page.waitForSelector( activatedTemplatePartSelector ); + const templatePartContent = await page.waitForXPath( + testContentSelector + ); + expect( templatePartContent ).toBeTruthy(); + } ); + } ); +} ); diff --git a/packages/edit-navigation/package.json b/packages/edit-navigation/package.json index 0b27899df21ee6..65b58dfcbebdc1 100644 --- a/packages/edit-navigation/package.json +++ b/packages/edit-navigation/package.json @@ -36,6 +36,7 @@ "@wordpress/keyboard-shortcuts": "file:../keyboard-shortcuts", "@wordpress/media-utils": "file:../media-utils", "@wordpress/notices": "file:../notices", + "classnames": "^2.2.5", "lodash": "^4.17.15", "rememo": "^3.0.0" }, diff --git a/packages/edit-navigation/src/components/layout/index.js b/packages/edit-navigation/src/components/layout/index.js index a79bbc922917ff..8459c6d45349f3 100644 --- a/packages/edit-navigation/src/components/layout/index.js +++ b/packages/edit-navigation/src/components/layout/index.js @@ -23,7 +23,6 @@ export default function Layout( { blockEditorSettings } ) { { /* */ } - { + const { + isNavigationMode, + getBlockSelectionStart, + getBlock, + } = select( 'core/block-editor' ); + + const selectionStartClientId = getBlockSelectionStart(); + + return { + isNavigationModeActive: isNavigationMode(), + hasSelectedBlock: + !! selectionStartClientId && + !! getBlock( selectionStartClientId ), + }; + }, + [] + ); + + return ( + + { __( 'Save navigation' ) } + + } + > + + + { hasSelectedBlock && } + + + + + + + + + + ); +} diff --git a/packages/edit-navigation/src/components/menu-editor/index.js b/packages/edit-navigation/src/components/menu-editor/index.js index 5ac2a1959e0201..3e8297bdf54038 100644 --- a/packages/edit-navigation/src/components/menu-editor/index.js +++ b/packages/edit-navigation/src/components/menu-editor/index.js @@ -4,13 +4,7 @@ import { BlockEditorKeyboardShortcuts, BlockEditorProvider, - BlockList, - ObserveTyping, - WritingFlow, - __experimentalBlockNavigationList, } from '@wordpress/block-editor'; -import { __ } from '@wordpress/i18n'; -import { Panel, PanelBody, Button } from '@wordpress/components'; import { useViewportMatch } from '@wordpress/compose'; /** @@ -18,6 +12,8 @@ import { useViewportMatch } from '@wordpress/compose'; */ import useNavigationBlocks from './use-navigation-blocks'; import MenuEditorShortcuts from './shortcuts'; +import BlockEditorPanel from './block-editor-panel'; +import NavigationStructurePanel from './navigation-structure-panel'; export default function MenuEditor( { menuId, blockEditorSettings } ) { const [ blocks, setBlocks, saveBlocks ] = useNavigationBlocks( menuId ); @@ -35,42 +31,16 @@ export default function MenuEditor( { menuId, blockEditorSettings } ) { settings={ { ...blockEditorSettings, templateLock: 'all', + hasFixedToolbar: true, } } > - - - { !! blocks.length && ( - <__experimentalBlockNavigationList - blocks={ blocks } - selectedBlockClientId={ blocks[ 0 ].clientId } - selectBlock={ () => {} } - showNestedBlocks - showAppender - /> - ) } - - - - { __( 'Save navigation' ) } - - } - className="edit-navigation-menu-editor__panel" - > - - - - - - - - + +
); diff --git a/packages/edit-navigation/src/components/menu-editor/navigation-structure-panel.js b/packages/edit-navigation/src/components/menu-editor/navigation-structure-panel.js new file mode 100644 index 00000000000000..147e894bcd95e1 --- /dev/null +++ b/packages/edit-navigation/src/components/menu-editor/navigation-structure-panel.js @@ -0,0 +1,27 @@ +/** + * WordPress dependencies + */ +import { __experimentalBlockNavigationList } from '@wordpress/block-editor'; +import { Panel, PanelBody } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; + +export default function NavigationStructurePanel( { blocks, initialOpen } ) { + return ( + + + { !! blocks.length && ( + <__experimentalBlockNavigationList + blocks={ blocks } + selectedBlockClientId={ blocks[ 0 ].clientId } + selectBlock={ () => {} } + showNestedBlocks + showAppender + /> + ) } + + + ); +} diff --git a/packages/edit-navigation/src/components/menu-editor/style.scss b/packages/edit-navigation/src/components/menu-editor/style.scss index 1c6ddda2c7bce6..aa7a3d98b33f55 100644 --- a/packages/edit-navigation/src/components/menu-editor/style.scss +++ b/packages/edit-navigation/src/components/menu-editor/style.scss @@ -1,8 +1,68 @@ .edit-navigation-menu-editor { display: grid; + align-items: self-start; grid-gap: 10px; @include break-medium { grid-template-columns: 280px 1fr; } + + // Make the block list take up the full width of the panel. + .block-editor-block-list__layout.is-root-container { + padding: 0; + } +} + +.edit-navigation-menu-editor__block-editor-toolbar { + height: 46px; + margin-bottom: 12px; + border: 1px solid #e2e4e7; + + // Borders around toolbar segments. + .components-toolbar { + background: none; + // IE11 has thick paddings without this. + line-height: 0; + + // These margins make the buttons themselves overlap the chrome of the toolbar. + // This helps make them square, and maximize the hit area. + margin-top: -$border-width; + margin-bottom: -$border-width; + + // The component is born with a border, but we only need some of them. + border: 0; + + // Add a border after item groups to show as separator in the block toolbar. + border-right: $border-width solid $light-gray-500; + } + + + // When entering navigation mode, hide the toolbar, but do so in a way where the + // outer container retains its height to avoid the blocks moving upwards. + &.is-hidden { + border-color: transparent; + + .block-editor-block-toolbar { + display: none; + } + } +} + +.edit-navigation-menu-editor__navigation-structure-panel { + // IE11 requires the column to be explicity declared. + grid-column: 1; + + // Make panels collapsible in IE. The IE analogue of align-items: self-start;. + -ms-grid-row-align: start; +} + +.edit-navigation-menu-editor__block-editor-panel { + @include break-medium { + // IE11 requires the column to be explicity declared. + // Only shift this into the second column on desktop. + grid-column: 2; + } + + // Make panels collapsible in IE. The IE analogue of align-items: self-start;. + -ms-grid-row-align: start; } diff --git a/packages/edit-post/src/components/device-preview/index.js b/packages/edit-post/src/components/device-preview/index.js new file mode 100644 index 00000000000000..bc482905e7336d --- /dev/null +++ b/packages/edit-post/src/components/device-preview/index.js @@ -0,0 +1,58 @@ +/** + * WordPress dependencies + */ +import { Icon, MenuGroup } from '@wordpress/components'; +import { PostPreviewButton } from '@wordpress/editor'; +import { external } from '@wordpress/icons'; +import { __ } from '@wordpress/i18n'; +import { __experimentalPreviewOptions as PreviewOptions } from '@wordpress/block-editor'; +import { useDispatch, useSelect } from '@wordpress/data'; + +export default function DevicePreview() { + const { + hasActiveMetaboxes, + isPostSaveable, + isSaving, + deviceType, + } = useSelect( + ( select ) => ( { + hasActiveMetaboxes: select( 'core/edit-post' ).hasMetaBoxes(), + isSaving: select( 'core/edit-post' ).isSavingMetaBoxes(), + isPostSaveable: select( 'core/editor' ).isEditedPostSaveable(), + deviceType: select( + 'core/edit-post' + ).__experimentalGetPreviewDeviceType(), + } ), + [] + ); + const { + __experimentalSetPreviewDeviceType: setPreviewDeviceType, + } = useDispatch( 'core/edit-post' ); + + return ( + + +
+ + + { __( 'Preview in new tab' ) } + + } + /> +
+
+
+ ); +} 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 080f9e2c258257..4e386d22cc4f70 100644 --- a/packages/edit-post/src/components/header/header-toolbar/index.js +++ b/packages/edit-post/src/components/header/header-toolbar/index.js @@ -3,9 +3,8 @@ */ import { useViewportMatch } from '@wordpress/compose'; import { useSelect } from '@wordpress/data'; -import { __ } from '@wordpress/i18n'; +import { __, _x } from '@wordpress/i18n'; import { - Inserter, BlockToolbar, NavigableToolbar, BlockNavigationDropdown, @@ -16,13 +15,14 @@ import { EditorHistoryRedo, EditorHistoryUndo, } from '@wordpress/editor'; +import { Button } from '@wordpress/components'; +import { plus } from '@wordpress/icons'; -const inserterToggleProps = { isPrimary: true }; - -function HeaderToolbar() { +function HeaderToolbar( { onToggleInserter, isInserterOpen } ) { const { hasFixedToolbar, - showInserter, + isInserterEnabled, + isInserterVisible, isTextModeEnabled, previewDeviceType, } = useSelect( @@ -31,9 +31,10 @@ function HeaderToolbar() { 'fixedToolbar' ), // This setting (richEditingEnabled) should not live in the block editor's setting. - showInserter: + isInserterEnabled: select( 'core/edit-post' ).getEditorMode() === 'visual' && select( 'core/editor' ).getEditorSettings().richEditingEnabled, + isInserterVisible: select( 'core/block-editor' ).hasInserterItems(), isTextModeEnabled: select( 'core/edit-post' ).getEditorMode() === 'text', previewDeviceType: select( @@ -58,12 +59,20 @@ function HeaderToolbar() { className="edit-post-header-toolbar" aria-label={ toolbarAriaLabel } > - + { isInserterVisible && ( +
+
+ { + if ( isMobileViewport ) { + setIsInserterOpen( false ); + } + } } + /> +
+
+ ) + } sidebar={ ( ! isMobileViewport || sidebarIsOpened ) && ( <> diff --git a/packages/edit-post/src/components/layout/index.native.js b/packages/edit-post/src/components/layout/index.native.js index 9384a0da52b2c0..94291b0db06e35 100644 --- a/packages/edit-post/src/components/layout/index.native.js +++ b/packages/edit-post/src/components/layout/index.native.js @@ -14,6 +14,7 @@ import { BottomSheetSettings, __experimentalPageTemplatePicker, __experimentalWithPageTemplatePicker, + FloatingToolbar, } from '@wordpress/block-editor'; import { compose, withPreferredColorScheme } from '@wordpress/compose'; import { HTMLTextInput, KeyboardAvoidingView } from '@wordpress/components'; @@ -131,6 +132,9 @@ class Layout extends Component { ) } > { isHtmlView ? this.renderHTML() : this.renderVisual() } + { ! isHtmlView && Platform.OS === 'android' && ( + + ) } ) } + { Platform.OS === 'ios' && }
diff --git a/packages/edit-post/src/components/layout/style.scss b/packages/edit-post/src/components/layout/style.scss index cdab72c4bed4c3..340284a8613b15 100644 --- a/packages/edit-post/src/components/layout/style.scss +++ b/packages/edit-post/src/components/layout/style.scss @@ -110,3 +110,28 @@ background-color: $light-gray-700; } +.edit-post-layout__inserter-panel { + height: 100%; + display: flex; + flex-direction: column; +} + +.edit-post-layout__inserter-panel-header { + padding-top: $grid-unit-10; + padding-right: $grid-unit-10; + display: flex; + justify-content: flex-end; + + @include break-medium() { + display: none; + } +} + +.edit-post-layout__inserter-panel-content { + // Leave space for the close button + height: calc(100% - #{$button-size} - #{$grid-unit-10}); + + @include break-medium() { + height: 100%; + } +} diff --git a/packages/edit-post/src/components/preview-options/index.js b/packages/edit-post/src/components/preview-options/index.js deleted file mode 100644 index a92bbbdad2b5f3..00000000000000 --- a/packages/edit-post/src/components/preview-options/index.js +++ /dev/null @@ -1,121 +0,0 @@ -/** - * External dependencies - */ -import { get } from 'lodash'; - -/** - * WordPress dependencies - */ -import { - Button, - Dropdown, - Icon, - MenuGroup, - MenuItem, - Path, - SVG, -} from '@wordpress/components'; -import { useSelect, useDispatch } from '@wordpress/data'; -import { PostPreviewButton } from '@wordpress/editor'; -import { __ } from '@wordpress/i18n'; -import { external, check } from '@wordpress/icons'; - -const downArrow = ( - - - -); - -export default function PreviewOptions( { - forceIsAutosaveable, - forcePreviewLink, -} ) { - const { - __experimentalSetPreviewDeviceType: setPreviewDeviceType, - } = useDispatch( 'core/edit-post' ); - - const deviceType = useSelect( ( select ) => { - return select( 'core/edit-post' ).__experimentalGetPreviewDeviceType(); - }, [] ); - - const isSaveable = useSelect( ( select ) => { - return select( 'core/editor' ).isEditedPostSaveable(); - }, [] ); - - const isViewable = useSelect( ( select ) => { - const { getEditedPostAttribute } = select( 'core/editor' ); - const { getPostType } = select( 'core' ); - const postType = getPostType( getEditedPostAttribute( 'type' ) ); - return get( postType, [ 'viewable' ], false ); - }, [] ); - - return ( - ( - - ) } - renderContent={ () => ( - <> - - setPreviewDeviceType( 'Desktop' ) } - icon={ deviceType === 'Desktop' && check } - > - { __( 'Desktop' ) } - - setPreviewDeviceType( 'Tablet' ) } - icon={ deviceType === 'Tablet' && check } - > - { __( 'Tablet' ) } - - setPreviewDeviceType( 'Mobile' ) } - icon={ deviceType === 'Mobile' && check } - > - { __( 'Mobile' ) } - - - { isViewable && ( - -
- - - { __( 'Preview in new tab' ) } - - } - /> -
-
- ) } - - ) } - /> - ); -} 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 4a408b1b63f350..befb270be4f668 100644 --- a/packages/edit-post/src/components/sidebar/settings-sidebar/index.js +++ b/packages/edit-post/src/components/sidebar/settings-sidebar/index.js @@ -40,6 +40,7 @@ const SettingsSidebar = () => { header={ } closeLabel={ __( 'Close settings' ) } headerClassName="edit-post-sidebar__panel-tabs" + isPinnable={ false } > { sidebarName === 'edit-post/document' && ( <> diff --git a/packages/edit-post/src/components/text-editor/index.js b/packages/edit-post/src/components/text-editor/index.js index 28293076ef7908..30102330e53776 100644 --- a/packages/edit-post/src/components/text-editor/index.js +++ b/packages/edit-post/src/components/text-editor/index.js @@ -11,17 +11,16 @@ import { withDispatch, withSelect } from '@wordpress/data'; import { __ } from '@wordpress/i18n'; import { displayShortcut } from '@wordpress/keycodes'; import { compose } from '@wordpress/compose'; -import { close } from '@wordpress/icons'; function TextEditor( { onExit, isRichEditingEnabled } ) { return (
{ isRichEditingEnabled && (
-

{ __( 'Editing Code' ) }

+

{ __( 'Editing code' ) }

) } { this.state.showCopyConfirmation diff --git a/packages/editor/src/components/post-text-editor/style.scss b/packages/editor/src/components/post-text-editor/style.scss index 4f5381dc02fd58..8041d05031dd1c 100644 --- a/packages/editor/src/components/post-text-editor/style.scss +++ b/packages/editor/src/components/post-text-editor/style.scss @@ -1,14 +1,16 @@ -.editor-post-text-editor { - border: $border-width solid $light-gray-500 !important; +.edit-post-text-editor__body textarea.editor-post-text-editor { + border: $border-width solid $light-gray-secondary; display: block; - margin: 0 0 2em; + margin: 0; width: 100%; box-shadow: none; resize: none; overflow: hidden; - font-family: $editor-html-font !important; + font-family: $editor-html-font; line-height: 150%; - border-radius: 0 !important; + border-radius: 0; + padding: $grid-unit-20; + min-height: 200px; /* Fonts smaller than 16px causes mobile safari to zoom. */ font-size: $mobile-text-min-font-size !important; @@ -16,56 +18,11 @@ font-size: $text-editor-font-size !important; } - &:hover, &:focus { - border: $border-width solid $dark-gray-primary !important; - box-shadow: none !important; - // Emulate the effect used on the post title. - outline-offset: -2px !important; - } -} - -.editor-post-text-editor__toolbar { - display: flex; - flex-direction: row; - flex-wrap: wrap; - - button { - height: 30px; - background: none; - padding: 0 8px; - margin: 3px 4px; - text-align: center; - cursor: pointer; - font-family: $editor-html-font; - color: $dark-gray-500; - border: $border-width solid transparent; + border: $border-width solid $dark-gray-primary; + box-shadow: none; - &:first-child { - margin-left: 0; - } - - &:hover, - &:focus { - outline: none; - border: $border-width solid $dark-gray-500; - } + // Elevate the z-index on focus so the focus style is uncropped. + position: relative; } } - -.editor-post-text-editor__bold { - font-weight: 600; -} - -.editor-post-text-editor__italic { - font-style: italic; -} - -.editor-post-text-editor__link { - text-decoration: underline; - color: theme(primary); -} - -.editor-post-text-editor__del { - text-decoration: line-through; -} diff --git a/packages/editor/src/components/post-title/index.js b/packages/editor/src/components/post-title/index.js index 306e9e7c99113d..ccc5eb1077fa32 100644 --- a/packages/editor/src/components/post-title/index.js +++ b/packages/editor/src/components/post-title/index.js @@ -72,6 +72,7 @@ class PostTitle extends Component { const { isSelected } = this.state; // The wp-block className is important for editor styles. + // This same block is used in both the visual and the code editor. const className = classnames( 'wp-block editor-post-title editor-post-title__block', { @@ -109,7 +110,8 @@ class PostTitle extends Component { */ /* eslint-disable jsx-a11y/no-autofocus */ autoFocus={ - document.body === document.activeElement && + ( document.body === document.activeElement || + ! document.activeElement ) && isCleanNewPost } /* eslint-enable jsx-a11y/no-autofocus */ diff --git a/packages/editor/src/components/post-title/style.scss b/packages/editor/src/components/post-title/style.scss index 351423d657b235..214f68d861c1cc 100644 --- a/packages/editor/src/components/post-title/style.scss +++ b/packages/editor/src/components/post-title/style.scss @@ -1,6 +1,5 @@ .editor-post-title { position: relative; - font-size: $editor-font-size; .editor-post-title__input { display: block; @@ -8,14 +7,16 @@ margin: 0; box-shadow: none; background: transparent; - font-family: $editor-font; - line-height: $default-line-height; - color: $dark-gray-900; transition: border 0.1s ease-out, box-shadow 0.1s linear; @include reduce-motion("transition"); padding: #{ $block-padding + 5px } 0; word-break: keep-all; + // Inherit the styles set by the theme. + font-family: inherit; + line-height: inherit; + color: inherit; + // Stack borders on mobile. border: $border-width solid transparent; border-left-width: 0; @@ -31,7 +32,7 @@ // Match h1 heading. font-size: 2.44em; - font-weight: 600; + font-weight: bold; // Large text needs a 3:1 contrast ratio. &::-webkit-input-placeholder { diff --git a/packages/editor/src/components/provider/index.js b/packages/editor/src/components/provider/index.js index 74c7b2f67cf72d..ec225dcb02a324 100644 --- a/packages/editor/src/components/provider/index.js +++ b/packages/editor/src/components/provider/index.js @@ -14,6 +14,7 @@ import { __ } from '@wordpress/i18n'; import { EntityProvider } from '@wordpress/core-data'; import { BlockEditorProvider, + BlockContextProvider, __unstableEditorStyles as EditorStyles, } from '@wordpress/block-editor'; import apiFetch from '@wordpress/api-fetch'; @@ -53,6 +54,10 @@ class EditorProvider extends Component { maxSize: 1, } ); + this.getDefaultBlockContext = memize( this.getDefaultBlockContext, { + maxSize: 1, + } ); + // Assume that we don't need to initialize in the case of an error recovery. if ( props.recovery ) { return; @@ -94,9 +99,19 @@ class EditorProvider extends Component { ) { return { ...pick( settings, [ + '__experimentalBlockDirectory', + '__experimentalBlockPatterns', + '__experimentalDisableCustomUnits', + '__experimentalDisableCustomLineHeight', + '__experimentalDisableDropCap', + '__experimentalEnableLegacyWidgetBlock', + '__experimentalEnableFullSiteEditing', + '__experimentalEnableFullSiteEditingDemo', + '__experimentalGlobalStylesUserEntityId', + '__experimentalGlobalStylesBase', + '__experimentalPreferredStyleVariations', 'alignWide', 'allowedBlockTypes', - '__experimentalPreferredStyleVariations', 'availableLegacyWidgets', 'bodyPlaceholder', 'codeEditingEnabled', @@ -106,26 +121,18 @@ class EditorProvider extends Component { 'disableCustomGradients', 'focusMode', 'fontSizes', + 'gradients', 'hasFixedToolbar', 'hasPermissionsToManageWidgets', 'imageSizes', 'imageDimensions', 'isRTL', 'maxWidth', + 'onUpdateDefaultBlockStyles', 'styles', 'template', 'templateLock', 'titlePlaceholder', - 'onUpdateDefaultBlockStyles', - '__experimentalDisableCustomUnits', - '__experimentalEnableLegacyWidgetBlock', - '__experimentalBlockDirectory', - '__experimentalEnableFullSiteEditing', - '__experimentalEnableFullSiteEditingDemo', - '__experimentalGlobalStylesUserEntityId', - '__experimentalGlobalStylesBase', - '__experimentalDisableCustomLineHeight', - 'gradients', ] ), mediaUpload: hasUploadPermissions ? mediaUpload : undefined, __experimentalReusableBlocks: reusableBlocks, @@ -137,6 +144,10 @@ class EditorProvider extends Component { }; } + getDefaultBlockContext( postId, postType ) { + return { postId, postType }; + } + componentDidMount() { this.props.updateEditorSettings( this.props.settings ); } @@ -184,6 +195,11 @@ class EditorProvider extends Component { isPostTitleSelected ); + const defaultBlockContext = this.getDefaultBlockContext( + post.id, + post.type + ); + return ( <> @@ -193,19 +209,21 @@ class EditorProvider extends Component { type={ post.type } id={ post.id } > - - { children } - - - + + + { children } + + + + diff --git a/packages/editor/src/hooks/default-autocompleters.js b/packages/editor/src/hooks/default-autocompleters.js index bab2a07abee0b7..7bbf5382b09ca8 100644 --- a/packages/editor/src/hooks/default-autocompleters.js +++ b/packages/editor/src/hooks/default-autocompleters.js @@ -7,22 +7,16 @@ import { clone } from 'lodash'; * WordPress dependencies */ import { addFilter } from '@wordpress/hooks'; -import { getDefaultBlockName } from '@wordpress/blocks'; /** * Internal dependencies */ -import { blockAutocompleter, userAutocompleter } from '../components'; +import { userAutocompleter } from '../components'; -function setDefaultCompleters( completers = [], blockName ) { +function setDefaultCompleters( completers = [] ) { // Provide copies so filters may directly modify them. completers.push( clone( userAutocompleter ) ); - // Add blocks autocompleter for Paragraph block - if ( blockName === getDefaultBlockName() ) { - completers.push( clone( blockAutocompleter ) ); - } - return completers; } diff --git a/packages/editor/src/store/actions.js b/packages/editor/src/store/actions.js index 453a606c86206d..dc785fa4480bfd 100644 --- a/packages/editor/src/store/actions.js +++ b/packages/editor/src/store/actions.js @@ -7,7 +7,12 @@ import { has, castArray } from 'lodash'; * WordPress dependencies */ import deprecated from '@wordpress/deprecated'; -import { dispatch, select, apiFetch } from '@wordpress/data-controls'; +import { + dispatch, + select, + __unstableSyncSelect, + apiFetch, +} from '@wordpress/data-controls'; import { parse, synchronizeBlocksWithTemplate } from '@wordpress/blocks'; /** @@ -672,7 +677,7 @@ export function* resetEditorBlocks( blocks, options = {} ) { if ( __unstableShouldCreateUndoLevel !== false ) { const { id, type } = yield select( STORE_KEY, 'getCurrentPost' ); const noChange = - ( yield select( + ( yield __unstableSyncSelect( 'core', 'getEditedEntityRecord', 'postType', diff --git a/packages/editor/src/utils/test/url.js b/packages/editor/src/utils/test/url.js index 50be061f75028f..ffe0568bbc502f 100644 --- a/packages/editor/src/utils/test/url.js +++ b/packages/editor/src/utils/test/url.js @@ -5,7 +5,7 @@ import { cleanForSlug } from '../url'; describe( 'cleanForSlug()', () => { it( 'Should return string prepared for use as url slug', () => { - expect( cleanForSlug( ' /Déjà_vu. ' ) ).toBe( 'deja-vu' ); + expect( cleanForSlug( '/Is th@t Déjà_vu? ' ) ).toBe( 'is-tht-deja_vu' ); } ); it( 'Should return an empty string for missing argument', () => { diff --git a/packages/editor/src/utils/url.js b/packages/editor/src/utils/url.js index 8508329a8776e5..bf2130be9caa7f 100644 --- a/packages/editor/src/utils/url.js +++ b/packages/editor/src/utils/url.js @@ -1,7 +1,7 @@ /** * External dependencies */ -import { deburr, toLower, trim } from 'lodash'; +import { deburr, trim } from 'lodash'; /** * WordPress dependencies @@ -28,11 +28,11 @@ export function getWPAdminURL( page, query ) { * This replicates some of what sanitize_title() does in WordPress core, but * is only designed to approximate what the slug will be. * - * Converts whitespace, periods, forward slashes and underscores to hyphens. * Converts Latin-1 Supplement and Latin Extended-A letters to basic Latin - * letters. Removes combining diacritical marks. Converts remaining string - * to lowercase. It does not touch octets, HTML entities, or other encoded - * characters. + * letters. Removes combining diacritical marks. Converts whitespace, periods, + * and forward slashes to hyphens. Removes any remaining non-word characters + * except hyphens. Converts remaining string to lowercase. It does not account + * for octets, HTML entities, or other encoded characters. * * @param {string} string Title or slug to be processed * @@ -42,7 +42,11 @@ export function cleanForSlug( string ) { if ( ! string ) { return ''; } - return toLower( - deburr( trim( string.replace( /[\s\./_]+/g, '-' ), '-' ) ) + return trim( + deburr( string ) + .replace( /[\s\./]+/g, '-' ) + .replace( /[^\w-]+/g, '' ) + .toLowerCase(), + '-' ); } diff --git a/packages/env/CHANGELOG.md b/packages/env/CHANGELOG.md index b85872c9ce6f7f..5a67af6ef1d623 100644 --- a/packages/env/CHANGELOG.md +++ b/packages/env/CHANGELOG.md @@ -1,6 +1,6 @@ ## Master -## 1.2.0 (2020-04-15) +## 1.1.0 (2020-04-01) ### New Feature diff --git a/packages/env/README.md b/packages/env/README.md index e27fba038c9aeb..05e2a22e334a05 100644 --- a/packages/env/README.md +++ b/packages/env/README.md @@ -8,18 +8,23 @@ Ensure that Docker is running, then: ```sh $ cd /path/to/a/wordpress/plugin -$ npx wp-env start +$ npm -g i @wordpress/env +$ wp-env start ``` The local environment will be available at http://localhost:8888. -## Instructions - -### Installation +## Prerequisites `wp-env` requires Docker to be installed. There are instructions available for installing Docker on [Windows 10 Pro](https://docs.docker.com/docker-for-windows/install/), [all other versions of Windows](https://docs.docker.com/toolbox/toolbox_install_windows/), [macOS](https://docs.docker.com/docker-for-mac/install/), and [Linux](https://docs.docker.com/v17.12/install/linux/docker-ce/ubuntu/#install-using-the-convenience-script). -After confirming that Docker is installed, you can install `wp-env` globally like so: +Node.js and NPM are required. The latest LTS version of Node.js is used to develop `wp-env` and is recommended. + +## Installation + +### Installation as a global package + +After confirming that the prerequisites are installed, you can install `wp-env` globally like so: ```sh $ npm -g i @wordpress/env @@ -27,6 +32,36 @@ $ npm -g i @wordpress/env You're now ready to use `wp-env`! +### Installation as a local package + +If your project already has a package.json, it's also possible to use `wp-env` as a local package. First install `wp-env` locally as a dev dependency: + +```sh +$ npm i @wordpress/env --save-dev +``` + +Then modify your package.json and add an extra command to npm `scripts` (https://docs.npmjs.com/misc/scripts): + +```json +"scripts": { + "wp-env": "wp-env" +} +``` + +When installing `wp-env` in this way, all `wp-env` commands detailed in these docs must be prefixed with `npm run`, for example: + +```sh +$ npm run wp-env start +``` + +instead of: + +```sh +$ wp-env start +``` + +## Usage + ### Starting the environment First, ensure that Docker is running. You can do this by clicking on the Docker icon in the system tray or menu bar. diff --git a/packages/env/lib/build-docker-compose-config.js b/packages/env/lib/build-docker-compose-config.js index c95cd875ba4e2e..e5ab685f4b1478 100644 --- a/packages/env/lib/build-docker-compose-config.js +++ b/packages/env/lib/build-docker-compose-config.js @@ -109,6 +109,7 @@ module.exports = function buildDockerComposeConfig( config ) { services: { mysql: { image: 'mariadb', + ports: [ '3306' ], environment: { MYSQL_ALLOW_EMPTY_PASSWORD: 'yes', }, diff --git a/packages/eslint-plugin/CHANGELOG.md b/packages/eslint-plugin/CHANGELOG.md index 27e027f1475018..040e3b644b45ab 100644 --- a/packages/eslint-plugin/CHANGELOG.md +++ b/packages/eslint-plugin/CHANGELOG.md @@ -1,5 +1,9 @@ ## Master +### Bug Fixes + +- The `@wordpress/no-unused-vars-before-return` rule will now correctly identify valid usage of a variable as a JSX identifier. + ## 5.0.1 (2020-04-15) ### Bug Fixes @@ -20,7 +24,6 @@ ### New Features -- The `prefer-const` rule included in the `recommended` and `esnext` rulesets has been relaxed to allow a `let` assignment if any of a [destructuring assignment](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) are reassigned. - New Rule: [`@wordpress/i18n-text-domain`](https://github.com/WordPress/gutenberg/blob/master/packages/eslint-plugin/docs/rules/i18n-text-domain.md) - New Rule: [`@wordpress/i18n-translator-comments`](https://github.com/WordPress/gutenberg/blob/master/packages/eslint-plugin/docs/rules/i18n-translator-comments.md) - New Rule: [`@wordpress/i18n-no-variables`](https://github.com/WordPress/gutenberg/blob/master/packages/eslint-plugin/docs/rules/i18n-no-variables.md) @@ -34,6 +37,12 @@ - The `@wordpress/valid-sprintf` rule now detects usage of `sprintf` via `i18n.sprintf` (e.g. when using `import * as i18n from '@wordpress/i18n'`). - `@wordpress/no-unused-vars-before-return` will correctly consider other unused variables after encountering an instance of an `excludePattern` option exception. +## 4.1.0 (2020-04-01) + +### New Features + +- The `prefer-const` rule included in the `recommended` and `esnext` rulesets has been relaxed to allow a `let` assignment if any of a [destructuring assignment](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) are reassigned. + ## 4.0.0 (2020-02-10) ### Breaking Changes diff --git a/packages/eslint-plugin/configs/jsdoc.js b/packages/eslint-plugin/configs/jsdoc.js index bf5e245ec90009..be11e0013dff15 100644 --- a/packages/eslint-plugin/configs/jsdoc.js +++ b/packages/eslint-plugin/configs/jsdoc.js @@ -17,6 +17,7 @@ const temporaryWordPressInternalTypes = [ 'WPBlockSerializationOptions', 'WPBlock', 'WPBlockPattern', + 'WPBlockType', 'WPBlockTypeIcon', 'WPBlockTypeIconRender', 'WPBlockTypeIconDescriptor', diff --git a/packages/eslint-plugin/rules/__tests__/no-unused-vars-before-return.js b/packages/eslint-plugin/rules/__tests__/no-unused-vars-before-return.js index 036ed7712bf583..fe909e6c717303 100644 --- a/packages/eslint-plugin/rules/__tests__/no-unused-vars-before-return.js +++ b/packages/eslint-plugin/rules/__tests__/no-unused-vars-before-return.js @@ -11,6 +11,9 @@ import rule from '../no-unused-vars-before-return'; const ruleTester = new RuleTester( { parserOptions: { ecmaVersion: 6, + ecmaFeatures: { + jsx: true, + }, }, } ); @@ -50,6 +53,13 @@ function example() { }`, options: [ { excludePattern: '^do' } ], }, + { + code: ` +function MyComponent() { + const Foo = getSomeComponent(); + return ; +}`, + }, ], invalid: [ { diff --git a/packages/eslint-plugin/rules/no-unused-vars-before-return.js b/packages/eslint-plugin/rules/no-unused-vars-before-return.js index 489b0beb86ad0e..1394de7f4a67c1 100644 --- a/packages/eslint-plugin/rules/no-unused-vars-before-return.js +++ b/packages/eslint-plugin/rules/no-unused-vars-before-return.js @@ -1,4 +1,33 @@ -module.exports = { +/** @typedef {import('eslint').Scope.Scope} ESLintScope */ +/** @typedef {import('eslint').Rule.RuleContext} ESLintRuleContext */ +/** @typedef {import('estree').Node} ESTreeNode */ + +/** + * Mapping of function scope objects to a set of identified JSX identifiers + * within that scope. + * + * @type {WeakMap>} + */ +const FUNCTION_SCOPE_JSX_IDENTIFIERS = new WeakMap(); + +/** + * Returns the closest function scope for the current ESLint context object, or + * undefined if it cannot be determined. + * + * @param {ESLintRuleContext} context ESLint context object. + * + * @return {ESLintScope|undefined} Function scope, if known. + */ +function getClosestFunctionScope( context ) { + let functionScope = context.getScope(); + while ( functionScope.type !== 'function' && functionScope.upper ) { + functionScope = functionScope.upper; + } + + return functionScope; +} + +module.exports = /** @type {import('eslint').Rule} */ ( { meta: { type: 'problem', schema: [ @@ -13,6 +42,9 @@ module.exports = { }, ], }, + /** + * @param {ESLintRuleContext} context Rule context. + */ create( context ) { const options = context.options[ 0 ] || {}; const { excludePattern } = options; @@ -36,15 +68,27 @@ module.exports = { } return { - ReturnStatement( node ) { - let functionScope = context.getScope(); - while ( - functionScope.type !== 'function' && - functionScope.upper - ) { - functionScope = functionScope.upper; + JSXIdentifier( node ) { + // Currently, a scope's variable references does not include JSX + // identifiers. Account for this by visiting JSX identifiers + // first, and tracking them in a map per function scope, which + // is later merged with the known variable references. + const functionScope = getClosestFunctionScope( context ); + if ( ! functionScope ) { + return; + } + + if ( ! FUNCTION_SCOPE_JSX_IDENTIFIERS.has( functionScope ) ) { + FUNCTION_SCOPE_JSX_IDENTIFIERS.set( + functionScope, + new Set() + ); } + FUNCTION_SCOPE_JSX_IDENTIFIERS.get( functionScope ).add( node ); + }, + 'ReturnStatement:exit'( node ) { + const functionScope = getClosestFunctionScope( context ); if ( ! functionScope ) { return; } @@ -79,11 +123,22 @@ module.exports = { // The first entry in `references` is the declaration // itself, which can be ignored. - const isUsedBeforeReturn = variable.references + const identifiers = variable.references .slice( 1 ) - .some( ( reference ) => { - return reference.identifier.end < node.end; - } ); + .map( ( reference ) => reference.identifier ); + + // Merge with any JSX identifiers in scope, if any. + if ( FUNCTION_SCOPE_JSX_IDENTIFIERS.has( functionScope ) ) { + const jsxIdentifiers = FUNCTION_SCOPE_JSX_IDENTIFIERS.get( + functionScope + ); + + identifiers.push( ...jsxIdentifiers ); + } + + const isUsedBeforeReturn = identifiers.some( + ( identifier ) => identifier.end < node.end + ); if ( isUsedBeforeReturn ) { continue; @@ -98,4 +153,4 @@ module.exports = { }, }; }, -}; +} ); diff --git a/packages/format-library/src/default-formats.js b/packages/format-library/src/default-formats.js index ce6a9b5f73679b..dfc931ec41e606 100644 --- a/packages/format-library/src/default-formats.js +++ b/packages/format-library/src/default-formats.js @@ -9,6 +9,8 @@ import { link } from './link'; import { strikethrough } from './strikethrough'; import { underline } from './underline'; import { textColor } from './text-color'; +import { subscript } from './subscript'; +import { superscript } from './superscript'; export default [ bold, @@ -19,4 +21,6 @@ export default [ strikethrough, underline, textColor, + subscript, + superscript, ]; diff --git a/packages/format-library/src/link/inline.js b/packages/format-library/src/link/inline.js index 00bdadb1068e4a..779bbbf89834fd 100644 --- a/packages/format-library/src/link/inline.js +++ b/packages/format-library/src/link/inline.js @@ -128,7 +128,10 @@ function InlineLinkUI( { ); onChange( insert( value, toInsert ) ); } else { - onChange( applyFormat( value, format ) ); + const newValue = applyFormat( value, format ); + newValue.start = newValue.end; + newValue.activeFormats = []; + onChange( newValue ); } // Focus should only be shifted back to the formatted segment when the diff --git a/packages/format-library/src/subscript/index.js b/packages/format-library/src/subscript/index.js new file mode 100644 index 00000000000000..4cf6026f38d051 --- /dev/null +++ b/packages/format-library/src/subscript/index.js @@ -0,0 +1,36 @@ +/** + * WordPress dependencies + */ +import { __ } from '@wordpress/i18n'; +import { toggleFormat } from '@wordpress/rich-text'; +import { RichTextToolbarButton } from '@wordpress/block-editor'; +import { subscript as subscriptIcon } from '@wordpress/icons'; + +const name = 'core/subscript'; +const title = __( 'Subscript' ); + +export const subscript = { + name, + title, + tagName: 'sub', + className: null, + edit( { isActive, value, onChange, onFocus } ) { + function onToggle() { + onChange( toggleFormat( value, { type: name } ) ); + } + + function onClick() { + onToggle(); + onFocus(); + } + + return ( + + ); + }, +}; diff --git a/packages/format-library/src/superscript/index.js b/packages/format-library/src/superscript/index.js new file mode 100644 index 00000000000000..06bd7f03520d53 --- /dev/null +++ b/packages/format-library/src/superscript/index.js @@ -0,0 +1,36 @@ +/** + * WordPress dependencies + */ +import { __ } from '@wordpress/i18n'; +import { toggleFormat } from '@wordpress/rich-text'; +import { RichTextToolbarButton } from '@wordpress/block-editor'; +import { superscript as superscriptIcon } from '@wordpress/icons'; + +const name = 'core/superscript'; +const title = __( 'Superscript' ); + +export const superscript = { + name, + title, + tagName: 'sup', + className: null, + edit( { isActive, value, onChange, onFocus } ) { + function onToggle() { + onChange( toggleFormat( value, { type: name } ) ); + } + + function onClick() { + onToggle(); + onFocus(); + } + + return ( + + ); + }, +}; diff --git a/packages/i18n/CHANGELOG.md b/packages/i18n/CHANGELOG.md index de98c0eee73db9..00316e01bcd0b5 100644 --- a/packages/i18n/CHANGELOG.md +++ b/packages/i18n/CHANGELOG.md @@ -1,13 +1,22 @@ ## Master +### Bug Fix + +- Relax type of `sprintf` arguments type ([#21919](https://github.com/WordPress/gutenberg/pull/21919)) + ## 3.11.0 (2020-04-15) -### New Feature +### New Features -- Add `isRTL` function ([#20298](https://github.com/WordPress/gutenberg/pull/20298)) - Include TypeScript type declarations ([#18942](https://github.com/WordPress/gutenberg/pull/18942)) - Add `createI18n` method to allow creation of multiple i18n instances ([#21182](https://github.com/WordPress/gutenberg/pull/21182)) +## 3.10.0 (2020-04-01) + +### New Feature + +- Add `isRTL` function ([#20298](https://github.com/WordPress/gutenberg/pull/20298)) + ## 3.1.0 (2018-11-15) ### Enhancements diff --git a/packages/i18n/README.md b/packages/i18n/README.md index f57ce4124c191b..366b034f453b78 100644 --- a/packages/i18n/README.md +++ b/packages/i18n/README.md @@ -79,7 +79,7 @@ _Related_ _Parameters_ - _format_ `string`: The format of the string to generate. -- _args_ `...string`: Arguments to apply to the format. +- _args_ `...*`: Arguments to apply to the format. _Returns_ diff --git a/packages/i18n/src/sprintf.js b/packages/i18n/src/sprintf.js index 397fe7abe4e40f..90eca75beae885 100644 --- a/packages/i18n/src/sprintf.js +++ b/packages/i18n/src/sprintf.js @@ -18,7 +18,7 @@ const logErrorOnce = memoize( console.error ); // eslint-disable-line no-console * original format string is returned. * * @param {string} format The format of the string to generate. - * @param {...string} args Arguments to apply to the format. + * @param {...*} args Arguments to apply to the format. * * @see http://www.diveintojavascript.com/projects/javascript-sprintf * diff --git a/packages/i18n/src/test/sprintf.js b/packages/i18n/src/test/sprintf.js index 035d3b3a4b3d41..05000ce401a57d 100644 --- a/packages/i18n/src/test/sprintf.js +++ b/packages/i18n/src/test/sprintf.js @@ -23,5 +23,11 @@ describe( 'i18n', () => { expect( result ).toBe( 'bonjour Riad' ); } ); + + it( 'replaces named placeholders', () => { + const result = sprintf( 'bonjour %(name)s', { name: 'Riad' } ); + + expect( result ).toBe( 'bonjour Riad' ); + } ); } ); } ); diff --git a/packages/icons/tsconfig.json b/packages/icons/_tsconfig.json similarity index 100% rename from packages/icons/tsconfig.json rename to packages/icons/_tsconfig.json diff --git a/packages/icons/src/index.js b/packages/icons/src/index.js index ec4be6602653d5..18e738642cee4d 100644 --- a/packages/icons/src/index.js +++ b/packages/icons/src/index.js @@ -39,6 +39,9 @@ export { default as comment } from './library/comment'; export { default as controlsRepeat } from './library/controls-repeat'; export { default as cover } from './library/cover'; export { default as create } from './library/create'; +export { default as currencyDollar } from './library/currency-dollar'; +export { default as currencyEuro } from './library/currency-euro'; +export { default as currencyPound } from './library/currency-pound'; export { default as desktop } from './library/desktop'; export { default as external } from './library/external'; export { default as file } from './library/file'; @@ -57,6 +60,8 @@ export { default as grid } from './library/grid'; export { default as group } from './library/group'; export { default as heading } from './library/heading'; export { default as help } from './library/help'; +export { default as inbox } from './library/inbox'; +export { default as institution } from './library/institution'; export { default as html } from './library/html'; export { default as image } from './library/image'; export { default as info } from './library/info'; @@ -81,6 +86,8 @@ export { default as navigation } from './library/navigation'; export { default as pageBreak } from './library/page-break'; export { default as page } from './library/page'; export { default as paragraph } from './library/paragraph'; +export { default as payment } from './library/payment'; +export { default as percent } from './library/percent'; export { default as positionCenter } from './library/position-center'; export { default as positionLeft } from './library/position-left'; export { default as positionRight } from './library/position-right'; @@ -92,10 +99,12 @@ export { default as plusCircle } from './library/plus-circle'; export { default as plus } from './library/plus'; export { default as postList } from './library/post-list'; export { default as preformatted } from './library/preformatted'; +export { default as box } from './library/box'; export { default as pullLeft } from './library/pull-left'; export { default as pullRight } from './library/pull-right'; export { default as pullquote } from './library/pullquote'; export { default as quote } from './library/quote'; +export { default as receipt } from './library/receipt'; export { default as redo } from './library/redo'; export { default as replace } from './library/replace'; export { default as resizeCornerNE } from './library/resize-corner-n-e'; @@ -104,11 +113,15 @@ export { default as search } from './library/search'; export { default as separator } from './library/separator'; export { default as share } from './library/share'; export { default as shortcode } from './library/shortcode'; +export { default as star } from './library/star'; export { default as starEmpty } from './library/star-empty'; export { default as starFilled } from './library/star-filled'; export { default as starHalf } from './library/star-half'; export { default as stretchFullWidth } from './library/stretch-full-width'; +export { default as shipping } from './library/shipping'; export { default as stretchWide } from './library/stretch-wide'; +export { default as subscript } from './library/subscript'; +export { default as superscript } from './library/superscript'; export { default as tableColumnAfter } from './library/table-column-after'; export { default as tableColumnBefore } from './library/table-column-before'; export { default as tableColumnDelete } from './library/table-column-delete'; diff --git a/packages/icons/src/library/box.js b/packages/icons/src/library/box.js new file mode 100644 index 00000000000000..c2908c5a8adb38 --- /dev/null +++ b/packages/icons/src/library/box.js @@ -0,0 +1,16 @@ +/** + * WordPress dependencies + */ +import { Path, SVG } from '@wordpress/primitives'; + +const box = ( + + + +); + +export default box; diff --git a/packages/icons/src/library/currency-dollar.js b/packages/icons/src/library/currency-dollar.js new file mode 100644 index 00000000000000..a93d2037346390 --- /dev/null +++ b/packages/icons/src/library/currency-dollar.js @@ -0,0 +1,12 @@ +/** + * WordPress dependencies + */ +import { Path, SVG } from '@wordpress/primitives'; + +const currencyDollar = ( + + + +); + +export default currencyDollar; diff --git a/packages/icons/src/library/currency-euro.js b/packages/icons/src/library/currency-euro.js new file mode 100644 index 00000000000000..9522211027175e --- /dev/null +++ b/packages/icons/src/library/currency-euro.js @@ -0,0 +1,12 @@ +/** + * WordPress dependencies + */ +import { Path, SVG } from '@wordpress/primitives'; + +const currencyEuro = ( + + + +); + +export default currencyEuro; diff --git a/packages/icons/src/library/currency-pound.js b/packages/icons/src/library/currency-pound.js new file mode 100644 index 00000000000000..d2ab8494f3c5b3 --- /dev/null +++ b/packages/icons/src/library/currency-pound.js @@ -0,0 +1,15 @@ +/** + * WordPress dependencies + */ +import { Path, SVG } from '@wordpress/primitives'; + +const currencyPound = ( + + + +); + +export default currencyPound; diff --git a/packages/icons/src/library/inbox.js b/packages/icons/src/library/inbox.js new file mode 100644 index 00000000000000..41b3cf33448cff --- /dev/null +++ b/packages/icons/src/library/inbox.js @@ -0,0 +1,16 @@ +/** + * WordPress dependencies + */ +import { Path, SVG } from '@wordpress/primitives'; + +const inbox = ( + + + +); + +export default inbox; diff --git a/packages/icons/src/library/institution.js b/packages/icons/src/library/institution.js new file mode 100644 index 00000000000000..76cb54b6f188a9 --- /dev/null +++ b/packages/icons/src/library/institution.js @@ -0,0 +1,16 @@ +/** + * WordPress dependencies + */ +import { Path, SVG } from '@wordpress/primitives'; + +const institute = ( + + + +); + +export default institute; diff --git a/packages/icons/src/library/page.js b/packages/icons/src/library/page.js index 65a2d571293abc..9f5338f46aea2b 100644 --- a/packages/icons/src/library/page.js +++ b/packages/icons/src/library/page.js @@ -4,8 +4,8 @@ import { SVG, Path } from '@wordpress/primitives'; const page = ( - - + + ); diff --git a/packages/icons/src/library/payment.js b/packages/icons/src/library/payment.js new file mode 100644 index 00000000000000..771668ccd0035c --- /dev/null +++ b/packages/icons/src/library/payment.js @@ -0,0 +1,16 @@ +/** + * WordPress dependencies + */ +import { Path, SVG } from '@wordpress/primitives'; + +const payment = ( + + + +); + +export default payment; diff --git a/packages/icons/src/library/percent.js b/packages/icons/src/library/percent.js new file mode 100644 index 00000000000000..663eb4e10b1855 --- /dev/null +++ b/packages/icons/src/library/percent.js @@ -0,0 +1,16 @@ +/** + * WordPress dependencies + */ +import { Path, SVG } from '@wordpress/primitives'; + +const percent = ( + + + +); + +export default percent; diff --git a/packages/icons/src/library/receipt.js b/packages/icons/src/library/receipt.js new file mode 100644 index 00000000000000..7db4280a882ef4 --- /dev/null +++ b/packages/icons/src/library/receipt.js @@ -0,0 +1,16 @@ +/** + * WordPress dependencies + */ +import { Path, SVG } from '@wordpress/primitives'; + +const receipt = ( + + + +); + +export default receipt; diff --git a/packages/icons/src/library/shipping.js b/packages/icons/src/library/shipping.js new file mode 100644 index 00000000000000..71c6c364aa4b3c --- /dev/null +++ b/packages/icons/src/library/shipping.js @@ -0,0 +1,12 @@ +/** + * WordPress dependencies + */ +import { Path, SVG } from '@wordpress/primitives'; + +const shipping = ( + + + +); + +export default shipping; diff --git a/packages/icons/src/library/star.js b/packages/icons/src/library/star.js new file mode 100644 index 00000000000000..ad5546e5dcfe2b --- /dev/null +++ b/packages/icons/src/library/star.js @@ -0,0 +1,12 @@ +/** + * WordPress dependencies + */ +import { Path, SVG } from '@wordpress/primitives'; + +const star = ( + + + +); + +export default star; diff --git a/packages/icons/src/library/subscript.js b/packages/icons/src/library/subscript.js new file mode 100644 index 00000000000000..ac536c58135ca6 --- /dev/null +++ b/packages/icons/src/library/subscript.js @@ -0,0 +1,12 @@ +/** + * WordPress dependencies + */ +import { SVG, Path } from '@wordpress/primitives'; + +const subscript = ( + + + +); + +export default subscript; diff --git a/packages/icons/src/library/superscript.js b/packages/icons/src/library/superscript.js new file mode 100644 index 00000000000000..861ea3ceada0d3 --- /dev/null +++ b/packages/icons/src/library/superscript.js @@ -0,0 +1,12 @@ +/** + * WordPress dependencies + */ +import { SVG, Path } from '@wordpress/primitives'; + +const superscript = ( + + + +); + +export default superscript; diff --git a/packages/icons/src/library/trending-down.js b/packages/icons/src/library/trending-down.js new file mode 100644 index 00000000000000..c0104041b8b8c8 --- /dev/null +++ b/packages/icons/src/library/trending-down.js @@ -0,0 +1,12 @@ +/** + * WordPress dependencies + */ +import { SVG, Path } from '@wordpress/primitives'; + +const trendingDown = ( + + + +); + +export default trendingDown; diff --git a/packages/icons/src/library/trending-up.js b/packages/icons/src/library/trending-up.js new file mode 100644 index 00000000000000..ab1a5e53d1581a --- /dev/null +++ b/packages/icons/src/library/trending-up.js @@ -0,0 +1,12 @@ +/** + * WordPress dependencies + */ +import { SVG, Path } from '@wordpress/primitives'; + +const trendingUp = ( + + + +); + +export default trendingUp; diff --git a/packages/interface/src/components/complementary-area/index.js b/packages/interface/src/components/complementary-area/index.js index 54d34edc45eafc..2a60be08d3b456 100644 --- a/packages/interface/src/components/complementary-area/index.js +++ b/packages/interface/src/components/complementary-area/index.js @@ -67,7 +67,7 @@ function ComplementaryArea( { const { pinItem, unpinItem } = useDispatch( 'core/interface' ); return ( <> - { isPinned && ( + { isPinned && isPinnable && (
) }
+ { !! leftSidebar && ( +
+ { leftSidebar } +
+ ) }
@@ -77,7 +93,6 @@ function InterfaceSkeleton( {
@@ -88,7 +103,6 @@ function InterfaceSkeleton( {
@@ -100,7 +114,6 @@ function InterfaceSkeleton( {
diff --git a/packages/interface/src/components/interface-skeleton/style.scss b/packages/interface/src/components/interface-skeleton/style.scss index 39b7b85493f20d..b9095d2e5946bc 100644 --- a/packages/interface/src/components/interface-skeleton/style.scss +++ b/packages/interface/src/components/interface-skeleton/style.scss @@ -24,7 +24,7 @@ html.interface-interface-skeleton__html-container { bottom: 0; // Adjust to admin-bar going small. - @include break-medium() { + @media (min-width: #{ ($break-medium + 1) }) { top: $admin-bar-height; .is-fullscreen-mode & { @@ -73,6 +73,7 @@ html.interface-interface-skeleton__html-container { } +.interface-interface-skeleton__left-sidebar, .interface-interface-skeleton__sidebar { display: block; width: auto; // Keep the sidebar width flexible. @@ -88,13 +89,24 @@ html.interface-interface-skeleton__html-container { // On Mobile the header is fixed to keep HTML as scrollable. @include break-medium() { - overflow: auto; - border-left: $border-width solid $light-gray-500; position: relative !important; z-index: z-index(".interface-interface-skeleton__sidebar {greater than small}"); } } +.interface-interface-skeleton__sidebar { + @include break-medium() { + overflow: auto; + border-left: $border-width solid $light-gray-500; + } +} + +.interface-interface-skeleton__left-sidebar { + @include break-medium() { + border-right: $border-width solid $light-gray-500; + } +} + .interface-interface-skeleton__header { flex-shrink: 0; height: auto; // Keep the height flexible. diff --git a/packages/interface/src/store/defaults.js b/packages/interface/src/store/defaults.js index 9d5c172d262441..03d79595552b1e 100644 --- a/packages/interface/src/store/defaults.js +++ b/packages/interface/src/store/defaults.js @@ -6,13 +6,5 @@ export const DEFAULTS = { 'core/edit-post': 'edit-post/document', }, }, - multipleEnableItems: { - pinnedItems: { - 'core/edit-site': { - 'edit-site/block-inspector': true, - 'edit-site/global-styles': true, - }, - }, - }, }, }; diff --git a/packages/interface/src/store/reducer.js b/packages/interface/src/store/reducer.js index f3540ec5c38513..fbd4f341500ca4 100644 --- a/packages/interface/src/store/reducer.js +++ b/packages/interface/src/store/reducer.js @@ -85,28 +85,6 @@ export function multipleEnableItems( } const currentTypeState = state[ itemType ] || {}; const currentScopeState = currentTypeState[ scope ] || {}; - if ( - ! isEnable && - ! get( DEFAULTS.enableItems.multipleEnableItems, [ - itemType, - scope, - item, - ] ) - ) { - const newScopeState = omit( currentScopeState, [ item ] ); - const newTypeState = isEmpty( newScopeState ) - ? omit( currentTypeState, [ scope ] ) - : { - ...currentScopeState, - [ scope ]: newScopeState, - }; - return isEmpty( newTypeState ) - ? omit( state, [ itemType ] ) - : { - ...state, - [ itemType ]: newTypeState, - }; - } return { ...state, diff --git a/packages/interface/src/store/selectors.js b/packages/interface/src/store/selectors.js index 08c7d787bdb8e9..d273d96fead346 100644 --- a/packages/interface/src/store/selectors.js +++ b/packages/interface/src/store/selectors.js @@ -40,16 +40,14 @@ export function getActiveComplementaryArea( state, scope ) { * @param {string} scope Scope. * @param {string} item Item to check. * - * @return {boolean} True if the item is enabled and false otherwise. + * @return {boolean|undefined} True if the item is enabled, false otherwise if the item is explicitly disabled, and undefined if there is no information for that item. */ function isMultipleEnabledItemEnabled( state, itemType, scope, item ) { - return ( - get( state.enableItems.multipleEnableItems, [ - itemType, - scope, - item, - ] ) === true - ); + return get( state.enableItems.multipleEnableItems, [ + itemType, + scope, + item, + ] ); } /** @@ -62,5 +60,8 @@ function isMultipleEnabledItemEnabled( state, itemType, scope, item ) { * @return {boolean} True if the item is pinned and false otherwise. */ export function isItemPinned( state, scope, item ) { - return isMultipleEnabledItemEnabled( state, 'pinnedItems', scope, item ); + return ( + isMultipleEnabledItemEnabled( state, 'pinnedItems', scope, item ) !== + false + ); } diff --git a/packages/jest-puppeteer-axe/CHANGELOG.md b/packages/jest-puppeteer-axe/CHANGELOG.md index 1d1fe3ca36aeb7..61266033660bbc 100644 --- a/packages/jest-puppeteer-axe/CHANGELOG.md +++ b/packages/jest-puppeteer-axe/CHANGELOG.md @@ -1,3 +1,9 @@ +## Master + +## New Features + +- The `axe-puppeteer` dependency has been updated from requiring `^1.0.0` to requiring `^1.1.0`. + ## 1.1.0 (2019-05-21) ### New Feature diff --git a/packages/jest-puppeteer-axe/package.json b/packages/jest-puppeteer-axe/package.json index 825d6fbb5a05b5..06f49b3c279edf 100644 --- a/packages/jest-puppeteer-axe/package.json +++ b/packages/jest-puppeteer-axe/package.json @@ -31,7 +31,7 @@ "module": "build-module/index.js", "dependencies": { "@babel/runtime": "^7.9.2", - "axe-puppeteer": "^1.0.0" + "axe-puppeteer": "^1.1.0" }, "peerDependencies": { "jest": ">=24", diff --git a/packages/keycodes/CHANGELOG.md b/packages/keycodes/CHANGELOG.md index b630cfb0799b3a..ac2aec6c368b01 100644 --- a/packages/keycodes/CHANGELOG.md +++ b/packages/keycodes/CHANGELOG.md @@ -1,3 +1,9 @@ +## Master + +### Bug Fixes + +- `isKeyboardEvent` now tests expected modifiers as an exclusive set, fixing an issue where additional modifiers would wrongly report as satisfying a test for a subset of those modifiers [#20733](https://github.com/WordPress/gutenberg/pull/20733). + ## 2.0.5 (2018-11-21) ## 2.0.4 (2018-11-20) diff --git a/packages/keycodes/src/index.js b/packages/keycodes/src/index.js index fc975909aa4e4d..f9de2e6c9d67cf 100644 --- a/packages/keycodes/src/index.js +++ b/packages/keycodes/src/index.js @@ -12,7 +12,7 @@ /** * External dependencies */ -import { get, mapValues, includes, capitalize } from 'lodash'; +import { get, mapValues, includes, capitalize, xor } from 'lodash'; /** * WordPress dependencies @@ -223,6 +223,20 @@ export const shortcutAriaLabel = mapValues( modifiers, ( modifier ) => { }; } ); +/** + * From a given KeyboardEvent, returns an array of active modifier constants for + * the event. + * + * @param {KeyboardEvent} event Keyboard event. + * + * @return {Array} Active modifier constants. + */ +function getEventModifiers( event ) { + return [ ALT, CTRL, COMMAND, SHIFT ].filter( + ( key ) => event[ `${ key }Key` ] + ); +} + /** * An object that contains functions to check if a keyboard event matches a * predefined shortcut combination. @@ -234,8 +248,9 @@ export const shortcutAriaLabel = mapValues( modifiers, ( modifier ) => { export const isKeyboardEvent = mapValues( modifiers, ( getModifiers ) => { return ( event, character, _isApple = isAppleOS ) => { const mods = getModifiers( _isApple ); + const eventMods = getEventModifiers( event ); - if ( ! mods.every( ( key ) => event[ `${ key }Key` ] ) ) { + if ( xor( mods, eventMods ).length ) { return false; } diff --git a/packages/keycodes/src/test/index.js b/packages/keycodes/src/test/index.js index dccd99884ac2b3..5378101cc42ef0 100644 --- a/packages/keycodes/src/test/index.js +++ b/packages/keycodes/src/test/index.js @@ -296,6 +296,21 @@ describe( 'isKeyboardEvent', () => { return attachNode; } + it( 'returns false for a superset of modifiers', () => { + expect.assertions( 3 ); + const attachNode = attachEventListeners( ( event ) => { + expect( + isKeyboardEvent.primary( event, 'm', isAppleOSFalse ) + ).toBe( false ); + } ); + + keyPress( attachNode, { + ctrlKey: true, + shiftKey: true, + key: 'm', + } ); + } ); + describe( 'primary', () => { it( 'should identify modifier key when Ctrl is pressed', () => { expect.assertions( 3 ); @@ -359,7 +374,11 @@ describe( 'isKeyboardEvent', () => { expect.assertions( 3 ); const attachNode = attachEventListeners( ( event ) => { expect( - isKeyboardEvent.primary( event, undefined, isAppleOSFalse ) + isKeyboardEvent.primaryShift( + event, + undefined, + isAppleOSFalse + ) ).toBe( true ); } ); @@ -374,7 +393,11 @@ describe( 'isKeyboardEvent', () => { expect.assertions( 3 ); const attachNode = attachEventListeners( ( event ) => { expect( - isKeyboardEvent.primary( event, undefined, isAppleOSTrue ) + isKeyboardEvent.primaryShift( + event, + undefined, + isAppleOSTrue + ) ).toBe( true ); } ); @@ -389,7 +412,7 @@ describe( 'isKeyboardEvent', () => { expect.assertions( 3 ); const attachNode = attachEventListeners( ( event ) => { expect( - isKeyboardEvent.primary( event, 'm', isAppleOSFalse ) + isKeyboardEvent.primaryShift( event, 'm', isAppleOSFalse ) ).toBe( true ); } ); @@ -404,7 +427,7 @@ describe( 'isKeyboardEvent', () => { expect.assertions( 3 ); const attachNode = attachEventListeners( ( event ) => { expect( - isKeyboardEvent.primary( event, 'm', isAppleOSTrue ) + isKeyboardEvent.primaryShift( event, 'm', isAppleOSTrue ) ).toBe( true ); } ); @@ -421,7 +444,11 @@ describe( 'isKeyboardEvent', () => { expect.assertions( 3 ); const attachNode = attachEventListeners( ( event ) => { expect( - isKeyboardEvent.primary( event, undefined, isAppleOSFalse ) + isKeyboardEvent.secondary( + event, + undefined, + isAppleOSFalse + ) ).toBe( true ); } ); @@ -437,7 +464,7 @@ describe( 'isKeyboardEvent', () => { expect.assertions( 3 ); const attachNode = attachEventListeners( ( event ) => { expect( - isKeyboardEvent.primary( event, undefined, isAppleOSTrue ) + isKeyboardEvent.secondary( event, undefined, isAppleOSTrue ) ).toBe( true ); } ); @@ -453,7 +480,7 @@ describe( 'isKeyboardEvent', () => { expect.assertions( 3 ); const attachNode = attachEventListeners( ( event ) => { expect( - isKeyboardEvent.primary( event, 'm', isAppleOSFalse ) + isKeyboardEvent.secondary( event, 'm', isAppleOSFalse ) ).toBe( true ); } ); @@ -469,7 +496,7 @@ describe( 'isKeyboardEvent', () => { expect.assertions( 3 ); const attachNode = attachEventListeners( ( event ) => { expect( - isKeyboardEvent.primary( event, 'm', isAppleOSTrue ) + isKeyboardEvent.secondary( event, 'm', isAppleOSTrue ) ).toBe( true ); } ); @@ -483,61 +510,61 @@ describe( 'isKeyboardEvent', () => { } ); describe( 'access', () => { - it( 'should identify modifier key when Alt + Ctrl is pressed', () => { + it( 'should identify modifier key when Shift + Alt is pressed', () => { expect.assertions( 3 ); const attachNode = attachEventListeners( ( event ) => { expect( - isKeyboardEvent.primary( event, undefined, isAppleOSFalse ) + isKeyboardEvent.access( event, undefined, isAppleOSFalse ) ).toBe( true ); } ); keyPress( attachNode, { - ctrlKey: true, + shiftKey: true, altKey: true, - key: 'Ctrl', + key: 'Alt', } ); } ); - it( 'should identify modifier key when ⌥⌘ is pressed', () => { + it( 'should identify modifier key when Ctrl + ⌥ is pressed', () => { expect.assertions( 3 ); const attachNode = attachEventListeners( ( event ) => { expect( - isKeyboardEvent.primary( event, undefined, isAppleOSTrue ) + isKeyboardEvent.access( event, undefined, isAppleOSTrue ) ).toBe( true ); } ); keyPress( attachNode, { - metaKey: true, + ctrlKey: true, altKey: true, - key: 'Meta', + key: 'Alt', } ); } ); - it( 'should identify modifier key when Ctrl + ALt + M is pressed', () => { + it( 'should identify modifier key when Shift + Alt + M is pressed', () => { expect.assertions( 3 ); const attachNode = attachEventListeners( ( event ) => { expect( - isKeyboardEvent.primary( event, 'm', isAppleOSFalse ) + isKeyboardEvent.access( event, 'm', isAppleOSFalse ) ).toBe( true ); } ); keyPress( attachNode, { - ctrlKey: true, + shiftKey: true, altKey: true, key: 'm', } ); } ); - it( 'should identify modifier key when ⌥⌘M is pressed', () => { + it( 'should identify modifier key when Ctrl + ⌥M is pressed', () => { expect.assertions( 3 ); const attachNode = attachEventListeners( ( event ) => { expect( - isKeyboardEvent.primary( event, 'm', isAppleOSTrue ) + isKeyboardEvent.access( event, 'm', isAppleOSTrue ) ).toBe( true ); } ); keyPress( attachNode, { - metaKey: true, + ctrlKey: true, altKey: true, key: 'm', } ); diff --git a/packages/media-utils/src/utils/upload-media.js b/packages/media-utils/src/utils/upload-media.js index fb31af14cf4965..aba998e4e2dd4b 100644 --- a/packages/media-utils/src/utils/upload-media.js +++ b/packages/media-utils/src/utils/upload-media.js @@ -118,9 +118,11 @@ export async function uploadMedia( { const validFiles = []; for ( const mediaFile of files ) { - // verify if user is allowed to upload this mime type + // Verify if user is allowed to upload this mime type. + // Defer to the server when type not detected. if ( allowedMimeTypesForUser && + mediaFile.type && ! isAllowedMimeTypeForUser( mediaFile.type ) ) { triggerError( { @@ -133,8 +135,9 @@ export async function uploadMedia( { continue; } - // Check if the block supports this mime type - if ( ! isAllowedType( mediaFile.type ) ) { + // Check if the block supports this mime type. + // Defer to the server when type not detected. + if ( mediaFile.type && ! isAllowedType( mediaFile.type ) ) { triggerError( { code: 'MIME_TYPE_NOT_SUPPORTED', message: __( 'Sorry, this file type is not supported here.' ), diff --git a/packages/prettier-config/CHANGELOG.md b/packages/prettier-config/CHANGELOG.md index 1d1195f9d8aae7..320942d34efb3a 100644 --- a/packages/prettier-config/CHANGELOG.md +++ b/packages/prettier-config/CHANGELOG.md @@ -1,6 +1,6 @@ ## Master -## 0.2.0 (2020-04-15) +## 0.1.0 (2020-04-01) ### Initial Release diff --git a/packages/primitives/tsconfig.json b/packages/primitives/_tsconfig.json similarity index 100% rename from packages/primitives/tsconfig.json rename to packages/primitives/_tsconfig.json diff --git a/packages/rich-text/src/component/index.native.js b/packages/rich-text/src/component/index.native.js index 22c9a3d3d050f1..ef95601dd80089 100644 --- a/packages/rich-text/src/component/index.native.js +++ b/packages/rich-text/src/component/index.native.js @@ -111,13 +111,7 @@ export class RichText extends Component { */ getRecord() { const { selectionStart: start, selectionEnd: end } = this.props; - let { value } = this.props; - - // Since we get the text selection from Aztec we need to be in sync with the HTML `value` - // Removing leading white spaces using `trim()` should make sure this is the case. - if ( typeof value === 'string' || value instanceof String ) { - value = value.trimLeft(); - } + const { value } = this.props; const { formats, replacements, text } = this.formatToValue( value ); const { activeFormats } = this.state; @@ -811,7 +805,7 @@ export class RichText extends Component { ...style, ...( this.isIOS && minWidth && maxWidth ? { width } - : {} ), + : { maxWidth } ), minHeight: this.state.height, } } text={ { diff --git a/packages/scripts/CHANGELOG.md b/packages/scripts/CHANGELOG.md index 17f13c040e755b..5dfad66760444c 100644 --- a/packages/scripts/CHANGELOG.md +++ b/packages/scripts/CHANGELOG.md @@ -1,5 +1,18 @@ ## Master +### Breaking Changes + +- The bundled `puppeteer` (`^2.0.0`) dependency has been replaced with `puppeteer-core` in version `3.0.0`. Puppeteer uses Chromium v81 instead of Chromium v79. See the [full list of changes](https://github.com/puppeteer/puppeteer/releases/tag/v3.0.0). It also allowed preventing Chromium installation together with `@wordpress/scripts`. It happens now on-demand when running `test-e2e` script, and it re-triggers only when a new version is required. + +### New Features + +- Add debugging support for `test-unit-js` script ([#21631](https://github.com/WordPress/gutenberg/pull/21631)). Tests can be debugged by any [inspector client](https://nodejs.org/en/docs/guides/debugging-getting-started/#inspector-clients) that supports the [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/). + +### Bug fix + +- The bundled `npm-package-json-lint` dependency has been updated from requiring `^4.0.3` to requiring `^5.0.0` ([#21597](https://github.com/WordPress/gutenberg/pull/21597)). [Breaking changes](https://npmpackagejsonlint.org/docs/en/v4-to-v5) don't break anything in this package. It fixes the abrupt shutdown when `"description"` field in `package.json` is empty. +- Update `check-licenses` script to parse JSON dependency tree recursively so sub-dependencies of packages passed in `--ignore` flag are ignored as well. + ## 8.0.0 (2020-04-15) ### Breaking Changes @@ -8,9 +21,14 @@ ### Enhancements +- The bundled `eslint` dependency has been updated from requiring `^6.1.0` to requiring `^6.8.0` ([#21424](https://github.com/WordPress/gutenberg/pull/21424)). + +## 7.2.0 (2020-04-01) + +### Enhancements + - Incompatibility between `@svgr/webpack` in version `4.3.3` and `url-loader` in version `3.0.0` was fixed by bumping `@svgr/webpack` to `^5.2.0`. - All webpack dependencies got minor version update if applicable. -- The bundled `eslint` dependency has been updated from requiring `^6.1.0` to requiring `^6.8.0` ([#21424](https://github.com/WordPress/gutenberg/pull/21424)). ### Internal diff --git a/packages/scripts/README.md b/packages/scripts/README.md index 3c49a764787ed6..35e03eacb68258 100644 --- a/packages/scripts/README.md +++ b/packages/scripts/README.md @@ -425,7 +425,8 @@ _Example:_ "scripts": { "test:unit": "wp-scripts test-unit-js", "test:unit:help": "wp-scripts test-unit-js --help", - "test:unit:watch": "wp-scripts test-unit-js --watch" + "test:unit:watch": "wp-scripts test-unit-js --watch", + "test:unit:debug": "wp-scripts --inspect-brk test-unit-js --runInBand --no-cache" } } ``` @@ -435,6 +436,7 @@ This is how you execute those scripts using the presented setup: * `npm run test:unit` - runs all unit tests. * `npm run test:unit:help` - prints all available options to configure unit tests runner. * `npm run test:unit:watch` - runs all unit tests in the watch mode. +* `npm run test:unit:debug` - runs all unit tests with the node debugger enabled. Jest will look for test files with any of the following popular naming conventions: @@ -442,6 +444,34 @@ Jest will look for test files with any of the following popular naming conventio - Files with `.js` (or `.ts`) suffix directly located in `test` folders. - Files with `.test.js` (or `.test.ts`) suffix. +#### Debugging Jest unit tests + +Tests can be debugged by any [inspector client](https://nodejs.org/en/docs/guides/debugging-getting-started/#inspector-clients) that supports the [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/). + +Follow the instructions for debugging Node.js with your favorite supported browser or IDE. When the instructions say to use `node --inspect script.js` or `node --inspect-brk script.js`, simply use `wp-scripts --inspect test-unit-js` or `wp-scripts --inspect-brk test-unit-js` instead. + +Google Chrome and Visual Studio Code are used as examples below. + +##### Debugging in Google Chrome + +Place `debugger;` statements in any test and run `npm run test:unit:debug`. + +Then open `about:inspect` in Google Chrome and select `inspect` on your process. + +A breakpoint will be set at the first line of the script (this is done to give you time to open the developer tools and to prevent Jest from executing before you have time to do so). Click the resume button in the upper right panel of the dev tools to continue execution. When Jest executes the test that contains the debugger statement, execution will pause and you can examine the current scope and call stack. + +##### Debugging in Visual Studio Code + +Debugging npm scripts is supported out of the box for Visual Studio Code as of [version 1.23](https://code.visualstudio.com/blogs/2018/07/12/introducing-logpoints-and-auto-attach#_npm-scripts-and-debugging) and can be used to debug Jest unit tests. + +First, set a breakpoint in your tests by clicking on a line in the editor's left margin by the line numbers. + +Then open npm scripts in the explorer or run `Explorer: Focus on NPM Scripts View` in the command palette to see the npm scripts. To start the tests, click the debug icon next to `test:unit:debug`. + +The tests will start running, and execution will pause on your selected line so you can inspect the current scope and call stack within the editor. + +See [Debugging in Visual Studio Code](https://code.visualstudio.com/Docs/editor/debugging) for more details on using the Visual Studio Code debugger. + #### Advanced information It uses [Jest](https://jestjs.io/) behind the scenes and you are able to use all of its [CLI options](https://jestjs.io/docs/en/cli.html). You can also run `./node_modules/.bin/wp-scripts test:unit --help` or `npm run test:unit:help` (as mentioned above) to view all of the available options. By default, it uses the set of recommended options defined in [@wordpress/jest-preset-default](https://www.npmjs.com/package/@wordpress/jest-preset-default) npm package. You can override them with your own options as described in [Jest documentation](https://jestjs.io/docs/en/configuration). Learn more in the [Advanced Usage](#advanced-usage) section. diff --git a/packages/scripts/bin/wp-scripts.js b/packages/scripts/bin/wp-scripts.js index a74076ead7f85f..d99d7c0c9fcae4 100755 --- a/packages/scripts/bin/wp-scripts.js +++ b/packages/scripts/bin/wp-scripts.js @@ -3,8 +3,8 @@ /** * Internal dependencies */ -const { getArgsFromCLI, spawnScript } = require( '../utils' ); +const { getNodeArgsFromCLI, spawnScript } = require( '../utils' ); -const [ scriptName, ...nodesArgs ] = getArgsFromCLI(); +const { scriptName, scriptArgs, nodeArgs } = getNodeArgsFromCLI(); -spawnScript( scriptName, nodesArgs ); +spawnScript( scriptName, scriptArgs, nodeArgs ); diff --git a/packages/scripts/package.json b/packages/scripts/package.json index 095318d8926a83..6904013ada57b9 100644 --- a/packages/scripts/package.json +++ b/packages/scripts/package.json @@ -58,9 +58,9 @@ "markdownlint": "^0.18.0", "markdownlint-cli": "^0.21.0", "minimist": "^1.2.0", - "npm-package-json-lint": "^4.0.3", + "npm-package-json-lint": "^5.0.0", "prettier": "npm:wp-prettier@1.19.1", - "puppeteer": "^2.0.0", + "puppeteer": "npm:puppeteer-core@3.0.0", "read-pkg-up": "^1.0.1", "resolve-bin": "^0.4.0", "source-map-loader": "^0.2.4", diff --git a/packages/scripts/scripts/check-licenses.js b/packages/scripts/scripts/check-licenses.js index acf098cffe63d5..2c554c45699ce4 100644 --- a/packages/scripts/scripts/check-licenses.js +++ b/packages/scripts/scripts/check-licenses.js @@ -3,7 +3,6 @@ */ const spawn = require( 'cross-spawn' ); const { existsSync, readFileSync } = require( 'fs' ); -const { sep } = require( 'path' ); const chalk = require( 'chalk' ); /** @@ -21,6 +20,7 @@ const { getArgFromCLI, hasArgInCLI } = require( '../utils' ); */ const ERROR = chalk.reset.inverse.bold.red( ' ERROR ' ); +const WARNING = chalk.reset.inverse.bold.yellow( ' WARNING ' ); const prod = hasArgInCLI( '--prod' ) || hasArgInCLI( '--production' ); const dev = hasArgInCLI( '--dev' ) || hasArgInCLI( '--development' ); @@ -170,36 +170,59 @@ const checkLicense = ( allowedLicense, licenseType ) => { ); }; -/** - * Returns true if the given module path is not to be ignored for consideration - * in license validation, or false otherwise. - * - * @param {string} moduleName Module path. - * - * @return {boolean} Whether module path is not to be ignored. - */ -const isNotIgnoredModule = ( moduleName ) => - ! ignored.some( ( ignoredItem ) => - // `moduleName` is a file path to the module directory. Assume CLI arg - // is passed as basename of package (directory(s) after node_modules). - // Prefix with sep to avoid false-positives on prefixing variations. - moduleName.endsWith( sep + ignoredItem ) - ); - // Use `npm ls` to grab a list of all the packages. -const child = spawn.sync( 'npm', [ - 'ls', - '--parseable', - ...( prod ? [ '--prod' ] : [] ), - ...( dev ? [ '--dev' ] : [] ), -] ); - -const modules = child.stdout - .toString() - .split( '\n' ) - .filter( isNotIgnoredModule ); - -modules.forEach( ( path ) => { +const child = spawn.sync( + 'npm', + [ + 'ls', + '--json', + '--long', + ...( prod ? [ '--prod' ] : [] ), + ...( dev ? [ '--dev' ] : [] ), + ], + { maxBuffer: 1024 * 1024 * 100 } // output size for prod is ~21 MB and dev is ~76 MB +); + +const result = JSON.parse( child.stdout.toString() ); + +const topLevelDeps = result.dependencies; + +function traverseDepTree( deps ) { + for ( const key in deps ) { + const dep = deps[ key ]; + + if ( ignored.includes( dep.name ) ) { + return; + } + + if ( ! dep.hasOwnProperty( 'path' ) ) { + if ( dep.hasOwnProperty( 'peerMissing' ) ) { + process.stdout.write( + `${ WARNING } Unable to locate path for missing peer dep ${ dep.name }@${ dep.version }. ` + ); + } else { + process.exitCode = 1; + process.stdout.write( + `${ ERROR } Unable to locate path for ${ dep.name }@${ dep.version }. ` + ); + } + } else if ( dep.missing ) { + process.stdout.write( + `${ WARNING } missing dep ${ dep.name }@${ dep.version }. ` + ); + } else { + checkDepLicense( dep.path ); + } + + if ( dep.hasOwnProperty( 'dependencies' ) ) { + traverseDepTree( dep.dependencies ); + } else { + return; + } + } +} + +function checkDepLicense( path ) { if ( ! path ) { return; } @@ -287,4 +310,6 @@ modules.forEach( ( path ) => { `${ ERROR } Module ${ packageInfo.name } has an incompatible license '${ licenseType }'.\n` ); } -} ); +} + +traverseDepTree( topLevelDeps ); diff --git a/packages/scripts/scripts/test-e2e.js b/packages/scripts/scripts/test-e2e.js index 2cc42f09c4d588..6ab4dabb2b19c9 100644 --- a/packages/scripts/scripts/test-e2e.js +++ b/packages/scripts/scripts/test-e2e.js @@ -14,6 +14,7 @@ process.on( 'unhandledRejection', ( err ) => { */ /* eslint-disable-next-line jest/no-jest-import */ const jest = require( 'jest' ); +const { sync: spawn } = require( 'cross-spawn' ); /** * Internal dependencies @@ -27,6 +28,14 @@ const { hasJestConfig, } = require( '../utils' ); +const result = spawn( 'node', [ require.resolve( 'puppeteer/install' ) ], { + stdio: 'inherit', +} ); + +if ( result.status > 0 ) { + process.exit( result.status ); +} + // Provides a default config path for Puppeteer when jest-puppeteer.config.js // wasn't found at the root of the project or a custom path wasn't defined // using JEST_PUPPETEER_CONFIG environment variable. diff --git a/packages/scripts/utils/cli.js b/packages/scripts/utils/cli.js index c1572ece8a23c1..5f889e7543fa91 100644 --- a/packages/scripts/utils/cli.js +++ b/packages/scripts/utils/cli.js @@ -7,7 +7,7 @@ const spawn = require( 'cross-spawn' ); /** * Internal dependencies */ -const { fromScriptsRoot, hasScriptFile } = require( './file' ); +const { fromScriptsRoot, hasScriptFile, getScripts } = require( './file' ); const { exit, getArgsFromCLI } = require( './process' ); const getArgFromCLI = ( arg ) => { @@ -23,6 +23,17 @@ const hasArgInCLI = ( arg ) => getArgFromCLI( arg ) !== undefined; const getFileArgsFromCLI = () => minimist( getArgsFromCLI() )._; +const getNodeArgsFromCLI = () => { + const args = getArgsFromCLI(); + const scripts = getScripts(); + const scriptIndex = args.findIndex( ( arg ) => scripts.includes( arg ) ); + return { + nodeArgs: args.slice( 0, scriptIndex ), + scriptName: args[ scriptIndex ], + scriptArgs: args.slice( scriptIndex + 1 ), + }; +}; + const hasFileArgInCLI = () => getFileArgsFromCLI().length > 0; const handleSignal = ( signal ) => { @@ -44,7 +55,7 @@ const handleSignal = ( signal ) => { exit( 1 ); }; -const spawnScript = ( scriptName, args = [] ) => { +const spawnScript = ( scriptName, args = [], nodeArgs = [] ) => { if ( ! scriptName ) { // eslint-disable-next-line no-console console.log( 'Script name is missing.' ); @@ -64,7 +75,7 @@ const spawnScript = ( scriptName, args = [] ) => { const { signal, status } = spawn.sync( 'node', - [ fromScriptsRoot( scriptName ), ...args ], + [ ...nodeArgs, fromScriptsRoot( scriptName ), ...args ], { stdio: 'inherit', } @@ -81,6 +92,7 @@ module.exports = { getArgFromCLI, getArgsFromCLI, getFileArgsFromCLI, + getNodeArgsFromCLI, hasArgInCLI, hasFileArgInCLI, spawnScript, diff --git a/packages/scripts/utils/file.js b/packages/scripts/utils/file.js index 24dd8ad505e4bf..6e5718210e66b3 100644 --- a/packages/scripts/utils/file.js +++ b/packages/scripts/utils/file.js @@ -1,7 +1,7 @@ /** * External dependencies */ -const { existsSync } = require( 'fs' ); +const { existsSync, readdirSync } = require( 'fs' ); const path = require( 'path' ); /** @@ -24,10 +24,16 @@ const fromScriptsRoot = ( scriptName ) => const hasScriptFile = ( scriptName ) => existsSync( fromScriptsRoot( scriptName ) ); +const getScripts = () => + readdirSync( path.join( path.dirname( __dirname ), 'scripts' ) ) + .filter( ( f ) => path.extname( f ) === '.js' ) + .map( ( f ) => path.basename( f, '.js' ) ); + module.exports = { fromProjectRoot, fromConfigRoot, fromScriptsRoot, + getScripts, hasProjectFile, hasScriptFile, }; diff --git a/packages/scripts/utils/index.js b/packages/scripts/utils/index.js index 0629a0e21bcab7..5b0e62569108e5 100644 --- a/packages/scripts/utils/index.js +++ b/packages/scripts/utils/index.js @@ -5,6 +5,7 @@ const { getArgFromCLI, getArgsFromCLI, getFileArgsFromCLI, + getNodeArgsFromCLI, hasArgInCLI, hasFileArgInCLI, spawnScript, @@ -22,16 +23,15 @@ const { } = require( './env' ); const { fromProjectRoot, fromConfigRoot, hasProjectFile } = require( './file' ); const { hasPackageProp } = require( './package' ); -const { camelCaseDash } = require( './string' ); module.exports = { buildWordPress, - camelCaseDash, fromProjectRoot, fromConfigRoot, getArgFromCLI, getArgsFromCLI, getFileArgsFromCLI, + getNodeArgsFromCLI, getWebpackArgs, hasBabelConfig, hasArgInCLI, diff --git a/packages/scripts/utils/string.js b/packages/scripts/utils/string.js deleted file mode 100644 index f44be223dec807..00000000000000 --- a/packages/scripts/utils/string.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Given a string, returns a new string with dash separators converted to - * camelCase equivalent. This is not as aggressive as `_.camelCase` in - * converting to uppercase, where Lodash will also capitalize letters - * following numbers. - * - * @param {string} string Input dash-delimited string. - * - * @return {string} Camel-cased string. - */ -function camelCaseDash( string ) { - return string.replace( /-([a-z])/g, ( match, letter ) => - letter.toUpperCase() - ); -} - -module.exports = { - camelCaseDash, -}; diff --git a/packages/scripts/utils/test/index.js b/packages/scripts/utils/test/index.js index 45c2e27339e356..218e9cc1bc82d3 100644 --- a/packages/scripts/utils/test/index.js +++ b/packages/scripts/utils/test/index.js @@ -121,6 +121,32 @@ describe( 'utils', () => { expect( console ).toHaveLogged(); } ); + test( 'should pass inspect args to node', () => { + crossSpawnMock.mockReturnValueOnce( { status: 0 } ); + + expect( () => + spawnScript( scriptName, [], [ '--inspect-brk' ] ) + ).toThrow( 'Exit code: 0.' ); + expect( crossSpawnMock ).toHaveBeenCalledWith( + 'node', + [ '--inspect-brk', expect.stringContaining( scriptName ) ], + { stdio: 'inherit' } + ); + } ); + + test( 'should pass script args to the script', () => { + crossSpawnMock.mockReturnValueOnce( { status: 0 } ); + + expect( () => + spawnScript( scriptName, [ '--runInBand' ] ) + ).toThrow( 'Exit code: 0.' ); + expect( crossSpawnMock ).toHaveBeenCalledWith( + 'node', + [ expect.stringContaining( scriptName ), '--runInBand' ], + { stdio: 'inherit' } + ); + } ); + test( 'should finish successfully when the script properly executed', () => { crossSpawnMock.mockReturnValueOnce( { status: 0 } ); diff --git a/packages/scripts/utils/test/string.js b/packages/scripts/utils/test/string.js deleted file mode 100644 index aa0f441186fa11..00000000000000 --- a/packages/scripts/utils/test/string.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Internal dependencies - */ -import { camelCaseDash } from '../string'; - -describe( 'string', () => { - describe( 'camelCaseDash', () => { - test( 'does not change a single word', () => { - expect( camelCaseDash( 'blocks' ) ).toBe( 'blocks' ); - expect( camelCaseDash( 'dom' ) ).toBe( 'dom' ); - } ); - - test( 'does not capitalize letters following numbers', () => { - expect( camelCaseDash( 'a11y' ) ).toBe( 'a11y' ); - expect( camelCaseDash( 'i18n' ) ).toBe( 'i18n' ); - } ); - - test( 'converts dashes into camel case', () => { - expect( camelCaseDash( 'api-fetch' ) ).toBe( 'apiFetch' ); - expect( camelCaseDash( 'list-reusable-blocks' ) ).toBe( - 'listReusableBlocks' - ); - } ); - } ); -} ); diff --git a/packages/url/CHANGELOG.md b/packages/url/CHANGELOG.md index f45554a6c0dc99..5bf991fdb09c73 100644 --- a/packages/url/CHANGELOG.md +++ b/packages/url/CHANGELOG.md @@ -1,11 +1,17 @@ ## Master +### Bug fix + +- `addQueryArgs` arguments are optional ([#21926](https://github.com/WordPress/gutenberg/pull/21926)) + ## 2.13.0 (2020-04-15) ### New feature - Include TypeScript type declarations ([#18942](https://github.com/WordPress/gutenberg/pull/18942)) +# 2.12.0 (2020-04-01) + ### Bug Fixes - `getQueryString` now correctly considers hash fragments when considering whether to return a query string. Previously, `getQueryString( 'https://example.com/#?foo' )` would wrongly return `'foo'` as its result. A hash fragment is always the last segment of a URL, and the querystring must always precede it ([see reference specification](https://url.spec.whatwg.org/#absolute-url-with-fragment-string)). diff --git a/packages/url/README.md b/packages/url/README.md index 71b2a0d47a5ab0..87c21efa4ed0c8 100644 --- a/packages/url/README.md +++ b/packages/url/README.md @@ -31,7 +31,7 @@ const newURL = addQueryArgs( 'https://google.com', { q: 'test' } ); // https://g _Parameters_ - _url_ `[string]`: URL to which arguments should be appended. If omitted, only the resulting querystring is returned. -- _args_ `Object`: Query arguments to apply to URL. +- _args_ `[Object]`: Query arguments to apply to URL. _Returns_ @@ -44,11 +44,11 @@ Performs some basic cleanup of a string for use as a post slug. This replicates some of what `sanitize_title()` does in WordPress core, but is only designed to approximate what the slug will be. -Converts whitespace, periods, forward slashes and underscores to hyphens. Converts Latin-1 Supplement and Latin Extended-A letters to basic Latin -letters. Removes combining diacritical marks. Converts remaining string -to lowercase. It does not touch octets, HTML entities, or other encoded -characters. +letters. Removes combining diacritical marks. Converts whitespace, periods, +and forward slashes to hyphens. Removes any remaining non-word characters +except hyphens. Converts remaining string to lowercase. It does not account +for octets, HTML entities, or other encoded characters. _Parameters_ diff --git a/packages/url/src/add-query-args.js b/packages/url/src/add-query-args.js index 9a1add3af409be..2d48c0be5a06b8 100644 --- a/packages/url/src/add-query-args.js +++ b/packages/url/src/add-query-args.js @@ -10,7 +10,7 @@ import { parse, stringify } from 'qs'; * * @param {string} [url=''] URL to which arguments should be appended. If omitted, * only the resulting querystring is returned. - * @param {Object} args Query arguments to apply to URL. + * @param {Object} [args] Query arguments to apply to URL. * * @example * ```js diff --git a/packages/url/src/clean-for-slug.js b/packages/url/src/clean-for-slug.js index 4a1b3317d43dd9..a26587b91bde2a 100644 --- a/packages/url/src/clean-for-slug.js +++ b/packages/url/src/clean-for-slug.js @@ -1,7 +1,7 @@ /** * External dependencies */ -import { deburr, toLower, trim } from 'lodash'; +import { deburr, trim } from 'lodash'; /** * Performs some basic cleanup of a string for use as a post slug. @@ -9,11 +9,11 @@ import { deburr, toLower, trim } from 'lodash'; * This replicates some of what `sanitize_title()` does in WordPress core, but * is only designed to approximate what the slug will be. * - * Converts whitespace, periods, forward slashes and underscores to hyphens. * Converts Latin-1 Supplement and Latin Extended-A letters to basic Latin - * letters. Removes combining diacritical marks. Converts remaining string - * to lowercase. It does not touch octets, HTML entities, or other encoded - * characters. + * letters. Removes combining diacritical marks. Converts whitespace, periods, + * and forward slashes to hyphens. Removes any remaining non-word characters + * except hyphens. Converts remaining string to lowercase. It does not account + * for octets, HTML entities, or other encoded characters. * * @param {string} string Title or slug to be processed. * @@ -23,7 +23,11 @@ export function cleanForSlug( string ) { if ( ! string ) { return ''; } - return toLower( - deburr( trim( string.replace( /[\s\./_]+/g, '-' ), '-' ) ) + return trim( + deburr( string ) + .replace( /[\s\./]+/g, '-' ) + .replace( /[^\w-]+/g, '' ) + .toLowerCase(), + '-' ); } diff --git a/packages/url/src/test/index.test.js b/packages/url/src/test/index.test.js index b9e85c88e748cf..5473ee98eeb483 100644 --- a/packages/url/src/test/index.test.js +++ b/packages/url/src/test/index.test.js @@ -666,7 +666,7 @@ describe( 'filterURLForDisplay', () => { describe( 'cleanForSlug', () => { it( 'should return string prepared for use as url slug', () => { - expect( cleanForSlug( ' /Déjà_vu. ' ) ).toBe( 'deja-vu' ); + expect( cleanForSlug( '/Is th@t Déjà_vu? ' ) ).toBe( 'is-tht-deja_vu' ); } ); it( 'should return an empty string for missing argument', () => { diff --git a/packages/url/tsconfig.json b/packages/url/tsconfig.json index 70efdfe49990d5..3c2c31f506f132 100644 --- a/packages/url/tsconfig.json +++ b/packages/url/tsconfig.json @@ -2,10 +2,7 @@ "extends": "../../tsconfig.base.json", "compilerOptions": { "rootDir": "src", - "declarationDir": "build-types", - - // This is required because the `react-native-url-polyfill` dependency lacks types - "noImplicitAny": false + "declarationDir": "build-types" }, "include": [ "src/**/*" ] } diff --git a/phpunit/class-block-context-test.php b/phpunit/class-block-context-test.php new file mode 100644 index 00000000000000..769b0e02429168 --- /dev/null +++ b/phpunit/class-block-context-test.php @@ -0,0 +1,136 @@ + 'example', + 'post_excerpt' => '', + ); + + $post = $this->factory()->post->create_and_get( $args ); + setup_postdata( $post ); + } + + /** + * Tear down each test method. + */ + public function tearDown() { + parent::tearDown(); + + while ( ! empty( $this->registered_block_names ) ) { + $block_name = array_pop( $this->registered_block_names ); + unregister_block_type( $block_name ); + } + } + + /** + * Registers a block type. + * + * @param string|WP_Block_Type $name Block type name including namespace, or alternatively a + * complete WP_Block_Type instance. In case a WP_Block_Type + * is provided, the $args parameter will be ignored. + * @param array $args { + * Optional. Array of block type arguments. Any arguments may be defined, however the + * ones described below are supported by default. Default empty array. + * + * @type callable $render_callback Callback used to render blocks of this block type. + * } + */ + protected function register_block_type( $name, $args ) { + register_block_type( $name, $args ); + + $this->registered_block_names[] = $name; + } + + /** + * Tests that a block which provides context makes that context available to + * its inner blocks. + */ + function test_provides_block_context() { + $this->markTestSkipped(); + + $provided_context = array(); + + $this->register_block_type( + 'gutenberg/test-context-provider', + array( + 'attributes' => array( + 'contextWithAssigned' => array( + 'type' => 'number', + ), + 'contextWithDefault' => array( + 'type' => 'number', + 'default' => 0, + ), + 'contextWithoutDefault' => array( + 'type' => 'number', + ), + 'contextNotRequested' => array( + 'type' => 'number', + ), + ), + 'providesContext' => array( + 'gutenberg/contextWithAssigned' => 'contextWithAssigned', + 'gutenberg/contextWithDefault' => 'contextWithDefault', + 'gutenberg/contextWithoutDefault' => 'contextWithoutDefault', + 'gutenberg/contextNotRequested' => 'contextNotRequested', + ), + ) + ); + + $this->register_block_type( + 'gutenberg/test-context-consumer', + array( + 'context' => array( + 'gutenberg/contextWithDefault', + 'gutenberg/contextWithAssigned', + 'gutenberg/contextWithoutDefault', + ), + 'render_callback' => function() use ( &$provided_context ) { + global $_experimental_block; + + $provided_context[] = $_experimental_block->context; + + return ''; + }, + ) + ); + + $parsed_blocks = parse_blocks( + '' . + '' . + '' + ); + + render_block( $parsed_blocks[0] ); + + $this->assertEquals( + array( + 'gutenberg/contextWithDefault' => 0, + 'gutenberg/contextWithAssigned' => 10, + ), + $provided_context[0] + ); + } + +} diff --git a/phpunit/class-wp-block-test.php b/phpunit/class-wp-block-test.php new file mode 100644 index 00000000000000..dba70ae06c09a3 --- /dev/null +++ b/phpunit/class-wp-block-test.php @@ -0,0 +1,339 @@ +registry = new WP_Block_Type_Registry(); + } + + /** + * Tear down each test method. + */ + public function tearDown() { + parent::tearDown(); + + $this->registry = null; + } + + function test_constructor_assigns_properties_from_parsed_block() { + $this->registry->register( 'core/example', array() ); + + $parsed_blocks = parse_blocks( 'ab' ); + $parsed_block = $parsed_blocks[0]; + $context = array(); + $block = new WP_Block( $parsed_block, $context, $this->registry ); + + $this->assertEquals( $parsed_block['blockName'], $block->name ); + $this->assertEquals( $parsed_block['attrs'], $block->attributes ); + $this->assertEquals( $parsed_block['innerContent'], $block->inner_content ); + $this->assertEquals( $parsed_block['innerHTML'], $block->inner_html ); + } + + function test_constructor_assigns_block_type_from_registry() { + $block_type_settings = array( + 'attributes' => array( + 'defaulted' => array( + 'type' => 'number', + 'default' => 10, + ), + ), + ); + $this->registry->register( 'core/example', $block_type_settings ); + + $parsed_block = array( 'blockName' => 'core/example' ); + $context = array(); + $block = new WP_Block( $parsed_block, $context, $this->registry ); + + $this->assertInstanceOf( WP_Block_Type::class, $block->block_type ); + $this->assertEquals( + $block_type_settings['attributes'], + $block->block_type->attributes + ); + } + + function test_constructor_assigns_attributes_with_defaults() { + $this->registry->register( + 'core/example', + array( + 'attributes' => array( + 'defaulted' => array( + 'type' => 'number', + 'default' => 10, + ), + ), + ) + ); + + $parsed_block = array( + 'blockName' => 'core/example', + 'attrs' => array( + 'explicit' => 20, + ), + ); + $context = array(); + $block = new WP_Block( $parsed_block, $context, $this->registry ); + + $this->assertEquals( + array( + 'defaulted' => 10, + 'explicit' => 20, + ), + $block->attributes + ); + } + + function test_constructor_assigns_attributes_with_only_defaults() { + $this->registry->register( + 'core/example', + array( + 'attributes' => array( + 'defaulted' => array( + 'type' => 'number', + 'default' => 10, + ), + ), + ) + ); + + $parsed_block = array( + 'blockName' => 'core/example', + 'attrs' => array(), + ); + $context = array(); + $block = new WP_Block( $parsed_block, $context, $this->registry ); + + $this->assertEquals( array( 'defaulted' => 10 ), $block->attributes ); + } + + function test_constructor_assigns_context_from_block_type() { + $this->registry->register( + 'core/example', + array( + 'context' => array( 'requested' ), + ) + ); + + $parsed_block = array( 'blockName' => 'core/example' ); + $context = array( + 'requested' => 'included', + 'unrequested' => 'not included', + ); + $block = new WP_Block( $parsed_block, $context, $this->registry ); + + $this->assertEquals( array( 'requested' => 'included' ), $block->context ); + } + + function test_constructor_maps_inner_blocks() { + $this->registry->register( 'core/example', array() ); + + $parsed_blocks = parse_blocks( 'ab' ); + $parsed_block = $parsed_blocks[0]; + $context = array(); + $block = new WP_Block( $parsed_block, $context, $this->registry ); + + $this->assertCount( 1, $block->inner_blocks ); + $this->assertInstanceOf( WP_Block::class, $block->inner_blocks[0] ); + $this->assertEquals( 'core/example', $block->inner_blocks[0]->name ); + } + + function test_constructor_prepares_context_for_inner_blocks() { + $this->registry->register( + 'core/outer', + array( + 'attributes' => array( + 'recordId' => array( + 'type' => 'number', + ), + ), + 'providesContext' => array( + 'core/recordId' => 'recordId', + ), + ) + ); + $this->registry->register( + 'core/inner', + array( + 'context' => array( 'core/recordId' ), + ) + ); + + $parsed_blocks = parse_blocks( '' ); + $parsed_block = $parsed_blocks[0]; + $context = array( 'unrequested' => 'not included' ); + $block = new WP_Block( $parsed_block, $context, $this->registry ); + + $this->assertCount( 0, $block->context ); + $this->assertEquals( + array( 'core/recordId' => 10 ), + $block->inner_blocks[0]->context + ); + } + + function test_constructor_assigns_merged_context() { + $this->registry->register( + 'core/example', + array( + 'attributes' => array( + 'value' => array( + 'type' => array( 'string', 'null' ), + ), + ), + 'providesContext' => array( + 'core/value' => 'value', + ), + 'context' => array( 'core/value' ), + ) + ); + + $parsed_blocks = parse_blocks( + '' . + '' . + '' . + '' . + '' + ); + $parsed_block = $parsed_blocks[0]; + $context = array( 'core/value' => 'original' ); + $block = new WP_Block( $parsed_block, $context, $this->registry ); + + $this->assertEquals( + array( 'core/value' => 'original' ), + $block->context + ); + $this->assertEquals( + array( 'core/value' => 'merged' ), + $block->inner_blocks[0]->context + ); + $this->assertEquals( + array( 'core/value' => null ), + $block->inner_blocks[0]->inner_blocks[0]->context + ); + } + + function test_render_static_block_type_returns_own_content() { + $this->registry->register( 'core/static', array() ); + $this->registry->register( + 'core/dynamic', + array( + 'render_callback' => function() { + return 'b'; + }, + ) + ); + + $parsed_blocks = parse_blocks( 'ac' ); + $parsed_block = $parsed_blocks[0]; + $context = array(); + $block = new WP_Block( $parsed_block, $context, $this->registry ); + + $this->assertSame( 'abc', $block->render() ); + } + + function test_render_assigns_instance_global_for_render_callback() { + $this->registry->register( + 'core/greeting', + array( + 'attributes' => array( + 'toWhom' => array( + 'type' => 'string', + ), + 'punctuation' => array( + 'type' => 'string', + 'default' => '!', + ), + ), + 'render_callback' => function() { + global $_experimental_block; + + return sprintf( + 'Hello %s%s', + $_experimental_block->attributes['toWhom'], + $_experimental_block->attributes['punctuation'] + ); + }, + ) + ); + + $parsed_blocks = parse_blocks( '' ); + $parsed_block = $parsed_blocks[0]; + $context = array(); + $block = new WP_Block( $parsed_block, $context, $this->registry ); + + $this->assertSame( 'Hello world!', $block->render() ); + } + + function test_passes_attributes_to_render_callback() { + $this->registry->register( + 'core/greeting', + array( + 'attributes' => array( + 'toWhom' => array( + 'type' => 'string', + ), + 'punctuation' => array( + 'type' => 'string', + 'default' => '!', + ), + ), + 'render_callback' => function( $block_attributes ) { + return sprintf( + 'Hello %s%s', + $block_attributes['toWhom'], + $block_attributes['punctuation'] + ); + }, + ) + ); + + $parsed_blocks = parse_blocks( '' ); + $parsed_block = $parsed_blocks[0]; + $context = array(); + $block = new WP_Block( $parsed_block, $context, $this->registry ); + + $this->assertSame( 'Hello world!', $block->render() ); + } + + function test_passes_content_to_render_callback() { + $this->registry->register( + 'core/outer', + array( + 'render_callback' => function( $block_attributes, $content ) { + return $content; + }, + ) + ); + $this->registry->register( + 'core/inner', + array( + 'render_callback' => function() { + return 'b'; + }, + ) + ); + + $parsed_blocks = parse_blocks( 'ac' ); + $parsed_block = $parsed_blocks[0]; + $context = array(); + $block = new WP_Block( $parsed_block, $context, $this->registry ); + + $this->assertSame( 'abc', $block->render() ); + } + +} diff --git a/readme.txt b/readme.txt index 4e327cd97efc46..37576e2f7c6463 100644 --- a/readme.txt +++ b/readme.txt @@ -52,4 +52,4 @@ The four phases of the project are Editing, Customization, Collaboration, and Mu == Changelog == -To read the changelog for Gutenberg 7.9.0-rc.1, please navigate to the release page. +To read the changelog for Gutenberg 8.0.0, please navigate to the release page. diff --git a/storybook/README.md b/storybook/README.md index b397d03c607739..ce1411f259e0f8 100644 --- a/storybook/README.md +++ b/storybook/README.md @@ -7,9 +7,3 @@ The Gutenberg project uses Storybook to view and work with the UI components dev View online at: https://wordpress.github.io/gutenberg/ Run locally in your development environment running: `npm run storybook:dev` from the top-level Gutenberg directory. - -## StoryShots Integration - -> [StoryShots](https://www.npmjs.com/package/@storybook/addon-storyshots) adds automatic Jest Snapshot Testing for [Storybook](https://storybook.js.org/). - -Please refer to [Testing Overview](/docs/contributors/testing-overview.md#storyshots) to learn how to maintain auto-generated unit tests from stories added to Storybook. diff --git a/storybook/test/__snapshots__/index.js.snap b/storybook/test/__snapshots__/index.js.snap deleted file mode 100644 index 8b70d1608b401a..00000000000000 --- a/storybook/test/__snapshots__/index.js.snap +++ /dev/null @@ -1,17034 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Storyshots Components/AnglePickerControl Default 1`] = ` -
-
- - - -
-
-`; - -exports[`Storyshots Components/Animate Appear Bottom Left 1`] = ` -
-
-

- Appear animation. Origin: - bottom left - . -

-
- -
-`; - -exports[`Storyshots Components/Animate Appear Bottom Right 1`] = ` -
-
-

- Appear animation. Origin: - bottom right - . -

-
- -
-`; - -exports[`Storyshots Components/Animate Appear Top Left 1`] = ` -
-
-

- Appear animation. Origin: - top left - . -

-
- -
-`; - -exports[`Storyshots Components/Animate Appear Top Right 1`] = ` -
-
-

- Appear animation. Origin: - top right - . -

-
- -
-`; - -exports[`Storyshots Components/Animate Default 1`] = ` -
-
-

- No default animation. Use one of type = "appear", "slide-in", or "loading". -

-
- -
-`; - -exports[`Storyshots Components/Animate Loading 1`] = ` -
-
-

- Loading animation. -

-
- -
-`; - -exports[`Storyshots Components/Animate Slide In 1`] = ` -
-
-

- Slide-in animation. -

-
- -
-`; - -exports[`Storyshots Components/BaseControl Default 1`] = ` -
-
- -