From 0a3009e280dfee405a72b6515b9cd69c0028faf4 Mon Sep 17 00:00:00 2001 From: Stefanos Togoulidis Date: Mon, 10 Feb 2020 22:19:00 +0200 Subject: [PATCH] RNMobile release v1.22.0 (#20062) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Use Select: Fix render queue. (#19286) * Use Select: Fix render queue issues. * Use Select: Make `isMounted` more informative. * Framework: Reset lockfile changes to dependencies Co-authored-by: Andrew Duthie * Project Management: Run pull request automation on closed (#19742) * Try/group block custom text color (#19181) * Add text color selector to group block to allow setting a text colour that applies to all children of the group to avoid having to set text colour on every individual child * Block Editor: Handle LinkControl submission via form handler (#19651) * Block Editor: Handle LinkControl submission via form handler * E2E Tests: Unskip intermittent buttons test failure * Added conditions and new translation strings for BlockMover (#19757) * Added conditions and new translation strings for BlockMover * Moved translator comments into sprintf function * Storybook: Add Placeholder component story (#19734) * Add Placeholder story for storybook * Update storybook test snapshot * Project Management: Fix pull request merge automation errors (#19768) * Framework: Use fixed version of checkout action Avoid unintended breaking changes. To a lesser extent, helps clarify that this tag refers to the _version of the action_, not the branch being checked out. * Framework: Configure PR automation checkout to master branch * Add post requests documentation for apiFetch (#19759) * Multi-select: don't focus first selected block (#19762) * Multi-select: don't focus first selected block * Move CopyHandler outside WritingFlow * Fix click appender * Remove useless line * Update: Readme.txt Link to changelog instead of adding it inline(#19761) * Fix: Media & Text: "Crop image to fill entire column" reset on image change (#19765) * Build: Include JSON files in zip archive (#19772) * Build: Include JSON files * Zip build script: Include json files in `build/block-library/blocks/` Co-Authored-By: Jorge Bernal Co-authored-by: Jorge Bernal * Makes appenders visible only for the current selection (#19598) * makes appenders visible only for the current selection * adds smaller footprint to appenders in navigation, only shows them if item has descendants * align appender to level of the menu item, remove useless CSS * Core-data: do not publish outdated state to subscribers during updates (#19752) * Core-data: do not publish outdated state to subscribers during updates Calling `saveEntityRecord` with an update does the following: 1. Calls `getEntityRecord` to fetch the current persisted state of the entity record 2. Calls `receiveEntityRecords` with the new up-to-date state to render the updates 3. Sends an API fetch with the update patch to persist the update 4. Calls `receiveEntityRecords` again with the new up-to-date *persisted* state The issue here, is that point 1 (Calling `getEntityRecord`) not only fetches the persisted state, but it also internally calls `receiveEntityRecords` itself . This results in the persisted outdated server state to be rendered on the UI, causing a flickering effect, that jumps pack when point 2 takes turn. This commit removes the call to getEntityRecord, and instead, it just calls receiveEntityRecords with the local up-to-date state of the entity record. This fixes the flickering issue. * Core-data: update tests to match saveEntityRecord yeilded actions Given `saveEntityRecord` no longer selects `getEntityRecord`, which itself triggers a SELECT action, two SELECTs are no longer yielded. This commit removes the expectation of these two SELECTs. * Core-data: Introduce getEntityRecordNoResolver selector To allow saveEntityRecord access the latest local full version of an entity without issung an API request. This prevents propogating outdating states to subscribers when saveEntityRecord is called. See: https://github.com/WordPress/gutenberg/pull/19752#discussion_r368498318 * Address review comments at #19752: 1. Capitalize alll added comment messages 2. Alias getEntityRecord with getEntityRecordNoResolver instead of copying it 3. Use describe.each instaed of looping manually in selectors tests * Add WordPress primitives package (#19781) * navigation-link: set page id in the attrs (#18641) * Project management: Add step that updates CHANGELOG files before npm releases (#19764) * Navigation Block: Add submenu chevron w/ setting (#19601) * Initialize setting in the nav block settings panel * Add submenu icon * Register "showSubmenuIcon" attributes * Add submenu icon to front-end of the page * Update submenu icon setting description * Don't use for RichText element * Isolate NavigationLink icons * Clean up a little * Use for NavigationLink contents * Rename `$level_zero` to `$is_level_zero` * Add missing spaces * Update submenu icon selector in style.scss * Add comment about span-wrapping * Fix phpcs errors * Remove unused styles * Fix failing e2e tests * Update failing snapshots * Embed: Fix failure placeholder alignment/sizing (#19673) * Fix error message sizing + alignment in Embed Placeholder * Fix Table placeholder input vs button alignment * Adjust spacing between error message and buttons * Fix card component sub-component example code (#19802) * Introduce the Icons package (#17055) * Expose @wordpress/icons to react-native (#19810) * Block popover: allow scrolling over (#19769) * Block popover: allow scrolling over * Clean up * Fix overlapping inserter popover * Better comment * Multi select: keep selection after move (#19784) * Multi select: keep selection after move * Add e2e test * Change e2e test * Address feedback * Fix snapshots * Bump plugin version to 7.3.0 * Navigation: Select parent navigation block on handleCreateFromExistingPages() action (#19817) * Paragraph block: remove dead CSS (#19821) * Bundle the icons package instead of using it as an external (#19809) * Move a dozen of block icons to the icons package (#19808) * Chore: Improve package-lock.json configuration * Add mkevins and pinarol as code owners for gallery block (#19829) * Added shippedProposals (#19065) * Added shippedProposals * Setting shippedProposals during init * Rich text: remove is-selected class (#19822) * Rich text: prefix is-selected class * Adjust more cases * Remove the class * Move more block SVGs to the icons package (#19834) * Block: use context to provide selected element (#19782) * Block: use context to provide selected element * Include multi selection nodes * Add comment * Popover: clean up requestAnimationFrame (#19771) * Popover: clean up requestAnimationFrame * Cancel the last request before a new request * Update: Removed editor store usage from native mobile block ed… (#18794) * Navigation: Manage navigation link appender visibility based on current selection (#19846) Show the navigation link appender when the selected item has descendants and is selected, or if it's the parent of the selected block. * Remove editor dependency from the block library (#16160) * Add AnglePicker Component; Add useDragging hook (#19637) This commit adds a component to pick angles and a hook to make dragging things easier to implement. Some components will be refactored to use the new hook e.g: the custom gradient picker. * Testing: Use deterministic selectors for incremented IDs (#19844) * Innerblock Templates Docs Link Typo Issue Fixed (#19813) * Innerblock Templates Docs Link Typo Issue Fixed * Innerblock Templates Docs Link Typo Issue Fixed * Rich text: enable if multi selection is aborted (#19839) * Block Directory: Refactor the reducer by breaking out the block management actions into their own reducer. (#19330) * Block Directory: Refactory the reducer by break out the block management actions into their own reducer. * Moved hasPermission into its own reducer. * Also remove the 'items' list as it's not being used * Update the getInstalledBlockTypes selector to point to the new reducer that manages installs. * Update typo in test. * Remove the lodash dependency in the selectors. It isn\'t necessary. * Fix panel header styles (#19842) * Move more block icons to the icons package (#19838) * Bump @babel/preset-env to 7.8.3 (Optional Chaining!) (#19831) * Bump babel to 7.8.3 * Added test for optional chaining * Bump other babel packages. * Fix * Changelog Update CHANGELOG.md * Update package-lock.json Co-authored-by: Grzegorz (Greg) Ziółkowski * Style improvements for template previews (#19763) * First scaffold for template previews (mobile only) * WIP: managed to make the preview show, saving as a checkpoint - BlockEditorProvider needs an update so it uses the subRegistry - We need a better way to only render the picker on the main block list - We need to make the bottom sheet full height, and adapt the block preview accordingly * Set a fixed height for the template preview * Move template picker to the toolbar * Read only block list * Lint fixes * Made scrolling sort of working with read only block list * A longer template to test scrolling * Replace BottomSheet with Modal for previews * Allow closing previews with back button on Android * Revert changes to BlockList that were required for bottom sheet integration * Revert changes to BottomSheet * Add usage example for ModalHeaderBar * Improve accessibility of template preview * Improve accessibility of ModalHeaderBar * Remove unused imports * Added missing web file * RNMobile - Page template picker: apply layout from the preview * RNMobile - Layout preview: apply action * RNMobile - Page templates - set layout action * Remove mobile action from docs * New components for modal header buttons * Fix alignment of modal header buttons * Fix metrics for iOS modal header * Add subtitle to preview header * Use named color for modal header button * Updated modal title color and weight * Make Apply button bolder on iOS * Make Apply button bolder on iOS * Fix vertical alignment for close button * Allow modal rotation on iOS * Fix modal background on dark mode * Fixed dark mode for template previews * Revert changes to editor store after bad merge * Add material close icon for modal header * Tweak modal title colors * Lint fixes Co-authored-by: Gerardo Pacheco * [RNMobile] Release v1.21.0 to master (#19854) * Adding empty function to RichText children call. (#19818) This fixes a crash originated on this PR: https://github.com/WordPress/gutenberg/pull/19536 ` * Disable gallery image size options on mobile (#19828) * Revert "Disable gallery image size options on mobile (#19828)" This reverts commit 47b74aa42f54735d2012b40d362da9fb48974cd5. Co-authored-by: Matthew Kevins * Packages: New create-block package for block scaffolding (#19773) * Packages: New create-block package for block scaffolding * Promote action handler to async to make implementation simpler * Pass the prop for selection color. (#19635) * Do not use the deprecated package editor for InnerBlocks component (#19869) * Remove dead is-hovered selectors (#19870) * Move is-navigate-mode class to WritingFlow (#19868) * [RNmobile] Upgrade to RN 0.61.5 (#19369) * `focusable` replaced `clickable See https://github.com/facebook/react-native/pull/25274 * Provide a native colors.native.scss * Upgrade React Native version in Gutenberg web repo * Jest doesn't have hasteImplModulePath anymore * Work around other regressions. Will revert when those fixed * Bump react-native version to 0.61.5 * Update babel-jest to try fixing babel-plugin-jest-hoist jest.mock issue * Update jest to try fixing babel-plugin-jest-hoist jest.mock issue * Pin xmldom to older version to bypass license file ambiguity With newer versions, the license check script doesn't recognise that the package is dual licenced and is reporting it as incompatible. This commit pins the package to an older version. There is no functional difference between the two versions, see https://github.com/xmldom/xmldom/compare/v0.1.27...v0.1.30 * Revert "Provide a native colors.native.scss" This reverts commit b05f1e48c03d6ca880a8ffcca4dc7d4261550f8d. This shouldn't be needed anymore after https://github.com/wordpress-mobile/gutenberg-mobile/pull/1683 * Revert "Pin xmldom to older version to bypass license file ambiguity" This reverts commit 7e3c2b51446ec9db8a171a737d73ff8e477ce4dc. * Cater for lowercase OR in licenses types Props to @pento for the solution https://github.com/WordPress/gutenberg/pull/19369#issuecomment-571008348 * Update package-lock.json via npm v6.13.6 * Check for the same "or" format as we're splitting Otherwise, the 'or' in `GPL-2.0-or-later` causes an infinite recursion. See error in https://travis-ci.com/WordPress/gutenberg/jobs/278348885. * Update package-lock.json after running run check-local-changes * Fix package-lock.json conflicts by keeping Jest to 24.9.0, Babel to 7.8.3 * Update package-lock by running npm install * Update README.md (#19876) Fix typo * Multi selection: fix intermittent e2e failure (#19865) * Move more block icons to the icons library (#19862) * Paragraph block: remove min-height (#19835) * Paragraph block: remove min-height * Use lineheight to set drop cap min height * Framework: Fix server-registered fixtures script (#19884) * Env: Format run output only for terminal display * Framework: Fix server-registered fixtures script * Testing: Regenerate server-registered fixtures * Testing: Regenerate navigation block fixture * Env: Fix CHANGELOG typo "or" * Shortcode Design Review (#19852) * Update style of shortcode based on design review * Fix title colors * Update component to components in CONTRIBUTING.md (#19914) * Apply sentence case formatting to PanelBody titles (#19901) * Color Settings -> Color settings * Block PanelBody titles: Settings -> settings * Clarify when isEligible function is called (#19899) Added a note that isEligible is only used for valid blocks and is not called for invalid blocks. * Block Editor: Refactor ObserveTyping as function component (#19881) * Block Editor: Refactor ObserveTyping as function component * Block Editor: ObserveTyping: Avoid persisting event * Remove unnecessary import from playground (#19893) * Documentation: Organize Contributors Guide (#19853) * Simplify CONTRIBUTING.md to be just guidelines We don't need to include too much here because the real information for contributing is in the handbook. This page is a standard page for Github repos, so trimming it down to just a few links to sections in the handbook. Plus the policies for code of conduct and GPL. * Add design contribution from CONTRIBUTING.md to design page * Cleanup and organize Contributors Guide * Use consistent Contributors Guide title * Move Principles and catch-all docs to Project Overview section * Switch background to more relevant repository management * Apply suggestions from code review Thanks for the fixes :+1: Co-Authored-By: Chris Van Patten * Fix extra newlines * Standardize on Contributor Guide, matches core handbook * Update manifest Co-authored-by: Chris Van Patten * [RNMobile] Correct isMobile condition in nested Media&Text (#19778) * Correct isMobile condition in nested Media&Text * Do not export BREAKPOINTS * Blocks: Match blocks in the inserter using keywords from patterns (#19243) * Blocks: Match blocks in the inserter using keywords from patterns * Ensure that matched patterns with the search term are marked * Introduce scopes for block patterns * Make it possible to apply initial attributes and inner blocks directly from the inserter * Update block preview in the inserter to use attributes from the variation * Change the way patterns are handled in the inserter * Update packages/block-editor/src/components/block-types-list/index.js Co-Authored-By: Miguel Fonseca * Improve the way patterns are added to the inserter * Rename pattern label to patter title to align with block types * Inserter: Don't auto-add block if it has variations Co-authored-by: Miguel Fonseca * Block editor: Alt+F10 shouldn't scroll to top (#19896) * Add e2e test * Leave fixed position until position can be set * Multi-selection: fix clearing with side click (#19787) * Multi-selection: fix clearing with side click * Add e2e test * [RNMobile] fix show appender and separator in Group block (#19908) * fix appender to duplicate separator line * Add docs for LocalAutosaveMonitor and __experimentalUpdateLocalAutosaveInterval (#19915) * [RNMobile] Add media edit icon to image block (#19723) * Creates a MediaEdit component that shows a picker * Add Gridicon's customize icon * Show a button in images block that displays a picker * Fix lint issues * Fix no-shadow error * Fix the name of the params * When "Edit" is selected, request the Media Editor * Fix lint issues * Change media editor ID to a constant * When "Replace" is tapped, show all available media options * Fix lint issues * Avoid destructuring * Block Library: Handle Popover onClose for LinkControl (#19885) * Block Library: Handle Popover onClose for LinkControl * E2E Tests: Verify link popover Escape handling * Disable Autocomplete in shortcode block (#19848) * Disable Autocomplete in shortcode block * RichText API: Limit `prefix` transformations to Paragraph (#19727) … and any consumer of RichText that provides experimental prop `__unstableAllowPrefixTransformations.` * Block Editor: LinkControl: Resolve error when undefined value, "view" state (#19856) * Block Editor: LinkControl: Resolve error when undefined value, "view" state * Block Editor: LinkControl: Document only url, title, opensInNewTab value properties * Block Editor: LinkControl: Change documented example to reference known value property * [RNMobile] Revert change to fix Action Sheet (#19934) * Revert "Avoid destructuring" This reverts commit e1133106d76ca04b9710b5f6d4a3aaf59c2a1a73. * Fix the var name * Add background color support to Columns block (#17813) * Add attributes * Update edit function * Update save function * Add .has-background style * Improve has-background and backgroundColor.class checks * Try passing the columns block e2e test * Refactor to use __experimentalUseColors * Normalize has-background padding with variables * Remove extra bit * Fix RTL styling for Media Text block (#18764) * Add proper !rtl ignore comments to maintain styling on RTL * Tweak comment * Add direction: ltr (not ignored) to the content container * change order of composing style in svg primitive (#19927) * Add Prettier formatting script (#18048) * Add Prettier NPM dependency to packages/scripts and top-level * Scripts: export the fromProjectRoot function from scripts/utils module * Scripts: Add Prettier formatting script * ESLint config: use default (linebreak before ternary op) config for operator-linebreak rule * ESLint: disable formatting rules in the recommended config Adds `eslint-config-prettier` to the recommended config and creates an alternative `recommended-with-formatting` config for project that want to keep ESLint formatting rules and opt-out of Prettier. * Scripts: the format-js script checks if Prettier is present and has top-level config Prettier presence in a `wp-scripts`-powered project is optional, and the `format-js` script checks if it's there and if it's indeed the fork (`wp-prettier`). Will report error otherwise. Also, require a top-level Prettier config to be present. We can't default to the one inside `wp-scripts`, because IDE and editor integrations won't find it there and will use the Prettier defaults. * Bump the minimum required version of npm to 6.9.0 * Add ESLint config changes notice to changelog * Update package-lock.json * Regenerate package-lock.json Co-authored-by: Grzegorz (Greg) Ziółkowski * Components: FontSizePicker: Adjust Select Button sizing (#19479) * Documentation: fix typo "Th" to "The" (#19833) * [RNMobile] Long-press on inserter to show options for "add above" and "add below" (#18791) * Add onLongPress prop to Button * Show inserter menu on long press * Make onLongPress a prop of toggle * Make withSelect of Inserter return destinationRootClientId * Insert default block before the selected one on long press * Add add canReplaceBlock key to the insertionPoint state * Hide a block in list only if it can be replaced * Move insertion index logic from menu to inserter * Update selector tests for newly added key in state * Add insertionIndexAfter and isAnyBlockSelected props with selector * Update docs for newly added key in state * Add insertionType to component state and map to insertion index * Refactor insertion index logic * Show BottomSheet on long press to choose to insert before or after * Update UI strings to be title case * Hide cancel button from Bottom Sheet on Android * Add icons to Bottom Sheet options on Android * Add “Replace Current Block” option to menu on long-press * Scroll to newly added block if it doesn't trigger keyboard to open * Change “Replace Current Block” menu icon on Android * Use shorter syntax for setState * Rename getShouldReplaceBlock method to shouldReplaceBlock * Revert "Scroll to newly added block if it doesn't trigger keyboard to open" This reverts commit 9c1c71d25eb573427ca09761bd3154286d19539b. * Revert “Add canReplaceBlock key to the insertionPoint state" * Remove Block show/hide logic from BlockList * Update Inserter local state to store block insertion information * Make InserterMenu add/remove unmodified default block during replace * Handle replacing last remaining block * Fix Inserter test * Fix code style issue * Move insertion options into getInsertionOptions function * Add comment about removing last block case * Use findByProps instead of toJSON when testing Inserter * Docs: Add details for format-js to @wordpress/scripts package (#19946) * Docs: Add details for format-js to @wordpress/scripts package * Update README.md * Update packages/eslint-plugin/CHANGELOG.md Co-Authored-By: Marcus Kazmierczak Co-authored-by: Marcus Kazmierczak * Fix: Crash when creating a hierarchical post without title (#19936) * Fix: Color Gradients component was not able to handle only gra… (#19925) * Add markdownlint script to lint docs markup (#19855) * Add markdownlint script to lint docs markup Adds a new script `lint-md-docs` that runs markdownlint to lint markdown files for proper syntax. A default `.markdownlint.json` config is included, it will require some testing to tune. Fixes #12426 * Clarify naming of lint-md scripts js and docs - Updates lint-md scripts to lint-md-js for linting source included in the document and lint-md-docs for linting the markup of the document itself. - Update scripts changelog - Update readme with commands * Apply suggestions from code review Co-Authored-By: Grzegorz (Greg) Ziółkowski * Fix URL for markdownlint CLI * Add -i check, details around ignore on CLI * Check for additional project config files * Update script commands to all for lint:* * Local changes applied to package-lock.json * Update packages/scripts/README.md Co-Authored-By: Grzegorz (Greg) Ziółkowski * Apply suggestions from code review Thanks for the review and updates :+1: Co-Authored-By: Grzegorz (Greg) Ziółkowski Co-authored-by: Grzegorz (Greg) Ziółkowski * Use require.resolve() instead of in @wordpress/jest-preset-default (#19957) * use require.resolve() instead of * formatted * added changelog entry (#19958) * Move the insert dashicon to the icons package (#19943) * Replace all occurences of the yes dashicon with the check icon from the icons package (#19926) * Build: Include block.json files in the build output (#19786) * Block Editor: LinkControl: Prevent focus loss in edit mode toggle (#19931) * Block Editor: LinkControl: Prevent focus loss in edit mode toggle * Block Library: Remove custom focus loss protection Previously used effect lifecycle to anticipate and respond to focus loss. Now, focus loss is prevented by LinkControl. See: 722a4d6dec * Block Editor: Rephrase and move forced input rendering comment * Block Editor: Ensure isEndingEditWithFocus always assigned as boolean * Move Alignment, movers and trash icons to the icons package (#19944) * Navigation Block: Move the link description panel below the SEO panel because this is likely to be used signficantly less than the SEO panel. (#19917) * Update hover and focus selectors for Move to Trash to ensure they're always red (#19974) - Updates the selectors in .editor-post-trash to use similar specificity as .components-button.is-link for the hover and focus states to ensure that they are always red. * Create block: Code quality improvements for the block scaffolding (#19867) * Create block: Code quality improvements for the block scaffolding * Improve the strucutre and handling of templates Props to @aduth for the proposal: https://github.com/WordPress/gutenberg/pull/19773#discussion_r370833992. * Ensure that package-lock.json file is refreshed with the changes from master * Docs: Add a note about version and help options * Code style: Run Prettier formatting on the package files * Create block: Align .editorconfig with Gutenberg settings * Fix: Use the description provided to fill the `description` field in `package.json` file in ESNext template * Fix: Ensure that values provided for slug and namespace get converted to lower case * Fix: Simplify the logic for transforming slug to title * Update packages/create-block/lib/templates.js Co-Authored-By: Andrew Duthie Co-authored-by: Andrew Duthie * Code quality: Enable linting for JS files starting with . * Popover: fix typo in removing event listener (#19978) * Eslint Plugin: Lint code formatting. (#19963) * Eslint Plugin: Lint code formatting. * Gutenberg: Add code formatting pre-commit hook. * Eslint Plugin: Update docs. * Gutenberg: Format code. * Storybook: Update snapshots. * [RNMobile] Show the media edit icon only if the block is selected (#19961) * Only shows the media edit icon if the block is selected Also, matches the style of the native gallery block buttons * Fix lint * Fix: Admin menu collapses for 960px width but editor doesn't (#19970) * Chore: Fix differences in package-lock.json file * RichText: try using hooks for wrapper component (#19095) * Components: Apply width-based modifier classes to Placeholder only when width is known (#19825) * Components: Apply `is-small` modifier class to Placeholder only when width known * E2E Tests: Wait for placeholder error display in embed tests * Testing: Update snapshots for Placeholder class assignment * Eslint: set line width to 80 (#19992) * Update config * npm run lint-js:fix * Move eslint comments * Update snapshots * Editor: Remove post title escaping (#19955) * Add: Global styles css variables generation mechanism (#19883) * Navigation: Change UX to move focus to navigation link label and close the LinkControl (#19686) * When adding a link via the LinkControl, selects/highlights nav link label text if it's url-like. Focuses if not. Automatically adds url-like labels as the label. * Adds @wordpress/dom to package-lock.json * Removed test for awaiting for Link Control focus after pressing Enter, as the focus should now be on the navigation link text with the Link Control closed * Lib: Limit `pre_render_block` extension. (#19989) * Lib: Limit `pre_render_block` extension. * Update lib/compat.php Co-Authored-By: Andrew Duthie Co-authored-by: Andrew Duthie * Fix, update, and sort _rc_ `hasProjectFile` filenames (#19994) * Update and fix `hasProjectFile` filenames * Sort `hasProjectFile` filenames * Update CHANGELOG.md * Docs: Include CHANGELOG entries from the relocated create-wordpress-block package * Blocks: Rename patterns to variations in the Block API (#19966) * Blocks: Rename patterns to variations in the Block API * Fix: Remove ESLint errors and warnings related to block variations * [Mobile] Fix gallery upload sync (#19941) * Invoke mediaUploadSync for gallery in React hook * Use integer type explicitly for gallery image id * Set state before attributes on upload success in gallery image * Use ref hook for concurrency in media placeholder * Extract dedup function and add comments in media placeholder * Fix lint * Use explicit radix with parseInt Co-Authored-By: Gerardo Pacheco * Import useRef from @wordpress/element * Fix lint * Fix lint / prettier Co-authored-by: Gerardo Pacheco * [Mobile] Fix blank image size labels on mobile (#19800) (#20045) * Fix blank image size labels on mobile * Use name instead of label in default imageSizes * [RNMobile] Enable Dismiss on PlainText in Android (#20095) * Add flag for determining if running on Android * Enable Dismiss button on PlainText. Enable show keyboard in Android on PlainText mount * Enable Dismiss button on PlainText. Enable show keyboard in Android on PlainText mount Co-authored-by: Enrique Piqueras Co-authored-by: Andrew Duthie Co-authored-by: Glen Davies Co-authored-by: Christopher Reece Co-authored-by: Marcus Kazmierczak Co-authored-by: Ella van Durpe Co-authored-by: Jorge Costa Co-authored-by: Bernie Reiter Co-authored-by: Jorge Bernal Co-authored-by: andrei draganescu Co-authored-by: Omar Alshaker Co-authored-by: Riad Benguella Co-authored-by: Damián Suárez Co-authored-by: Grzegorz (Greg) Ziółkowski Co-authored-by: Bart Kalisz Co-authored-by: Jon Quach Co-authored-by: Edi Amin Co-authored-by: Seghir Nadir Co-authored-by: Jerry Jones Co-authored-by: Matthew Kevins Co-authored-by: Abdelmajid HAMDANI Co-authored-by: Delowar Hossain Co-authored-by: Steven Dufresne Co-authored-by: Adam Boro Co-authored-by: Kukhyeon Heo Co-authored-by: Gerardo Pacheco Co-authored-by: etoledom Co-authored-by: Sérgio Estêvão Co-authored-by: Florian TIAR Co-authored-by: Chip Co-authored-by: Haz Co-authored-by: Rich Tabor Co-authored-by: Benjamin Intal Co-authored-by: Rostislav Wolný Co-authored-by: Chris Van Patten Co-authored-by: Luke Walczak Co-authored-by: Miguel Fonseca Co-authored-by: jbinda Co-authored-by: Leandro Alonso Co-authored-by: Jarda Snajdr Co-authored-by: Martin Posselt Co-authored-by: Ceyhun Ozugur Co-authored-by: James Newell Co-authored-by: Andy Peatling Co-authored-by: Andrew Serong <14988353+andrewserong@users.noreply.github.com> Co-authored-by: Stephen Edgar --- .eslintignore | 3 +- .eslintrc.js | 125 +- .github/CODEOWNERS | 2 + .github/workflows/pull-request-automation.yml | 10 +- .markdownlintignore | 9 + .prettierrc.js | 3 + CONTRIBUTING.md | 36 +- babel.config.js | 5 +- bin/api-docs/are-readmes-unstaged.js | 29 +- bin/api-docs/packages.js | 11 +- bin/api-docs/update-readmes.js | 11 +- bin/build-plugin-zip.sh | 2 +- bin/commander.js | 720 +- bin/generate-public-grammar.js | 50 +- bin/packages/build-worker.js | 64 +- bin/packages/build.js | 84 +- bin/packages/get-babel-config.js | 8 +- bin/packages/watch.js | 63 +- bin/process-git-diff.js | 5 +- changelog.txt | 3 +- docs/contributors/design.md | 6 + docs/contributors/principles.md | 2 +- docs/contributors/readme.md | 35 +- docs/contributors/release.md | 27 +- .../developers/block-api/block-deprecation.md | 2 +- .../block-api/block-registration.md | 2 +- .../developers/block-api/block-templates.md | 2 +- .../developers/data/data-core.md | 15 + .../developers/filters/block-filters.md | 2 +- docs/manifest-devhub.json | 142 +- docs/readme.md | 2 +- docs/rfc/block-registration.md | 2 +- docs/toc.json | 27 +- docs/tool/are-data-files-unstaged.js | 33 +- docs/tool/index.js | 5 +- docs/tool/manifest.js | 8 +- docs/tool/packages.js | 28 +- docs/tool/update-data.js | 16 +- experimental-default-global-styles.json | 9 + gutenberg.php | 2 +- lib/compat.php | 3 + lib/global-styles.php | 131 + lib/load.php | 1 + package-lock.json | 12945 +++++++++------- package.json | 29 +- packages/README.md | 2 +- packages/a11y/package.json | 2 +- packages/a11y/src/addContainer.js | 25 +- packages/a11y/src/index.js | 8 +- packages/a11y/src/index.native.js | 2 - packages/a11y/src/test/addContainer.test.js | 12 +- packages/a11y/src/test/index.test.js | 31 +- packages/annotations/package.json | 2 +- packages/annotations/src/block/index.js | 18 +- packages/annotations/src/format/annotation.js | 50 +- packages/annotations/src/format/index.js | 4 +- packages/annotations/src/index.js | 1 - packages/annotations/src/store/actions.js | 15 +- packages/annotations/src/store/reducer.js | 66 +- packages/annotations/src/store/selectors.js | 37 +- .../annotations/src/store/test/reducer.js | 97 +- packages/api-fetch/README.md | 10 + packages/api-fetch/package.json | 2 +- packages/api-fetch/src/index.js | 63 +- .../src/middlewares/fetch-all-middleware.js | 19 +- packages/api-fetch/src/middlewares/http-v1.js | 6 +- .../api-fetch/src/middlewares/media-upload.js | 39 +- .../src/middlewares/namespace-endpoint.js | 2 +- .../api-fetch/src/middlewares/preloading.js | 38 +- .../api-fetch/src/middlewares/root-url.js | 5 +- .../middlewares/test/fetch-all-middleware.js | 6 +- .../src/middlewares/test/preloading.js | 17 +- .../src/middlewares/test/root-url.js | 4 +- .../src/middlewares/test/user-locale.js | 16 +- .../api-fetch/src/middlewares/user-locale.js | 10 +- packages/api-fetch/src/test/index.js | 165 +- packages/api-fetch/src/utils/response.js | 33 +- packages/autop/package.json | 2 +- packages/autop/src/index.js | 142 +- packages/autop/src/test/index.test.js | 43 +- .../babel-plugin-import-jsx-pragma/index.js | 19 +- .../test/index.js | 17 +- packages/babel-plugin-makepot/package.json | 2 +- packages/babel-plugin-makepot/src/index.js | 141 +- packages/babel-plugin-makepot/test/index.js | 28 +- packages/babel-preset-default/CHANGELOG.md | 6 + packages/babel-preset-default/index.js | 26 +- packages/babel-preset-default/package.json | 14 +- .../test/__snapshots__/index.js.snap | 11 + .../test/fixtures/input.js | 11 + packages/babel-preset-default/test/index.js | 4 +- packages/base-styles/_mixins.scss | 2 +- packages/base-styles/_z-index.scss | 5 +- packages/blob/package.json | 2 +- packages/blob/src/test/index.js | 4 +- .../src/components/block-ratings/index.js | 5 +- .../src/components/block-ratings/stars.js | 28 +- .../downloadable-block-author-info/index.js | 6 +- .../downloadable-block-header/index.js | 32 +- .../test/fixtures/index.js | 8 +- .../downloadable-block-header/test/index.js | 11 +- .../downloadable-block-info/index.js | 22 +- .../downloadable-block-list-item/index.js | 5 +- .../downloadable-blocks-list/index.js | 99 +- .../downloadable-blocks-panel/index.js | 40 +- .../index.js | 36 +- packages/block-directory/src/store/actions.js | 6 +- .../block-directory/src/store/controls.js | 44 +- packages/block-directory/src/store/reducer.js | 77 +- .../block-directory/src/store/resolvers.js | 18 +- .../block-directory/src/store/selectors.js | 9 +- .../src/store/test/fixtures/index.js | 24 + .../block-directory/src/store/test/reducer.js | 98 + .../src/store/test/selectors.js | 19 + packages/block-editor/package.json | 3 +- .../src/components/alignment-toolbar/index.js | 14 +- .../test/__snapshots__/index.js.snap | 38 +- .../alignment-toolbar/test/index.js | 8 +- .../src/components/autocomplete/index.js | 9 +- .../src/components/block-actions/index.js | 24 +- .../block-alignment-toolbar/index.js | 62 +- .../test/__snapshots__/index.js.snap | 38 +- .../block-alignment-toolbar/test/index.js | 12 +- .../src/components/block-breadcrumb/index.js | 21 +- .../components/block-caption/index.native.js | 14 +- .../src/components/block-card/index.js | 8 +- .../components/block-compare/block-view.js | 17 +- .../src/components/block-compare/index.js | 27 +- .../block-compare/test/block-view.js | 11 +- .../src/components/block-draggable/index.js | 61 +- .../src/components/block-drop-zone/index.js | 163 +- .../src/components/block-edit/context.js | 46 +- .../src/components/block-edit/edit.js | 12 +- .../src/components/block-edit/edit.native.js | 4 +- .../src/components/block-edit/index.js | 39 +- .../src/components/block-edit/test/edit.js | 4 +- .../src/components/block-icon/index.js | 24 +- .../src/components/block-icon/index.native.js | 22 +- .../src/components/block-icon/test/index.js | 15 +- .../src/components/block-inspector/index.js | 66 +- .../components/block-list-appender/index.js | 13 +- .../block-list-appender/index.native.js | 17 +- .../src/components/block-list-footer/index.js | 4 +- .../src/components/block-list/block-html.js | 34 +- .../block-list/block-invalid-warning.js | 71 +- .../block-mobile-floating-toolbar.native.js | 5 +- .../components/block-list/block-popover.js | 98 +- .../src/components/block-list/block.js | 133 +- .../src/components/block-list/block.native.js | 141 +- .../src/components/block-list/breadcrumb.js | 44 +- .../block-list/breadcrumb.native.js | 45 +- .../src/components/block-list/index.js | 30 +- .../src/components/block-list/index.native.js | 146 +- .../components/block-list/insertion-point.js | 148 +- .../block-list/insertion-point.native.js | 14 +- .../components/block-list/moving-animation.js | 84 +- .../src/components/block-list/nav-up-icon.js | 17 +- .../components/block-list/root-container.js | 27 +- .../src/components/block-list/style.scss | 18 +- .../block-list/subdirectory-icon.js | 5 +- .../block-list/use-multi-selection.js | 162 +- .../components/block-mobile-toolbar/index.js | 5 +- .../block-mobile-toolbar/index.native.js | 27 +- .../src/components/block-mover/icons.js | 41 +- .../src/components/block-mover/index.js | 121 +- .../components/block-mover/index.native.js | 58 +- .../block-mover/mover-description.js | 201 +- .../src/components/block-mover/test/index.js | 28 +- .../block-mover/test/mover-description.js | 253 +- .../components/block-navigation/dropdown.js | 36 +- .../src/components/block-navigation/index.js | 27 +- .../src/components/block-navigation/list.js | 39 +- .../components/block-pattern-picker/index.js | 67 - .../src/components/block-preview/index.js | 77 +- .../block-selection-clearer/index.js | 10 +- .../block-convert-button.js | 5 +- .../block-html-convert-button.js | 13 +- .../block-settings-menu/block-mode-toggle.js | 27 +- .../block-settings-menu-first-item.js | 4 +- .../block-settings-menu-plugins-extension.js | 5 +- .../block-unknown-convert-button.js | 20 +- .../components/block-settings-menu/index.js | 53 +- .../block-settings/button.native.js | 5 +- .../block-settings/container.native.js | 15 +- .../src/components/block-styles/index.js | 57 +- .../src/components/block-styles/test/index.js | 40 +- .../src/components/block-switcher/index.js | 141 +- .../block-switcher/multi-blocks-switcher.js | 23 +- .../components/block-switcher/test/index.js | 74 +- .../test/multi-blocks-switcher.js | 9 +- .../src/components/block-toolbar/index.js | 54 +- .../components/block-toolbar/index.native.js | 14 +- .../src/components/block-types-list/index.js | 81 +- .../block-variation-picker/index.js | 65 + .../style.scss | 10 +- .../block-vertical-alignment-toolbar/icons.js | 24 +- .../block-vertical-alignment-toolbar/index.js | 47 +- .../test/index.js | 15 +- .../components/button-block-appender/index.js | 46 +- .../button-block-appender/index.native.js | 19 +- .../src/components/caption/index.native.js | 6 +- .../test/__snapshots__/control.js.snap | 7 +- .../color-palette/with-color-context.js | 29 +- .../components/colors-gradients/control.js | 112 +- .../panel-color-gradient-settings.js | 128 +- .../colors-gradients/test/control.js | 193 + .../src/components/colors/index.js | 5 +- .../src/components/colors/test/utils.js | 51 +- .../src/components/colors/test/with-colors.js | 48 +- .../src/components/colors/use-colors.js | 176 +- .../src/components/colors/utils.js | 13 +- .../src/components/colors/with-colors.js | 175 +- .../src/components/contrast-checker/index.js | 45 +- .../components/contrast-checker/test/index.js | 75 +- .../src/components/copy-handler/index.js | 4 +- .../default-block-appender/index.js | 31 +- .../default-block-appender/index.native.js | 39 +- .../default-block-appender/test/index.js | 16 +- .../components/default-style-picker/index.js | 33 +- .../components/font-sizes/font-size-picker.js | 21 +- .../src/components/font-sizes/utils.js | 6 +- .../components/font-sizes/with-font-sizes.js | 118 +- .../src/components/gradient-picker/control.js | 27 +- .../src/components/gradient-picker/index.js | 35 +- .../src/components/gradient-picker/panel.js | 11 +- .../src/components/gradients/index.js | 33 +- .../components/image-size-control/index.js | 39 +- packages/block-editor/src/components/index.js | 2 +- .../src/components/index.native.js | 7 +- .../src/components/inner-blocks/README.md | 4 +- .../inner-blocks/button-block-appender.js | 5 +- .../inner-blocks/default-block-appender.js | 4 +- .../src/components/inner-blocks/index.js | 45 +- .../components/inner-blocks/index.native.js | 56 +- .../src/components/inner-blocks/test/index.js | 16 +- .../components/inner-blocks/with-client-id.js | 5 +- .../components/inserter-list-item/index.js | 20 +- .../inserter-menu-extension/index.js | 4 +- .../src/components/inserter/child-blocks.js | 10 +- .../src/components/inserter/index.js | 57 +- .../src/components/inserter/index.native.js | 227 +- .../src/components/inserter/menu.js | 333 +- .../src/components/inserter/menu.native.js | 207 +- .../src/components/inserter/search-items.js | 116 +- .../src/components/inserter/style.scss | 7 - .../inserter/test/fixtures/index.js | 25 + .../components/inserter/test/index.native.js | 17 +- .../src/components/inserter/test/menu.js | 30 +- .../components/inserter/test/search-items.js | 85 +- .../inspector-controls/index.native.js | 3 +- .../components/keyboard-shortcuts/index.js | 109 +- .../src/components/link-control/README.md | 28 +- .../src/components/link-control/index.js | 271 +- .../components/link-control/search-input.js | 31 +- .../components/link-control/search-item.js | 40 +- .../link-control/settings-drawer.js | 13 +- .../test/__snapshots__/index.js.snap | 2 +- .../link-control/test/fixtures/index.js | 14 +- .../src/components/link-control/test/index.js | 657 +- .../src/components/media-edit/index.native.js | 88 + .../src/components/media-placeholder/index.js | 107 +- .../media-placeholder/index.native.js | 56 +- .../media-placeholder/test/index.js | 6 +- .../components/media-replace-flow/index.js | 76 +- .../image-size.native.js | 5 +- .../media-upload-progress/index.native.js | 61 +- .../test/index.native.js | 65 +- .../src/components/media-upload/check.js | 6 +- .../components/media-upload/index.native.js | 60 +- .../media-upload/test/index.native.js | 86 +- .../multi-select-scroll-into-view/index.js | 7 +- .../multi-selection-inspector/index.js | 31 +- .../src/components/navigable-toolbar/index.js | 9 +- .../src/components/observe-typing/index.js | 159 +- .../components/page-template-picker/button.js | 6 +- .../page-template-picker/button.native.js | 17 +- .../page-template-picker/container.native.js | 2 +- .../page-template-picker/default-templates.js | 10 +- .../components/page-template-picker/picker.js | 6 +- .../page-template-picker/preview.native.js | 53 +- .../page-template-picker/styles.native.scss | 7 - .../use-page-template-picker-visible.js | 18 +- .../components/panel-color-settings/index.js | 5 +- .../panel-color-settings/test/index.js | 48 +- .../src/components/plain-text/index.js | 1 - .../src/components/plain-text/index.native.js | 36 +- .../src/components/provider/index.js | 20 +- .../src/components/provider/index.native.js | 20 +- .../provider/with-registry-provider.js | 63 +- .../responsive-block-control/index.js | 49 +- .../responsive-block-control/label.js | 24 +- .../responsive-block-control/test/index.js | 162 +- .../rich-text/format-toolbar/index.js | 28 +- .../rich-text/format-toolbar/index.native.js | 9 +- .../src/components/rich-text/index.js | 929 +- .../rich-text/remove-browser-shortcuts.js | 8 +- .../src/components/rich-text/style.scss | 23 +- .../components/rich-text/toolbar-button.js | 12 +- .../skip-to-selected-block/index.js | 17 +- .../src/components/tool-selector/index.js | 37 +- .../src/components/typewriter/index.js | 53 +- .../src/components/ungroup-button/icon.js | 20 +- .../components/ungroup-button/index.native.js | 36 +- .../src/components/url-input/button.js | 9 +- .../src/components/url-input/index.js | 256 +- .../src/components/url-input/test/button.js | 38 +- .../url-popover/image-url-input-ui.js | 71 +- .../src/components/url-popover/index.js | 17 +- .../src/components/url-popover/link-viewer.js | 24 +- .../src/components/url-popover/test/index.js | 16 +- .../video-player/gridicon-play.native.js | 10 +- .../components/video-player/index.native.js | 62 +- .../src/components/warning/index.js | 9 +- .../src/components/warning/index.native.js | 33 +- .../src/components/warning/test/index.js | 22 +- .../components/writing-flow/focus-capture.js | 116 +- .../src/components/writing-flow/index.js | 179 +- .../src/components/writing-flow/test/index.js | 24 +- packages/block-editor/src/hooks/align.js | 158 +- packages/block-editor/src/hooks/anchor.js | 91 +- .../src/hooks/custom-class-name.js | 98 +- .../src/hooks/custom-class-name.native.js | 28 +- .../src/hooks/generated-class-name.js | 10 +- packages/block-editor/src/hooks/test/align.js | 135 +- .../block-editor/src/hooks/test/anchor.js | 49 +- .../src/hooks/test/custom-class-name.js | 41 +- .../src/hooks/test/generated-class-name.js | 31 +- packages/block-editor/src/store/actions.js | 161 +- packages/block-editor/src/store/array.js | 2 +- packages/block-editor/src/store/controls.js | 8 +- packages/block-editor/src/store/defaults.js | 49 +- packages/block-editor/src/store/effects.js | 108 +- .../block-editor/src/store/middlewares.js | 7 +- packages/block-editor/src/store/reducer.js | 293 +- packages/block-editor/src/store/selectors.js | 225 +- .../block-editor/src/store/test/actions.js | 330 +- packages/block-editor/src/store/test/array.js | 37 +- .../block-editor/src/store/test/effects.js | 181 +- .../block-editor/src/store/test/reducer.js | 1012 +- .../block-editor/src/store/test/selectors.js | 340 +- packages/block-editor/src/style.scss | 2 +- packages/block-editor/src/utils/dom.js | 14 +- .../src/utils/get-paste-event-data.js | 4 +- packages/block-editor/src/utils/test/dom.js | 10 +- .../src/utils/transform-styles/ast/parse.js | 55 +- .../ast/stringify/compress.js | 114 +- .../ast/stringify/identity.js | 137 +- .../transform-styles/ast/stringify/index.js | 6 +- .../utils/transform-styles/test/traverse.js | 4 +- .../transforms/url-rewrite.js | 5 +- .../utils/transform-styles/transforms/wrap.js | 8 +- packages/block-library/package.json | 4 +- packages/block-library/src/archives/edit.js | 25 +- packages/block-library/src/archives/icon.js | 8 - packages/block-library/src/archives/index.js | 2 +- .../block-library/src/audio/deprecated.js | 15 +- packages/block-library/src/audio/edit.js | 31 +- packages/block-library/src/audio/icon.js | 6 - packages/block-library/src/audio/index.js | 9 +- packages/block-library/src/audio/save.js | 20 +- .../block-library/src/audio/transforms.js | 5 +- .../src/block/edit-panel/editor.scss | 2 +- .../src/block/edit-panel/index.js | 22 +- packages/block-library/src/block/edit.js | 47 +- packages/block-library/src/block/index.js | 4 +- .../block-library/src/button/deprecated.js | 56 +- packages/block-library/src/button/edit.js | 93 +- packages/block-library/src/button/icon.js | 8 - packages/block-library/src/button/index.js | 6 +- packages/block-library/src/button/save.js | 15 +- packages/block-library/src/button/style.scss | 4 + packages/block-library/src/buttons/icon.js | 7 +- packages/block-library/src/buttons/index.js | 6 +- packages/block-library/src/calendar/edit.js | 24 +- packages/block-library/src/calendar/icon.js | 7 +- packages/block-library/src/calendar/index.js | 2 +- packages/block-library/src/categories/edit.js | 99 +- packages/block-library/src/categories/icon.js | 8 - .../block-library/src/categories/index.js | 2 +- packages/block-library/src/classic/edit.js | 22 +- packages/block-library/src/classic/icon.js | 8 - packages/block-library/src/classic/index.js | 2 +- .../block-library/src/code/edit.native.js | 18 +- packages/block-library/src/code/icon.js | 5 +- packages/block-library/src/code/index.js | 10 +- packages/block-library/src/code/save.js | 6 +- .../src/code/test/edit.native.js | 8 +- packages/block-library/src/code/transforms.js | 5 +- packages/block-library/src/code/utils.js | 5 +- packages/block-library/src/column/edit.js | 73 +- packages/block-library/src/column/icon.js | 8 - packages/block-library/src/column/index.js | 3 +- packages/block-library/src/columns/block.json | 6 + .../block-library/src/columns/deprecated.js | 29 +- packages/block-library/src/columns/edit.js | 299 +- packages/block-library/src/columns/icon.js | 8 - packages/block-library/src/columns/index.js | 29 +- .../block-library/src/columns/patterns.js | 63 - packages/block-library/src/columns/save.js | 23 +- packages/block-library/src/columns/style.scss | 4 + packages/block-library/src/columns/utils.js | 40 +- .../block-library/src/columns/variations.js | 130 + .../block-library/src/cover/deprecated.js | 177 +- packages/block-library/src/cover/edit.js | 275 +- packages/block-library/src/cover/icon.js | 6 - packages/block-library/src/cover/index.js | 6 +- packages/block-library/src/cover/save.js | 40 +- packages/block-library/src/cover/shared.js | 10 +- .../block-library/src/cover/transforms.js | 52 +- .../block-library/src/embed/core-embeds.js | 59 +- packages/block-library/src/embed/edit.js | 91 +- .../block-library/src/embed/embed-controls.js | 5 +- .../src/embed/embed-placeholder.js | 48 +- .../block-library/src/embed/embed-preview.js | 97 +- packages/block-library/src/embed/icons.js | 112 +- packages/block-library/src/embed/index.js | 36 +- packages/block-library/src/embed/settings.js | 66 +- .../embed/test/__snapshots__/index.js.snap | 2 +- .../block-library/src/embed/test/index.js | 28 +- packages/block-library/src/embed/util.js | 134 +- packages/block-library/src/file/edit.js | 72 +- packages/block-library/src/file/icon.js | 6 - packages/block-library/src/file/index.js | 2 +- packages/block-library/src/file/inspector.js | 6 +- packages/block-library/src/file/save.js | 48 +- packages/block-library/src/file/transforms.js | 12 +- .../block-library/src/gallery/deprecated.js | 165 +- packages/block-library/src/gallery/edit.js | 176 +- .../src/gallery/gallery-image.js | 34 +- .../src/gallery/gallery-image.native.js | 246 +- packages/block-library/src/gallery/gallery.js | 42 +- .../src/gallery/gallery.native.js | 45 +- packages/block-library/src/gallery/icons.js | 23 +- packages/block-library/src/gallery/index.js | 12 +- packages/block-library/src/gallery/save.js | 37 +- .../block-library/src/gallery/shared-icon.js | 6 +- .../src/gallery/shared-icon.native.js | 15 +- packages/block-library/src/gallery/shared.js | 9 +- .../block-library/src/gallery/tiles.native.js | 36 +- .../block-library/src/gallery/transforms.js | 60 +- packages/block-library/src/group/block.json | 6 + .../block-library/src/group/deprecated.js | 9 +- packages/block-library/src/group/edit.js | 82 +- .../block-library/src/group/edit.native.js | 32 +- packages/block-library/src/group/icon.js | 18 +- packages/block-library/src/group/index.js | 46 +- packages/block-library/src/group/save.js | 15 +- .../block-library/src/heading/deprecated.js | 5 +- packages/block-library/src/heading/edit.js | 34 +- .../block-library/src/heading/edit.native.js | 4 +- .../src/heading/heading-level-icon.js | 8 +- .../src/heading/heading-toolbar.js | 22 +- packages/block-library/src/heading/index.js | 35 +- packages/block-library/src/heading/save.js | 13 +- .../block-library/src/heading/transforms.js | 5 +- packages/block-library/src/html/edit.js | 29 +- packages/block-library/src/html/icon.js | 4 +- packages/block-library/src/html/index.js | 7 +- packages/block-library/src/html/transforms.js | 10 +- .../block-library/src/image/deprecated.js | 64 +- packages/block-library/src/image/edit.js | 215 +- .../block-library/src/image/edit.native.js | 297 +- .../src/image/icon-customize.native.js | 10 + .../src/image/icon-retry.native.js | 7 +- packages/block-library/src/image/icon.js | 11 +- .../block-library/src/image/image-size.js | 5 +- packages/block-library/src/image/index.js | 16 +- packages/block-library/src/image/save.js | 18 +- .../src/image/styles.native.scss | 25 + packages/block-library/src/image/test/edit.js | 5 +- .../src/image/test/edit.native.js | 20 +- .../src/image/test/transforms.js | 56 +- .../block-library/src/image/transforms.js | 91 +- packages/block-library/src/image/utils.js | 5 +- packages/block-library/src/index.js | 51 +- packages/block-library/src/index.native.js | 2 +- .../block-library/src/latest-comments/edit.js | 10 +- .../block-library/src/latest-comments/icon.js | 8 - .../src/latest-comments/index.js | 2 +- .../block-library/src/latest-posts/edit.js | 249 +- .../block-library/src/latest-posts/icon.js | 11 +- .../block-library/src/latest-posts/index.js | 2 +- .../src/legacy-widget/edit/dom-manager.js | 111 +- .../src/legacy-widget/edit/handler.js | 29 +- .../src/legacy-widget/edit/index.js | 49 +- .../src/legacy-widget/edit/placeholder.js | 9 +- .../block-library/src/legacy-widget/icon.js | 8 - .../block-library/src/legacy-widget/index.js | 2 +- packages/block-library/src/list/edit.js | 145 +- packages/block-library/src/list/icon.js | 8 - packages/block-library/src/list/index.js | 11 +- .../src/list/ordered-list-settings.js | 11 +- packages/block-library/src/list/transforms.js | 52 +- .../src/media-text/deprecated.js | 56 +- packages/block-library/src/media-text/edit.js | 210 +- .../src/media-text/edit.native.js | 155 +- .../src/media-text/icon-retry.native.js | 7 +- packages/block-library/src/media-text/icon.js | 6 - .../block-library/src/media-text/index.js | 9 +- .../src/media-text/media-container-icon.js | 8 +- .../src/media-text/media-container.js | 36 +- .../src/media-text/media-container.native.js | 132 +- packages/block-library/src/media-text/save.js | 42 +- .../block-library/src/media-text/style.scss | 18 +- .../src/media-text/transforms.js | 10 +- packages/block-library/src/missing/edit.js | 21 +- .../block-library/src/missing/edit.native.js | 86 +- packages/block-library/src/missing/index.js | 4 +- .../test/__snapshots__/edit.native.js.snap | 2 +- .../src/missing/test/edit.native.js | 11 +- packages/block-library/src/more/edit.js | 21 +- .../block-library/src/more/edit.native.js | 10 +- packages/block-library/src/more/icon.js | 7 +- packages/block-library/src/more/index.js | 6 +- packages/block-library/src/more/save.js | 12 +- packages/block-library/src/more/transforms.js | 3 +- .../block-library/src/navigation-link/edit.js | 226 +- .../src/navigation-link/editor.scss | 42 +- .../src/navigation-link/icons.js | 22 + .../src/navigation-link/index.js | 6 +- .../block-library/src/navigation-link/save.js | 8 +- .../src/navigation/block-colors-selector.js | 14 +- .../src/navigation/block-navigation-list.js | 38 +- packages/block-library/src/navigation/edit.js | 152 +- .../block-library/src/navigation/editor.scss | 7 +- .../block-library/src/navigation/icons.js | 23 +- .../block-library/src/navigation/index.js | 4 +- .../block-library/src/navigation/index.php | 48 +- packages/block-library/src/navigation/save.js | 4 +- .../block-library/src/navigation/style.scss | 24 +- .../src/navigation/use-block-navigator.js | 18 +- .../block-library/src/nextpage/edit.native.js | 35 +- packages/block-library/src/nextpage/icon.js | 8 - packages/block-library/src/nextpage/index.js | 2 +- packages/block-library/src/nextpage/save.js | 6 +- .../block-library/src/nextpage/transforms.js | 3 +- .../block-library/src/paragraph/deprecated.js | 81 +- packages/block-library/src/paragraph/edit.js | 149 +- .../src/paragraph/edit.native.js | 35 +- .../block-library/src/paragraph/editor.scss | 20 +- packages/block-library/src/paragraph/icon.js | 8 - packages/block-library/src/paragraph/index.js | 10 +- packages/block-library/src/paragraph/save.js | 5 +- .../block-library/src/post-author/edit.js | 7 +- .../block-library/src/post-content/index.js | 2 +- .../block-library/src/post-excerpt/edit.js | 6 +- .../block-library/src/post-title/index.js | 2 +- .../block-library/src/preformatted/edit.js | 8 +- .../src/preformatted/edit.native.js | 16 +- .../block-library/src/preformatted/icon.js | 8 - .../block-library/src/preformatted/index.js | 10 +- .../src/preformatted/transforms.js | 5 +- .../block-library/src/pullquote/deprecated.js | 117 +- packages/block-library/src/pullquote/edit.js | 78 +- packages/block-library/src/pullquote/icon.js | 8 - packages/block-library/src/pullquote/index.js | 23 +- packages/block-library/src/pullquote/save.js | 35 +- .../block-library/src/quote/deprecated.js | 16 +- packages/block-library/src/quote/edit.js | 26 +- packages/block-library/src/quote/icon.js | 8 - packages/block-library/src/quote/index.js | 15 +- packages/block-library/src/quote/save.js | 4 +- .../block-library/src/quote/transforms.js | 52 +- packages/block-library/src/rss/edit.js | 40 +- packages/block-library/src/rss/index.js | 3 +- packages/block-library/src/search/edit.js | 8 +- packages/block-library/src/search/index.js | 3 +- packages/block-library/src/separator/edit.js | 15 +- packages/block-library/src/separator/icon.js | 8 - packages/block-library/src/separator/index.js | 7 +- packages/block-library/src/separator/save.js | 14 +- .../src/separator/separator-settings.js | 10 +- packages/block-library/src/shortcode/edit.js | 5 +- .../src/shortcode/edit.native.js | 37 +- packages/block-library/src/shortcode/icon.js | 8 - packages/block-library/src/shortcode/index.js | 6 +- .../block-library/src/shortcode/index.php | 12 +- .../src/shortcode/style.native.scss | 8 +- .../src/shortcode/test/edit.native.js | 17 +- .../block-library/src/site-title/index.js | 2 +- .../block-library/src/social-link/edit.js | 49 +- .../src/social-link/icons/amazon.js | 7 +- .../src/social-link/icons/bandcamp.js | 7 +- .../src/social-link/icons/behance.js | 7 +- .../src/social-link/icons/chain.js | 7 +- .../src/social-link/icons/codepen.js | 7 +- .../src/social-link/icons/deviantart.js | 7 +- .../src/social-link/icons/dribbble.js | 7 +- .../src/social-link/icons/dropbox.js | 7 +- .../src/social-link/icons/etsy.js | 7 +- .../src/social-link/icons/facebook.js | 7 +- .../src/social-link/icons/feed.js | 7 +- .../src/social-link/icons/fivehundredpx.js | 7 +- .../src/social-link/icons/flickr.js | 7 +- .../src/social-link/icons/foursquare.js | 7 +- .../src/social-link/icons/github.js | 7 +- .../src/social-link/icons/goodreads.js | 7 +- .../src/social-link/icons/google.js | 7 +- .../src/social-link/icons/index.js | 1 - .../src/social-link/icons/instagram.js | 7 +- .../src/social-link/icons/lastfm.js | 7 +- .../src/social-link/icons/linkedin.js | 7 +- .../src/social-link/icons/mail.js | 7 +- .../src/social-link/icons/mastodon.js | 7 +- .../src/social-link/icons/medium.js | 7 +- .../src/social-link/icons/meetup.js | 7 +- .../src/social-link/icons/pinterest.js | 7 +- .../src/social-link/icons/pocket.js | 7 +- .../src/social-link/icons/reddit.js | 7 +- .../src/social-link/icons/skype.js | 7 +- .../src/social-link/icons/snapchat.js | 7 +- .../src/social-link/icons/soundcloud.js | 7 +- .../src/social-link/icons/spotify.js | 7 +- .../src/social-link/icons/tumblr.js | 7 +- .../src/social-link/icons/twitch.js | 7 +- .../src/social-link/icons/twitter.js | 7 +- .../src/social-link/icons/vimeo.js | 7 +- .../block-library/src/social-link/icons/vk.js | 7 +- .../src/social-link/icons/wordpress.js | 15 +- .../src/social-link/icons/yelp.js | 7 +- .../src/social-link/icons/youtube.js | 7 +- .../block-library/src/social-link/index.js | 46 +- .../block-library/src/social-links/edit.js | 4 +- .../src/social-links/editor.scss | 5 - .../block-library/src/social-links/index.js | 19 +- packages/block-library/src/spacer/edit.js | 20 +- .../block-library/src/spacer/edit.native.js | 36 +- packages/block-library/src/spacer/icon.js | 8 - packages/block-library/src/spacer/index.js | 6 +- packages/block-library/src/subhead/edit.js | 6 +- packages/block-library/src/subhead/icon.js | 8 - packages/block-library/src/subhead/index.js | 12 +- .../block-library/src/table/deprecated.js | 23 +- packages/block-library/src/table/edit.js | 194 +- packages/block-library/src/table/editor.scss | 4 + packages/block-library/src/table/icon.js | 8 - packages/block-library/src/table/index.js | 42 +- packages/block-library/src/table/save.js | 48 +- packages/block-library/src/table/state.js | 76 +- .../block-library/src/table/test/state.js | 203 +- packages/block-library/src/tag-cloud/edit.js | 8 +- packages/block-library/src/tag-cloud/index.js | 3 +- .../src/template-part/edit/index.js | 9 +- .../src/template-part/edit/placeholder.js | 12 +- .../edit/use-template-part-post.js | 5 +- .../block-library/src/text-columns/edit.js | 23 +- .../block-library/src/text-columns/index.js | 4 +- .../block-library/src/text-columns/save.js | 9 +- .../src/text-columns/transforms.js | 20 +- packages/block-library/src/verse/edit.js | 7 +- packages/block-library/src/verse/icon.js | 8 - packages/block-library/src/verse/index.js | 10 +- .../src/video/edit-common-settings.js | 11 +- packages/block-library/src/video/edit.js | 80 +- .../block-library/src/video/edit.native.js | 150 +- .../src/video/icon-retry.native.js | 8 +- packages/block-library/src/video/icon.js | 7 - packages/block-library/src/video/index.js | 6 +- packages/block-library/src/video/save.js | 12 +- .../block-library/src/video/transforms.js | 9 +- .../package.json | 2 +- .../src/index.js | 52 +- .../test/index.js | 10 +- .../bin/create-php-parser.js | 29 +- .../shared-tests.js | 405 +- .../test/index.js | 5 +- packages/blocks/package.json | 2 +- packages/blocks/src/api/children.js | 5 +- packages/blocks/src/api/factory.js | 189 +- packages/blocks/src/api/index.js | 16 +- packages/blocks/src/api/node.js | 2 +- packages/blocks/src/api/parser.js | 161 +- .../raw-handling/html-formatting-remover.js | 6 +- .../raw-handling/image-corrector.native.js | 1 - packages/blocks/src/api/raw-handling/index.js | 99 +- .../src/api/raw-handling/is-inline-content.js | 16 +- .../src/api/raw-handling/ms-list-converter.js | 4 +- .../src/api/raw-handling/normalise-blocks.js | 2 +- .../src/api/raw-handling/paste-handler.js | 164 +- .../raw-handling/phrasing-content-reducer.js | 5 +- .../src/api/raw-handling/phrasing-content.js | 95 +- .../api/raw-handling/shortcode-converter.js | 42 +- .../test/blockquote-normaliser.js | 4 +- .../api/raw-handling/test/comment-remover.js | 44 +- .../test/figure-content-reducer.js | 46 +- .../raw-handling/test/is-inline-content.js | 4 +- .../src/api/raw-handling/test/list-reducer.js | 9 +- .../raw-handling/test/markdown-converter.js | 2 +- .../raw-handling/test/ms-list-converter.js | 51 +- .../api/raw-handling/test/normalise-blocks.js | 28 +- .../test/phrasing-content-reducer.js | 62 +- .../test/special-comment-converter.js | 36 +- .../blocks/src/api/raw-handling/test/utils.js | 154 +- packages/blocks/src/api/raw-handling/utils.js | 71 +- packages/blocks/src/api/registration.js | 178 +- packages/blocks/src/api/serializer.js | 148 +- packages/blocks/src/api/templates.js | 91 +- packages/blocks/src/api/test/children.js | 23 +- packages/blocks/src/api/test/factory.js | 969 +- packages/blocks/src/api/test/matchers.js | 6 +- packages/blocks/src/api/test/node.js | 15 +- packages/blocks/src/api/test/parser.js | 188 +- packages/blocks/src/api/test/registration.js | 472 +- packages/blocks/src/api/test/serializer.js | 73 +- packages/blocks/src/api/test/templates.js | 81 +- packages/blocks/src/api/test/utils.js | 71 +- packages/blocks/src/api/test/validation.js | 93 +- packages/blocks/src/api/utils.js | 45 +- packages/blocks/src/api/validation/index.js | 149 +- packages/blocks/src/api/validation/logger.js | 8 +- .../src/block-content-provider/index.js | 30 +- packages/blocks/src/store/actions.js | 29 +- packages/blocks/src/store/reducer.js | 93 +- packages/blocks/src/store/selectors.js | 97 +- packages/blocks/src/store/test/actions.js | 40 +- packages/blocks/src/store/test/reducer.js | 234 +- packages/blocks/src/store/test/selectors.js | 142 +- packages/components/package.json | 4 +- packages/components/src/angle-picker/index.js | 112 + .../src/angle-picker/stories/index.js | 20 + .../components/src/angle-picker/style.scss | 42 + packages/components/src/animate/index.js | 17 +- packages/components/src/autocomplete/index.js | 223 +- packages/components/src/base-control/index.js | 60 +- .../src/base-control/index.native.js | 5 +- .../src/base-control/stories/index.js | 4 +- packages/components/src/button-group/index.js | 4 +- .../src/button-group/stories/index.js | 8 +- packages/components/src/button/deprecated.js | 8 +- packages/components/src/button/index.js | 45 +- .../components/src/button/index.native.js | 73 +- .../components/src/button/stories/index.js | 56 +- packages/components/src/button/style.scss | 17 +- packages/components/src/button/test/index.js | 78 +- packages/components/src/card/README.md | 4 +- packages/components/src/card/stories/media.js | 4 +- .../components/src/card/styles/card-styles.js | 58 +- .../components/src/checkbox-control/index.js | 32 +- .../src/checkbox-control/stories/index.js | 12 +- .../src/checkbox-control/style.scss | 2 +- .../src/circular-option-picker/index.js | 37 +- .../src/circular-option-picker/style.scss | 8 +- .../components/src/clipboard-button/index.js | 17 +- .../src/clipboard-button/stories/index.js | 4 +- .../src/color-indicator/stories/index.js | 4 +- .../src/color-indicator/test/index.js | 4 +- .../components/src/color-palette/index.js | 63 +- .../test/__snapshots__/index.js.snap | 32 +- .../src/color-palette/test/index.js | 37 +- packages/components/src/color-picker/alpha.js | 12 +- packages/components/src/color-picker/hue.js | 25 +- packages/components/src/color-picker/index.js | 33 +- .../components/src/color-picker/saturation.js | 22 +- .../src/color-picker/stories/index.js | 13 +- .../components/src/color-picker/test/index.js | 32 +- .../components/src/color-picker/test/input.js | 24 +- packages/components/src/color-picker/utils.js | 4 +- .../src/custom-gradient-picker/constants.js | 6 +- .../custom-gradient-picker/control-points.js | 107 +- .../src/custom-gradient-picker/index.js | 69 +- .../src/custom-gradient-picker/serializer.js | 21 +- .../custom-gradient-picker/test/serializer.js | 148 +- .../src/custom-gradient-picker/utils.js | 113 +- .../src/custom-select-control/index.js | 50 +- .../custom-select-control/stories/index.js | 5 +- packages/components/src/dashicon/index.js | 733 +- .../components/src/dashicon/test/index.js | 18 +- packages/components/src/date-time/date.js | 28 +- packages/components/src/date-time/index.js | 102 +- .../components/src/date-time/test/date.js | 57 +- .../components/src/date-time/test/time.js | 128 +- packages/components/src/date-time/time.js | 39 +- .../components/src/dimension-control/index.js | 39 +- .../components/src/dimension-control/sizes.js | 6 +- .../src/dimension-control/test/index.test.js | 39 +- packages/components/src/disabled/index.js | 4 +- .../components/src/disabled/test/index.js | 76 +- packages/components/src/draggable/index.js | 29 +- .../components/src/draggable/stories/index.js | 5 +- packages/components/src/drop-zone/index.js | 23 +- packages/components/src/drop-zone/provider.js | 81 +- .../components/src/dropdown-menu/index.js | 87 +- .../src/dropdown-menu/index.native.js | 1 - .../src/dropdown-menu/test/index.js | 19 +- packages/components/src/dropdown/index.js | 5 +- .../components/src/dropdown/index.native.js | 5 +- .../components/src/dropdown/test/index.js | 70 +- .../components/src/external-link/index.js | 36 +- .../src/focal-point-picker/index.js | 98 +- .../components/src/font-size-picker/index.js | 42 +- .../src/font-size-picker/stories/index.js | 11 +- .../components/src/form-file-upload/index.js | 16 +- packages/components/src/form-toggle/index.js | 40 +- .../components/src/form-toggle/test/index.js | 34 +- .../components/src/form-token-field/index.js | 155 +- .../src/form-token-field/suggestions-list.js | 95 +- .../src/form-token-field/test/index.js | 114 +- .../src/form-token-field/test/lib/fixtures.js | 70 +- .../test/lib/token-field-wrapper.js | 8 +- .../src/form-token-field/token-input.js | 20 +- .../components/src/form-token-field/token.js | 4 +- .../components/src/gradient-picker/index.js | 81 +- packages/components/src/guide/icons.js | 11 +- packages/components/src/guide/index.js | 23 +- packages/components/src/guide/page-control.js | 23 +- packages/components/src/guide/test/index.js | 24 +- .../components/src/guide/test/page-control.js | 13 +- .../higher-order/navigate-regions/index.js | 95 +- .../with-constrained-tabbing/index.js | 98 +- .../with-fallback-styles/index.js | 26 +- .../higher-order/with-filters/test/index.js | 56 +- .../higher-order/with-focus-outside/index.js | 188 +- .../with-focus-outside/index.native.js | 170 +- .../with-focus-outside/test/index.js | 11 +- .../higher-order/with-focus-return/index.js | 13 +- .../with-focus-return/test/index.js | 38 +- .../src/higher-order/with-notices/index.js | 16 +- .../with-spoken-messages/index.js | 3 +- .../with-spoken-messages/test/index.js | 12 +- packages/components/src/icon/index.js | 22 +- packages/components/src/icon/stories/index.js | 15 +- packages/components/src/icon/test/index.js | 39 +- packages/components/src/index.js | 31 +- packages/components/src/index.native.js | 19 +- .../src/isolated-event-container/index.js | 6 +- .../isolated-event-container/test/index.js | 4 +- .../src/keyboard-shortcuts/index.js | 8 +- .../src/keyboard-shortcuts/test/index.js | 9 +- packages/components/src/menu-group/index.js | 15 +- .../components/src/menu-group/test/index.js | 5 +- packages/components/src/menu-item/index.js | 16 +- packages/components/src/menu-item/style.scss | 3 +- .../components/src/menu-item/test/index.js | 26 +- .../components/src/menu-items-choice/index.js | 13 +- .../src/menu-items-choice/style.scss | 4 - .../src/mobile/bottom-sheet/button.native.js | 11 +- .../src/mobile/bottom-sheet/cell.native.js | 191 +- .../src/mobile/bottom-sheet/index.native.js | 65 +- .../keyboard-avoiding-view.native.js | 18 +- .../mobile/bottom-sheet/picker-cell.native.js | 5 +- .../mobile/bottom-sheet/range-cell.native.js | 54 +- .../bottom-sheet/stepper-cell/index.native.js | 30 +- .../stepper-cell/stepper.android.js | 38 +- .../bottom-sheet/stepper-cell/stepper.ios.js | 23 +- .../mobile/bottom-sheet/switch-cell.native.js | 34 +- .../html-text-input/container.android.js | 9 +- .../mobile/html-text-input/index.native.js | 29 +- .../html-text-input/test/index.native.js | 14 +- .../keyboard-avoiding-view/index.ios.js | 11 +- .../keyboard-aware-flat-list/index.ios.js | 26 +- .../modal-header-bar/button.android.scss | 10 + .../mobile/modal-header-bar/button.ios.scss | 5 + .../mobile/modal-header-bar/button.native.js | 68 + .../modal-header-bar/button.native.scss | 8 + .../src/mobile/modal-header-bar/close-icon.js | 11 + .../mobile/modal-header-bar/index.native.js | 41 +- .../modal-header-bar/styles.native.scss | 40 +- .../src/mobile/picker/index.android.js | 14 +- .../components/src/mobile/picker/index.ios.js | 2 +- .../readable-content-view/index.native.js | 10 +- .../mobile/stepper-control/index.native.js | 22 +- packages/components/src/modal/aria-helper.js | 4 +- packages/components/src/modal/frame.js | 10 +- packages/components/src/modal/header.js | 42 +- packages/components/src/modal/index.js | 12 +- .../src/navigable-container/container.js | 14 +- .../src/navigable-container/menu.js | 9 +- .../src/navigable-container/test/menu.js | 132 +- .../src/navigable-container/test/tabbable.js | 75 +- packages/components/src/notice/index.js | 12 +- packages/components/src/notice/test/index.js | 8 +- packages/components/src/notice/test/list.js | 4 +- .../components/src/panel/actions.native.js | 4 +- packages/components/src/panel/body.js | 37 +- packages/components/src/panel/body.native.js | 6 +- packages/components/src/panel/row.js | 6 +- .../components/src/panel/stories/index.js | 37 +- packages/components/src/panel/style.scss | 4 - packages/components/src/panel/test/body.js | 31 +- packages/components/src/panel/test/header.js | 29 +- packages/components/src/panel/test/index.js | 32 +- packages/components/src/panel/test/row.js | 6 +- packages/components/src/placeholder/index.js | 48 +- .../src/placeholder/stories/index.js | 38 + .../components/src/placeholder/style.scss | 6 + .../components/src/placeholder/test/index.js | 79 +- packages/components/src/popover/index.js | 187 +- .../components/src/popover/stories/index.js | 4 +- packages/components/src/popover/test/index.js | 18 +- packages/components/src/popover/test/utils.js | 32 +- packages/components/src/popover/utils.js | 176 +- .../src/query-controls/category-select.js | 8 +- .../components/src/query-controls/index.js | 5 +- .../components/src/query-controls/terms.js | 7 +- .../src/query-controls/test/terms.js | 20 +- .../components/src/radio-control/index.js | 67 +- .../src/radio-control/stories/index.js | 8 +- .../components/src/range-control/index.js | 18 +- .../src/range-control/index.native.js | 4 +- .../src/range-control/stories/index.js | 55 +- .../src/range-control/test/index.js | 362 +- .../components/src/resizable-box/index.js | 16 +- .../src/resizable-box/stories/index.js | 5 +- .../src/responsive-wrapper/index.js | 7 +- packages/components/src/sandbox/index.js | 46 +- packages/components/src/scroll-lock/index.js | 3 +- .../src/scroll-lock/stories/index.js | 3 +- .../components/src/scroll-lock/test/index.js | 12 +- .../components/src/select-control/index.js | 50 +- .../components/src/shortcut/test/index.js | 6 +- packages/components/src/slot-fill/context.js | 18 +- packages/components/src/slot-fill/slot.js | 26 +- .../components/src/slot-fill/test/slot.js | 60 +- packages/components/src/snackbar/index.js | 61 +- packages/components/src/snackbar/list.js | 26 +- .../components/src/spinner/index.native.js | 6 +- packages/components/src/style.scss | 1 + packages/components/src/tab-panel/index.js | 18 +- .../components/src/tab-panel/stories/index.js | 10 +- .../components/src/tab-panel/test/index.js | 43 +- packages/components/src/text-control/index.js | 22 +- .../components/src/text-highlight/index.js | 4 +- .../src/text-highlight/test/index.js | 76 +- packages/components/src/text/mixins.js | 32 +- packages/components/src/text/stories/index.js | 34 +- packages/components/src/text/text.styles.js | 5 +- .../components/src/text/text.styles.native.js | 4 +- .../components/src/textarea-control/index.js | 19 +- .../src/textarea-control/index.native.js | 2 +- .../components/src/toggle-control/index.js | 5 +- .../src/toggle-control/stories/index.js | 22 +- .../src/toggle-control/test/index.js | 8 +- .../components/src/toolbar-button/index.js | 9 +- .../toolbar-button-container.js | 6 +- .../toolbar-button-container.native.js | 6 +- .../components/src/toolbar-group/index.js | 8 +- .../src/toolbar-group/test/index.js | 22 +- .../toolbar-group-collapsed.native.js | 4 +- .../toolbar-group-container.native.js | 13 +- packages/components/src/toolbar-item/index.js | 13 +- .../src/toolbar-item/index.native.js | 4 +- packages/components/src/toolbar/index.js | 5 +- packages/components/src/toolbar/test/index.js | 4 +- .../src/toolbar/toolbar-container.native.js | 4 +- packages/components/src/tooltip/index.js | 20 +- packages/components/src/tooltip/test/index.js | 47 +- packages/components/src/tree-select/index.js | 3 +- .../components/src/visually-hidden/index.js | 7 +- packages/compose/package.json | 2 +- .../src/higher-order/if-condition/index.js | 19 +- .../compose/src/higher-order/pure/index.js | 5 +- .../src/higher-order/pure/test/index.js | 18 +- .../higher-order/with-global-events/index.js | 7 +- .../with-global-events/listener.js | 5 +- .../with-global-events/test/index.js | 20 +- .../with-global-events/test/listener.js | 10 +- .../higher-order/with-safe-timeout/index.js | 79 +- .../src/higher-order/with-state/test/index.js | 17 +- .../compose/src/hooks/use-dragging/README.md | 88 + .../compose/src/hooks/use-dragging/index.js | 67 + .../src/hooks/use-keyboard-shortcut/index.js | 37 +- .../src/hooks/use-media-query/index.js | 3 +- .../src/hooks/use-media-query/test/index.js | 36 +- .../src/hooks/use-reduced-motion/index.js | 6 +- .../src/hooks/use-viewport-match/index.js | 16 +- .../hooks/use-viewport-match/test/index.js | 20 +- packages/compose/src/index.js | 1 + packages/compose/src/index.native.js | 1 - .../create-higher-order-component/index.js | 17 +- .../test/index.js | 12 +- packages/core-data/README.md | 15 + packages/core-data/package.json | 2 +- packages/core-data/src/actions.js | 111 +- packages/core-data/src/controls.js | 12 +- packages/core-data/src/entities.js | 42 +- packages/core-data/src/entity-provider.js | 38 +- packages/core-data/src/index.js | 23 +- .../src/queried-data/get-query-parts.js | 5 +- .../core-data/src/queried-data/reducer.js | 16 +- .../core-data/src/queried-data/selectors.js | 8 +- .../src/queried-data/test/reducer.js | 58 +- .../src/queried-data/test/selectors.js | 5 +- packages/core-data/src/reducer.js | 137 +- packages/core-data/src/resolvers.js | 25 +- packages/core-data/src/selectors.js | 95 +- packages/core-data/src/test/actions.js | 50 +- packages/core-data/src/test/entities.js | 12 +- packages/core-data/src/test/reducer.js | 166 +- packages/core-data/src/test/resolvers.js | 143 +- packages/core-data/src/test/selectors.js | 141 +- packages/core-data/src/utils/on-sub-key.js | 5 +- .../core-data/src/utils/test/on-sub-key.js | 4 +- .../src/utils/test/replace-action.js | 8 +- packages/create-block/.npmrc | 1 + packages/create-block/CHANGELOG.md | 48 + packages/create-block/README.md | 117 + packages/create-block/index.js | 2 + packages/create-block/lib/cli-error.js | 3 + packages/create-block/lib/index.js | 70 + packages/create-block/lib/init-wp-scripts.js | 51 + packages/create-block/lib/log.js | 28 + packages/create-block/lib/prompts.js | 83 + packages/create-block/lib/scaffold.js | 104 + packages/create-block/lib/templates.js | 99 + .../lib/templates/es5/$slug.php.mustache | 56 + .../lib/templates/es5/.editorconfig.mustache | 21 + .../lib/templates/es5/editor.css.mustache | 9 + .../lib/templates/es5/index.js.mustache | 107 + .../lib/templates/es5/style.css.mustache | 12 + .../lib/templates/esnext/$slug.php.mustache | 59 + .../templates/esnext/.editorconfig.mustache | 21 + .../lib/templates/esnext/.gitignore.mustache | 27 + .../lib/templates/esnext/editor.css.mustache | 9 + .../templates/esnext/src/index.js.mustache | 96 + .../lib/templates/esnext/style.css.mustache | 12 + packages/create-block/package.json | 45 + .../index.js | 36 +- packages/data-controls/src/index.js | 6 +- packages/data-controls/src/test/index.js | 51 +- packages/data/package.json | 5 +- .../use-dispatch/test/use-dispatch.js | 7 +- .../use-dispatch/use-dispatch-with-map.js | 30 +- .../data/src/components/use-select/index.js | 41 +- .../src/components/use-select/test/index.js | 122 +- .../src/components/with-dispatch/index.js | 22 +- .../components/with-dispatch/test/index.js | 148 +- .../src/components/with-registry/index.js | 5 +- .../data/src/components/with-select/index.js | 26 +- .../src/components/with-select/test/index.js | 241 +- packages/data/src/factory.js | 3 +- packages/data/src/index.js | 3 +- packages/data/src/namespace-store/index.js | 110 +- .../src/namespace-store/metadata/reducer.js | 40 +- .../namespace-store/metadata/test/reducer.js | 70 +- .../namespace-store/metadata/test/utils.js | 4 +- .../src/namespace-store/metadata/utils.js | 5 +- .../data/src/namespace-store/test/index.js | 131 +- .../data/src/plugins/persistence/index.js | 60 +- .../src/plugins/persistence/test/index.js | 81 +- packages/data/src/registry.js | 37 +- .../data/src/resolvers-cache-middleware.js | 47 +- packages/data/src/store/index.js | 23 +- packages/data/src/test/registry.js | 175 +- packages/date/package.json | 2 +- packages/date/src/index.js | 77 +- packages/date/src/test/index.js | 15 +- .../index.js | 45 +- .../test/build.js | 18 +- .../fixtures/no-default/webpack.config.js | 4 +- .../output-format-json/webpack.config.js | 4 +- .../test/util.js | 23 +- .../util.js | 14 +- packages/deprecated/package.json | 2 +- packages/deprecated/src/index.js | 16 +- packages/deprecated/src/test/index.js | 9 +- packages/docgen/bin/cli.js | 81 +- packages/docgen/src/engine.js | 50 +- packages/docgen/src/get-export-entries.js | 48 +- .../src/get-intermediate-representation.js | 45 +- packages/docgen/src/get-type-as-string.js | 9 +- packages/docgen/src/index.js | 32 +- packages/docgen/src/is-symbol-private.js | 3 +- packages/docgen/src/markdown/embed.js | 11 +- packages/docgen/src/markdown/formatter.js | 63 +- packages/docgen/src/markdown/index.js | 32 +- .../default-undocumented-oneliner/code.js | 2 +- .../named-default-exported/module-code.js | 2 +- .../fixtures/named-default/module-code.js | 2 +- .../named-identifier-destructuring/code.js | 2 +- .../named-identifiers-and-inline/code.js | 1 - .../src/test/fixtures/named-variable/code.js | 1 - .../src/test/fixtures/named-variables/code.js | 1 - .../docgen/src/test/formatter-markdown.js | 75 +- .../docgen/src/test/get-export-entries.js | 156 +- .../test/get-intermediate-representation.js | 656 +- .../docgen/src/test/get-jsdoc-from-token.js | 155 +- packages/dom-ready/package.json | 2 +- packages/dom-ready/src/test/index.test.js | 5 +- packages/dom/package.json | 2 +- packages/dom/src/dom.js | 67 +- packages/dom/src/test/dom.js | 26 +- packages/dom/src/test/tabbable.js | 23 +- packages/dom/src/test/utils/create-element.js | 49 +- packages/e2e-test-utils/package.json | 2 +- .../e2e-test-utils/src/activate-plugin.js | 4 +- .../src/click-block-toolbar-button.js | 2 +- packages/e2e-test-utils/src/click-button.js | 4 +- .../src/click-on-close-modal-button.js | 3 +- .../src/click-on-more-menu-item.js | 20 +- .../e2e-test-utils/src/create-new-post.js | 6 +- .../e2e-test-utils/src/drag-and-resize.js | 4 +- .../src/ensure-sidebar-opened.js | 4 +- ...-sidebar-panel-toggle-button-with-title.js | 6 +- .../src/find-sidebar-panel-with-title.js | 9 +- .../src/get-all-block-inserter-item-titles.js | 8 +- .../src/get-available-block-transforms.js | 12 +- .../e2e-test-utils/src/get-block-setting.js | 14 +- packages/e2e-test-utils/src/index.js | 5 +- packages/e2e-test-utils/src/insert-block.js | 12 +- packages/e2e-test-utils/src/install-plugin.js | 7 +- .../e2e-test-utils/src/is-in-default-block.js | 8 +- packages/e2e-test-utils/src/login-user.js | 14 +- .../src/mocks/create-embedding-matcher.js | 4 +- .../src/mocks/create-json-response.js | 3 +- .../src/mocks/mock-or-transform.js | 4 +- .../e2e-test-utils/src/observe-focus-loss.js | 10 +- .../src/open-all-block-inserter-categories.js | 3 +- .../src/press-key-with-modifier.js | 26 +- .../src/set-browser-viewport.js | 7 +- packages/e2e-test-utils/src/shared/config.js | 7 +- .../src/toggle-screen-option.js | 4 +- .../e2e-test-utils/src/transform-block-to.js | 8 +- .../e2e-test-utils/src/visit-admin-page.js | 4 +- packages/e2e-test-utils/src/wp-data-select.js | 4 +- packages/e2e-tests/config/gutenberg-phase.js | 5 +- .../e2e-tests/config/setup-test-framework.js | 21 +- packages/e2e-tests/experimental-features.js | 18 +- .../e2e-tests/fixtures/block-transforms.js | 456 +- .../fixtures/blocks/core__columns.html | 4 +- .../fixtures/blocks/core__columns.json | 6 +- .../fixtures/blocks/core__columns.parsed.json | 8 +- .../blocks/core__columns.serialized.html | 4 +- .../fixtures/blocks/core__navigation.json | 4 +- packages/e2e-tests/fixtures/utils.js | 13 +- packages/e2e-tests/jest.config.js | 4 +- packages/e2e-tests/jest.performance.config.js | 13 +- .../e2e-tests/plugins/custom-post-types.php | 20 + .../blocks/__snapshots__/buttons.test.js.snap | 8 + .../__snapshots__/navigation.test.js.snap | 4 +- .../specs/editor/blocks/buttons.test.js | 19 +- .../specs/editor/blocks/classic.test.js | 17 +- .../specs/editor/blocks/columns.test.js | 6 +- .../specs/editor/blocks/heading.test.js | 22 +- .../specs/editor/blocks/html.test.js | 4 +- .../specs/editor/blocks/navigation.test.js | 96 +- .../specs/editor/blocks/spacer.test.js | 8 +- .../specs/editor/blocks/table.test.js | 36 +- .../specs/editor/plugins/align-hook.test.js | 217 +- .../editor/plugins/allowed-blocks.test.js | 33 +- .../specs/editor/plugins/annotations.test.js | 30 +- .../specs/editor/plugins/block-icons.test.js | 54 +- .../editor/plugins/container-blocks.test.js | 47 +- .../specs/editor/plugins/cpt-locking.test.js | 60 +- .../editor/plugins/custom-post-types.test.js | 67 + .../editor/plugins/custom-taxonomies.test.js | 21 +- .../specs/editor/plugins/hooks-api.test.js | 9 +- .../inner-blocks-allowed-blocks.test.js | 21 +- .../plugins/innerblocks-locking-all-embed.js | 7 +- .../plugins/meta-attribute-block.test.js | 28 +- .../specs/editor/plugins/meta-boxes.test.js | 37 +- .../specs/editor/plugins/plugins-api.test.js | 30 +- .../specs/editor/plugins/templates.test.js | 8 +- .../multi-block-selection.test.js.snap | 24 + .../specs/editor/various/a11y.test.js | 16 +- .../editor/various/adding-blocks.test.js | 73 +- .../various/adding-inline-tokens.test.js | 17 +- .../specs/editor/various/autosave.test.js | 186 +- .../editor/various/block-deletion.test.js | 25 +- .../editor/various/block-grouping.test.js | 41 +- .../block-hierarchy-navigation.test.js | 22 +- .../editor/various/block-switcher.test.js | 20 +- .../editor/various/change-detection.test.js | 53 +- .../compatibility-classic-editor.test.js | 14 +- .../specs/editor/various/datepicker.test.js | 8 +- .../specs/editor/various/editor-modes.test.js | 66 +- .../specs/editor/various/embedding.test.js | 104 +- .../editor/various/font-size-picker.test.js | 48 +- .../editor/various/fullscreen-mode.test.js | 4 +- .../editor/various/invalid-block.test.js | 17 +- .../various/keyboard-navigable-blocks.test.js | 46 +- .../specs/editor/various/links.test.js | 53 +- .../various/manage-reusable-blocks.test.js | 30 +- .../various/multi-block-selection.test.js | 125 +- .../editor/various/navigable-toolbar.test.js | 89 +- .../various/new-post-default-content.test.js | 4 +- .../specs/editor/various/new-post.test.js | 20 +- .../specs/editor/various/nux.test.js | 44 +- .../specs/editor/various/popovers.test.js | 3 +- .../editor/various/post-visibility.test.js | 22 +- .../specs/editor/various/preferences.test.js | 4 +- .../specs/editor/various/preview.test.js | 81 +- .../editor/various/publish-button.test.js | 26 +- .../editor/various/publish-panel.test.js | 46 +- .../specs/editor/various/publishing.test.js | 75 +- .../editor/various/reusable-blocks.test.js | 36 +- .../specs/editor/various/rich-text.test.js | 55 +- .../specs/editor/various/rtl.test.js | 12 +- .../specs/editor/various/scheduling.test.js | 16 +- .../editor/various/shortcut-help.test.js | 16 +- .../various/sidebar-permalink-panel.test.js | 16 +- .../specs/editor/various/sidebar.test.js | 63 +- .../editor/various/splitting-merging.test.js | 4 +- .../editor/various/style-variation.test.js | 4 +- .../specs/editor/various/taxonomies.test.js | 84 +- .../specs/editor/various/typewriter.test.js | 75 +- .../specs/editor/various/undo.test.js | 28 +- .../specs/editor/various/writing-flow.test.js | 67 +- .../specs/performance/performance.test.js | 21 +- .../inner-blocks-render-appender.test.js | 30 +- packages/edit-post/package.json | 3 +- .../src/components/admin-notices/index.js | 8 +- .../components/admin-notices/test/index.js | 4 +- .../plugin-block-settings-menu-group.js | 30 +- .../plugin-block-settings-menu-item.js | 33 +- .../src/components/browser-url/index.js | 5 +- .../editor-initialization/listener-hooks.js | 21 +- .../test/listener-hooks.js | 297 +- .../src/components/editor-regions/index.js | 9 +- .../components/fullscreen-mode/test/index.js | 16 +- .../components/header/feature-toggle/index.js | 13 +- .../header/fullscreen-mode-close/index.js | 4 +- .../components/header/header-toolbar/index.js | 36 +- .../header/header-toolbar/index.native.js | 43 +- .../edit-post/src/components/header/index.js | 46 +- .../src/components/header/index.native.js | 4 +- .../components/header/mode-switcher/index.js | 23 +- .../components/header/more-menu/test/index.js | 4 +- .../components/header/pinned-plugins/index.js | 10 +- .../header/plugin-more-menu-item/index.js | 2 +- .../plugin-more-menu-item/test/index.js | 9 +- .../plugin-sidebar-more-menu-item/index.js | 29 +- .../header/plugins-more-menu-group/index.js | 14 +- .../header/post-publish-button-or-toggle.js | 10 +- .../src/components/header/test/index.js | 32 +- .../header/tools-more-menu-group/index.js | 14 +- .../components/header/writing-menu/index.js | 8 +- .../keyboard-shortcut-help-modal/index.js | 35 +- .../keyboard-shortcut-help-modal/shortcut.js | 33 +- .../components/keyboard-shortcuts/index.js | 69 +- .../edit-post/src/components/layout/index.js | 131 +- .../src/components/layout/index.native.js | 79 +- .../manage-blocks-modal/category.js | 27 +- .../manage-blocks-modal/checklist.js | 4 +- .../components/manage-blocks-modal/manager.js | 39 +- .../manage-blocks-modal/show-all.js | 6 +- .../src/components/meta-boxes/index.js | 4 +- .../meta-boxes/meta-box-visibility.js | 4 +- .../meta-boxes/meta-boxes-area/index.js | 9 +- .../src/components/options-modal/index.js | 42 +- .../options-modal/meta-boxes-section.js | 24 +- .../options/enable-custom-fields.js | 19 +- .../options-modal/options/enable-panel.js | 7 +- .../enable-plugin-document-setting-panel.js | 9 +- .../options/enable-publish-sidebar.js | 9 +- .../enable-custom-fields.js.snap | 20 +- .../options/test/enable-custom-fields.js | 31 +- .../options-modal/test/meta-boxes-section.js | 8 +- .../sidebar/discussion-panel/index.js | 25 +- .../sidebar/featured-image/index.js | 9 +- .../edit-post/src/components/sidebar/index.js | 15 +- .../sidebar/page-attributes/index.js | 29 +- .../plugin-document-setting-panel/index.js | 29 +- .../plugin-post-publish-panel/index.js | 10 +- .../test/__snapshots__/index.js.snap | 2 +- .../plugin-post-publish-panel/test/index.js | 2 +- .../sidebar/plugin-post-status-info/index.js | 4 +- .../plugin-post-status-info/test/index.js | 4 +- .../sidebar/plugin-pre-publish-panel/index.js | 10 +- .../test/__snapshots__/index.js.snap | 2 +- .../sidebar/plugin-sidebar/index.js | 39 +- .../components/sidebar/post-author/index.js | 5 +- .../components/sidebar/post-excerpt/index.js | 24 +- .../components/sidebar/post-format/index.js | 5 +- .../src/components/sidebar/post-link/index.js | 46 +- .../sidebar/post-pending-status/index.js | 5 +- .../components/sidebar/post-schedule/index.js | 10 +- .../components/sidebar/post-status/index.js | 16 +- .../components/sidebar/post-sticky/index.js | 5 +- .../sidebar/post-taxonomies/index.js | 5 +- .../sidebar/post-taxonomies/taxonomy-panel.js | 26 +- .../sidebar/post-visibility/index.js | 58 +- .../sidebar/settings-header/index.js | 28 +- .../sidebar/settings-sidebar/index.js | 13 +- .../sidebar/sidebar-header/index.js | 20 +- .../src/components/text-editor/index.js | 5 +- .../visual-editor/block-inspector-button.js | 29 +- .../src/components/visual-editor/index.js | 30 +- .../components/visual-editor/index.native.js | 24 +- .../src/components/visual-editor/style.scss | 5 +- .../src/components/welcome-guide/index.js | 42 +- packages/edit-post/src/editor.js | 33 +- packages/edit-post/src/editor.native.js | 33 +- .../src/hooks/validate-multiple-use/index.js | 47 +- packages/edit-post/src/index.js | 53 +- .../plugins/copy-content-menu-item/index.js | 31 +- packages/edit-post/src/plugins/index.js | 12 +- .../index.js | 4 +- .../plugins/manage-blocks-menu-item/index.js | 4 +- .../edit-post/src/prevent-event-discovery.js | 7 +- packages/edit-post/src/store/actions.js | 7 + packages/edit-post/src/store/effects.js | 53 +- packages/edit-post/src/store/middlewares.js | 6 +- packages/edit-post/src/store/reducer.js | 29 +- packages/edit-post/src/store/selectors.js | 30 +- packages/edit-post/src/store/test/reducer.js | 43 +- .../edit-post/src/store/test/selectors.js | 27 +- packages/edit-post/src/test/editor.native.js | 8 +- packages/edit-post/src/utils/meta-boxes.js | 4 +- packages/edit-site/package.json | 2 +- .../src/components/block-editor/index.js | 5 +- .../src/components/save-button/index.js | 16 +- packages/edit-widgets/package.json | 2 +- .../sync-customizer.js | 69 +- .../edit-widgets-initializer/index.js | 6 +- .../src/components/inserter/index.js | 8 +- .../src/components/save-button/index.js | 39 +- .../src/components/sidebar/index.js | 5 +- .../src/components/widget-area/index.js | 54 +- .../src/components/widget-areas/index.js | 7 +- packages/edit-widgets/src/index.js | 13 +- packages/editor/package.json | 3 +- .../src/components/autocompleters/block.js | 9 +- .../components/autocompleters/test/block.js | 59 +- .../components/autocompleters/test/user.js | 37 +- .../src/components/autocompleters/user.js | 22 +- .../src/components/autosave-monitor/index.js | 26 +- .../components/autosave-monitor/test/index.js | 28 +- .../convert-button.js | 123 +- .../convert-to-group-buttons/icons.js | 41 +- .../convert-to-group-buttons/index.native.js | 1 - packages/editor/src/components/deprecated.js | 202 +- .../src/components/document-outline/check.js | 5 +- .../src/components/document-outline/index.js | 52 +- .../src/components/document-outline/item.js | 29 +- .../components/document-outline/test/index.js | 75 +- .../components/entities-saved-states/index.js | 34 +- .../src/components/error-boundary/index.js | 12 +- .../save-shortcut.js | 33 +- .../text-editor-shortcuts.js | 4 +- .../visual-editor-shortcuts.js | 67 +- .../editor/src/components/index.native.js | 1 - .../local-autosave-monitor/README.md | 20 + .../local-autosave-monitor/index.js | 95 +- .../src/components/page-attributes/check.js | 16 +- .../src/components/page-attributes/order.js | 63 +- .../src/components/page-attributes/parent.js | 37 +- .../components/page-attributes/template.js | 25 +- .../components/page-attributes/test/check.js | 42 +- .../src/components/post-author/check.js | 18 +- .../src/components/post-author/index.js | 8 +- .../src/components/post-author/test/check.js | 11 +- .../src/components/post-author/test/index.js | 3 +- .../src/components/post-comments/index.js | 9 +- .../src/components/post-excerpt/index.js | 8 +- .../components/post-featured-image/index.js | 152 +- .../src/components/post-format/check.js | 22 +- .../src/components/post-format/index.js | 37 +- .../components/post-last-revision/check.js | 31 +- .../components/post-last-revision/index.js | 37 +- .../src/components/post-locked-modal/index.js | 53 +- .../components/post-pending-status/check.js | 18 +- .../components/post-pending-status/index.js | 2 +- .../post-pending-status/test/check.js | 6 +- .../src/components/post-permalink/editor.js | 7 +- .../src/components/post-permalink/index.js | 52 +- .../src/components/post-pingbacks/index.js | 9 +- .../components/post-preview-button/index.js | 30 +- .../post-preview-button/test/index.js | 25 +- .../components/post-publish-button/index.js | 35 +- .../components/post-publish-button/label.js | 12 +- .../post-publish-button/test/index.js | 69 +- .../post-publish-button/test/label.js | 33 +- .../components/post-publish-panel/index.js | 42 +- .../maybe-post-format-panel.js | 44 +- .../post-publish-panel/maybe-tags-panel.js | 27 +- .../post-publish-panel/postpublish.js | 42 +- .../post-publish-panel/prepublish.js | 73 +- .../post-publish-panel/test/index.js | 22 +- .../src/components/post-saved-state/index.js | 30 +- .../components/post-saved-state/style.scss | 5 +- .../components/post-saved-state/test/index.js | 11 +- .../src/components/post-schedule/check.js | 6 +- .../src/components/post-schedule/index.js | 4 +- .../src/components/post-schedule/label.js | 9 +- .../components/post-schedule/test/check.js | 10 +- .../components/post-schedule/test/label.js | 8 +- .../editor/src/components/post-slug/check.js | 4 +- .../editor/src/components/post-slug/index.js | 16 +- .../src/components/post-slug/test/check.js | 6 +- .../src/components/post-slug/test/index.js | 9 +- .../src/components/post-sticky/check.js | 11 +- .../src/components/post-sticky/index.js | 4 +- .../post-switch-to-draft-button/index.js | 15 +- .../src/components/post-taxonomies/check.js | 5 +- .../post-taxonomies/flat-term-selector.js | 118 +- .../hierarchical-term-selector.js | 245 +- .../src/components/post-taxonomies/index.js | 30 +- .../components/post-taxonomies/test/index.js | 13 +- .../src/components/post-text-editor/index.js | 5 +- .../components/post-text-editor/test/index.js | 29 +- .../editor/src/components/post-title/index.js | 31 +- .../src/components/post-title/index.native.js | 69 +- .../src/components/post-trash/style.scss | 4 +- .../post-type-support-check/test/index.js | 18 +- .../src/components/post-visibility/check.js | 6 +- .../src/components/post-visibility/index.js | 43 +- .../src/components/post-visibility/label.js | 3 +- .../components/post-visibility/test/check.js | 8 +- .../src/components/post-visibility/utils.js | 4 +- .../editor/src/components/provider/index.js | 37 +- .../src/components/provider/index.native.js | 99 +- .../provider/with-registry-provider.js | 65 +- .../reusable-blocks-buttons/index.native.js | 1 - .../reusable-block-convert-button.js | 55 +- .../reusable-block-delete-button.js | 31 +- .../src/components/table-of-contents/index.js | 7 +- .../src/components/table-of-contents/panel.js | 24 +- .../template-validation-notice/index.js | 34 +- .../components/theme-support-check/index.js | 37 +- .../theme-support-check/test/index.js | 65 +- .../unsaved-changes-warning/index.js | 4 +- .../editor/src/components/word-count/index.js | 4 +- .../custom-sources-backwards-compatibility.js | 90 +- .../src/hooks/test/default-autocompleters.js | 24 +- packages/editor/src/store/actions.js | 149 +- packages/editor/src/store/constants.js | 4 +- packages/editor/src/store/controls.js | 17 +- packages/editor/src/store/defaults.js | 1 - .../src/store/effects/reusable-blocks.js | 80 +- .../src/store/effects/test/reusable-blocks.js | 286 +- packages/editor/src/store/middlewares.js | 2 +- packages/editor/src/store/reducer.js | 35 +- packages/editor/src/store/reducer.native.js | 28 +- packages/editor/src/store/selectors.js | 526 +- packages/editor/src/store/selectors.native.js | 37 +- packages/editor/src/store/test/actions.js | 207 +- .../editor/src/store/test/actions.native.js | 1 - packages/editor/src/store/test/reducer.js | 49 +- .../editor/src/store/test/reducer.native.js | 12 +- packages/editor/src/store/test/selectors.js | 248 +- .../editor/src/store/utils/notice-builder.js | 24 +- .../src/store/utils/test/notice-builder.js | 124 +- .../editor/src/utils/media-upload/index.js | 3 +- .../src/utils/media-upload/index.native.js | 2 +- packages/editor/src/utils/terms.js | 7 +- packages/editor/src/utils/test/terms.js | 20 +- packages/editor/src/utils/url.js | 4 +- packages/element/package.json | 2 +- .../element/src/create-interpolate-element.js | 60 +- packages/element/src/react.js | 21 +- packages/element/src/serialize.js | 74 +- .../src/test/create-interpolate-element.js | 248 +- packages/element/src/test/index.js | 57 +- packages/element/src/test/raw-html.js | 12 +- packages/element/src/test/serialize.js | 115 +- packages/element/src/utils.js | 6 +- packages/env/CHANGELOG.md | 5 + packages/env/lib/cli.js | 6 +- packages/env/lib/detect-context.js | 21 +- packages/env/lib/env.js | 17 +- packages/env/test/cli.js | 4 +- packages/escape-html/package.json | 2 +- packages/escape-html/src/index.js | 4 +- packages/escape-html/src/test/index.js | 16 +- packages/eslint-plugin/CHANGELOG.md | 7 + packages/eslint-plugin/README.md | 5 +- packages/eslint-plugin/configs/custom.js | 22 +- packages/eslint-plugin/configs/es5.js | 39 +- packages/eslint-plugin/configs/esnext.js | 23 +- packages/eslint-plugin/configs/jsdoc.js | 38 +- packages/eslint-plugin/configs/jsx-a11y.js | 17 +- packages/eslint-plugin/configs/react.js | 30 +- .../configs/recommended-with-formatting.js | 29 + packages/eslint-plugin/configs/recommended.js | 38 +- packages/eslint-plugin/configs/test-e2e.js | 4 +- packages/eslint-plugin/configs/test-unit.js | 4 +- packages/eslint-plugin/package.json | 4 +- .../rules/__tests__/dependency-group.js | 15 +- .../rules/__tests__/gutenberg-phase.js | 9 +- .../no-base-control-with-label-without-id.js | 14 +- .../__tests__/no-unused-vars-before-return.js | 21 +- .../__tests__/react-no-unsafe-timeout.js | 21 +- .../rules/__tests__/valid-sprintf.js | 53 +- .../eslint-plugin/rules/dependency-group.js | 13 +- .../eslint-plugin/rules/gutenberg-phase.js | 35 +- .../no-base-control-with-label-without-id.js | 9 +- .../rules/no-unguarded-get-range-at.js | 4 +- .../rules/no-unused-vars-before-return.js | 24 +- .../rules/react-no-unsafe-timeout.js | 16 +- packages/format-library/package.json | 2 +- packages/format-library/src/bold/index.js | 6 +- .../format-library/src/default-formats.js | 10 +- .../src/default-formats.native.js | 7 +- packages/format-library/src/image/index.js | 98 +- packages/format-library/src/index.js | 8 +- packages/format-library/src/italic/index.js | 6 +- packages/format-library/src/link/index.js | 177 +- .../format-library/src/link/index.native.js | 201 +- packages/format-library/src/link/inline.js | 68 +- .../format-library/src/link/modal.native.js | 56 +- .../format-library/src/link/test/inline.js | 9 +- .../src/link/test/modal.native.js | 29 +- .../format-library/src/link/test/utils.js | 50 +- packages/format-library/src/link/utils.js | 5 +- .../format-library/src/underline/index.js | 8 +- packages/hooks/benchmark/index.js | 2 +- packages/hooks/package.json | 2 +- packages/hooks/src/createAddHook.js | 9 +- packages/hooks/src/createDidHook.js | 6 +- packages/hooks/src/createDoingHook.js | 6 +- packages/hooks/src/createHasHook.js | 8 +- packages/hooks/src/createRemoveHook.js | 9 +- packages/hooks/src/createRunHook.js | 4 +- packages/hooks/src/test/index.test.js | 164 +- packages/hooks/src/validateHookName.js | 4 +- packages/hooks/src/validateNamespace.js | 4 +- packages/html-entities/package.json | 2 +- packages/html-entities/src/index.js | 9 +- packages/html-entities/src/test/entities.js | 2 +- packages/i18n/benchmark/index.js | 2 +- packages/i18n/package.json | 2 +- packages/i18n/src/test/index.js | 53 +- packages/i18n/tools/pot-to-php.js | 63 +- packages/icons/.npmrc | 1 + packages/icons/CHANGELOG.md | 3 + packages/icons/README.md | 30 + packages/icons/package.json | 33 + packages/icons/src/icon/index.js | 14 + packages/icons/src/icon/stories/index.js | 29 + packages/icons/src/index.js | 56 + packages/icons/src/library/align-center.js | 12 + .../src/library/align-justify.js} | 7 +- packages/icons/src/library/align-left.js | 12 + packages/icons/src/library/align-right.js | 12 + packages/icons/src/library/archive.js | 12 + packages/icons/src/library/audio.js | 12 + packages/icons/src/library/button.js | 12 + packages/icons/src/library/calendar.js | 12 + packages/icons/src/library/category.js | 14 + packages/icons/src/library/check.js | 12 + packages/icons/src/library/chevron-down.js | 12 + packages/icons/src/library/chevron-up.js | 12 + packages/icons/src/library/classic.js | 23 + packages/icons/src/library/code.js | 12 + packages/icons/src/library/column.js | 12 + packages/icons/src/library/columns.js | 12 + packages/icons/src/library/comment.js | 12 + packages/icons/src/library/cover.js | 12 + packages/icons/src/library/file.js | 12 + packages/icons/src/library/gallery.js | 12 + packages/icons/src/library/group.js | 21 + packages/icons/src/library/heading.js | 12 + packages/icons/src/library/html.js | 12 + packages/icons/src/library/image.js | 13 + packages/icons/src/library/list.js | 12 + .../src/library/map-marker.js} | 7 +- packages/icons/src/library/media-and-text.js | 12 + packages/icons/src/library/menu.js | 12 + packages/icons/src/library/more.js | 12 + packages/icons/src/library/navigation.js | 12 + packages/icons/src/library/page-break.js | 12 + packages/icons/src/library/paragraph.js | 12 + packages/icons/src/library/plus-circle.js | 12 + packages/icons/src/library/position-center.js | 12 + packages/icons/src/library/position-left.js | 12 + packages/icons/src/library/position-right.js | 12 + packages/icons/src/library/post-list.js | 18 + packages/icons/src/library/preformatted.js | 16 + packages/icons/src/library/pullquote.js | 14 + packages/icons/src/library/quote.js | 12 + .../icons/src/library/resize-corner-n-e.js | 12 + packages/icons/src/library/rss.js | 12 + packages/icons/src/library/search.js | 12 + packages/icons/src/library/separator.js | 12 + packages/icons/src/library/shortcode.js | 12 + .../icons/src/library/stretch-full-width.js | 12 + packages/icons/src/library/stretch-wide.js | 12 + packages/icons/src/library/table.js | 12 + packages/icons/src/library/tag.js | 12 + .../icon.js => icons/src/library/title.js} | 7 +- packages/icons/src/library/trash.js | 12 + packages/icons/src/library/verse.js | 12 + packages/icons/src/library/video.js | 12 + packages/icons/src/library/widget.js | 12 + packages/is-shallow-equal/benchmark/index.js | 70 +- packages/is-shallow-equal/package.json | 2 +- packages/jest-console/package.json | 2 +- packages/jest-console/src/index.js | 4 +- packages/jest-console/src/matchers.js | 91 +- packages/jest-console/src/test/index.test.js | 140 +- packages/jest-preset-default/CHANGELOG.md | 6 + packages/jest-preset-default/jest-preset.js | 29 +- packages/jest-preset-default/package.json | 2 +- .../scripts/setup-globals.js | 4 +- .../scripts/travis-fold-passes-reporter.js | 4 +- packages/jest-puppeteer-axe/package.json | 2 +- packages/jest-puppeteer-axe/src/index.js | 104 +- packages/keyboard-shortcuts/package.json | 2 +- .../src/hooks/use-shortcut.js | 11 +- .../keyboard-shortcuts/src/store/actions.js | 8 +- .../keyboard-shortcuts/src/store/selectors.js | 33 +- packages/keycodes/package.json | 2 +- packages/keycodes/src/index.js | 42 +- packages/keycodes/src/platform.js | 6 +- packages/keycodes/src/test/index.js | 124 +- packages/keycodes/src/test/platform.js | 40 +- .../index.js | 38 +- .../test/fixtures/webpack.config.js | 4 +- packages/list-reusable-blocks/package.json | 2 +- .../src/components/import-dropdown/index.js | 6 +- .../src/components/import-form/index.js | 6 +- packages/list-reusable-blocks/src/index.js | 8 +- .../list-reusable-blocks/src/utils/export.js | 18 +- packages/media-utils/package.json | 2 +- .../src/components/media-upload/index.js | 62 +- .../src/utils/test/upload-media.test.js | 80 +- .../media-utils/src/utils/upload-media.js | 42 +- packages/notices/package.json | 2 +- packages/notices/src/store/actions.js | 6 +- packages/notices/src/store/test/reducer.js | 51 +- packages/notices/src/store/test/selectors.js | 4 +- .../notices/src/store/utils/on-sub-key.js | 5 +- .../npm-package-json-lint-config/index.js | 4 +- packages/nux/package.json | 2 +- packages/nux/src/components/dot-tip/index.js | 2 +- .../nux/src/components/dot-tip/test/index.js | 10 +- packages/nux/src/store/reducer.js | 5 +- packages/nux/src/store/selectors.js | 15 +- packages/nux/src/store/test/reducer.js | 15 +- packages/nux/src/store/test/selectors.js | 4 +- packages/plugins/package.json | 2 +- packages/plugins/src/api/index.js | 16 +- packages/plugins/src/api/test/index.js | 28 +- .../src/components/plugin-area/index.js | 22 +- .../src/components/plugin-context/index.js | 25 +- packages/postcss-themes/index.js | 29 +- packages/postcss-themes/test/index.js | 8 +- packages/primitives/.npmrc | 1 + packages/primitives/CHANGELOG.md | 3 + packages/primitives/README.md | 27 + packages/primitives/package.json | 33 + .../src}/block-quotation/README.md | 0 .../src}/block-quotation/index.js | 0 .../src}/block-quotation/index.native.js | 10 +- .../src}/block-quotation/style.native.scss | 0 .../src}/horizontal-rule/README.md | 0 .../src}/horizontal-rule/index.js | 0 .../src}/horizontal-rule/index.native.js | 4 +- .../primitives => primitives/src}/index.js | 0 .../src}/svg/README.md | 0 .../src}/svg/index.js | 3 +- .../src}/svg/index.native.js | 25 +- .../src}/svg/style.native.scss | 0 packages/priority-queue/package.json | 2 +- packages/priority-queue/src/index.js | 15 +- packages/priority-queue/src/test/index.js | 10 +- .../lib/add-first-time-contributor-label.js | 16 +- .../lib/add-milestone.js | 31 +- .../lib/assign-fixed-issues.js | 8 +- .../lib/index.js | 15 +- .../test/add-first-time-contributor-label.js | 24 +- .../lib/test/add-milestone.js | 108 +- .../lib/test/assign-fixed-issues.js | 6 +- .../package.json | 2 +- packages/redux-routine/package.json | 2 +- packages/redux-routine/src/runtime.js | 54 +- packages/redux-routine/src/test/index.js | 57 +- packages/redux-routine/src/test/is-action.js | 9 +- .../redux-routine/src/test/is-generator.js | 4 +- packages/rich-text/package.json | 2 +- packages/rich-text/src/apply-format.js | 33 +- packages/rich-text/src/change-list-type.js | 8 +- .../rich-text/src/component/format-edit.js | 9 +- packages/rich-text/src/component/index.js | 272 +- .../rich-text/src/component/index.native.js | 275 +- .../rich-text/src/component/inline-warning.js | 8 +- .../src/component/test/index.native.js | 3 +- .../src/component/with-format-types.js | 138 +- packages/rich-text/src/create.js | 63 +- packages/rich-text/src/get-active-formats.js | 10 +- packages/rich-text/src/indent-list-items.js | 3 +- .../rich-text/src/insert-line-separator.js | 5 +- packages/rich-text/src/insert-object.js | 7 +- packages/rich-text/src/insert.js | 16 +- packages/rich-text/src/is-empty.js | 5 +- packages/rich-text/src/join.js | 15 +- packages/rich-text/src/outdent-list-items.js | 3 +- .../rich-text/src/register-format-type.js | 34 +- packages/rich-text/src/remove-format.js | 4 +- .../rich-text/src/remove-line-separator.js | 11 +- packages/rich-text/src/replace.js | 17 +- packages/rich-text/src/slice.js | 6 +- packages/rich-text/src/split.js | 5 +- packages/rich-text/src/store/selectors.js | 4 +- .../rich-text/src/store/test/selectors.js | 10 +- packages/rich-text/src/test/apply-format.js | 46 +- .../rich-text/src/test/change-list-type.js | 36 +- packages/rich-text/src/test/create.js | 102 +- .../rich-text/src/test/get-format-types.js | 5 +- .../src/test/get-last-child-index.js | 65 +- .../src/test/get-parent-line-index.js | 52 +- packages/rich-text/src/test/helpers/index.js | 123 +- .../rich-text/src/test/is-format-equal.js | 6 +- packages/rich-text/src/test/join.js | 5 +- .../rich-text/src/test/normalise-formats.js | 9 +- .../src/test/register-format-type.js | 78 +- packages/rich-text/src/test/remove-format.js | 32 +- packages/rich-text/src/test/replace.js | 10 +- packages/rich-text/src/test/split.js | 56 +- packages/rich-text/src/test/to-dom.js | 30 +- packages/rich-text/src/test/to-html-string.js | 89 +- packages/rich-text/src/test/toggle-format.js | 34 +- .../src/test/unregister-format-type.js | 4 +- packages/rich-text/src/to-dom.js | 21 +- packages/rich-text/src/to-html-string.js | 18 +- packages/rich-text/src/to-tree.js | 89 +- .../rich-text/src/unregister-format-type.js | 4 +- packages/scripts/CHANGELOG.md | 15 +- packages/scripts/README.md | 65 +- packages/scripts/config/.eslintrc-md.js | 14 +- packages/scripts/config/.markdownlint.json | 8 + packages/scripts/config/.prettierrc.js | 12 + packages/scripts/config/jest-e2e.config.js | 10 +- packages/scripts/config/webpack.config.js | 14 +- packages/scripts/package.json | 11 +- packages/scripts/scripts/build.js | 8 +- packages/scripts/scripts/check-engines.js | 19 +- packages/scripts/scripts/check-licenses.js | 89 +- packages/scripts/scripts/env.js | 55 +- packages/scripts/scripts/env/cli.js | 8 +- packages/scripts/scripts/env/connect.js | 39 +- packages/scripts/scripts/env/docker-run.js | 6 +- packages/scripts/scripts/env/install.js | 27 +- packages/scripts/scripts/env/lint-php.js | 6 +- packages/scripts/scripts/env/start.js | 8 +- packages/scripts/scripts/env/test-php.js | 6 +- packages/scripts/scripts/env/update.js | 16 +- packages/scripts/scripts/format-js.js | 126 + packages/scripts/scripts/lint-js.js | 29 +- packages/scripts/scripts/lint-md-docs.js | 65 + .../scripts/{lint-md.js => lint-md-js.js} | 23 +- packages/scripts/scripts/lint-pkg-json.js | 31 +- packages/scripts/scripts/lint-style.js | 32 +- packages/scripts/scripts/packages-update.js | 42 +- packages/scripts/scripts/start.js | 4 +- packages/scripts/scripts/test-e2e.js | 21 +- packages/scripts/scripts/test-unit-jest.js | 17 +- packages/scripts/utils/cli.js | 33 +- packages/scripts/utils/config.js | 23 +- packages/scripts/utils/env.js | 66 +- packages/scripts/utils/file.js | 1 + packages/scripts/utils/index.js | 20 +- packages/scripts/utils/process.js | 4 +- packages/scripts/utils/string.js | 5 +- packages/scripts/utils/test/index.js | 44 +- packages/scripts/utils/test/string.js | 4 +- packages/server-side-render/package.json | 2 +- packages/server-side-render/src/index.js | 52 +- .../src/server-side-render.js | 81 +- packages/server-side-render/src/test/index.js | 19 +- packages/shortcode/package.json | 2 +- packages/shortcode/src/index.js | 94 +- packages/shortcode/src/test/index.js | 132 +- packages/token-list/package.json | 2 +- packages/token-list/src/index.js | 2 +- packages/token-list/src/test/index.js | 4 +- packages/url/package.json | 2 +- packages/url/src/clean-for-slug.js | 4 +- packages/url/src/get-authority.js | 4 +- packages/url/src/get-path.js | 4 +- packages/url/src/get-query-arg.js | 5 +- packages/url/src/remove-query-args.js | 8 +- packages/url/src/test/index.test.js | 247 +- packages/viewport/package.json | 2 +- packages/viewport/src/if-viewport-matches.js | 25 +- packages/viewport/src/listener.js | 40 +- packages/viewport/src/listener.native.js | 20 +- packages/viewport/src/store/test/selectors.js | 22 +- .../viewport/src/test/if-viewport-matches.js | 16 +- .../viewport/src/test/with-viewport-match.js | 7 +- packages/viewport/src/with-viewport-match.js | 51 +- .../src/with-viewport-match.native.js | 17 +- packages/warning/babel-plugin.js | 19 +- packages/warning/test/babel-plugin.js | 11 +- packages/wordcount/package.json | 2 +- packages/wordcount/src/defaultSettings.js | 79 +- packages/wordcount/src/index.js | 21 +- packages/wordcount/src/test/index.test.js | 11 +- readme.txt | 159 +- storybook/main.js | 1 + storybook/stories/playground/index.js | 2 - storybook/test/__snapshots__/index.js.snap | 336 +- storybook/test/index.js | 7 +- test/integration/blocks-raw-handling.test.js | 179 +- .../full-content/full-content.test.js | 138 +- .../full-content/server-registered.json | 2 +- test/integration/is-valid-block.test.js | 17 +- .../non-matched-tags-handling.test.js | 9 +- test/integration/shortcode-converter.test.js | 34 +- .../__mocks__/react-native-aztec/index.js | 10 +- test/native/babel.config.js | 20 +- test/native/jest.config.js | 35 +- test/native/setup.js | 8 +- test/unit/config/gutenberg-phase.js | 5 +- test/unit/jest.config.js | 13 +- test/unit/scripts/babel-transformer.js | 10 +- webpack.config.js | 121 +- 1797 files changed, 53005 insertions(+), 29235 deletions(-) create mode 100644 .markdownlintignore create mode 100644 .prettierrc.js create mode 100644 experimental-default-global-styles.json create mode 100644 lib/global-styles.php create mode 100644 packages/block-directory/src/store/test/fixtures/index.js create mode 100644 packages/block-directory/src/store/test/reducer.js create mode 100644 packages/block-directory/src/store/test/selectors.js delete mode 100644 packages/block-editor/src/components/block-pattern-picker/index.js create mode 100644 packages/block-editor/src/components/block-variation-picker/index.js rename packages/block-editor/src/components/{block-pattern-picker => block-variation-picker}/style.scss (81%) create mode 100644 packages/block-editor/src/components/colors-gradients/test/control.js create mode 100644 packages/block-editor/src/components/media-edit/index.native.js delete mode 100644 packages/block-library/src/archives/icon.js delete mode 100644 packages/block-library/src/audio/icon.js delete mode 100644 packages/block-library/src/button/icon.js delete mode 100644 packages/block-library/src/categories/icon.js delete mode 100644 packages/block-library/src/classic/icon.js delete mode 100644 packages/block-library/src/column/icon.js delete mode 100644 packages/block-library/src/columns/icon.js delete mode 100644 packages/block-library/src/columns/patterns.js create mode 100644 packages/block-library/src/columns/variations.js delete mode 100644 packages/block-library/src/cover/icon.js delete mode 100644 packages/block-library/src/file/icon.js create mode 100644 packages/block-library/src/image/icon-customize.native.js delete mode 100644 packages/block-library/src/latest-comments/icon.js delete mode 100644 packages/block-library/src/legacy-widget/icon.js delete mode 100644 packages/block-library/src/list/icon.js delete mode 100644 packages/block-library/src/media-text/icon.js create mode 100644 packages/block-library/src/navigation-link/icons.js delete mode 100644 packages/block-library/src/nextpage/icon.js delete mode 100644 packages/block-library/src/paragraph/icon.js delete mode 100644 packages/block-library/src/preformatted/icon.js delete mode 100644 packages/block-library/src/pullquote/icon.js delete mode 100644 packages/block-library/src/quote/icon.js delete mode 100644 packages/block-library/src/separator/icon.js delete mode 100644 packages/block-library/src/shortcode/icon.js delete mode 100644 packages/block-library/src/spacer/icon.js delete mode 100644 packages/block-library/src/subhead/icon.js delete mode 100644 packages/block-library/src/table/icon.js delete mode 100644 packages/block-library/src/verse/icon.js delete mode 100644 packages/block-library/src/video/icon.js create mode 100644 packages/components/src/angle-picker/index.js create mode 100644 packages/components/src/angle-picker/stories/index.js create mode 100644 packages/components/src/angle-picker/style.scss create mode 100644 packages/components/src/mobile/modal-header-bar/button.android.scss create mode 100644 packages/components/src/mobile/modal-header-bar/button.ios.scss create mode 100644 packages/components/src/mobile/modal-header-bar/button.native.js create mode 100644 packages/components/src/mobile/modal-header-bar/button.native.scss create mode 100644 packages/components/src/mobile/modal-header-bar/close-icon.js create mode 100644 packages/components/src/placeholder/stories/index.js create mode 100644 packages/compose/src/hooks/use-dragging/README.md create mode 100644 packages/compose/src/hooks/use-dragging/index.js create mode 100644 packages/create-block/.npmrc create mode 100644 packages/create-block/CHANGELOG.md create mode 100644 packages/create-block/README.md create mode 100755 packages/create-block/index.js create mode 100644 packages/create-block/lib/cli-error.js create mode 100644 packages/create-block/lib/index.js create mode 100644 packages/create-block/lib/init-wp-scripts.js create mode 100644 packages/create-block/lib/log.js create mode 100644 packages/create-block/lib/prompts.js create mode 100644 packages/create-block/lib/scaffold.js create mode 100644 packages/create-block/lib/templates.js create mode 100644 packages/create-block/lib/templates/es5/$slug.php.mustache create mode 100644 packages/create-block/lib/templates/es5/.editorconfig.mustache create mode 100644 packages/create-block/lib/templates/es5/editor.css.mustache create mode 100644 packages/create-block/lib/templates/es5/index.js.mustache create mode 100644 packages/create-block/lib/templates/es5/style.css.mustache create mode 100644 packages/create-block/lib/templates/esnext/$slug.php.mustache create mode 100644 packages/create-block/lib/templates/esnext/.editorconfig.mustache create mode 100644 packages/create-block/lib/templates/esnext/.gitignore.mustache create mode 100644 packages/create-block/lib/templates/esnext/editor.css.mustache create mode 100644 packages/create-block/lib/templates/esnext/src/index.js.mustache create mode 100644 packages/create-block/lib/templates/esnext/style.css.mustache create mode 100644 packages/create-block/package.json create mode 100644 packages/e2e-tests/specs/editor/plugins/custom-post-types.test.js create mode 100644 packages/editor/src/components/local-autosave-monitor/README.md create mode 100644 packages/env/CHANGELOG.md create mode 100644 packages/eslint-plugin/configs/recommended-with-formatting.js create mode 100644 packages/icons/.npmrc create mode 100644 packages/icons/CHANGELOG.md create mode 100644 packages/icons/README.md create mode 100644 packages/icons/package.json create mode 100644 packages/icons/src/icon/index.js create mode 100644 packages/icons/src/icon/stories/index.js create mode 100644 packages/icons/src/index.js create mode 100644 packages/icons/src/library/align-center.js rename packages/{block-library/src/post-content/icon.js => icons/src/library/align-justify.js} (62%) create mode 100644 packages/icons/src/library/align-left.js create mode 100644 packages/icons/src/library/align-right.js create mode 100644 packages/icons/src/library/archive.js create mode 100644 packages/icons/src/library/audio.js create mode 100644 packages/icons/src/library/button.js create mode 100644 packages/icons/src/library/calendar.js create mode 100644 packages/icons/src/library/category.js create mode 100644 packages/icons/src/library/check.js create mode 100644 packages/icons/src/library/chevron-down.js create mode 100644 packages/icons/src/library/chevron-up.js create mode 100644 packages/icons/src/library/classic.js create mode 100644 packages/icons/src/library/code.js create mode 100644 packages/icons/src/library/column.js create mode 100644 packages/icons/src/library/columns.js create mode 100644 packages/icons/src/library/comment.js create mode 100644 packages/icons/src/library/cover.js create mode 100644 packages/icons/src/library/file.js create mode 100644 packages/icons/src/library/gallery.js create mode 100644 packages/icons/src/library/group.js create mode 100644 packages/icons/src/library/heading.js create mode 100644 packages/icons/src/library/html.js create mode 100644 packages/icons/src/library/image.js create mode 100644 packages/icons/src/library/list.js rename packages/{block-library/src/site-title/icon.js => icons/src/library/map-marker.js} (72%) create mode 100644 packages/icons/src/library/media-and-text.js create mode 100644 packages/icons/src/library/menu.js create mode 100644 packages/icons/src/library/more.js create mode 100644 packages/icons/src/library/navigation.js create mode 100644 packages/icons/src/library/page-break.js create mode 100644 packages/icons/src/library/paragraph.js create mode 100644 packages/icons/src/library/plus-circle.js create mode 100644 packages/icons/src/library/position-center.js create mode 100644 packages/icons/src/library/position-left.js create mode 100644 packages/icons/src/library/position-right.js create mode 100644 packages/icons/src/library/post-list.js create mode 100644 packages/icons/src/library/preformatted.js create mode 100644 packages/icons/src/library/pullquote.js create mode 100644 packages/icons/src/library/quote.js create mode 100644 packages/icons/src/library/resize-corner-n-e.js create mode 100644 packages/icons/src/library/rss.js create mode 100644 packages/icons/src/library/search.js create mode 100644 packages/icons/src/library/separator.js create mode 100644 packages/icons/src/library/shortcode.js create mode 100644 packages/icons/src/library/stretch-full-width.js create mode 100644 packages/icons/src/library/stretch-wide.js create mode 100644 packages/icons/src/library/table.js create mode 100644 packages/icons/src/library/tag.js rename packages/{block-library/src/post-title/icon.js => icons/src/library/title.js} (57%) create mode 100644 packages/icons/src/library/trash.js create mode 100644 packages/icons/src/library/verse.js create mode 100644 packages/icons/src/library/video.js create mode 100644 packages/icons/src/library/widget.js create mode 100644 packages/primitives/.npmrc create mode 100644 packages/primitives/CHANGELOG.md create mode 100644 packages/primitives/README.md create mode 100644 packages/primitives/package.json rename packages/{components/src/primitives => primitives/src}/block-quotation/README.md (100%) rename packages/{components/src/primitives => primitives/src}/block-quotation/index.js (100%) rename packages/{components/src/primitives => primitives/src}/block-quotation/index.native.js (78%) rename packages/{components/src/primitives => primitives/src}/block-quotation/style.native.scss (100%) rename packages/{components/src/primitives => primitives/src}/horizontal-rule/README.md (100%) rename packages/{components/src/primitives => primitives/src}/horizontal-rule/index.js (100%) rename packages/{components/src/primitives => primitives/src}/horizontal-rule/index.native.js (77%) rename packages/{components/src/primitives => primitives/src}/index.js (100%) rename packages/{components/src/primitives => primitives/src}/svg/README.md (100%) rename packages/{components/src/primitives => primitives/src}/svg/index.js (90%) rename packages/{components/src/primitives => primitives/src}/svg/index.native.js (55%) rename packages/{components/src/primitives => primitives/src}/svg/style.native.scss (100%) create mode 100644 packages/scripts/config/.markdownlint.json create mode 100644 packages/scripts/config/.prettierrc.js create mode 100644 packages/scripts/scripts/format-js.js create mode 100644 packages/scripts/scripts/lint-md-docs.js rename packages/scripts/scripts/{lint-md.js => lint-md-js.js} (70%) diff --git a/.eslintignore b/.eslintignore index aab87ed140ccd..08e37e82948a3 100644 --- a/.eslintignore +++ b/.eslintignore @@ -7,5 +7,4 @@ packages/e2e-tests/plugins playground/dist vendor wordpress - -!.eslintrc.js +!.*.js diff --git a/.eslintrc.js b/.eslintrc.js index c6404f79817f4..9f7da03674a7d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -14,7 +14,8 @@ const { version } = require( './package' ); * * @type {string} */ -const majorMinorRegExp = escapeRegExp( version.replace( /\.\d+$/, '' ) ) + '(\\.\\d+)?'; +const majorMinorRegExp = + escapeRegExp( version.replace( /\.\d+$/, '' ) ) + '(\\.\\d+)?'; /** * The list of patterns matching files used only for development purposes. @@ -33,9 +34,7 @@ module.exports = { 'plugin:@wordpress/eslint-plugin/recommended', 'plugin:eslint-comments/recommended', ], - plugins: [ - 'import', - ], + plugins: [ 'import' ], globals: { wp: 'off', }, @@ -49,63 +48,88 @@ module.exports = { // we'll get a `SyntaxError` (Invalid regular expression: \ at end of pattern) // here. That's why we use \\u002F in the regexes below. { - selector: 'ImportDeclaration[source.value=/^@wordpress\\u002F.+\\u002F/]', - message: 'Path access on WordPress dependencies is not allowed.', + selector: + 'ImportDeclaration[source.value=/^@wordpress\\u002F.+\\u002F/]', + message: + 'Path access on WordPress dependencies is not allowed.', }, { - selector: 'ImportDeclaration[source.value=/^react-spring(?!\\u002Fweb\.cjs)/]', - message: 'The react-spring dependency must specify CommonJS bundle: react-spring/web.cjs', + selector: + 'ImportDeclaration[source.value=/^react-spring(?!\\u002Fweb.cjs)/]', + message: + 'The react-spring dependency must specify CommonJS bundle: react-spring/web.cjs', }, { - selector: 'CallExpression[callee.name="deprecated"] Property[key.name="version"][value.value=/' + majorMinorRegExp + '/]', - message: 'Deprecated functions must be removed before releasing this version.', + selector: + 'CallExpression[callee.name="deprecated"] Property[key.name="version"][value.value=/' + + majorMinorRegExp + + '/]', + message: + 'Deprecated functions must be removed before releasing this version.', }, { - selector: 'CallExpression[callee.name=/^(__|_n|_nx|_x)$/]:not([arguments.0.type=/^Literal|BinaryExpression$/])', - message: 'Translate function arguments must be string literals.', + selector: + 'CallExpression[callee.name=/^(__|_n|_nx|_x)$/]:not([arguments.0.type=/^Literal|BinaryExpression$/])', + message: + 'Translate function arguments must be string literals.', }, { - selector: 'CallExpression[callee.name=/^(_n|_nx|_x)$/]:not([arguments.1.type=/^Literal|BinaryExpression$/])', - message: 'Translate function arguments must be string literals.', + selector: + 'CallExpression[callee.name=/^(_n|_nx|_x)$/]:not([arguments.1.type=/^Literal|BinaryExpression$/])', + message: + 'Translate function arguments must be string literals.', }, { - selector: 'CallExpression[callee.name=_nx]:not([arguments.3.type=/^Literal|BinaryExpression$/])', - message: 'Translate function arguments must be string literals.', + selector: + 'CallExpression[callee.name=_nx]:not([arguments.3.type=/^Literal|BinaryExpression$/])', + message: + 'Translate function arguments must be string literals.', }, { - selector: 'CallExpression[callee.name=/^(__|_x|_n|_nx)$/] Literal[value=/\\.{3}/]', + selector: + 'CallExpression[callee.name=/^(__|_x|_n|_nx)$/] Literal[value=/\\.{3}/]', message: 'Use ellipsis character (…) in place of three dots', }, { - selector: 'ImportDeclaration[source.value="redux"] Identifier.imported[name="combineReducers"]', + selector: + 'ImportDeclaration[source.value="redux"] Identifier.imported[name="combineReducers"]', message: 'Use `combineReducers` from `@wordpress/data`', }, { - selector: 'ImportDeclaration[source.value="lodash"] Identifier.imported[name="memoize"]', + selector: + 'ImportDeclaration[source.value="lodash"] Identifier.imported[name="memoize"]', message: 'Use memize instead of Lodash’s memoize', }, { - selector: 'CallExpression[callee.object.name="page"][callee.property.name="waitFor"]', + selector: + 'CallExpression[callee.object.name="page"][callee.property.name="waitFor"]', message: 'Prefer page.waitForSelector instead.', }, { selector: 'JSXAttribute[name.name="id"][value.type="Literal"]', - message: 'Do not use string literals for IDs; use withInstanceId instead.', + message: + 'Do not use string literals for IDs; use withInstanceId instead.', }, { // Discourage the usage of `Math.random()` as it's a code smell // for UUID generation, for which we already have a higher-order // component: `withInstanceId`. - selector: 'CallExpression[callee.object.name="Math"][callee.property.name="random"]', - message: 'Do not use Math.random() to generate unique IDs; use withInstanceId instead. (If you’re not generating unique IDs: ignore this message.)', + selector: + 'CallExpression[callee.object.name="Math"][callee.property.name="random"]', + message: + 'Do not use Math.random() to generate unique IDs; use withInstanceId instead. (If you’re not generating unique IDs: ignore this message.)', }, { - selector: 'CallExpression[callee.name="withDispatch"] > :function > BlockStatement > :not(VariableDeclaration,ReturnStatement)', - message: 'withDispatch must return an object with consistent keys. Avoid performing logic in `mapDispatchToProps`.', + selector: + 'CallExpression[callee.name="withDispatch"] > :function > BlockStatement > :not(VariableDeclaration,ReturnStatement)', + message: + 'withDispatch must return an object with consistent keys. Avoid performing logic in `mapDispatchToProps`.', }, { - selector: 'LogicalExpression[operator="&&"][left.property.name="length"][right.type="JSXElement"]', - message: 'Avoid truthy checks on length property rendering, as zero length is rendered verbatim.', + selector: + 'LogicalExpression[operator="&&"][left.property.name="length"][right.type="JSXElement"]', + message: + 'Avoid truthy checks on length property rendering, as zero length is rendered verbatim.', }, ], }, @@ -127,37 +151,34 @@ module.exports = { ...developmentFiles, ], rules: { - 'react/forbid-elements': [ 'error', { - forbid: [ - [ 'button', 'Button' ], - [ 'circle', 'Circle' ], - [ 'g', 'G' ], - [ 'path', 'Path' ], - [ 'polygon', 'Polygon' ], - [ 'rect', 'Rect' ], - [ 'svg', 'SVG' ], - ].map( ( [ element, componentName ] ) => { - return { - element, - message: `use cross-platform <${ componentName } /> component instead.`, - }; - } ), - } ], + 'react/forbid-elements': [ + 'error', + { + forbid: [ + [ 'button', 'Button' ], + [ 'circle', 'Circle' ], + [ 'g', 'G' ], + [ 'path', 'Path' ], + [ 'polygon', 'Polygon' ], + [ 'rect', 'Rect' ], + [ 'svg', 'SVG' ], + ].map( ( [ element, componentName ] ) => { + return { + element, + message: `use cross-platform <${ componentName } /> component instead.`, + }; + } ), + }, + ], }, }, { - files: [ - 'packages/jest*/**/*.js', - ], - extends: [ - 'plugin:@wordpress/eslint-plugin/test-unit', - ], + files: [ 'packages/jest*/**/*.js' ], + extends: [ 'plugin:@wordpress/eslint-plugin/test-unit' ], }, { files: [ 'packages/e2e-test*/**/*.js' ], - extends: [ - 'plugin:@wordpress/eslint-plugin/test-e2e', - ], + extends: [ 'plugin:@wordpress/eslint-plugin/test-e2e' ], }, ], }; diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 18eefabaa0504..ce120ddf0aad5 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -11,6 +11,7 @@ # Blocks /packages/block-library @Soean @ajitbohra @jorgefilipecosta @talldan +/packages/block-library/src/gallery @mkevins @pinarol /packages/block-library/src/social-links @mkaz /packages/block-library/src/social-link @mkaz @@ -37,6 +38,7 @@ /packages/babel-plugin-makepot @ntwb @nerrad @ajitbohra /packages/babel-preset-default @youknowriad @gziolo @ntwb @nerrad @ajitbohra /packages/browserslist-config @gziolo @ntwb @nerrad @ajitbohra +/packages/create-block @gziolo /packages/custom-templated-path-webpack-plugin @ntwb @nerrad @ajitbohra /packages/docgen @nosolosw /packages/e2e-test-utils @gziolo @ntwb @nerrad @ajitbohra diff --git a/.github/workflows/pull-request-automation.yml b/.github/workflows/pull-request-automation.yml index 10277d5a3b45e..e2e13339bae4f 100644 --- a/.github/workflows/pull-request-automation.yml +++ b/.github/workflows/pull-request-automation.yml @@ -1,11 +1,17 @@ -on: pull_request +on: + pull_request: + types: [opened, closed] name: Pull request automation jobs: pull-request-automation: runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + # Checkout defaults to using the branch which triggered the event, which + # isn't necessarily `master` (e.g. in the case of a merge). + - uses: actions/checkout@v2 + with: + ref: master # Changing into the action's directory and running `npm install` is much # faster than a full project-wide `npm ci`. - run: cd packages/project-management-automation && npm install diff --git a/.markdownlintignore b/.markdownlintignore new file mode 100644 index 0000000000000..8ea95a227e974 --- /dev/null +++ b/.markdownlintignore @@ -0,0 +1,9 @@ +bin +build +node_modules +phpunit +playground +storybook +test +vendor +wordpress diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000000000..0605f83bf9078 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,3 @@ +// Import the default config file and expose it in the project root. +// Useful for editor integrations. +module.exports = require( '@wordpress/scripts/config/.prettierrc.js' ); diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8ec7046c01f84..bb46ac5f3a238 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,38 +1,24 @@ -# Contributing +# Contributing Guidelines -Thank you for thinking about contributing to WordPress' Gutenberg project! If you're unsure of anything, know that you're 💯 welcome to submit an issue or pull request on any topic. The worst that can happen is that you'll be politely directed to the best location to ask your question or to change something in your pull request. We appreciate any sort of contribution and don't want a wall of rules to get in the way of that. +Welcome to WordPress' Gutenberg project! We hope you join us in creating the future platform for publishing; all are welcome here. -As with all WordPress projects, we want to ensure a welcoming environment for everyone. With that in mind, all contributors are expected to follow our [Code of Conduct](/CODE_OF_CONDUCT.md). +## How can I contribute? -Before contributing, we encourage you to review the [Contributor Handbook](https://developer.wordpress.org/block-editor/contributors/). If you have any questions, please ask, either in Slack or open an issue in GitHub so we can help clarify. +To learn all about contributing to the Gutenberg project, see the [Contributor Guide](/docs/contributors/readme.md). The handbook includes all the details you need to get setup and start shaping the future of web publishing. -All WordPress projects are [licensed under the GPLv2+](/LICENSE.md), and all contributions to Gutenberg will be released under the GPLv2+ license. You maintain copyright over any contribution you make, and by submitting a pull request, you are agreeing to release that contribution under the GPLv2+ license. +- Code? See the [developer section](/docs/contributors/develop.md). -This document covers the technical details around setup, and submitting your contribution to the Gutenberg project. +- Design? See the [design section](/docs/contributors/design.md). -## Developer Contributions +- Documentation? See the [documentation section](/docs/contributors/document.md). -Please see the [Developer Contributions section](/docs/contributors/develop.md) of the Contributor Handbook. +- 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). -## How Can Designers Contribute? +## Guidelines -If you'd like to contribute to the design or front-end, feel free to contribute to tickets labelled [Needs Design](https://github.com/WordPress/gutenberg/issues?q=is%3Aissue+is%3Aopen+label%3A%22Needs+Design%22) or [Needs Design Feedback](https://github.com/WordPress/gutenberg/issues?q=is%3Aissue+is%3Aopen+label%3A"Needs+Design+Feedback%22). We could use your thoughtful replies, mockups, animatics, sketches, doodles. Proposed changes are best done as minimal and specific iterations on the work that precedes it so we can compare. The [WordPress Design team](http://make.wordpress.org/design/) uses [Figma](https://www.figma.com/) to collaborate and share work. If you'd like to contribute, join the [#design channel](http://wordpress.slack.com/messages/design/) in [Slack](https://make.wordpress.org/chat/) and ask the team to set you up with a free Figma account. This will give you access to a helpful [library of components](https://www.figma.com/file/ZtN5xslEVYgzU7Dd5CxgGZwq/WordPress-Components?node-id=0%3A1) used in WordPress. +- As with all WordPress projects, we want to ensure a welcoming environment for everyone. With that in mind, all contributors are expected to follow our [Code of Conduct](/CODE_OF_CONDUCT.md). -## Triage Contributions - -*Triage* is the practice of reviewing existing issues to make sure they’re relevant, actionable, and have all the information needed to reproduce and/or solve the issue. Triaging is a very important contribution because it allows the community to focus on and prioritise issues, feature proposals, discussions, and so on. - -If you want to learn more about triage, and why it it important, please see the [repository management section](docs/contributors/repository-management.md#triaging-issues) of the Contributor Handbook. - -## Contribute to the Documentation - -Please see the [Documentation section](/docs/contributors/document.md) of the Contributor Handbook. - -Documentation is automatically synced from `master` to the [Block Editor Handbook](https://developer.wordpress.org/block-editor/) every 15 minutes. - -### `@wordpress/component` - -If you're contributing to the documentation of any component from the `@wordpress/component` package, take a look at its [guidelines for contributing](/packages/components/CONTRIBUTING.md). +- All WordPress projects are [licensed under the GPLv2+](/LICENSE.md), and all contributions to Gutenberg will be released under the GPLv2+ license. You maintain copyright over any contribution you make, and by submitting a pull request, you are agreeing to release that contribution under the GPLv2+ license. ## Reporting Security Issues diff --git a/babel.config.js b/babel.config.js index 83d78a0eeadb6..f950b6603a512 100644 --- a/babel.config.js +++ b/babel.config.js @@ -3,9 +3,6 @@ module.exports = function( api ) { return { presets: [ '@wordpress/babel-preset-default' ], - plugins: [ - 'babel-plugin-emotion', - 'babel-plugin-inline-json-import', - ], + plugins: [ 'babel-plugin-emotion', 'babel-plugin-inline-json-import' ], }; }; diff --git a/bin/api-docs/are-readmes-unstaged.js b/bin/api-docs/are-readmes-unstaged.js index 19c7eeba8d162..c466d55bfb2e0 100644 --- a/bin/api-docs/are-readmes-unstaged.js +++ b/bin/api-docs/are-readmes-unstaged.js @@ -12,17 +12,26 @@ const execSync = require( 'child_process' ).execSync; */ const getPackages = require( './packages' ); -const getUnstagedFiles = () => execSync( 'git diff --name-only', { encoding: 'utf8' } ).split( '\n' ).filter( ( element ) => '' !== element ); -const readmeFiles = getPackages().map( ( [ packageName ] ) => join( 'packages', packageName, 'README.md' ) ); -const unstagedReadmes = getUnstagedFiles().filter( ( element ) => readmeFiles.includes( element ) ); +const getUnstagedFiles = () => + execSync( 'git diff --name-only', { encoding: 'utf8' } ) + .split( '\n' ) + .filter( ( element ) => '' !== element ); +const readmeFiles = getPackages().map( ( [ packageName ] ) => + join( 'packages', packageName, 'README.md' ) +); +const unstagedReadmes = getUnstagedFiles().filter( ( element ) => + readmeFiles.includes( element ) +); if ( unstagedReadmes.length > 0 ) { process.exitCode = 1; - process.stdout.write( chalk.red( - '\n', - 'Some API docs may be out of date:', - unstagedReadmes.toString(), - 'Either stage them or continue with --no-verify.', - '\n' - ) ); + process.stdout.write( + chalk.red( + '\n', + 'Some API docs may be out of date:', + unstagedReadmes.toString(), + 'Either stage them or continue with --no-verify.', + '\n' + ) + ); } diff --git a/bin/api-docs/packages.js b/bin/api-docs/packages.js index dcc583fe65d0e..71c2bed2bb14b 100644 --- a/bin/api-docs/packages.js +++ b/bin/api-docs/packages.js @@ -7,10 +7,13 @@ const packages = [ 'block-serialization-default-parser', 'blocks', 'compose', - [ 'core-data', { - 'Autogenerated actions': 'src/actions.js', - 'Autogenerated selectors': 'src/selectors.js', - } ], + [ + 'core-data', + { + 'Autogenerated actions': 'src/actions.js', + 'Autogenerated selectors': 'src/selectors.js', + }, + ], 'data', 'data-controls', 'date', diff --git a/bin/api-docs/update-readmes.js b/bin/api-docs/update-readmes.js index fd66e6cbf39d0..ab1805c3fdecc 100755 --- a/bin/api-docs/update-readmes.js +++ b/bin/api-docs/update-readmes.js @@ -16,7 +16,14 @@ getPackages().forEach( ( entry ) => { // Each target operates over the same file, so it needs to be processed synchronously, // as to make sure the processes don't overwrite each other. const { status, stderr } = spawnSync( - join( __dirname, '..', '..', 'node_modules', '.bin', 'docgen' ).replace( / /g, '\\ ' ), + join( + __dirname, + '..', + '..', + 'node_modules', + '.bin', + 'docgen' + ).replace( / /g, '\\ ' ), [ join( 'packages', packageName, path ), `--output packages/${ packageName }/README.md`, @@ -24,7 +31,7 @@ getPackages().forEach( ( entry ) => { `--use-token "${ token }"`, '--ignore "/unstable|experimental/i"', ], - { shell: true }, + { shell: true } ); if ( status !== 0 ) { diff --git a/bin/build-plugin-zip.sh b/bin/build-plugin-zip.sh index 3a3a7ff9c9326..d68c58f0c9edb 100755 --- a/bin/build-plugin-zip.sh +++ b/bin/build-plugin-zip.sh @@ -109,7 +109,7 @@ npm run build php bin/generate-gutenberg-php.php > gutenberg.tmp.php mv gutenberg.tmp.php gutenberg.php -build_files=$(ls build/*/*.{js,css,asset.php} build/block-library/blocks/*.php) +build_files=$(ls build/*/*.{js,css,asset.php} build/block-library/blocks/*.php build/block-library/blocks/*/block.json) # Generate the plugin zip file. status "Creating archive... 🎁" diff --git a/bin/commander.js b/bin/commander.js index 6aee722ae206c..788019da2148b 100755 --- a/bin/commander.js +++ b/bin/commander.js @@ -9,6 +9,8 @@ const inquirer = require( 'inquirer' ); const semver = require( 'semver' ); const chalk = require( 'chalk' ); const fs = require( 'fs' ); +const glob = require( 'fast-glob' ); +const readline = require( 'readline' ); const rimraf = require( 'rimraf' ); const SimpleGit = require( 'simple-git/promise' ); const childProcess = require( 'child_process' ); @@ -20,6 +22,8 @@ const uuid = require( 'uuid/v4' ); const gitRepoOwner = 'WordPress'; const gitRepoURL = 'https://github.com/' + gitRepoOwner + '/gutenberg.git'; const svnRepoURL = 'https://plugins.svn.wordpress.org/gutenberg'; +const releasePageURLPrefix = + 'https://github.com/WordPress/gutenberg/releases/tag/'; // Working Directories const gitWorkingDirectoryPath = path.join( os.tmpdir(), uuid() ); @@ -51,13 +55,19 @@ function readJSONFile( fileName ) { * @param {boolean} isDefault Default reply. * @param {string} abortMessage Abort message. */ -async function askForConfirmationToContinue( message, isDefault = true, abortMessage = 'Aborting.' ) { - const { isReady } = await inquirer.prompt( [ { - type: 'confirm', - name: 'isReady', - default: isDefault, - message, - } ] ); +async function askForConfirmationToContinue( + message, + isDefault = true, + abortMessage = 'Aborting.' +) { + const { isReady } = await inquirer.prompt( [ + { + type: 'confirm', + name: 'isReady', + default: isDefault, + message, + }, + ] ); if ( ! isReady ) { console.log( error( '\n' + abortMessage ) ); @@ -77,7 +87,11 @@ async function runStep( name, abortMessage, handler ) { await handler(); } catch ( exception ) { console.log( - error( 'The following error happened during the "' + warning( name ) + '" step:' ) + '\n\n', + error( + 'The following error happened during the "' + + warning( name ) + + '" step:' + ) + '\n\n', exception, error( '\n\n' + abortMessage ) ); @@ -117,7 +131,10 @@ async function runGitRepositoryCloneStep( abortMessage ) { console.log( '>> Cloning the Git repository' ); const simpleGit = SimpleGit(); await simpleGit.clone( gitRepoURL, gitWorkingDirectoryPath ); - console.log( '>> The Gutenberg Git repository has been successfully cloned in the following temporary folder: ' + success( gitWorkingDirectoryPath ) ); + console.log( + '>> The Gutenberg Git repository has been successfully cloned in the following temporary folder: ' + + success( gitWorkingDirectoryPath ) + ); } ); } @@ -130,8 +147,13 @@ async function runSvnRepositoryCloneStep( abortMessage ) { // Cloning the repository await runStep( 'Fetching the SVN repository', abortMessage, async () => { console.log( '>> Fetching the SVN repository' ); - runShellScript( 'svn checkout ' + svnRepoURL + '/trunk ' + svnWorkingDirectoryPath ); - console.log( '>> The Gutenberg SVN repository has been successfully fetched in the following temporary folder: ' + success( svnWorkingDirectoryPath ) ); + runShellScript( + 'svn checkout ' + svnRepoURL + '/trunk ' + svnWorkingDirectoryPath + ); + console.log( + '>> The Gutenberg SVN repository has been successfully fetched in the following temporary folder: ' + + success( svnWorkingDirectoryPath ) + ); } ); } @@ -150,14 +172,21 @@ async function runUpdateTrunkContentStep( version, changelog, abortMessage ) { const readmePath = svnWorkingDirectoryPath + '/readme.txt'; const previousReadmeFileContent = fs.readFileSync( readmePath, 'utf8' ); - const stableTag = previousReadmeFileContent.match( STABLE_TAG_REGEX )[ 0 ]; + const stableTag = previousReadmeFileContent.match( + STABLE_TAG_REGEX + )[ 0 ]; // Delete everything - runShellScript( 'find . -maxdepth 1 -not -name ".svn" -not -name "." -not -name ".." -exec rm -rf {} +', svnWorkingDirectoryPath ); + runShellScript( + 'find . -maxdepth 1 -not -name ".svn" -not -name "." -not -name ".." -exec rm -rf {} +', + svnWorkingDirectoryPath + ); // Update the content using the plugin ZIP const gutenbergZipPath = gitWorkingDirectoryPath + '/gutenberg.zip'; - runShellScript( 'unzip ' + gutenbergZipPath + ' -d ' + svnWorkingDirectoryPath ); + runShellScript( + 'unzip ' + gutenbergZipPath + ' -d ' + svnWorkingDirectoryPath + ); // Replace the stable tag placeholder with the existing stable tag on the SVN repository. const newReadmeFileContent = fs.readFileSync( readmePath, 'utf8' ); @@ -167,15 +196,24 @@ async function runUpdateTrunkContentStep( version, changelog, abortMessage ) { ); // Commit the content changes - runShellScript( "svn st | grep '^\?' | awk '{print $2}' | xargs svn add", svnWorkingDirectoryPath ); - runShellScript( "svn st | grep '^!' | awk '{print $2}' | xargs svn rm", svnWorkingDirectoryPath ); + runShellScript( + "svn st | grep '^?' | awk '{print $2}' | xargs svn add", + svnWorkingDirectoryPath + ); + runShellScript( + "svn st | grep '^!' | awk '{print $2}' | xargs svn rm", + svnWorkingDirectoryPath + ); await askForConfirmationToContinue( 'Trunk content has been updated, please check the SVN diff. Commit the changes?', true, abortMessage ); - runShellScript( 'svn commit -m "Committing Gutenberg version ' + version + '"', svnWorkingDirectoryPath ); + runShellScript( + 'svn commit -m "Committing Gutenberg version ' + version + '"', + svnWorkingDirectoryPath + ); console.log( '>> Trunk has been successfully updated' ); } ); @@ -194,9 +232,23 @@ async function runSvnTagStep( version, abortMessage ) { true, abortMessage ); - runShellScript( 'svn cp ' + svnRepoURL + '/trunk ' + svnRepoURL + '/tags/' + version + ' -m "Tagging Gutenberg version ' + version + '"' ); + runShellScript( + 'svn cp ' + + svnRepoURL + + '/trunk ' + + svnRepoURL + + '/tags/' + + version + + ' -m "Tagging Gutenberg version ' + + version + + '"' + ); - console.log( '>> The SVN ' + success( version ) + ' tag has been successfully created' ); + console.log( + '>> The SVN ' + + success( version ) + + ' tag has been successfully created' + ); } ); } @@ -208,26 +260,33 @@ async function runSvnTagStep( version, abortMessage ) { */ async function updateThePluginStableVersion( version, abortMessage ) { // Updating the content of the svn - await runStep( 'Updating the plugin\'s stable version', abortMessage, async () => { - const readmePath = svnWorkingDirectoryPath + '/readme.txt'; - const readmeFileContent = fs.readFileSync( readmePath, 'utf8' ); - const newReadmeContent = readmeFileContent.replace( - STABLE_TAG_REGEX, - 'Stable tag: ' + version + '\n' - ); - fs.writeFileSync( readmePath, newReadmeContent ); - - // Commit the content changes - await askForConfirmationToContinue( - 'The stable version is updated in the readme.txt file. Commit the changes?', - true, - abortMessage - ); - - runShellScript( 'svn commit -m "Releasing Gutenberg version ' + version + '"', svnWorkingDirectoryPath ); - - console.log( '>> Stable version updated successfully' ); - } ); + await runStep( + "Updating the plugin's stable version", + abortMessage, + async () => { + const readmePath = svnWorkingDirectoryPath + '/readme.txt'; + const readmeFileContent = fs.readFileSync( readmePath, 'utf8' ); + const newReadmeContent = readmeFileContent.replace( + STABLE_TAG_REGEX, + 'Stable tag: ' + version + '\n' + ); + fs.writeFileSync( readmePath, newReadmeContent ); + + // Commit the content changes + await askForConfirmationToContinue( + 'The stable version is updated in the readme.txt file. Commit the changes?', + true, + abortMessage + ); + + runShellScript( + 'svn commit -m "Releasing Gutenberg version ' + version + '"', + svnWorkingDirectoryPath + ); + + console.log( '>> Stable version updated successfully' ); + } + ); } /** @@ -237,18 +296,19 @@ async function updateThePluginStableVersion( version, abortMessage ) { */ async function runCleanLocalCloneStep( abortMessage ) { await runStep( 'Cleaning the temporary folder', abortMessage, async () => { - await Promise.all( [ - gitWorkingDirectoryPath, - svnWorkingDirectoryPath, - ].map( async ( directoryPath ) => { - if ( fs.existsSync( directoryPath ) ) { - await rimraf( directoryPath, ( err ) => { - if ( err ) { - throw err; + await Promise.all( + [ gitWorkingDirectoryPath, svnWorkingDirectoryPath ].map( + async ( directoryPath ) => { + if ( fs.existsSync( directoryPath ) ) { + await rimraf( directoryPath, ( err ) => { + if ( err ) { + throw err; + } + } ); } - } ); - } - } ) ); + } + ) + ); } ); } @@ -271,23 +331,41 @@ async function runReleaseBranchCreationStep( abortMessage ) { // Follow the WordPress version guidelines to compute the version to be used // By default, increase the "minor" number but if we reach 9, bump to the next major. if ( parsedVersion.minor === 9 ) { - version = ( parsedVersion.major + 1 ) + '.0.0-rc.1'; + version = parsedVersion.major + 1 + '.0.0-rc.1'; releaseBranch = 'release/' + ( parsedVersion.major + 1 ) + '.0'; - versionLabel = ( parsedVersion.major + 1 ) + '.0.0 RC1'; + versionLabel = parsedVersion.major + 1 + '.0.0 RC1'; } else { - version = parsedVersion.major + '.' + ( parsedVersion.minor + 1 ) + '.0-rc.1'; - releaseBranch = 'release/' + parsedVersion.major + '.' + ( parsedVersion.minor + 1 ); - versionLabel = parsedVersion.major + '.' + ( parsedVersion.minor + 1 ) + '.0 RC1'; + version = + parsedVersion.major + + '.' + + ( parsedVersion.minor + 1 ) + + '.0-rc.1'; + releaseBranch = + 'release/' + + parsedVersion.major + + '.' + + ( parsedVersion.minor + 1 ); + versionLabel = + parsedVersion.major + + '.' + + ( parsedVersion.minor + 1 ) + + '.0 RC1'; } await askForConfirmationToContinue( - 'The Plugin version to be used is ' + success( version ) + '. Proceed with the creation of the release branch?', + 'The Plugin version to be used is ' + + success( version ) + + '. Proceed with the creation of the release branch?', true, abortMessage ); // Creating the release branch await simpleGit.checkoutLocalBranch( releaseBranch ); - console.log( '>> The local release branch ' + success( releaseBranch ) + ' has been successfully created.' ); + console.log( + '>> The local release branch ' + + success( releaseBranch ) + + ' has been successfully created.' + ); } ); return { @@ -309,7 +387,9 @@ const findReleaseBranchName = ( packageJsonPath ) => { const masterPackageJson = readJSONFile( packageJsonPath ); const masterParsedVersion = semver.parse( masterPackageJson.version ); - return 'release/' + masterParsedVersion.major + '.' + masterParsedVersion.minor; + return ( + 'release/' + masterParsedVersion.major + '.' + masterParsedVersion.minor + ); }; /** @@ -321,30 +401,55 @@ const findReleaseBranchName = ( packageJsonPath ) => { */ async function runReleaseBranchCheckoutStep( abortMessage ) { let releaseBranch, version; - await runStep( 'Getting into the release branch', abortMessage, async () => { - const simpleGit = SimpleGit( gitWorkingDirectoryPath ); - const packageJsonPath = gitWorkingDirectoryPath + '/package.json'; - releaseBranch = findReleaseBranchName( packageJsonPath ); - - // Creating the release branch - await simpleGit.checkout( releaseBranch ); - console.log( '>> The local release branch ' + success( releaseBranch ) + ' has been successfully checked out.' ); - - const releaseBranchPackageJson = readJSONFile( packageJsonPath ); - const releaseBranchParsedVersion = semver.parse( releaseBranchPackageJson.version ); + await runStep( + 'Getting into the release branch', + abortMessage, + async () => { + const simpleGit = SimpleGit( gitWorkingDirectoryPath ); + const packageJsonPath = gitWorkingDirectoryPath + '/package.json'; + releaseBranch = findReleaseBranchName( packageJsonPath ); + + // Creating the release branch + await simpleGit.checkout( releaseBranch ); + console.log( + '>> The local release branch ' + + success( releaseBranch ) + + ' has been successfully checked out.' + ); + + const releaseBranchPackageJson = readJSONFile( packageJsonPath ); + const releaseBranchParsedVersion = semver.parse( + releaseBranchPackageJson.version + ); + + if ( + releaseBranchParsedVersion.prerelease && + releaseBranchParsedVersion.prerelease.length + ) { + version = + releaseBranchParsedVersion.major + + '.' + + releaseBranchParsedVersion.minor + + '.' + + releaseBranchParsedVersion.patch; + } else { + version = + releaseBranchParsedVersion.major + + '.' + + releaseBranchParsedVersion.minor + + '.' + + ( releaseBranchParsedVersion.patch + 1 ); + } - if ( releaseBranchParsedVersion.prerelease && releaseBranchParsedVersion.prerelease.length ) { - version = releaseBranchParsedVersion.major + '.' + releaseBranchParsedVersion.minor + '.' + releaseBranchParsedVersion.patch; - } else { - version = releaseBranchParsedVersion.major + '.' + releaseBranchParsedVersion.minor + '.' + ( releaseBranchParsedVersion.patch + 1 ); + await askForConfirmationToContinue( + 'The Version to release is ' + + success( version ) + + '. Proceed?', + true, + abortMessage + ); } - - await askForConfirmationToContinue( - 'The Version to release is ' + success( version ) + '. Proceed?', - true, - abortMessage - ); - } ); + ); return { version, @@ -363,7 +468,11 @@ async function runReleaseBranchCheckoutStep( abortMessage ) { * * @return {string} hash of the version bump commit. */ -async function runBumpPluginVersionAndCommitStep( version, changelog, abortMessage ) { +async function runBumpPluginVersionAndCommitStep( + version, + changelog, + abortMessage +) { let commitHash; await runStep( 'Updating the plugin version', abortMessage, async () => { const simpleGit = SimpleGit( gitWorkingDirectoryPath ); @@ -376,23 +485,39 @@ async function runBumpPluginVersionAndCommitStep( version, changelog, abortMessa ...packageJson, version, }; - fs.writeFileSync( packageJsonPath, JSON.stringify( newPackageJson, null, '\t' ) + '\n' ); + fs.writeFileSync( + packageJsonPath, + JSON.stringify( newPackageJson, null, '\t' ) + '\n' + ); const newPackageLock = { ...packageLock, version, }; - fs.writeFileSync( packageLockPath, JSON.stringify( newPackageLock, null, '\t' ) + '\n' ); + fs.writeFileSync( + packageLockPath, + JSON.stringify( newPackageLock, null, '\t' ) + '\n' + ); const content = fs.readFileSync( pluginFilePath, 'utf8' ); - fs.writeFileSync( pluginFilePath, content.replace( ' * Version: ' + packageJson.version, ' * Version: ' + version ) ); + fs.writeFileSync( + pluginFilePath, + content.replace( + ' * Version: ' + packageJson.version, + ' * Version: ' + version + ) + ); console.log( '>> The plugin version has been updated successfully.' ); // Update the content of the readme.txt file const readmePath = gitWorkingDirectoryPath + '/readme.txt'; const readmeFileContent = fs.readFileSync( readmePath, 'utf8' ); const newReadmeContent = - readmeFileContent.substr( 0, readmeFileContent.indexOf( '== Changelog ==' ) ) + + readmeFileContent.substr( + 0, + readmeFileContent.indexOf( '== Changelog ==' ) + ) + '== Changelog ==\n\n' + - changelog + '\n'; + `To read the changelog for Gutenberg ${ version }, please navigate to the release page.` + + '\n'; fs.writeFileSync( readmePath, newReadmeContent ); // Update the content of the changelog.txt file @@ -401,14 +526,19 @@ async function runBumpPluginVersionAndCommitStep( version, changelog, abortMessa const changelogFileContent = fs.readFileSync( changelogPath, 'utf8' ); const versionHeader = '= ' + version + ' =\n\n'; const regexToSearch = /=\s([0-9]+\.[0-9]+\.[0-9]+)(-rc\.[0-9]+)?\s=\n\n/g; - let lastDifferentVersionMatch = regexToSearch.exec( changelogFileContent ); + let lastDifferentVersionMatch = regexToSearch.exec( + changelogFileContent + ); if ( lastDifferentVersionMatch[ 1 ] === stableVersion ) { - lastDifferentVersionMatch = regexToSearch.exec( changelogFileContent ); + lastDifferentVersionMatch = regexToSearch.exec( + changelogFileContent + ); } const newChangelogContent = '== Changelog ==\n\n' + versionHeader + - changelog + '\n\n' + + changelog + + '\n\n' + changelogFileContent.substr( lastDifferentVersionMatch.index ); fs.writeFileSync( changelogPath, newChangelogContent ); @@ -425,9 +555,13 @@ async function runBumpPluginVersionAndCommitStep( version, changelog, abortMessa readmePath, changelogPath, ] ); - const commitData = await simpleGit.commit( 'Bump plugin version to ' + version ); + const commitData = await simpleGit.commit( + 'Bump plugin version to ' + version + ); commitHash = commitData.commit; - console.log( '>> The plugin version bump has been commited successfully.' ); + console.log( + '>> The plugin version bump has been committed successfully.' + ); } ); return commitHash; @@ -446,9 +580,15 @@ async function runPluginZIPCreationStep( abortMessage ) { true, abortMessage ); - runShellScript( '/bin/bash bin/build-plugin-zip.sh', gitWorkingDirectoryPath ); + runShellScript( + '/bin/bash bin/build-plugin-zip.sh', + gitWorkingDirectoryPath + ); - console.log( '>> The plugin ZIP has been built successfully. Path: ' + success( gutenbergZipPath ) ); + console.log( + '>> The plugin ZIP has been built successfully. Path: ' + + success( gutenbergZipPath ) + ); } ); } @@ -467,7 +607,11 @@ async function runCreateGitTagStep( version, abortMessage ) { abortMessage ); await simpleGit.addTag( 'v' + version ); - console.log( '>> The ' + success( 'v' + version ) + ' tag has been created successfully.' ); + console.log( + '>> The ' + + success( 'v' + version ) + + ' tag has been created successfully.' + ); } ); } @@ -478,16 +622,20 @@ async function runCreateGitTagStep( version, abortMessage ) { * @param {string} abortMessage Abort message. */ async function runPushGitChangesStep( releaseBranch, abortMessage ) { - await runStep( 'Pushing the release branch and the tag', abortMessage, async () => { - const simpleGit = SimpleGit( gitWorkingDirectoryPath ); - await askForConfirmationToContinue( - 'The release branch and the tag are going to be pushed to the remote repository. Continue?', - true, - abortMessage - ); - await simpleGit.push( 'origin', releaseBranch ); - await simpleGit.pushTags( 'origin' ); - } ); + await runStep( + 'Pushing the release branch and the tag', + abortMessage, + async () => { + const simpleGit = SimpleGit( gitWorkingDirectoryPath ); + await askForConfirmationToContinue( + 'The release branch and the tag are going to be pushed to the remote repository. Continue?', + true, + abortMessage + ); + await simpleGit.push( 'origin', releaseBranch ); + await simpleGit.pushTags( 'origin' ); + } + ); } /** @@ -501,7 +649,13 @@ async function runPushGitChangesStep( releaseBranch, abortMessage ) { * * @return {Object} Github release object. */ -async function runGithubReleaseStep( version, versionLabel, changelog, isPrerelease, abortMessage ) { +async function runGithubReleaseStep( + version, + versionLabel, + changelog, + isPrerelease, + abortMessage +) { let octokit; let release; await runStep( 'Creating the GitHub release', abortMessage, async () => { @@ -511,11 +665,18 @@ async function runGithubReleaseStep( version, versionLabel, changelog, isPrerele abortMessage ); - const { token } = await inquirer.prompt( [ { - type: 'input', - name: 'token', - message: 'Please provide a GitHub personal authentication token. Navigate to ' + success( 'https://github.com/settings/tokens/new?scopes=repo,admin:org,write:packages' ) + ' to create one.', - } ] ); + const { token } = await inquirer.prompt( [ + { + type: 'input', + name: 'token', + message: + 'Please provide a GitHub personal authentication token. Navigate to ' + + success( + 'https://github.com/settings/tokens/new?scopes=repo,admin:org,write:packages' + ) + + ' to create one.', + }, + ] ); octokit = new Octokit( { auth: token, @@ -533,7 +694,8 @@ async function runGithubReleaseStep( version, versionLabel, changelog, isPrerele console.log( '>> The GitHub release has been created.' ); } ); - abortMessage = abortMessage + ' Make sure to remove the the GitHub release as well.'; + abortMessage = + abortMessage + ' Make sure to remove the the GitHub release as well.'; // Uploading the Gutenberg Zip to the release await runStep( 'Uploading the plugin ZIP', abortMessage, async () => { @@ -551,7 +713,10 @@ async function runGithubReleaseStep( version, versionLabel, changelog, isPrerele console.log( '>> The plugin ZIP has been successfully uploaded.' ); } ); - console.log( '>> The GitHub release is available here: ' + success( release.html_url ) ); + console.log( + '>> The GitHub release is available here: ' + + success( release.html_url ) + ); return release; } @@ -562,21 +727,28 @@ async function runGithubReleaseStep( version, versionLabel, changelog, isPrerele * @param {string} commitHash Commit to cherry-pick. * @param {string} abortMessage Abort message. */ -async function runCherrypickBumpCommitIntoMasterStep( commitHash, abortMessage ) { - await runStep( 'Cherry-picking the bump commit into master', abortMessage, async () => { - const simpleGit = SimpleGit( gitWorkingDirectoryPath ); - await askForConfirmationToContinue( - 'The plugin is now released. Proceed with the version bump in the master branch?', - true, - abortMessage - ); - await simpleGit.fetch(); - await simpleGit.reset( 'hard' ); - await simpleGit.checkout( 'master' ); - await simpleGit.pull( 'origin', 'master' ); - await simpleGit.raw( [ 'cherry-pick', commitHash ] ); - await simpleGit.push( 'origin', 'master' ); - } ); +async function runCherrypickBumpCommitIntoMasterStep( + commitHash, + abortMessage +) { + await runStep( + 'Cherry-picking the bump commit into master', + abortMessage, + async () => { + const simpleGit = SimpleGit( gitWorkingDirectoryPath ); + await askForConfirmationToContinue( + 'The plugin is now released. Proceed with the version bump in the master branch?', + true, + abortMessage + ); + await simpleGit.fetch(); + await simpleGit.reset( 'hard' ); + await simpleGit.checkout( 'master' ); + await simpleGit.pull( 'origin', 'master' ); + await simpleGit.raw( [ 'cherry-pick', commitHash ] ); + await simpleGit.push( 'origin', 'master' ); + } + ); } /** @@ -591,22 +763,28 @@ async function releasePlugin( isRC = true ) { let abortMessage = 'Aborting!'; await askForConfirmationToContinue( 'Ready to go? ' ); - const { changelog } = await inquirer.prompt( [ { - type: 'editor', - name: 'changelog', - message: 'Please provide the CHANGELOG of the release (markdown)', - } ] ); + const { changelog } = await inquirer.prompt( [ + { + type: 'editor', + name: 'changelog', + message: 'Please provide the CHANGELOG of the release (markdown)', + }, + ] ); // Cloning the Git repository await runGitRepositoryCloneStep( abortMessage ); // Creating the release branch - const { version, versionLabel, releaseBranch } = isRC ? - await runReleaseBranchCreationStep( abortMessage ) : - await runReleaseBranchCheckoutStep( abortMessage ); + const { version, versionLabel, releaseBranch } = isRC + ? await runReleaseBranchCreationStep( abortMessage ) + : await runReleaseBranchCheckoutStep( abortMessage ); // Bumping the version and commit. - const commitHash = await runBumpPluginVersionAndCommitStep( version, changelog, abortMessage ); + const commitHash = await runBumpPluginVersionAndCommitStep( + version, + changelog, + abortMessage + ); // Plugin ZIP creation await runPluginZIPCreationStep(); @@ -616,22 +794,39 @@ async function releasePlugin( isRC = true ) { // Push the local changes await runPushGitChangesStep( releaseBranch, abortMessage ); - abortMessage = 'Aborting! Make sure to ' + isRC ? 'remove' : 'reset' + ' the remote release branch and remove the git tag.'; + abortMessage = + 'Aborting! Make sure to ' + isRC + ? 'remove' + : 'reset' + ' the remote release branch and remove the git tag.'; // Creating the GitHub Release - const release = await runGithubReleaseStep( version, versionLabel, changelog, isRC, abortMessage ); - abortMessage = 'Aborting! Make sure to manually cherry-pick the ' + success( commitHash ) + ' commit to the master branch.'; + const release = await runGithubReleaseStep( + version, + versionLabel, + changelog, + isRC, + abortMessage + ); + abortMessage = + 'Aborting! Make sure to manually cherry-pick the ' + + success( commitHash ) + + ' commit to the master branch.'; if ( ! isRC ) { - abortMessage += ' Make sure to perform the SVN release manually as well.'; + abortMessage += + ' Make sure to perform the SVN release manually as well.'; } // Cherry-picking the bump commit into master await runCherrypickBumpCommitIntoMasterStep( commitHash, abortMessage ); if ( ! isRC ) { - abortMessage = 'Aborting! The GitHub release is done. Make sure to perform the SVN release manually.'; + abortMessage = + 'Aborting! The GitHub release is done. Make sure to perform the SVN release manually.'; - await askForConfirmationToContinue( 'The GitHub release is complete. Proceed with the SVN release? ', abortMessage ); + await askForConfirmationToContinue( + 'The GitHub release is complete. Proceed with the SVN release? ', + abortMessage + ); // Fetching the SVN repository await runSvnRepositoryCloneStep( abortMessage ); @@ -639,10 +834,12 @@ async function releasePlugin( isRC = true ) { // Updating the SVN trunk content await runUpdateTrunkContentStep( version, release.body, abortMessage ); - abortMessage = 'Aborting! The GitHub release is done, SVN trunk updated. Make sure to create the SVN tag and update the stable version manually.'; + abortMessage = + 'Aborting! The GitHub release is done, SVN trunk updated. Make sure to create the SVN tag and update the stable version manually.'; await runSvnTagStep( version, abortMessage ); - abortMessage = 'Aborting! The GitHub release is done, SVN tagged. Make sure to update the stable version manually.'; + abortMessage = + 'Aborting! The GitHub release is done, SVN tagged. Make sure to update the stable version manually.'; await updateThePluginStableVersion( version, abortMessage ); } @@ -655,20 +852,26 @@ async function releasePlugin( isRC = true ) { program .command( 'release-plugin-rc' ) .alias( 'rc' ) - .description( 'Release an RC version of the plugin (supports only rc.1 for now)' ) + .description( + 'Release an RC version of the plugin (supports only rc.1 for now)' + ) .action( async () => { console.log( chalk.bold( '💃 Time to release Gutenberg 🕺\n\n' ), 'Welcome! This tool is going to help you release a new RC version of the Gutenberg Plugin.\n', 'It goes through different steps : creating the release branch, bumping the plugin version, tagging and creating the GitHub release, building the ZIP...\n', - 'To perform a release you\'ll have to be a member of the Gutenberg Core Team.\n' + "To perform a release you'll have to be a member of the Gutenberg Core Team.\n" ); const release = await releasePlugin( true ); console.log( - '\n>> 🎉 The Gutenberg version ' + success( release.name ) + ' has been successfully released.\n', - 'You can access the GitHub release here: ' + success( release.html_url ) + '\n', + '\n>> 🎉 The Gutenberg version ' + + success( release.name ) + + ' has been successfully released.\n', + 'You can access the GitHub release here: ' + + success( release.html_url ) + + '\n', 'Thanks for performing the release!' ); } ); @@ -682,16 +885,20 @@ program chalk.bold( '💃 Time to release Gutenberg 🕺\n\n' ), 'Welcome! This tool is going to help you release a new stable version of the Gutenberg Plugin.\n', 'It goes through different steps : bumping the plugin version, tagging and creating the GitHub release, building the ZIP, pushing the release to the SVN repository...\n', - 'To perform a release you\'ll have to be a member of the Gutenberg Core Team.\n' + "To perform a release you'll have to be a member of the Gutenberg Core Team.\n" ); const release = await releasePlugin( false ); console.log( - '\n>> 🎉 The Gutenberg ' + success( release.name ) + ' has been successfully released.\n', - 'You can access the GitHub release here: ' + success( release.html_url ) + '\n', - 'In a few minutes, you\'ll be able to update the plugin from the WordPress repository.\n', - 'Thanks for performing the release! and don\'t forget to publish the release post.' + '\n>> 🎉 The Gutenberg ' + + success( release.name ) + + ' has been successfully released.\n', + 'You can access the GitHub release here: ' + + success( release.html_url ) + + '\n', + "In a few minutes, you'll be able to update the plugin from the WordPress repository.\n", + "Thanks for performing the release! and don't forget to publish the release post." ); } ); @@ -703,38 +910,187 @@ program */ async function runWordPressReleaseBranchSyncStep( abortMessage ) { const wordpressReleaseBranch = 'wp/trunk'; - await runStep( 'Getting into the WordPress release branch', abortMessage, async () => { - const simpleGit = SimpleGit( gitWorkingDirectoryPath ); - const packageJsonPath = gitWorkingDirectoryPath + '/package.json'; - const pluginReleaseBranch = findReleaseBranchName( packageJsonPath ); - - // Creating the release branch - await simpleGit.checkout( wordpressReleaseBranch ); - console.log( '>> The local release branch ' + success( wordpressReleaseBranch ) + ' has been successfully checked out.' ); - - await askForConfirmationToContinue( - `The branch is ready for sync with the latest plugin release changes applied to "${ pluginReleaseBranch }". Proceed?`, - true, - abortMessage - ); - - await simpleGit.raw( [ 'rm', '-r', '.' ] ); - await simpleGit.raw( [ 'checkout', `origin/${ pluginReleaseBranch }`, '--', '.' ] ); - await simpleGit.commit( `Merge changes published in the Gutenberg plugin "${ pluginReleaseBranch }" branch` ); - console.log( '>> The local WordPress release branch ' + success( wordpressReleaseBranch ) + ' has been successfully synced.' ); - } ); + await runStep( + 'Getting into the WordPress release branch', + abortMessage, + async () => { + const simpleGit = SimpleGit( gitWorkingDirectoryPath ); + const packageJsonPath = gitWorkingDirectoryPath + '/package.json'; + const pluginReleaseBranch = findReleaseBranchName( + packageJsonPath + ); + + // Creating the release branch + await simpleGit.checkout( wordpressReleaseBranch ); + console.log( + '>> The local release branch ' + + success( wordpressReleaseBranch ) + + ' has been successfully checked out.' + ); + + await askForConfirmationToContinue( + `The branch is ready for sync with the latest plugin release changes applied to "${ pluginReleaseBranch }". Proceed?`, + true, + abortMessage + ); + + await simpleGit.raw( [ 'rm', '-r', '.' ] ); + await simpleGit.raw( [ + 'checkout', + `origin/${ pluginReleaseBranch }`, + '--', + '.', + ] ); + await simpleGit.commit( + `Merge changes published in the Gutenberg plugin "${ pluginReleaseBranch }" branch` + ); + console.log( + '>> The local WordPress release branch ' + + success( wordpressReleaseBranch ) + + ' has been successfully synced.' + ); + } + ); return { releaseBranch: wordpressReleaseBranch, }; } +/** + * Update CHANGELOG files with the new version number for those packages that + * contain new entries. + * + * @param {string} minimumVersionBump Minimum version bump for the packages. + * @param {string} abortMessage Abort Message. + */ +async function updatePackageChangelogs( minimumVersionBump, abortMessage ) { + const changelogFiles = await glob( + path.resolve( gitWorkingDirectoryPath, 'packages/*/CHANGELOG.md' ) + ); + const processedPackages = await Promise.all( + changelogFiles.map( async ( changelogFile ) => { + const fileStream = fs.createReadStream( changelogFile ); + + const lines = readline.createInterface( { + input: fileStream, + } ); + + let changesDetected = false; + let versionBump = null; + for await ( const line of lines ) { + // Detect unpublished changes first. + if ( line.startsWith( '## Master' ) ) { + changesDetected = true; + continue; + } + + // Skip all lines until unpublished changes found. + if ( ! changesDetected ) { + continue; + } + + // A previous published version detected. Stop processing. + if ( line.startsWith( '## ' ) ) { + break; + } + + // A major version bump required. Stop processing. + if ( line.startsWith( '### Breaking Change' ) ) { + versionBump = 'major'; + break; + } + + // A minor version bump required. Proceed to the next line. + if ( + line.startsWith( '### New Feature' ) || + line.startsWith( '### Deprecation' ) + ) { + versionBump = 'minor'; + continue; + } + + // A version bump required. Found new changelog section. + if ( versionBump !== 'minor' && line.startsWith( '### ' ) ) { + versionBump = minimumVersionBump; + } + } + const packageName = `@wordpress/${ + changelogFile.split( '/' ).reverse()[ 1 ] + }`; + const { version } = readJSONFile( + changelogFile.replace( 'CHANGELOG.md', 'package.json' ) + ); + const nextVersion = + versionBump !== null + ? semver.inc( version, versionBump ) + : null; + + return { + changelogFile, + packageName, + version, + nextVersion, + }; + } ) + ); + + const changelogsToUpdate = processedPackages.filter( + ( { nextVersion } ) => nextVersion + ); + + if ( changelogsToUpdate.length === 0 ) { + console.log( '>> No changes in CHANGELOG files detected.' ); + return; + } + + console.log( + '>> Recommended version bumps based on the changes detected in CHANGELOG files:' + ); + + const publishDate = new Date().toISOString().split( 'T' )[ 0 ]; + await Promise.all( + changelogsToUpdate.map( + async ( { changelogFile, packageName, nextVersion, version } ) => { + const content = await fs.promises.readFile( + changelogFile, + 'utf8' + ); + await fs.promises.writeFile( + changelogFile, + content.replace( + '## Master', + `## Master\n\n## ${ nextVersion } (${ publishDate })` + ) + ); + console.log( + ` - ${ packageName }: ${ version } -> ${ nextVersion }` + ); + } + ) + ); + + await askForConfirmationToContinue( + `All corresponding files were updated. Commit the changes?`, + true, + abortMessage + ); + const simpleGit = SimpleGit( gitWorkingDirectoryPath ); + await simpleGit.add( './*' ); + await simpleGit.commit( 'Update changelog files' ); + console.log( + '>> Changelog files changes have been committed successfully.' + ); +} + /** * Prepublish to npm steps for WordPress packages. * + * @param {string} minimumVersionBump Minimum version bump for the packages. + * * @return {Object} Github release object. */ -async function prepublishPackages() { +async function prepublishPackages( minimumVersionBump ) { // This is a variable that contains the abort message shown when the script is aborted. let abortMessage = 'Aborting!'; await askForConfirmationToContinue( 'Ready to go? ' ); @@ -743,7 +1099,11 @@ async function prepublishPackages() { await runGitRepositoryCloneStep( abortMessage ); // Checking out the WordPress release branch and doing sync with the last plugin release. - const { releaseBranch } = await runWordPressReleaseBranchSyncStep( abortMessage ); + const { releaseBranch } = await runWordPressReleaseBranchSyncStep( + abortMessage + ); + + await updatePackageChangelogs( minimumVersionBump, abortMessage ); // Push the local changes abortMessage = `Aborting! Make sure to push changes applied to WordPress release branch "${ releaseBranch }" manually.`; @@ -756,15 +1116,17 @@ async function prepublishPackages() { program .command( 'prepublish-packages-stable' ) .alias( 'npm-stable' ) - .description( 'Prepublish to npm steps for a stable version of WordPress packages' ) + .description( + 'Prepublish to npm steps for the next stable version of WordPress packages' + ) .action( async () => { console.log( chalk.bold( '💃 Time to publish WordPress packages to npm 🕺\n\n' ), - 'Welcome! This tool is going to help you with prepublish to npm steps for a new stable version of WordPress packages.\n', - 'To perform a release you\'ll have to be a member of the WordPress Team on npm.\n' + 'Welcome! This tool is going to help you with prepublish to npm steps for the next stable version of WordPress packages.\n', + "To perform a release you'll have to be a member of the WordPress Team on npm.\n" ); - await prepublishPackages(); + await prepublishPackages( 'minor' ); console.log( '\n>> 🎉 WordPress packages are ready to publish.\n', diff --git a/bin/generate-public-grammar.js b/bin/generate-public-grammar.js index c56ec4398a894..0c2bc74fc4224 100755 --- a/bin/generate-public-grammar.js +++ b/bin/generate-public-grammar.js @@ -2,7 +2,10 @@ const parser = require( '../node_modules/pegjs/lib/parser.js' ); const fs = require( 'fs' ); const path = require( 'path' ); -const grammarSource = fs.readFileSync( './packages/block-serialization-spec-parser/grammar.pegjs', 'utf8' ); +const grammarSource = fs.readFileSync( + './packages/block-serialization-spec-parser/grammar.pegjs', + 'utf8' +); const grammar = parser.parse( grammarSource ); function escape( text ) { @@ -15,12 +18,11 @@ function escape( text ) { } function isGroup( expression ) { - return [ - 'choice', - 'action', - 'labeled', - 'sequence', - ].indexOf( expression.type ) >= 0; + return ( + [ 'choice', 'action', 'labeled', 'sequence' ].indexOf( + expression.type + ) >= 0 + ); } function flattenUnary( expression ) { @@ -40,11 +42,17 @@ function flatten( expression ) { return '"' + escape( expression.value ) + '"'; case 'class': return ( - '[' + ( expression.inverted ? '^' : '' ) + - expression.parts.map( ( part ) => - escape( Array.isArray( part ) ? part.join( '-' ) : part ) - ).join( '' ) + - ']' + ( expression.ignoreCase ? 'i' : '' ) + '[' + + ( expression.inverted ? '^' : '' ) + + expression.parts + .map( ( part ) => + escape( + Array.isArray( part ) ? part.join( '-' ) : part + ) + ) + .join( '' ) + + ']' + + ( expression.ignoreCase ? 'i' : '' ) ); // Unary @@ -80,11 +88,15 @@ function flatten( expression ) { return `
${ expression.rules.map( flatten ).join( '' ) }
`; case 'rule': expression.expression.isRuleTop = true; - const displayName = expression.expression.type === 'named' ? - expression.expression.name : ''; - return `
${ displayName }
` + + const displayName = + expression.expression.type === 'named' + ? expression.expression.name + : ''; + return ( + `
${ displayName }
` + `
${ expression.name }
= ` + - `${ flatten( expression.expression ) }
`; + `${ flatten( expression.expression ) }` + ); default: throw new Error( JSON.stringify( expression ) ); @@ -92,8 +104,10 @@ function flatten( expression ) { } fs.writeFileSync( - path.join( __dirname, '..', 'docs', 'grammar.md' ), ` + path.join( __dirname, '..', 'docs', 'grammar.md' ), + ` # Block Grammar ${ flatten( grammar ) } -` ); +` +); diff --git a/bin/packages/build-worker.js b/bin/packages/build-worker.js index d0f1d1c809984..e7f2b6f058fbd 100644 --- a/bin/packages/build-worker.js +++ b/bin/packages/build-worker.js @@ -84,8 +84,14 @@ function getBuildPath( file, buildFolder ) { */ const BUILD_TASK_BY_EXTENSION = { async '.scss'( file ) { - const outputFile = getBuildPath( file.replace( '.scss', '.css' ), 'build-style' ); - const outputFileRTL = getBuildPath( file.replace( '.scss', '-rtl.css' ), 'build-style' ); + const outputFile = getBuildPath( + file.replace( '.scss', '.css' ), + 'build-style' + ); + const outputFileRTL = getBuildPath( + file.replace( '.scss', '-rtl.css' ), + 'build-style' + ); const [ , contents ] = await Promise.all( [ makeDir( path.dirname( outputFile ) ), @@ -95,7 +101,7 @@ const BUILD_TASK_BY_EXTENSION = { const builtSass = await renderSass( { file, includePaths: [ path.join( PACKAGES_DIR, 'base-styles' ) ], - data: ( + data: [ 'colors', 'breakpoints', @@ -103,20 +109,26 @@ const BUILD_TASK_BY_EXTENSION = { 'mixins', 'animations', 'z-index', - ].map( ( imported ) => `@import "${ imported }";` ).join( ' ' ) + - contents - ), + ] + .map( ( imported ) => `@import "${ imported }";` ) + .join( ' ' ) + contents, } ); - const result = await postcss( require( './post-css-config' ) ).process( builtSass.css, { - from: 'src/app.css', - to: 'dest/app.css', - } ); - - const resultRTL = await postcss( [ require( 'rtlcss' )() ] ).process( result.css, { - from: 'src/app.css', - to: 'dest/app.css', - } ); + const result = await postcss( require( './post-css-config' ) ).process( + builtSass.css, + { + from: 'src/app.css', + to: 'dest/app.css', + } + ); + + const resultRTL = await postcss( [ require( 'rtlcss' )() ] ).process( + result.css, + { + from: 'src/app.css', + to: 'dest/app.css', + } + ); await Promise.all( [ writeFile( outputFile, result.css ), @@ -125,9 +137,14 @@ const BUILD_TASK_BY_EXTENSION = { }, async '.js'( file ) { - for ( const [ environment, buildDir ] of Object.entries( JS_ENVIRONMENTS ) ) { + for ( const [ environment, buildDir ] of Object.entries( + JS_ENVIRONMENTS + ) ) { const destPath = getBuildPath( file, buildDir ); - const babelOptions = getBabelConfig( environment, file.replace( PACKAGES_DIR, '@wordpress' ) ); + const babelOptions = getBabelConfig( + environment, + file.replace( PACKAGES_DIR, '@wordpress' ) + ); const [ , transformed ] = await Promise.all( [ makeDir( path.dirname( destPath ) ), @@ -135,8 +152,17 @@ const BUILD_TASK_BY_EXTENSION = { ] ); await Promise.all( [ - writeFile( destPath + '.map', JSON.stringify( transformed.map ) ), - writeFile( destPath, transformed.code + '\n//# sourceMappingURL=' + path.basename( destPath ) + '.map' ), + writeFile( + destPath + '.map', + JSON.stringify( transformed.map ) + ), + writeFile( + destPath, + transformed.code + + '\n//# sourceMappingURL=' + + path.basename( destPath ) + + '.map' + ), ] ); } }, diff --git a/bin/packages/build.js b/bin/packages/build.js index 17006dbdc8638..8d1a0c9cc1787 100755 --- a/bin/packages/build.js +++ b/bin/packages/build.js @@ -37,7 +37,7 @@ function getPackageName( file ) { * @return {Transform} Stream transform instance. */ function createStyleEntryTransform() { - const packages = new Set; + const packages = new Set(); return new Transform( { objectMode: true, @@ -57,7 +57,9 @@ function createStyleEntryTransform() { } packages.add( packageName ); - const entries = await glob( path.resolve( PACKAGES_DIR, packageName, 'src/*.scss' ) ); + const entries = await glob( + path.resolve( PACKAGES_DIR, packageName, 'src/*.scss' ) + ); entries.forEach( ( entry ) => this.push( entry ) ); callback(); }, @@ -73,12 +75,14 @@ function createStyleEntryTransform() { * @return {Transform} Stream transform instance. */ function createBlockJsonEntryTransform() { - const blocks = new Set; + const blocks = new Set(); return new Transform( { objectMode: true, async transform( file, encoding, callback ) { - const matches = /block-library[\/\\]src[\/\\](.*)[\/\\]block.json$/.exec( file ); + const matches = /block-library[\/\\]src[\/\\](.*)[\/\\]block.json$/.exec( + file + ); const blockName = matches ? matches[ 1 ] : undefined; // Only block.json files in the block-library folder are subject to this transform. @@ -121,27 +125,25 @@ if ( files.length ) { bar.tick( 0 ); - stream = glob.stream( [ - `${ PACKAGES_DIR }/*/src/**/*.js`, - `${ PACKAGES_DIR }/*/src/*.scss`, - ], { - ignore: [ - `**/benchmark/**`, - `**/{__mocks__,__tests__,test}/**`, - `**/{storybook,stories}/**`, - ], - onlyFiles: true, - } ); + stream = glob.stream( + [ `${ PACKAGES_DIR }/*/src/**/*.js`, `${ PACKAGES_DIR }/*/src/*.scss` ], + { + ignore: [ + `**/benchmark/**`, + `**/{__mocks__,__tests__,test}/**`, + `**/{storybook,stories}/**`, + ], + onlyFiles: true, + } + ); // Pause to avoid data flow which would begin on the `data` event binding, // but should wait until worker processing below. // // See: https://nodejs.org/api/stream.html#stream_two_reading_modes - stream - .pause() - .on( 'data', ( file ) => { - bar.total = files.push( file ); - } ); + stream.pause().on( 'data', ( file ) => { + bar.total = files.push( file ); + } ); onFileComplete = () => { bar.tick(); @@ -154,27 +156,29 @@ let ended = false, complete = 0; stream - .on( 'data', ( file ) => worker( file, ( error ) => { - onFileComplete(); - - if ( error ) { - // If an error occurs, the process can't be ended immediately since - // other workers are likely pending. Optimally, it would end at the - // earliest opportunity (after the current round of workers has had - // the chance to complete), but this is not made directly possible - // through `worker-farm`. Instead, ensure at least that when the - // process does exit, it exits with a non-zero code to reflect the - // fact that an error had occurred. - process.exitCode = 1; - - console.error( error ); - } + .on( 'data', ( file ) => + worker( file, ( error ) => { + onFileComplete(); + + if ( error ) { + // If an error occurs, the process can't be ended immediately since + // other workers are likely pending. Optimally, it would end at the + // earliest opportunity (after the current round of workers has had + // the chance to complete), but this is not made directly possible + // through `worker-farm`. Instead, ensure at least that when the + // process does exit, it exits with a non-zero code to reflect the + // fact that an error had occurred. + process.exitCode = 1; + + console.error( error ); + } - if ( ended && ++complete === files.length ) { - workerFarm.end( worker ); - } - } ) ) - .on( 'end', () => ended = true ) + if ( ended && ++complete === files.length ) { + workerFarm.end( worker ); + } + } ) + ) + .on( 'end', () => ( ended = true ) ) .resume(); /* eslint-enable no-console */ diff --git a/bin/packages/get-babel-config.js b/bin/packages/get-babel-config.js index d76e171d46b21..3df510f1ac106 100644 --- a/bin/packages/get-babel-config.js +++ b/bin/packages/get-babel-config.js @@ -6,9 +6,11 @@ module.exports = function( environment = '', file ) { * The caller options can only be 'boolean', 'string', or 'number' by design: * https://github.com/babel/babel/blob/bd0c62dc0c30cf16a4d4ef0ddf21d386f673815c/packages/babel-core/src/config/validation/option-assertions.js#L122 */ - const callerOpts = { caller: { - name: `WP_BUILD_${ environment.toUpperCase() }`, - } }; + const callerOpts = { + caller: { + name: `WP_BUILD_${ environment.toUpperCase() }`, + }, + }; switch ( environment ) { case 'main': // to be merged as a presetEnv option diff --git a/bin/packages/watch.js b/bin/packages/watch.js index b307029dcd568..8d5e650f6bac3 100644 --- a/bin/packages/watch.js +++ b/bin/packages/watch.js @@ -27,7 +27,13 @@ const exists = ( filename ) => { // and files with a suffix of .test or .spec (e.g. blocks.test.js), // and deceitful source-like files, such as editor swap files. const isSourceFile = ( filename ) => { - return ! [ /\/(benchmark|__mocks__|__tests__|test|storybook|stories)\/.+.js$/, /.\.(spec|test)\.js$/ ].some( ( regex ) => regex.test( filename ) ) && /.\.(js|json|scss)$/.test( filename ); + return ( + ! [ + /\/(benchmark|__mocks__|__tests__|test|storybook|stories)\/.+.js$/, + /.\.(spec|test)\.js$/, + ].some( ( regex ) => regex.test( filename ) ) && + /.\.(js|json|scss)$/.test( filename ) + ); }; const rebuild = ( filename ) => filesToBuild.set( filename, true ); @@ -36,29 +42,44 @@ getPackages().forEach( ( p ) => { const srcDir = path.resolve( p, 'src' ); try { fs.accessSync( srcDir, fs.F_OK ); - watch( path.resolve( p, 'src' ), { recursive: true }, ( event, filename ) => { - if ( ! isSourceFile( filename ) ) { - return; - } + watch( + path.resolve( p, 'src' ), + { recursive: true }, + ( event, filename ) => { + if ( ! isSourceFile( filename ) ) { + return; + } - const filePath = path.resolve( srcDir, filename ); - if ( ( event === 'update' ) && exists( filePath ) ) { - // eslint-disable-next-line no-console - console.log( chalk.green( '->' ), `${ event }: ${ filename }` ); - rebuild( filePath ); - } else { - const buildFile = path.resolve( srcDir, '..', 'build', filename ); - try { - fs.unlinkSync( buildFile ); - process.stdout.write( - chalk.red( ' \u2022 ' ) + - path.relative( path.resolve( srcDir, '..', '..' ), buildFile ) + - ' (deleted)' + - '\n' + const filePath = path.resolve( srcDir, filename ); + if ( event === 'update' && exists( filePath ) ) { + // eslint-disable-next-line no-console + console.log( + chalk.green( '->' ), + `${ event }: ${ filename }` + ); + rebuild( filePath ); + } else { + const buildFile = path.resolve( + srcDir, + '..', + 'build', + filename ); - } catch ( e ) {} + try { + fs.unlinkSync( buildFile ); + process.stdout.write( + chalk.red( ' \u2022 ' ) + + path.relative( + path.resolve( srcDir, '..', '..' ), + buildFile + ) + + ' (deleted)' + + '\n' + ); + } catch ( e ) {} + } } - } ); + ); } catch ( e ) { // doesn't exist } diff --git a/bin/process-git-diff.js b/bin/process-git-diff.js index b80b117daa59e..6505954143e33 100644 --- a/bin/process-git-diff.js +++ b/bin/process-git-diff.js @@ -28,7 +28,10 @@ const hasNonOptionalDiff = !! ( process.argv[ 2 ] || '' ) // Strip individual diffs of optional-only. .replace( /@@ .+ @@\n(-.+\n\+.+,\n)?\+.+\"optional\": true,?\n/gm, '' ) // If no more line diffs remain after above, remove diff heading for file. - .replace( /diff --git a\/package-lock.json b\/package-lock.json\nindex \w+..\w+ \d+\n--- a\/package-lock.json\n\+\+\+ b\/package-lock.json\n(?!@@)/, '' ); + .replace( + /diff --git a\/package-lock.json b\/package-lock.json\nindex \w+..\w+ \d+\n--- a\/package-lock.json\n\+\+\+ b\/package-lock.json\n(?!@@)/, + '' + ); // Exit with error code if, after replace, changes still exist. process.exit( hasNonOptionalDiff ? 1 : 0 ); diff --git a/changelog.txt b/changelog.txt index 55ec08f99ed7b..6f7485ebae45d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,6 +1,6 @@ == Changelog == -= 7.3.0-rc.1 = += 7.3.0 = ## Enhancements @@ -161,6 +161,7 @@ + = 7.2.0 = ### New Features diff --git a/docs/contributors/design.md b/docs/contributors/design.md index d71221003d378..19d1eab1fa93b 100644 --- a/docs/contributors/design.md +++ b/docs/contributors/design.md @@ -2,6 +2,12 @@ This is a living document that outlines the design principles and patterns of the editor interface. Its aim is to explain the background of the design, inform future improvements, and help people design great blocks. +## How Can Designers Contribute? + +If you'd like to contribute to the design or front-end, feel free to contribute to tickets labelled [Needs Design](https://github.com/WordPress/gutenberg/issues?q=is%3Aissue+is%3Aopen+label%3A%22Needs+Design%22) or [Needs Design Feedback](https://github.com/WordPress/gutenberg/issues?q=is%3Aissue+is%3Aopen+label%3A"Needs+Design+Feedback%22). We could use your thoughtful replies, mockups, animatics, sketches, doodles. Proposed changes are best done as minimal and specific iterations on the work that precedes it so we can compare. + +The [WordPress Design team](http://make.wordpress.org/design/) uses [Figma](https://www.figma.com/) to collaborate and share work. If you'd like to contribute, join the [#design channel](http://wordpress.slack.com/messages/design/) in [Slack](https://make.wordpress.org/chat/) and ask the team to set you up with a free Figma account. This will give you access to a helpful [library of components](https://www.figma.com/file/ZtN5xslEVYgzU7Dd5CxgGZwq/WordPress-Components?node-id=0%3A1) used in WordPress. + ## Principles ![Gutenberg Logo](https://cldup.com/J2MgjuShPv-3000x3000.png) diff --git a/docs/contributors/principles.md b/docs/contributors/principles.md index 8acedac095826..c1552acb28d8f 100644 --- a/docs/contributors/principles.md +++ b/docs/contributors/principles.md @@ -1,4 +1,4 @@ -# Principles +# Project Overview First, let’s look at the big picture. If the architectural and UX principles described here are activated at scale, how will the Gutenberg project improve and transform both users and creators experiences? diff --git a/docs/contributors/readme.md b/docs/contributors/readme.md index 96c3a85424e5d..34bd9a2bb3cce 100644 --- a/docs/contributors/readme.md +++ b/docs/contributors/readme.md @@ -1,18 +1,33 @@ -# Contributor Documentation +# Contributor Guide -Welcome to the Gutenberg Project Contributors Guide. +Welcome to the Gutenberg Project Contributor Guide. This guide is here to help you get setup and start contributing to the project. If you have any questions, you'll find us in the #core-editor channel in the WordPress Core Slack, [free to join](https://make.wordpress.org/chat/). -The following guidelines are in place to create consistency across the project and the numerous contributors. See the [Contributing Documentation](https://github.com/WordPress/gutenberg/blob/master/CONTRIBUTING.md) for technical details around setup, and submitting your contributions. +Gutenberg is a sub-project of Core WordPress. Please see the [Core Contributor Handbook](https://make.wordpress.org/core/handbook/) for additional information. -## Philosophy +## Sections -* [Architectural and UX Principles of Gutenberg](/docs/contributors/principles.md) +Find the section below based on what you are looking to contribute: -## Sections +- Code? See the [developer section](/docs/contributors/develop.md). + +- Design? See the [design section](/docs/contributors/design.md). + +- Documentation? See the [documentation section](/docs/contributors/document.md) + +- Triage Support? See the [triaging issues section](/docs/contributors/repository-management/#triaging-issues) + +- Internationalization? See the [localizing and translating section](/docs/contributors/localizing.md) + +### Repository Management + +The Gutenberg project uses Github for managing code and tracking issues. Please see the following sections for the project methodologies using Github. + +- [Issue Management](/docs/contributors/repository-management.md#issues) + +- [Pull Requests](/docs/contributors/repository-management.md#pull-requests) -The contributors guide has the following different sections by contribution type: +- [Teams and Projects](/docs/contributors/repository-management.md#teams) -* [Design Contributions](/docs/contributors/design.md) -* [Developer Contributions](/docs/contributors/develop.md) -* [Documentation Contributions](/docs/contributors/document.md) +## Guidelines +See the [Contributing Guidelines](https://github.com/WordPress/gutenberg/blob/master/CONTRIBUTING.md) for the rules around contributing: This includes the code of conduct and licensing information. diff --git a/docs/contributors/release.md b/docs/contributors/release.md index 09c812df8f3ec..4b91573ee602e 100644 --- a/docs/contributors/release.md +++ b/docs/contributors/release.md @@ -209,7 +209,7 @@ The Gutenberg repository mirrors the [WordPress SVN repository](https://make.wor ### Synchronizing WordPress Trunk -For each Gutenberg plugin release, WordPress trunk should be synchronized with this release. This involves the following steps: +For each Gutenberg plugin release, WordPress trunk should be synchronized with this release. This involves the following steps that are automated with `./bin/commander npm-stable` command: **Note:** The WordPress `trunk` branch can be closed or in "feature-freeze" mode. Usually, this happens between the first `beta` and the first `RC` of the WordPress release cycle. During this period, the Gutenberg plugin releases should not be synchronized with WordPress Core. @@ -219,12 +219,13 @@ For each Gutenberg plugin release, WordPress trunk should be synchronized with t 3. Remove all files from the current branch: `git rm -r .`. 4. Check out all the files from the release branch: `git checkout release/x.x -- .`. 5. Commit all changes to the `wp/trunk` branch with `git commit -m "Merge changes published in the Gutenberg plugin vX.X release"` and push to the repository. +6. Update the `CHANGELOG.md` files of the packages with the new publish version calculated and commit to the `wp/trunk` branch. +Aassuming the package versions are written using this format `major.minor.patch`, make sure to bump at least the `minor` version number. For example, if the CHANGELOG of the package to be released indicates that the next unreleased version is `5.6.1`, choose `5.7.0` as a version in case of `minor` version. Now, the branch is ready to be used to publish the npm packages. -1. Run the [package release process] but when asked for the version numbers to choose for each package, (assuming the package versions are written using this format `major.minor.patch`) make sure to bump at least the `minor` version number. For example, if the CHANGELOG of the package to be released indicates that the next unreleased version is `5.6.1`, choose `5.7.0` as a version. -2. Update the `CHANGELOG.md` files of the published packages with the new released versions and commit to the `wp/trunk` branch. -3. Cherry-pick the "Publish" (created by Lerna) and the CHANGELOG update commits into the `master` branch of Gutenberg. +1. Run the [package release process] but when asked for the version numbers to choose for each package pick values based on the updated CHANGELOG files. +2. Cherry-pick the "Publish" (created by Lerna) and the CHANGELOG update commits into the `master` branch of Gutenberg. Now, the npm packages should be ready and a patch can be created and committed into WordPress `trunk`. @@ -254,7 +255,7 @@ Now, the branch is ready to be used to publish the npm packages. Now, the npm packages should be ready and a patch can be created and committed into the corresponding WordPress SVN branch. -### Standalone Package Releases +### Standalone Package Releases The following workflow is needed when packages require bug fixes or security releases to be published to _npm_ outside of a WordPress release cycle. @@ -276,7 +277,7 @@ Before porting commits check that the `wp/trunk` branch does not have any outsta Now _cherry-pick_ the commits from `master` to `wp/trunk`, use `-m 1 commithash` if the commit was a pull request merge commit: 1. `git cherry-pick -m 1 cb150a2` -2. `git push` +2. `git push` Whilst waiting for the Travis CI build for `wp/trunk` [branch to pass](https://travis-ci.com/WordPress/gutenberg/branches) identify and begin updating the `CHANGELOG.md` files: 1. `git checkout wp/trunk` @@ -317,23 +318,23 @@ Now that the changes have been committed to the `wp/trunk` branch and the Travis > @wordpress/scripts > lerna success found 3 packages ready to publish > ``` -2. Run the [package release process](https://github.com/WordPress/gutenberg/blob/master/packages/README.md#releasing-packages) but when asked for the version numbers to choose for each package use the versions you made note of above when updating each packages `CHANGELOG.md` file. +2. Run the [package release process] but when asked for the version numbers to choose for each package use the versions you made note of above when updating each packages `CHANGELOG.md` file. > Truncated example of publishing process output > ``` > npm run publish:prod -> +> > Build Progress: [==============================] 100% > lerna notice cli v3.18.2 > lerna info versioning independent > ? Select a new version for @wordpress/e2e-tests (currently 1.9.0) Patch (1.9.1) > ? Select a new version for @wordpress/jest-preset-default (currently 5.3.0) Patch (5.3.1) > ? Select a new version for @wordpress/scripts (currently 6.1.0) Patch (6.1.1) -> +> > Changes: > - @wordpress/e2e-tests: 1.9.0 => 1.9.1 > - @wordpress/jest-preset-default: 5.3.0 => 5.3.1 > - @wordpress/scripts: 6.1.0 => 6.1.1 -> +> > ? Are you sure you want to publish these packages? Yes > lerna info execute Skipping releases > lerna info git Pushing tags... @@ -359,21 +360,21 @@ Now that the packages have been published the _"chore(release): publish"_ and _" 5. Get the commit hash from the the lerna publish commit either from the terminal or [wp/trunk commits](https://github.com/WordPress/gutenberg/commits/wp/trunk) 6. Cherry-pick the `fe6ae0d` "chore(release): publish"_ commit made to `wp/trunk` 7. `git cherry-pick fe6ae0d` -8. `git push` +8. `git push` Confirm the packages dependancies do not contain `file://` links in the `dependencies` or `devdependencies` section of the packages released, e.g: > https://unpkg.com/browse/@wordpress/jest-preset-default@5.3.1/package.json > https://unpkg.com/browse/@wordpress/scripts@6.1.1/package.json > https://unpkg.com/browse/@wordpress/jest-preset-default@5.3.1/package.json -Time to announce the published changes in the #core-js and #core-editor Slack channels +Time to announce the published changes in the #core-js and #core-editor Slack channels > ``` > 📣 Successfully published: > • @wordpress/e2e-tests@1.9.1 > • @wordpress/jest-preset-default@5.3.1 > • @wordpress/scripts@6.1.1 > Lerna success published 3 packages -``` +> ``` --------- diff --git a/docs/designers-developers/developers/block-api/block-deprecation.md b/docs/designers-developers/developers/block-api/block-deprecation.md index bc94305a8bbe7..b07ae89e1a0a7 100644 --- a/docs/designers-developers/developers/block-api/block-deprecation.md +++ b/docs/designers-developers/developers/block-api/block-deprecation.md @@ -13,7 +13,7 @@ Deprecations are defined on a block type as its `deprecated` property, an array - `supports` (Object): The [supports definition](/docs/designers-developers/developers/block-api/block-registration.md) of the deprecated form of the block. - `save` (Function): The [save implementation](/docs/designers-developers/developers/block-api/block-edit-save.md) of the deprecated form of the block. - `migrate` (Function, Optional): A function which, given the old attributes and inner blocks is expected to return either the new attributes or a tuple array of `[ attributes, innerBlocks ]` compatible with the block. -- `isEligible` (Function, Optional): A function which, given the attributes and inner blocks of the parsed block, returns true if the deprecation can handle the block migration. This is particularly useful in cases where a block is technically valid even once deprecated, and requires updates to its attributes or inner blocks. +- `isEligible` (Function, Optional): A function which, given the attributes and inner blocks of the parsed block, returns true if the deprecation can handle the block migration even if the block is valid. This function is not called when the block is invalid. This is particularly useful in cases where a block is technically valid even once deprecated, and requires updates to its attributes or inner blocks. It's important to note that `attributes`, `supports`, and `save` are not automatically inherited from the current version, since they can impact parsing and serialization of a block, so they must be defined on the deprecated object in order to be processed during a migration. diff --git a/docs/designers-developers/developers/block-api/block-registration.md b/docs/designers-developers/developers/block-api/block-registration.md index 8849cdbcf2186..f69cc31ee0a98 100644 --- a/docs/designers-developers/developers/block-api/block-registration.md +++ b/docs/designers-developers/developers/block-api/block-registration.md @@ -83,7 +83,7 @@ icon: 'book-alt', icon: , ``` -**Note:** Custom SVG icons are automatically wrapped in the [`wp.components.SVG` component](/packages/components/src/primitives/svg/) to add accessibility attributes (`aria-hidden`, `role`, and `focusable`). +**Note:** Custom SVG icons are automatically wrapped in the [`wp.primitives.SVG` component](/packages/primitives/src/svg/) to add accessibility attributes (`aria-hidden`, `role`, and `focusable`). An object can also be passed as icon, in this case, icon, as specified above, should be included in the src property. diff --git a/docs/designers-developers/developers/block-api/block-templates.md b/docs/designers-developers/developers/block-api/block-templates.md index b2b384a96e211..49279a86595ed 100644 --- a/docs/designers-developers/developers/block-api/block-templates.md +++ b/docs/designers-developers/developers/block-api/block-templates.md @@ -37,7 +37,7 @@ The following example in JavaScript creates a new block using [InnerBlocks](/pac ```js const el = wp.element.createElement; const { registerBlockType } = wp.blocks; -const { InnerBlocks } = wp.editor; +const { InnerBlocks } = wp.blockEditor; const BLOCKS_TEMPLATE = [ [ 'core/image', {} ], diff --git a/docs/designers-developers/developers/data/data-core.md b/docs/designers-developers/developers/data/data-core.md index 8b1f9a41e3378..3d310092669ca 100644 --- a/docs/designers-developers/developers/data/data-core.md +++ b/docs/designers-developers/developers/data/data-core.md @@ -202,6 +202,21 @@ _Returns_ - `?Object`: The entity record's non transient edits. +# **getEntityRecordNoResolver** + +Returns the Entity's record object by key. Doesn't trigger a resolver nor requests the entity from the API if the entity record isn't available in the local state. + +_Parameters_ + +- _state_ `Object`: State tree +- _kind_ `string`: Entity kind. +- _name_ `string`: Entity name. +- _key_ `number`: Record's key + +_Returns_ + +- `?Object`: Record. + # **getEntityRecords** Returns the Entity's records. diff --git a/docs/designers-developers/developers/filters/block-filters.md b/docs/designers-developers/developers/filters/block-filters.md index 6b3939e6bb179..7a75fbae9d5ee 100644 --- a/docs/designers-developers/developers/filters/block-filters.md +++ b/docs/designers-developers/developers/filters/block-filters.md @@ -420,7 +420,7 @@ To set an SVG icon for the category shown in the previous example, add the follo ```js ( function() { var el = wp.element.createElement; - var SVG = wp.components.SVG; + var SVG = wp.primitives.SVG; var circle = el( 'circle', { cx: 10, cy: 10, r: 10, fill: 'red', stroke: 'blue', strokeWidth: '10' } ); var svgIcon = el( SVG, { width: 20, height: 20, viewBox: '0 0 20 20'}, circle); wp.blocks.updateCategory( 'my-category', { icon: svgIcon } ); diff --git a/docs/manifest-devhub.json b/docs/manifest-devhub.json index 50d6f02c8b9f1..673f97e93c74a 100644 --- a/docs/manifest-devhub.json +++ b/docs/manifest-devhub.json @@ -5,11 +5,41 @@ "markdown_source": "../docs/readme.md", "parent": null }, + { + "title": "Project Overview", + "slug": "principles", + "markdown_source": "../docs/contributors/principles.md", + "parent": null + }, { "title": "Key Concepts", "slug": "key-concepts", "markdown_source": "../docs/designers-developers/key-concepts.md", - "parent": null + "parent": "principles" + }, + { + "title": "Glossary", + "slug": "glossary", + "markdown_source": "../docs/designers-developers/glossary.md", + "parent": "principles" + }, + { + "title": "Frequently Asked Questions", + "slug": "faq", + "markdown_source": "../docs/designers-developers/faq.md", + "parent": "principles" + }, + { + "title": "History", + "slug": "history", + "markdown_source": "../docs/contributors/history.md", + "parent": "principles" + }, + { + "title": "Outreach", + "slug": "outreach", + "markdown_source": "../docs/contributors/outreach.md", + "parent": "principles" }, { "title": "Developer Documentation", @@ -234,35 +264,11 @@ "parent": "designers" }, { - "title": "Contributor Documentation", + "title": "Contributor Guide", "slug": "contributors", "markdown_source": "../docs/contributors/readme.md", "parent": null }, - { - "title": "Principles", - "slug": "principles", - "markdown_source": "../docs/contributors/principles.md", - "parent": "contributors" - }, - { - "title": "Design Principles & Vision", - "slug": "design", - "markdown_source": "../docs/contributors/design.md", - "parent": "contributors" - }, - { - "title": "Blocks are the Interface", - "slug": "the-block", - "markdown_source": "../docs/contributors/principles/the-block.md", - "parent": "design" - }, - { - "title": "Reference", - "slug": "reference", - "markdown_source": "../docs/contributors/reference.md", - "parent": "design" - }, { "title": "Developer Contributions", "slug": "develop", @@ -317,18 +323,30 @@ "markdown_source": "../docs/contributors/release.md", "parent": "develop" }, - { - "title": "Localizing Gutenberg Plugin", - "slug": "localizing", - "markdown_source": "../docs/contributors/localizing.md", - "parent": "develop" - }, { "title": "React Native based mobile Gutenberg", "slug": "native-mobile", "markdown_source": "../docs/contributors/native-mobile.md", "parent": "develop" }, + { + "title": "Design Principles & Vision", + "slug": "design", + "markdown_source": "../docs/contributors/design.md", + "parent": "contributors" + }, + { + "title": "Blocks are the Interface", + "slug": "the-block", + "markdown_source": "../docs/contributors/principles/the-block.md", + "parent": "design" + }, + { + "title": "Reference", + "slug": "reference", + "markdown_source": "../docs/contributors/reference.md", + "parent": "design" + }, { "title": "Documentation Contributions", "slug": "document", @@ -342,21 +360,9 @@ "parent": "document" }, { - "title": "History", - "slug": "history", - "markdown_source": "../docs/contributors/history.md", - "parent": "contributors" - }, - { - "title": "Glossary", - "slug": "glossary", - "markdown_source": "../docs/designers-developers/glossary.md", - "parent": "contributors" - }, - { - "title": "Frequently Asked Questions", - "slug": "faq", - "markdown_source": "../docs/designers-developers/faq.md", + "title": "Localizing Gutenberg Plugin", + "slug": "localizing", + "markdown_source": "../docs/contributors/localizing.md", "parent": "contributors" }, { @@ -365,12 +371,6 @@ "markdown_source": "../docs/contributors/repository-management.md", "parent": "contributors" }, - { - "title": "Outreach", - "slug": "outreach", - "markdown_source": "../docs/contributors/outreach.md", - "parent": "contributors" - }, { "title": "Tutorials", "slug": "tutorials", @@ -881,24 +881,6 @@ "markdown_source": "../packages/components/src/popover/README.md", "parent": "components" }, - { - "title": "BlockQuotation", - "slug": "block-quotation", - "markdown_source": "../packages/components/src/primitives/block-quotation/README.md", - "parent": "components" - }, - { - "title": "HorizontalRule", - "slug": "horizontal-rule", - "markdown_source": "../packages/components/src/primitives/horizontal-rule/README.md", - "parent": "components" - }, - { - "title": "Svg", - "slug": "svg", - "markdown_source": "../packages/components/src/primitives/svg/README.md", - "parent": "components" - }, { "title": "QueryControls", "slug": "query-controls", @@ -1205,6 +1187,12 @@ "markdown_source": "../packages/core-data/README.md", "parent": "packages" }, + { + "title": "@wordpress/create-block", + "slug": "packages-create-block", + "markdown_source": "../packages/create-block/README.md", + "parent": "packages" + }, { "title": "@wordpress/custom-templated-path-webpack-plugin", "slug": "packages-custom-templated-path-webpack-plugin", @@ -1343,6 +1331,12 @@ "markdown_source": "../packages/i18n/README.md", "parent": "packages" }, + { + "title": "@wordpress/icons", + "slug": "packages-icons", + "markdown_source": "../packages/icons/README.md", + "parent": "packages" + }, { "title": "@wordpress/is-shallow-equal", "slug": "packages-is-shallow-equal", @@ -1427,6 +1421,12 @@ "markdown_source": "../packages/postcss-themes/README.md", "parent": "packages" }, + { + "title": "@wordpress/primitives", + "slug": "packages-primitives", + "markdown_source": "../packages/primitives/README.md", + "parent": "packages" + }, { "title": "@wordpress/priority-queue", "slug": "packages-priority-queue", diff --git a/docs/readme.md b/docs/readme.md index 34b5fa9273b97..49efa7a070694 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -2,7 +2,7 @@ The Gutenberg project is transforming the way content is created on WordPress. A block editor was the first product launched creating a new methodology for working with content. -Th Block Editor handbook provides documentation for designers and developers on how to extend the editor, and also how you can start contributing to the project. For authors, writers, and users of the block editor see the [block editor support documentation](https://wordpress.org/support/article/wordpress-editor/). +The Block Editor handbook provides documentation for designers and developers on how to extend the editor, and also how you can start contributing to the project. For authors, writers, and users of the block editor see the [block editor support documentation](https://wordpress.org/support/article/wordpress-editor/). ![Gutenberg Demo](https://cldup.com/kZXGDcGPMU.gif) diff --git a/docs/rfc/block-registration.md b/docs/rfc/block-registration.md index 6c5f3ce2dfe0d..c1844e1646a42 100644 --- a/docs/rfc/block-registration.md +++ b/docs/rfc/block-registration.md @@ -173,7 +173,7 @@ Setting `parent` lets a block require that it is only available when nested with An icon property should be specified to make it easier to identify a block. These can be any of WordPress' Dashicons (slug serving also as a fallback in non-js contexts). -**Note:** It's also possible to override this property on the client-side with the source of the SVG element. In addition, this property can be defined with JavaScript as an object containing background and foreground colors. This colors will appear with the icon when they are applicable e.g.: in the inserter. Custom SVG icons are automatically wrapped in the [wp.components.SVG](/packages/components/src/primitives/svg/README.md) component to add accessibility attributes (aria-hidden, role, and focusable). +**Note:** It's also possible to override this property on the client-side with the source of the SVG element. In addition, this property can be defined with JavaScript as an object containing background and foreground colors. This colors will appear with the icon when they are applicable e.g.: in the inserter. Custom SVG icons are automatically wrapped in the [wp.primitives.SVG](/packages/primitives/src/svg/README.md) component to add accessibility attributes (aria-hidden, role, and focusable). ### Description diff --git a/docs/toc.json b/docs/toc.json index 463826057467d..21bb8cdbaf084 100644 --- a/docs/toc.json +++ b/docs/toc.json @@ -1,6 +1,13 @@ [ { "docs/readme.md": [] }, - { "docs/designers-developers/key-concepts.md": [] }, + + { "docs/contributors/principles.md": [ + { "docs/designers-developers/key-concepts.md": [] }, + { "docs/designers-developers/glossary.md": [] }, + { "docs/designers-developers/faq.md": [] }, + { "docs/contributors/history.md": [] }, + { "docs/contributors/outreach.md": [] } + ] }, { "docs/designers-developers/developers/README.md": [ { "docs/designers-developers/developers/block-api/README.md": [ { "docs/designers-developers/developers/block-api/block-registration.md": [] }, @@ -46,11 +53,6 @@ { "docs/designers-developers/designers/animation.md": [] } ] }, { "docs/contributors/readme.md": [ - { "docs/contributors/principles.md": [] }, - { "docs/contributors/design.md": [ - { "docs/contributors/principles/the-block.md": [] }, - { "docs/contributors/reference.md": [] } - ] }, { "docs/contributors/develop.md": [ { "docs/contributors/getting-started.md": [] }, { "docs/contributors/git-workflow.md": [] }, @@ -60,17 +62,17 @@ { "docs/contributors/scripts.md": [] }, { "docs/contributors/managing-packages.md": [] }, { "docs/contributors/release.md": [] }, - { "docs/contributors/localizing.md": [] }, { "docs/contributors/native-mobile.md": [] } ] }, + { "docs/contributors/design.md": [ + { "docs/contributors/principles/the-block.md": [] }, + { "docs/contributors/reference.md": [] } + ] }, { "docs/contributors/document.md": [ { "docs/contributors/copy-guide.md": [] } ] }, - { "docs/contributors/history.md": [] }, - { "docs/designers-developers/glossary.md": [] }, - { "docs/designers-developers/faq.md": [] }, - { "docs/contributors/repository-management.md": [] }, - { "docs/contributors/outreach.md": [] } + { "docs/contributors/localizing.md": [] }, + { "docs/contributors/repository-management.md": [] } ] }, { "docs/designers-developers/developers/tutorials/readme.md": [ { "docs/designers-developers/developers/tutorials/javascript/readme.md": [ @@ -90,7 +92,6 @@ { "docs/designers-developers/developers/tutorials/block-tutorial/creating-dynamic-blocks.md": [] }, { "docs/designers-developers/developers/tutorials/block-tutorial/generate-blocks-with-wp-cli.md": [] }, { "docs/designers-developers/developers/tutorials/block-tutorial/nested-blocks-inner-blocks.md": [] } - ] }, { "docs/designers-developers/developers/tutorials/metabox/readme.md": [ { "docs/designers-developers/developers/tutorials/metabox/meta-block-1-intro.md": [] }, diff --git a/docs/tool/are-data-files-unstaged.js b/docs/tool/are-data-files-unstaged.js index 5591de0ae6d62..38f659ec9bb0c 100644 --- a/docs/tool/are-data-files-unstaged.js +++ b/docs/tool/are-data-files-unstaged.js @@ -11,17 +11,30 @@ const execSync = require( 'child_process' ).execSync; */ const getPackages = require( './packages' ); -const getUnstagedFiles = () => execSync( 'git diff --name-only', { encoding: 'utf8' } ).split( '\n' ).filter( ( element ) => '' !== element ); -const readmeFiles = getPackages().map( ( [ packageName ] ) => `docs/designers-developers/developers/data/data-${ packageName.replace( '/', '-' ) }.md` ); -const unstagedReadmes = getUnstagedFiles().filter( ( element ) => readmeFiles.includes( element ) ); +const getUnstagedFiles = () => + execSync( 'git diff --name-only', { encoding: 'utf8' } ) + .split( '\n' ) + .filter( ( element ) => '' !== element ); +const readmeFiles = getPackages().map( + ( [ packageName ] ) => + `docs/designers-developers/developers/data/data-${ packageName.replace( + '/', + '-' + ) }.md` +); +const unstagedReadmes = getUnstagedFiles().filter( ( element ) => + readmeFiles.includes( element ) +); if ( unstagedReadmes.length > 0 ) { process.exitCode = 1; - process.stdout.write( chalk.red( - '\n', - 'Some API docs may be out of date:', - unstagedReadmes.toString(), - 'Either stage them or continue with --no-verify.', - '\n' - ) ); + process.stdout.write( + chalk.red( + '\n', + 'Some API docs may be out of date:', + unstagedReadmes.toString(), + 'Either stage them or continue with --no-verify.', + '\n' + ) + ); } diff --git a/docs/tool/index.js b/docs/tool/index.js index cd0e8223f9a6b..074162266c364 100644 --- a/docs/tool/index.js +++ b/docs/tool/index.js @@ -18,4 +18,7 @@ const manifestOutput = path.resolve( __dirname, '../manifest-devhub.json' ); execFileSync( 'node', [ join( __dirname, 'update-data.js' ) ] ); // Process TOC file and generate manifest handbook -fs.writeFileSync( manifestOutput, JSON.stringify( getRootManifest( tocFileInput ), undefined, '\t' ) ); +fs.writeFileSync( + manifestOutput, + JSON.stringify( getRootManifest( tocFileInput ), undefined, '\t' ) +); diff --git a/docs/tool/manifest.js b/docs/tool/manifest.js index adf9ff6488ff5..90c050388a0c5 100644 --- a/docs/tool/manifest.js +++ b/docs/tool/manifest.js @@ -85,9 +85,13 @@ function generateRootManifestFromTOCItems( items, parent = null ) { parent, } ); if ( Array.isArray( children ) && children.length ) { - pageItems = pageItems.concat( generateRootManifestFromTOCItems( children, slug ) ); + pageItems = pageItems.concat( + generateRootManifestFromTOCItems( children, slug ) + ); } else if ( children === '{{components}}' ) { - pageItems = pageItems.concat( getComponentManifest( componentPaths ) ); + pageItems = pageItems.concat( + getComponentManifest( componentPaths ) + ); } else if ( children === '{{packages}}' ) { pageItems = pageItems.concat( getPackageManifest( packagePaths ) ); } diff --git a/docs/tool/packages.js b/docs/tool/packages.js index 57d3d42b104b1..558a3e62c43c2 100644 --- a/docs/tool/packages.js +++ b/docs/tool/packages.js @@ -1,8 +1,11 @@ const packages = [ - [ 'core', { - 'Autogenerated actions': 'packages/core-data/src/actions.js', - 'Autogenerated selectors': 'packages/core-data/src/selectors.js', - } ], + [ + 'core', + { + 'Autogenerated actions': 'packages/core-data/src/actions.js', + 'Autogenerated selectors': 'packages/core-data/src/selectors.js', + }, + ], 'core/annotations', 'core/blocks', 'core/block-editor', @@ -17,10 +20,19 @@ const packages = [ module.exports = function() { return packages.map( ( entry ) => { if ( ! Array.isArray( entry ) ) { - entry = [ entry, { - 'Autogenerated actions': `packages/${ entry.replace( 'core/', '' ) }/src/store/actions.js`, - 'Autogenerated selectors': `packages/${ entry.replace( 'core/', '' ) }/src/store/selectors.js`, - } ]; + entry = [ + entry, + { + 'Autogenerated actions': `packages/${ entry.replace( + 'core/', + '' + ) }/src/store/actions.js`, + 'Autogenerated selectors': `packages/${ entry.replace( + 'core/', + '' + ) }/src/store/selectors.js`, + }, + ]; } return entry; } ); diff --git a/docs/tool/update-data.js b/docs/tool/update-data.js index 4a5d231e3c601..89f0fc614f1c5 100644 --- a/docs/tool/update-data.js +++ b/docs/tool/update-data.js @@ -17,15 +17,25 @@ getPackages().forEach( ( entry ) => { // until docgen provides a way to update many tokens at once, we need to make sure // the output file is updated before starting the second pass for the next token. const { status, stderr } = spawnSync( - join( __dirname, '..', '..', 'node_modules', '.bin', 'docgen' ).replace( / /g, '\\ ' ), + join( + __dirname, + '..', + '..', + 'node_modules', + '.bin', + 'docgen' + ).replace( / /g, '\\ ' ), [ target, - `--output docs/designers-developers/developers/data/data-${ packageName.replace( '/', '-' ) }.md`, + `--output docs/designers-developers/developers/data/data-${ packageName.replace( + '/', + '-' + ) }.md`, '--to-token', `--use-token "${ token }"`, '--ignore "/unstable|experimental/i"', ], - { shell: true }, + { shell: true } ); if ( status !== 0 ) { diff --git a/experimental-default-global-styles.json b/experimental-default-global-styles.json new file mode 100644 index 0000000000000..9a9259b9f6097 --- /dev/null +++ b/experimental-default-global-styles.json @@ -0,0 +1,9 @@ +{ + "global": { + "color": { + "primary": "#52accc", + "background": "white", + "text": "black" + } + } +} diff --git a/gutenberg.php b/gutenberg.php index 11fe1424bb0f4..24b06d606747f 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.3.0-rc.1 + * Version: 7.3.0 * Author: Gutenberg Team * Text Domain: gutenberg * diff --git a/lib/compat.php b/lib/compat.php index 3ab82002b2f92..cb85b3e3c72d7 100644 --- a/lib/compat.php +++ b/lib/compat.php @@ -44,6 +44,9 @@ function gutenberg_safe_style_css_column_flex_basis( $attr ) { */ function gutenberg_provide_render_callback_with_block_object( $pre_render, $block ) { global $post; + if ( 'core/navigation' !== $block['blockName'] ) { + return $pre_render; + } $source_block = $block; diff --git a/lib/global-styles.php b/lib/global-styles.php new file mode 100644 index 0000000000000..8074e454aeb8d --- /dev/null +++ b/lib/global-styles.php @@ -0,0 +1,131 @@ + $value ) { + $processed_key = str_replace( '/', '-', $key ); + $separator = $is_start ? '' : '--'; + $new_key = ( $prefix ? $prefix . $separator : '' ) . $processed_key; + + if ( is_array( $value ) ) { + $result = array_merge( + $result, + gutenberg_get_css_vars( $value, $new_key, false ) + ); + } else { + $result[ $new_key ] = $value; + } + } + return $result; +} + +/** + * Function responsible for enqueuing the style that define the global styles css variables. + */ +function gutenberg_enqueue_global_styles_assets() { + if ( ! locate_template( 'experimental-theme.json' ) ) { + return; + } + $default_global_styles_path = dirname( dirname( __FILE__ ) ) . '/experimental-default-global-styles.json'; + $default_global_styles = null; + + if ( file_exists( $default_global_styles_path ) ) { + $default_global_styles = json_decode( + file_get_contents( $default_global_styles_path ), + true + ); + } + + $theme_json_path = locate_template( 'experimental-theme.json' ); + $theme_json_global_styles = null; + if ( $theme_json_path ) { + $theme_json_global_styles = json_decode( + file_get_contents( $theme_json_path ), + true + ); + } + + // To-do: Load user customizations from a CPT. + $css_vars = array(); + foreach ( + array( + $default_global_styles, + $theme_json_global_styles, + ) as $global_styles_definition + ) { + if ( ! $global_styles_definition ) { + continue; + } + if ( isset( $global_styles_definition['global'] ) ) { + $css_vars = array_merge( + $css_vars, + gutenberg_get_css_vars( $global_styles_definition['global'], '--wp-' ) + ); + } + if ( isset( $global_styles_definition['blocks'] ) ) { + $css_vars = array_merge( + $css_vars, + gutenberg_get_css_vars( $global_styles_definition['blocks'], '--wp-block-' ) + ); + } + } + + if ( empty( $css_vars ) ) { + return; + } + + $inline_style = ":root {\n"; + foreach ( $css_vars as $var => $value ) { + $inline_style .= "\t" . $var . ': ' . $value . ";\n"; + } + $inline_style .= '}'; + + wp_register_style( 'global-styles', false, array(), true, true ); + wp_add_inline_style( 'global-styles', $inline_style ); + wp_enqueue_style( 'global-styles' ); +} +add_action( 'enqueue_block_assets', 'gutenberg_enqueue_global_styles_assets' ); + +/** + * Adds class wp-gs to the frontend body class if the theme defines a experimental-theme.json. + * + * @param array $classes Existing body classes. + * @return array The filtered array of body classes. + */ +function gutenberg_add_wp_gs_class_front_end( $classes ) { + if ( locate_template( 'experimental-theme.json' ) ) { + return array_merge( $classes, array( 'wp-gs' ) ); + } + return $classes; +} +add_filter( 'body_class', 'gutenberg_add_wp_gs_class_front_end' ); + + +/** + * Adds class wp-gs to the block-editor body class if the theme defines a experimental-theme.json. + * + * @param string $classes Existing body classes separated by space. + * @return string The filtered string of body classes. + */ +function gutenberg_add_wp_gs_class_editor( $classes ) { + global $current_screen; + if ( $current_screen->is_block_editor() && locate_template( 'experimental-theme.json' ) ) { + return $classes . ' wp-gs'; + } + return $classes; +} +add_filter( 'admin_body_class', 'gutenberg_add_wp_gs_class_editor' ); diff --git a/lib/load.php b/lib/load.php index 7076be29f6312..5b641a13278d1 100644 --- a/lib/load.php +++ b/lib/load.php @@ -64,3 +64,4 @@ function gutenberg_is_experiment_enabled( $name ) { require dirname( __FILE__ ) . '/experiments-page.php'; require dirname( __FILE__ ) . '/customizer.php'; require dirname( __FILE__ ) . '/edit-site-page.php'; +require dirname( __FILE__ ) . '/global-styles.php'; diff --git a/package-lock.json b/package-lock.json index 27a092565cfea..1d5a493bf8e4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "gutenberg", - "version": "7.3.0-rc.1", + "version": "7.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -21,40 +21,103 @@ } }, "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.8.3" } }, - "@babel/core": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz", - "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==", + "@babel/compat-data": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.1.tgz", + "integrity": "sha512-Z+6ZOXvyOWYxJ50BwxzdhRnRsGST8Y3jaZgxYig575lTjVSs3KtJnmESwZegg6e2Dn0td1eDhoWlp1wI4BTCPw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helpers": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.5", - "@babel/types": "^7.4.4", - "convert-source-map": "^1.1.0", + "browserslist": "^4.8.2", + "invariant": "^2.2.4", + "semver": "^5.5.0" + }, + "dependencies": { + "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" + } + }, + "caniuse-lite": { + "version": "1.0.30001022", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001022.tgz", + "integrity": "sha512-FjwPPtt/I07KyLPkBQ0g7/XuZg6oUkYBVnPHNj3VHJbOjmmJ/GdSo/GUY6MwINEQvjhP6WZVbX8Tvms8xh0D5A==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.340", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.340.tgz", + "integrity": "sha512-hRFBAglhcj5iVYH+o8QU0+XId1WGoc0VGowJB1cuJAt3exHGrivZvWeAO5BRgBZqwZtwxjm8a5MQeGoT/Su3ww==", + "dev": true + }, + "node-releases": { + "version": "1.1.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz", + "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@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.11", + "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { - "@babel/parser": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz", - "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==", - "dev": true + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } }, "debug": { "version": "4.1.1", @@ -66,9 +129,9 @@ } }, "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "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" @@ -89,236 +152,343 @@ } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "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.4.4", + "@babel/types": "^7.8.3", "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "lodash": "^4.17.13", + "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", - "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", - "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-builder-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", - "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz", + "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==", "dev": true, "requires": { - "@babel/types": "^7.3.0", + "@babel/types": "^7.8.3", "esutils": "^2.0.0" } }, "@babel/helper-call-delegate": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", - "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz", + "integrity": "sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.3.tgz", + "integrity": "sha512-JLylPCsFjhLN+6uBSSh3iYdxKdeO9MNmoY96PE/99d8kyBFaXLORtAVhqN6iHa+wtPeqxKLghDOZry0+Aiw9Tw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.1", + "browserslist": "^4.8.2", + "invariant": "^2.2.4", + "levenary": "^1.1.0", + "semver": "^5.5.0" + }, + "dependencies": { + "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" + } + }, + "caniuse-lite": { + "version": "1.0.30001022", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001022.tgz", + "integrity": "sha512-FjwPPtt/I07KyLPkBQ0g7/XuZg6oUkYBVnPHNj3VHJbOjmmJ/GdSo/GUY6MwINEQvjhP6WZVbX8Tvms8xh0D5A==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.340", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.340.tgz", + "integrity": "sha512-hRFBAglhcj5iVYH+o8QU0+XId1WGoc0VGowJB1cuJAt3exHGrivZvWeAO5BRgBZqwZtwxjm8a5MQeGoT/Su3ww==", + "dev": true + }, + "node-releases": { + "version": "1.1.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz", + "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.5.0.tgz", - "integrity": "sha512-EAoMc3hE5vE5LNhMqDOwB1usHvmRjCDAnH8CD4PVkX9/Yr3W/tcz8xE8QvdZxfsFBDICwZnF2UTHIqslRpvxmA==", + "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.1.0", - "@babel/helper-member-expression-to-functions": "^7.0.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.4", - "@babel/helper-split-export-declaration": "^7.4.4" + "@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-create-regexp-features-plugin": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz", + "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==", + "dev": true, + "requires": { + "@babel/helper-regex": "^7.8.3", + "regexpu-core": "^4.6.0" + }, + "dependencies": { + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + } + } + }, + "@babel/helper-define-map": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", + "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", - "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", "dev": true, "requires": { - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "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.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@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.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "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.0.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-hoist-variables": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", - "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.8.3" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", - "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "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.0.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-module-imports": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", - "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-module-transforms": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz", - "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", + "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/template": "^7.4.4", - "@babel/types": "^7.4.4", - "lodash": "^4.17.11" + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" } }, "@babel/helper-optimise-call-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", - "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "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.0.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "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-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz", - "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", + "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.13" } }, "@babel/helper-remap-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", - "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-wrap-function": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-replace-supers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz", - "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==", + "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.0.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@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-simple-access": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", - "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "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.1.0", - "@babel/types": "^7.0.0" + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "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.4.4" + "@babel/types": "^7.8.3" } }, "@babel/helper-wrap-function": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", - "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", + "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/template": "^7.1.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.2.0" + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", + "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.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", @@ -326,831 +496,830 @@ } }, "@babel/parser": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", - "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", + "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-external-helpers": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.2.0.tgz", - "integrity": "sha512-QFmtcCShFkyAsNtdCM3lJPmRe1iB+vPZymlB4LnDIKEBj2yKQLQKtoxXxJ8ePT5fwMl4QGg303p4mB0UsSI2/g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.8.3.tgz", + "integrity": "sha512-mx0WXDDiIl5DwzMtzWGRSPugXi9BxROS05GQrhLNbEamhBiicgn994ibwkyiBH+6png7bm/yA7AUsvHyCXi4Vw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", - "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0", - "@babel/plugin-syntax-async-generators": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.0.tgz", - "integrity": "sha512-9L/JfPCT+kShiiTTzcnBJ8cOwdKVmlC1RcCf9F0F9tERVrM4iWtWnXtjWCRqNm2la2BxO1MPArWNsU9zsSJWSQ==", + "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.5.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" } }, "@babel/plugin-proposal-export-default-from": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.5.2.tgz", - "integrity": "sha512-wr9Itk05L1/wyyZKVEmXWCdcsp/e185WUNl6AfYZeEKYaUPPvHXRDqO5K1VH7/UamYqGJowFRuCv30aDYZawsg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.8.3.tgz", + "integrity": "sha512-PYtv2S2OdCdp7GSPDg5ndGZFm9DmWFvuLoS5nBxZCgOBggluLnhTScspJxng96alHQzPyrrHxvC9/w4bFuspeA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-export-default-from": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-export-default-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", - "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-json-strings": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.4.4.tgz", - "integrity": "sha512-Amph7Epui1Dh/xxUxS2+K22/MUi6+6JVTvy3P58tja3B6yKTSjwwx0/d83rF7551D6PVSSoplQb8GCwqec7HRw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz", - "integrity": "sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g==", + "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.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.2.0.tgz", - "integrity": "sha512-ea3Q6edZC/55wEBVZAEz42v528VulyO0eir+7uky/sT4XRcdkWJcFi1aPtitTlwUzGnECWJNExWww1SStt+yWw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz", + "integrity": "sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", - "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz", + "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-async-generators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", - "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-class-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.2.0.tgz", - "integrity": "sha512-UxYaGXYQ7rrKJS/PxIKRkv3exi05oH7rokBAsmCSsCxz1sVPZ7Fu6FzKoGgUvmY+0YgSkYHgUoCh5R5bCNBQlw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz", + "integrity": "sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-export-default-from": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.2.0.tgz", - "integrity": "sha512-c7nqUnNST97BWPtoe+Ssi+fJukc9P9/JMZ71IOMNQWza2E+Psrd46N6AEvtw6pqK+gt7ChjXyrw4SPDO79f3Lw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.8.3.tgz", + "integrity": "sha512-a1qnnsr73KLNIQcQlcQ4ZHxqqfBKM6iNQZW2OMTyxNbA2WC7SHWHtGVpFzWtQAuS2pspkWVzdEBXXx8Ik0Za4w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-flow": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz", - "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz", + "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-json-strings": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", - "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-jsx": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", - "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", + "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.2.0.tgz", - "integrity": "sha512-lRCEaKE+LTxDQtgbYajI04ddt6WW0WJq57xqkAZ+s11h4YgfRHhVA/Y2VhfPzzFD4qeLHWg32DMp9HooY4Kqlg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "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.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", - "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.2.0.tgz", - "integrity": "sha512-HtGCtvp5Uq/jH/WNUPkK6b7rufnCPLLlDAFN7cmACoIjaOOiXxUt3SswU5loHqrhtqTsa/WoLQ1OQ1AGuZqaWA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-typescript": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz", - "integrity": "sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", + "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", - "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz", - "integrity": "sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-remap-async-to-generator": "^7.1.0" + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", - "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz", - "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "lodash": "^4.17.11" + "@babel/helper-plugin-utils": "^7.8.3", + "lodash": "^4.17.13" } }, "@babel/plugin-transform-classes": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz", - "integrity": "sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.5.5", - "@babel/helper-split-export-declaration": "^7.4.4", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz", + "integrity": "sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^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", "globals": "^11.1.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", - "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", - "dev": true, - "requires": { - "@babel/types": "^7.5.5", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-define-map": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz", - "integrity": "sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.5.5", - "lodash": "^4.17.13" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz", - "integrity": "sha512-5qZ3D1uMclSNqYcXqiHoA0meVdv+xUEex9em2fqMnrk/scphGlGgg66zjMrPJESPwrFJ6sbfFQYUSa0Mz7FabA==", - "dev": true, - "requires": { - "@babel/types": "^7.5.5" - } - }, - "@babel/helper-replace-supers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz", - "integrity": "sha512-XvRFWrNnlsow2u7jXDuH4jDDctkxbS7gXssrP4q2nUD606ukXHRvydj346wmNg+zAgpFx4MWf4+usfC93bElJg==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.5.5", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" - } - }, - "@babel/parser": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", - "dev": true - }, - "@babel/traverse": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", - "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.5.5", - "@babel/types": "^7.5.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", - "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "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" - } - }, "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 - }, - "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 } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", - "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-destructuring": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz", - "integrity": "sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz", + "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", - "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", - "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", - "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.3.4.tgz", - "integrity": "sha512-PmQC9R7DwpBFA+7ATKMyzViz3zCaMNouzZMPZN2K5PnbBbtL3AXFYTkDk+Hey5crQq2A90UG5Uthz0mel+XZrA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.3.tgz", + "integrity": "sha512-g/6WTWG/xbdd2exBBzMfygjX/zw4eyNC4X8pRaq7aRHRoDUCzAIu3kGYIXviOv8BjCuWm8vDBwjHcjiRNgXrPA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-flow": "^7.8.3" } }, "@babel/plugin-transform-for-of": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", - "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.3.tgz", + "integrity": "sha512-ZjXznLNTxhpf4Q5q3x1NsngzGA38t9naWH8Gt+0qYZEJAcvPI9waSStSh56u19Ofjr7QmD0wUsQ8hw8s/p1VnA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-function-name": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", - "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", - "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", - "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", - "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz", + "integrity": "sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz", - "integrity": "sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz", + "integrity": "sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-simple-access": "^7.1.0" + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz", - "integrity": "sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz", + "integrity": "sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.4.4", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", - "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz", + "integrity": "sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.1.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-module-transforms": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" } }, "@babel/plugin-transform-new-target": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", - "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-object-assign": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.2.0.tgz", - "integrity": "sha512-nmE55cZBPFgUktbF2OuoZgPRadfxosLOpSgzEPYotKSls9J4pEPcembi8r78RU37Rph6UApCpNmsQA4QMWK9Ng==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.8.3.tgz", + "integrity": "sha512-i3LuN8tPDqUCRFu3dkzF2r1Nx0jp4scxtm7JxtIqI9he9Vk20YD+/zshdzR9JLsoBMlJlNR82a62vQExNEVx/Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-object-super": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", - "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", + "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.1.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" } }, "@babel/plugin-transform-parameters": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", - "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.3.tgz", + "integrity": "sha512-/pqngtGb54JwMBZ6S/D3XYylQDFtGjWrnoCF4gXZOUpFV/ujbxnoNGNvDGu6doFWRPBveE72qTx/RRU44j5I/Q==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.4.4", - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-call-delegate": "^7.8.3", + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-property-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", - "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.6.3.tgz", - "integrity": "sha512-1/YogSSU7Tby9rq2VCmhuRg+6pxsHy2rI7w/oo8RKoBt6uBUFG+mk6x13kK+FY1/ggN92HAfg7ADd1v1+NCOKg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.8.3.tgz", + "integrity": "sha512-glrzN2U+egwRfkNFtL34xIBYTxbbUF2qJTP8HD3qETBBqzAWSeNB821X0GjU06+dNpq/UyCIjI72FmGE5NNkQQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@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/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" + } + } } }, "@babel/plugin-transform-react-display-name": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", - "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", + "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", - "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz", + "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==", "dev": true, "requires": { - "@babel/helper-builder-react-jsx": "^7.3.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "@babel/helper-builder-react-jsx": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" } }, "@babel/plugin-transform-react-jsx-self": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", - "integrity": "sha512-v6S5L/myicZEy+jr6ielB0OR8h+EH/1QFx/YJ7c7Ua+7lqsjj/vW6fD5FR9hB/6y7mGbfT4vAURn3xqBxsUcdg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz", + "integrity": "sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" + }, + "dependencies": { + "@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/plugin-syntax-jsx": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", + "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + } } }, "@babel/plugin-transform-react-jsx-source": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.5.0.tgz", - "integrity": "sha512-58Q+Jsy4IDCZx7kqEZuSDdam/1oW8OdDX8f+Loo6xyxdfg1yF0GE2XNJQSTZCaMol93+FBzpWiPEwtbMloAcPg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz", + "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" } }, "@babel/plugin-transform-regenerator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.4.tgz", - "integrity": "sha512-Zz3w+pX1SI0KMIiqshFZkwnVGUhDZzpX2vtPzfJBKQQq8WsP/Xy9DNdELWivxcKOCX/Pywge4SiEaPaLtoDT4g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz", + "integrity": "sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==", "dev": true, "requires": { - "regenerator-transform": "^0.13.4" + "regenerator-transform": "^0.14.0" + }, + "dependencies": { + "regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "dev": true, + "requires": { + "private": "^0.1.6" + } + } } }, "@babel/plugin-transform-reserved-words": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", - "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-runtime": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.4.tgz", - "integrity": "sha512-aMVojEjPszvau3NRg+TIH14ynZLvPewH4xhlCW1w6A3rkxTS1m4uwzRclYR9oS+rl/dr+kT+pzbfHuAWP/lc7Q==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz", + "integrity": "sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", "resolve": "^1.8.1", "semver": "^5.5.1" }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", - "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-spread": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", - "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", - "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" } }, "@babel/plugin-transform-template-literals": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", - "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", - "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.3.tgz", + "integrity": "sha512-3TrkKd4LPqm4jHs6nPtSDI/SV9Cm5PRJkHLUgTcqRQQTMAZ44ZaAdDZJtvWFSaRcvT0a1rTmJ5ZA5tDKjleF3g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-typescript": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.5.2.tgz", - "integrity": "sha512-r4zJOMbKY5puETm8+cIpaa0RQZG/sSASW1u0pj8qYklcERgVIbxVbP2wyJA7zI1//h7lEagQmXi9IL9iI5rfsA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz", + "integrity": "sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.5.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-typescript": "^7.2.0" + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-typescript": "^7.8.3" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", - "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.4.4", - "regexpu-core": "^4.5.4" + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/preset-env": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.5.tgz", - "integrity": "sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.4.4", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.4.4", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.4.4", - "@babel/plugin-transform-classes": "^7.4.4", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/plugin-transform-duplicate-keys": "^7.2.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.4", - "@babel/plugin-transform-function-name": "^7.4.4", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.2.0", - "@babel/plugin-transform-modules-commonjs": "^7.4.4", - "@babel/plugin-transform-modules-systemjs": "^7.4.4", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.5", - "@babel/plugin-transform-new-target": "^7.4.4", - "@babel/plugin-transform-object-super": "^7.2.0", - "@babel/plugin-transform-parameters": "^7.4.4", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.5", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.4.4", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "browserslist": "^4.6.0", - "core-js-compat": "^3.1.1", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.3.tgz", + "integrity": "sha512-Rs4RPL2KjSLSE2mWAx5/iCH+GC1ikKdxPrhnRS6PfFVaiZeom22VFKN4X8ZthyN61kAaR05tfXTbCvatl9WIQg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.0", + "@babel/helper-compilation-targets": "^7.8.3", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.3", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.3", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@babel/plugin-transform-modules-systemjs": "^7.8.3", + "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.3", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.3", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.3", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/types": "^7.8.3", + "browserslist": "^4.8.2", + "core-js-compat": "^3.6.2", "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", + "levenary": "^1.1.0", "semver": "^5.5.0" }, "dependencies": { - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.2.tgz", - "integrity": "sha512-xBdB+XOs+lgbZc2/4F5BVDVcDNS4tcSKQc96KmlqLEAwz6tpYPEvPdmDfvVG0Ssn8lAhronaRs6Z6KSexIpK5g==", + "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": { - "regexpu-core": "^4.6.0" + "caniuse-lite": "^1.0.30001022", + "electron-to-chromium": "^1.3.338", + "node-releases": "^1.1.46" } }, - "@babel/plugin-transform-regenerator": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", - "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", - "dev": true, - "requires": { - "regenerator-transform": "^0.14.0" - } + "caniuse-lite": { + "version": "1.0.30001022", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001022.tgz", + "integrity": "sha512-FjwPPtt/I07KyLPkBQ0g7/XuZg6oUkYBVnPHNj3VHJbOjmmJ/GdSo/GUY6MwINEQvjhP6WZVbX8Tvms8xh0D5A==", + "dev": true }, - "regenerate-unicode-properties": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", - "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "core-js-compat": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", + "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", "dev": true, "requires": { - "regenerate": "^1.4.0" + "browserslist": "^4.8.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } } }, - "regenerator-transform": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", - "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", - "dev": true, - "requires": { - "private": "^0.1.6" - } + "electron-to-chromium": { + "version": "1.3.340", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.340.tgz", + "integrity": "sha512-hRFBAglhcj5iVYH+o8QU0+XId1WGoc0VGowJB1cuJAt3exHGrivZvWeAO5BRgBZqwZtwxjm8a5MQeGoT/Su3ww==", + "dev": true }, - "regexpu-core": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", - "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "node-releases": { + "version": "1.1.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz", + "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==", "dev": true, "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.1.0", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "semver": { @@ -1162,169 +1331,237 @@ } }, "@babel/preset-flow": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.8.0.tgz", - "integrity": "sha512-z10t7ggJjoqdvcOrnXA16PeDhykL+FeJHg8nYg3D+QuKyMyI433o8oNJO+jFrfLa1aQ9ps2eG2QA5I7FWlJlOA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.8.3.tgz", + "integrity": "sha512-iCXFk+T4demnq+dNLLvlGOgvYF6sPZ/hS1EmswugOqh1Ysp2vuiqJzpgsnp5rW8+6dLJT/0CXDzye28ZH6BAfQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-transform-flow-strip-types": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-transform-flow-strip-types": "^7.8.3" }, "dependencies": { "@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==", + "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/plugin-syntax-flow": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.0.tgz", - "integrity": "sha512-MDK9WdjDccrxzz+4sthpSDnqdf5McJwTtfBYGitOweC/j0Zg6e8wHmP4RGLTeyGYe/IySoRgKC5hvSm6ddrNRw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz", + "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.0.tgz", - "integrity": "sha512-yKcww1yWfAHWk4R7OeU0YnrWEIrSodFr1TibfkrP8t0RDXSyGIDnahz8lzXagNT/XlZC3sWpsYXhty9xAU3ULQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.8.3.tgz", + "integrity": "sha512-g/6WTWG/xbdd2exBBzMfygjX/zw4eyNC4X8pRaq7aRHRoDUCzAIu3kGYIXviOv8BjCuWm8vDBwjHcjiRNgXrPA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-syntax-flow": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-flow": "^7.8.3" } } } }, "@babel/preset-react": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.6.3.tgz", - "integrity": "sha512-07yQhmkZmRAfwREYIQgW0HEwMY9GBJVuPY4Q12UC72AbfaawuupVWa8zQs2tlL+yun45Nv/1KreII/0PLfEsgA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz", + "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-transform-react-display-name": "^7.8.3", + "@babel/plugin-transform-react-jsx": "^7.8.3", + "@babel/plugin-transform-react-jsx-self": "^7.8.3", + "@babel/plugin-transform-react-jsx-source": "^7.8.3" + }, + "dependencies": { + "@babel/helper-builder-react-jsx": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz", + "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3", + "esutils": "^2.0.0" + } + }, + "@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/plugin-syntax-jsx": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", + "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", + "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz", + "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz", + "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3" + } + }, + "@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" + } + } } }, "@babel/preset-typescript": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.8.0.tgz", - "integrity": "sha512-mvu4OmrLK6qRPiXlOkE4yOeOszHzk9itwe6aiMN0RL9Bc5uAwAotVTy4kKl17evLMd1WsvWT1O3mZltynuqxXg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.8.3.tgz", + "integrity": "sha512-qee5LgPGui9zQ0jR1TeU5/fP9L+ovoArklEqY12ek8P/wV5ZeM/VYSQYwICeoT6FfpJTekG9Ilay5PhwsOpMHA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-transform-typescript": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-transform-typescript": "^7.8.3" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "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.0" + "@babel/highlight": "^7.8.3" } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "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.0", + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.0.tgz", - "integrity": "sha512-ctCvqYBTlwEl2uF4hCxE0cd/sSw71Zfag0jKa39y4HDLh0BQ4PVBX1384Ye8GqrEZ69xgLp9fwPbv3GgIDDF2Q==", + "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.0", - "@babel/helper-member-expression-to-functions": "^7.8.0", - "@babel/helper-optimise-call-expression": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-replace-supers": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "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.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "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.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.0.tgz", - "integrity": "sha512-0m1QabGrdXuoxX/g+KOAGndoHwskC70WweqHRQyCsaO67KOEELYh4ECcGw6ZGKjDKa5Y7SW4Qbhw6ly4Fah/jQ==", + "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.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-optimise-call-expression": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.0.tgz", - "integrity": "sha512-aiJt1m+K57y0n10fTw+QXcCXzmpkG+o+NoQmAZqlZPstkTE0PZT+Z27QSd/6Gf00nuXJQO4NiJ0/YagSW5kC2A==", + "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.0" + "@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==", + "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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.0.tgz", - "integrity": "sha512-R2CyorW4tcO3YzdkClLpt6MS84G+tPkOi0MmiCn1bvYVnmDpdl9R15XOi3NQW2mhOAEeBnuQ4g1Bh7pT2sX8fg==", + "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.0", - "@babel/helper-optimise-call-expression": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "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.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "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", @@ -1333,63 +1570,63 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "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-typescript": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.0.tgz", - "integrity": "sha512-LrvVrabb993Ve5fzXsyEkfYCuhpXBwsUFjlvgD8UmXXg3r/8/ceooSdRvjdmtPXXz+lHaqZHZooV1jMWer2qkA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", + "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-transform-typescript": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.0.tgz", - "integrity": "sha512-RhMZnNWcyvX+rM6mk888MaeoVl5pGfmYP3as709n4+0d15SRedz4r+LPRg2a9s4z+t+DM+gy8uz/rmM3Cb8JBw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz", + "integrity": "sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/plugin-syntax-typescript": "^7.8.0" + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-typescript": "^7.8.3" } }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "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.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "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.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "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", @@ -1421,17 +1658,16 @@ } }, "@babel/register": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.4.4.tgz", - "integrity": "sha512-sn51H88GRa00+ZoMqCVgOphmswG4b7mhf9VOB0LUBAieykq2GnRFerlN+JQkO/ntT7wz4jaHNSRPg9IdMPEUkA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.8.3.tgz", + "integrity": "sha512-t7UqebaWwo9nXWClIPLPloa5pN33A2leVs8Hf0e9g9YwUP8/H9NeR7DJU+4CXo23QtjChQv5a3DjEtT83ih1rg==", "dev": true, "requires": { - "core-js": "^3.0.0", "find-cache-dir": "^2.0.0", - "lodash": "^4.17.11", - "mkdirp": "^0.5.1", + "lodash": "^4.17.13", + "make-dir": "^2.1.0", "pirates": "^4.0.0", - "source-map-support": "^0.5.9" + "source-map-support": "^0.5.16" }, "dependencies": { "find-cache-dir": { @@ -1475,9 +1711,9 @@ } }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -1514,25 +1750,41 @@ } }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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 + }, + "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" + } } } }, "@babel/runtime": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.5.4.tgz", - "integrity": "sha512-Na84uwyImZZc3FKf4aUF1tysApzwf3p2yuFBIyBfbzT5glzKTdvYI4KVW4kcgjrzoGUjC7w3YyCHcJKaRxsr2Q==", + "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" } }, "@babel/runtime-corejs3": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.4.5.tgz", - "integrity": "sha512-yxHpUObdpx4zbuLJOHIZkw43E4NbWGsGH+85kRUj+VEcdtjlqI0vDcAja9mwOHqD7/4vCZp69q6eztz/sFDibQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.8.3.tgz", + "integrity": "sha512-lrIU4aVbmlM/wQPzhEvzvNJskKyYptuXb0fGC0lTQTupTOYtR2Vqbu6/jf8vTr4M8Wt1nIzxVrSvPI5qESa/xA==", "dev": true, "requires": { "core-js-pure": "^3.0.0", @@ -1540,39 +1792,33 @@ } }, "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "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.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "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.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", + "@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.11" + "lodash": "^4.17.13" }, "dependencies": { - "@babel/parser": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.2.tgz", - "integrity": "sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg==", - "dev": true - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -1597,12 +1843,12 @@ } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "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==", "requires": { "esutils": "^2.0.2", - "lodash": "^4.17.11", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, @@ -1685,13 +1931,47 @@ } }, "@emotion/css": { - "version": "10.0.22", - "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.22.tgz", - "integrity": "sha512-8phfa5mC/OadBTmGpMpwykIVH0gFCbUoO684LUkyixPq4F1Wwri7fK5Xlm8lURNBrd2TuvTbPUGxFsGxF9UacA==", + "version": "10.0.27", + "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz", + "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", "requires": { - "@emotion/serialize": "^0.11.12", - "@emotion/utils": "0.11.2", - "babel-plugin-emotion": "^10.0.22" + "@emotion/serialize": "^0.11.15", + "@emotion/utils": "0.11.3", + "babel-plugin-emotion": "^10.0.27" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.4.tgz", + "integrity": "sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==" + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "@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==" + }, + "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": { @@ -1713,31 +1993,53 @@ "integrity": "sha512-2Md9mH6mvo+ygq1trTeVp2uzAKwE2P7In0cRpD/M9Q70aH8L+rxMLbb3JCN2JoSWsV2O+DdFjfbbXoMoLBczow==" }, "@emotion/native": { - "version": "10.0.22", - "resolved": "https://registry.npmjs.org/@emotion/native/-/native-10.0.22.tgz", - "integrity": "sha512-4Hlb2KSVGTqwQjHIgojdYUPlf660MpVS8kh77EcrOe/MUmKtqNvZVFp/MAdejfX/c0RyzmiZq19WdPQLaWm/LQ==", + "version": "10.0.27", + "resolved": "https://registry.npmjs.org/@emotion/native/-/native-10.0.27.tgz", + "integrity": "sha512-3qxR2XFizGfABKKbX9kAYc0PHhKuCEuyxshoq3TaMEbi9asWHdQVChg32ULpblm4XAf9oxaitAU7J9SfdwFxtw==", "requires": { - "@emotion/primitives-core": "10.0.22" + "@emotion/primitives-core": "10.0.27" } }, "@emotion/primitives-core": { - "version": "10.0.22", - "resolved": "https://registry.npmjs.org/@emotion/primitives-core/-/primitives-core-10.0.22.tgz", - "integrity": "sha512-T2zPYmOabfm2DzG6LMcNRfBSFyBGwa5yHaM5pGhFpwufd7PiSirI7LuyUpFNQyHRn3XvgfSPIWynRRWOKduM6g==", + "version": "10.0.27", + "resolved": "https://registry.npmjs.org/@emotion/primitives-core/-/primitives-core-10.0.27.tgz", + "integrity": "sha512-fRBEDNPSFFOrBJ0OcheuElayrNTNdLF9DzMxtL0sFgsCFvvadlzwJHhJMSwEJuxwARm9GhVLr1p8G8JGkK98lQ==", "requires": { "css-to-react-native": "^2.2.1" } }, "@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", + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.15.tgz", + "integrity": "sha512-YE+qnrmGwyR+XB5j7Bi+0GT1JWsdcjM/d4POu+TXkcnrRs4RFCCsi3d/Ebf+wSStHqAlTT2+dfd+b9N9EO2KBg==", + "requires": { + "@emotion/hash": "0.7.4", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", "csstype": "^2.5.7" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.4.tgz", + "integrity": "sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==" + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "@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/sheet": { @@ -2256,138 +2558,41 @@ } }, "@jest/core": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.7.1.tgz", - "integrity": "sha512-ivlZ8HX/FOASfHcb5DJpSPFps8ydfUYzLZfgFFqjkLijYysnIEOieg72YRhO4ZUB32xu40hsSMmaw+IGYeKONA==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.7.1", - "@jest/test-result": "^24.7.1", - "@jest/transform": "^24.7.1", - "@jest/types": "^24.7.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.7.0", - "jest-config": "^24.7.1", - "jest-haste-map": "^24.7.1", - "jest-message-util": "^24.7.1", - "jest-regex-util": "^24.3.0", - "jest-resolve-dependencies": "^24.7.1", - "jest-runner": "^24.7.1", - "jest-runtime": "^24.7.1", - "jest-snapshot": "^24.7.1", - "jest-util": "^24.7.1", - "jest-validate": "^24.7.0", - "jest-watcher": "^24.7.1", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "strip-ansi": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "@jest/environment": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.7.1.tgz", - "integrity": "sha512-wmcTTYc4/KqA+U5h1zQd5FXXynfa7VGP2NfF+c6QeGJ7c+2nStgh65RQWNX62SC716dTtqheTRrZl0j+54oGHw==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.7.1", - "@jest/transform": "^24.7.1", - "@jest/types": "^24.7.0", - "jest-mock": "^24.7.0" - } - }, - "@jest/fake-timers": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.7.1.tgz", - "integrity": "sha512-4vSQJDKfR2jScOe12L9282uiwuwQv9Lk7mgrCSZHA9evB9efB/qx8i0KJxsAKtp8fgJYBJdYY7ZU6u3F4/pyjA==", - "dev": true, - "requires": { - "@jest/types": "^24.7.0", - "jest-message-util": "^24.7.1", - "jest-mock": "^24.7.0" - } - }, - "@jest/reporters": { "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", "dev": true, "requires": { - "@jest/environment": "^24.9.0", + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.9.0", "@jest/test-result": "^24.9.0", "@jest/transform": "^24.9.0", "@jest/types": "^24.9.0", + "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.9.0", + "jest-config": "^24.9.0", "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.3.0", "jest-resolve": "^24.9.0", + "jest-resolve-dependencies": "^24.9.0", + "jest-runner": "^24.9.0", "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", + "jest-validate": "^24.9.0", + "jest-watcher": "^24.9.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" + "strip-ansi": "^5.0.0" }, "dependencies": { - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "dev": true, - "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" - } - }, - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, "@jest/fake-timers": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", @@ -2419,42 +2624,19 @@ "@jest/console": "^24.9.0", "@jest/types": "^24.9.0", "@types/istanbul-lib-coverage": "^2.0.0" - } - }, - "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", - "dev": true, - "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" + }, + "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + } } }, "@jest/types": { @@ -2469,9 +2651,9 @@ } }, "@types/yargs": { - "version": "13.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", - "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.5.tgz", + "integrity": "sha512-CF/+sxTO7FOwbIRL4wMv0ZYLCRfMid2HQpzDRyViH7kSpfoAFiMdGqKIxb1PxWfjtQXQhnQuD33lvRHNwr809Q==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -2483,57 +2665,12 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", - "dev": true, - "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", - "dev": true, - "requires": { - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", - "dev": true, - "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" - } - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, "diff-sequences": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", @@ -2552,38 +2689,22 @@ "jest-matcher-utils": "^24.9.0", "jest-message-util": "^24.9.0", "jest-regex-util": "^24.9.0" + }, + "dependencies": { + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "dev": true + } } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "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 }, - "istanbul-reports": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", - "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", - "dev": true, - "requires": { - "handlebars": "^4.1.2" - } - }, "jest-config": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", @@ -2621,46 +2742,6 @@ "pretty-format": "^24.9.0" } }, - "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" - } - }, - "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" - } - }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - } - }, "jest-get-type": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", @@ -2685,52 +2766,6 @@ "micromatch": "^3.1.10", "sane": "^4.0.3", "walker": "^1.0.7" - }, - "dependencies": { - "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" - } - } - } - }, - "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.9.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" - } - }, - "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", - "dev": true, - "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" } }, "jest-matcher-utils": { @@ -2770,12 +2805,6 @@ "@jest/types": "^24.9.0" } }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, "jest-resolve": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", @@ -2789,80 +2818,6 @@ "realpath-native": "^1.1.0" } }, - "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" - } - }, - "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, "jest-serializer": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", @@ -2908,6 +2863,19 @@ "mkdirp": "^0.5.1", "slash": "^2.0.0", "source-map": "^0.6.0" + }, + "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + } } }, "jest-validate": { @@ -2924,73 +2892,28 @@ "pretty-format": "^24.9.0" } }, + "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" + } + }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, "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 }, - "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", - "dev": true, - "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" - }, - "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.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": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, "pretty-format": { "version": "24.9.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", @@ -3003,12 +2926,6 @@ "react-is": "^16.8.4" } }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -3027,17 +2944,6 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -3047,12 +2953,6 @@ "ansi-regex": "^4.1.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", @@ -3061,70 +2961,120 @@ "requires": { "has-flag": "^3.0.0" } + } + } + }, + "@jest/environment": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0" + }, + "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.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==", + "@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": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" } }, - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.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==", - "dev": true + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } }, - "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "@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": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" } - } - } - }, - "@jest/source-map": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", - "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "dependencies": { + }, + "@types/yargs": { + "version": "13.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "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 + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, "source-map": { @@ -3135,58 +3085,245 @@ } } }, - "@jest/test-result": { + "@jest/fake-timers": { "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.7.1.tgz", - "integrity": "sha512-3U7wITxstdEc2HMfBX7Yx3JZgiNBubwDqQMh+BXmZXHa3G13YWF3p6cK+5g0hGkN3iufg/vGPl3hLxQXD74Npg==", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.7.1.tgz", + "integrity": "sha512-4vSQJDKfR2jScOe12L9282uiwuwQv9Lk7mgrCSZHA9evB9efB/qx8i0KJxsAKtp8fgJYBJdYY7ZU6u3F4/pyjA==", "dev": true, "requires": { - "@jest/console": "^24.7.1", "@jest/types": "^24.7.0", - "@types/istanbul-lib-coverage": "^2.0.0" - } - }, - "@jest/test-sequencer": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.7.1.tgz", - "integrity": "sha512-84HQkCpVZI/G1zq53gHJvSmhUer4aMYp9tTaffW28Ih5OxfCg8hGr3nTSbL1OhVDRrFZwvF+/R9gY6JRkDUpUA==", - "dev": true, - "requires": { - "@jest/test-result": "^24.7.1", - "jest-haste-map": "^24.7.1", - "jest-runner": "^24.7.1", - "jest-runtime": "^24.7.1" + "jest-message-util": "^24.7.1", + "jest-mock": "^24.7.0" } }, - "@jest/transform": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.7.1.tgz", - "integrity": "sha512-EsOUqP9ULuJ66IkZQhI5LufCHlTbi7hrcllRMUEV/tOgqBVQi93+9qEvkX0n8mYpVXQ8VjwmICeRgg58mrtIEw==", + "@jest/reporters": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.7.0", - "babel-plugin-istanbul": "^5.1.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.7.1", - "jest-regex-util": "^24.3.0", - "jest-util": "^24.7.1", - "micromatch": "^3.1.10", - "realpath-native": "^1.1.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.2.6", + "jest-haste-map": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.4.2", "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" + "source-map": "^0.6.0", + "string-length": "^2.0.0" }, "dependencies": { - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.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" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@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.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "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==" + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "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" + } + } + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "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==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "dev": true + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } + }, + "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 + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -3199,11 +3336,19 @@ "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" + } + }, "write-file-atomic": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -3212,420 +3357,581 @@ } } }, - "@jest/types": { - "version": "24.7.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.7.0.tgz", - "integrity": "sha512-ipJUa2rFWiKoBqMKP63Myb6h9+iT3FHRTF2M8OR6irxWzItisa8i4dcSg14IbvmXUnBlHBlUQPYUHWyX3UPpYA==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/yargs": "^12.0.9" - } - }, - "@lerna/add": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.18.0.tgz", - "integrity": "sha512-Z5EaQbBnJn1LEPb0zb0Q2o9T8F8zOnlCsj6JYpY6aSke17UUT7xx0QMN98iBK+ueUHKjN/vdFdYlNCYRSIdujA==", - "dev": true, - "requires": { - "@evocateur/pacote": "^9.6.3", - "@lerna/bootstrap": "3.18.0", - "@lerna/command": "3.18.0", - "@lerna/filter-options": "3.18.0", - "@lerna/npm-conf": "3.16.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "npm-package-arg": "^6.1.0", - "p-map": "^2.1.0", - "semver": "^6.2.0" - }, - "dependencies": { - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "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 - } - } - }, - "@lerna/bootstrap": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.18.0.tgz", - "integrity": "sha512-3DZKWIaKvr7sUImoKqSz6eqn84SsOVMnA5QHwgzXiQjoeZ/5cg9x2r+Xj3+3w/lvLoh0j8U2GNtrIaPNis4bKQ==", + "@jest/source-map": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", + "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", "dev": true, "requires": { - "@lerna/command": "3.18.0", - "@lerna/filter-options": "3.18.0", - "@lerna/has-npm-version": "3.16.5", - "@lerna/npm-install": "3.16.5", - "@lerna/package-graph": "3.18.0", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.16.5", - "@lerna/run-lifecycle": "3.16.2", - "@lerna/run-topologically": "3.18.0", - "@lerna/symlink-binary": "3.17.0", - "@lerna/symlink-dependencies": "3.17.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", - "get-port": "^4.2.0", - "multimatch": "^3.0.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "p-finally": "^1.0.0", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0", - "p-waterfall": "^1.0.0", - "read-package-tree": "^5.1.6", - "semver": "^6.2.0" + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.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", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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 } } }, - "@lerna/changed": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.18.2.tgz", - "integrity": "sha512-xVnFuj4A6Avxem+8R+KOuKDxfnxp1S5tM5nwsh7n3IhCN5Ga7YINV/JgPhrwgcpqPCVBvAowkilghT/I0r6wUw==", - "dev": true, - "requires": { - "@lerna/collect-updates": "3.18.0", - "@lerna/command": "3.18.0", - "@lerna/listable": "3.18.0", - "@lerna/output": "3.13.0", - "@lerna/version": "3.18.2" - } - }, - "@lerna/check-working-tree": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.16.5.tgz", - "integrity": "sha512-xWjVBcuhvB8+UmCSb5tKVLB5OuzSpw96WEhS2uz6hkWVa/Euh1A0/HJwn2cemyK47wUrCQXtczBUiqnq9yX5VQ==", + "@jest/test-result": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.7.1.tgz", + "integrity": "sha512-3U7wITxstdEc2HMfBX7Yx3JZgiNBubwDqQMh+BXmZXHa3G13YWF3p6cK+5g0hGkN3iufg/vGPl3hLxQXD74Npg==", "dev": true, "requires": { - "@lerna/collect-uncommitted": "3.16.5", - "@lerna/describe-ref": "3.16.5", - "@lerna/validation-error": "3.13.0" + "@jest/console": "^24.7.1", + "@jest/types": "^24.7.0", + "@types/istanbul-lib-coverage": "^2.0.0" } }, - "@lerna/child-process": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.16.5.tgz", - "integrity": "sha512-vdcI7mzei9ERRV4oO8Y1LHBZ3A5+ampRKg1wq5nutLsUA4mEBN6H7JqjWOMY9xZemv6+kATm2ofjJ3lW5TszQg==", + "@jest/test-sequencer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", "dev": true, "requires": { - "chalk": "^2.3.1", - "execa": "^1.0.0", - "strong-log-transformer": "^2.0.0" + "@jest/test-result": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-runner": "^24.9.0", + "jest-runtime": "^24.9.0" }, "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "@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": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "dev": true, "requires": { - "pump": "^3.0.0" + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "@lerna/clean": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.18.0.tgz", - "integrity": "sha512-BiwBELZNkarRQqj+v5NPB1aIzsOX+Y5jkZ9a5UbwHzEdBUQ5lQa0qaMLSOve/fSkaiZQxe6qnTyatN75lOcDMg==", - "dev": true, - "requires": { - "@lerna/command": "3.18.0", - "@lerna/filter-options": "3.18.0", - "@lerna/prompt": "3.13.0", - "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.16.5", - "p-map": "^2.1.0", - "p-map-series": "^1.0.0", - "p-waterfall": "^1.0.0" - }, - "dependencies": { - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - } - } - }, - "@lerna/cli": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-3.18.0.tgz", - "integrity": "sha512-AwDyfGx7fxJgeaZllEuyJ9LZ6Tdv9yqRD9RX762yCJu+PCAFvB9bp6OYuRSGli7QQgM0CuOYnSg4xVNOmuGKDA==", - "dev": true, - "requires": { - "@lerna/global-options": "3.13.0", - "dedent": "^0.7.0", - "npmlog": "^4.1.2", - "yargs": "^14.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "@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": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "@types/yargs": { + "version": "13.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "@types/yargs-parser": "*" } }, - "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==", + "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 }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "requires": { - "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==", + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" } }, - "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==", + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", "dev": true }, - "require-main-filename": { + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } + }, + "jest-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" + } + }, + "merge-stream": { "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==", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "has-flag": "^3.0.0" + } + } + } + }, + "@jest/transform": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.9.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", + "micromatch": "^3.1.10", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + }, + "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.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==", + "@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": { - "ansi-regex": "^4.1.0" + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.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==", + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.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==", + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@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.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "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 }, - "yargs": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.0.tgz", - "integrity": "sha512-/is78VKbKs70bVZH7w4YaZea6xcJWOAwkhbR0CFuZBmYtfTYF0xjGJF43AYd8g2Uii1yJwmS5GR2vBmrc32sbg==", + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "requires": { - "cliui": "^5.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^15.0.0" + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" } }, - "yargs-parser": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz", - "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==", + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "dev": true + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "dev": true + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } + }, + "jest-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" + } + }, + "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 + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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" + } + }, + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } } } }, - "@lerna/collect-uncommitted": { - "version": "3.16.5", - "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-3.16.5.tgz", - "integrity": "sha512-ZgqnGwpDZiWyzIQVZtQaj9tRizsL4dUOhuOStWgTAw1EMe47cvAY2kL709DzxFhjr6JpJSjXV5rZEAeU3VE0Hg==", + "@jest/types": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.7.0.tgz", + "integrity": "sha512-ipJUa2rFWiKoBqMKP63Myb6h9+iT3FHRTF2M8OR6irxWzItisa8i4dcSg14IbvmXUnBlHBlUQPYUHWyX3UPpYA==", "dev": true, "requires": { - "@lerna/child-process": "3.16.5", - "chalk": "^2.3.1", - "figgy-pudding": "^3.5.1", - "npmlog": "^4.1.2" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/yargs": "^12.0.9" } }, - "@lerna/collect-updates": { + "@lerna/add": { "version": "3.18.0", - "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.18.0.tgz", - "integrity": "sha512-LJMKgWsE/var1RSvpKDIxS8eJ7POADEc0HM3FQiTpEczhP6aZfv9x3wlDjaHpZm9MxJyQilqxZcasRANmRcNgw==", + "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.18.0.tgz", + "integrity": "sha512-Z5EaQbBnJn1LEPb0zb0Q2o9T8F8zOnlCsj6JYpY6aSke17UUT7xx0QMN98iBK+ueUHKjN/vdFdYlNCYRSIdujA==", "dev": true, "requires": { - "@lerna/child-process": "3.16.5", - "@lerna/describe-ref": "3.16.5", - "minimatch": "^3.0.4", - "npmlog": "^4.1.2", - "slash": "^2.0.0" + "@evocateur/pacote": "^9.6.3", + "@lerna/bootstrap": "3.18.0", + "@lerna/command": "3.18.0", + "@lerna/filter-options": "3.18.0", + "@lerna/npm-conf": "3.16.0", + "@lerna/validation-error": "3.13.0", + "dedent": "^0.7.0", + "npm-package-arg": "^6.1.0", + "p-map": "^2.1.0", + "semver": "^6.2.0" }, "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "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 } } }, - "@lerna/command": { + "@lerna/bootstrap": { "version": "3.18.0", - "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.18.0.tgz", - "integrity": "sha512-JQ0TGzuZc9Ky8xtwtSLywuvmkU8X62NTUT3rMNrUykIkOxBaO+tE0O98u2yo/9BYOeTRji9IsjKZEl5i9Qt0xQ==", + "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.18.0.tgz", + "integrity": "sha512-3DZKWIaKvr7sUImoKqSz6eqn84SsOVMnA5QHwgzXiQjoeZ/5cg9x2r+Xj3+3w/lvLoh0j8U2GNtrIaPNis4bKQ==", "dev": true, "requires": { - "@lerna/child-process": "3.16.5", + "@lerna/command": "3.18.0", + "@lerna/filter-options": "3.18.0", + "@lerna/has-npm-version": "3.16.5", + "@lerna/npm-install": "3.16.5", "@lerna/package-graph": "3.18.0", - "@lerna/project": "3.18.0", + "@lerna/pulse-till-done": "3.13.0", + "@lerna/rimraf-dir": "3.16.5", + "@lerna/run-lifecycle": "3.16.2", + "@lerna/run-topologically": "3.18.0", + "@lerna/symlink-binary": "3.17.0", + "@lerna/symlink-dependencies": "3.17.0", "@lerna/validation-error": "3.13.0", - "@lerna/write-log-file": "3.13.0", "dedent": "^0.7.0", + "get-port": "^4.2.0", + "multimatch": "^3.0.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "p-finally": "^1.0.0", + "p-map": "^2.1.0", + "p-map-series": "^1.0.0", + "p-waterfall": "^1.0.0", + "read-package-tree": "^5.1.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", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "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 + } + } + }, + "@lerna/changed": { + "version": "3.18.2", + "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.18.2.tgz", + "integrity": "sha512-xVnFuj4A6Avxem+8R+KOuKDxfnxp1S5tM5nwsh7n3IhCN5Ga7YINV/JgPhrwgcpqPCVBvAowkilghT/I0r6wUw==", + "dev": true, + "requires": { + "@lerna/collect-updates": "3.18.0", + "@lerna/command": "3.18.0", + "@lerna/listable": "3.18.0", + "@lerna/output": "3.13.0", + "@lerna/version": "3.18.2" + } + }, + "@lerna/check-working-tree": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.16.5.tgz", + "integrity": "sha512-xWjVBcuhvB8+UmCSb5tKVLB5OuzSpw96WEhS2uz6hkWVa/Euh1A0/HJwn2cemyK47wUrCQXtczBUiqnq9yX5VQ==", + "dev": true, + "requires": { + "@lerna/collect-uncommitted": "3.16.5", + "@lerna/describe-ref": "3.16.5", + "@lerna/validation-error": "3.13.0" + } + }, + "@lerna/child-process": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.16.5.tgz", + "integrity": "sha512-vdcI7mzei9ERRV4oO8Y1LHBZ3A5+ampRKg1wq5nutLsUA4mEBN6H7JqjWOMY9xZemv6+kATm2ofjJ3lW5TszQg==", + "dev": true, + "requires": { + "chalk": "^2.3.1", "execa": "^1.0.0", - "is-ci": "^2.0.0", - "lodash": "^4.17.14", - "npmlog": "^4.1.2" + "strong-log-transformer": "^2.0.0" }, "dependencies": { "cross-spawn": { @@ -3683,33 +3989,356 @@ } } }, - "@lerna/conventional-commits": { - "version": "3.16.4", - "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.16.4.tgz", - "integrity": "sha512-QSZJ0bC9n6FVaf+7KDIq5zMv8WnHXnwhyL5jG1Nyh3SgOg9q2uflqh7YsYB+G6FwaRfnPaKosh6obijpYg0llA==", + "@lerna/clean": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.18.0.tgz", + "integrity": "sha512-BiwBELZNkarRQqj+v5NPB1aIzsOX+Y5jkZ9a5UbwHzEdBUQ5lQa0qaMLSOve/fSkaiZQxe6qnTyatN75lOcDMg==", "dev": true, "requires": { - "@lerna/validation-error": "3.13.0", - "conventional-changelog-angular": "^5.0.3", - "conventional-changelog-core": "^3.1.6", - "conventional-recommended-bump": "^5.0.0", - "fs-extra": "^8.1.0", - "get-stream": "^4.0.0", - "lodash.template": "^4.5.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "pify": "^4.0.1", - "semver": "^6.2.0" + "@lerna/command": "3.18.0", + "@lerna/filter-options": "3.18.0", + "@lerna/prompt": "3.13.0", + "@lerna/pulse-till-done": "3.13.0", + "@lerna/rimraf-dir": "3.16.5", + "p-map": "^2.1.0", + "p-map-series": "^1.0.0", + "p-waterfall": "^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", + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, + "@lerna/cli": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-3.18.0.tgz", + "integrity": "sha512-AwDyfGx7fxJgeaZllEuyJ9LZ6Tdv9yqRD9RX762yCJu+PCAFvB9bp6OYuRSGli7QQgM0CuOYnSg4xVNOmuGKDA==", + "dev": true, + "requires": { + "@lerna/global-options": "3.13.0", + "dedent": "^0.7.0", + "npmlog": "^4.1.2", + "yargs": "^14.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + } + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "write-json-file": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", + "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", + "requires": { + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "pify": "^3.0.0", + "sort-keys": "^2.0.0", + "write-file-atomic": "^2.0.0" + } + }, + "write-pkg": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", + "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", + "requires": { + "sort-keys": "^2.0.0", + "write-json-file": "^2.2.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==", + "dev": true + }, + "yargs": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.2.tgz", + "integrity": "sha512-/4ld+4VV5RnrynMhPZJ/ZpOCGSCeghMykZ3BhdFBDa9Wy/RH6uEGNWDJog+aUlq+9OM1CFTgtYRW5Is1Po9NOA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.0" + } + }, + "yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@lerna/collect-uncommitted": { + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-3.16.5.tgz", + "integrity": "sha512-ZgqnGwpDZiWyzIQVZtQaj9tRizsL4dUOhuOStWgTAw1EMe47cvAY2kL709DzxFhjr6JpJSjXV5rZEAeU3VE0Hg==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "chalk": "^2.3.1", + "figgy-pudding": "^3.5.1", + "npmlog": "^4.1.2" + } + }, + "@lerna/collect-updates": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.18.0.tgz", + "integrity": "sha512-LJMKgWsE/var1RSvpKDIxS8eJ7POADEc0HM3FQiTpEczhP6aZfv9x3wlDjaHpZm9MxJyQilqxZcasRANmRcNgw==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/describe-ref": "3.16.5", + "minimatch": "^3.0.4", + "npmlog": "^4.1.2", + "slash": "^2.0.0" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "@lerna/command": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.18.0.tgz", + "integrity": "sha512-JQ0TGzuZc9Ky8xtwtSLywuvmkU8X62NTUT3rMNrUykIkOxBaO+tE0O98u2yo/9BYOeTRji9IsjKZEl5i9Qt0xQ==", + "dev": true, + "requires": { + "@lerna/child-process": "3.16.5", + "@lerna/package-graph": "3.18.0", + "@lerna/project": "3.18.0", + "@lerna/validation-error": "3.13.0", + "@lerna/write-log-file": "3.13.0", + "dedent": "^0.7.0", + "execa": "^1.0.0", + "is-ci": "^2.0.0", + "lodash": "^4.17.14", + "npmlog": "^4.1.2" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "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" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@lerna/conventional-commits": { + "version": "3.16.4", + "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.16.4.tgz", + "integrity": "sha512-QSZJ0bC9n6FVaf+7KDIq5zMv8WnHXnwhyL5jG1Nyh3SgOg9q2uflqh7YsYB+G6FwaRfnPaKosh6obijpYg0llA==", + "dev": true, + "requires": { + "@lerna/validation-error": "3.13.0", + "conventional-changelog-angular": "^5.0.3", + "conventional-changelog-core": "^3.1.6", + "conventional-recommended-bump": "^5.0.0", + "fs-extra": "^8.1.0", + "get-stream": "^4.0.0", + "lodash.template": "^4.5.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "pify": "^4.0.1", + "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" } }, @@ -3725,8 +4354,31 @@ "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==" + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } }, "pify": { "version": "4.0.1", @@ -3736,19 +4388,44 @@ }, "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" - } + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "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 + }, + "write-json-file": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", + "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", + "requires": { + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "pify": "^3.0.0", + "sort-keys": "^2.0.0", + "write-file-atomic": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "write-pkg": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", + "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", + "requires": { + "sort-keys": "^2.0.0", + "write-json-file": "^2.2.0" + } } } }, @@ -3841,25 +4518,6 @@ "@zkochan/cmd-shim": "^3.1.0", "fs-extra": "^8.1.0", "npmlog": "^4.1.2" - }, - "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 - } } }, "@lerna/describe-ref": { @@ -4028,14 +4686,26 @@ "npmlog": "^4.1.2" }, "dependencies": { + "@octokit/endpoint": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.5.1.tgz", + "integrity": "sha512-nBFhRUb5YzVTCX/iAK1MgQ4uWo89Gu0TH00qQHoYRCsE12dWcG1OiLd7v2EIo2+tpUKPMOQ62QFy9hy9Vg2ULg==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.0", + "is-plain-object": "^3.0.0", + "universal-user-agent": "^4.0.0" + } + }, "@octokit/request": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.2.1.tgz", - "integrity": "sha512-onjQo4QKyiMAqLM6j3eH8vWw1LEfNCpoZUl6a+TrZVJM1wysBC8F0GhK9K/Vc9UsScSmVs2bstOVD34xpQ2wqQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.3.1.tgz", + "integrity": "sha512-5/X0AL1ZgoU32fAepTfEoggFinO3rxsMLtzhlUX+RctLrusn/CApJuGFCd0v7GMFhF+8UiCsTTfsu7Fh1HnEJg==", "dev": true, "requires": { - "@octokit/endpoint": "^5.1.0", + "@octokit/endpoint": "^5.5.0", "@octokit/request-error": "^1.0.1", + "@octokit/types": "^2.0.0", "deprecation": "^2.0.0", "is-plain-object": "^3.0.0", "node-fetch": "^2.3.0", @@ -4044,11 +4714,12 @@ } }, "@octokit/rest": { - "version": "16.33.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.33.1.tgz", - "integrity": "sha512-lOQ+fJZwkeJ/1PRTdnY1uNja01aKOMioRhQfZtei64gZMXIX3EAfF4koMQMvoLFwsnVBu3ifj1JW1WAAKdXcnA==", + "version": "16.38.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.38.1.tgz", + "integrity": "sha512-zyNFx+/Bd1EXt7LQjfrc6H4wryBQ/oDuZeZhGMBSFr1eMPFDmpEweFQR3R25zjKwBQpDY7L5GQO6A3XSaOfV1w==", "dev": true, "requires": { + "@octokit/auth-token": "^2.4.0", "@octokit/request": "^5.2.0", "@octokit/request-error": "^1.0.2", "atob-lite": "^2.0.0", @@ -4069,6 +4740,19 @@ "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", "dev": true }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "is-plain-object": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", @@ -4090,6 +4774,14 @@ "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", "dev": true }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, "universal-user-agent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.0.tgz", @@ -4241,6 +4933,20 @@ "slash": "^2.0.0" }, "dependencies": { + "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==" + }, + "load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "requires": { + "graceful-fs": "^4.1.15", + "type-fest": "^0.3.0" + } + }, "p-map": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", @@ -4352,6 +5058,45 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "write-json-file": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", + "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", + "dev": true, + "requires": { + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "pify": "^3.0.0", + "sort-keys": "^2.0.0", + "write-file-atomic": "^2.0.0" + } + }, + "write-pkg": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", + "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", + "dev": true, + "requires": { + "sort-keys": "^2.0.0", + "write-json-file": "^2.2.0" + } } } }, @@ -4512,6 +5257,23 @@ "type-fest": "^0.3.0" } }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -4533,23 +5295,55 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true - } - } - }, - "@lerna/package-graph": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-3.18.0.tgz", - "integrity": "sha512-BLYDHO5ihPh20i3zoXfLZ5ZWDCrPuGANgVhl7k5pCmRj90LCvT+C7V3zrw70fErGAfvkcYepMqxD+oBrAYwquQ==", - "dev": true, - "requires": { - "@lerna/prerelease-id-from-version": "3.16.0", - "@lerna/validation-error": "3.13.0", - "npm-package-arg": "^6.1.0", - "npmlog": "^4.1.2", - "semver": "^6.2.0" - }, - "dependencies": { - "semver": { + }, + "write-json-file": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", + "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", + "dev": true, + "requires": { + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "pify": "^3.0.0", + "sort-keys": "^2.0.0", + "write-file-atomic": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "write-pkg": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", + "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", + "dev": true, + "requires": { + "sort-keys": "^2.0.0", + "write-json-file": "^2.2.0" + } + } + } + }, + "@lerna/package-graph": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-3.18.0.tgz", + "integrity": "sha512-BLYDHO5ihPh20i3zoXfLZ5ZWDCrPuGANgVhl7k5pCmRj90LCvT+C7V3zrw70fErGAfvkcYepMqxD+oBrAYwquQ==", + "dev": true, + "requires": { + "@lerna/prerelease-id-from-version": "3.16.0", + "@lerna/validation-error": "3.13.0", + "npm-package-arg": "^6.1.0", + "npmlog": "^4.1.2", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", @@ -4705,6 +5499,50 @@ "requires": { "inquirer": "^6.2.0", "npmlog": "^4.1.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "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 + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "@lerna/publish": { @@ -5082,13 +5920,13 @@ } }, "@mdx-js/loader": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-1.5.3.tgz", - "integrity": "sha512-m3bT9b9xY8wU1sQwHhSuFiIwFm0LP7onDpm2rb3xikHzXNY7yfL1/lV9XF4iecSmd86/4I1L6RKE61Dq1jLqjA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-1.5.5.tgz", + "integrity": "sha512-2/2WX73qj79Kv2cYk14kQsN/aypAH3RPzuNMx1gxwZjj77G0N6tzhM9WFkEDM/SXjasWep03ZmSRb9d//b2D8w==", "dev": true, "requires": { - "@mdx-js/mdx": "^1.5.3", - "@mdx-js/react": "^1.5.3", + "@mdx-js/mdx": "^1.5.5", + "@mdx-js/react": "^1.5.5", "loader-utils": "1.2.3" }, "dependencies": { @@ -5121,23 +5959,23 @@ } }, "@mdx-js/mdx": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.5.3.tgz", - "integrity": "sha512-XxnOvyCQKri52tgaCXbV5NWnZGqgRsRifa/yJrxwWa6QG3vdFiEi/xokBHBf/62RCKRK4+QmbM4dSl0fgWIRNA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.5.5.tgz", + "integrity": "sha512-Xv1lJ+VWt8giWQrqf4GdIBxl08SfepfIWAnuuIzuR+wA59SaXDvkW6XFIvl8u495OQEB1eugMvq8l2XR8ZGr1A==", "dev": true, "requires": { - "@babel/core": "7.7.4", - "@babel/plugin-syntax-jsx": "7.7.4", - "@babel/plugin-syntax-object-rest-spread": "7.7.4", - "@mdx-js/util": "^1.5.3", - "babel-plugin-apply-mdx-type-prop": "^1.5.3", - "babel-plugin-extract-import-names": "^1.5.3", + "@babel/core": "7.8.0", + "@babel/plugin-syntax-jsx": "7.8.0", + "@babel/plugin-syntax-object-rest-spread": "7.8.0", + "@mdx-js/util": "^1.5.5", + "babel-plugin-apply-mdx-type-prop": "^1.5.5", + "babel-plugin-extract-import-names": "^1.5.5", "camelcase-css": "2.0.1", "detab": "2.0.2", "hast-util-raw": "5.0.1", "lodash.uniq": "4.5.0", "mdast-util-to-hast": "6.0.2", - "remark-mdx": "^1.5.3", + "remark-mdx": "^1.5.5", "remark-parse": "7.0.2", "remark-squeeze-paragraphs": "3.0.4", "style-to-object": "0.3.0", @@ -5147,29 +5985,30 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "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.0" + "@babel/highlight": "^7.8.3" } }, "@babel/core": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.4.tgz", - "integrity": "sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helpers": "^7.7.4", - "@babel/parser": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.0.tgz", + "integrity": "sha512-3rqPi/bv/Xfu2YzHvBz4XqMI1fKVwnhntPA1/fjoECrSjrhbOCxlTrbVu5gUtr8zkxW+RpkDOa/HCW93gzS2Dw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helpers": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0", "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", @@ -5178,61 +6017,67 @@ } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "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.0", + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "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.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "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.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "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.0" + "@babel/types": "^7.8.3" } }, "@babel/helpers": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.0.tgz", - "integrity": "sha512-srWKpjAFbiut5JoCReZJ098hLqoZ9HufOnKZPggc7j74XaPuQ+9b3RYPV1M/HfjL63lCNd8uI1O487qIWxAFNA==", + "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.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "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", @@ -5241,61 +6086,61 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "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.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz", - "integrity": "sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.0.tgz", + "integrity": "sha512-zLDUckAuKeOtxJhfNE0TlR7iEApb2u7EYRlh5cxKzq6A5VzUbYEdyJGJlug41jDbjRbHTtsLKZUnUcy/8V3xZw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-object-rest-spread": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", - "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.0.tgz", + "integrity": "sha512-dt89fDlkfkTrQcy5KavMQPyF2A6tR0kYp8HAnIoQv5hO34iAUffHghP/hMGd7Gf/+uYTmLQO0ar7peX1SUWyIA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "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.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "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.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "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", @@ -5334,9 +6179,9 @@ "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 }, "json5": { @@ -5458,15 +6303,15 @@ } }, "@mdx-js/react": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.5.3.tgz", - "integrity": "sha512-5bVLUsZybjmeYL8l4Uh/ysE8vMn0Vb0GKzki/LicaDHJvXr/N4Tjj0gT4tk1OzhcC5nGQAQGIyQMW5pvIjp9XQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.5.5.tgz", + "integrity": "sha512-Qwvri4zyU9ZbhhXsH0wfSZ/J9b8mARRTB6GSCTnyKRffO2CaQXl9oLsvRAeQSLRei/onEARc+RexH+jMeNS1rw==", "dev": true }, "@mdx-js/util": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.5.3.tgz", - "integrity": "sha512-OXeOtHO+eN50QlIkm4Vj4vqNGtowv4FH9L21WvcbEM0eeZrb7aANiFTN70lBQEXcucxCMRkd/6IA9LxhotZEQw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.5.5.tgz", + "integrity": "sha512-IudQkyZuM8T1CrSX9r0ShPXCABjtEtyrV4lxQqhKAwFqw1aYpy/5LOZhitMLoJTybZPVdPotuh+zjqYy9ZOSbA==", "dev": true }, "@mrmlnc/readdir-enhanced": { @@ -5513,6 +6358,15 @@ "fastq": "^1.6.0" } }, + "@octokit/auth-token": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.0.tgz", + "integrity": "sha512-eoOVMjILna7FVQf96iWc3+ZtE/ZT6y8ob8ZzcqKY1ibSQCnu4O/B7pJvzMx5cyZ/RjAff6DAdEb0O0Cjcxidkg==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.0" + } + }, "@octokit/endpoint": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.1.2.tgz", @@ -5682,6 +6536,15 @@ "url-template": "^2.0.8" } }, + "@octokit/types": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.1.1.tgz", + "integrity": "sha512-89LOYH+d/vsbDX785NOfLxTW88GjNd0lWRz1DVPVsZgg9Yett5O+3MOvwo7iHgvUwbFz0mf/yPIjBkUbs4kxoQ==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + }, "@reach/router": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@reach/router/-/router-1.2.1.tgz", @@ -5695,145 +6558,129 @@ "warning": "^3.0.0" } }, - "@react-native-community/cli-platform-android": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-2.1.1.tgz", - "integrity": "sha512-M6HNSJYTPNAt8iV8RiclSySyBavo9dsMKAIvKsHJqwbIRNWbRPHONQ71hvw7PzxC+RTwFTHUFKMotWgjKGEKPw==", + "@react-native-community/cli-debugger-ui": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-3.0.0.tgz", + "integrity": "sha512-m3X+iWLsK/H7/b7PpbNO33eQayR/+M26la4ZbYe1KRke5Umg4PIWsvg21O8Tw4uJcY8LA5hsP+rBi/syBkBf0g==", "dev": true, "requires": { - "@react-native-community/cli-tools": "^2.0.2", - "logkitty": "^0.5.0", - "slash": "^2.0.0", - "xmldoc": "^0.4.0" - }, - "dependencies": { - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - } + "serve-static": "^1.13.1" } }, - "@react-native-community/cli-platform-ios": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-2.2.0.tgz", - "integrity": "sha512-rgqksYcolGZNkG4EnWEX2nECWyTxYRUZXRb+pXc4niBsCvNMU88sXoMTxFIHb3wOAaVT2Eix3nS78yG6TA7dnA==", + "@react-native-community/cli-platform-android": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-3.0.3.tgz", + "integrity": "sha512-rNO9DmRiVhB6aP2DVUjEJv7ecriTARDZND88ny3xNVUkrD1Y+zwF6aZu3eoT52VXOxLCSLiJzz19OiyGmfqxYg==", "dev": true, "requires": { - "@react-native-community/cli-tools": "^2.0.2", - "chalk": "^1.1.1", - "xcode": "^2.0.0" + "@react-native-community/cli-tools": "^3.0.0", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "jetifier": "^1.6.2", + "logkitty": "^0.6.0", + "slash": "^3.0.0", + "xmldoc": "^1.1.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "pump": "^3.0.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": { - "ansi-regex": "^2.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true } } }, + "@react-native-community/cli-platform-ios": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-3.0.0.tgz", + "integrity": "sha512-QoNVlDj8eMXRZk9uktPFsctHurQpv9jKmiu6mQii4NEtT2npE7g1hbWpRNojutBsfgmCdQGDHd9uB54eeCnYgg==", + "dev": true, + "requires": { + "@react-native-community/cli-tools": "^3.0.0", + "chalk": "^2.4.2", + "js-yaml": "^3.13.1", + "xcode": "^2.0.0" + } + }, "@react-native-community/cli-tools": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-2.0.2.tgz", - "integrity": "sha512-6OOKrE1Sdq1Lmcdp2K68J5PsG5G80a9USa9I1Kv92wvPHUup6IRt+Dy7E8IZqxmskzC/mlOR62Oh1CB3sFm84g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-3.0.0.tgz", + "integrity": "sha512-8IhQKZdf3E4CR8T7HhkPGgorot/cLkRDgneJFDSWk/wCYZAuUh4NEAdumQV7N0jLSMWX7xxiWUPi94lOBxVY9g==", "dev": true, "requires": { - "chalk": "^1.1.1", + "chalk": "^2.4.2", "lodash": "^4.17.5", "mime": "^2.4.1", "node-fetch": "^2.5.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - }, "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true } } }, + "@react-native-community/cli-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-3.0.0.tgz", + "integrity": "sha512-ng6Tm537E/M42GjE4TRUxQyL8sRfClcL7bQWblOCoxPZzJ2J3bdALsjeG3vDnVCIfI/R0AeFalN9KjMt0+Z/Zg==", + "dev": true + }, "@samverschueren/stream-to-observable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", @@ -5921,94 +6768,6 @@ "vue-docgen-loader": "^1.3.0-beta.0" }, "dependencies": { - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "dev": true, - "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.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" - } - }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - } - }, - "@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.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.5.tgz", - "integrity": "sha512-CF/+sxTO7FOwbIRL4wMv0ZYLCRfMid2HQpzDRyViH7kSpfoAFiMdGqKIxb1PxWfjtQXQhnQuD33lvRHNwr809Q==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, "acorn": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", @@ -6037,22 +6796,22 @@ } }, "escodegen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.1.tgz", - "integrity": "sha512-Q8t2YZ+0e0pc7NRVj3B4tSQ9rim1oi4Fh46k2xhJ2qOiEwhQfdjyEQddWdj7ZFaKmU+5104vn1qrcjEPWq+bgQ==", + "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": "^3.1.3", + "esprima": "^4.0.1", "estraverse": "^4.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" } }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "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": { @@ -6061,130 +6820,12 @@ "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", "dev": true }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - } - }, - "jest-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" - } - }, - "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 - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "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" - } - }, - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } + "optional": true } } }, @@ -6245,103 +6886,6 @@ "ts-dedent": "^1.1.0" }, "dependencies": { - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "dev": true, - "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.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" - } - }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - } - }, - "@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/jest": { - "version": "24.0.25", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.25.tgz", - "integrity": "sha512-hnP1WpjN4KbGEK4dLayul6lgtys6FPz0UfxMeMQCv0M+sTnzN3ConfiO72jHgLxl119guHgI8gLqDOrRLsyp2g==", - "dev": true, - "requires": { - "jest-diff": "^24.3.0" - } - }, - "@types/yargs": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.5.tgz", - "integrity": "sha512-CF/+sxTO7FOwbIRL4wMv0ZYLCRfMid2HQpzDRyViH7kSpfoAFiMdGqKIxb1PxWfjtQXQhnQuD33lvRHNwr809Q==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -6366,99 +6910,6 @@ "path-is-absolute": "^1.0.0" } }, - "graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - } - }, - "jest-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" - } - }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -6468,12 +6919,6 @@ "p-locate": "^4.1.0" } }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -6572,9 +7017,9 @@ "dev": true }, "resolve": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz", - "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -6586,43 +7031,11 @@ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "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" - } - }, "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 - }, - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } } } }, @@ -6946,109 +7359,109 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "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.0" + "@babel/highlight": "^7.8.3" } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "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.0", + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.0.tgz", - "integrity": "sha512-ctCvqYBTlwEl2uF4hCxE0cd/sSw71Zfag0jKa39y4HDLh0BQ4PVBX1384Ye8GqrEZ69xgLp9fwPbv3GgIDDF2Q==", + "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.0", - "@babel/helper-member-expression-to-functions": "^7.8.0", - "@babel/helper-optimise-call-expression": "^7.8.0", - "@babel/helper-plugin-utils": "^7.8.0", - "@babel/helper-replace-supers": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "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.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "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.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.0.tgz", - "integrity": "sha512-0m1QabGrdXuoxX/g+KOAGndoHwskC70WweqHRQyCsaO67KOEELYh4ECcGw6ZGKjDKa5Y7SW4Qbhw6ly4Fah/jQ==", + "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.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-optimise-call-expression": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.0.tgz", - "integrity": "sha512-aiJt1m+K57y0n10fTw+QXcCXzmpkG+o+NoQmAZqlZPstkTE0PZT+Z27QSd/6Gf00nuXJQO4NiJ0/YagSW5kC2A==", + "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.0" + "@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==", + "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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.0.tgz", - "integrity": "sha512-R2CyorW4tcO3YzdkClLpt6MS84G+tPkOi0MmiCn1bvYVnmDpdl9R15XOi3NQW2mhOAEeBnuQ4g1Bh7pT2sX8fg==", + "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.0", - "@babel/helper-optimise-call-expression": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "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.0" + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "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", @@ -7070,81 +7483,81 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "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.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.0.tgz", - "integrity": "sha512-eVGj5NauhKCwABQjKIYncMQh9HtFsBrIcdsxImbTdUIaGnjymsVsBGmDQaDuPL/WCjYn6vPL4d+yvI6zy+VkrQ==", + "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.0", - "@babel/helper-plugin-utils": "^7.8.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.0.tgz", - "integrity": "sha512-SjJ2ZXCylpWC+5DTES0/pbpNmw/FnjU/3dF068xF0DU9aN+oOKah+3MCSFcb4pnZ9IwmxfOy4KnbGJSQR+hAZA==", + "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.0", + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.0.tgz", - "integrity": "sha512-dt89fDlkfkTrQcy5KavMQPyF2A6tR0kYp8HAnIoQv5hO34iAUffHghP/hMGd7Gf/+uYTmLQO0ar7peX1SUWyIA==", + "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.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.0.tgz", - "integrity": "sha512-Z7ti+HB0puCcLmFE3x90kzaVgbx6TRrYIReaygW6EkBEnJh1ajS4/inhF7CypzWeDV3NFl1AfWj0eMtdihojxw==", + "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.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "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.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "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.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "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", @@ -7178,17 +7591,17 @@ "dev": true }, "autoprefixer": { - "version": "9.7.3", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.3.tgz", - "integrity": "sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q==", + "version": "9.7.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.4.tgz", + "integrity": "sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==", "dev": true, "requires": { - "browserslist": "^4.8.0", - "caniuse-lite": "^1.0.30001012", + "browserslist": "^4.8.3", + "caniuse-lite": "^1.0.30001020", "chalk": "^2.4.2", "normalize-range": "^0.1.2", "num2fraction": "^1.2.2", - "postcss": "^7.0.23", + "postcss": "^7.0.26", "postcss-value-parser": "^4.0.2" }, "dependencies": { @@ -7216,6 +7629,12 @@ "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", @@ -7267,14 +7686,14 @@ } }, "browserslist": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.3.tgz", - "integrity": "sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==", + "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.30001017", - "electron-to-chromium": "^1.3.322", - "node-releases": "^1.1.44" + "caniuse-lite": "^1.0.30001022", + "electron-to-chromium": "^1.3.338", + "node-releases": "^1.1.46" } }, "bytes": { @@ -7310,9 +7729,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001020", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001020.tgz", - "integrity": "sha512-yWIvwA68wRHKanAVS1GjN8vajAv7MBFshullKCeq/eKpK7pJBVDgFFEqvgWTkcP2+wIDeQGYFRXECjKZnLkUjA==", + "version": "1.0.30001022", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001022.tgz", + "integrity": "sha512-FjwPPtt/I07KyLPkBQ0g7/XuZg6oUkYBVnPHNj3VHJbOjmmJ/GdSo/GUY6MwINEQvjhP6WZVbX8Tvms8xh0D5A==", "dev": true }, "chalk": { @@ -7432,9 +7851,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.332", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.332.tgz", - "integrity": "sha512-AP2HkLhfSOIxP7gDjlyZ4ywGWIcxRMZoU9+JriuVkQe2pSLDdWBsE6+eI6BQOqun1dohLrUTOPHsQLLhhFA7Eg==", + "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": { @@ -7576,9 +7995,9 @@ } }, "fs-minipass": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.0.0.tgz", - "integrity": "sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "requires": { "minipass": "^3.0.0" @@ -7726,6 +8145,28 @@ "minimist": "^1.2.0" } }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -8012,9 +8453,9 @@ "dev": true }, "resolve": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz", - "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -8055,9 +8496,9 @@ } }, "schema-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.1.tgz", - "integrity": "sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", "dev": true, "requires": { "ajv": "^6.10.2", @@ -8247,6 +8688,25 @@ "unique-slug": "^2.0.0" } }, + "url-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, "webpack-sources": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", @@ -8729,33 +9189,42 @@ } }, "css-select": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", - "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^2.1.2", + "css-what": "^3.2.1", "domutils": "^1.7.0", "nth-check": "^1.0.2" } }, "css-tree": { - "version": "1.0.0-alpha.33", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.33.tgz", - "integrity": "sha512-SPt57bh5nQnpsTBsx/IXbO14sRc9xXu5MtMAVuo0BaQQmyf0NupNPPSoMaqiAF5tDFafYsTkfeH4Q/HCKXkg4w==", + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "dev": true, "requires": { "mdn-data": "2.0.4", - "source-map": "^0.5.3" + "source-map": "^0.6.1" } }, "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", "dev": true }, + "csso": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz", + "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.37" + } + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -8775,6 +9244,50 @@ "domelementtype": "1" } }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, "import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", @@ -8785,6 +9298,30 @@ "resolve-from": "^3.0.0" } }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, "mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", @@ -8800,14 +9337,20 @@ "boolbase": "~1.0.0" } }, + "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.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", + "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" } @@ -8822,18 +9365,44 @@ "json-parse-better-errors": "^1.0.1" } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "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" + } + }, "svgo": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.0.tgz", - "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "dev": true, "requires": { "chalk": "^2.4.1", "coa": "^2.0.2", "css-select": "^2.0.0", "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.33", - "csso": "^3.5.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", "js-yaml": "^3.13.1", "mkdirp": "~0.5.1", "object.values": "^1.1.0", @@ -8996,9 +9565,9 @@ } }, "@types/history": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.3.tgz", - "integrity": "sha512-cS5owqtwzLN5kY+l+KgKdRJ/Cee8tlmQoGQuIE9tWnSmS3JMKzmxo2HIAk2wODMifGwO20d62xZQLYz+RLfXmw==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.4.tgz", + "integrity": "sha512-+o2igcuZA3xtOoFH56s+MCZVidwlJNcJID57DSCyawS2i910yG9vkwehCjJNZ6ImhCR5S9DbvIJKyYHcMyOfMw==", "dev": true }, "@types/is-function": { @@ -9077,8 +9646,7 @@ "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prop-types": { "version": "15.7.3", @@ -9103,9 +9671,9 @@ } }, "@types/react": { - "version": "16.9.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.17.tgz", - "integrity": "sha512-UP27In4fp4sWF5JgyV6pwVPAQM83Fj76JOcg02X5BZcpSu5Wx+fP9RMqc2v0ssBoQIFvD5JdKY41gjJJKmw6Bg==", + "version": "16.9.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.18.tgz", + "integrity": "sha512-MvjiKX/kUE8o49ipppg49RDZ97p4XfW1WWksp/UlTUSJpisyhzd62pZAMXxAscFLoxfYOflkGANAnGkSeHTFQg==", "dev": true, "requires": { "@types/prop-types": "*", @@ -9404,14 +9972,14 @@ "@wordpress/a11y": { "version": "file:packages/a11y", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/dom-ready": "file:packages/dom-ready" } }, "@wordpress/annotations": { "version": "file:packages/annotations", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/data": "file:packages/data", "@wordpress/hooks": "file:packages/hooks", "@wordpress/i18n": "file:packages/i18n", @@ -9424,7 +9992,7 @@ "@wordpress/api-fetch": { "version": "file:packages/api-fetch", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/i18n": "file:packages/i18n", "@wordpress/url": "file:packages/url" } @@ -9432,7 +10000,7 @@ "@wordpress/autop": { "version": "file:packages/autop", "requires": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.8.3" } }, "@wordpress/babel-plugin-import-jsx-pragma": { @@ -9443,7 +10011,7 @@ "version": "file:packages/babel-plugin-makepot", "dev": true, "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "gettext-parser": "^1.3.1", "lodash": "^4.17.15" } @@ -9452,13 +10020,13 @@ "version": "file:packages/babel-preset-default", "dev": true, "requires": { - "@babel/core": "^7.4.5", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.4.4", - "@babel/plugin-transform-react-jsx": "^7.3.0", - "@babel/plugin-transform-runtime": "^7.4.4", - "@babel/preset-env": "^7.4.5", - "@babel/runtime": "^7.4.5", + "@babel/core": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-react-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.8.3", + "@babel/preset-env": "^7.8.3", + "@babel/runtime": "^7.8.3", "@wordpress/babel-plugin-import-jsx-pragma": "file:packages/babel-plugin-import-jsx-pragma", "@wordpress/browserslist-config": "file:packages/browserslist-config", "@wordpress/element": "file:packages/element", @@ -9473,7 +10041,7 @@ "@wordpress/blob": { "version": "file:packages/blob", "requires": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.8.3" } }, "@wordpress/block-directory": { @@ -9494,7 +10062,7 @@ "@wordpress/block-editor": { "version": "file:packages/block-editor", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/a11y": "file:packages/a11y", "@wordpress/blob": "file:packages/blob", "@wordpress/blocks": "file:packages/blocks", @@ -9507,6 +10075,7 @@ "@wordpress/hooks": "file:packages/hooks", "@wordpress/html-entities": "file:packages/html-entities", "@wordpress/i18n": "file:packages/i18n", + "@wordpress/icons": "file:packages/icons", "@wordpress/is-shallow-equal": "file:packages/is-shallow-equal", "@wordpress/keyboard-shortcuts": "file:packages/keyboard-shortcuts", "@wordpress/keycodes": "file:packages/keycodes", @@ -9533,7 +10102,7 @@ "@wordpress/block-library": { "version": "file:packages/block-library", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/a11y": "file:packages/a11y", "@wordpress/api-fetch": "file:packages/api-fetch", "@wordpress/autop": "file:packages/autop", @@ -9546,10 +10115,12 @@ "@wordpress/data": "file:packages/data", "@wordpress/date": "file:packages/date", "@wordpress/deprecated": "file:packages/deprecated", + "@wordpress/dom": "file:packages/dom", "@wordpress/editor": "file:packages/editor", "@wordpress/element": "file:packages/element", "@wordpress/escape-html": "file:packages/escape-html", "@wordpress/i18n": "file:packages/i18n", + "@wordpress/icons": "file:packages/icons", "@wordpress/is-shallow-equal": "file:packages/is-shallow-equal", "@wordpress/keycodes": "file:packages/keycodes", "@wordpress/rich-text": "file:packages/rich-text", @@ -9568,7 +10139,7 @@ "@wordpress/block-serialization-default-parser": { "version": "file:packages/block-serialization-default-parser", "requires": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.8.3" } }, "@wordpress/block-serialization-spec-parser": { @@ -9581,7 +10152,7 @@ "@wordpress/blocks": { "version": "file:packages/blocks", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/autop": "file:packages/autop", "@wordpress/blob": "file:packages/blob", "@wordpress/block-serialization-default-parser": "file:packages/block-serialization-default-parser", @@ -9610,7 +10181,7 @@ "@wordpress/components": { "version": "file:packages/components", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@emotion/core": "^10.0.22", "@emotion/css": "^10.0.22", "@emotion/native": "^10.0.22", @@ -9622,8 +10193,10 @@ "@wordpress/element": "file:packages/element", "@wordpress/hooks": "file:packages/hooks", "@wordpress/i18n": "file:packages/i18n", + "@wordpress/icons": "file:packages/icons", "@wordpress/is-shallow-equal": "file:packages/is-shallow-equal", "@wordpress/keycodes": "file:packages/keycodes", + "@wordpress/primitives": "file:packages/primitives", "@wordpress/rich-text": "file:packages/rich-text", "@wordpress/warning": "file:packages/warning", "classnames": "^2.2.5", @@ -9647,7 +10220,7 @@ "@wordpress/compose": { "version": "file:packages/compose", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/element": "file:packages/element", "@wordpress/is-shallow-equal": "file:packages/is-shallow-equal", "lodash": "^4.17.15", @@ -9657,7 +10230,7 @@ "@wordpress/core-data": { "version": "file:packages/core-data", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/api-fetch": "file:packages/api-fetch", "@wordpress/blocks": "file:packages/blocks", "@wordpress/data": "file:packages/data", @@ -9670,6 +10243,20 @@ "rememo": "^3.0.0" } }, + "@wordpress/create-block": { + "version": "file:packages/create-block", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "commander": "^4.1.0", + "execa": "^4.0.0", + "inquirer": "^7.0.3", + "lodash": "^4.17.15", + "make-dir": "^3.0.0", + "mustache": "^4.0.0", + "write-pkg": "^4.0.0" + } + }, "@wordpress/custom-templated-path-webpack-plugin": { "version": "file:packages/custom-templated-path-webpack-plugin", "dev": true, @@ -9680,7 +10267,7 @@ "@wordpress/data": { "version": "file:packages/data", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/compose": "file:packages/compose", "@wordpress/deprecated": "file:packages/deprecated", "@wordpress/element": "file:packages/element", @@ -9692,7 +10279,8 @@ "lodash": "^4.17.15", "memize": "^1.0.5", "redux": "^4.0.0", - "turbo-combine-reducers": "^1.0.2" + "turbo-combine-reducers": "^1.0.2", + "use-memo-one": "^1.1.1" } }, "@wordpress/data-controls": { @@ -9705,7 +10293,7 @@ "@wordpress/date": { "version": "file:packages/date", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "moment": "^2.22.1", "moment-timezone": "^0.5.16" } @@ -9722,7 +10310,7 @@ "@wordpress/deprecated": { "version": "file:packages/deprecated", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/hooks": "file:packages/hooks" } }, @@ -9743,21 +10331,21 @@ "@wordpress/dom": { "version": "file:packages/dom", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "lodash": "^4.17.15" } }, "@wordpress/dom-ready": { "version": "file:packages/dom-ready", "requires": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.8.3" } }, "@wordpress/e2e-test-utils": { "version": "file:packages/e2e-test-utils", "dev": true, "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/keycodes": "file:packages/keycodes", "@wordpress/url": "file:packages/url", "lodash": "^4.17.15", @@ -9781,7 +10369,7 @@ "@wordpress/edit-post": { "version": "file:packages/edit-post", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/a11y": "file:packages/a11y", "@wordpress/api-fetch": "file:packages/api-fetch", "@wordpress/block-editor": "file:packages/block-editor", @@ -9795,6 +10383,7 @@ "@wordpress/element": "file:packages/element", "@wordpress/hooks": "file:packages/hooks", "@wordpress/i18n": "file:packages/i18n", + "@wordpress/icons": "file:packages/icons", "@wordpress/keyboard-shortcuts": "file:packages/keyboard-shortcuts", "@wordpress/keycodes": "file:packages/keycodes", "@wordpress/media-utils": "file:packages/media-utils", @@ -9812,7 +10401,7 @@ "@wordpress/edit-site": { "version": "file:packages/edit-site", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/block-editor": "file:packages/block-editor", "@wordpress/block-library": "file:packages/block-library", "@wordpress/blocks": "file:packages/blocks", @@ -9830,7 +10419,7 @@ "@wordpress/edit-widgets": { "version": "file:packages/edit-widgets", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/block-editor": "file:packages/block-editor", "@wordpress/block-library": "file:packages/block-library", "@wordpress/blocks": "file:packages/blocks", @@ -9850,7 +10439,7 @@ "@wordpress/editor": { "version": "file:packages/editor", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/api-fetch": "file:packages/api-fetch", "@wordpress/autop": "file:packages/autop", "@wordpress/blob": "file:packages/blob", @@ -9868,6 +10457,7 @@ "@wordpress/hooks": "file:packages/hooks", "@wordpress/html-entities": "file:packages/html-entities", "@wordpress/i18n": "file:packages/i18n", + "@wordpress/icons": "file:packages/icons", "@wordpress/is-shallow-equal": "file:packages/is-shallow-equal", "@wordpress/keyboard-shortcuts": "file:packages/keyboard-shortcuts", "@wordpress/keycodes": "file:packages/keycodes", @@ -9891,7 +10481,7 @@ "@wordpress/element": { "version": "file:packages/element", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/escape-html": "file:packages/escape-html", "lodash": "^4.17.15", "react": "^16.9.0", @@ -9914,17 +10504,19 @@ "@wordpress/escape-html": { "version": "file:packages/escape-html", "requires": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.8.3" } }, "@wordpress/eslint-plugin": { "version": "file:packages/eslint-plugin", "dev": true, "requires": { - "babel-eslint": "^10.0.2", + "babel-eslint": "^10.0.3", + "eslint-config-prettier": "^6.10.0", "eslint-plugin-jest": "^22.15.1", "eslint-plugin-jsdoc": "^15.8.0", "eslint-plugin-jsx-a11y": "^6.2.3", + "eslint-plugin-prettier": "^3.1.2", "eslint-plugin-react": "^7.14.3", "eslint-plugin-react-hooks": "^1.6.1", "globals": "^12.0.0", @@ -9934,7 +10526,7 @@ "@wordpress/format-library": { "version": "file:packages/format-library", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/block-editor": "file:packages/block-editor", "@wordpress/components": "file:packages/components", "@wordpress/dom": "file:packages/dom", @@ -9950,19 +10542,19 @@ "@wordpress/hooks": { "version": "file:packages/hooks", "requires": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.8.3" } }, "@wordpress/html-entities": { "version": "file:packages/html-entities", "requires": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.8.3" } }, "@wordpress/i18n": { "version": "file:packages/i18n", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "gettext-parser": "^1.3.1", "lodash": "^4.17.15", "memize": "^1.0.5", @@ -9970,17 +10562,25 @@ "tannin": "^1.1.0" } }, + "@wordpress/icons": { + "version": "file:packages/icons", + "requires": { + "@babel/runtime": "^7.8.3", + "@wordpress/element": "file:packages/element", + "@wordpress/primitives": "file:packages/primitives" + } + }, "@wordpress/is-shallow-equal": { "version": "file:packages/is-shallow-equal", "requires": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.8.3" } }, "@wordpress/jest-console": { "version": "file:packages/jest-console", "dev": true, "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "jest-matcher-utils": "^24.7.0", "lodash": "^4.17.15" } @@ -9991,7 +10591,7 @@ "requires": { "@jest/reporters": "^24.8.0", "@wordpress/jest-console": "file:packages/jest-console", - "babel-jest": "^24.7.1", + "babel-jest": "^24.9.0", "enzyme": "^3.9.0", "enzyme-adapter-react-16": "^1.10.0", "enzyme-to-json": "^3.3.5" @@ -10001,14 +10601,14 @@ "version": "file:packages/jest-puppeteer-axe", "dev": true, "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "axe-puppeteer": "^1.0.0" } }, "@wordpress/keyboard-shortcuts": { "version": "file:packages/keyboard-shortcuts", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/compose": "file:packages/compose", "@wordpress/data": "file:packages/data", "@wordpress/element": "file:packages/element", @@ -10020,7 +10620,7 @@ "@wordpress/keycodes": { "version": "file:packages/keycodes", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/i18n": "file:packages/i18n", "lodash": "^4.17.15" } @@ -10036,7 +10636,7 @@ "@wordpress/list-reusable-blocks": { "version": "file:packages/list-reusable-blocks", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/api-fetch": "file:packages/api-fetch", "@wordpress/components": "file:packages/components", "@wordpress/compose": "file:packages/compose", @@ -10048,7 +10648,7 @@ "@wordpress/media-utils": { "version": "file:packages/media-utils", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/api-fetch": "file:packages/api-fetch", "@wordpress/blob": "file:packages/blob", "@wordpress/element": "file:packages/element", @@ -10059,7 +10659,7 @@ "@wordpress/notices": { "version": "file:packages/notices", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/a11y": "file:packages/a11y", "@wordpress/data": "file:packages/data", "lodash": "^4.17.15" @@ -10072,7 +10672,7 @@ "@wordpress/nux": { "version": "file:packages/nux", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/components": "file:packages/components", "@wordpress/compose": "file:packages/compose", "@wordpress/data": "file:packages/data", @@ -10086,7 +10686,7 @@ "@wordpress/plugins": { "version": "file:packages/plugins", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/compose": "file:packages/compose", "@wordpress/element": "file:packages/element", "@wordpress/hooks": "file:packages/hooks", @@ -10102,16 +10702,24 @@ "postcss-color-function": "^4.0.1" } }, + "@wordpress/primitives": { + "version": "file:packages/primitives", + "requires": { + "@babel/runtime": "^7.8.3", + "@wordpress/element": "file:packages/element", + "classnames": "^2.2.5" + } + }, "@wordpress/priority-queue": { "version": "file:packages/priority-queue", "requires": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.8.3" } }, "@wordpress/redux-routine": { "version": "file:packages/redux-routine", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "is-promise": "^2.1.0", "lodash": "^4.17.15", "rungen": "^0.3.2" @@ -10120,7 +10728,7 @@ "@wordpress/rich-text": { "version": "file:packages/rich-text", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/compose": "file:packages/compose", "@wordpress/data": "file:packages/data", "@wordpress/deprecated": "file:packages/deprecated", @@ -10144,21 +10752,25 @@ "@wordpress/eslint-plugin": "file:packages/eslint-plugin", "@wordpress/jest-preset-default": "file:packages/jest-preset-default", "@wordpress/npm-package-json-lint-config": "file:packages/npm-package-json-lint-config", - "babel-jest": "^24.7.1", + "babel-jest": "^24.9.0", "babel-loader": "^8.0.6", "chalk": "^2.4.2", "check-node-version": "^3.1.1", "command-exists": "^1.2.8", "cross-spawn": "^5.1.0", "decompress-zip": "^0.2.2", + "dir-glob": "^3.0.1", "eslint": "^6.1.0", "eslint-plugin-markdown": "1.0.1", - "jest": "^24.7.1", + "jest": "^24.9.0", "jest-puppeteer": "^4.3.0", "js-yaml": "^3.13.1", "lodash": "^4.17.15", + "markdownlint": "^0.18.0", + "markdownlint-cli": "^0.21.0", "minimist": "^1.2.0", "npm-package-json-lint": "^4.0.3", + "prettier": "npm:wp-prettier@1.19.1", "puppeteer": "^2.0.0", "read-pkg-up": "^1.0.1", "request": "^2.88.0", @@ -10173,61 +10785,12 @@ "webpack-bundle-analyzer": "^3.3.2", "webpack-cli": "^3.1.2", "webpack-livereload-plugin": "^2.2.0" - }, - "dependencies": { - "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 - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "schema-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.1.tgz", - "integrity": "sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1" - } - }, - "url-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-3.0.0.tgz", - "integrity": "sha512-a84JJbIA5xTFTWyjjcPdnsu+41o/SNE8SpXMdUvXs6Q+LuhCD9E2+0VCiuDWqgo3GGXVlFHzArDmBpj9PgWn4A==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "mime": "^2.4.4", - "schema-utils": "^2.5.0" - } - } } }, "@wordpress/server-side-render": { "version": "file:packages/server-side-render", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/api-fetch": "file:packages/api-fetch", "@wordpress/components": "file:packages/components", "@wordpress/data": "file:packages/data", @@ -10241,7 +10804,7 @@ "@wordpress/shortcode": { "version": "file:packages/shortcode", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "lodash": "^4.17.15", "memize": "^1.0.5" } @@ -10249,14 +10812,14 @@ "@wordpress/token-list": { "version": "file:packages/token-list", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "lodash": "^4.17.15" } }, "@wordpress/url": { "version": "file:packages/url", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "lodash": "^4.17.15", "qs": "^6.5.2" } @@ -10264,7 +10827,7 @@ "@wordpress/viewport": { "version": "file:packages/viewport", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/compose": "file:packages/compose", "@wordpress/data": "file:packages/data", "lodash": "^4.17.15" @@ -10276,7 +10839,7 @@ "@wordpress/wordcount": { "version": "file:packages/wordcount", "requires": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "lodash": "^4.17.15" } }, @@ -10449,9 +11012,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "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", @@ -10850,6 +11413,7 @@ "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" }, @@ -10857,7 +11421,8 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true } } }, @@ -10869,6 +11434,14 @@ "requires": { "ast-types-flow": "0.0.7", "commander": "^2.11.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } } }, "arr-diff": { @@ -11072,9 +11645,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "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", @@ -11189,9 +11762,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "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", @@ -11435,9 +12008,9 @@ }, "dependencies": { "postcss": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.18.tgz", - "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", + "version": "7.0.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz", + "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -11575,27 +12148,32 @@ "dev": true }, "babel-eslint": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.2.tgz", - "integrity": "sha512-UdsurWPtgiPgpJ06ryUnuaSXC2s0WoSZnQmEpbAH65XZSdwowgN5MvyP7e88nW07FYXv72erVtpBkxyDVKhH1Q==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", + "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "@babel/parser": "^7.0.0", "@babel/traverse": "^7.0.0", "@babel/types": "^7.0.0", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" }, "dependencies": { - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "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 + }, + "resolve": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "path-parse": "^1.0.6" } } } @@ -11643,59 +12221,82 @@ "dev": true }, "babel-jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", - "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "dev": true, "requires": { - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.6.0", + "babel-preset-jest": "^24.9.0", "chalk": "^2.4.2", "slash": "^2.0.0" }, "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, "@jest/fake-timers": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", - "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", + "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.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" } }, "@jest/test-result": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", - "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", "@types/istanbul-lib-coverage": "^2.0.0" } }, "@jest/transform": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", - "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "babel-plugin-istanbul": "^5.1.0", "chalk": "^2.0.1", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-util": "^24.8.0", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", "micromatch": "^3.1.10", + "pirates": "^4.0.1", "realpath-native": "^1.1.0", "slash": "^2.0.0", "source-map": "^0.6.1", @@ -11703,77 +12304,60 @@ } }, "@jest/types": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", - "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "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": "^12.0.9" + "@types/yargs": "^13.0.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==", + "@types/yargs": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.5.tgz", + "integrity": "sha512-CF/+sxTO7FOwbIRL4wMv0ZYLCRfMid2HQpzDRyViH7kSpfoAFiMdGqKIxb1PxWfjtQXQhnQuD33lvRHNwr809Q==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@types/yargs-parser": "*" } }, - "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 - }, "graceful-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "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 }, - "is-ci": { - "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" - } - }, "jest-haste-map": { - "version": "24.8.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz", - "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "requires": { - "@jest/types": "^24.8.0", + "@jest/types": "^24.9.0", "anymatch": "^2.0.0", "fb-watchman": "^2.0.0", "fsevents": "^1.2.7", "graceful-fs": "^4.1.15", "invariant": "^2.2.4", - "jest-serializer": "^24.4.0", - "jest-util": "^24.8.0", - "jest-worker": "^24.6.0", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", "micromatch": "^3.1.10", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-message-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", - "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "@types/stack-utils": "^1.0.1", "chalk": "^2.0.1", "micromatch": "^3.1.10", @@ -11782,25 +12366,37 @@ } }, "jest-mock": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", - "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "dev": true, "requires": { - "@jest/types": "^24.8.0" + "@jest/types": "^24.9.0" } }, + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "dev": true + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "dev": true + }, "jest-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", - "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/fake-timers": "^24.8.0", - "@jest/source-map": "^24.3.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "callsites": "^3.0.0", "chalk": "^2.0.1", "graceful-fs": "^4.1.15", @@ -11810,6 +12406,22 @@ "source-map": "^0.6.0" } }, + "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" + } + }, + "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 + }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -11822,6 +12434,15 @@ "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" + } + }, "write-file-atomic": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", @@ -11941,24 +12562,41 @@ "dev": true }, "babel-plugin-apply-mdx-type-prop": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.5.3.tgz", - "integrity": "sha512-9G+V0R8Jx56nHdEnWvRmSN//rFXMDiBZynu9JPuu3KVUhZhaJMgx5CTiXcdR2P//c85Q/IuwPbH0vIGrjdSq8A==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.5.5.tgz", + "integrity": "sha512-yaklz3xE5vFtZpPpYC9lDbTqlC6hq0CjgheiLw3i40lY8vG0DINh+HJ7rq1Gi1g0q/iihwetJ+YFGpUM4YXAGA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@mdx-js/util": "^1.5.3" + "@babel/helper-plugin-utils": "7.8.0", + "@mdx-js/util": "^1.5.5" + }, + "dependencies": { + "@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-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" } }, "babel-plugin-emotion": { - "version": "10.0.23", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.23.tgz", - "integrity": "sha512-1JiCyXU0t5S2xCbItejCduLGGcKmF3POT0Ujbexog2MI4IlRcIn/kWjkYwCUZlxpON0O5FC635yPl/3slr7cKQ==", + "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.3", - "@emotion/memoize": "0.7.3", - "@emotion/serialize": "^0.11.14", + "@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", @@ -11967,27 +12605,55 @@ "source-map": "^0.5.7" }, "dependencies": { + "@emotion/hash": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.4.tgz", + "integrity": "sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A==" + }, + "@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" + }, "@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", + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.15.tgz", + "integrity": "sha512-YE+qnrmGwyR+XB5j7Bi+0GT1JWsdcjM/d4POu+TXkcnrRs4RFCCsi3d/Ebf+wSStHqAlTT2+dfd+b9N9EO2KBg==", + "requires": { + "@emotion/hash": "0.7.4", + "@emotion/memoize": "0.7.4", + "@emotion/unitless": "0.7.5", + "@emotion/utils": "0.11.3", "csstype": "^2.5.7" } + }, + "@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "@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==" } } }, "babel-plugin-extract-import-names": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.5.3.tgz", - "integrity": "sha512-UPgDHjNb4hr2xYRWO8C8JPX7GO+q3gluKd3pkcmVcd1gn9bdO7/yE5FKnYe1UkCPY7PhEUOpEzHCSuIy3GMpsQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.5.5.tgz", + "integrity": "sha512-F9paxnUtO3vddyOX+vbRa8KrkuovJIFB8KmB/dEICqTUm2331LcGbjCKzZApOri4Igbk9MnYybm2fDsuPJC3vA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "7.8.0" + }, + "dependencies": { + "@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-plugin-inline-json-import": { @@ -12083,51 +12749,45 @@ } }, "babel-plugin-jest-hoist": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", - "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", "dev": true, "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-plugin-macros": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz", - "integrity": "sha512-6W2nwiXme6j1n2erPOnmRiWfObUhWH7Qw1LMi9XZy8cj+KtESu3T6asZvtk5bMQQjX8te35o7CFueiSdL/2NmQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", "requires": { - "@babel/runtime": "^7.4.2", - "cosmiconfig": "^5.2.0", - "resolve": "^1.10.0" + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" }, "dependencies": { "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.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" } }, "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==", "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-parse": { @@ -12135,10 +12795,15 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", + "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", "requires": { "path-parse": "^1.0.6" } @@ -12246,9 +12911,9 @@ "dev": true }, "babel-plugin-react-docgen": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.0.0.tgz", - "integrity": "sha512-6vdky/CRaq0zE64ZRR1fOjUfFS3kX7USMuC6mAH/ASYt/EGY9Ms1F5uLwHhmBhaOGKiJJHvhKz16wX9IBWBLKg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-docgen/-/babel-plugin-react-docgen-4.1.0.tgz", + "integrity": "sha512-vzpnBlfGv8XOhJM2zbPyyqw2OLEbelgZZsaaRRTpVwNKuYuc+pUg4+dy7i9gCRms0uOQn4osX571HRcCJMJCmA==", "dev": true, "requires": { "lodash": "^4.17.15", @@ -12428,13 +13093,13 @@ } }, "babel-preset-jest": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", - "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "dev": true, "requires": { "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.6.0" + "babel-plugin-jest-hoist": "^24.9.0" } }, "babel-preset-minify": { @@ -12527,8 +13192,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -12645,9 +13309,9 @@ } }, "big-integer": { - "version": "1.6.44", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.44.tgz", - "integrity": "sha512-7MzElZPTyJ2fNvBkPxtFQ2fWIkVmuzw41+BZHSzpEq3ymB2MfeKp1+yXl/tS75xCx+WnyV+yb0kp+K1C3UNwmQ==", + "version": "1.6.48", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", "dev": true }, "big.js": { @@ -12930,28 +13594,27 @@ } }, "bplist-creator": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.7.tgz", - "integrity": "sha1-N98VNgkoJLh8QvlXsBNEEXNyrkU=", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", + "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", "dev": true, "requires": { "stream-buffers": "~2.2.0" } }, "bplist-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", - "integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", "dev": true, "requires": { - "big-integer": "^1.6.7" + "big-integer": "^1.6.44" } }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -13248,16 +13911,6 @@ "y18n": "^4.0.0" }, "dependencies": { - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", @@ -13293,6 +13946,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, "requires": { "callsites": "^2.0.0" }, @@ -13300,7 +13954,8 @@ "callsites": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true } } }, @@ -13308,6 +13963,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, "requires": { "caller-callsite": "^2.0.0" } @@ -13321,8 +13977,7 @@ "callsites": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz", - "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==", - "dev": true + "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==" }, "camel-case": { "version": "3.0.0", @@ -13395,9 +14050,9 @@ } }, "case-sensitive-paths-webpack-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz", - "integrity": "sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", "dev": true }, "caseless": { @@ -13504,9 +14159,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } @@ -13938,9 +14593,9 @@ "dev": true }, "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.0.tgz", + "integrity": "sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==", "dev": true }, "comment-parser": { @@ -13992,9 +14647,9 @@ }, "dependencies": { "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==", + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", "dev": true } } @@ -14032,9 +14687,9 @@ } }, "compute-scroll-into-view": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.12.tgz", - "integrity": "sha512-MUJWwXJsFQ0+Z5fvrcvA+Da+ZGxpwIMEOmXQiYjB40f0+HWZHp+Cr4F/CtmQPRpggC5ZvBHj14zXPDPmvq/OkA==" + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.11.tgz", + "integrity": "sha512-uUnglJowSe0IPmWOdDtrlHXof5CTIJitfJEyITHBW6zDVOGu9Pjk5puaLM73SLcwak0L4hEjO7Td88/a6P5i7A==" }, "computed-style": { "version": "0.1.4", @@ -14044,8 +14699,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -14776,6 +15430,17 @@ "ignore": "^3.3.5", "pify": "^3.0.0", "slash": "^1.0.0" + }, + "dependencies": { + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + } } }, "is-extglob": { @@ -14807,31 +15472,6 @@ "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==", "dev": true }, - "core-js-compat": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.1.4.tgz", - "integrity": "sha512-Z5zbO9f1d0YrJdoaQhphVAnKPimX92D6z8lCGphH89MNRxlL1prI9ExJPqVwP0/kgkQCv8c4GJGT8X16yUncOg==", - "dev": true, - "requires": { - "browserslist": "^4.6.2", - "core-js-pure": "3.1.4", - "semver": "^6.1.1" - }, - "dependencies": { - "core-js-pure": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.1.4.tgz", - "integrity": "sha512-uJ4Z7iPNwiu1foygbcZYJsJs1jiXrTTCvxfLDXNhI/I+NHbSIEyr548y4fcsCEyWY0XgfAG/qqaunJ1SThHenA==", - "dev": true - }, - "semver": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.2.tgz", - "integrity": "sha512-z4PqiCpomGtWj8633oeAdXm1Kn1W++3T8epkZYnwiVgIYIJ0QHszhInYSJTYxebByQH7KVCEAn8R9duzZW2PhQ==", - "dev": true - } - } - }, "core-js-pure": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.2.1.tgz", @@ -15452,6 +16092,12 @@ "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "dev": true }, + "dayjs": { + "version": "1.8.18", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.18.tgz", + "integrity": "sha512-JBMJZghNK8TtuoPnKNIzW9xavVVigld/zmZNpZSyQbkb2Opp55YIfZUpE4OEqPF/iyUVQTKcn1bC2HtC8B7s3g==", + "dev": true + }, "de-indent": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", @@ -15914,8 +16560,7 @@ "detect-indent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=" }, "detect-libc": { "version": "1.0.3", @@ -15989,13 +16634,20 @@ } }, "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { - "arrify": "^1.0.1", - "path-type": "^3.0.0" + "path-type": "^4.0.0" + }, + "dependencies": { + "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 + } } }, "direction": { @@ -16133,9 +16785,9 @@ "dev": true }, "dotenv-defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-1.0.3.tgz", - "integrity": "sha512-EHeXF8VZA/XhkGJCtRpJCTHC8GkoisPXjdvJMzxgFrlN6lTEW/eksRNsVKnW0BxR1pGZH8IEBO/D0mDkIrC6fA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-1.1.0.tgz", + "integrity": "sha512-MoWCnFZ1G6ZLww0TFmXx+CFs2X3ZFhIN5AptQBNPOmrHnvqjlzZPsiAbbISDEk4RUKCVgPF8HmvixuxnaVuNZQ==", "dev": true, "requires": { "dotenv": "^6.2.0" @@ -16157,9 +16809,9 @@ } }, "downshift": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/downshift/-/downshift-4.0.5.tgz", - "integrity": "sha512-8q6ImB06zvBjE75f1W8cKxYcBCaqtD7TMPJn4nAzdrYxGDxwHsNb8965GQME4TklGPsSMhIBygIdKCLMEYda+Q==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/downshift/-/downshift-4.0.7.tgz", + "integrity": "sha512-w6KFbpnMZrO53Lcbh21lRTSokEvz+FCdv7fAtN8+Oxvst+qUTIy/2FQCX6AQUncRb/gOqG4aBqm2fGgbsmAiGg==", "requires": { "@babel/runtime": "^7.4.5", "compute-scroll-into-view": "^1.0.9", @@ -16227,12 +16879,12 @@ "dev": true }, "element-resize-detector": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.1.16.tgz", - "integrity": "sha512-8fcz6qaMEycYYERmihrPO5p7BS2DejlThf5oSglCQL/kBAX6qSQ5HGr0ctBZQnzW3Tu3mov2juEV0GyZlEBXmg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.1.tgz", + "integrity": "sha512-BdFsPepnQr9fznNPF9nF4vQ457U/ZJXQDSNF1zBe7yaga8v9AdZf3/NElYxFdUh7SitSGt040QygiTo6dtatIw==", "dev": true, "requires": { - "batch-processor": "^1.0.0" + "batch-processor": "1.0.0" } }, "elliptic": { @@ -16274,9 +16926,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.0.tgz", - "integrity": "sha512-Z7ti+HB0puCcLmFE3x90kzaVgbx6TRrYIReaygW6EkBEnJh1ajS4/inhF7CypzWeDV3NFl1AfWj0eMtdihojxw==", + "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" @@ -16346,9 +16998,9 @@ "dev": true }, "envinfo": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.3.1.tgz", - "integrity": "sha512-GvXiDTqLYrORVSCuJCsWHPXF5BFvoWMQA9xX4YVjPT1jyS3aZEHUBwjzxU/6LTPF9ReHgVEbX7IEN5UvSXHw/A==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.0.tgz", + "integrity": "sha512-jDgnJaF/Btomk+m3PZDTTCb5XIIIX3zYItnCRfF73zVgvinLoRomuhi75Y4su0PtQxWz4v66XnLLckyvyJTOIQ==", "dev": true }, "enzyme": { @@ -16566,18 +17218,18 @@ } }, "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==", + "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.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "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.40.0" + "mime-db": "1.42.0" } }, "negotiator": { @@ -16631,9 +17283,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "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", @@ -16846,29 +17498,17 @@ }, "dependencies": { "acorn": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.2.1.tgz", - "integrity": "sha512-JD0xT5FCRDNyjDda3Lrg/IxFscp9q4tiYtxE1/nOzlKCk7hIRuYjhq1kCNkbPjMRMZuFq20HNQn1I9k8Oj0E+Q==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", "dev": true }, "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", + "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", "dev": true }, - "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" - } - }, "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", @@ -16895,9 +17535,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } @@ -16931,26 +17571,28 @@ } }, "espree": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.0.0.tgz", - "integrity": "sha512-lJvCS6YbCn3ImT3yKkPe0+tJ+mH6ljhGNjHQH9mRtiO6gjhVAOhVXW1yjnwqGwTkK3bGbye+hb00nFNmu0l/1Q==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", + "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", "dev": true, "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "acorn": "^7.1.0", + "acorn-jsx": "^5.1.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "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 - }, "glob-parent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", - "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -16980,9 +17622,9 @@ "dev": true }, "inquirer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", - "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -16998,42 +17640,14 @@ "string-width": "^2.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" - } - } } }, - "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 - }, "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 }, - "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -17067,9 +17681,9 @@ "dev": true }, "table": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.5.tgz", - "integrity": "sha512-oGa2Hl7CQjfoaogtrOHEJroOcYILTx7BZWLGsJIlzoWmB2zmguhNfPJZsWPKYek/MgCxfco54gEi31d1uN2hFA==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { "ajv": "^6.10.2", @@ -17090,11 +17704,22 @@ } } } - }, - "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + } + } + }, + "eslint-config-prettier": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.0.tgz", + "integrity": "sha512-AtndijGte1rPILInUdHjvKEGbIV06NuvPrqlIEaEaWtbtvJh464mDeyGMdZEQMsGvC0ZVkiex1fSNcC4HAbRGg==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true } } @@ -17403,6 +18028,15 @@ } } }, + "eslint-plugin-prettier": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz", + "integrity": "sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, "eslint-plugin-react": { "version": "7.14.3", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz", @@ -17596,17 +18230,118 @@ "dev": true }, "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", + "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", + "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "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" + } + }, + "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 + }, + "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" + } + } } }, "execall": { @@ -17678,17 +18413,166 @@ } }, "expect": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.7.1.tgz", - "integrity": "sha512-mGfvMTPduksV3xoI0xur56pQsg2vJjNf5+a+bXOjqCkiCBbmCayrBbHS/75y9K430cfqyocPr2ZjiNiRx4SRKw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", "dev": true, "requires": { - "@jest/types": "^24.7.0", + "@jest/types": "^24.9.0", "ansi-styles": "^3.2.0", - "jest-get-type": "^24.3.0", - "jest-matcher-utils": "^24.7.0", - "jest-message-util": "^24.7.1", - "jest-regex-util": "^24.3.0" + "jest-get-type": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-regex-util": "^24.9.0" + }, + "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@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.6", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.6.tgz", + "integrity": "sha512-IkltIncDQWv6fcAvnHtJ6KtkmY/vtR3bViOaCzpj/A3yNhlfZAgxNe6AEQD1cQrkYD+YsKVo08DSxvNKEsD7BA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "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==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 + } } }, "expect-puppeteer": { @@ -17924,6 +18808,12 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, "fast-glob": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", @@ -18037,15 +18927,15 @@ }, "dependencies": { "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", "dev": true }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } @@ -18120,9 +19010,9 @@ } }, "schema-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.1.tgz", - "integrity": "sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", "dev": true, "requires": { "ajv": "^6.10.2", @@ -18155,6 +19045,19 @@ "rimraf": "^2.2.8" } }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", @@ -18291,6 +19194,12 @@ "debug": "^2.6.8" }, "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -18351,9 +19260,9 @@ }, "dependencies": { "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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", @@ -18388,9 +19297,9 @@ "dev": true }, "flow-parser": { - "version": "0.116.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.116.0.tgz", - "integrity": "sha512-sHiUjYI9U7H94diCN8BdzwYFJIkyCy2GN73UDFbKHTIuLdfROfZZwD6jAv2qWMl7lcPrBK9YAVeArLLbekxVeg==", + "version": "0.116.1", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.116.1.tgz", + "integrity": "sha512-uMbaTjiMhBKa/il1esHyWyVVWfrWdG/eLmG62MQulZ59Yghpa30H1tmukFZLptsBafZ8ddiPyf7I+SiA+euZ6A==", "dev": true }, "flush-write-stream": { @@ -18562,8 +19471,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.9", @@ -18576,231 +19484,17 @@ "node-pre-gyp": "^0.12.0" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": 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" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", "dev": true, "optional": true }, "minipass": { - "version": "2.3.5", - "bundled": true, + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "optional": true, "requires": { @@ -18808,51 +19502,10 @@ "yallist": "^3.0.0" } }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, "node-pre-gyp": { "version": "0.12.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", + "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", "dev": true, "optional": true, "requires": { @@ -18870,7 +19523,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "dev": true, "optional": true, "requires": { @@ -18878,243 +19532,33 @@ "osenv": "^0.1.4" } }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, "semver": { - "version": "5.7.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, "optional": true }, "tar": { - "version": "4.4.8", - "bundled": true, + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "optional": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" + "yallist": "^3.0.3" } }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, "yallist": { - "version": "3.0.3", - "bundled": true, + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "optional": true } @@ -19130,6 +19574,21 @@ "inherits": "~2.0.0", "mkdirp": ">=0.5 0", "rimraf": "2" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "function-bind": { @@ -19857,7 +20316,12 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "dev": true }, "gradient-parser": { @@ -20141,6 +20605,12 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "hermes-engine": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/hermes-engine/-/hermes-engine-0.2.1.tgz", + "integrity": "sha512-eNHUQHuadDMJARpaqvlCZoK/Nitpj6oywq3vQ3wCwEsww5morX34mW5PmKWQTO7aU0ck0hgulxR+EVDlXygGxQ==", + "dev": true + }, "hex-color-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", @@ -20395,6 +20865,12 @@ "debug": "^3.1.0" } }, + "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 + }, "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -20423,17 +20899,6 @@ "slash": "^3.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" - } - }, "cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -20531,9 +20996,9 @@ } }, "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "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" @@ -20585,15 +21050,6 @@ "find-up": "^4.0.0" } }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", - "dev": true, - "requires": { - "semver-compare": "^1.0.0" - } - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -20631,9 +21087,9 @@ } }, "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.2.tgz", + "integrity": "sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -20756,7 +21212,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", - "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -20765,8 +21220,7 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" } } }, @@ -20852,8 +21306,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "in-publish": { "version": "2.0.0", @@ -20883,7 +21336,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -20931,58 +21383,133 @@ "dev": true }, "inquirer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", - "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "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": "^3.2.0", + "ansi-escapes": "^4.2.1", "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", + "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.11", - "mute-stream": "0.0.7", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" }, "dependencies": { "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "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" + } }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "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==", + "cli-cursor": { + "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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "restore-cursor": "^3.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "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" + } + }, + "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 + }, + "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 + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "restore-cursor": { + "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" } }, "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "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" } }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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" + } + } + } + }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -20990,7 +21517,21 @@ "dev": true, "requires": { "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } } + }, + "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 } } }, @@ -21015,9 +21556,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "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", @@ -21316,7 +21857,8 @@ "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true }, "is-equal-shallow": { "version": "0.1.3", @@ -21460,8 +22002,7 @@ "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 + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-plain-object": { "version": "2.0.4", @@ -21741,9 +22282,9 @@ } }, "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==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "pify": { @@ -21760,194 +22301,246 @@ } } }, - "iterate-value": { + "iterate-iterator": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.1.tgz", - "integrity": "sha512-xc6jTbwPOWEdD26y41BpJBqh/w3kuEcsQxTypXD+xYQA2+OZIfemmkm725cnRbm1cHj4SMLUO1+7oIA97e88gg==", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz", + "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==", + "dev": true + }, + "iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", "dev": true, "requires": { - "es-get-iterator": "^1.0.1" + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" } }, "jest": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.7.1.tgz", - "integrity": "sha512-AbvRar5r++izmqo5gdbAjTeA6uNRGoNRuj5vHB0OnDXo2DXWZJVuaObiGgtlvhKb+cWy2oYbQSfxv7Q7GjnAtA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "dev": true, "requires": { "import-local": "^2.0.0", - "jest-cli": "^24.7.1" + "jest-cli": "^24.9.0" }, "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "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 + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "@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": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "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 - } + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.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==", + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "@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": { - "pump": "^3.0.0" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" } }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "@types/yargs": { + "version": "13.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", "dev": true, "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "@types/yargs-parser": "*" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "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 }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "ci-info": "^2.0.0" + "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==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, "jest-cli": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.7.1.tgz", - "integrity": "sha512-32OBoSCVPzcTslGFl6yVCMzB2SqX3IrWwZCY5mZYkb0D2WsogmU3eV2o8z7+gRQa4o4sZPX/k7GU+II7CxM6WQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", "dev": true, "requires": { - "@jest/core": "^24.7.1", - "@jest/test-result": "^24.7.1", - "@jest/types": "^24.7.0", + "@jest/core": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", "exit": "^0.1.2", "import-local": "^2.0.0", "is-ci": "^2.0.0", - "jest-config": "^24.7.1", - "jest-util": "^24.7.1", - "jest-validate": "^24.7.0", + "jest-config": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "prompts": "^2.0.1", "realpath-native": "^1.1.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" } }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "@jest/types": "^24.9.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" } }, - "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 - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" } }, - "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==", + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -21968,68 +22561,124 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "dev": true, "requires": { - "find-up": "^3.0.0" + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^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 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" } } } }, "jest-changed-files": { - "version": "24.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.7.0.tgz", - "integrity": "sha512-33BgewurnwSfJrW7T5/ZAXGE44o7swLslwh8aUckzq2e17/2Os1V0QU506ZNik3hjs8MgnEMKNkcud442NCDTw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "dev": true, "requires": { - "@jest/types": "^24.7.0", + "@jest/types": "^24.9.0", "execa": "^1.0.0", "throat": "^4.0.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.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -22041,14 +22690,6 @@ "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" - }, - "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 - } } }, "execa": { @@ -22084,38 +22725,228 @@ "end-of-stream": "^1.1.0", "once": "^1.3.1" } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, "jest-config": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.7.1.tgz", - "integrity": "sha512-8FlJNLI+X+MU37j7j8RE4DnJkvAghXmBWdArVzypW6WxfGuxiL/CCkzBg0gHtXhD2rxla3IMOSUAHylSKYJ83g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.7.1", - "@jest/types": "^24.7.0", - "babel-jest": "^24.7.1", + "@jest/test-sequencer": "^24.9.0", + "@jest/types": "^24.9.0", + "babel-jest": "^24.9.0", "chalk": "^2.0.1", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.7.1", - "jest-environment-node": "^24.7.1", - "jest-get-type": "^24.3.0", - "jest-jasmine2": "^24.7.1", + "jest-environment-jsdom": "^24.9.0", + "jest-environment-node": "^24.9.0", + "jest-get-type": "^24.9.0", + "jest-jasmine2": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.7.1", - "jest-util": "^24.7.1", - "jest-validate": "^24.7.0", + "jest-resolve": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "micromatch": "^3.1.10", - "pretty-format": "^24.7.0", + "pretty-format": "^24.9.0", "realpath-native": "^1.1.0" }, "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.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" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@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.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "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 + }, "jest-get-type": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", - "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "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==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } + }, + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 } } @@ -22142,9 +22973,9 @@ "dev": true }, "prompts": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", - "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", + "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", "dev": true, "requires": { "kleur": "^3.0.3", @@ -22152,15 +22983,15 @@ } }, "sisteransi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", - "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", + "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==", "dev": true }, "tree-kill": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", - "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true } } @@ -22187,22 +23018,167 @@ } }, "jest-each": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.7.1.tgz", - "integrity": "sha512-4fsS8fEfLa3lfnI1Jw6NxjhyRTgfpuOVTeUZZFyVYqeTa4hPhr2YkToUhouuLTrL2eMGOfpbdMyRx0GQ/VooKA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", "dev": true, "requires": { - "@jest/types": "^24.7.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "jest-get-type": "^24.3.0", - "jest-util": "^24.7.1", - "pretty-format": "^24.7.0" + "jest-get-type": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0" }, "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.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" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@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.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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 + }, "jest-get-type": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", - "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 } } @@ -22220,9 +23196,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz", - "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==", + "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" @@ -22237,131 +23213,679 @@ } }, "jest-environment-jsdom": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.7.1.tgz", - "integrity": "sha512-Gnhb+RqE2JuQGb3kJsLF8vfqjt3PHKSstq4Xc8ic+ax7QKo4Z0RWGucU3YV+DwKR3T9SYc+3YCUQEJs8r7+Jxg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", "dev": true, "requires": { - "@jest/environment": "^24.7.1", - "@jest/fake-timers": "^24.7.1", - "@jest/types": "^24.7.0", - "jest-mock": "^24.7.0", - "jest-util": "^24.7.1", + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0", "jsdom": "^11.5.1" - } - }, - "jest-environment-node": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.7.1.tgz", - "integrity": "sha512-GJJQt1p9/C6aj6yNZMvovZuxTUd+BEJprETdvTKSb4kHcw4mFj8777USQV0FJoJ4V3djpOwA5eWyPwfq//PFBA==", - "dev": true, - "requires": { - "@jest/environment": "^24.7.1", - "@jest/fake-timers": "^24.7.1", - "@jest/types": "^24.7.0", - "jest-mock": "^24.7.0", - "jest-util": "^24.7.1" - } - }, - "jest-environment-puppeteer": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-4.3.0.tgz", - "integrity": "sha512-ZighMsU39bnacn2ylyHb88CB+ldgCfXGD3lS78k4PEo8A8xyt6+2mxmSR62FH3Y7K+W2gPDu5+QM3/LZuq42fQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "cwd": "^0.10.0", - "jest-dev-server": "^4.3.0", - "merge-deep": "^3.0.2" - } - }, - "jest-get-type": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", - "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", - "dev": true - }, - "jest-haste-map": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.7.1.tgz", - "integrity": "sha512-g0tWkzjpHD2qa03mTKhlydbmmYiA2KdcJe762SbfFo/7NIMgBWAA0XqQlApPwkWOF7Cxoi/gUqL0i6DIoLpMBw==", - "dev": true, - "requires": { - "@jest/types": "^24.7.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.4.0", - "jest-util": "^24.7.1", - "jest-worker": "^24.6.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" }, "dependencies": { - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - } - } - }, - "jest-jasmine2": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.7.1.tgz", - "integrity": "sha512-Y/9AOJDV1XS44wNwCaThq4Pw3gBPiOv/s6NcbOAkVRRUEPu+36L2xoPsqQXsDrxoBerqeyslpn2TpCI8Zr6J2w==", - "dev": true, - "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.7.1", - "@jest/test-result": "^24.7.1", - "@jest/types": "^24.7.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.7.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.7.1", - "jest-matcher-utils": "^24.7.0", - "jest-message-util": "^24.7.1", - "jest-runtime": "^24.7.1", - "jest-snapshot": "^24.7.1", - "jest-util": "^24.7.1", - "pretty-format": "^24.7.0", - "throat": "^4.0.0" - } - }, - "jest-junit": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-6.4.0.tgz", - "integrity": "sha512-GXEZA5WBeUich94BARoEUccJumhCgCerg7mXDFLxWwI2P7wL3Z7sGWk+53x343YdBLjiMR9aD/gYMVKO+0pE4Q==", - "dev": true, - "requires": { - "jest-validate": "^24.0.0", - "mkdirp": "^0.5.1", - "strip-ansi": "^4.0.0", - "xml": "^1.0.1" - } - }, - "jest-leak-detector": { - "version": "24.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.7.0.tgz", - "integrity": "sha512-zV0qHKZGXtmPVVzT99CVEcHE9XDf+8LwiE0Ob7jjezERiGVljmqKFWpV2IkG+rkFIEUHFEkMiICu7wnoPM/RoQ==", - "dev": true, - "requires": { - "pretty-format": "^24.7.0" - } - }, - "jest-matcher-utils": { - "version": "24.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz", - "integrity": "sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg==", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.7.0", + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.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" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@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.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "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 + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 + } + } + }, + "jest-environment-node": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", + "dev": true, + "requires": { + "@jest/environment": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/types": "^24.9.0", + "jest-mock": "^24.9.0", + "jest-util": "^24.9.0" + }, + "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.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" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@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.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "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 + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 + } + } + }, + "jest-environment-puppeteer": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-4.3.0.tgz", + "integrity": "sha512-ZighMsU39bnacn2ylyHb88CB+ldgCfXGD3lS78k4PEo8A8xyt6+2mxmSR62FH3Y7K+W2gPDu5+QM3/LZuq42fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cwd": "^0.10.0", + "jest-dev-server": "^4.3.0", + "merge-deep": "^3.0.2" + } + }, + "jest-get-type": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", + "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", + "dev": true + }, + "jest-haste-map": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.7.1.tgz", + "integrity": "sha512-g0tWkzjpHD2qa03mTKhlydbmmYiA2KdcJe762SbfFo/7NIMgBWAA0XqQlApPwkWOF7Cxoi/gUqL0i6DIoLpMBw==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.4.0", + "jest-util": "^24.7.1", + "jest-worker": "^24.6.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + } + } + }, + "jest-jasmine2": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.9.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.9.0", + "jest-matcher-utils": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "pretty-format": "^24.9.0", + "throat": "^4.0.0" + }, + "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.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" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@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.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true + }, + "expect": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "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" + } + }, + "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 + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "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==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, + "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==", + "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", + "natural-compare": "^1.4.0", + "pretty-format": "^24.9.0", + "semver": "^6.2.0" + } + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 + } + } + }, + "jest-junit": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-6.4.0.tgz", + "integrity": "sha512-GXEZA5WBeUich94BARoEUccJumhCgCerg7mXDFLxWwI2P7wL3Z7sGWk+53x343YdBLjiMR9aD/gYMVKO+0pE4Q==", + "dev": true, + "requires": { + "jest-validate": "^24.0.0", + "mkdirp": "^0.5.1", + "strip-ansi": "^4.0.0", + "xml": "^1.0.1" + } + }, + "jest-leak-detector": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "dev": true, + "requires": { + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "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.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + } + } + }, + "jest-matcher-utils": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.7.0.tgz", + "integrity": "sha512-158ieSgk3LNXeUhbVJYRXyTPSCqNgVXOp/GT7O94mYd3pk/8+odKTyR1JLtNOQSPzNi8NFYVONtvSWA/e1RDXg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.7.0", "jest-get-type": "^24.3.0", "pretty-format": "^24.7.0" } @@ -22390,281 +23914,917 @@ } } }, - "jest-mock": { - "version": "24.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.7.0.tgz", - "integrity": "sha512-6taW4B4WUcEiT2V9BbOmwyGuwuAFT2G8yghF7nyNW1/2gq5+6aTqSPcS9lS6ArvEkX55vbPAS/Jarx5LSm4Fng==", - "dev": true, - "requires": { - "@jest/types": "^24.7.0" - } - }, - "jest-pnp-resolver": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", - "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", - "dev": true - }, - "jest-puppeteer": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/jest-puppeteer/-/jest-puppeteer-4.3.0.tgz", - "integrity": "sha512-WXhaWlbQl01xadZyNmdZntrtIr8uWUmgjPogDih7dOnr3G/xRr3A034SCqdjwV6fE0tqz7c5hwO8oBTyGZPRgA==", - "dev": true, - "requires": { - "expect-puppeteer": "^4.3.0", - "jest-environment-puppeteer": "^4.3.0" - } - }, - "jest-regex-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", - "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", - "dev": true - }, - "jest-resolve": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.7.1.tgz", - "integrity": "sha512-Bgrc+/UUZpGJ4323sQyj85hV9d+ANyPNu6XfRDUcyFNX1QrZpSoM0kE4Mb2vZMAYTJZsBFzYe8X1UaOkOELSbw==", - "dev": true, - "requires": { - "@jest/types": "^24.7.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" - } - }, - "jest-resolve-dependencies": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.7.1.tgz", - "integrity": "sha512-2Eyh5LJB2liNzfk4eo7bD1ZyBbqEJIyyrFtZG555cSWW9xVHxII2NuOkSl1yUYTAYCAmM2f2aIT5A7HzNmubyg==", - "dev": true, - "requires": { - "@jest/types": "^24.7.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.7.1" - } - }, + "jest-mock": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.7.0.tgz", + "integrity": "sha512-6taW4B4WUcEiT2V9BbOmwyGuwuAFT2G8yghF7nyNW1/2gq5+6aTqSPcS9lS6ArvEkX55vbPAS/Jarx5LSm4Fng==", + "dev": true, + "requires": { + "@jest/types": "^24.7.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true + }, + "jest-puppeteer": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/jest-puppeteer/-/jest-puppeteer-4.3.0.tgz", + "integrity": "sha512-WXhaWlbQl01xadZyNmdZntrtIr8uWUmgjPogDih7dOnr3G/xRr3A034SCqdjwV6fE0tqz7c5hwO8oBTyGZPRgA==", + "dev": true, + "requires": { + "expect-puppeteer": "^4.3.0", + "jest-environment-puppeteer": "^4.3.0" + } + }, + "jest-regex-util": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", + "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", + "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==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.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.6", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.6.tgz", + "integrity": "sha512-IkltIncDQWv6fcAvnHtJ6KtkmY/vtR3bViOaCzpj/A3yNhlfZAgxNe6AEQD1cQrkYD+YsKVo08DSxvNKEsD7BA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.9.0" + }, + "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@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.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true + }, + "expect": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "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" + }, + "dependencies": { + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-resolve": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, + "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==", + "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", + "natural-compare": "^1.4.0", + "pretty-format": "^24.9.0", + "semver": "^6.2.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==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 + } + } + }, "jest-runner": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.7.1.tgz", - "integrity": "sha512-aNFc9liWU/xt+G9pobdKZ4qTeG/wnJrJna3VqunziDNsWT3EBpmxXZRBMKCsNMyfy+A/XHiV+tsMLufdsNdgCw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.7.1", - "@jest/test-result": "^24.7.1", - "@jest/types": "^24.7.0", + "@jest/environment": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", "chalk": "^2.4.2", "exit": "^0.1.2", "graceful-fs": "^4.1.15", - "jest-config": "^24.7.1", + "jest-config": "^24.9.0", "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.7.1", - "jest-jasmine2": "^24.7.1", - "jest-leak-detector": "^24.7.0", - "jest-message-util": "^24.7.1", - "jest-resolve": "^24.7.1", - "jest-runtime": "^24.7.1", - "jest-util": "^24.7.1", + "jest-haste-map": "^24.9.0", + "jest-jasmine2": "^24.9.0", + "jest-leak-detector": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-resolve": "^24.9.0", + "jest-runtime": "^24.9.0", + "jest-util": "^24.9.0", "jest-worker": "^24.6.0", "source-map-support": "^0.5.6", "throat": "^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==", + "@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": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + }, + "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + } + } + }, + "@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.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" } }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "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 + }, + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "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" + } + } + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "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==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "dev": true + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.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 + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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" + } } } }, "jest-runtime": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.7.1.tgz", - "integrity": "sha512-0VAbyBy7tll3R+82IPJpf6QZkokzXPIS71aDeqh+WzPRXRCNz6StQ45otFariPdJ4FmXpDiArdhZrzNAC3sj6A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", "dev": true, "requires": { "@jest/console": "^24.7.1", - "@jest/environment": "^24.7.1", + "@jest/environment": "^24.9.0", "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.7.1", - "@jest/types": "^24.7.0", - "@types/yargs": "^12.0.2", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "chalk": "^2.0.1", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.1.15", - "jest-config": "^24.7.1", - "jest-haste-map": "^24.7.1", - "jest-message-util": "^24.7.1", - "jest-mock": "^24.7.0", + "jest-config": "^24.9.0", + "jest-haste-map": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0", "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.7.1", - "jest-snapshot": "^24.7.1", - "jest-util": "^24.7.1", - "jest-validate": "^24.7.0", + "jest-resolve": "^24.9.0", + "jest-snapshot": "^24.9.0", + "jest-util": "^24.9.0", + "jest-validate": "^24.9.0", "realpath-native": "^1.1.0", "slash": "^2.0.0", "strip-bom": "^3.0.0", - "yargs": "^12.0.2" + "yargs": "^13.3.0" }, "dependencies": { + "@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" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + }, + "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + } + } + }, + "@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.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true + }, + "expect": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "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" + }, + "dependencies": { + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "dev": true + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "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 - } + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "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==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.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==", + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "dev": true, "requires": { - "pump": "^3.0.0" + "@jest/types": "^24.9.0" } }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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==", "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" + "@jest/types": "^24.9.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" } }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", "dev": true }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true + "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==", + "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", + "natural-compare": "^1.4.0", + "pretty-format": "^24.9.0", + "semver": "^6.2.0" + } }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + } } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "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": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "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 }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.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==", + "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 }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -22685,56 +24845,110 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "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==", + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" } }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "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": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "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 + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "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" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^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 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" } } } @@ -22772,29 +24986,171 @@ } }, "jest-snapshot": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.7.1.tgz", - "integrity": "sha512-8Xk5O4p+JsZZn4RCNUS3pxA+ORKpEKepE+a5ejIKrId9CwrVN0NY+vkqEkXqlstA5NMBkNahXkR/4qEBy0t5yA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.7.0", + "@jest/types": "^24.9.0", "chalk": "^2.0.1", - "expect": "^24.7.1", - "jest-diff": "^24.7.0", - "jest-matcher-utils": "^24.7.0", - "jest-message-util": "^24.7.1", - "jest-resolve": "^24.7.1", + "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", "natural-compare": "^1.4.0", - "pretty-format": "^24.7.0", - "semver": "^5.5.0" + "pretty-format": "^24.9.0", + "semver": "^6.2.0" }, "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@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.6", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.6.tgz", + "integrity": "sha512-IkltIncDQWv6fcAvnHtJ6KtkmY/vtR3bViOaCzpj/A3yNhlfZAgxNe6AEQD1cQrkYD+YsKVo08DSxvNKEsD7BA==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "diff-sequences": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "jest-diff": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.9.0", + "jest-get-type": "^24.9.0", + "pretty-format": "^24.9.0" + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 } } @@ -22828,27 +25184,12 @@ "source-map": "^0.6.0" }, "dependencies": { - "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 - }, "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "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 }, - "is-ci": { - "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" - } - }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -22882,28 +25223,151 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true - }, - "jest-get-type": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.3.0.tgz", - "integrity": "sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==", - "dev": true } } }, "jest-watcher": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.7.1.tgz", - "integrity": "sha512-Wd6TepHLRHVKLNPacEsBwlp9raeBIO+01xrN24Dek4ggTS8HHnOzYSFnvp+6MtkkJ3KfMzy220KTi95e2rRkrw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "dev": true, "requires": { - "@jest/test-result": "^24.7.1", - "@jest/types": "^24.7.0", - "@types/yargs": "^12.0.9", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/yargs": "^13.0.0", "ansi-escapes": "^3.0.0", "chalk": "^2.0.1", - "jest-util": "^24.7.1", + "jest-util": "^24.9.0", "string-length": "^2.0.0" + }, + "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.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" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@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.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz", + "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "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 + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "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 + } } }, "jest-worker": { @@ -22927,18 +25391,18 @@ } } }, + "jetifier": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.5.tgz", + "integrity": "sha512-T7yzBSu9PR+DqjYt+I0KVO1XTb1QhAfHnXV5Nd3xpbXM6Xg4e3vP60Q4qkNU8Fh6PHC2PivPUNN3rY7G2MxcDQ==", + "dev": true + }, "js-base64": { "version": "2.4.6", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.6.tgz", "integrity": "sha512-O9SR2NVICx6rCqh1qsU91QZ5IoNa+2T1ROJ0OQlfvATKGmnjsAvg3r0E5ufPZ4a95jdKTPXhFWiE/sOZ7a5Rtg==", "dev": true }, - "js-levenshtein": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.3.tgz", - "integrity": "sha512-/812MXr9RBtMObviZ8gQBhHO8MOrGj8HlEE+4ccMTElNA/6I3u39u+bhny55Lk921yn44nSZFy9naNLElL5wgQ==", - "dev": true - }, "js-string-escape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", @@ -22960,6 +25424,7 @@ "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" @@ -22968,7 +25433,8 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true } } }, @@ -23189,6 +25655,12 @@ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, + "jsonc-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.0.tgz", + "integrity": "sha512-4fLQxW1j/5fWj6p78vAlAafoCKtuBm6ghv+Ij5W2DrDx0qE+ZdEl2c6Ko1mgJNF5ftX1iEWQQ4Ap7+3GlhjkOA==", + "dev": true + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -23258,9 +25730,15 @@ } }, "kleur": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.2.tgz", - "integrity": "sha512-3h7B2WRT5LNXOtQiAaWonilegHcPSf9nLVXlSTci8lu1dZUuui61+EsPEZqSVxY7rXYmB2DVKMQILxaO5WL61Q==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "known-css-properties": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.11.0.tgz", + "integrity": "sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w==", "dev": true }, "lazy-cache": { @@ -23335,6 +25813,23 @@ "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", "dev": true }, + "levenary": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.0.tgz", + "integrity": "sha512-VHcwhO0UTpUW7rLPN2/OiWJdgA1e9BqEDALhrgCe/F+uUJnep6CoUsTzMeP8Rh0NGr9uKquXxqe7lwLZo509nQ==", + "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", @@ -23356,8 +25851,16 @@ "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } }, "lint-staged": { "version": "9.2.5", @@ -23390,16 +25893,11 @@ "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==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true }, "cosmiconfig": { "version": "5.2.1", @@ -23414,16 +25912,14 @@ } }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "debug": { @@ -23436,12 +25932,12 @@ } }, "execa": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/execa/-/execa-2.0.4.tgz", - "integrity": "sha512-VcQfhuGD51vQUQtKIq2fjGDLDbL6N1DTQVpYzxZ7LPIXw3HqTuIz6uxRmpV1qf8i31LHf2kjiaGI+GdHwRgbnQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", "dev": true, "requires": { - "cross-spawn": "^6.0.5", + "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", @@ -23542,14 +26038,6 @@ "dev": true, "requires": { "path-key": "^3.0.0" - }, - "dependencies": { - "path-key": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.0.tgz", - "integrity": "sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg==", - "dev": true - } } }, "onetime": { @@ -23577,6 +26065,12 @@ "json-parse-better-errors": "^1.0.1" } }, + "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", @@ -23587,10 +26081,19 @@ "once": "^1.3.1" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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 }, "to-regex-range": { @@ -23601,6 +26104,15 @@ "requires": { "is-number": "^7.0.0" } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -23792,6 +26304,12 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, + "lodash.differencewith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.differencewith/-/lodash.differencewith-4.5.0.tgz", + "integrity": "sha1-uvr7yRi1UVTheRdqALsK76rIVLc=", + "dev": true + }, "lodash.escape": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", @@ -23804,6 +26322,12 @@ "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=", "dev": true }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -23946,12 +26470,13 @@ } }, "logkitty": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.5.0.tgz", - "integrity": "sha512-UA06TmPaSPiHxMBlo5uxL3ZvjJ2Gx/rEECrqowHsIsNoAoSB8aBSP553Fr2FJhOp3it2ulLsd520DZWS1IaYOw==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.6.1.tgz", + "integrity": "sha512-cHuXN8qUZuzX/7kB6VyS7kB4xyD24e8gyHXIFNhIv+fjW3P+jEXNUhj0o/7qWJtv7UZpbnPgUqzu/AZQ8RAqxQ==", "dev": true, "requires": { "ansi-fragments": "^0.2.1", + "dayjs": "^1.8.15", "yargs": "^12.0.5" }, "dependencies": { @@ -24067,9 +26592,9 @@ "dev": true }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -24101,9 +26626,9 @@ } }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "yargs": { @@ -24237,9 +26762,9 @@ }, "dependencies": { "bluebird": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", - "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, "cacache": { @@ -24272,9 +26797,9 @@ "dev": true }, "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "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", @@ -24286,9 +26811,9 @@ } }, "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==", + "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 }, "lru-cache": { @@ -24432,6 +26957,27 @@ "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==", "dev": true }, + "markdown-it": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", + "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~2.0.0", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + } + } + }, "markdown-table": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz", @@ -24448,6 +26994,71 @@ "unquote": "^1.1.0" } }, + "markdownlint": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.18.0.tgz", + "integrity": "sha512-nQAfK9Pbq0ZRoMC/abNGterEnV3kL8MZmi0WHhw8WJKoIbsm3cXGufGsxzCRvjW15cxe74KWcxRSKqwplS26Bw==", + "dev": true, + "requires": { + "markdown-it": "10.0.0" + } + }, + "markdownlint-cli": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.21.0.tgz", + "integrity": "sha512-gvnczz3W3Wgex851/cIQ/2y8GNhY+EVK8Ael8kRd8hoSQ0ps9xjhtwPwMyJPoiYbAoPxG6vSBFISiysaAbCEZg==", + "dev": true, + "requires": { + "commander": "~2.9.0", + "deep-extend": "~0.5.1", + "get-stdin": "~5.0.1", + "glob": "~7.1.2", + "ignore": "~5.1.4", + "js-yaml": "~3.13.1", + "jsonc-parser": "~2.2.0", + "lodash.differencewith": "~4.5.0", + "lodash.flatten": "~4.4.0", + "markdownlint": "~0.18.0", + "markdownlint-rule-helpers": "~0.6.0", + "minimatch": "~3.0.4", + "rc": "~1.2.7" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "dev": true + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "dev": true + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true + } + } + }, + "markdownlint-rule-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.6.0.tgz", + "integrity": "sha512-LiZVAbg9/cqkBHtLNNqHV3xuy4Y2L/KuGU6+ZXqCT9NnCdEkIoxeI5/96t+ExquBY0iHy2CVWxPH16nG1RKQVQ==", + "dev": true + }, "material-colors": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/material-colors/-/material-colors-1.2.6.tgz", @@ -24764,9 +27375,9 @@ "dev": true }, "metro": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.54.1.tgz", - "integrity": "sha512-6ODPT4mEo4FCpbExRNnQAcZmf1VeNvYOTMj2Na03FjGqhNODHhI2U/wF/Ul5gqTyJ2dVdkXeyvKW3gl/LrnJRg==", + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.56.3.tgz", + "integrity": "sha512-mxHpvBGWanZ46wAEZVLinNO5IYMcFbTdMZIRhC7r+rvoSK6r9iPj95AujBfzLXMAl36RI2O3D7yp5hOYif/gEQ==", "dev": true, "requires": { "@babel/core": "^7.0.0", @@ -24796,21 +27407,21 @@ "json-stable-stringify": "^1.0.1", "lodash.throttle": "^4.1.1", "merge-stream": "^1.0.1", - "metro-babel-register": "0.54.1", - "metro-babel-transformer": "0.54.1", - "metro-cache": "0.54.1", - "metro-config": "0.54.1", - "metro-core": "0.54.1", - "metro-inspector-proxy": "0.54.1", - "metro-minify-uglify": "0.54.1", - "metro-react-native-babel-preset": "0.54.1", - "metro-resolver": "0.54.1", - "metro-source-map": "0.54.1", + "metro-babel-register": "0.56.3", + "metro-babel-transformer": "0.56.3", + "metro-cache": "0.56.3", + "metro-config": "0.56.3", + "metro-core": "0.56.3", + "metro-inspector-proxy": "0.56.3", + "metro-minify-uglify": "0.56.3", + "metro-react-native-babel-preset": "0.56.3", + "metro-resolver": "0.56.3", + "metro-source-map": "0.56.3", + "metro-symbolicate": "0.56.3", "mime-types": "2.1.11", "mkdirp": "^0.5.1", "node-fetch": "^2.2.0", "nullthrows": "^1.1.0", - "react-transform-hmr": "^1.0.4", "resolve": "^1.5.0", "rimraf": "^2.5.4", "serialize-error": "^2.1.0", @@ -24855,9 +27466,9 @@ } }, "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", "dev": true }, "debug": { @@ -24896,6 +27507,20 @@ "klaw": "^1.0.0" } }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "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", @@ -24927,9 +27552,9 @@ } }, "metro-react-native-babel-preset": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.54.1.tgz", - "integrity": "sha512-Hfr32+u5yYl3qhYQJU8NQ26g4kQlc3yFMg7keVR/3H8rwBIbFqXgsKt8oe0dOrv7WvrMqBHhDtVdU9ls3sSq8g==", + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.56.3.tgz", + "integrity": "sha512-tGPzX2ZwI8vQ8SiNVBPUIgKqmaRNVB6rtJtHCBQZAYRiMbxh0NHCUoFfKBej6U5qVgxiYYHyN8oB23evG4/Oow==", "dev": true, "requires": { "@babel/plugin-proposal-class-properties": "^7.0.0", @@ -24966,8 +27591,20 @@ "@babel/plugin-transform-typescript": "^7.0.0", "@babel/plugin-transform-unicode-regex": "^7.0.0", "@babel/template": "^7.0.0", - "metro-babel7-plugin-react-transform": "0.54.1", - "react-transform-hmr": "^1.0.4" + "react-refresh": "^0.4.0" + } + }, + "metro-symbolicate": { + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.56.3.tgz", + "integrity": "sha512-fSQtjjy4eiJDThSl9eloxMElhrs+5PQB+DKKzmTFXT8e2GDga+pa1xTBFRUACMO8BXGuWmxR7SnGDw0wo5Ngrw==", + "dev": true, + "requires": { + "invariant": "^2.2.4", + "metro-source-map": "0.56.3", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" } }, "mime-db": { @@ -25000,6 +27637,12 @@ "pify": "^2.0.0" } }, + "react-refresh": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.2.tgz", + "integrity": "sha512-kv5QlFFSZWo7OlJFNYbxRtY66JImuP2LcrFgyJfQaf85gSP+byzG21UbDQEYjU7f//ny8rwiEkO6py2Y+fEgAQ==", + "dev": true + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -25021,6 +27664,15 @@ "read-pkg": "^2.0.0" } }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -25090,9 +27742,9 @@ } }, "metro-babel-register": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.54.1.tgz", - "integrity": "sha512-j3VydgncUG8HP6AZala6GTIt3V01nptodnnOke3JMYLqgk8EJ1LOVOdotK9pXi80o7EmmNKFs/LyyH8z+uAJzQ==", + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.56.3.tgz", + "integrity": "sha512-ILCRtNFdW6vzqmLAG2MYWdTSE1vCAZqDKNggiNhlfViuoxmWAIL0vOqixl1CHZF5z4t55+fk46A0jSN7UgPyVw==", "dev": true, "requires": { "@babel/core": "^7.0.0", @@ -25110,73 +27762,80 @@ }, "dependencies": { "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", "dev": true } } }, "metro-babel-transformer": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.54.1.tgz", - "integrity": "sha512-2aiAnuYBdcLV1VINb8ENAA4keIaJIepHgR9+iRvIde+9GSjKnexqx4nNmJN392285gRDp1fVZ7uY0uQawK/A5g==", + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.56.3.tgz", + "integrity": "sha512-N5/ftb3rBkt6uKlgYAv+lwtzYc4dK0tBpfZ8pjec3kcypGuGTuf4LTHEh65EuzySreLngYI0bQzoFSn3G3DYsw==", "dev": true, "requires": { - "@babel/core": "^7.0.0" - } - }, - "metro-babel7-plugin-react-transform": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.54.1.tgz", - "integrity": "sha512-jWm5myuMoZAOhoPsa8ItfDxdTcOzKhTTzzhFlbZnRamE7i9qybeMdrZt8KHQpF7i2p/mKzE9Yhf4ouOz5K/jHg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0" + "@babel/core": "^7.0.0", + "metro-source-map": "0.56.3" } }, "metro-cache": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.54.1.tgz", - "integrity": "sha512-RxCFoNcANHXZYi4MIQNnqh68gUnC3bMpzCFJY5pBoqqdrkkn8ibYglBweA0/DW7hx1OZTJWelwS1Dp8xxmE2CA==", + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.56.3.tgz", + "integrity": "sha512-SsryVe/TVkt2IkEGnYhB3gQlg9iMlu8WJikQHcCEjMfPEnSIzmeymrX73fwQNPnTnN7F3E0HVjH6Wvq6fh0mcA==", "dev": true, "requires": { "jest-serializer": "^24.4.0", - "metro-core": "0.54.1", + "metro-core": "0.56.3", "mkdirp": "^0.5.1", "rimraf": "^2.5.4" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "metro-config": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.54.1.tgz", - "integrity": "sha512-FpxrA+63rGkPGvGI653dvuSreJzU+eOTILItVnnhmqwn2SAK5V00N/qGTOIJe2YIuWEFXwCzw9lXmANrXbwuGg==", + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.56.3.tgz", + "integrity": "sha512-C3ZLA5y5gW5auDSQN5dsCTduJg7LXEiX/tLAADOkgXWVImr5P74x9Wt8y1MMWrKx6p+4p5RMDyEwWDMXJt/DwA==", "dev": true, "requires": { "cosmiconfig": "^5.0.5", "jest-validate": "^24.7.0", - "metro": "0.54.1", - "metro-cache": "0.54.1", - "metro-core": "0.54.1", + "metro": "0.56.3", + "metro-cache": "0.56.3", + "metro-core": "0.56.3", "pretty-format": "^24.7.0" } }, "metro-core": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.54.1.tgz", - "integrity": "sha512-8oz3Ck7QFBzW9dG9tKFhrXHKPu2Ajx3R7eatf61Gl6Jf/tF7PNouv3wHxPsJW3oXDFiwKLszd89+OgleTGkB5g==", + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.56.3.tgz", + "integrity": "sha512-OAaHP3mBdlACMZRwDJzZzYC0o2S3qfb4BBK75L8H4Ds+y3QUSrjsDEpHACcpaMTOds8rBvjzn+jjB5tqNoHfBA==", "dev": true, "requires": { "jest-haste-map": "^24.7.1", "lodash.throttle": "^4.1.1", - "metro-resolver": "0.54.1", + "metro-resolver": "0.56.3", "wordwrap": "^1.0.0" } }, "metro-inspector-proxy": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.54.1.tgz", - "integrity": "sha512-sf6kNu7PgFW6U+hU7YGZfbAUKAPVvCJhY8YVu/A1RMKH9nNULrCo+jlWh0gWgmFfWRQiAPCElevROg+5somk8A==", + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.56.3.tgz", + "integrity": "sha512-7WtHinw+VJcunQ3q8El1MqqzYSRvXEjW5QE13VYwcLtnay3pvcqACeiQmGbWI0IqxB1+QH8tf3nkA7z7pQ7Vpw==", "dev": true, "requires": { "connect": "^3.6.5", @@ -25349,36 +28008,12 @@ } }, "metro-minify-uglify": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.54.1.tgz", - "integrity": "sha512-z+pOPna/8IxD4OhjW6Xo1mV2EszgqqQHqBm1FdmtdF6IpWkQp33qpDBNEi9NGZTOr7pp2bvcxZnvNJdC2lrK9Q==", + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.56.3.tgz", + "integrity": "sha512-b9ljyeUpkJWVlFy8M/i4aNbvEBI0zN9vJh1jfU7yx+k9dX7FulLnpGmAQxxQdEszcM//sJrsKNS1oLYBxr0NMQ==", "dev": true, "requires": { "uglify-es": "^3.1.9" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, - "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 - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" - } - } } }, "metro-react-native-babel-preset": { @@ -25471,23 +28106,48 @@ } }, "metro-resolver": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.54.1.tgz", - "integrity": "sha512-Byv1LIawYAASy9CFRwzrncYnqaFGLe8vpw178EtzStqP05Hu6hXSqkNTrfoXa+3V9bPFGCrVzFx2NY3gFp2btg==", + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.56.3.tgz", + "integrity": "sha512-VvMl4xUp0fy76WiP3YDtzMmrn6tN/jwxOBqlTy9MjN6R9sUXrGyO5thwn/uKQqp5vwBTuJev7nZL7OKzwludKA==", "dev": true, "requires": { "absolute-path": "^0.0.0" } }, "metro-source-map": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.54.1.tgz", - "integrity": "sha512-E9iSYMSUSq5qYi1R2hTQtxH4Mxjzfgr/jaSmQIWi7h3fG2P1qOZNNSzeaeUeTK+s2N/ksVlkcL5kMikol8CDrQ==", + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.56.3.tgz", + "integrity": "sha512-CheqWbJZSM0zjcNBqELUiocwH3XArrOk6alhVuzJ2gV/WTMBQFwP0TtQssSMwjnouMHNEzY8RxErXKXBk/zJmQ==", "dev": true, "requires": { "@babel/traverse": "^7.0.0", "@babel/types": "^7.0.0", - "source-map": "^0.5.6" + "invariant": "^2.2.4", + "metro-symbolicate": "0.56.3", + "ob1": "0.56.3", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "dependencies": { + "metro-symbolicate": { + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.56.3.tgz", + "integrity": "sha512-fSQtjjy4eiJDThSl9eloxMElhrs+5PQB+DKKzmTFXT8e2GDga+pa1xTBFRUACMO8BXGuWmxR7SnGDw0wo5Ngrw==", + "dev": true, + "requires": { + "invariant": "^2.2.4", + "metro-source-map": "0.56.3", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + } + }, + "ob1": { + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.56.3.tgz", + "integrity": "sha512-3JL2ZyWOHDGTEAe4kcG+TxhGPKCCikgyoUIjE82JnXnmpR1LXItM9K3WhGsi4+O7oYngMW6FjpHHoc5xJTMkTQ==", + "dev": true + } } }, "metro-symbolicate": { @@ -25654,7 +28314,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -25955,6 +28614,12 @@ "minimatch": "^3.0.4" } }, + "mustache": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.0.0.tgz", + "integrity": "sha512-FJgjyX/IVkbXBXYUwH+OYwQKqWpFPLaLVESd70yHjSDunwzV2hZOoTBvPf4KLoxesUzzyfTH6F784Uqd7Wm5yA==", + "dev": true + }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -25972,6 +28637,13 @@ "thenify-all": "^1.0.0" } }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -26187,9 +28859,9 @@ "dev": true }, "minipass": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.8.6.tgz", - "integrity": "sha512-lFG7d6g3+/UaFDCOtqPiKAC9zngWWsQZl1g5q6gaONqrjq61SX2xFqXMleQiFVyDpYwa018E9hmlAFY22PCb+A==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "requires": { "safe-buffer": "^5.1.2", @@ -26228,17 +28900,17 @@ } }, "yallist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.0.tgz", - "integrity": "sha512-6gpP93MR+VOOehKbCPchro3wFZNSNmek8A2kbkOAZLIZAYx1KP/zAqwO0sOHi3xJEb+UBz8NaYt/17UNit1Q9w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } }, "node-releases": { - "version": "1.1.45", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.45.tgz", - "integrity": "sha512-cXvGSfhITKI8qsV116u2FTzH5EWZJfgG7d4cpqwF8I8+1tWpD6AsvvGRKq2onR0DNj1jfqsjkXZsm14JMS7Cyg==", + "version": "1.1.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz", + "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==", "dev": true, "requires": { "semver": "^6.3.0" @@ -26884,9 +29556,9 @@ } }, "fast-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.0.tgz", - "integrity": "sha512-TrUz3THiq2Vy3bjfQUB2wNyPdGBeGmdjbzzBLhfHN4YFurYptCKwGq/TfiRavbGywFRzY6U2CdmQ1zmsY5yYaw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.1.tgz", + "integrity": "sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -26914,9 +29586,9 @@ } }, "glob": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", - "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "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", @@ -26937,9 +29609,9 @@ } }, "globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", "dev": true, "requires": { "@types/glob": "^7.1.1", @@ -27313,7 +29985,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -27496,6 +30167,22 @@ "execa": "^0.7.0", "lcid": "^1.0.0", "mem": "^1.1.0" + }, + "dependencies": { + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } } }, "os-name": { @@ -27544,12 +30231,6 @@ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -27649,7 +30330,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "requires": { "callsites": "^3.0.0" } @@ -27766,8 +30446,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "2.0.1", @@ -27998,9 +30677,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.0.tgz", - "integrity": "sha512-Z7ti+HB0puCcLmFE3x90kzaVgbx6TRrYIReaygW6EkBEnJh1ajS4/inhF7CypzWeDV3NFl1AfWj0eMtdihojxw==", + "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" @@ -28059,28 +30738,6 @@ "supports-color": "^6.1.0" }, "dependencies": { - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "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" - } - } - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -28357,16 +31014,6 @@ } } }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, "@babel/helpers": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.3.1.tgz", @@ -28394,12 +31041,14 @@ "@babel/parser": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz", - "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==" + "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", @@ -28410,6 +31059,7 @@ "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", @@ -28841,11 +31491,20 @@ "dev": true }, "prettier": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", - "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "version": "npm:wp-prettier@1.19.1", + "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-1.19.1.tgz", + "integrity": "sha512-mqAC2r1NDmRjG+z3KCJ/i61tycKlmADIjxnDhQab+KBxSAGbF/W7/zwB2guy/ypIeKrrftNsIYkNZZQKf3vJcg==", "dev": true }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "pretty-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", @@ -28962,9 +31621,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "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", @@ -29078,9 +31737,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "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", @@ -29183,13 +31842,13 @@ } }, "prompts": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.3.tgz", - "integrity": "sha512-H8oWEoRZpybm6NV4to9/1limhttEo13xK62pNvn2JzY0MA03p7s0OjtmhXyon3uJmxiJJVSuUwEJFFssI3eBiQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz", + "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==", "dev": true, "requires": { - "kleur": "^3.0.2", - "sisteransi": "^1.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.3" } }, "promzard": { @@ -29691,9 +32350,9 @@ }, "dependencies": { "schema-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.1.tgz", - "integrity": "sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", "dev": true, "requires": { "ajv": "^6.10.2", @@ -29794,12 +32453,6 @@ "react-with-styles-interface-css": "^4.0.2" } }, - "react-deep-force-update": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz", - "integrity": "sha512-WUSQJ4P/wWcusaH+zZmbECOk7H5N2pOIl0vzheeornkIMhu+qrNdGFm0bDZLCb0hSF0jf/kH1SgkNGfBdTc4wA==", - "dev": true - }, "react-dev-utils": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.1.0.tgz", @@ -29914,6 +32567,18 @@ "ignore": "^3.3.5", "pify": "^3.0.0", "slash": "^1.0.0" + }, + "dependencies": { + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + } } }, "gzip-size": { @@ -30039,9 +32704,9 @@ } }, "react-devtools-core": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-3.6.1.tgz", - "integrity": "sha512-I/LSX+tpeTrGKaF1wXSfJ/kP+6iaP2JfshEjW8LtQBdz6c6HhzOJtjZXhqOUrAdysuey8M1/JgPY1flSVVt8Ig==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-3.6.3.tgz", + "integrity": "sha512-+P+eFy/yo8Z/UH9J0DqHZuUM5+RI2wl249TNvMx3J2jpUomLQa4Zxl56GEotGfw3PIP1eI+hVf1s53FlUONStQ==", "dev": true, "requires": { "shell-quote": "^1.6.1", @@ -30084,27 +32749,27 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "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.0" + "@babel/highlight": "^7.8.3" } }, "@babel/core": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.0.tgz", - "integrity": "sha512-3rqPi/bv/Xfu2YzHvBz4XqMI1fKVwnhntPA1/fjoECrSjrhbOCxlTrbVu5gUtr8zkxW+RpkDOa/HCW93gzS2Dw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.8.0", - "@babel/generator": "^7.8.0", - "@babel/helpers": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/template": "^7.8.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0", + "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", @@ -30116,61 +32781,61 @@ } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "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.0", + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "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.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "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.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "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.0" + "@babel/types": "^7.8.3" } }, "@babel/helpers": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.0.tgz", - "integrity": "sha512-srWKpjAFbiut5JoCReZJ098hLqoZ9HufOnKZPggc7j74XaPuQ+9b3RYPV1M/HfjL63lCNd8uI1O487qIWxAFNA==", + "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.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "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", @@ -30179,52 +32844,52 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "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.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.0.tgz", - "integrity": "sha512-Z7ti+HB0puCcLmFE3x90kzaVgbx6TRrYIReaygW6EkBEnJh1ajS4/inhF7CypzWeDV3NFl1AfWj0eMtdihojxw==", + "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.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "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.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "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.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "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", @@ -30238,6 +32903,12 @@ "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==", "dev": true }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -30325,9 +32996,9 @@ } }, "react-element-to-jsx-string": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-14.2.0.tgz", - "integrity": "sha512-dTeYuJnKCavqGx0tyeBGILXemmQcP8h6gyCsUG01fzepzB4wjfcjUSUluHOJanhzAiNybY+ASlASRTXUanaj/w==", + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-14.3.1.tgz", + "integrity": "sha512-LRdQWRB+xcVPOL4PU4RYuTg6dUJ/FNmaQ8ls6w38YbzkbV6Yr5tFNESroub9GiSghtnMq8dQg2LcNN5aMIDzVg==", "dev": true, "requires": { "@base2/pretty-print-object": "1.0.0", @@ -30428,15 +33099,15 @@ } }, "react-native": { - "version": "0.60.0", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.60.0.tgz", - "integrity": "sha512-Leo1MfUpQFCLchr60HCDZAk7M6Bd2yPplSDBuCrC9gUtsRO2P4nLxwrX6P+vbjF7Td2sQbcGqW2E809Oi41K0g==", + "version": "0.61.5", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.61.5.tgz", + "integrity": "sha512-MXqE3NoGO0T3dUKIKkIppijBhRRMpfN6ANbhMXHDuyfA+fSilRWgCwYgR/YNCC7ntECoJYikKaNTUBB0DeQy6Q==", "dev": true, "requires": { "@babel/runtime": "^7.0.0", - "@react-native-community/cli": "^2.0.1", - "@react-native-community/cli-platform-android": "^2.0.1", - "@react-native-community/cli-platform-ios": "^2.0.1", + "@react-native-community/cli": "^3.0.0", + "@react-native-community/cli-platform-android": "^3.0.0", + "@react-native-community/cli-platform-ios": "^3.0.0", "abort-controller": "^3.0.0", "art": "^0.10.0", "base64-js": "^1.1.2", @@ -30446,32 +33117,35 @@ "event-target-shim": "^5.0.1", "fbjs": "^1.0.0", "fbjs-scripts": "^1.1.0", + "hermes-engine": "^0.2.1", "invariant": "^2.2.4", - "jsc-android": "245459.0.0", - "metro-babel-register": "0.54.1", - "metro-react-native-babel-transformer": "0.54.1", + "jsc-android": "^245459.0.0", + "metro-babel-register": "^0.56.0", + "metro-react-native-babel-transformer": "^0.56.0", + "metro-source-map": "^0.56.0", "nullthrows": "^1.1.0", "pretty-format": "^24.7.0", "promise": "^7.1.1", "prop-types": "^15.7.2", - "react-devtools-core": "^3.6.0", + "react-devtools-core": "^3.6.3", + "react-refresh": "^0.4.0", "regenerator-runtime": "^0.13.2", - "scheduler": "0.14.0", + "scheduler": "0.15.0", "stacktrace-parser": "^0.1.3", "whatwg-fetch": "^3.0.0" }, "dependencies": { "@react-native-community/cli": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-2.3.0.tgz", - "integrity": "sha512-Vf11SAW1ZwSfZ3JsYiEhU1/Oq9ozKyh7Uawbg8D4IrBM8dCHSpPGhONNfzSQ6x4k9YQjFHH+bOY274/fcYtNXQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-3.0.4.tgz", + "integrity": "sha512-kt+ENtC+eRUSfWPbbpx3r7fAQDcFwgM03VW/lBdVAUjkNxffPFT2GGdK23CJSBOXTjRSiGuwhvwH4Z28PdrlRA==", "dev": true, "requires": { "@hapi/joi": "^15.0.3", - "@react-native-community/cli-platform-android": "^2.1.1", - "@react-native-community/cli-platform-ios": "^2.2.0", - "@react-native-community/cli-tools": "^2.0.2", - "chalk": "^1.1.1", + "@react-native-community/cli-debugger-ui": "^3.0.0", + "@react-native-community/cli-tools": "^3.0.0", + "@react-native-community/cli-types": "^3.0.0", + "chalk": "^2.4.2", "command-exists": "^1.2.8", "commander": "^2.19.0", "compression": "^1.7.1", @@ -30481,15 +33155,16 @@ "envinfo": "^7.1.0", "errorhandler": "^1.5.0", "execa": "^1.0.0", + "find-up": "^4.1.0", "fs-extra": "^7.0.1", "glob": "^7.1.1", "graceful-fs": "^4.1.3", "inquirer": "^3.0.6", "lodash": "^4.17.5", - "metro": "^0.54.1", - "metro-config": "^0.54.1", - "metro-core": "^0.54.1", - "metro-react-native-babel-transformer": "^0.54.1", + "metro": "^0.56.0", + "metro-config": "^0.56.0", + "metro-core": "^0.56.0", + "metro-react-native-babel-transformer": "^0.56.0", "minimist": "^1.2.0", "mkdirp": "^0.5.1", "morgan": "^1.9.0", @@ -30497,35 +33172,21 @@ "open": "^6.2.0", "ora": "^3.4.0", "plist": "^3.0.0", - "semver": "^5.0.3", + "semver": "^6.3.0", "serve-static": "^1.13.1", "shell-quote": "1.6.1", + "strip-ansi": "^5.2.0", + "sudo-prompt": "^9.0.0", + "wcwidth": "^1.0.1", "ws": "^1.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } } }, "chardet": { @@ -30534,16 +33195,10 @@ "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", "dev": true }, - "cli-spinners": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", - "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==", - "dev": true - }, "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", "dev": true }, "cosmiconfig": { @@ -30569,6 +33224,14 @@ "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "deepmerge": { @@ -30619,6 +33282,16 @@ "ua-parser-js": "^0.7.18" } }, + "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" + } + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -30671,32 +33344,6 @@ "through": "^2.3.6" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -30705,22 +33352,22 @@ "requires": { "ansi-regex": "^3.0.0" } - }, - "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" - } } } }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, "metro-react-native-babel-preset": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.54.1.tgz", - "integrity": "sha512-Hfr32+u5yYl3qhYQJU8NQ26g4kQlc3yFMg7keVR/3H8rwBIbFqXgsKt8oe0dOrv7WvrMqBHhDtVdU9ls3sSq8g==", + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.56.3.tgz", + "integrity": "sha512-tGPzX2ZwI8vQ8SiNVBPUIgKqmaRNVB6rtJtHCBQZAYRiMbxh0NHCUoFfKBej6U5qVgxiYYHyN8oB23evG4/Oow==", "dev": true, "requires": { "@babel/plugin-proposal-class-properties": "^7.0.0", @@ -30757,20 +33404,20 @@ "@babel/plugin-transform-typescript": "^7.0.0", "@babel/plugin-transform-unicode-regex": "^7.0.0", "@babel/template": "^7.0.0", - "metro-babel7-plugin-react-transform": "0.54.1", - "react-transform-hmr": "^1.0.4" + "react-refresh": "^0.4.0" } }, "metro-react-native-babel-transformer": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.54.1.tgz", - "integrity": "sha512-ECw7xG91t8dk/PHdiyoC5SP1s9OQzfmJzG5m0YOZaKtHMe534qTDbncxaKfTI3CP99yti2maXFBRVj+xyvph/g==", + "version": "0.56.3", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.56.3.tgz", + "integrity": "sha512-T87m4jDu0gIvJo8kWEvkodWFgQ8XBzJUESs1hUUTBSMIqTa31MdWfA1gs+MipadG7OsEJpcb9m83mGr8K70MWw==", "dev": true, "requires": { "@babel/core": "^7.0.0", "babel-preset-fbjs": "^3.1.2", - "metro-babel-transformer": "0.54.1", - "metro-react-native-babel-preset": "0.54.1" + "metro-babel-transformer": "0.56.3", + "metro-react-native-babel-preset": "0.56.3", + "metro-source-map": "0.56.3" } }, "ora": { @@ -30785,54 +33432,32 @@ "log-symbols": "^2.2.0", "strip-ansi": "^5.2.0", "wcwidth": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "strip-ansi": { - "version": "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" - } - }, - "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" - } - } } }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "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", @@ -30843,6 +33468,12 @@ "json-parse-better-errors": "^1.0.1" } }, + "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 + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -30853,37 +33484,35 @@ "once": "^1.3.1" } }, - "scheduler": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.14.0.tgz", - "integrity": "sha512-9CgbS06Kki2f4R9FjLSITjZo5BZxPsryiRNyL3LpvrM9WxcVmhlqAOc9E+KQbeI2nqej4JIIbOsfdL51cNb4Iw==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } + "react-refresh": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.2.tgz", + "integrity": "sha512-kv5QlFFSZWo7OlJFNYbxRtY66JImuP2LcrFgyJfQaf85gSP+byzG21UbDQEYjU7f//ny8rwiEkO6py2Y+fEgAQ==", + "dev": true }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "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": "^2.0.0" + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, "whatwg-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", @@ -30960,9 +33589,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.0.tgz", - "integrity": "sha512-Z7ti+HB0puCcLmFE3x90kzaVgbx6TRrYIReaygW6EkBEnJh1ajS4/inhF7CypzWeDV3NFl1AfWj0eMtdihojxw==", + "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" @@ -30978,16 +33607,6 @@ "prop-types": "^15.5.8" } }, - "react-proxy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.8.tgz", - "integrity": "sha1-nb/Z2SdSjDqp9ETkVYw3gwq4wmo=", - "dev": true, - "requires": { - "lodash": "^4.6.1", - "react-deep-force-update": "^1.0.0" - } - }, "react-redux": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.1.3.tgz", @@ -31003,9 +33622,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.0.tgz", - "integrity": "sha512-Z7ti+HB0puCcLmFE3x90kzaVgbx6TRrYIReaygW6EkBEnJh1ajS4/inhF7CypzWeDV3NFl1AfWj0eMtdihojxw==", + "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" @@ -31056,12 +33675,12 @@ } }, "react-sizeme": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/react-sizeme/-/react-sizeme-2.6.10.tgz", - "integrity": "sha512-OJAPQxSqbcpbsXFD+fr5ARw4hNSAOimWcaTOLcRkIqnTp9+IFWY0w3Qdw1sMez6Ao378aimVL/sW6TTsgigdOA==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/react-sizeme/-/react-sizeme-2.6.12.tgz", + "integrity": "sha512-tL4sCgfmvapYRZ1FO2VmBmjPVzzqgHA7kI8lSJ6JS6L78jXFNRdOZFpXyK6P1NBZvKPPCZxReNgzZNUajAerZw==", "dev": true, "requires": { - "element-resize-detector": "^1.1.15", + "element-resize-detector": "^1.2.1", "invariant": "^2.2.4", "shallowequal": "^1.1.0", "throttle-debounce": "^2.1.0" @@ -31119,16 +33738,6 @@ "prop-types": "^15.6.0" } }, - "react-transform-hmr": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz", - "integrity": "sha1-4aQL0Krvxy6N/Xp82gmvhQZjl7s=", - "dev": true, - "requires": { - "global": "^4.3.0", - "react-proxy": "^1.1.7" - } - }, "react-transition-group": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", @@ -31468,29 +34077,11 @@ "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, - "regenerate-unicode-properties": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz", - "integrity": "sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } - }, "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==" }, - "regenerator-transform": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.4.tgz", - "integrity": "sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A==", - "dev": true, - "requires": { - "private": "^0.1.6" - } - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -31521,9 +34112,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "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", @@ -31622,20 +34213,6 @@ "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, - "regexpu-core": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", - "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.0.2", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" - } - }, "regextras": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.6.1.tgz", @@ -31704,45 +34281,46 @@ } }, "remark-mdx": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.5.3.tgz", - "integrity": "sha512-7WqfwdyER3k0gNiikzw9y+AQskAm6PX2qEF97vhuZ9y8/MatVKoWGCPX4VCYAN0qlM1X6ty761rbMWMy5OmgyA==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.5.5.tgz", + "integrity": "sha512-w1XW9UzsQ6XAecV59dP8LJWn4tMftaXGwH5LEvUU5uIEJEJvHDE1jkKiPr3ow2IuhjuRfWs3b079Jtnk5qlUgQ==", "dev": true, "requires": { - "@babel/core": "7.7.4", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-proposal-object-rest-spread": "7.7.4", - "@babel/plugin-syntax-jsx": "7.7.4", - "@mdx-js/util": "^1.5.3", + "@babel/core": "7.8.0", + "@babel/helper-plugin-utils": "7.8.0", + "@babel/plugin-proposal-object-rest-spread": "7.8.0", + "@babel/plugin-syntax-jsx": "7.8.0", + "@mdx-js/util": "^1.5.5", "is-alphabetical": "1.0.3", "remark-parse": "7.0.2", "unified": "8.4.2" }, "dependencies": { "@babel/code-frame": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.0.tgz", - "integrity": "sha512-AN2IR/wCUYsM+PdErq6Bp3RFTXl8W0p9Nmymm7zkpsCmh+r/YYcckaCGpU8Q/mEKmST19kkGRaG42A/jxOWwBA==", + "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.0" + "@babel/highlight": "^7.8.3" } }, "@babel/core": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.4.tgz", - "integrity": "sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.7.4", - "@babel/helpers": "^7.7.4", - "@babel/parser": "^7.7.4", - "@babel/template": "^7.7.4", - "@babel/traverse": "^7.7.4", - "@babel/types": "^7.7.4", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.0.tgz", + "integrity": "sha512-3rqPi/bv/Xfu2YzHvBz4XqMI1fKVwnhntPA1/fjoECrSjrhbOCxlTrbVu5gUtr8zkxW+RpkDOa/HCW93gzS2Dw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.0", + "@babel/generator": "^7.8.0", + "@babel/helpers": "^7.8.0", + "@babel/parser": "^7.8.0", + "@babel/template": "^7.8.0", + "@babel/traverse": "^7.8.0", + "@babel/types": "^7.8.0", "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", @@ -31751,61 +34329,67 @@ } }, "@babel/generator": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.0.tgz", - "integrity": "sha512-2Lp2e02CV2C7j/H4n4D9YvsvdhPVVg9GDIamr6Tu4tU35mL3mzOrzl1lZ8ZJtysfZXh+y+AGORc2rPS7yHxBUg==", + "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.0", + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.0.tgz", - "integrity": "sha512-x9psucuU0Xalw+0Vpr2FYJMLB7/KnPSLZhlkUyOGbYAWRDfmtZBrguYpJYiaNCRV7vGkYjO/gF6/J6yMvdWTDw==", + "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.0", - "@babel/template": "^7.8.0", - "@babel/types": "^7.8.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.0.tgz", - "integrity": "sha512-eUP5grliToMapQiTaYS2AAO/WwaCG7cuJztR1v/a1aPzUzUeGt+AaI9OvLATc/AfFkF8SLJ10d5ugGt/AQ9d6w==", + "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.0" + "@babel/types": "^7.8.3" } }, - "@babel/helper-split-export-declaration": { + "@babel/helper-plugin-utils": { "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.0.tgz", - "integrity": "sha512-YhYFhH4T6DlbT6CPtVgLfC1Jp2gbCawU/ml7WJvUpBg01bCrXSzTYMZZXbbIGjq/kHmK8YUATxTppcRGzj31pA==", + "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.0" + "@babel/types": "^7.8.3" } }, "@babel/helpers": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.0.tgz", - "integrity": "sha512-srWKpjAFbiut5JoCReZJ098hLqoZ9HufOnKZPggc7j74XaPuQ+9b3RYPV1M/HfjL63lCNd8uI1O487qIWxAFNA==", + "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.0", - "@babel/traverse": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.0.tgz", - "integrity": "sha512-OsdTJbHlPtIk2mmtwXItYrdmalJ8T0zpVzNAbKSkHshuywj7zb29Y09McV/jQsQunc/nEyHiPV2oy9llYMLqxw==", + "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", @@ -31814,79 +34398,71 @@ } }, "@babel/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-VVtsnUYbd1+2A2vOVhm4P2qNXQE8L/W859GpUHfUcdhX8d3pEKThZuIr6fztocWx9HbK+00/CR0tXnhAggJ4CA==", + "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.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz", - "integrity": "sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.0.tgz", + "integrity": "sha512-SjJ2ZXCylpWC+5DTES0/pbpNmw/FnjU/3dF068xF0DU9aN+oOKah+3MCSFcb4pnZ9IwmxfOy4KnbGJSQR+hAZA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.7.4" + "@babel/helper-plugin-utils": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" } }, "@babel/plugin-syntax-jsx": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz", - "integrity": "sha512-wuy6fiMe9y7HeZBWXYCGt2RGxZOj0BImZ9EyXJVnVGBKO/Br592rbR3rtIQn0eQhAk9vqaKP5n8tVqEFBQMfLg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.0.tgz", + "integrity": "sha512-zLDUckAuKeOtxJhfNE0TlR7iEApb2u7EYRlh5cxKzq6A5VzUbYEdyJGJlug41jDbjRbHTtsLKZUnUcy/8V3xZw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.0.tgz", - "integrity": "sha512-dt89fDlkfkTrQcy5KavMQPyF2A6tR0kYp8HAnIoQv5hO34iAUffHghP/hMGd7Gf/+uYTmLQO0ar7peX1SUWyIA==", + "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" - }, - "dependencies": { - "@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/template": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.0.tgz", - "integrity": "sha512-0NNMDsY2t3ltAVVK1WHNiaePo3tXPUeJpCX4I3xSKFoEl852wJHG8mrgHVADf8Lz1y+8al9cF7cSSfzSnFSYiw==", + "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.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/traverse": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.0.tgz", - "integrity": "sha512-d/6sPXFLGlJHZO/zWDtgFaKyalCOHLedzxpVJn6el1cw+f2TZa7xZEszeXdOw6EUemqRFBAn106BWBvtSck9Qw==", + "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.0", - "@babel/generator": "^7.8.0", - "@babel/helper-function-name": "^7.8.0", - "@babel/helper-split-export-declaration": "^7.8.0", - "@babel/parser": "^7.8.0", - "@babel/types": "^7.8.0", + "@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.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.0.tgz", - "integrity": "sha512-1RF84ehyx9HH09dMMwGWl3UTWlVoCPtqqJPjGuC4JzMe1ZIVDJ2DT8mv3cPv/A7veLD6sgR7vi95lJqm+ZayIg==", + "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", @@ -31931,9 +34507,9 @@ "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 }, "json5": { @@ -32323,7 +34899,8 @@ "resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true }, "resolve-url": { "version": "0.2.1", @@ -33095,9 +35672,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "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", @@ -33225,13 +35802,13 @@ "integrity": "sha512-APW9iYbkJ5cijjX4Ljhf3VG8SwYPUJT5gZrwci/wieMabQxWFiV5VwsrP5c6GMRvXKEQMGkAB1d9dvW66dTqpg==" }, "simple-plist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.0.0.tgz", - "integrity": "sha512-043L2rO80LVF7zfZ+fqhsEkoJFvW8o59rt/l4ctx1TJWoTx7/jkiS1R5TatD15Z1oYnuLJytzE7gcnnBuIPL2g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.0.tgz", + "integrity": "sha512-2i5Tc0BYAqppM7jVzmNrI+aEUntPolIq4fDgji6WuNNn1D/qYdn2KwoLhZdzQkE04lu9L5tUoeJsjuJAvd+lFg==", "dev": true, "requires": { - "bplist-creator": "0.0.7", - "bplist-parser": "0.1.1", + "bplist-creator": "0.0.8", + "bplist-parser": "0.2.0", "plist": "^3.0.1" } }, @@ -33277,9 +35854,9 @@ } }, "sisteransi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", - "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", + "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==", "dev": true }, "slash": { @@ -33497,7 +36074,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, "requires": { "is-plain-obj": "^1.0.0" } @@ -33701,12 +36277,20 @@ "dev": true }, "stacktrace-parser": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.6.tgz", - "integrity": "sha512-wXhu0Z8YgCGigUtHQq+J7pjXCppk3Um5DwH4qskOKHMlJmKwuuUSm+wDAgU7t4sbVjvuDTNGwOfFKgjMEqSflA==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.8.tgz", + "integrity": "sha512-ig5rHJSdJrAsVqdb3oAI/8C6aQ7dEwJXoy/TIEIOTzdJHssmn12o6RsFoeQSLHoKjq0lX+kqhmnLDpyQTuWiJA==", "dev": true, "requires": { - "type-fest": "^0.3.0" + "type-fest": "^0.7.1" + }, + "dependencies": { + "type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "dev": true + } } }, "state-toggle": { @@ -33869,9 +36453,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "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", @@ -33984,9 +36568,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "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", @@ -34099,9 +36683,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "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", @@ -34468,16 +37052,10 @@ "table": "^5.0.0" }, "dependencies": { - "@nodelib/fs.stat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", - "dev": true - }, "ansi-regex": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", - "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "debug": { @@ -34489,35 +37067,6 @@ "ms": "^2.1.1" } }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "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 - }, - "fast-glob": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", - "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", - "dev": true, - "requires": { - "@mrmlnc/readdir-enhanced": "^2.2.1", - "@nodelib/fs.stat": "^1.1.2", - "glob-parent": "^3.1.0", - "is-glob": "^4.0.0", - "merge2": "^1.2.3", - "micromatch": "^3.1.10" - } - }, "file-entry-cache": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-4.0.0.tgz", @@ -34527,138 +37076,22 @@ "flat-cache": "^2.0.1" } }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, "get-stdin": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "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" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "globby": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.0.0.tgz", - "integrity": "sha512-q0qiO/p1w/yJ0hk8V9x1UXlgsXUxlGd0AHUOXZVXBO6aznDtpx7M8D1kBrCAItoPm+4l8r6ATXV1JpjY2SBQOw==", - "dev": true, - "requires": { - "array-union": "^1.0.2", - "dir-glob": "^2.2.1", - "fast-glob": "^2.2.6", - "glob": "^7.1.3", - "ignore": "^4.0.3", - "pify": "^4.0.1", - "slash": "^2.0.0" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, "ignore": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.4.tgz", - "integrity": "sha512-WLsTMEhsQuXpCiG173+f3aymI43SXa+fB1rSfbzyP4GkPP+ZFVuO0/3sFUGNBtifisPeDcl/uD/Y2NxZ7xFq4g==", - "dev": true - }, - "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" - } - }, - "known-css-properties": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.11.0.tgz", - "integrity": "sha512-bEZlJzXo5V/ApNNa5z375mJC6Nrz4vG43UgcSCrg2OHC+yuB6j0iDSrY7RQ/+PRofFB03wNIIt9iXIVLr4wc7w==", - "dev": true - }, - "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", "dev": true }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "pify": { @@ -34684,15 +37117,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -34700,32 +37124,23 @@ "dev": true }, "string-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", - "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.0.0" + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", - "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", - "dev": true, - "requires": { - "ansi-regex": "^4.0.0" - } - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "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": { - "mkdirp": "^0.5.1" + "ansi-regex": "^4.1.0" } } } @@ -34782,6 +37197,12 @@ } } }, + "sudo-prompt": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz", + "integrity": "sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==", + "dev": true + }, "sugarss": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", @@ -34827,9 +37248,9 @@ } }, "svg-parser": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.2.tgz", - "integrity": "sha512-1gtApepKFweigFZj3sGO8KT8LvVZK8io146EzXrpVuWCDAbISz/yMucco3hWTkpZNoPabM+dnMOpy6Swue68Zg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz", + "integrity": "sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg==", "dev": true }, "svg-tags": { @@ -34861,21 +37282,21 @@ }, "dependencies": { "css-select": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", - "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^2.1.2", + "css-what": "^3.2.1", "domutils": "^1.7.0", "nth-check": "^1.0.2" } }, "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", "dev": true }, "define-properties": { @@ -34897,6 +37318,74 @@ "domelementtype": "1" } }, + "es-abstract": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.3.tgz", + "integrity": "sha512-AwiVPKf3sKGMoWtFw0J7Y4MTZ4Iek67k4COWOwHqS8B9TOZ71DCfcoBmdamy8Y6mj4MDz0+VNUpC2HKHFHA3pg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + }, + "dependencies": { + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -34906,17 +37395,43 @@ "boolbase": "~1.0.0" } }, + "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.values": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", - "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", "dev": true, "requires": { "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", + "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1", "has": "^1.0.3" } + }, + "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" + } } } }, @@ -34951,9 +37466,9 @@ } }, "es-abstract": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", - "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "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", @@ -35285,9 +37800,9 @@ } }, "terser": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.2.tgz", - "integrity": "sha512-6FUjJdY2i3WZAtYBtnV06OOcOfzl+4hSKYE9wgac8rkLRBToPDDrBB2AcHwQD/OKDxbnvhVy2YgOPWO2SsKWqg==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", + "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", "dev": true, "requires": { "commander": "^2.20.0", @@ -35295,6 +37810,12 @@ "source-map-support": "~0.5.12" }, "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -35331,9 +37852,9 @@ }, "dependencies": { "bluebird": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz", - "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, "cacache": { @@ -35386,9 +37907,9 @@ } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "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", @@ -35400,9 +37921,9 @@ } }, "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==", + "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 }, "locate-path": { @@ -35453,9 +37974,9 @@ } }, "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "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" @@ -35528,16 +38049,6 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", @@ -35547,17 +38058,6 @@ "figgy-pudding": "^3.5.1" } }, - "terser": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.4.tgz", - "integrity": "sha512-Kcrn3RiW8NtHBP0ssOAzwa2MsIRQ8lJWiBG/K7JgqPlomA3mtb2DEmp4/hrUA+Jujx+WZ02zqd7GYD+QRBB/2Q==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - } - }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -36115,8 +38615,7 @@ "type-fest": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "dev": true + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" }, "type-is": { "version": "1.6.16", @@ -36151,6 +38650,36 @@ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==" }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "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 + } + } + }, "uglify-js": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", @@ -36162,6 +38691,13 @@ "source-map": "~0.6.1" }, "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -36504,9 +39040,9 @@ } }, "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", - "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-3.0.0.tgz", + "integrity": "sha512-a84JJbIA5xTFTWyjjcPdnsu+41o/SNE8SpXMdUvXs6Q+LuhCD9E2+0VCiuDWqgo3GGXVlFHzArDmBpj9PgWn4A==", "dev": true, "requires": { "loader-utils": "^1.2.3", @@ -36541,9 +39077,9 @@ } }, "schema-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.1.tgz", - "integrity": "sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz", + "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==", "dev": true, "requires": { "ajv": "^6.10.2", @@ -36580,6 +39116,11 @@ "integrity": "sha512-C3nvxh0ZpaOxs9RCnWwAJ+7bJPwQI8LHF71LzbQ3BvzH5XkdtlkMadqElGevg5bYBDFip4sAnD4m06zAKebg1w==", "dev": true }, + "use-memo-one": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.1.tgz", + "integrity": "sha512-oFfsyun+bP7RX8X2AskHNTxu+R3QdE/RC5IefMbqptmACAA/gfol1KDD5KRzPsGMa62sWxGZw+Ui43u6x4ddoQ==" + }, "use-sidecar": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.0.2.tgz", @@ -36641,6 +39182,12 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", @@ -36724,6 +39271,12 @@ "unist-util-stringify-position": "^1.1.1" } }, + "vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", + "dev": true + }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -36731,13 +39284,13 @@ "dev": true }, "vue-docgen-api": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/vue-docgen-api/-/vue-docgen-api-4.4.3.tgz", - "integrity": "sha512-Js/97zx25SckkkkwLlxWDQ7VCyxn96oCGTnbEnWtL7UcxZ+dmPZ2a30xdgQ4E5OidMLTi423TaZxCS2ns9glZA==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/vue-docgen-api/-/vue-docgen-api-4.7.0.tgz", + "integrity": "sha512-yAzaM5NNuJKouzAaUeLdopcRW4J2BmD+aNXJGTyFVhr83yyTjDQz4QuwugcTJXGpStGGAXR1mOcAOitx59DC0g==", "dev": true, "requires": { - "@babel/parser": "7.5.5", - "@babel/types": "7.5.5", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0", "ast-types": "^0.12.2", "hash-sum": "^1.0.2", "lru-cache": "^4.1.5", @@ -36748,15 +39301,15 @@ }, "dependencies": { "@babel/parser": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "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.5.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", - "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "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", @@ -37116,9 +39669,15 @@ }, "dependencies": { "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true } } @@ -37142,9 +39701,9 @@ }, "dependencies": { "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "cross-spawn": { @@ -37158,24 +39717,16 @@ "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" - }, - "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 - } } }, "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "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": "^3.0.0", + "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", @@ -37192,14 +39743,13 @@ "locate-path": "^3.0.0" } }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "pump": "^3.0.0" } }, "invert-kv": { @@ -37228,31 +39778,43 @@ } }, "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "os-locale": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "^0.10.0", + "execa": "^1.0.0", "lcid": "^2.0.0", "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.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "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" @@ -37268,20 +39830,27 @@ } }, "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "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 }, - "pkg-dir": { + "pump": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "find-up": "^3.0.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -37291,12 +39860,6 @@ "has-flag": "^3.0.0" } }, - "v8-compile-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", - "dev": true - }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", @@ -37734,8 +40297,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { "version": "1.0.3", @@ -37750,7 +40312,6 @@ "version": "2.4.3", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -37802,43 +40363,21 @@ } }, "write-pkg": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", - "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", + "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", "dev": true, "requires": { "sort-keys": "^2.0.0", - "write-json-file": "^2.2.0" + "type-fest": "^0.4.1", + "write-json-file": "^3.2.0" }, "dependencies": { - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", "dev": true - }, - "write-json-file": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", - "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", - "dev": true, - "requires": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "pify": "^3.0.0", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.0.0" - } } } }, @@ -37858,9 +40397,9 @@ "dev": true }, "xcode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.0.0.tgz", - "integrity": "sha512-5xF6RCjAdDEiEsbbZaS/gBRt3jZ/177otZcpoLCjGN/u1LrfgH7/Sgeeavpr/jELpyDqN2im3AKosl2G2W8hfw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.1.0.tgz", + "integrity": "sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ==", "dev": true, "requires": { "simple-plist": "^1.0.0", @@ -37886,26 +40425,18 @@ "dev": true }, "xmldoc": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-0.4.0.tgz", - "integrity": "sha1-0lciS+g5PqrL+DfvIn/Y7CWzaIg=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", + "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", "dev": true, "requires": { - "sax": "~1.1.1" - }, - "dependencies": { - "sax": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.6.tgz", - "integrity": "sha1-XWFr6KXmB9VOEUr65Vt+ry/MMkA=", - "dev": true - } + "sax": "^1.2.1" } }, "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", "dev": true }, "xpipe": { @@ -37934,16 +40465,14 @@ "version": "1.7.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz", "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==", - "dev": true, "requires": { "@babel/runtime": "^7.6.3" }, "dependencies": { "@babel/runtime": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.0.tgz", - "integrity": "sha512-Z7ti+HB0puCcLmFE3x90kzaVgbx6TRrYIReaygW6EkBEnJh1ajS4/inhF7CypzWeDV3NFl1AfWj0eMtdihojxw==", - "dev": true, + "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" } diff --git a/package.json b/package.json index 4c51484635eb3..38f2036891596 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gutenberg", - "version": "7.3.0-rc.1", + "version": "7.3.0", "private": true, "description": "A new WordPress editor experience.", "author": "The WordPress Contributors", @@ -48,6 +48,7 @@ "@wordpress/hooks": "file:packages/hooks", "@wordpress/html-entities": "file:packages/html-entities", "@wordpress/i18n": "file:packages/i18n", + "@wordpress/icons": "file:packages/icons", "@wordpress/is-shallow-equal": "file:packages/is-shallow-equal", "@wordpress/keyboard-shortcuts": "file:packages/keyboard-shortcuts", "@wordpress/keycodes": "file:packages/keycodes", @@ -56,6 +57,7 @@ "@wordpress/notices": "file:packages/notices", "@wordpress/nux": "file:packages/nux", "@wordpress/plugins": "file:packages/plugins", + "@wordpress/primitives": "file:packages/primitives", "@wordpress/priority-queue": "file:packages/priority-queue", "@wordpress/redux-routine": "file:packages/redux-routine", "@wordpress/rich-text": "file:packages/rich-text", @@ -70,10 +72,10 @@ "devDependencies": { "@actions/core": "1.0.0", "@actions/github": "1.0.0", - "@babel/core": "7.4.5", - "@babel/plugin-syntax-jsx": "7.2.0", - "@babel/runtime-corejs3": "7.4.5", - "@babel/traverse": "7.4.5", + "@babel/core": "7.8.3", + "@babel/plugin-syntax-jsx": "7.8.3", + "@babel/runtime-corejs3": "7.8.3", + "@babel/traverse": "7.8.3", "@octokit/rest": "16.26.0", "@storybook/addon-a11y": "5.3.2", "@storybook/addon-docs": "5.3.2", @@ -89,6 +91,7 @@ "@wordpress/babel-preset-default": "file:packages/babel-preset-default", "@wordpress/base-styles": "file:packages/base-styles", "@wordpress/browserslist-config": "file:packages/browserslist-config", + "@wordpress/create-block": "file:packages/create-block", "@wordpress/custom-templated-path-webpack-plugin": "file:packages/custom-templated-path-webpack-plugin", "@wordpress/dependency-extraction-webpack-plugin": "file:packages/dependency-extraction-webpack-plugin", "@wordpress/docgen": "file:packages/docgen", @@ -104,7 +107,7 @@ "@wordpress/postcss-themes": "file:packages/postcss-themes", "@wordpress/scripts": "file:packages/scripts", "babel-loader": "8.0.6", - "babel-plugin-emotion": "10.0.23", + "babel-plugin-emotion": "10.0.27", "babel-plugin-inline-json-import": "0.3.2", "babel-plugin-react-native-classname-to-style": "1.2.2", "babel-plugin-react-native-platform-specific-extensions": "1.1.1", @@ -112,7 +115,7 @@ "benchmark": "2.1.4", "browserslist": "4.7.0", "chalk": "2.4.2", - "commander": "2.20.0", + "commander": "4.1.0", "concurrently": "3.5.0", "copy-webpack-plugin": "4.5.2", "cross-env": "3.2.4", @@ -126,7 +129,7 @@ "fbjs": "0.8.17", "glob": "7.1.2", "husky": "3.0.5", - "inquirer": "6.3.1", + "inquirer": "7.0.3", "is-equal-shallow": "0.1.3", "jest-emotion": "10.0.17", "jest-junit": "6.4.0", @@ -143,10 +146,11 @@ "node-watch": "0.6.0", "postcss": "7.0.13", "postcss-loader": "3.0.0", + "prettier": "npm:wp-prettier@1.19.1", "progress": "2.0.3", "react": "16.9.0", "react-dom": "16.9.0", - "react-native": "0.60.0", + "react-native": "0.61.5", "react-test-renderer": "16.9.0", "rimraf": "2.6.2", "rtlcss": "2.4.0", @@ -180,9 +184,10 @@ "dev:packages": "node ./bin/packages/watch.js", "docs:build": "node ./docs/tool/index.js && node ./bin/api-docs/update-readmes.js", "fixtures:clean": "rimraf \"packages/e2e-tests/fixtures/blocks/*.+(json|serialized.html)\"", - "fixtures:server-registered": "npm run wp-env run tests-wordpress-phpunit './bin/get-server-blocks.php > test/integration/full-content/server-registered.json'", + "fixtures:server-registered": "packages/env/bin/wp-env run wordpress ./wp-content/plugins/gutenberg/bin/get-server-blocks.php > test/integration/full-content/server-registered.json", "fixtures:generate": "npm run fixtures:server-registered && cross-env GENERATE_MISSING_FIXTURES=y npm run test-unit", "fixtures:regenerate": "npm run fixtures:clean && npm run fixtures:generate", + "format-js": "wp-scripts format-js", "lint": "concurrently \"npm run lint-js\" \"npm run lint-pkg-json\" \"npm run lint-css\" \"npm run lint-types\"", "lint-js": "wp-scripts lint-js", "lint-js:fix": "npm run lint-js -- --fix", @@ -191,7 +196,8 @@ "lint-css": "wp-scripts lint-style '**/*.scss'", "lint-css:fix": "npm run lint-css -- --fix", "lint-types": "tsc", - "lint-md": "wp-scripts lint-md", + "lint:md-js": "wp-scripts lint-md-js", + "lint:md-docs": "wp-scripts lint-md-docs", "package-plugin": "./bin/build-plugin-zip.sh", "pot-to-php": "./bin/pot-to-php.js", "publish:check": "lerna updated", @@ -235,6 +241,7 @@ "wp-scripts lint-style" ], "*.js": [ + "wp-scripts format-js", "wp-scripts lint-js" ], "{docs/{toc.json,tool/*.js},packages/{*/README.md,*/src/{actions,selectors}.js,components/src/*/**/README.md}}": [ diff --git a/packages/README.md b/packages/README.md index b0f7d8562cdb3..30cccbed973c4 100644 --- a/packages/README.md +++ b/packages/README.md @@ -29,7 +29,7 @@ When creating a new package, you need to provide at least the following: "module": "build-module/index.js", "react-native": "src/index", "dependencies": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.8.3" }, "publishConfig": { "access": "public" diff --git a/packages/a11y/package.json b/packages/a11y/package.json index ff62c580b1090..20efdcbe2c69b 100644 --- a/packages/a11y/package.json +++ b/packages/a11y/package.json @@ -22,7 +22,7 @@ "module": "build-module/index.js", "react-native": "src/index", "dependencies": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/dom-ready": "file:../dom-ready" }, "publishConfig": { diff --git a/packages/a11y/src/addContainer.js b/packages/a11y/src/addContainer.js index 3db5637d13942..edd733a6626a6 100644 --- a/packages/a11y/src/addContainer.js +++ b/packages/a11y/src/addContainer.js @@ -12,19 +12,20 @@ const addContainer = function( ariaLive ) { container.id = 'a11y-speak-' + ariaLive; container.className = 'a11y-speak-region'; - container.setAttribute( 'style', ( + container.setAttribute( + 'style', 'position: absolute;' + - 'margin: -1px;' + - 'padding: 0;' + - 'height: 1px;' + - 'width: 1px;' + - 'overflow: hidden;' + - 'clip: rect(1px, 1px, 1px, 1px);' + - '-webkit-clip-path: inset(50%);' + - 'clip-path: inset(50%);' + - 'border: 0;' + - 'word-wrap: normal !important;' - ) ); + 'margin: -1px;' + + 'padding: 0;' + + 'height: 1px;' + + 'width: 1px;' + + 'overflow: hidden;' + + 'clip: rect(1px, 1px, 1px, 1px);' + + '-webkit-clip-path: inset(50%);' + + 'clip-path: inset(50%);' + + 'border: 0;' + + 'word-wrap: normal !important;' + ); container.setAttribute( 'aria-live', ariaLive ); container.setAttribute( 'aria-relevant', 'additions text' ); container.setAttribute( 'aria-atomic', 'true' ); diff --git a/packages/a11y/src/index.js b/packages/a11y/src/index.js index cb79e767bb9c3..97d10c6592020 100644 --- a/packages/a11y/src/index.js +++ b/packages/a11y/src/index.js @@ -15,7 +15,9 @@ import filterMessage from './filterMessage'; */ export const setup = function() { const containerPolite = document.getElementById( 'a11y-speak-polite' ); - const containerAssertive = document.getElementById( 'a11y-speak-assertive' ); + const containerAssertive = document.getElementById( + 'a11y-speak-assertive' + ); if ( containerPolite === null ) { addContainer( 'polite' ); @@ -56,7 +58,9 @@ export const speak = function( message, ariaLive ) { message = filterMessage( message ); const containerPolite = document.getElementById( 'a11y-speak-polite' ); - const containerAssertive = document.getElementById( 'a11y-speak-assertive' ); + const containerAssertive = document.getElementById( + 'a11y-speak-assertive' + ); if ( containerAssertive && 'assertive' === ariaLive ) { containerAssertive.textContent = message; diff --git a/packages/a11y/src/index.native.js b/packages/a11y/src/index.native.js index b972687dbafce..4e5e9841118b1 100644 --- a/packages/a11y/src/index.native.js +++ b/packages/a11y/src/index.native.js @@ -14,8 +14,6 @@ export const speak = function( message, ariaLive ) { message = filterMessage( message ); //TODO: Use native module to speak message if ( 'assertive' === ariaLive ) { - } else { - } }; diff --git a/packages/a11y/src/test/addContainer.test.js b/packages/a11y/src/test/addContainer.test.js index e6c722078f74f..6ebf062237c9c 100644 --- a/packages/a11y/src/test/addContainer.test.js +++ b/packages/a11y/src/test/addContainer.test.js @@ -13,7 +13,9 @@ describe( 'addContainer', () => { expect( container.id ).toBe( 'a11y-speak-polite' ); expect( container.getAttribute( 'style' ) ).not.toBeNull(); expect( container.getAttribute( 'aria-live' ) ).toBe( 'polite' ); - expect( container.getAttribute( 'aria-relevant' ) ).toBe( 'additions text' ); + expect( container.getAttribute( 'aria-relevant' ) ).toBe( + 'additions text' + ); expect( container.getAttribute( 'aria-atomic' ) ).toBe( 'true' ); } ); } ); @@ -27,7 +29,9 @@ describe( 'addContainer', () => { expect( container.id ).toBe( 'a11y-speak-assertive' ); expect( container.getAttribute( 'style' ) ).not.toBeNull(); expect( container.getAttribute( 'aria-live' ) ).toBe( 'assertive' ); - expect( container.getAttribute( 'aria-relevant' ) ).toBe( 'additions text' ); + expect( container.getAttribute( 'aria-relevant' ) ).toBe( + 'additions text' + ); expect( container.getAttribute( 'aria-atomic' ) ).toBe( 'true' ); } ); } ); @@ -41,7 +45,9 @@ describe( 'addContainer', () => { expect( container.id ).toBe( 'a11y-speak-polite' ); expect( container.getAttribute( 'style' ) ).not.toBeNull(); expect( container.getAttribute( 'aria-live' ) ).toBe( 'polite' ); - expect( container.getAttribute( 'aria-relevant' ) ).toBe( 'additions text' ); + expect( container.getAttribute( 'aria-relevant' ) ).toBe( + 'additions text' + ); expect( container.getAttribute( 'aria-atomic' ) ).toBe( 'true' ); } ); } ); diff --git a/packages/a11y/src/test/index.test.js b/packages/a11y/src/test/index.test.js index 08c9489bed2ae..9888f9adb3a14 100644 --- a/packages/a11y/src/test/index.test.js +++ b/packages/a11y/src/test/index.test.js @@ -53,7 +53,9 @@ describe( 'speak', () => { it( 'should set the textcontent of the assertive aria-live region', () => { speak( 'assertive message', 'assertive' ); expect( containerPolite.textContent ).toBe( '' ); - expect( containerAssertive.textContent ).toBe( 'assertive message' ); + expect( containerAssertive.textContent ).toBe( + 'assertive message' + ); } ); } ); @@ -72,13 +74,17 @@ describe( 'speak', () => { afterEach( () => { setup(); - containerAssertive = document.getElementById( 'a11y-speak-assertive' ); + containerAssertive = document.getElementById( + 'a11y-speak-assertive' + ); } ); it( 'should set the textcontent of the polite aria-live region', () => { speak( 'message', 'assertive' ); expect( containerPolite.textContent ).toBe( 'message' ); - expect( document.getElementById( 'a11y-speak-assertive' ) ).toBe( null ); + expect( document.getElementById( 'a11y-speak-assertive' ) ).toBe( + null + ); } ); } ); @@ -91,20 +97,29 @@ describe( 'speak', () => { afterEach( () => { setup(); containerPolite = document.getElementById( 'a11y-speak-polite' ); - containerAssertive = document.getElementById( 'a11y-speak-assertive' ); + containerAssertive = document.getElementById( + 'a11y-speak-assertive' + ); } ); it( 'should set the textcontent of the polite aria-live region', () => { - expect( document.getElementById( 'a11y-speak-polite' ) ).toBe( null ); - expect( document.getElementById( 'a11y-speak-assertive' ) ).toBe( null ); + expect( document.getElementById( 'a11y-speak-polite' ) ).toBe( + null + ); + expect( document.getElementById( 'a11y-speak-assertive' ) ).toBe( + null + ); } ); } ); describe( 'setup when the elements already exist', () => { it( 'should not create the aria live regions again', () => { - const before = document.getElementsByClassName( 'a11y-speak-region' ).length; + const before = document.getElementsByClassName( + 'a11y-speak-region' + ).length; setup(); - const after = document.getElementsByClassName( 'a11y-speak-region' ).length; + const after = document.getElementsByClassName( 'a11y-speak-region' ) + .length; expect( before ).toBe( after ); } ); diff --git a/packages/annotations/package.json b/packages/annotations/package.json index d64b2354aa6cf..f2440087022d8 100644 --- a/packages/annotations/package.json +++ b/packages/annotations/package.json @@ -21,7 +21,7 @@ "module": "build-module/index.js", "react-native": "src/index", "dependencies": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/data": "file:../data", "@wordpress/hooks": "file:../hooks", "@wordpress/i18n": "file:../i18n", diff --git a/packages/annotations/src/block/index.js b/packages/annotations/src/block/index.js index e2677bbf6a9b3..c27c170b2d64a 100644 --- a/packages/annotations/src/block/index.js +++ b/packages/annotations/src/block/index.js @@ -12,14 +12,22 @@ import { withSelect } from '@wordpress/data'; */ const addAnnotationClassName = ( OriginalComponent ) => { return withSelect( ( select, { clientId } ) => { - const annotations = select( 'core/annotations' ).__experimentalGetAnnotationsForBlock( clientId ); + const annotations = select( + 'core/annotations' + ).__experimentalGetAnnotationsForBlock( clientId ); return { - className: annotations.map( ( annotation ) => { - return 'is-annotated-by-' + annotation.source; - } ).join( ' ' ), + className: annotations + .map( ( annotation ) => { + return 'is-annotated-by-' + annotation.source; + } ) + .join( ' ' ), }; } )( OriginalComponent ); }; -addFilter( 'editor.BlockListBlock', 'core/annotations', addAnnotationClassName ); +addFilter( + 'editor.BlockListBlock', + 'core/annotations', + addAnnotationClassName +); diff --git a/packages/annotations/src/format/annotation.js b/packages/annotations/src/format/annotation.js index 46dd6e279fa3b..9ce2a2bd6d456 100644 --- a/packages/annotations/src/format/annotation.js +++ b/packages/annotations/src/format/annotation.js @@ -34,7 +34,8 @@ export function applyAnnotations( record, annotations = [] ) { record = applyFormat( record, { - type: FORMAT_NAME, attributes: { + type: FORMAT_NAME, + attributes: { className, id, }, @@ -68,7 +69,9 @@ function retrieveAnnotationPositions( formats ) { formats.forEach( ( characterFormats, i ) => { characterFormats = characterFormats || []; - characterFormats = characterFormats.filter( ( format ) => format.type === FORMAT_NAME ); + characterFormats = characterFormats.filter( + ( format ) => format.type === FORMAT_NAME + ); characterFormats.forEach( ( format ) => { let { id } = format.attributes; id = id.replace( ANNOTATION_ATTRIBUTE_PREFIX, '' ); @@ -98,7 +101,11 @@ function retrieveAnnotationPositions( formats ) { * @param {Function} actions.removeAnnotation Function to remove an annotation from the state. * @param {Function} actions.updateAnnotationRange Function to update an annotation range in the state. */ -function updateAnnotationsWithPositions( annotations, positions, { removeAnnotation, updateAnnotationRange } ) { +function updateAnnotationsWithPositions( + annotations, + positions, + { removeAnnotation, updateAnnotationRange } +) { annotations.forEach( ( currentAnnotation ) => { const position = positions[ currentAnnotation.id ]; // If we cannot find an annotation, delete it. @@ -111,7 +118,11 @@ function updateAnnotationsWithPositions( annotations, positions, { removeAnnotat const { start, end } = currentAnnotation; if ( start !== position.start || end !== position.end ) { - updateAnnotationRange( currentAnnotation.id, position.start, position.end ); + updateAnnotationRange( + currentAnnotation.id, + position.start, + position.end + ); } } ); } @@ -128,9 +139,17 @@ export const annotation = { edit() { return null; }, - __experimentalGetPropsForEditableTreePreparation( select, { richTextIdentifier, blockClientId } ) { + __experimentalGetPropsForEditableTreePreparation( + select, + { richTextIdentifier, blockClientId } + ) { return { - annotations: select( STORE_KEY ).__experimentalGetAnnotationsForRichText( blockClientId, richTextIdentifier ), + annotations: select( + STORE_KEY + ).__experimentalGetAnnotationsForRichText( + blockClientId, + richTextIdentifier + ), }; }, __experimentalCreatePrepareEditableTree( { annotations } ) { @@ -146,16 +165,25 @@ export const annotation = { }, __experimentalGetPropsForEditableTreeChangeHandler( dispatch ) { return { - removeAnnotation: dispatch( STORE_KEY ).__experimentalRemoveAnnotation, - updateAnnotationRange: dispatch( STORE_KEY ).__experimentalUpdateAnnotationRange, + removeAnnotation: dispatch( STORE_KEY ) + .__experimentalRemoveAnnotation, + updateAnnotationRange: dispatch( STORE_KEY ) + .__experimentalUpdateAnnotationRange, }; }, __experimentalCreateOnChangeEditableValue( props ) { return ( formats ) => { const positions = retrieveAnnotationPositions( formats ); - const { removeAnnotation, updateAnnotationRange, annotations } = props; - - updateAnnotationsWithPositions( annotations, positions, { removeAnnotation, updateAnnotationRange } ); + const { + removeAnnotation, + updateAnnotationRange, + annotations, + } = props; + + updateAnnotationsWithPositions( annotations, positions, { + removeAnnotation, + updateAnnotationRange, + } ); }; }, }; diff --git a/packages/annotations/src/format/index.js b/packages/annotations/src/format/index.js index 1dccbbd5012a0..e41c5640cc8c8 100644 --- a/packages/annotations/src/format/index.js +++ b/packages/annotations/src/format/index.js @@ -1,9 +1,7 @@ /** * WordPress dependencies */ -import { - registerFormatType, -} from '@wordpress/rich-text'; +import { registerFormatType } from '@wordpress/rich-text'; /** * Internal dependencies diff --git a/packages/annotations/src/index.js b/packages/annotations/src/index.js index ce64106bf903c..9435b1d861661 100644 --- a/packages/annotations/src/index.js +++ b/packages/annotations/src/index.js @@ -4,4 +4,3 @@ import './store'; import './format'; import './block'; - diff --git a/packages/annotations/src/store/actions.js b/packages/annotations/src/store/actions.js index 8135ca3e32066..f5d5b8cf208e5 100644 --- a/packages/annotations/src/store/actions.js +++ b/packages/annotations/src/store/actions.js @@ -25,7 +25,14 @@ import uuid from 'uuid/v4'; * * @return {Object} Action object. */ -export function __experimentalAddAnnotation( { blockClientId, richTextIdentifier = null, range = null, selector = 'range', source = 'default', id = uuid() } ) { +export function __experimentalAddAnnotation( { + blockClientId, + richTextIdentifier = null, + range = null, + selector = 'range', + source = 'default', + id = uuid(), +} ) { const action = { type: 'ANNOTATION_ADD', id, @@ -65,7 +72,11 @@ export function __experimentalRemoveAnnotation( annotationId ) { * * @return {Object} Action object. */ -export function __experimentalUpdateAnnotationRange( annotationId, start, end ) { +export function __experimentalUpdateAnnotationRange( + annotationId, + start, + end +) { return { type: 'ANNOTATION_UPDATE_RANGE', annotationId, diff --git a/packages/annotations/src/store/reducer.js b/packages/annotations/src/store/reducer.js index 1f768a78ad215..0756c3f3d8eac 100644 --- a/packages/annotations/src/store/reducer.js +++ b/packages/annotations/src/store/reducer.js @@ -15,7 +15,9 @@ import { get, isNumber, mapValues } from 'lodash'; function filterWithReference( collection, predicate ) { const filteredCollection = collection.filter( predicate ); - return collection.length === filteredCollection.length ? collection : filteredCollection; + return collection.length === filteredCollection.length + ? collection + : filteredCollection; } /** @@ -25,9 +27,11 @@ function filterWithReference( collection, predicate ) { * @return {boolean} Whether the given annotation is valid. */ function isValidAnnotationRange( annotation ) { - return isNumber( annotation.start ) && + return ( + isNumber( annotation.start ) && isNumber( annotation.end ) && - annotation.start <= annotation.end; + annotation.start <= annotation.end + ); } /** @@ -51,7 +55,10 @@ export function annotations( state = {}, action ) { range: action.range, }; - if ( newAnnotation.selector === 'range' && ! isValidAnnotationRange( newAnnotation.range ) ) { + if ( + newAnnotation.selector === 'range' && + ! isValidAnnotationRange( newAnnotation.range ) + ) { return state; } @@ -59,43 +66,54 @@ export function annotations( state = {}, action ) { return { ...state, - [ blockClientId ]: [ ...previousAnnotationsForBlock, newAnnotation ], + [ blockClientId ]: [ + ...previousAnnotationsForBlock, + newAnnotation, + ], }; case 'ANNOTATION_REMOVE': return mapValues( state, ( annotationsForBlock ) => { - return filterWithReference( annotationsForBlock, ( annotation ) => { - return annotation.id !== action.annotationId; - } ); + return filterWithReference( + annotationsForBlock, + ( annotation ) => { + return annotation.id !== action.annotationId; + } + ); } ); case 'ANNOTATION_UPDATE_RANGE': return mapValues( state, ( annotationsForBlock ) => { let hasChangedRange = false; - const newAnnotations = annotationsForBlock.map( ( annotation ) => { - if ( annotation.id === action.annotationId ) { - hasChangedRange = true; - return { - ...annotation, - range: { - start: action.start, - end: action.end, - }, - }; - } + const newAnnotations = annotationsForBlock.map( + ( annotation ) => { + if ( annotation.id === action.annotationId ) { + hasChangedRange = true; + return { + ...annotation, + range: { + start: action.start, + end: action.end, + }, + }; + } - return annotation; - } ); + return annotation; + } + ); return hasChangedRange ? newAnnotations : annotationsForBlock; } ); case 'ANNOTATION_REMOVE_SOURCE': return mapValues( state, ( annotationsForBlock ) => { - return filterWithReference( annotationsForBlock, ( annotation ) => { - return annotation.source !== action.source; - } ); + return filterWithReference( + annotationsForBlock, + ( annotation ) => { + return annotation.source !== action.source; + } + ); } ); } diff --git a/packages/annotations/src/store/selectors.js b/packages/annotations/src/store/selectors.js index a39a315c92f90..fa7b97e259ab7 100644 --- a/packages/annotations/src/store/selectors.js +++ b/packages/annotations/src/store/selectors.js @@ -29,12 +29,13 @@ export const __experimentalGetAnnotationsForBlock = createSelector( return annotation.selector === 'block'; } ); }, - ( state, blockClientId ) => [ - get( state, blockClientId, EMPTY_ARRAY ), - ] + ( state, blockClientId ) => [ get( state, blockClientId, EMPTY_ARRAY ) ] ); -export const __experimentalGetAllAnnotationsForBlock = function( state, blockClientId ) { +export const __experimentalGetAllAnnotationsForBlock = function( + state, + blockClientId +) { return get( state, blockClientId, EMPTY_ARRAY ); }; @@ -52,21 +53,23 @@ export const __experimentalGetAllAnnotationsForBlock = function( state, blockCli */ export const __experimentalGetAnnotationsForRichText = createSelector( ( state, blockClientId, richTextIdentifier ) => { - return get( state, blockClientId, [] ).filter( ( annotation ) => { - return annotation.selector === 'range' && - richTextIdentifier === annotation.richTextIdentifier; - } ).map( ( annotation ) => { - const { range, ...other } = annotation; + return get( state, blockClientId, [] ) + .filter( ( annotation ) => { + return ( + annotation.selector === 'range' && + richTextIdentifier === annotation.richTextIdentifier + ); + } ) + .map( ( annotation ) => { + const { range, ...other } = annotation; - return { - ...range, - ...other, - }; - } ); + return { + ...range, + ...other, + }; + } ); }, - ( state, blockClientId ) => [ - get( state, blockClientId, EMPTY_ARRAY ), - ] + ( state, blockClientId ) => [ get( state, blockClientId, EMPTY_ARRAY ) ] ); /** diff --git a/packages/annotations/src/store/test/reducer.js b/packages/annotations/src/store/test/reducer.js index 190795bd8a98c..0e9c62a93adc4 100644 --- a/packages/annotations/src/store/test/reducer.js +++ b/packages/annotations/src/store/test/reducer.js @@ -23,18 +23,6 @@ describe( 'annotations', () => { } ); expect( state ).toEqual( { - blockClientId: [ { - id: 'annotationId', - blockClientId: 'blockClientId', - richTextIdentifier: 'identifier', - source: 'default', - selector: 'block', - } ], - } ); - } ); - - it( 'allows an annotation to be removed', () => { - const state = annotations( { blockClientId: [ { id: 'annotationId', @@ -44,10 +32,27 @@ describe( 'annotations', () => { selector: 'block', }, ], - }, { - type: 'ANNOTATION_REMOVE', - annotationId: 'annotationId', } ); + } ); + + it( 'allows an annotation to be removed', () => { + const state = annotations( + { + blockClientId: [ + { + id: 'annotationId', + blockClientId: 'blockClientId', + richTextIdentifier: 'identifier', + source: 'default', + selector: 'block', + }, + ], + }, + { + type: 'ANNOTATION_REMOVE', + annotationId: 'annotationId', + } + ); expect( state ).toEqual( { blockClientId: [] } ); } ); @@ -67,17 +72,16 @@ describe( 'annotations', () => { source: 'other-source', selector: 'block', }; - const state = annotations( { - blockClientId: [ - annotation1, - ], - blockClientId2: [ - annotation2, - ], - }, { - type: 'ANNOTATION_REMOVE_SOURCE', - source: 'default', - } ); + const state = annotations( + { + blockClientId: [ annotation1 ], + blockClientId2: [ annotation2 ], + }, + { + type: 'ANNOTATION_REMOVE_SOURCE', + source: 'default', + } + ); expect( state ).toEqual( { blockClientId: [], @@ -117,26 +121,29 @@ describe( 'annotations', () => { } ); it( 'moves annotations when said action is dispatched', () => { - const state = annotations( { - blockClientId: [ - { - id: 'annotationId', - blockClientId: 'blockClientId', - richTextIdentifier: 'identifier', - source: 'default', - selector: 'range', - range: { - start: 0, - end: 100, + const state = annotations( + { + blockClientId: [ + { + id: 'annotationId', + blockClientId: 'blockClientId', + richTextIdentifier: 'identifier', + source: 'default', + selector: 'range', + range: { + start: 0, + end: 100, + }, }, - }, - ], - }, { - type: 'ANNOTATION_UPDATE_RANGE', - annotationId: 'annotationId', - start: 50, - end: 75, - } ); + ], + }, + { + type: 'ANNOTATION_UPDATE_RANGE', + annotationId: 'annotationId', + start: 50, + end: 75, + } + ); expect( state ).toEqual( { blockClientId: [ diff --git a/packages/api-fetch/README.md b/packages/api-fetch/README.md index c5b6b190ddbe3..52134d5603911 100644 --- a/packages/api-fetch/README.md +++ b/packages/api-fetch/README.md @@ -17,9 +17,19 @@ _This package assumes that your code will run in an **ES2015+** environment. If ```js import apiFetch from '@wordpress/api-fetch'; +// GET apiFetch( { path: '/wp/v2/posts' } ).then( posts => { console.log( posts ); } ); + +// POST +apiFetch( { + path: '/wp/v2/posts/1', + method: 'POST', + data: { title: 'New Post Title' }, +} ).then( res => { + console.log( res ); +} ); ``` ### Options diff --git a/packages/api-fetch/package.json b/packages/api-fetch/package.json index ce31f025021e4..8bf265119dab4 100644 --- a/packages/api-fetch/package.json +++ b/packages/api-fetch/package.json @@ -22,7 +22,7 @@ "module": "build-module/index.js", "react-native": "src/index", "dependencies": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@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 535adb8d88a76..9e7edc985709e 100644 --- a/packages/api-fetch/src/index.js +++ b/packages/api-fetch/src/index.js @@ -14,7 +14,10 @@ import namespaceEndpointMiddleware from './middlewares/namespace-endpoint'; import httpV1Middleware from './middlewares/http-v1'; import userLocaleMiddleware from './middlewares/user-locale'; import mediaUploadMiddleware from './middlewares/media-upload'; -import { parseResponseAndNormalizeError, parseAndThrowError } from './utils/response'; +import { + parseResponseAndNormalizeError, + parseAndThrowError, +} from './utils/response'; /** * Default set of header values which should be sent with every request unless @@ -72,33 +75,36 @@ const defaultFetchHandler = ( nextOptions ) => { headers[ 'Content-Type' ] = 'application/json'; } - const responsePromise = window.fetch( - url || path, - { - ...DEFAULT_OPTIONS, - ...remainingOptions, - body, - headers, - } - ); + const responsePromise = window.fetch( url || path, { + ...DEFAULT_OPTIONS, + ...remainingOptions, + body, + headers, + } ); - return responsePromise - // Return early if fetch errors. If fetch error, there is most likely no - // network connection. Unfortunately fetch just throws a TypeError and - // the message might depend on the browser. - .then( - ( value ) => - Promise.resolve( value ) - .then( checkStatus ) - .catch( ( response ) => parseAndThrowError( response, parse ) ) - .then( ( response ) => parseResponseAndNormalizeError( response, parse ) ), - () => { - throw { - code: 'fetch_error', - message: __( 'You are probably offline.' ), - }; - } - ); + return ( + responsePromise + // Return early if fetch errors. If fetch error, there is most likely no + // network connection. Unfortunately fetch just throws a TypeError and + // the message might depend on the browser. + .then( + ( value ) => + Promise.resolve( value ) + .then( checkStatus ) + .catch( ( response ) => + parseAndThrowError( response, parse ) + ) + .then( ( response ) => + parseResponseAndNormalizeError( response, parse ) + ), + () => { + throw { + code: 'fetch_error', + message: __( 'You are probably offline.' ), + }; + } + ) + ); }; let fetchHandler = defaultFetchHandler; @@ -135,7 +141,8 @@ function apiFetch( options ) { } // If the nonce is invalid, refresh it and try again. - window.fetch( apiFetch.nonceEndpoint ) + window + .fetch( apiFetch.nonceEndpoint ) .then( checkStatus ) .then( ( data ) => data.text() ) .then( ( text ) => { diff --git a/packages/api-fetch/src/middlewares/fetch-all-middleware.js b/packages/api-fetch/src/middlewares/fetch-all-middleware.js index 5bc17b5413d32..2fa1b3b3629aa 100644 --- a/packages/api-fetch/src/middlewares/fetch-all-middleware.js +++ b/packages/api-fetch/src/middlewares/fetch-all-middleware.js @@ -11,18 +11,19 @@ const modifyQuery = ( { path, url, ...options }, queryArgs ) => ( { } ); // Duplicates parsing functionality from apiFetch. -const parseResponse = ( response ) => response.json ? - response.json() : - Promise.reject( response ); +const parseResponse = ( response ) => + response.json ? response.json() : Promise.reject( response ); const parseLinkHeader = ( linkHeader ) => { if ( ! linkHeader ) { return {}; } const match = linkHeader.match( /<([^>]+)>; rel="next"/ ); - return match ? { - next: match[ 1 ], - } : {}; + return match + ? { + next: match[ 1 ], + } + : {}; }; const getNextPageUrl = ( response ) => { @@ -31,8 +32,10 @@ const getNextPageUrl = ( response ) => { }; const requestContainsUnboundedQuery = ( options ) => { - const pathIsUnbounded = options.path && options.path.indexOf( 'per_page=-1' ) !== -1; - const urlIsUnbounded = options.url && options.url.indexOf( 'per_page=-1' ) !== -1; + const pathIsUnbounded = + options.path && options.path.indexOf( 'per_page=-1' ) !== -1; + const urlIsUnbounded = + options.url && options.url.indexOf( 'per_page=-1' ) !== -1; return pathIsUnbounded || urlIsUnbounded; }; diff --git a/packages/api-fetch/src/middlewares/http-v1.js b/packages/api-fetch/src/middlewares/http-v1.js index d7771bf6f9b1c..87304712e4b21 100644 --- a/packages/api-fetch/src/middlewares/http-v1.js +++ b/packages/api-fetch/src/middlewares/http-v1.js @@ -3,11 +3,7 @@ * * @type {Set} */ -const OVERRIDE_METHODS = new Set( [ - 'PATCH', - 'PUT', - 'DELETE', -] ); +const OVERRIDE_METHODS = new Set( [ 'PATCH', 'PUT', 'DELETE' ] ); /** * Default request method. diff --git a/packages/api-fetch/src/middlewares/media-upload.js b/packages/api-fetch/src/middlewares/media-upload.js index 6772aaf3ded73..5668c18cfbd79 100644 --- a/packages/api-fetch/src/middlewares/media-upload.js +++ b/packages/api-fetch/src/middlewares/media-upload.js @@ -37,29 +37,36 @@ function mediaUploadMiddleware( options, next ) { method: 'POST', data: { action: 'create-image-subsizes' }, parse: false, - } ) - .catch( () => { - if ( retries < maxRetries ) { - return postProcess( attachmentId ); - } - next( { - path: `/wp/v2/media/${ attachmentId }?force=true`, - method: 'DELETE', - } ); - - return Promise.reject(); + } ).catch( () => { + if ( retries < maxRetries ) { + return postProcess( attachmentId ); + } + next( { + path: `/wp/v2/media/${ attachmentId }?force=true`, + method: 'DELETE', } ); + + return Promise.reject(); + } ); }; return next( { ...options, parse: false } ) .catch( ( response ) => { - const attachmentId = response.headers.get( 'x-wp-upload-attachment-id' ); - if ( response.status >= 500 && response.status < 600 && attachmentId ) { + const attachmentId = response.headers.get( + 'x-wp-upload-attachment-id' + ); + if ( + response.status >= 500 && + response.status < 600 && + attachmentId + ) { return postProcess( attachmentId ).catch( () => { if ( options.parse !== false ) { return Promise.reject( { code: 'post_process', - message: __( 'Media upload failed. If this is a photo or a large image, please scale it down and try again.' ), + message: __( + 'Media upload failed. If this is a photo or a large image, please scale it down and try again.' + ), } ); } @@ -68,7 +75,9 @@ function mediaUploadMiddleware( options, next ) { } return parseAndThrowError( response, options.parse ); } ) - .then( ( response ) => parseResponseAndNormalizeError( response, options.parse ) ); + .then( ( response ) => + parseResponseAndNormalizeError( response, options.parse ) + ); } export default mediaUploadMiddleware; diff --git a/packages/api-fetch/src/middlewares/namespace-endpoint.js b/packages/api-fetch/src/middlewares/namespace-endpoint.js index c6ee6c67b4afb..406c12926dd97 100644 --- a/packages/api-fetch/src/middlewares/namespace-endpoint.js +++ b/packages/api-fetch/src/middlewares/namespace-endpoint.js @@ -4,7 +4,7 @@ const namespaceAndEndpointMiddleware = ( options, next ) => { if ( typeof options.namespace === 'string' && - typeof options.endpoint === 'string' + typeof options.endpoint === 'string' ) { namespaceTrimmed = options.namespace.replace( /^\/|\/$/g, '' ); endpointTrimmed = options.endpoint.replace( /^\//, '' ); diff --git a/packages/api-fetch/src/middlewares/preloading.js b/packages/api-fetch/src/middlewares/preloading.js index bb02e3dfe64af..573a6c80b384e 100644 --- a/packages/api-fetch/src/middlewares/preloading.js +++ b/packages/api-fetch/src/middlewares/preloading.js @@ -16,23 +16,27 @@ export function getStablePath( path ) { } // 'b=1&c=2&a=5' - return base + '?' + query - // [ 'b=1', 'c=2', 'a=5' ] - .split( '&' ) - // [ [ 'b, '1' ], [ 'c', '2' ], [ 'a', '5' ] ] - .map( function( entry ) { - return entry.split( '=' ); - } ) - // [ [ 'a', '5' ], [ 'b, '1' ], [ 'c', '2' ] ] - .sort( function( a, b ) { - return a[ 0 ].localeCompare( b[ 0 ] ); - } ) - // [ 'a=5', 'b=1', 'c=2' ] - .map( function( pair ) { - return pair.join( '=' ); - } ) - // 'a=5&b=1&c=2' - .join( '&' ); + return ( + base + + '?' + + query + // [ 'b=1', 'c=2', 'a=5' ] + .split( '&' ) + // [ [ 'b, '1' ], [ 'c', '2' ], [ 'a', '5' ] ] + .map( function( entry ) { + return entry.split( '=' ); + } ) + // [ [ 'a', '5' ], [ 'b, '1' ], [ 'c', '2' ] ] + .sort( function( a, b ) { + return a[ 0 ].localeCompare( b[ 0 ] ); + } ) + // [ 'a=5', 'b=1', 'c=2' ] + .map( function( pair ) { + return pair.join( '=' ); + } ) + // 'a=5&b=1&c=2' + .join( '&' ) + ); } function createPreloadingMiddleware( preloadedData ) { diff --git a/packages/api-fetch/src/middlewares/root-url.js b/packages/api-fetch/src/middlewares/root-url.js index 92b50523642fc..8d2ad63628547 100644 --- a/packages/api-fetch/src/middlewares/root-url.js +++ b/packages/api-fetch/src/middlewares/root-url.js @@ -20,7 +20,10 @@ const createRootURLMiddleware = ( rootURL ) => ( options, next ) => { // API root may already include query parameter prefix if site is // configured to use plain permalinks. - if ( 'string' === typeof apiRoot && -1 !== apiRoot.indexOf( '?' ) ) { + if ( + 'string' === typeof apiRoot && + -1 !== apiRoot.indexOf( '?' ) + ) { path = path.replace( '?', '&' ); } diff --git a/packages/api-fetch/src/middlewares/test/fetch-all-middleware.js b/packages/api-fetch/src/middlewares/test/fetch-all-middleware.js index b73eeba15e14b..f0b2c035a646a 100644 --- a/packages/api-fetch/src/middlewares/test/fetch-all-middleware.js +++ b/packages/api-fetch/src/middlewares/test/fetch-all-middleware.js @@ -29,9 +29,9 @@ describe( 'Fetch All Middleware', () => { status: 200, headers: { get() { - return options.url === '/posts?per_page=100' ? - '; rel="next"' : - ''; + return options.url === '/posts?per_page=100' + ? '; rel="next"' + : ''; }, }, json() { diff --git a/packages/api-fetch/src/middlewares/test/preloading.js b/packages/api-fetch/src/middlewares/test/preloading.js index 06a63c8d5f149..167e2e4eb32d6 100644 --- a/packages/api-fetch/src/middlewares/test/preloading.js +++ b/packages/api-fetch/src/middlewares/test/preloading.js @@ -36,7 +36,9 @@ describe( 'Preloading Middleware', () => { body, }, }; - const preloadingMiddleware = createPreloadingMiddleware( preloadedData ); + const preloadingMiddleware = createPreloadingMiddleware( + preloadedData + ); const requestOptions = { method: 'GET', path: 'wp/v2/posts', @@ -54,7 +56,9 @@ describe( 'Preloading Middleware', () => { 'wp/v2/demo-reverse-alphabetical?foo=bar&baz=quux': { body }, 'wp/v2/demo-alphabetical?baz=quux&foo=bar': { body }, }; - const preloadingMiddleware = createPreloadingMiddleware( preloadedData ); + const preloadingMiddleware = createPreloadingMiddleware( + preloadedData + ); let requestOptions = { method: 'GET', @@ -73,16 +77,15 @@ describe( 'Preloading Middleware', () => { expect( value ).toEqual( body ); } ); - describe.each( [ - [ 'GET' ], - [ 'OPTIONS' ], - ] )( '%s', ( method ) => { + describe.each( [ [ 'GET' ], [ 'OPTIONS' ] ] )( '%s', ( method ) => { describe.each( [ [ 'all empty', {} ], [ 'method empty', { [ method ]: {} } ], ] )( '%s', ( label, preloadedData ) => { it( 'should move to the next middleware if no preloaded data', () => { - const prelooadingMiddleware = createPreloadingMiddleware( preloadedData ); + const prelooadingMiddleware = createPreloadingMiddleware( + preloadedData + ); const requestOptions = { method, path: 'wp/v2/posts', diff --git a/packages/api-fetch/src/middlewares/test/root-url.js b/packages/api-fetch/src/middlewares/test/root-url.js index 3480cddc532b0..921e6af8bb01e 100644 --- a/packages/api-fetch/src/middlewares/test/root-url.js +++ b/packages/api-fetch/src/middlewares/test/root-url.js @@ -14,7 +14,9 @@ describe( 'Root URL middleware', () => { path: '/wp/v2/posts', }; const callback = ( options ) => { - expect( options.url ).toBe( 'http://wp.org/wp-admin/rest/wp/v2/posts' ); + expect( options.url ).toBe( + 'http://wp.org/wp-admin/rest/wp/v2/posts' + ); }; rootURLMiddleware( requestOptions, callback ); diff --git a/packages/api-fetch/src/middlewares/test/user-locale.js b/packages/api-fetch/src/middlewares/test/user-locale.js index 03dc9136ee20e..9626819f3e086 100644 --- a/packages/api-fetch/src/middlewares/test/user-locale.js +++ b/packages/api-fetch/src/middlewares/test/user-locale.js @@ -73,7 +73,9 @@ describe( 'User locale middleware', () => { }; const callback = ( options ) => { - expect( options.url ).toBe( 'http://wp.org/wp-json/wp/v2/posts?_locale=user' ); + expect( options.url ).toBe( + 'http://wp.org/wp-json/wp/v2/posts?_locale=user' + ); }; userLocaleMiddleware( requestOptions, callback ); @@ -88,7 +90,9 @@ describe( 'User locale middleware', () => { }; const callback = ( options ) => { - expect( options.url ).toBe( 'http://wp.org/wp-json/wp/v2/posts?foo=bar&_locale=user' ); + expect( options.url ).toBe( + 'http://wp.org/wp-json/wp/v2/posts?foo=bar&_locale=user' + ); }; userLocaleMiddleware( requestOptions, callback ); @@ -103,7 +107,9 @@ describe( 'User locale middleware', () => { }; const callback = ( options ) => { - expect( options.url ).toBe( 'http://wp.org/wp-json/wp/v2/posts?_locale=foo' ); + expect( options.url ).toBe( + 'http://wp.org/wp-json/wp/v2/posts?_locale=foo' + ); }; userLocaleMiddleware( requestOptions, callback ); @@ -118,7 +124,9 @@ describe( 'User locale middleware', () => { }; const callback = ( options ) => { - expect( options.url ).toBe( 'http://wp.org/wp-json/wp/v2/posts?foo=bar&_locale=foo' ); + expect( options.url ).toBe( + 'http://wp.org/wp-json/wp/v2/posts?foo=bar&_locale=foo' + ); }; userLocaleMiddleware( requestOptions, callback ); diff --git a/packages/api-fetch/src/middlewares/user-locale.js b/packages/api-fetch/src/middlewares/user-locale.js index 22fd232caf91b..8debbde8d994a 100644 --- a/packages/api-fetch/src/middlewares/user-locale.js +++ b/packages/api-fetch/src/middlewares/user-locale.js @@ -4,11 +4,17 @@ import { addQueryArgs, hasQueryArg } from '@wordpress/url'; function userLocaleMiddleware( options, next ) { - if ( typeof options.url === 'string' && ! hasQueryArg( options.url, '_locale' ) ) { + if ( + typeof options.url === 'string' && + ! hasQueryArg( options.url, '_locale' ) + ) { options.url = addQueryArgs( options.url, { _locale: 'user' } ); } - if ( typeof options.path === 'string' && ! hasQueryArg( options.path, '_locale' ) ) { + if ( + typeof options.path === 'string' && + ! hasQueryArg( options.path, '_locale' ) + ) { options.path = addQueryArgs( options.path, { _locale: 'user' } ); } diff --git a/packages/api-fetch/src/test/index.js b/packages/api-fetch/src/test/index.js index 001483b8b2361..26431fb69a593 100644 --- a/packages/api-fetch/src/test/index.js +++ b/packages/api-fetch/src/test/index.js @@ -25,12 +25,14 @@ describe( 'apiFetch', () => { } ); it( 'should call the API properly', () => { - window.fetch.mockReturnValue( Promise.resolve( { - status: 200, - json() { - return Promise.resolve( { message: 'ok' } ); - }, - } ) ); + window.fetch.mockReturnValue( + Promise.resolve( { + status: 200, + json() { + return Promise.resolve( { message: 'ok' } ); + }, + } ) + ); return apiFetch( { path: '/random' } ).then( ( body ) => { expect( body ).toEqual( { message: 'ok' } ); @@ -48,14 +50,17 @@ describe( 'apiFetch', () => { body, } ); - expect( window.fetch ).toHaveBeenCalledWith( '/wp/v2/media?_locale=user', { - credentials: 'include', - headers: { - Accept: 'application/json, */*;q=0.1', - }, - method: 'POST', - body, - } ); + expect( window.fetch ).toHaveBeenCalledWith( + '/wp/v2/media?_locale=user', + { + credentials: 'include', + headers: { + Accept: 'application/json, */*;q=0.1', + }, + method: 'POST', + body, + } + ); } ); it( 'should fetch with a JSON body', () => { @@ -70,15 +75,18 @@ describe( 'apiFetch', () => { data: {}, } ); - expect( window.fetch ).toHaveBeenCalledWith( '/wp/v2/posts?_locale=user', { - body: '{}', - credentials: 'include', - headers: { - Accept: 'application/json, */*;q=0.1', - 'Content-Type': 'application/json', - }, - method: 'POST', - } ); + expect( window.fetch ).toHaveBeenCalledWith( + '/wp/v2/posts?_locale=user', + { + body: '{}', + credentials: 'include', + headers: { + Accept: 'application/json, */*;q=0.1', + 'Content-Type': 'application/json', + }, + method: 'POST', + } + ); } ); it( 'should respect developer-provided options', () => { @@ -91,27 +99,32 @@ describe( 'apiFetch', () => { credentials: 'omit', } ); - expect( window.fetch ).toHaveBeenCalledWith( '/wp/v2/posts?_locale=user', { - body: '{}', - credentials: 'omit', - headers: { - Accept: 'application/json, */*;q=0.1', - 'Content-Type': 'application/json', - }, - method: 'POST', - } ); + expect( window.fetch ).toHaveBeenCalledWith( + '/wp/v2/posts?_locale=user', + { + body: '{}', + credentials: 'omit', + headers: { + Accept: 'application/json, */*;q=0.1', + 'Content-Type': 'application/json', + }, + method: 'POST', + } + ); } ); it( 'should return the error message properly', () => { - window.fetch.mockReturnValue( Promise.resolve( { - status: 400, - json() { - return Promise.resolve( { - code: 'bad_request', - message: 'Bad Request', - } ); - }, - } ) ); + window.fetch.mockReturnValue( + Promise.resolve( { + status: 400, + json() { + return Promise.resolve( { + code: 'bad_request', + message: 'Bad Request', + } ); + }, + } ) + ); return apiFetch( { path: '/random' } ).catch( ( body ) => { expect( body ).toEqual( { @@ -122,9 +135,11 @@ describe( 'apiFetch', () => { } ); it( 'should return invalid JSON error if no json response', () => { - window.fetch.mockReturnValue( Promise.resolve( { - status: 200, - } ) ); + window.fetch.mockReturnValue( + Promise.resolve( { + status: 200, + } ) + ); return apiFetch( { path: '/random' } ).catch( ( body ) => { expect( body ).toEqual( { @@ -135,12 +150,14 @@ describe( 'apiFetch', () => { } ); it( 'should return invalid JSON error if response is not valid', () => { - window.fetch.mockReturnValue( Promise.resolve( { - status: 200, - json() { - return Promise.reject(); - }, - } ) ); + window.fetch.mockReturnValue( + Promise.resolve( { + status: 200, + json() { + return Promise.reject(); + }, + } ) + ); return apiFetch( { path: '/random' } ).catch( ( body ) => { expect( body ).toEqual( { @@ -162,9 +179,11 @@ describe( 'apiFetch', () => { } ); it( 'should return null if response has no content status code', () => { - window.fetch.mockReturnValue( Promise.resolve( { - status: 204, - } ) ); + window.fetch.mockReturnValue( + Promise.resolve( { + status: 204, + } ) + ); return apiFetch( { path: '/random' } ).catch( ( body ) => { expect( body ).toEqual( null ); @@ -172,27 +191,35 @@ describe( 'apiFetch', () => { } ); it( 'should not try to parse the response', () => { - window.fetch.mockReturnValue( Promise.resolve( { - status: 200, - } ) ); - - return apiFetch( { path: '/random', parse: false } ).then( ( response ) => { - expect( response ).toEqual( { + window.fetch.mockReturnValue( + Promise.resolve( { status: 200, - } ); - } ); + } ) + ); + + return apiFetch( { path: '/random', parse: false } ).then( + ( response ) => { + expect( response ).toEqual( { + status: 200, + } ); + } + ); } ); it( 'should not try to parse the error', () => { - window.fetch.mockReturnValue( Promise.resolve( { - status: 400, - } ) ); - - return apiFetch( { path: '/random', parse: false } ).catch( ( response ) => { - expect( response ).toEqual( { + window.fetch.mockReturnValue( + Promise.resolve( { status: 400, - } ); - } ); + } ) + ); + + return apiFetch( { path: '/random', parse: false } ).catch( + ( response ) => { + expect( response ).toEqual( { + status: 400, + } ); + } + ); } ); it( 'should not use the default fetch handler when using a custom fetch handler', () => { diff --git a/packages/api-fetch/src/utils/response.js b/packages/api-fetch/src/utils/response.js index bb7b79ce2f825..d28413862b6c6 100644 --- a/packages/api-fetch/src/utils/response.js +++ b/packages/api-fetch/src/utils/response.js @@ -33,10 +33,9 @@ const parseJsonAndNormalizeError = ( response ) => { throw invalidJsonError; } - return response.json() - .catch( () => { - throw invalidJsonError; - } ); + return response.json().catch( () => { + throw invalidJsonError; + } ); }; /** @@ -47,9 +46,13 @@ const parseJsonAndNormalizeError = ( response ) => { * * @return {Promise} Parsed response. */ -export const parseResponseAndNormalizeError = ( response, shouldParseResponse = true ) => { - return Promise.resolve( parseResponse( response, shouldParseResponse ) ) - .catch( ( res ) => parseAndThrowError( res, shouldParseResponse ) ); +export const parseResponseAndNormalizeError = ( + response, + shouldParseResponse = true +) => { + return Promise.resolve( + parseResponse( response, shouldParseResponse ) + ).catch( ( res ) => parseAndThrowError( res, shouldParseResponse ) ); }; export function parseAndThrowError( response, shouldParseResponse = true ) { @@ -57,14 +60,12 @@ export function parseAndThrowError( response, shouldParseResponse = true ) { throw response; } - return parseJsonAndNormalizeError( response ) - .then( ( error ) => { - const unknownError = { - code: 'unknown_error', - message: __( 'An unknown error occurred.' ), - }; + return parseJsonAndNormalizeError( response ).then( ( error ) => { + const unknownError = { + code: 'unknown_error', + message: __( 'An unknown error occurred.' ), + }; - throw error || unknownError; - } ); + throw error || unknownError; + } ); } - diff --git a/packages/autop/package.json b/packages/autop/package.json index ef57d2a3a0516..dab9b1330e4f6 100644 --- a/packages/autop/package.json +++ b/packages/autop/package.json @@ -22,7 +22,7 @@ "react-native": "src/index", "sideEffects": false, "dependencies": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.8.3" }, "publishConfig": { "access": "public" diff --git a/packages/autop/src/index.js b/packages/autop/src/index.js index 1225d5c6637d8..3a0fc7fa73600 100644 --- a/packages/autop/src/index.js +++ b/packages/autop/src/index.js @@ -6,42 +6,42 @@ const htmlSplitRegex = ( () => { /* eslint-disable no-multi-spaces */ const comments = - '!' + // Start of comment, after the <. - '(?:' + // Unroll the loop: Consume everything until --> is found. - '-(?!->)' + // Dash not followed by end of comment. - '[^\\-]*' + // Consume non-dashes. - ')*' + // Loop possessively. - '(?:-->)?'; // End of comment. If not found, match all input. + '!' + // Start of comment, after the <. + '(?:' + // Unroll the loop: Consume everything until --> is found. + '-(?!->)' + // Dash not followed by end of comment. + '[^\\-]*' + // Consume non-dashes. + ')*' + // Loop possessively. + '(?:-->)?'; // End of comment. If not found, match all input. const cdata = '!\\[CDATA\\[' + // Start of comment, after the <. - '[^\\]]*' + // Consume non-]. - '(?:' + // Unroll the loop: Consume everything until ]]> is found. - '](?!]>)' + // One ] not followed by end of comment. - '[^\\]]*' + // Consume non-]. - ')*?' + // Loop possessively. - '(?:]]>)?'; // End of comment. If not found, match all input. + '[^\\]]*' + // Consume non-]. + '(?:' + // Unroll the loop: Consume everything until ]]> is found. + '](?!]>)' + // One ] not followed by end of comment. + '[^\\]]*' + // Consume non-]. + ')*?' + // Loop possessively. + '(?:]]>)?'; // End of comment. If not found, match all input. const escaped = - '(?=' + // Is the element escaped? - '!--' + + '(?=' + // Is the element escaped? + '!--' + '|' + - '!\\[CDATA\\[' + + '!\\[CDATA\\[' + ')' + - '((?=!-)' + // If yes, which type? - comments + + '((?=!-)' + // If yes, which type? + comments + '|' + - cdata + + cdata + ')'; const regex = - '(' + // Capture the entire match. - '<' + // Find start of element. - '(' + // Conditional expression follows. - escaped + // Find end of escaped element. - '|' + // ... else ... - '[^>]*>?' + // Find end of normal element. - ')' + + '(' + // Capture the entire match. + '<' + // Find start of element. + '(' + // Conditional expression follows. + escaped + // Find end of escaped element. + '|' + // ... else ... + '[^>]*>?' + // Find end of normal element. + ')' + ')'; return new RegExp( regex ); @@ -92,7 +92,10 @@ function replaceInHtmlTags( haystack, replacePairs ) { for ( let j = 0; j < needles.length; j++ ) { const needle = needles[ j ]; if ( -1 !== textArr[ i ].indexOf( needle ) ) { - textArr[ i ] = textArr[ i ].replace( new RegExp( needle, 'g' ), replacePairs[ needle ] ); + textArr[ i ] = textArr[ i ].replace( + new RegExp( needle, 'g' ), + replacePairs[ needle ] + ); changed = true; // After one strtr() break out of the foreach loop and look at next element. break; @@ -166,13 +169,20 @@ export function autop( text, br = true ) { // Change multiple
s into two line breaks, which will turn into paragraphs. text = text.replace( /\s*/g, '\n\n' ); - const allBlocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)'; + const allBlocks = + '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)'; // Add a double line break above block-level opening tags. - text = text.replace( new RegExp( '(<' + allBlocks + '[\\s\/>])', 'g' ), '\n\n$1' ); + text = text.replace( + new RegExp( '(<' + allBlocks + '[\\s/>])', 'g' ), + '\n\n$1' + ); // Add a double line break below block-level closing tags. - text = text.replace( new RegExp( '(<\/' + allBlocks + '>)', 'g' ), '$1\n\n' ); + text = text.replace( + new RegExp( '()', 'g' ), + '$1\n\n' + ); // Standardize newline characters to "\n". text = text.replace( /\r\n|\r/g, '\n' ); @@ -230,10 +240,16 @@ export function autop( text, br = true ) { text = text.replace( /

\s*<\/p>/g, '' ); // Add a closing

inside

,
, or
tag if missing. - text = text.replace( /

([^<]+)<\/(div|address|form)>/g, '

$1

' ); + text = text.replace( + /

([^<]+)<\/(div|address|form)>/g, + '

$1

' + ); // If an opening or closing block element tag is wrapped in a

, unwrap it. - text = text.replace( new RegExp( '

\\s*(<\/?' + allBlocks + '[^>]*>)\\s*<\/p>', 'g' ), '$1' ); + text = text.replace( + new RegExp( '

\\s*(]*>)\\s*

', 'g' ), + '$1' + ); // In some cases
  • may get wrapped in

    , fix them. text = text.replace( /

    (/g, '$1' ); @@ -243,31 +259,47 @@ export function autop( text, br = true ) { text = text.replace( /<\/blockquote><\/p>/g, '

    ' ); // If an opening or closing block element tag is preceded by an opening

    tag, remove it. - text = text.replace( new RegExp( '

    \\s*(<\/?' + allBlocks + '[^>]*>)', 'g' ), '$1' ); + text = text.replace( + new RegExp( '

    \\s*(]*>)', 'g' ), + '$1' + ); // If an opening or closing block element tag is followed by a closing

    tag, remove it. - text = text.replace( new RegExp( '(<\/?' + allBlocks + '[^>]*>)\\s*<\/p>', 'g' ), '$1' ); + text = text.replace( + new RegExp( '(]*>)\\s*

    ', 'g' ), + '$1' + ); // Optionally insert line breaks. if ( br ) { // Replace newlines that shouldn't be touched with a placeholder. - text = text.replace( /<(script|style).*?<\/\\1>/g, ( match ) => match[ 0 ].replace( /\n/g, '' ) ); + text = text.replace( /<(script|style).*?<\/\\1>/g, ( match ) => + match[ 0 ].replace( /\n/g, '' ) + ); // Normalize
    text = text.replace( /
    |/g, '
    ' ); // Replace any new line characters that aren't preceded by a
    with a
    . - text = text.replace( /(
    )?\s*\n/g, ( a, b ) => b ? a : '
    \n' ); + text = text.replace( /(
    )?\s*\n/g, ( a, b ) => + b ? a : '
    \n' + ); // Replace newline placeholders with newlines. text = text.replace( //g, '\n' ); } // If a
    tag is after an opening or closing block tag, remove it. - text = text.replace( new RegExp( '(<\/?' + allBlocks + '[^>]*>)\\s*
    ', 'g' ), '$1' ); + text = text.replace( + new RegExp( '(]*>)\\s*
    ', 'g' ), + '$1' + ); // If a
    tag is before a subset of opening or closing block tags, remove it. - text = text.replace( /
    (\s*<\/?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)/g, '$1' ); + text = text.replace( + /
    (\s*<\/?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)/g, + '$1' + ); text = text.replace( /\n<\/p>$/g, '

    ' ); // Replace placeholder
     tags with their original content.
    @@ -301,7 +333,8 @@ export function autop( text, br = true ) {
      * @return {string}      The content with stripped paragraph tags.
      */
     export function removep( html ) {
    -	const blocklist = 'blockquote|ul|ol|li|dl|dt|dd|table|thead|tbody|tfoot|tr|th|td|h[1-6]|fieldset|figure';
    +	const blocklist =
    +		'blockquote|ul|ol|li|dl|dt|dd|table|thead|tbody|tfoot|tr|th|td|h[1-6]|fieldset|figure';
     	const blocklist1 = blocklist + '|div|p';
     	const blocklist2 = blocklist + '|pre';
     	const preserve = [];
    @@ -314,7 +347,9 @@ export function removep( html ) {
     
     	// Protect script and style tags.
     	if ( html.indexOf( ']*>[\s\S]*?<\/\1>/g, function( match ) {
    +		html = html.replace( /<(script|style)[^>]*>[\s\S]*?<\/\1>/g, function(
    +			match
    +		) {
     			preserve.push( match );
     			return '';
     		} );
    @@ -334,13 +369,21 @@ export function removep( html ) {
     	if ( html.indexOf( '[caption' ) !== -1 ) {
     		preserveBr = true;
     		html = html.replace( /\[caption[\s\S]+?\[\/caption\]/g, function( a ) {
    -			return a.replace( /]*)>/g, '' ).replace( /[\r\n\t]+/, '' );
    +			return a
    +				.replace( /]*)>/g, '' )
    +				.replace( /[\r\n\t]+/, '' );
     		} );
     	}
     
     	// Normalize white space characters before and after block tags.
    -	html = html.replace( new RegExp( '\\s*\\s*', 'g' ), '\n' );
    -	html = html.replace( new RegExp( '\\s*<((?:' + blocklist1 + ')(?: [^>]*)?)>', 'g' ), '\n<$1>' );
    +	html = html.replace(
    +		new RegExp( '\\s*\\s*', 'g' ),
    +		'\n'
    +	);
    +	html = html.replace(
    +		new RegExp( '\\s*<((?:' + blocklist1 + ')(?: [^>]*)?)>', 'g' ),
    +		'\n<$1>'
    +	);
     
     	// Mark 

    if it has any attributes. html = html.replace( /(

    ]+>[\s\S]*?)<\/p>/g, '$1' ); @@ -369,12 +412,21 @@ export function removep( html ) { html = html.replace( /<\/div>\s*/g, '

  • \n' ); // Fix line breaks around caption shortcodes. - html = html.replace( /\s*\[caption([^\[]+)\[\/caption\]\s*/gi, '\n\n[caption$1[/caption]\n\n' ); + html = html.replace( + /\s*\[caption([^\[]+)\[\/caption\]\s*/gi, + '\n\n[caption$1[/caption]\n\n' + ); html = html.replace( /caption\]\n\n+\[caption/g, 'caption]\n\n[caption' ); // Pad block elements tags with a line break. - html = html.replace( new RegExp( '\\s*<((?:' + blocklist2 + ')(?: [^>]*)?)\\s*>', 'g' ), '\n<$1>' ); - html = html.replace( new RegExp( '\\s*\\s*', 'g' ), '\n' ); + html = html.replace( + new RegExp( '\\s*<((?:' + blocklist2 + ')(?: [^>]*)?)\\s*>', 'g' ), + '\n<$1>' + ); + html = html.replace( + new RegExp( '\\s*\\s*', 'g' ), + '\n' + ); // Indent
  • ,
    and
    tags. html = html.replace( /<((li|dt|dd)[^>]*)>/g, ' \t<$1>' ); diff --git a/packages/autop/src/test/index.test.js b/packages/autop/src/test/index.test.js index 8fc73f4e03965..0c5d86d6d0a2b 100644 --- a/packages/autop/src/test/index.test.js +++ b/packages/autop/src/test/index.test.js @@ -1,10 +1,7 @@ /** * Internal dependencies */ -import { - autop, - removep, -} from '../'; +import { autop, removep } from '../'; test( 'empty string', () => { expect( autop( '' ) ).toBe( '' ); @@ -81,13 +78,16 @@ done = 0; expect( autop( str ).trim() ).toBe( expected ); // Make sure HTML breaks are maintained if manually inserted - str = 'Look at this code\n\n
    Line1
    Line2
    Line3
    Line4\nActual Line 2\nActual Line 3
    \n\nCool, huh?'; - expected = '

    Look at this code

    \n
    Line1
    Line2
    Line3
    Line4\nActual Line 2\nActual Line 3
    \n

    Cool, huh?

    '; + str = + 'Look at this code\n\n
    Line1
    Line2
    Line3
    Line4\nActual Line 2\nActual Line 3
    \n\nCool, huh?'; + expected = + '

    Look at this code

    \n
    Line1
    Line2
    Line3
    Line4\nActual Line 2\nActual Line 3
    \n

    Cool, huh?

    '; expect( autop( str ).trim() ).toBe( expected ); } ); test( 'skip input elements', () => { - const str = 'Username:
    Password: '; + const str = + 'Username:
    Password: '; expect( autop( str ).trim() ).toBe( '

    ' + str + '

    ' ); } ); @@ -133,7 +133,8 @@ Paragraph two.`; Paragraph two.`; - const expected = '

    Paragraph one.

    \n' + // line breaks only after

    + const expected = + '

    Paragraph one.

    \n' + // line breaks only after

    '

    Paragraph one.

    \n' + // line breaks only after

    + const shortcodeExpected = + '

    Paragraph one.

    \n' + // line breaks only after

    '

    [video width="720" height="480" mp4="http://domain.tld/wp-content/uploads/2013/12/xyz.mp4"]' + '' + '' + @@ -193,7 +195,8 @@ test( 'param embed elements', () => { Paragraph two.`; - const expected1 = '

    Paragraph one.

    \n' + // line breaks only after

    + const expected1 = + '

    Paragraph one.

    \n' + // line breaks only after

    '

    ' + '' + '' + @@ -228,7 +231,8 @@ Paragraph two.`; Paragraph two.`; - const expected2 = '

    Paragraph one.

    \n' + // line breaks only after block tags + const expected2 = + '

    Paragraph one.

    \n' + // line breaks only after block tags '
    \n' + '' + '' + @@ -251,7 +255,8 @@ Paragraph two.`; } ); test( 'skip select option elements', () => { - const str = 'Country: '; + const str = + 'Country: '; expect( autop( str ).trim() ).toBe( '

    ' + str + '

    ' ); } ); @@ -399,10 +404,7 @@ test( 'that autop treats inline elements as inline', () => { test( 'element sanity', () => { [ - [ - 'Hello ', - '

    Hello

    \n', - ], + [ 'Hello ', '

    Hello

    \n' ], [ 'Hello ', '

    Hello

    \n', @@ -482,7 +484,8 @@ test( 'that text before blocks is peed', () => { } ); test( 'that autop doses not add extra closing p in figure', () => { - const content1 = '
    Caption
    '; + const content1 = + '
    Caption
    '; const expected1 = content1; const content2 = `
    @@ -498,8 +501,10 @@ test( 'that autop doses not add extra closing p in figure', () => { } ); test( 'that autop correctly adds a start and end tag when followed by a div', () => { - const content = 'Testing autop with a div\n
    content
    '; - const expected = '

    Testing autop with a div

    \n
    content
    '; + const content = + 'Testing autop with a div\n
    content
    '; + const expected = + '

    Testing autop with a div

    \n
    content
    '; expect( autop( content ).trim() ).toBe( expected ); } ); diff --git a/packages/babel-plugin-import-jsx-pragma/index.js b/packages/babel-plugin-import-jsx-pragma/index.js index 273df752611c1..a7dd3a2d38155 100644 --- a/packages/babel-plugin-import-jsx-pragma/index.js +++ b/packages/babel-plugin-import-jsx-pragma/index.js @@ -48,7 +48,9 @@ module.exports = function( babel ) { } const { scopeVariable } = getOptions( state ); - state.hasUndeclaredScopeVariable = ! path.scope.hasBinding( scopeVariable ); + state.hasUndeclaredScopeVariable = ! path.scope.hasBinding( + scopeVariable + ); }, JSXFragment( path, state ) { if ( state.hasUndeclaredScopeVariableFrag ) { @@ -60,18 +62,27 @@ module.exports = function( babel ) { return; } - state.hasUndeclaredScopeVariableFrag = ! path.scope.hasBinding( scopeVariableFrag ); + state.hasUndeclaredScopeVariableFrag = ! path.scope.hasBinding( + scopeVariableFrag + ); }, Program: { exit( path, state ) { - const { scopeVariable, scopeVariableFrag, source, isDefault } = getOptions( state ); + const { + scopeVariable, + scopeVariableFrag, + source, + isDefault, + } = getOptions( state ); let scopeVariableSpecifier; let scopeVariableFragSpecifier; if ( state.hasUndeclaredScopeVariable ) { if ( isDefault ) { - scopeVariableSpecifier = t.importDefaultSpecifier( t.identifier( scopeVariable ) ); + scopeVariableSpecifier = t.importDefaultSpecifier( + t.identifier( scopeVariable ) + ); } else { scopeVariableSpecifier = t.importSpecifier( t.identifier( scopeVariable ), diff --git a/packages/babel-plugin-import-jsx-pragma/test/index.js b/packages/babel-plugin-import-jsx-pragma/test/index.js index c3e098476db3d..bcd915f1b5dad 100644 --- a/packages/babel-plugin-import-jsx-pragma/test/index.js +++ b/packages/babel-plugin-import-jsx-pragma/test/index.js @@ -24,7 +24,8 @@ describe( 'babel-plugin-import-jsx-pragma', () => { } ); it( 'does nothing if the scope variable is already defined', () => { - const original = 'const React = require("react");\n\nlet foo = ;'; + const original = + 'const React = require("react");\n\nlet foo = ;'; const string = getTransformedCode( original ); expect( string ).toBe( original ); @@ -52,7 +53,9 @@ describe( 'babel-plugin-import-jsx-pragma', () => { isDefault: false, } ); - expect( string ).toBe( 'import { createElement } from "@wordpress/element";\n' + original ); + expect( string ).toBe( + 'import { createElement } from "@wordpress/element";\n' + original + ); } ); it( 'adds import for scope variable even when defined inside the local scope', () => { @@ -64,7 +67,9 @@ describe( 'babel-plugin-import-jsx-pragma', () => { isDefault: false, } ); - expect( string ).toBe( 'import { createElement } from "@wordpress/element";\n' + original ); + expect( string ).toBe( + 'import { createElement } from "@wordpress/element";\n' + original + ); } ); it( 'does nothing if the outer scope variable is already defined when using custom options', () => { @@ -81,7 +86,8 @@ describe( 'babel-plugin-import-jsx-pragma', () => { } ); it( 'adds only Fragment when required', () => { - const original = 'const {\n createElement\n} = wp.element;\nlet foo = <>;'; + const original = + 'const {\n createElement\n} = wp.element;\nlet foo = <>;'; const string = getTransformedCode( original, { scopeVariable: 'createElement', scopeVariableFrag: 'Fragment', @@ -95,7 +101,8 @@ describe( 'babel-plugin-import-jsx-pragma', () => { } ); it( 'adds only createElement when required', () => { - const original = 'const {\n Fragment\n} = wp.element;\nlet foo = <>;'; + const original = + 'const {\n Fragment\n} = wp.element;\nlet foo = <>;'; const string = getTransformedCode( original, { scopeVariable: 'createElement', scopeVariableFrag: 'Fragment', diff --git a/packages/babel-plugin-makepot/package.json b/packages/babel-plugin-makepot/package.json index bfda5535e5f34..1db4205d3b36f 100644 --- a/packages/babel-plugin-makepot/package.json +++ b/packages/babel-plugin-makepot/package.json @@ -29,7 +29,7 @@ "main": "build/index.js", "module": "build-module/index.js", "dependencies": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "gettext-parser": "^1.3.1", "lodash": "^4.17.15" }, diff --git a/packages/babel-plugin-makepot/src/index.js b/packages/babel-plugin-makepot/src/index.js index ad0cde941aecb..507c988be91bb 100644 --- a/packages/babel-plugin-makepot/src/index.js +++ b/packages/babel-plugin-makepot/src/index.js @@ -33,7 +33,16 @@ */ const { po } = require( 'gettext-parser' ); -const { pick, reduce, uniq, forEach, sortBy, isEqual, merge, isEmpty } = require( 'lodash' ); +const { + pick, + reduce, + uniq, + forEach, + sortBy, + isEqual, + merge, + isEmpty, +} = require( 'lodash' ); const { relative, sep } = require( 'path' ); const { writeFileSync } = require( 'fs' ); @@ -93,10 +102,7 @@ const REGEXP_TRANSLATOR_COMMENT = /^\s*translators:\s*([\s\S]+)/im; function getNodeAsString( node ) { switch ( node.type ) { case 'BinaryExpression': - return ( - getNodeAsString( node.left ) + - getNodeAsString( node.right ) - ); + return getNodeAsString( node.left ) + getNodeAsString( node.right ); case 'StringLiteral': return node.value; @@ -134,7 +140,10 @@ function getExtractedComment( path, _originalNodeLine ) { const match = commentNode.value.match( REGEXP_TRANSLATOR_COMMENT ); if ( match ) { // Extract text from matched translator prefix - comment = match[ 1 ].split( '\n' ).map( ( text ) => text.trim() ).join( ' ' ); + comment = match[ 1 ] + .split( '\n' ) + .map( ( text ) => text.trim() ) + .join( ' ' ); // False return indicates to Lodash to break iteration return false; @@ -203,20 +212,24 @@ module.exports = function() { } // Skip unhandled functions - const functionKeys = ( state.opts.functions || DEFAULT_FUNCTIONS )[ name ]; + const functionKeys = ( state.opts.functions || + DEFAULT_FUNCTIONS )[ name ]; if ( ! functionKeys ) { return; } // Assign translation keys by argument position - const translation = path.node.arguments.reduce( ( memo, arg, i ) => { - const key = functionKeys[ i ]; - if ( isValidTranslationKey( key ) ) { - memo[ key ] = getNodeAsString( arg ); - } + const translation = path.node.arguments.reduce( + ( memo, arg, i ) => { + const key = functionKeys[ i ]; + if ( isValidTranslationKey( key ) ) { + memo[ key ] = getNodeAsString( arg ); + } - return memo; - }, {} ); + return memo; + }, + {} + ); // Can only assign translation with usable msgid if ( ! translation.msgid ) { @@ -240,11 +253,15 @@ module.exports = function() { }; for ( const key in baseData.headers ) { - baseData.translations[ '' ][ '' ].msgstr.push( `${ key }: ${ baseData.headers[ key ] };\n` ); + baseData.translations[ '' ][ '' ].msgstr.push( + `${ key }: ${ baseData.headers[ key ] };\n` + ); } // Attempt to exract nplurals from header - const pluralsMatch = ( baseData.headers[ 'plural-forms' ] || '' ).match( /nplurals\s*=\s*(\d+);/ ); + const pluralsMatch = ( + baseData.headers[ 'plural-forms' ] || '' + ).match( /nplurals\s*=\s*(\d+);/ ); if ( pluralsMatch ) { nplurals = parseInt( pluralsMatch[ 1 ], 10 ); } @@ -252,7 +269,9 @@ module.exports = function() { // Create empty msgstr or array of empty msgstr by nplurals if ( translation.msgid_plural ) { - translation.msgstr = Array.from( Array( nplurals ) ).map( () => '' ); + translation.msgstr = Array.from( Array( nplurals ) ).map( + () => '' + ); } else { translation.msgstr = ''; } @@ -260,7 +279,9 @@ module.exports = function() { // Assign file reference comment, ensuring consistent pathname // reference between Win32 and POSIX const { filename } = this.file.opts; - const pathname = relative( '.', filename ).split( sep ).join( '/' ); + const pathname = relative( '.', filename ) + .split( sep ) + .join( '/' ); translation.comments = { reference: pathname + ':' + path.node.loc.start.line, }; @@ -294,34 +315,57 @@ module.exports = function() { const files = Object.keys( strings ).sort(); // Combine translations from each file grouped by context - const translations = reduce( files, ( memo, file ) => { - for ( const context in strings[ file ] ) { - // Within the same file, sort translations by line - const sortedTranslations = sortBy( - strings[ file ][ context ], - 'comments.reference' - ); - - forEach( sortedTranslations, ( translation ) => { - const { msgctxt = '', msgid } = translation; - if ( ! memo.hasOwnProperty( msgctxt ) ) { - memo[ msgctxt ] = {}; - } - - // Merge references if translation already exists - if ( isSameTranslation( translation, memo[ msgctxt ][ msgid ] ) ) { - translation.comments.reference = uniq( [ - memo[ msgctxt ][ msgid ].comments.reference, - translation.comments.reference, - ].join( '\n' ).split( '\n' ) ).join( '\n' ); - } - - memo[ msgctxt ][ msgid ] = translation; - } ); - } - - return memo; - }, {} ); + const translations = reduce( + files, + ( memo, file ) => { + for ( const context in strings[ file ] ) { + // Within the same file, sort translations by line + const sortedTranslations = sortBy( + strings[ file ][ context ], + 'comments.reference' + ); + + forEach( + sortedTranslations, + ( translation ) => { + const { + msgctxt = '', + msgid, + } = translation; + if ( + ! memo.hasOwnProperty( msgctxt ) + ) { + memo[ msgctxt ] = {}; + } + + // Merge references if translation already exists + if ( + isSameTranslation( + translation, + memo[ msgctxt ][ msgid ] + ) + ) { + translation.comments.reference = uniq( + [ + memo[ msgctxt ][ msgid ] + .comments.reference, + translation.comments + .reference, + ] + .join( '\n' ) + .split( '\n' ) + ).join( '\n' ); + } + + memo[ msgctxt ][ msgid ] = translation; + } + ); + } + + return memo; + }, + {} + ); // Merge translations from individual files into headers const data = merge( {}, baseData, { translations } ); @@ -331,7 +375,10 @@ module.exports = function() { // Babel loader doesn't expose these entry points and async // write may hit file lock (need queue). const compiled = po.compile( data ); - writeFileSync( state.opts.output || DEFAULT_OUTPUT, compiled ); + writeFileSync( + state.opts.output || DEFAULT_OUTPUT, + compiled + ); this.hasPendingWrite = false; }, }, diff --git a/packages/babel-plugin-makepot/test/index.js b/packages/babel-plugin-makepot/test/index.js index 52ae1dcc5b913..7a5e46d3a2212 100644 --- a/packages/babel-plugin-makepot/test/index.js +++ b/packages/babel-plugin-makepot/test/index.js @@ -56,37 +56,49 @@ describe( 'babel-plugin', () => { } it( 'should not return translator comment on same line but after call expression', () => { - const comment = getCommentFromString( "__( 'Hello world' ); // translators: Greeting" ); + const comment = getCommentFromString( + "__( 'Hello world' ); // translators: Greeting" + ); expect( comment ).toBeUndefined(); } ); it( 'should return translator comment on leading comments', () => { - const comment = getCommentFromString( "// translators: Greeting\n__( 'Hello world' );" ); + const comment = getCommentFromString( + "// translators: Greeting\n__( 'Hello world' );" + ); expect( comment ).toBe( 'Greeting' ); } ); it( 'should be case insensitive to translator prefix', () => { - const comment = getCommentFromString( "// TrANslAtORs: Greeting\n__( 'Hello world' );" ); + const comment = getCommentFromString( + "// TrANslAtORs: Greeting\n__( 'Hello world' );" + ); expect( comment ).toBe( 'Greeting' ); } ); it( 'should traverse up parents until it encounters comment', () => { - const comment = getCommentFromString( "// translators: Greeting\nconst string = __( 'Hello world' );" ); + const comment = getCommentFromString( + "// translators: Greeting\nconst string = __( 'Hello world' );" + ); expect( comment ).toBe( 'Greeting' ); } ); it( 'should not consider comment if it does not end on same or previous line', () => { - const comment = getCommentFromString( "// translators: Greeting\n\n__( 'Hello world' );" ); + const comment = getCommentFromString( + "// translators: Greeting\n\n__( 'Hello world' );" + ); expect( comment ).toBeUndefined(); } ); it( 'should use multi-line comment starting many lines previous', () => { - const comment = getCommentFromString( "/* translators: Long comment\nspanning multiple \nlines */\nconst string = __( 'Hello world' );" ); + const comment = getCommentFromString( + "/* translators: Long comment\nspanning multiple \nlines */\nconst string = __( 'Hello world' );" + ); expect( comment ).toBe( 'Long comment spanning multiple lines' ); } ); @@ -117,7 +129,9 @@ describe( 'babel-plugin', () => { } ); it( 'should be a concatenated binary expression string value', () => { - const string = getNodeAsStringFromArgument( '__( "hello" + " world" );' ); + const string = getNodeAsStringFromArgument( + '__( "hello" + " world" );' + ); expect( string ).toBe( 'hello world' ); } ); diff --git a/packages/babel-preset-default/CHANGELOG.md b/packages/babel-preset-default/CHANGELOG.md index c979ee44f9b69..03a4a6fe228cc 100644 --- a/packages/babel-preset-default/CHANGELOG.md +++ b/packages/babel-preset-default/CHANGELOG.md @@ -1,3 +1,9 @@ +## Master + +### New Feature + +- The bundled `@babel/core` dependency has been updated from requiring `^7.4.4` to requiring `^7.8.3`. All other Babel plugins were updated to the latest version. `@babel/preset-env` has now ESMAScript 2020 support enabled by default (see [Highlights](https://babeljs.io/blog/2020/01/11/7.8.0#highlights)). + ## 4.5.0 (2019-08-29) ### Bug Fixes diff --git a/packages/babel-preset-default/index.js b/packages/babel-preset-default/index.js index 6d368c70f0d00..15454ecb36fd6 100644 --- a/packages/babel-preset-default/index.js +++ b/packages/babel-preset-default/index.js @@ -1,8 +1,9 @@ module.exports = function( api ) { let wpBuildOpts = {}; - const isWPBuild = ( name ) => [ 'WP_BUILD_MAIN', 'WP_BUILD_MODULE' ].some( - ( buildName ) => name === buildName - ); + const isWPBuild = ( name ) => + [ 'WP_BUILD_MAIN', 'WP_BUILD_MODULE' ].some( + ( buildName ) => name === buildName + ); const isTestEnv = api.env() === 'test'; @@ -15,7 +16,9 @@ module.exports = function( api ) { } ); const getPresetEnv = () => { - const opts = {}; + const opts = { + shippedProposals: true, + }; if ( isTestEnv ) { opts.targets = { @@ -66,11 +69,16 @@ module.exports = function( api ) { isDefault: false, }, ], - [ require.resolve( '@babel/plugin-transform-react-jsx' ), { - pragma: 'createElement', - pragmaFrag: 'Fragment', - } ], - require.resolve( '@babel/plugin-proposal-async-generator-functions' ), + [ + require.resolve( '@babel/plugin-transform-react-jsx' ), + { + pragma: 'createElement', + pragmaFrag: 'Fragment', + }, + ], + require.resolve( + '@babel/plugin-proposal-async-generator-functions' + ), maybeGetPluginTransformRuntime(), ].filter( Boolean ), }; diff --git a/packages/babel-preset-default/package.json b/packages/babel-preset-default/package.json index 061e4528eba75..b27ce490af91b 100644 --- a/packages/babel-preset-default/package.json +++ b/packages/babel-preset-default/package.json @@ -27,13 +27,13 @@ ], "main": "index.js", "dependencies": { - "@babel/core": "^7.4.5", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.4.4", - "@babel/plugin-transform-react-jsx": "^7.3.0", - "@babel/plugin-transform-runtime": "^7.4.4", - "@babel/preset-env": "^7.4.5", - "@babel/runtime": "^7.4.5", + "@babel/core": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-react-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.8.3", + "@babel/preset-env": "^7.8.3", + "@babel/runtime": "^7.8.3", "@wordpress/babel-plugin-import-jsx-pragma": "file:../babel-plugin-import-jsx-pragma", "@wordpress/browserslist-config": "file:../browserslist-config", "@wordpress/element": "file:../element", diff --git a/packages/babel-preset-default/test/__snapshots__/index.js.snap b/packages/babel-preset-default/test/__snapshots__/index.js.snap index 605c23a784b40..58bfb14629a28 100644 --- a/packages/babel-preset-default/test/__snapshots__/index.js.snap +++ b/packages/babel-preset-default/test/__snapshots__/index.js.snap @@ -65,5 +65,16 @@ describe('Babel preset default', function () { } }, _callee2); }))); + test('support for optional chaining', function () { + var _obj$foo, _obj$foo2; + + var obj = { + foo: { + bar: 42 + } + }; + expect(obj === null || obj === void 0 ? void 0 : (_obj$foo = obj.foo) === null || _obj$foo === void 0 ? void 0 : _obj$foo.bar).toEqual(42); + expect(obj === null || obj === void 0 ? void 0 : (_obj$foo2 = obj.foo) === null || _obj$foo2 === void 0 ? void 0 : _obj$foo2.baz).toEqual(undefined); + }); });" `; diff --git a/packages/babel-preset-default/test/fixtures/input.js b/packages/babel-preset-default/test/fixtures/input.js index b7cec35c7f465..caac580faa2d8 100644 --- a/packages/babel-preset-default/test/fixtures/input.js +++ b/packages/babel-preset-default/test/fixtures/input.js @@ -12,4 +12,15 @@ describe( 'Babel preset default', () => { value: 2, } ); } ); + + test( 'support for optional chaining', () => { + const obj = { + foo: { + bar: 42, + }, + }; + + expect( obj?.foo?.bar ).toEqual( 42 ); + expect( obj?.foo?.baz ).toEqual( undefined ); + } ); } ); diff --git a/packages/babel-preset-default/test/index.js b/packages/babel-preset-default/test/index.js index 0be3197b9541c..2e37f8d0f5ea2 100644 --- a/packages/babel-preset-default/test/index.js +++ b/packages/babel-preset-default/test/index.js @@ -12,7 +12,9 @@ import babelPresetDefault from '../'; describe( 'Babel preset default', () => { test( 'transpilation works properly', () => { - const input = readFileSync( path.join( __dirname, '/fixtures/input.js' ) ); + const input = readFileSync( + path.join( __dirname, '/fixtures/input.js' ) + ); const output = transform( input, { configFile: false, diff --git a/packages/base-styles/_mixins.scss b/packages/base-styles/_mixins.scss index 29639668163b3..427b36201aef5 100644 --- a/packages/base-styles/_mixins.scss +++ b/packages/base-styles/_mixins.scss @@ -279,7 +279,7 @@ left: $admin-sidebar-width-collapsed; } - @include break-large() { + @media (min-width: #{ ($break-large + 1) }) { left: $admin-sidebar-width; } } diff --git a/packages/base-styles/_z-index.scss b/packages/base-styles/_z-index.scss index f9c23e29b6062..f28bf9c498bbe 100644 --- a/packages/base-styles/_z-index.scss +++ b/packages/base-styles/_z-index.scss @@ -85,6 +85,9 @@ $z-layers: ( // Above the block list, under the header. ".block-editor-block-list__block-popover": 29, + // Under the block popover (block toolbar). + ".block-editor-block-list__insertion-point-popover": 28, + // Show snackbars above everything (similar to popovers) ".components-snackbar-list": 100000, @@ -125,7 +128,7 @@ $z-layers: ( ".components-circular-option-picker__option.is-pressed": 1, // Needs to be higher than .components-circular-option-picker__option.is-pressed. - ".components-circular-option-picker__option.is-pressed + .dashicons-saved": 2 + ".components-circular-option-picker__option.is-pressed + svg": 2 ); @function z-index( $key ) { diff --git a/packages/blob/package.json b/packages/blob/package.json index 28d7326414be8..a64f8bf3f7fd7 100644 --- a/packages/blob/package.json +++ b/packages/blob/package.json @@ -22,7 +22,7 @@ "react-native": "src/index", "sideEffects": false, "dependencies": { - "@babel/runtime": "^7.4.4" + "@babel/runtime": "^7.8.3" }, "publishConfig": { "access": "public" diff --git a/packages/blob/src/test/index.js b/packages/blob/src/test/index.js index 7604e3956b6d2..110340e13639e 100644 --- a/packages/blob/src/test/index.js +++ b/packages/blob/src/test/index.js @@ -1,9 +1,7 @@ /** * Internal dependencies */ -import { - isBlobURL, -} from '../'; +import { isBlobURL } from '../'; describe( 'isBlobURL', () => { it( 'returns true if the url starts with "blob:"', () => { diff --git a/packages/block-directory/src/components/block-ratings/index.js b/packages/block-directory/src/components/block-ratings/index.js index ff4b8111fc7d8..c55cace300028 100644 --- a/packages/block-directory/src/components/block-ratings/index.js +++ b/packages/block-directory/src/components/block-ratings/index.js @@ -15,7 +15,10 @@ export const BlockRatings = ( { rating, ratingCount } ) => ( className="block-directory-block-ratings__rating-count" aria-label={ // translators: %d: number of ratings (number). - sprintf( _n( '%d total rating', '%d total ratings', ratingCount ), ratingCount ) + sprintf( + _n( '%d total rating', '%d total ratings', ratingCount ), + ratingCount + ) } > ({ ratingCount }) diff --git a/packages/block-directory/src/components/block-ratings/stars.js b/packages/block-directory/src/components/block-ratings/stars.js index 577c3cb15e0dc..63ec7126fea00 100644 --- a/packages/block-directory/src/components/block-ratings/stars.js +++ b/packages/block-directory/src/components/block-ratings/stars.js @@ -9,9 +9,7 @@ import { times } from 'lodash'; import { __, sprintf } from '@wordpress/i18n'; import { Icon } from '@wordpress/components'; -function Stars( { - rating, -} ) { +function Stars( { rating } ) { const stars = Math.round( rating / 0.5 ) * 0.5; const fullStarCount = Math.floor( rating ); @@ -20,9 +18,27 @@ function Stars( { return (
    - { times( fullStarCount, ( i ) => ) } - { times( halfStarCount, ( i ) => ) } - { times( emptyStarCount, ( i ) => ) } + { times( fullStarCount, ( i ) => ( + + ) ) } + { times( halfStarCount, ( i ) => ( + + ) ) } + { times( emptyStarCount, ( i ) => ( + + ) ) }
    ); } diff --git a/packages/block-directory/src/components/downloadable-block-author-info/index.js b/packages/block-directory/src/components/downloadable-block-author-info/index.js index b422f1360416c..5c27144430e10 100644 --- a/packages/block-directory/src/components/downloadable-block-author-info/index.js +++ b/packages/block-directory/src/components/downloadable-block-author-info/index.js @@ -4,7 +4,11 @@ import { Fragment } from '@wordpress/element'; import { __, _n, sprintf } from '@wordpress/i18n'; -function DownloadableBlockAuthorInfo( { author, authorBlockCount, authorBlockRating } ) { +function DownloadableBlockAuthorInfo( { + author, + authorBlockCount, + authorBlockRating, +} ) { return ( diff --git a/packages/block-directory/src/components/downloadable-block-header/index.js b/packages/block-directory/src/components/downloadable-block-header/index.js index 942c4fda0c7c7..78ab2962e60ce 100644 --- a/packages/block-directory/src/components/downloadable-block-header/index.js +++ b/packages/block-directory/src/components/downloadable-block-header/index.js @@ -10,20 +10,32 @@ import { __, sprintf } from '@wordpress/i18n'; import { BlockIcon } from '@wordpress/block-editor'; import BlockRatings from '../block-ratings'; -function DownloadableBlockHeader( { icon, title, rating, ratingCount, onClick } ) { +function DownloadableBlockHeader( { + icon, + title, + rating, + ratingCount, + onClick, +} ) { return (
    - { - icon.match( /\.(jpeg|jpg|gif|png)(?:\?.*)?$/ ) !== null ? - // translators: %s: Name of the plugin e.g: "Akismet". - { : - - - - } + { icon.match( /\.(jpeg|jpg|gif|png)(?:\?.*)?$/ ) !== null ? ( + // translators: %s: Name of the plugin e.g: "Akismet". + { + ) : ( + + + + ) }
    - + { title } diff --git a/packages/block-directory/src/components/downloadable-block-header/test/fixtures/index.js b/packages/block-directory/src/components/downloadable-block-header/test/fixtures/index.js index 469105aea680f..db09e7df68d30 100644 --- a/packages/block-directory/src/components/downloadable-block-header/test/fixtures/index.js +++ b/packages/block-directory/src/components/downloadable-block-header/test/fixtures/index.js @@ -1,7 +1,8 @@ const pluginBase = { name: 'boxer/boxer', title: 'Boxer', - description: 'Boxer is a Block that puts your WordPress posts into boxes on a page.', + description: + 'Boxer is a Block that puts your WordPress posts into boxes on a page.', id: 'boxer-block', rating: 5, rating_count: 1, @@ -17,4 +18,7 @@ const pluginBase = { }; export const pluginWithIcon = { ...pluginBase, icon: 'block-default' }; -export const pluginWithImg = { ...pluginBase, icon: 'https://ps.w.org/listicles/assets/icon-128x128.png' }; +export const pluginWithImg = { + ...pluginBase, + icon: 'https://ps.w.org/listicles/assets/icon-128x128.png', +}; diff --git a/packages/block-directory/src/components/downloadable-block-header/test/index.js b/packages/block-directory/src/components/downloadable-block-header/test/index.js index 6c8d044cd8f87..96ba6247170cb 100644 --- a/packages/block-directory/src/components/downloadable-block-header/test/index.js +++ b/packages/block-directory/src/components/downloadable-block-header/test/index.js @@ -30,14 +30,19 @@ describe( 'DownloadableBlockHeader', () => { describe( 'icon rendering', () => { test( 'should render an tag', () => { const wrapper = getContainer( pluginWithImg ); - expect( wrapper.find( 'img' ).prop( 'src' ) ).toEqual( pluginWithImg.icon ); + expect( wrapper.find( 'img' ).prop( 'src' ) ).toEqual( + pluginWithImg.icon + ); } ); test( 'should render an tag if icon URL has query string', () => { - const iconURLwithQueryString = pluginWithImg.icon + '?rev=2011672&test=234234'; + const iconURLwithQueryString = + pluginWithImg.icon + '?rev=2011672&test=234234'; const plugin = { ...pluginWithImg, icon: iconURLwithQueryString }; const wrapper = getContainer( plugin ); - expect( wrapper.find( 'img' ).prop( 'src' ) ).toEqual( plugin.icon ); + expect( wrapper.find( 'img' ).prop( 'src' ) ).toEqual( + plugin.icon + ); } ); test( 'should render a component', () => { diff --git a/packages/block-directory/src/components/downloadable-block-info/index.js b/packages/block-directory/src/components/downloadable-block-info/index.js index 5119d1316267a..8d647313db6a1 100644 --- a/packages/block-directory/src/components/downloadable-block-info/index.js +++ b/packages/block-directory/src/components/downloadable-block-info/index.js @@ -5,7 +5,11 @@ import { Fragment } from '@wordpress/element'; import { Icon } from '@wordpress/components'; import { __, _n, sprintf } from '@wordpress/i18n'; -function DownloadableBlockInfo( { description, activeInstalls, humanizedUpdated } ) { +function DownloadableBlockInfo( { + description, + activeInstalls, + humanizedUpdated, +} ) { return (

    @@ -13,14 +17,20 @@ function DownloadableBlockInfo( { description, activeInstalls, humanizedUpdated

    - { sprintf( _n( '%d active installation', '%d active installations', activeInstalls ), activeInstalls ) } + + { sprintf( + _n( + '%d active installation', + '%d active installations', + activeInstalls + ), + activeInstalls + ) }
    - { - // translators: %s: Humanized date of last update e.g: "2 months ago". - sprintf( __( 'Updated %s' ), humanizedUpdated ) - } + { // translators: %s: Humanized date of last update e.g: "2 months ago". + sprintf( __( 'Updated %s' ), humanizedUpdated ) }
    diff --git a/packages/block-directory/src/components/downloadable-block-list-item/index.js b/packages/block-directory/src/components/downloadable-block-list-item/index.js index c5bd8b8f0244e..3eb69eba7d2d7 100644 --- a/packages/block-directory/src/components/downloadable-block-list-item/index.js +++ b/packages/block-directory/src/components/downloadable-block-list-item/index.js @@ -5,10 +5,7 @@ import DownloadableBlockHeader from '../downloadable-block-header'; import DownloadableBlockAuthorInfo from '../downloadable-block-author-info'; import DownloadableBlockInfo from '../downloadable-block-info'; -function DownloadableBlockListItem( { - item, - onClick, -} ) { +function DownloadableBlockListItem( { item, onClick } ) { const { icon, title, diff --git a/packages/block-directory/src/components/downloadable-blocks-list/index.js b/packages/block-directory/src/components/downloadable-blocks-list/index.js index 315403267a56c..b63c40d34871f 100644 --- a/packages/block-directory/src/components/downloadable-blocks-list/index.js +++ b/packages/block-directory/src/components/downloadable-blocks-list/index.js @@ -6,7 +6,10 @@ import { noop } from 'lodash'; /** * WordPress dependencies */ -import { getBlockMenuDefaultClassName, unregisterBlockType } from '@wordpress/blocks'; +import { + getBlockMenuDefaultClassName, + unregisterBlockType, +} from '@wordpress/blocks'; import { withDispatch } from '@wordpress/data'; import { compose } from '@wordpress/compose'; import { __ } from '@wordpress/i18n'; @@ -19,7 +22,12 @@ import DownloadableBlockListItem from '../downloadable-block-list-item'; const DOWNLOAD_ERROR_NOTICE_ID = 'block-download-error'; const INSTALL_ERROR_NOTICE_ID = 'block-install-error'; -function DownloadableBlocksList( { items, onHover = noop, children, downloadAndInstallBlock } ) { +function DownloadableBlocksList( { + items, + onHover = noop, + children, + downloadAndInstallBlock, +} ) { return ( /* * Disable reason: The `list` ARIA role is redundant but @@ -27,22 +35,23 @@ function DownloadableBlocksList( { items, onHover = noop, children, downloadAndI */ /* eslint-disable jsx-a11y/no-redundant-roles */
      - { items && items.map( ( item ) => - { - downloadAndInstallBlock( item ); - onHover( null ); - } } - onFocus={ () => onHover( item ) } - onMouseEnter={ () => onHover( item ) } - onMouseLeave={ () => onHover( null ) } - onBlur={ () => onHover( null ) } - item={ item } - /> - ) } + { items && + items.map( ( item ) => ( + { + downloadAndInstallBlock( item ); + onHover( null ); + } } + onFocus={ () => onHover( item ) } + onMouseEnter={ () => onHover( item ) } + onMouseLeave={ () => onHover( null ) } + onBlur={ () => onHover( null ) } + item={ item } + /> + ) ) } { children }
    /* eslint-enable jsx-a11y/no-redundant-roles */ @@ -51,7 +60,9 @@ function DownloadableBlocksList( { items, onHover = noop, children, downloadAndI export default compose( withDispatch( ( dispatch, props ) => { - const { installBlock, downloadBlock } = dispatch( 'core/block-directory' ); + const { installBlock, downloadBlock } = dispatch( + 'core/block-directory' + ); const { createErrorNotice, removeNotice } = dispatch( 'core/notices' ); const { removeBlocks } = dispatch( 'core/block-editor' ); const { onSelect } = props; @@ -59,20 +70,22 @@ export default compose( return { downloadAndInstallBlock: ( item ) => { const onDownloadError = () => { - createErrorNotice( - __( 'Block previews can’t load.' ), - { - id: DOWNLOAD_ERROR_NOTICE_ID, - actions: [ - { - label: __( 'Retry' ), - onClick: () => { - removeNotice( DOWNLOAD_ERROR_NOTICE_ID ); - downloadBlock( item, onSuccess, onDownloadError ); - }, + createErrorNotice( __( 'Block previews can’t load.' ), { + id: DOWNLOAD_ERROR_NOTICE_ID, + actions: [ + { + label: __( 'Retry' ), + onClick: () => { + removeNotice( DOWNLOAD_ERROR_NOTICE_ID ); + downloadBlock( + item, + onSuccess, + onDownloadError + ); }, - ], - } ); + }, + ], + } ); }; const onSuccess = () => { @@ -80,22 +93,32 @@ export default compose( const onInstallBlockError = () => { createErrorNotice( - __( 'Block previews can\'t install.' ), + __( "Block previews can't install." ), { id: INSTALL_ERROR_NOTICE_ID, actions: [ { label: __( 'Retry' ), onClick: () => { - removeNotice( INSTALL_ERROR_NOTICE_ID ); - installBlock( item, noop, onInstallBlockError ); + removeNotice( + INSTALL_ERROR_NOTICE_ID + ); + installBlock( + item, + noop, + onInstallBlockError + ); }, }, { label: __( 'Remove' ), onClick: () => { - removeNotice( INSTALL_ERROR_NOTICE_ID ); - removeBlocks( createdBlock.clientId ); + removeNotice( + INSTALL_ERROR_NOTICE_ID + ); + removeBlocks( + createdBlock.clientId + ); unregisterBlockType( item.name ); }, }, @@ -110,5 +133,5 @@ export default compose( downloadBlock( item, onSuccess, onDownloadError ); }, }; - } ), + } ) )( DownloadableBlocksList ); diff --git a/packages/block-directory/src/components/downloadable-blocks-panel/index.js b/packages/block-directory/src/components/downloadable-blocks-panel/index.js index 0936ee3eea6f2..29d7cbb29ecac 100644 --- a/packages/block-directory/src/components/downloadable-blocks-panel/index.js +++ b/packages/block-directory/src/components/downloadable-blocks-panel/index.js @@ -12,14 +12,28 @@ import { Spinner, withSpokenMessages } from '@wordpress/components'; */ import DownloadableBlocksList from '../downloadable-blocks-list'; -function DownloadableBlocksPanel( { downloadableItems, onSelect, onHover, hasPermission, isLoading, isWaiting, debouncedSpeak } ) { +function DownloadableBlocksPanel( { + downloadableItems, + onSelect, + onHover, + hasPermission, + isLoading, + isWaiting, + debouncedSpeak, +} ) { if ( ! hasPermission ) { - debouncedSpeak( __( 'No blocks found in your library. Please contact your site administrator to install new blocks.' ) ); + debouncedSpeak( + __( + 'No blocks found in your library. Please contact your site administrator to install new blocks.' + ) + ); return (

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

    ); } @@ -41,7 +55,11 @@ function DownloadableBlocksPanel( { downloadableItems, onSelect, onHover, hasPer } const resultsFoundMessage = sprintf( - _n( 'No blocks found in your library. We did find %d block available for download.', 'No blocks found in your library. We did find %d blocks available for download.', downloadableItems.length ), + _n( + 'No blocks found in your library. We did find %d block available for download.', + 'No blocks found in your library. We did find %d blocks available for download.', + downloadableItems.length + ), downloadableItems.length ); @@ -49,9 +67,15 @@ function DownloadableBlocksPanel( { downloadableItems, onSelect, onHover, hasPer return (

    - { __( 'No blocks found in your library. These blocks can be downloaded and installed:' ) } + { __( + 'No blocks found in your library. These blocks can be downloaded and installed:' + ) }

    - +
    ); } @@ -66,7 +90,9 @@ export default compose( [ } = select( 'core/block-directory' ); const hasPermission = hasInstallBlocksPermission(); - const downloadableItems = hasPermission ? getDownloadableBlocks( filterValue ) : []; + const downloadableItems = hasPermission + ? getDownloadableBlocks( filterValue ) + : []; const isLoading = isRequestingDownloadableBlocks(); return { diff --git a/packages/block-directory/src/plugins/inserter-menu-downloadable-blocks-panel/index.js b/packages/block-directory/src/plugins/inserter-menu-downloadable-blocks-panel/index.js index 9fb2cc8105dc0..b91a3692b6d29 100644 --- a/packages/block-directory/src/plugins/inserter-menu-downloadable-blocks-panel/index.js +++ b/packages/block-directory/src/plugins/inserter-menu-downloadable-blocks-panel/index.js @@ -21,26 +21,24 @@ function InserterMenuDownloadableBlocksPanel() { return ( <__experimentalInserterMenuExtension> - { - ( { onSelect, onHover, filterValue, hasItems } ) => { - if ( hasItems || ! filterValue ) { - return null; - } - - if ( debouncedFilterValue !== filterValue ) { - debouncedSetFilterValue( filterValue ); - } - - return ( - - ); + { ( { onSelect, onHover, filterValue, hasItems } ) => { + if ( hasItems || ! filterValue ) { + return null; } - } + + if ( debouncedFilterValue !== filterValue ) { + debouncedSetFilterValue( filterValue ); + } + + return ( + + ); + } } ); } diff --git a/packages/block-directory/src/store/actions.js b/packages/block-directory/src/store/actions.js index 46bce90d2f7cb..09ba6381b59ae 100644 --- a/packages/block-directory/src/store/actions.js +++ b/packages/block-directory/src/store/actions.js @@ -26,7 +26,11 @@ export function fetchDownloadableBlocks() { * @return {Object} Action object. */ export function receiveDownloadableBlocks( downloadableBlocks, filterValue ) { - return { type: 'RECEIVE_DOWNLOADABLE_BLOCKS', downloadableBlocks, filterValue }; + return { + type: 'RECEIVE_DOWNLOADABLE_BLOCKS', + downloadableBlocks, + filterValue, + }; } /** diff --git a/packages/block-directory/src/store/controls.js b/packages/block-directory/src/store/controls.js index fbd187b7bbf41..6696a7071b08f 100644 --- a/packages/block-directory/src/store/controls.js +++ b/packages/block-directory/src/store/controls.js @@ -111,14 +111,18 @@ export function* loadAssets( assets ) { } const controls = { - SELECT: createRegistryControl( ( registry ) => ( { storeName, selectorName, args } ) => { - return registry.select( storeName )[ selectorName ]( ...args ); - } ), - DISPATCH: createRegistryControl( ( registry ) => ( { storeName, dispatcherName, args } ) => { - return registry.dispatch( storeName )[ dispatcherName ]( ...args ); - } ), + SELECT: createRegistryControl( + ( registry ) => ( { storeName, selectorName, args } ) => { + return registry.select( storeName )[ selectorName ]( ...args ); + } + ), + DISPATCH: createRegistryControl( + ( registry ) => ( { storeName, dispatcherName, args } ) => { + return registry.dispatch( storeName )[ dispatcherName ]( ...args ); + } + ), API_FETCH( { request } ) { - return wpApiFetch( { ... request } ); + return wpApiFetch( { ...request } ); }, LOAD_ASSETS( { assets } ) { return new Promise( ( resolve, reject ) => { @@ -128,20 +132,28 @@ const controls = { forEach( assets, ( asset ) => { if ( asset.match( /\.js$/ ) !== null ) { scriptsCount++; - loadScript( asset, () => { - scriptsCount--; - if ( scriptsCount === 0 ) { - return resolve( scriptsCount ); - } - }, reject ); + loadScript( + asset, + () => { + scriptsCount--; + if ( scriptsCount === 0 ) { + return resolve( scriptsCount ); + } + }, + reject + ); } else { loadStyle( asset ); } } ); } else { - loadScript( assets.editor_script, () => { - return resolve( 0 ); - }, reject ); + loadScript( + assets.editor_script, + () => { + return resolve( 0 ); + }, + reject + ); loadStyle( assets.style ); } } ); diff --git a/packages/block-directory/src/store/reducer.js b/packages/block-directory/src/store/reducer.js index 8dc4f3438c318..c0993c56dfaf6 100644 --- a/packages/block-directory/src/store/reducer.js +++ b/packages/block-directory/src/store/reducer.js @@ -11,49 +11,84 @@ import { combineReducers } from '@wordpress/data'; * * @return {Object} Updated state. */ -export const downloadableBlocks = ( state = { - results: {}, - hasPermission: true, - filterValue: undefined, - isRequestingDownloadableBlocks: true, - installedBlockTypes: [], -}, action ) => { +export const downloadableBlocks = ( + state = { + results: {}, + filterValue: undefined, + isRequestingDownloadableBlocks: true, + }, + action +) => { switch ( action.type ) { - case 'FETCH_DOWNLOADABLE_BLOCKS' : + case 'FETCH_DOWNLOADABLE_BLOCKS': return { ...state, isRequestingDownloadableBlocks: true, }; - case 'RECEIVE_DOWNLOADABLE_BLOCKS' : + case 'RECEIVE_DOWNLOADABLE_BLOCKS': return { ...state, results: Object.assign( {}, state.results, { [ action.filterValue ]: action.downloadableBlocks, } ), - hasPermission: true, isRequestingDownloadableBlocks: false, }; - case 'SET_INSTALL_BLOCKS_PERMISSION' : - return { - ...state, - items: action.hasPermission ? state.items : [], - hasPermission: action.hasPermission, - }; - case 'ADD_INSTALLED_BLOCK_TYPE' : + } + return state; +}; + +/** + * Reducer managing the installation and deletion of blocks. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Updated state. + */ +export const blockManagement = ( + state = { + installedBlockTypes: [], + }, + action +) => { + switch ( action.type ) { + case 'ADD_INSTALLED_BLOCK_TYPE': return { ...state, - installedBlockTypes: [ ...state.installedBlockTypes, action.item ], + installedBlockTypes: [ + ...state.installedBlockTypes, + action.item, + ], }; - - case 'REMOVE_INSTALLED_BLOCK_TYPE' : + case 'REMOVE_INSTALLED_BLOCK_TYPE': return { ...state, - installedBlockTypes: state.installedBlockTypes.filter( ( blockType ) => blockType.name !== action.item.name ), + installedBlockTypes: state.installedBlockTypes.filter( + ( blockType ) => blockType.name !== action.item.name + ), }; } return state; }; +/** + * Reducer returns whether the user can install blocks. + * + * @param {Object} state Current state. + * @param {Object} action Dispatched action. + * + * @return {Object} Updated state. + */ +export function hasPermission( state = true, action ) { + if ( action.type === 'SET_INSTALL_BLOCKS_PERMISSION' ) { + return action.hasPermission; + } + + return state; +} + export default combineReducers( { downloadableBlocks, + blockManagement, + hasPermission, } ); diff --git a/packages/block-directory/src/store/resolvers.js b/packages/block-directory/src/store/resolvers.js index 885257ea72ee8..a1b0d7dfd05be 100644 --- a/packages/block-directory/src/store/resolvers.js +++ b/packages/block-directory/src/store/resolvers.js @@ -7,10 +7,14 @@ import { camelCase, mapKeys } from 'lodash'; * Internal dependencies */ import { apiFetch } from './controls'; -import { fetchDownloadableBlocks, receiveDownloadableBlocks, setInstallBlocksPermission } from './actions'; +import { + fetchDownloadableBlocks, + receiveDownloadableBlocks, + setInstallBlocksPermission, +} from './actions'; export default { - * getDownloadableBlocks( filterValue ) { + *getDownloadableBlocks( filterValue ) { if ( ! filterValue ) { return; } @@ -20,9 +24,11 @@ export default { const results = yield apiFetch( { path: `__experimental/block-directory/search?term=${ filterValue }`, } ); - const blocks = results.map( ( result ) => mapKeys( result, ( value, key ) => { - return camelCase( key ); - } ) ); + const blocks = results.map( ( result ) => + mapKeys( result, ( value, key ) => { + return camelCase( key ); + } ) + ); yield receiveDownloadableBlocks( blocks, filterValue ); } catch ( error ) { @@ -31,7 +37,7 @@ export default { } } }, - * hasInstallBlocksPermission() { + *hasInstallBlocksPermission() { try { yield apiFetch( { path: `__experimental/block-directory/search?term=`, diff --git a/packages/block-directory/src/store/selectors.js b/packages/block-directory/src/store/selectors.js index 635bd37b81941..7a1778b1cc09a 100644 --- a/packages/block-directory/src/store/selectors.js +++ b/packages/block-directory/src/store/selectors.js @@ -1,8 +1,3 @@ -/** - * External dependencies - */ -import { get } from 'lodash'; - /** * Returns true if application is requesting for downloadable blocks. * @@ -37,7 +32,7 @@ export function getDownloadableBlocks( state, filterValue ) { * @return {boolean} User has permission to install blocks. */ export function hasInstallBlocksPermission( state ) { - return state.downloadableBlocks.hasPermission; + return state.hasPermission; } /** @@ -48,5 +43,5 @@ export function hasInstallBlocksPermission( state ) { * @return {Array} Block type items. */ export function getInstalledBlockTypes( state ) { - return get( state, [ 'downloadableBlocks', 'installedBlockTypes' ], [] ); + return state.blockManagement.installedBlockTypes; } diff --git a/packages/block-directory/src/store/test/fixtures/index.js b/packages/block-directory/src/store/test/fixtures/index.js new file mode 100644 index 0000000000000..0f7cc95dc8a6b --- /dev/null +++ b/packages/block-directory/src/store/test/fixtures/index.js @@ -0,0 +1,24 @@ +export const downloadableBlock = { + name: 'boxer/boxer', + title: 'Boxer', + description: + 'Boxer is a Block that puts your WordPress posts into boxes on a page.', + id: 'boxer-block', + rating: 5, + ratingCount: 1, + activeInstalls: 0, + authorBlockRating: 5, + authorBlockCount: '1', + author: 'CK Lee', + icon: 'block-default', + assets: [ + 'https://plugins.svn.wordpress.org/boxer-block/trunk/build/index.js', + 'https://plugins.svn.wordpress.org/boxer-block/trunk/build/view.js', + ], + humanizedUpdated: '3 months ago', +}; + +export const installedItem = { + id: 'boxer-block', + name: 'boxer/boxer', +}; diff --git a/packages/block-directory/src/store/test/reducer.js b/packages/block-directory/src/store/test/reducer.js new file mode 100644 index 0000000000000..b10edec5845a8 --- /dev/null +++ b/packages/block-directory/src/store/test/reducer.js @@ -0,0 +1,98 @@ +/** + * External dependencies + */ +import deepFreeze from 'deep-freeze'; + +/** + * Internal dependencies + */ +import { downloadableBlocks, blockManagement, hasPermission } from '../reducer'; +import { installedItem, downloadableBlock } from './fixtures'; + +describe( 'state', () => { + describe( 'downloadableBlocks()', () => { + it( 'should update state to reflect active search', () => { + const initialState = deepFreeze( { + isRequestingDownloadableBlocks: false, + } ); + const state = downloadableBlocks( initialState, { + type: 'FETCH_DOWNLOADABLE_BLOCKS', + } ); + + expect( state.isRequestingDownloadableBlocks ).toBe( true ); + } ); + + it( 'should update state to reflect search results have returned', () => { + const state = downloadableBlocks( undefined, { + type: 'RECEIVE_DOWNLOADABLE_BLOCKS', + filterValue: downloadableBlock.title, + downloadableBlocks: [ downloadableBlock ], + } ); + + expect( state.isRequestingDownloadableBlocks ).toBe( false ); + } ); + + it( "should set user's search term and save results", () => { + const state = downloadableBlocks( undefined, { + type: 'RECEIVE_DOWNLOADABLE_BLOCKS', + filterValue: downloadableBlock.title, + downloadableBlocks: [ downloadableBlock ], + } ); + expect( state.results ).toHaveProperty( downloadableBlock.title ); + expect( state.results[ downloadableBlock.title ] ).toHaveLength( + 1 + ); + + // It should append to the results + const updatedState = downloadableBlocks( state, { + type: 'RECEIVE_DOWNLOADABLE_BLOCKS', + filterValue: 'Test 1', + downloadableBlocks: [ downloadableBlock ], + } ); + + expect( Object.keys( updatedState.results ) ).toHaveLength( 2 ); + } ); + } ); + + describe( 'blockManagement()', () => { + it( 'should start with an empty installedBlockTypes List', () => { + const state = blockManagement( undefined, { + type: 'NOOP_TYPE', + } ); + expect( state.installedBlockTypes ).toEqual( [] ); + } ); + + it( 'should add item to the installedBlockTypesList', () => { + const initialState = deepFreeze( { installedBlockTypes: [] } ); + const state = blockManagement( initialState, { + type: 'ADD_INSTALLED_BLOCK_TYPE', + item: installedItem, + } ); + + expect( state.installedBlockTypes ).toHaveLength( 1 ); + } ); + + it( 'should remove item from the installedBlockTypesList', () => { + const initialState = deepFreeze( { + installedBlockTypes: [ installedItem ], + } ); + const state = blockManagement( initialState, { + type: 'REMOVE_INSTALLED_BLOCK_TYPE', + item: installedItem, + } ); + + expect( state.installedBlockTypes ).toHaveLength( 0 ); + } ); + } ); + + describe( 'hasPermission()', () => { + it( 'should update permissions appropriately', () => { + const state = hasPermission( true, { + type: 'SET_INSTALL_BLOCKS_PERMISSION', + hasPermission: false, + } ); + + expect( state ).toBe( false ); + } ); + } ); +} ); diff --git a/packages/block-directory/src/store/test/selectors.js b/packages/block-directory/src/store/test/selectors.js new file mode 100644 index 0000000000000..11a019d011f7e --- /dev/null +++ b/packages/block-directory/src/store/test/selectors.js @@ -0,0 +1,19 @@ +/** + * Internal dependencies + */ +import { getInstalledBlockTypes } from '../selectors'; + +describe( 'selectors', () => { + describe( 'getInstalledBlockTypes', () => { + it( 'should retrieve the block types that are installed', () => { + const blockTypes = [ 'fake-type' ]; + const state = { + blockManagement: { + installedBlockTypes: blockTypes, + }, + }; + const installedBlockTypes = getInstalledBlockTypes( state ); + expect( installedBlockTypes ).toEqual( blockTypes ); + } ); + } ); +} ); diff --git a/packages/block-editor/package.json b/packages/block-editor/package.json index 89dff719ece64..49b4e4fd8fa59 100644 --- a/packages/block-editor/package.json +++ b/packages/block-editor/package.json @@ -22,7 +22,7 @@ "module": "build-module/index.js", "react-native": "src/index", "dependencies": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/a11y": "file:../a11y", "@wordpress/blob": "file:../blob", "@wordpress/blocks": "file:../blocks", @@ -35,6 +35,7 @@ "@wordpress/hooks": "file:../hooks", "@wordpress/html-entities": "file:../html-entities", "@wordpress/i18n": "file:../i18n", + "@wordpress/icons": "file:../icons", "@wordpress/is-shallow-equal": "file:../is-shallow-equal", "@wordpress/keyboard-shortcuts": "file:../keyboard-shortcuts", "@wordpress/keycodes": "file:../keycodes", diff --git a/packages/block-editor/src/components/alignment-toolbar/index.js b/packages/block-editor/src/components/alignment-toolbar/index.js index 4f3b9104e1928..9a880f4e67dd3 100644 --- a/packages/block-editor/src/components/alignment-toolbar/index.js +++ b/packages/block-editor/src/components/alignment-toolbar/index.js @@ -8,20 +8,21 @@ import { find } from 'lodash'; */ import { __ } from '@wordpress/i18n'; import { Toolbar } from '@wordpress/components'; +import { alignLeft, alignRight, alignCenter } from '@wordpress/icons'; const DEFAULT_ALIGNMENT_CONTROLS = [ { - icon: 'editor-alignleft', + icon: alignLeft, title: __( 'Align text left' ), align: 'left', }, { - icon: 'editor-aligncenter', + icon: alignCenter, title: __( 'Align text center' ), align: 'center', }, { - icon: 'editor-alignright', + icon: alignRight, title: __( 'Align text right' ), align: 'right', }, @@ -40,7 +41,10 @@ export function AlignmentToolbar( props ) { return () => onChange( value === align ? undefined : align ); } - const activeAlignment = find( alignmentControls, ( control ) => control.align === value ); + const activeAlignment = find( + alignmentControls, + ( control ) => control.align === value + ); return ( { const { align } = control; - const isActive = ( value === align ); + const isActive = value === align; return { ...control, diff --git a/packages/block-editor/src/components/alignment-toolbar/test/__snapshots__/index.js.snap b/packages/block-editor/src/components/alignment-toolbar/test/__snapshots__/index.js.snap index 87dc64ceda18f..8ca05b1361631 100644 --- a/packages/block-editor/src/components/alignment-toolbar/test/__snapshots__/index.js.snap +++ b/packages/block-editor/src/components/alignment-toolbar/test/__snapshots__/index.js.snap @@ -34,7 +34,14 @@ exports[`AlignmentToolbar should match snapshot 1`] = ` Array [ Object { "align": "left", - "icon": "editor-alignleft", + "icon": + + , "isActive": true, "onClick": [Function], "role": "menuitemradio", @@ -42,7 +49,14 @@ exports[`AlignmentToolbar should match snapshot 1`] = ` }, Object { "align": "center", - "icon": "editor-aligncenter", + "icon": + + , "isActive": false, "onClick": [Function], "role": "menuitemradio", @@ -50,7 +64,14 @@ exports[`AlignmentToolbar should match snapshot 1`] = ` }, Object { "align": "right", - "icon": "editor-alignright", + "icon": + + , "isActive": false, "onClick": [Function], "role": "menuitemradio", @@ -58,7 +79,16 @@ exports[`AlignmentToolbar should match snapshot 1`] = ` }, ] } - icon="editor-alignleft" + icon={ + + + + } isCollapsed={true} label="Change text alignment" /> diff --git a/packages/block-editor/src/components/alignment-toolbar/test/index.js b/packages/block-editor/src/components/alignment-toolbar/test/index.js index 03662cfdabe81..3ad4397b84da0 100644 --- a/packages/block-editor/src/components/alignment-toolbar/test/index.js +++ b/packages/block-editor/src/components/alignment-toolbar/test/index.js @@ -12,7 +12,9 @@ describe( 'AlignmentToolbar', () => { const alignment = 'left'; const onChangeSpy = jest.fn(); - const wrapper = shallow( ); + const wrapper = shallow( + + ); const controls = wrapper.props().controls; @@ -34,7 +36,9 @@ describe( 'AlignmentToolbar', () => { } ); test( 'should call on change a new value when the control is not active', () => { - const inactiveControl = controls.find( ( { align } ) => align === 'center' ); + const inactiveControl = controls.find( + ( { align } ) => align === 'center' + ); inactiveControl.onClick(); expect( inactiveControl.isActive ).toBe( false ); diff --git a/packages/block-editor/src/components/autocomplete/index.js b/packages/block-editor/src/components/autocomplete/index.js index c95279a104db2..2deea11805450 100644 --- a/packages/block-editor/src/components/autocomplete/index.js +++ b/packages/block-editor/src/components/autocomplete/index.js @@ -33,16 +33,11 @@ export function withFilteredAutocompleters( Autocomplete ) { 'editor.Autocomplete.completers', // Provide copies so filters may directly modify them. completers.map( clone ), - props.blockName, + props.blockName ); } - return ( - - ); + return ; }; } diff --git a/packages/block-editor/src/components/block-actions/index.js b/packages/block-editor/src/components/block-actions/index.js index afc69d7e5273a..b26ca15f2590b 100644 --- a/packages/block-editor/src/components/block-actions/index.js +++ b/packages/block-editor/src/components/block-actions/index.js @@ -70,10 +70,7 @@ export default compose( [ }; } ), withDispatch( ( dispatch, props, { select } ) => { - const { - clientIds, - blocks, - } = props; + const { clientIds, blocks } = props; const { removeBlocks, @@ -101,22 +98,20 @@ export default compose( [ return; } - const { - getGroupingBlockName, - } = select( 'core/blocks' ); + const { getGroupingBlockName } = select( 'core/blocks' ); const groupingBlockName = getGroupingBlockName(); // Activate the `transform` on `core/group` which does the conversion - const newBlocks = switchToBlockType( blocks, groupingBlockName ); + const newBlocks = switchToBlockType( + blocks, + groupingBlockName + ); if ( ! newBlocks ) { return; } - replaceBlocks( - clientIds, - newBlocks - ); + replaceBlocks( clientIds, newBlocks ); }, onUngroup() { @@ -130,10 +125,7 @@ export default compose( [ return; } - replaceBlocks( - clientIds, - innerBlocks - ); + replaceBlocks( clientIds, innerBlocks ); }, }; } ), diff --git a/packages/block-editor/src/components/block-alignment-toolbar/index.js b/packages/block-editor/src/components/block-alignment-toolbar/index.js index da5dbb7317a3a..84a7c6160d34d 100644 --- a/packages/block-editor/src/components/block-alignment-toolbar/index.js +++ b/packages/block-editor/src/components/block-alignment-toolbar/index.js @@ -5,6 +5,13 @@ import { __ } from '@wordpress/i18n'; import { Toolbar } from '@wordpress/components'; import { withSelect } from '@wordpress/data'; import { compose } from '@wordpress/compose'; +import { + positionCenter, + positionLeft, + positionRight, + stretchFullWidth, + stretchWide, +} from '@wordpress/icons'; /** * Internal dependencies @@ -13,23 +20,23 @@ import { withBlockEditContext } from '../block-edit/context'; const BLOCK_ALIGNMENTS_CONTROLS = { left: { - icon: 'align-left', + icon: positionLeft, title: __( 'Align left' ), }, center: { - icon: 'align-center', + icon: positionCenter, title: __( 'Align center' ), }, right: { - icon: 'align-right', + icon: positionRight, title: __( 'Align right' ), }, wide: { - icon: 'align-wide', + icon: stretchWide, title: __( 'Wide width' ), }, full: { - icon: 'align-full-width', + icon: stretchFullWidth, title: __( 'Full width' ), }, }; @@ -38,33 +45,44 @@ const DEFAULT_CONTROLS = [ 'left', 'center', 'right', 'wide', 'full' ]; const DEFAULT_CONTROL = 'center'; const WIDE_CONTROLS = [ 'wide', 'full' ]; -export function BlockAlignmentToolbar( { value, onChange, controls = DEFAULT_CONTROLS, isCollapsed = true, wideControlsEnabled = false } ) { +export function BlockAlignmentToolbar( { + value, + onChange, + controls = DEFAULT_CONTROLS, + isCollapsed = true, + wideControlsEnabled = false, +} ) { function applyOrUnset( align ) { return () => onChange( value === align ? undefined : align ); } - const enabledControls = wideControlsEnabled ? - controls : - controls.filter( ( control ) => WIDE_CONTROLS.indexOf( control ) === -1 ); + const enabledControls = wideControlsEnabled + ? controls + : controls.filter( + ( control ) => WIDE_CONTROLS.indexOf( control ) === -1 + ); const activeAlignmentControl = BLOCK_ALIGNMENTS_CONTROLS[ value ]; - const defaultAlignmentControl = BLOCK_ALIGNMENTS_CONTROLS[ DEFAULT_CONTROL ]; + const defaultAlignmentControl = + BLOCK_ALIGNMENTS_CONTROLS[ DEFAULT_CONTROL ]; return ( { - return { - ...BLOCK_ALIGNMENTS_CONTROLS[ control ], - isActive: value === control, - role: isCollapsed ? 'menuitemradio' : undefined, - onClick: applyOrUnset( control ), - }; - } ) + icon={ + activeAlignmentControl + ? activeAlignmentControl.icon + : defaultAlignmentControl.icon } + label={ __( 'Change alignment' ) } + controls={ enabledControls.map( ( control ) => { + return { + ...BLOCK_ALIGNMENTS_CONTROLS[ control ], + isActive: value === control, + role: isCollapsed ? 'menuitemradio' : undefined, + onClick: applyOrUnset( control ), + }; + } ) } /> ); } @@ -81,5 +99,5 @@ export default compose( return { wideControlsEnabled: settings.alignWide, }; - } ), + } ) )( BlockAlignmentToolbar ); diff --git a/packages/block-editor/src/components/block-alignment-toolbar/test/__snapshots__/index.js.snap b/packages/block-editor/src/components/block-alignment-toolbar/test/__snapshots__/index.js.snap index ebc927c8eb816..10e88985b76d5 100644 --- a/packages/block-editor/src/components/block-alignment-toolbar/test/__snapshots__/index.js.snap +++ b/packages/block-editor/src/components/block-alignment-toolbar/test/__snapshots__/index.js.snap @@ -5,21 +5,42 @@ exports[`BlockAlignmentToolbar should match snapshot 1`] = ` controls={ Array [ Object { - "icon": "align-left", + "icon": + + , "isActive": true, "onClick": [Function], "role": "menuitemradio", "title": "Align left", }, Object { - "icon": "align-center", + "icon": + + , "isActive": false, "onClick": [Function], "role": "menuitemradio", "title": "Align center", }, Object { - "icon": "align-right", + "icon": + + , "isActive": false, "onClick": [Function], "role": "menuitemradio", @@ -27,7 +48,16 @@ exports[`BlockAlignmentToolbar should match snapshot 1`] = ` }, ] } - icon="align-left" + icon={ + + + + } isCollapsed={true} label="Change alignment" /> diff --git a/packages/block-editor/src/components/block-alignment-toolbar/test/index.js b/packages/block-editor/src/components/block-alignment-toolbar/test/index.js index c7a208006849e..976aa7d4abd89 100644 --- a/packages/block-editor/src/components/block-alignment-toolbar/test/index.js +++ b/packages/block-editor/src/components/block-alignment-toolbar/test/index.js @@ -12,7 +12,9 @@ describe( 'BlockAlignmentToolbar', () => { const alignment = 'left'; const onChange = jest.fn(); - const wrapper = shallow( ); + const wrapper = shallow( + + ); const controls = wrapper.props().controls; @@ -25,7 +27,9 @@ describe( 'BlockAlignmentToolbar', () => { } ); test( 'should call onChange with undefined, when the control is already active', () => { - const activeControl = controls.find( ( { icon } ) => icon === `align-${ alignment }` ); + const activeControl = controls.find( + ( { title } ) => title === 'Align left' + ); activeControl.onClick(); expect( activeControl.isActive ).toBe( true ); @@ -34,7 +38,9 @@ describe( 'BlockAlignmentToolbar', () => { } ); test( 'should call onChange with alignment value when the control is inactive', () => { - const inactiveCenterControl = controls.find( ( { icon } ) => icon === 'align-center' ); + const inactiveCenterControl = controls.find( + ( { title } ) => title === 'Align center' + ); inactiveCenterControl.onClick(); expect( inactiveCenterControl.isActive ).toBe( false ); diff --git a/packages/block-editor/src/components/block-breadcrumb/index.js b/packages/block-editor/src/components/block-breadcrumb/index.js index adc96ba4eb2d5..e1c7b7436cdf3 100644 --- a/packages/block-editor/src/components/block-breadcrumb/index.js +++ b/packages/block-editor/src/components/block-breadcrumb/index.js @@ -16,7 +16,9 @@ import BlockTitle from '../block-title'; * @return {WPElement} Block Breadcrumb. */ const BlockBreadcrumb = function() { - const { selectBlock, clearSelectedBlock } = useDispatch( 'core/block-editor' ); + const { selectBlock, clearSelectedBlock } = useDispatch( + 'core/block-editor' + ); const { clientId, parents, hasSelection } = useSelect( ( select ) => { const { getSelectionStart, @@ -37,9 +39,17 @@ const BlockBreadcrumb = function() { */ /* eslint-disable jsx-a11y/no-redundant-roles */ return ( -
      +
      • { hasSelection && ( @@ -65,7 +75,10 @@ const BlockBreadcrumb = function() {
      • ) ) } { !! clientId && ( -
      • +
      • ) } diff --git a/packages/block-editor/src/components/block-caption/index.native.js b/packages/block-editor/src/components/block-caption/index.native.js index 08dabe5b4a68b..818bc3b41c0ab 100644 --- a/packages/block-editor/src/components/block-caption/index.native.js +++ b/packages/block-editor/src/components/block-caption/index.native.js @@ -20,9 +20,7 @@ const BlockCaption = ( { shouldDisplay, text, } ) => ( - + { - const { - getBlockAttributes, - getSelectedBlockClientId, - } = select( 'core/block-editor' ); + const { getBlockAttributes, getSelectedBlockClientId } = select( + 'core/block-editor' + ); const { caption } = getBlockAttributes( clientId ); const isBlockSelected = getSelectedBlockClientId() === clientId; // We'll render the caption so that the soft keyboard is not forced to close on Android // but still hide it by setting its display style to none. See wordpress-mobile/gutenberg-mobile#1221 - const shouldDisplay = ! RichText.isEmpty( caption ) > 0 || isBlockSelected; + const shouldDisplay = + ! RichText.isEmpty( caption ) > 0 || isBlockSelected; return { shouldDisplay, diff --git a/packages/block-editor/src/components/block-card/index.js b/packages/block-editor/src/components/block-card/index.js index f060612622804..674d437d9c7a3 100644 --- a/packages/block-editor/src/components/block-card/index.js +++ b/packages/block-editor/src/components/block-card/index.js @@ -8,8 +8,12 @@ function BlockCard( { blockType } ) {
        -
        { blockType.title }
        -
        { blockType.description }
        +
        + { blockType.title } +
        +
        + { blockType.description } +
        ); diff --git a/packages/block-editor/src/components/block-compare/block-view.js b/packages/block-editor/src/components/block-compare/block-view.js index ed5e030c7fd4f..7bb45a4402f24 100644 --- a/packages/block-editor/src/components/block-compare/block-view.js +++ b/packages/block-editor/src/components/block-compare/block-view.js @@ -3,11 +3,20 @@ */ import { Button } from '@wordpress/components'; -const BlockView = ( { title, rawContent, renderedContent, action, actionText, className } ) => { +const BlockView = ( { + title, + rawContent, + renderedContent, + action, + actionText, + className, +} ) => { return (
        -

        { title }

        +

        + { title } +

        { rawContent } @@ -19,7 +28,9 @@ const BlockView = ( { title, rawContent, renderedContent, action, actionText, cl
        - +
        ); diff --git a/packages/block-editor/src/components/block-compare/index.js b/packages/block-editor/src/components/block-compare/index.js index 18638255508ec..f80ca412ce511 100644 --- a/packages/block-editor/src/components/block-compare/index.js +++ b/packages/block-editor/src/components/block-compare/index.js @@ -27,7 +27,11 @@ class BlockCompare extends Component { 'block-editor-block-compare__removed': item.removed, } ); - return { item.value }; + return ( + + { item.value } + + ); } ); } @@ -43,8 +47,12 @@ class BlockCompare extends Component { const newBlocks = castArray( block ); // Get converted block details - const newContent = newBlocks.map( ( item ) => getSaveContent( item.name, item.attributes, item.innerBlocks ) ); - const renderedContent = newBlocks.map( ( item ) => getSaveElement( item.name, item.attributes, item.innerBlocks ) ); + const newContent = newBlocks.map( ( item ) => + getSaveContent( item.name, item.attributes, item.innerBlocks ) + ); + const renderedContent = newBlocks.map( ( item ) => + getSaveElement( item.name, item.attributes, item.innerBlocks ) + ); return { rawContent: newContent.join( '' ), @@ -53,10 +61,19 @@ class BlockCompare extends Component { } render() { - const { block, onKeep, onConvert, convertor, convertButtonText } = this.props; + const { + block, + onKeep, + onConvert, + convertor, + convertButtonText, + } = this.props; const original = this.getOriginalContent( block ); const converted = this.getConvertedContent( convertor( block ) ); - const difference = this.getDifference( original.rawContent, converted.rawContent ); + const difference = this.getDifference( + original.rawContent, + converted.rawContent + ); return (
        diff --git a/packages/block-editor/src/components/block-compare/test/block-view.js b/packages/block-editor/src/components/block-compare/test/block-view.js index 657f326f44ce9..755722983351b 100644 --- a/packages/block-editor/src/components/block-compare/test/block-view.js +++ b/packages/block-editor/src/components/block-compare/test/block-view.js @@ -11,7 +11,16 @@ import BlockView from '../block-view'; describe( 'BlockView', () => { test( 'should match snapshot', () => { - const wrapper = shallow( ); + const wrapper = shallow( + + ); expect( wrapper ).toMatchSnapshot(); } ); diff --git a/packages/block-editor/src/components/block-draggable/index.js b/packages/block-editor/src/components/block-draggable/index.js index b5851d57a51fb..dd87e2c5a08fd 100644 --- a/packages/block-editor/src/components/block-draggable/index.js +++ b/packages/block-editor/src/components/block-draggable/index.js @@ -11,28 +11,35 @@ import { useSelect, useDispatch } from '@wordpress/data'; import { useEffect, useRef } from '@wordpress/element'; const BlockDraggable = ( { children, clientIds } ) => { - const { - srcRootClientId, - index, - isDraggable, - } = useSelect( ( select ) => { - const { - getBlockIndex, - getBlockRootClientId, - getTemplateLock, - } = select( 'core/block-editor' ); - const normalizedClientIds = castArray( clientIds ); - const rootClientId = normalizedClientIds.length === 1 ? getBlockRootClientId( normalizedClientIds[ 0 ] ) : null; - const templateLock = rootClientId ? getTemplateLock( rootClientId ) : null; + const { srcRootClientId, index, isDraggable } = useSelect( + ( select ) => { + const { + getBlockIndex, + getBlockRootClientId, + getTemplateLock, + } = select( 'core/block-editor' ); + const normalizedClientIds = castArray( clientIds ); + const rootClientId = + normalizedClientIds.length === 1 + ? getBlockRootClientId( normalizedClientIds[ 0 ] ) + : null; + const templateLock = rootClientId + ? getTemplateLock( rootClientId ) + : null; - return { - index: getBlockIndex( normalizedClientIds[ 0 ], rootClientId ), - srcRootClientId: rootClientId, - isDraggable: normalizedClientIds.length === 1 && 'all' !== templateLock, - }; - }, [ clientIds ] ); + return { + index: getBlockIndex( normalizedClientIds[ 0 ], rootClientId ), + srcRootClientId: rootClientId, + isDraggable: + normalizedClientIds.length === 1 && 'all' !== templateLock, + }; + }, + [ clientIds ] + ); const isDragging = useRef( false ); - const { startDraggingBlocks, stopDraggingBlocks } = useDispatch( 'core/block-editor' ); + const { startDraggingBlocks, stopDraggingBlocks } = useDispatch( + 'core/block-editor' + ); // Stop dragging blocks if the block draggable is unmounted useEffect( () => { @@ -69,14 +76,12 @@ const BlockDraggable = ( { children, clientIds } ) => { isDragging.current = false; } } > - { - ( { onDraggableStart, onDraggableEnd } ) => { - return children( { - onDraggableStart, - onDraggableEnd, - } ); - } - } + { ( { onDraggableStart, onDraggableEnd } ) => { + return children( { + onDraggableStart, + onDraggableEnd, + } ); + } } ); }; diff --git a/packages/block-editor/src/components/block-drop-zone/index.js b/packages/block-editor/src/components/block-drop-zone/index.js index d78cb7521a4bc..6f15cb0284af0 100644 --- a/packages/block-editor/src/components/block-drop-zone/index.js +++ b/packages/block-editor/src/components/block-drop-zone/index.js @@ -23,7 +23,10 @@ const parseDropEvent = ( event ) => { } try { - result = Object.assign( result, JSON.parse( event.dataTransfer.getData( 'text' ) ) ); + result = Object.assign( + result, + JSON.parse( event.dataTransfer.getData( 'text' ) ) + ); } catch ( err ) { return result; } @@ -63,55 +66,109 @@ export default function useBlockDropZone( { element, rootClientId } ) { moveBlockToPosition, } = useDispatch( 'core/block-editor' ); - const onFilesDrop = useCallback( ( files ) => { - if ( ! hasUploadPermissions ) { - return; - } - - const transformation = findTransform( - getBlockTransforms( 'from' ), - ( transform ) => transform.type === 'files' && transform.isMatch( files ) - ); - - if ( transformation ) { - const blocks = transformation.transform( files, updateBlockAttributes ); - insertBlocks( blocks, blockIndex, rootClientId ); - } - }, [ hasUploadPermissions, updateBlockAttributes, insertBlocks, blockIndex, rootClientId ] ); - - const onHTMLDrop = useCallback( ( HTML ) => { - const blocks = pasteHandler( { HTML, mode: 'BLOCKS' } ); - - if ( blocks.length ) { - insertBlocks( blocks, blockIndex, rootClientId ); - } - }, [ insertBlocks, blockIndex, rootClientId ] ); - - const onDrop = useCallback( ( event ) => { - const { srcRootClientId, srcClientId, srcIndex, type } = parseDropEvent( event ); - - const isBlockDropType = ( dropType ) => dropType === 'block'; - const isSameLevel = ( srcRoot, dstRoot ) => { - // Note that rootClientId of top-level blocks will be undefined OR a void string, - // so we also need to account for that case separately. - return ( srcRoot === dstRoot ) || ( ! srcRoot === true && ! dstRoot === true ); - }; - const isSameBlock = ( src, dst ) => src === dst; - const isSrcBlockAnAncestorOfDstBlock = ( src, dst ) => getClientIdsOfDescendants( [ src ] ).some( ( id ) => id === dst ); + const onFilesDrop = useCallback( + ( files ) => { + if ( ! hasUploadPermissions ) { + return; + } - if ( ! isBlockDropType( type ) || - isSameBlock( srcClientId, clientId ) || - isSrcBlockAnAncestorOfDstBlock( srcClientId, clientId || rootClientId ) ) { - return; - } + const transformation = findTransform( + getBlockTransforms( 'from' ), + ( transform ) => + transform.type === 'files' && transform.isMatch( files ) + ); + + if ( transformation ) { + const blocks = transformation.transform( + files, + updateBlockAttributes + ); + insertBlocks( blocks, blockIndex, rootClientId ); + } + }, + [ + hasUploadPermissions, + updateBlockAttributes, + insertBlocks, + blockIndex, + rootClientId, + ] + ); + + const onHTMLDrop = useCallback( + ( HTML ) => { + const blocks = pasteHandler( { HTML, mode: 'BLOCKS' } ); + + if ( blocks.length ) { + insertBlocks( blocks, blockIndex, rootClientId ); + } + }, + [ insertBlocks, blockIndex, rootClientId ] + ); + + const onDrop = useCallback( + ( event ) => { + const { + srcRootClientId, + srcClientId, + srcIndex, + type, + } = parseDropEvent( event ); + + const isBlockDropType = ( dropType ) => dropType === 'block'; + const isSameLevel = ( srcRoot, dstRoot ) => { + // Note that rootClientId of top-level blocks will be undefined OR a void string, + // so we also need to account for that case separately. + return ( + srcRoot === dstRoot || + ( ! srcRoot === true && ! dstRoot === true ) + ); + }; + const isSameBlock = ( src, dst ) => src === dst; + const isSrcBlockAnAncestorOfDstBlock = ( src, dst ) => + getClientIdsOfDescendants( [ src ] ).some( + ( id ) => id === dst + ); + + if ( + ! isBlockDropType( type ) || + isSameBlock( srcClientId, clientId ) || + isSrcBlockAnAncestorOfDstBlock( + srcClientId, + clientId || rootClientId + ) + ) { + return; + } - const dstIndex = clientId ? getBlockIndex( clientId, rootClientId ) : undefined; - const positionIndex = blockIndex; - // If the block is kept at the same level and moved downwards, - // subtract to account for blocks shifting upward to occupy its old position. - const insertIndex = dstIndex && srcIndex < dstIndex && isSameLevel( srcRootClientId, rootClientId ) ? positionIndex - 1 : positionIndex; - moveBlockToPosition( srcClientId, srcRootClientId, rootClientId, insertIndex ); - }, [ getClientIdsOfDescendants, getBlockIndex, clientId, blockIndex, moveBlockToPosition, rootClientId ] ); + const dstIndex = clientId + ? getBlockIndex( clientId, rootClientId ) + : undefined; + const positionIndex = blockIndex; + // If the block is kept at the same level and moved downwards, + // subtract to account for blocks shifting upward to occupy its old position. + const insertIndex = + dstIndex && + srcIndex < dstIndex && + isSameLevel( srcRootClientId, rootClientId ) + ? positionIndex - 1 + : positionIndex; + moveBlockToPosition( + srcClientId, + srcRootClientId, + rootClientId, + insertIndex + ); + }, + [ + getClientIdsOfDescendants, + getBlockIndex, + clientId, + blockIndex, + moveBlockToPosition, + rootClientId, + ] + ); const { position } = useDropZone( { element, @@ -128,9 +185,13 @@ export default function useBlockDropZone( { element, rootClientId } ) { const rect = element.current.getBoundingClientRect(); const offset = y - rect.top; - const target = Array.from( element.current.children ).find( ( blockEl ) => { - return blockEl.offsetTop + ( blockEl.offsetHeight / 2 ) > offset; - } ); + const target = Array.from( element.current.children ).find( + ( blockEl ) => { + return ( + blockEl.offsetTop + blockEl.offsetHeight / 2 > offset + ); + } + ); if ( ! target ) { return; diff --git a/packages/block-editor/src/components/block-edit/context.js b/packages/block-editor/src/components/block-edit/context.js index 08f2ac9f1dd6b..0ab6570bd5da0 100644 --- a/packages/block-editor/src/components/block-edit/context.js +++ b/packages/block-editor/src/components/block-edit/context.js @@ -39,18 +39,19 @@ export function useBlockEditContext() { * * @return {WPComponent} Enhanced component with injected context as props. */ -export const withBlockEditContext = ( mapContextToProps ) => createHigherOrderComponent( ( OriginalComponent ) => { - return ( props ) => ( - - { ( context ) => ( - - ) } - - ); -}, 'withBlockEditContext' ); +export const withBlockEditContext = ( mapContextToProps ) => + createHigherOrderComponent( ( OriginalComponent ) => { + return ( props ) => ( + + { ( context ) => ( + + ) } + + ); + }, 'withBlockEditContext' ); /** * A Higher Order Component used to render conditionally the wrapped @@ -60,12 +61,15 @@ export const withBlockEditContext = ( mapContextToProps ) => createHigherOrderCo * * @return {WPComponent} Component which renders only when the BlockEdit is selected. */ -export const ifBlockEditSelected = createHigherOrderComponent( ( OriginalComponent ) => { - return ( props ) => ( - - { ( { isSelected } ) => isSelected && ( - - ) } - - ); -}, 'ifBlockEditSelected' ); +export const ifBlockEditSelected = createHigherOrderComponent( + ( OriginalComponent ) => { + return ( props ) => ( + + { ( { isSelected } ) => + isSelected && + } + + ); + }, + 'ifBlockEditSelected' +); diff --git a/packages/block-editor/src/components/block-edit/edit.js b/packages/block-editor/src/components/block-edit/edit.js index 9094435159485..c31095753d206 100644 --- a/packages/block-editor/src/components/block-edit/edit.js +++ b/packages/block-editor/src/components/block-edit/edit.js @@ -7,7 +7,11 @@ import classnames from 'classnames'; * WordPress dependencies */ import { withFilters } from '@wordpress/components'; -import { getBlockDefaultClassName, hasBlockSupport, getBlockType } from '@wordpress/blocks'; +import { + getBlockDefaultClassName, + hasBlockSupport, + getBlockType, +} from '@wordpress/blocks'; export const Edit = ( props ) => { const { attributes = {}, name } = props; @@ -18,9 +22,9 @@ export const Edit = ( props ) => { } // Generate a class name for the block's editable form - const generatedClassName = hasBlockSupport( blockType, 'className', true ) ? - getBlockDefaultClassName( name ) : - null; + const generatedClassName = hasBlockSupport( blockType, 'className', true ) + ? getBlockDefaultClassName( name ) + : null; const className = classnames( generatedClassName, attributes.className ); // `edit` and `save` are functions or components describing the markup diff --git a/packages/block-editor/src/components/block-edit/edit.native.js b/packages/block-editor/src/components/block-edit/edit.native.js index 8a4d0ad8350e9..2577ad3e0733e 100644 --- a/packages/block-editor/src/components/block-edit/edit.native.js +++ b/packages/block-editor/src/components/block-edit/edit.native.js @@ -14,9 +14,7 @@ export const Edit = ( props ) => { const Component = blockType.edit; - return ( - - ); + return ; }; export default withFilters( 'editor.BlockEdit' )( Edit ); diff --git a/packages/block-editor/src/components/block-edit/index.js b/packages/block-editor/src/components/block-edit/index.js index 403a5cd87898e..3057ff3b4cf72 100644 --- a/packages/block-editor/src/components/block-edit/index.js +++ b/packages/block-editor/src/components/block-edit/index.js @@ -21,19 +21,42 @@ class BlockEdit extends Component { // It is important to return the same object if props haven't changed // to avoid unnecessary rerenders. // See https://reactjs.org/docs/context.html#caveats. - this.propsToContext = memize( - this.propsToContext.bind( this ), - { maxSize: 1 } - ); + this.propsToContext = memize( this.propsToContext.bind( this ), { + maxSize: 1, + } ); } - propsToContext( name, isSelected, clientId, onFocus, onCaretVerticalPositionChange ) { - return { name, isSelected, clientId, onFocus, onCaretVerticalPositionChange }; + propsToContext( + name, + isSelected, + clientId, + onFocus, + onCaretVerticalPositionChange + ) { + return { + name, + isSelected, + clientId, + onFocus, + onCaretVerticalPositionChange, + }; } render() { - const { name, isSelected, clientId, onFocus, onCaretVerticalPositionChange } = this.props; - const value = this.propsToContext( name, isSelected, clientId, onFocus, onCaretVerticalPositionChange ); + const { + name, + isSelected, + clientId, + onFocus, + onCaretVerticalPositionChange, + } = this.props; + const value = this.propsToContext( + name, + isSelected, + clientId, + onFocus, + onCaretVerticalPositionChange + ); return ( 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 d09ce608cc14b..0b07eb03b2aad 100644 --- a/packages/block-editor/src/components/block-edit/test/edit.js +++ b/packages/block-editor/src/components/block-edit/test/edit.js @@ -74,7 +74,9 @@ describe( 'Edit', () => { ); - expect( wrapper.find( edit ).hasClass( 'wp-block-test-block' ) ).toBe( true ); + expect( wrapper.find( edit ).hasClass( 'wp-block-test-block' ) ).toBe( + true + ); expect( wrapper.find( edit ).hasClass( 'my-class' ) ).toBe( true ); } ); } ); diff --git a/packages/block-editor/src/components/block-icon/index.js b/packages/block-editor/src/components/block-icon/index.js index 508d48a2211c1..5e953264fc99c 100644 --- a/packages/block-editor/src/components/block-icon/index.js +++ b/packages/block-editor/src/components/block-icon/index.js @@ -12,24 +12,28 @@ import { Path, Icon, SVG } from '@wordpress/components'; export default function BlockIcon( { icon, showColors = false, className } ) { if ( get( icon, [ 'src' ] ) === 'block-default' ) { icon = { - src: , + src: ( + + + + ), }; } const renderedIcon = ; - const style = showColors ? { - backgroundColor: icon && icon.background, - color: icon && icon.foreground, - } : {}; + const style = showColors + ? { + backgroundColor: icon && icon.background, + color: icon && icon.foreground, + } + : {}; return ( { renderedIcon } diff --git a/packages/block-editor/src/components/block-icon/index.native.js b/packages/block-editor/src/components/block-icon/index.native.js index 4dddda5ecce8f..5708c21d86318 100644 --- a/packages/block-editor/src/components/block-icon/index.native.js +++ b/packages/block-editor/src/components/block-icon/index.native.js @@ -12,19 +12,21 @@ import { Path, Icon, SVG } from '@wordpress/components'; export default function BlockIcon( { icon, showColors = false } ) { if ( get( icon, [ 'src' ] ) === 'block-default' ) { icon = { - src: , + src: ( + + + + ), }; } const renderedIcon = ; - const style = showColors ? { - backgroundColor: icon && icon.background, - color: icon && icon.foreground, - } : {}; + const style = showColors + ? { + backgroundColor: icon && icon.background, + color: icon && icon.foreground, + } + : {}; - return ( - - { renderedIcon } - - ); + return { renderedIcon }; } diff --git a/packages/block-editor/src/components/block-icon/test/index.js b/packages/block-editor/src/components/block-icon/test/index.js index 8c74330ad34d4..f7e2317b4e2d4 100644 --- a/packages/block-editor/src/components/block-icon/test/index.js +++ b/packages/block-editor/src/components/block-icon/test/index.js @@ -17,7 +17,9 @@ describe( 'BlockIcon', () => { it( 'renders a Icon', () => { const wrapper = shallow( ); - expect( wrapper.containsMatchingElement( ) ).toBe( true ); + expect( + wrapper.containsMatchingElement( ) + ).toBe( true ); } ); it( 'renders a span without the has-colors classname', () => { @@ -33,13 +35,20 @@ describe( 'BlockIcon', () => { } ); it( 'skips adding background and foreground styles when colors are not enabled', () => { - const wrapper = shallow( ); + const wrapper = shallow( + + ); expect( wrapper.find( 'span' ).prop( 'style' ) ).toEqual( {} ); } ); it( 'adds background and foreground styles when colors are enabled', () => { - const wrapper = shallow( ); + const wrapper = shallow( + + ); expect( wrapper.find( 'span' ).prop( 'style' ) ).toEqual( { backgroundColor: 'white', diff --git a/packages/block-editor/src/components/block-inspector/index.js b/packages/block-editor/src/components/block-inspector/index.js index 8f58075cfa04c..0f7fededfb6f9 100644 --- a/packages/block-editor/src/components/block-inspector/index.js +++ b/packages/block-editor/src/components/block-inspector/index.js @@ -2,7 +2,10 @@ * WordPress dependencies */ import { __ } from '@wordpress/i18n'; -import { getBlockType, getUnregisteredTypeHandlerName } from '@wordpress/blocks'; +import { + getBlockType, + getUnregisteredTypeHandlerName, +} from '@wordpress/blocks'; import { PanelBody, __experimentalSlotFillConsumer, @@ -31,13 +34,18 @@ const BlockInspector = ( { return ; } - const isSelectedBlockUnregistered = selectedBlockName === getUnregisteredTypeHandlerName(); + const isSelectedBlockUnregistered = + selectedBlockName === getUnregisteredTypeHandlerName(); /* * If the selected block is of an unregistered type, avoid showing it as an actual selection * because we want the user to focus on the unregistered block warning, not block settings. */ - if ( ! blockType || ! selectedBlockClientId || isSelectedBlockUnregistered ) { + if ( + ! blockType || + ! selectedBlockClientId || + isSelectedBlockUnregistered + ) { if ( showNoBlockSelectedMessage ) { return ( @@ -53,13 +61,8 @@ const BlockInspector = ( { { hasBlockStyles && (
        - - + +
        @@ -74,7 +77,9 @@ const BlockInspector = ( { title={ __( 'Advanced' ) } initialOpen={ false } > - + ) } @@ -85,20 +90,25 @@ const BlockInspector = ( { ); }; -export default withSelect( - ( select ) => { - const { getSelectedBlockClientId, getSelectedBlockCount, getBlockName } = select( 'core/block-editor' ); - const { getBlockStyles } = select( 'core/blocks' ); - const selectedBlockClientId = getSelectedBlockClientId(); - const selectedBlockName = selectedBlockClientId && getBlockName( selectedBlockClientId ); - const blockType = selectedBlockClientId && getBlockType( selectedBlockName ); - const blockStyles = selectedBlockClientId && getBlockStyles( selectedBlockName ); - return { - count: getSelectedBlockCount(), - hasBlockStyles: blockStyles && blockStyles.length > 0, - selectedBlockName, - selectedBlockClientId, - blockType, - }; - } -)( BlockInspector ); +export default withSelect( ( select ) => { + const { + getSelectedBlockClientId, + getSelectedBlockCount, + getBlockName, + } = select( 'core/block-editor' ); + const { getBlockStyles } = select( 'core/blocks' ); + const selectedBlockClientId = getSelectedBlockClientId(); + const selectedBlockName = + selectedBlockClientId && getBlockName( selectedBlockClientId ); + const blockType = + selectedBlockClientId && getBlockType( selectedBlockName ); + const blockStyles = + selectedBlockClientId && getBlockStyles( selectedBlockName ); + return { + count: getSelectedBlockCount(), + hasBlockStyles: blockStyles && blockStyles.length > 0, + selectedBlockName, + selectedBlockClientId, + blockType, + }; +} )( BlockInspector ); diff --git a/packages/block-editor/src/components/block-list-appender/index.js b/packages/block-editor/src/components/block-list-appender/index.js index 6515eea231b4e..bd226053c6e9b 100644 --- a/packages/block-editor/src/components/block-list-appender/index.js +++ b/packages/block-editor/src/components/block-list-appender/index.js @@ -78,15 +78,16 @@ function BlockListAppender( { } export default withSelect( ( select, { rootClientId } ) => { - const { - getBlockOrder, - canInsertBlockType, - getTemplateLock, - } = select( 'core/block-editor' ); + const { getBlockOrder, canInsertBlockType, getTemplateLock } = select( + 'core/block-editor' + ); return { isLocked: !! getTemplateLock( rootClientId ), blockClientIds: getBlockOrder( rootClientId ), - canInsertDefaultBlock: canInsertBlockType( getDefaultBlockName(), rootClientId ), + canInsertDefaultBlock: canInsertBlockType( + getDefaultBlockName(), + rootClientId + ), }; } )( BlockListAppender ); diff --git a/packages/block-editor/src/components/block-list-appender/index.native.js b/packages/block-editor/src/components/block-list-appender/index.native.js index 2a77fe797d132..6b33b1f5c08b7 100644 --- a/packages/block-editor/src/components/block-list-appender/index.native.js +++ b/packages/block-editor/src/components/block-list-appender/index.native.js @@ -28,9 +28,7 @@ function BlockListAppender( { } if ( CustomAppender ) { - return ( - - ); + return ; } if ( canInsertDefaultBlock ) { @@ -49,15 +47,16 @@ function BlockListAppender( { } export default withSelect( ( select, { rootClientId } ) => { - const { - getBlockOrder, - canInsertBlockType, - getTemplateLock, - } = select( 'core/block-editor' ); + const { getBlockOrder, canInsertBlockType, getTemplateLock } = select( + 'core/block-editor' + ); return { isLocked: !! getTemplateLock( rootClientId ), blockClientIds: getBlockOrder( rootClientId ), - canInsertDefaultBlock: canInsertBlockType( getDefaultBlockName(), rootClientId ), + canInsertDefaultBlock: canInsertBlockType( + getDefaultBlockName(), + rootClientId + ), }; } )( BlockListAppender ); diff --git a/packages/block-editor/src/components/block-list-footer/index.js b/packages/block-editor/src/components/block-list-footer/index.js index 3beba29d90b0a..5cbfb49f934ac 100644 --- a/packages/block-editor/src/components/block-list-footer/index.js +++ b/packages/block-editor/src/components/block-list-footer/index.js @@ -3,7 +3,9 @@ */ import { createSlotFill } from '@wordpress/components'; -const { Fill: __experimentalBlockListFooter, Slot } = createSlotFill( '__experimentalBlockListFooter' ); +const { Fill: __experimentalBlockListFooter, Slot } = createSlotFill( + '__experimentalBlockListFooter' +); __experimentalBlockListFooter.Slot = Slot; diff --git a/packages/block-editor/src/components/block-list/block-html.js b/packages/block-editor/src/components/block-list/block-html.js index f9a83feaafb3c..b8f684b62f309 100644 --- a/packages/block-editor/src/components/block-list/block-html.js +++ b/packages/block-editor/src/components/block-list/block-html.js @@ -1,4 +1,3 @@ - /** * External dependencies */ @@ -9,23 +8,42 @@ import TextareaAutosize from 'react-autosize-textarea'; */ import { useEffect, useState } from '@wordpress/element'; import { useSelect, useDispatch } from '@wordpress/data'; -import { getBlockAttributes, getBlockContent, getBlockType, isValidBlockContent, getSaveContent } from '@wordpress/blocks'; +import { + getBlockAttributes, + getBlockContent, + getBlockType, + isValidBlockContent, + getSaveContent, +} from '@wordpress/blocks'; function BlockHTML( { clientId } ) { const [ html, setHtml ] = useState( '' ); - const { block } = useSelect( ( select ) => ( { - block: select( 'core/block-editor' ).getBlock( clientId ), - } ), [ clientId ] ); + const { block } = useSelect( + ( select ) => ( { + block: select( 'core/block-editor' ).getBlock( clientId ), + } ), + [ clientId ] + ); const { updateBlock } = useDispatch( 'core/block-editor' ); const onChange = () => { const blockType = getBlockType( block.name ); - const attributes = getBlockAttributes( blockType, html, block.attributes ); + const attributes = getBlockAttributes( + blockType, + html, + block.attributes + ); // If html is empty we reset the block to the default HTML and mark it as valid to avoid triggering an error const content = html ? html : getSaveContent( blockType, attributes ); - const isValid = html ? isValidBlockContent( blockType, attributes, content ) : true; + const isValid = html + ? isValidBlockContent( blockType, attributes, content ) + : true; - updateBlock( clientId, { attributes, originalContent: content, isValid } ); + updateBlock( clientId, { + attributes, + originalContent: content, + isValid, + } ); // Ensure the state is updated if we reset so it displays the default content if ( ! html ) { diff --git a/packages/block-editor/src/components/block-list/block-invalid-warning.js b/packages/block-editor/src/components/block-list/block-invalid-warning.js index 0a541263bbb36..1fa98168e96ed 100644 --- a/packages/block-editor/src/components/block-list/block-invalid-warning.js +++ b/packages/block-editor/src/components/block-list/block-invalid-warning.js @@ -4,11 +4,7 @@ import { __, _x } from '@wordpress/i18n'; import { Button, Modal } from '@wordpress/components'; import { Component } from '@wordpress/element'; -import { - getBlockType, - createBlock, - rawHandler, -} from '@wordpress/blocks'; +import { getBlockType, createBlock, rawHandler } from '@wordpress/blocks'; import { compose } from '@wordpress/compose'; import { withDispatch, withSelect } from '@wordpress/data'; @@ -36,33 +32,54 @@ export class BlockInvalidWarning extends Component { } render() { - const { convertToHTML, convertToBlocks, convertToClassic, attemptBlockRecovery, block } = this.props; + const { + convertToHTML, + convertToBlocks, + convertToClassic, + attemptBlockRecovery, + block, + } = this.props; const hasHTMLBlock = !! getBlockType( 'core/html' ); const { compare } = this.state; const hiddenActions = [ - { title: __( 'Convert to Classic Block' ), onClick: convertToClassic }, - { title: __( 'Attempt Block Recovery' ), onClick: attemptBlockRecovery }, + { + title: __( 'Convert to Classic Block' ), + onClick: convertToClassic, + }, + { + title: __( 'Attempt Block Recovery' ), + onClick: attemptBlockRecovery, + }, ]; return ( <> - { - // translators: Button to fix block content - _x( 'Resolve', 'imperative verb' ) - } + , hasHTMLBlock && ( - ), ] } secondaryActions={ hiddenActions } > - { __( 'This block contains unexpected or invalid content.' ) } + { __( + 'This block contains unexpected or invalid content.' + ) } { compare && ( createBlock( 'core/freeform', { - content: block.originalContent, -} ); -const blockToHTML = ( block ) => createBlock( 'core/html', { - content: block.originalContent, -} ); -const blockToBlocks = ( block ) => rawHandler( { - HTML: block.originalContent, -} ); -const recoverBlock = ( { name, attributes, innerBlocks } ) => createBlock( name, attributes, innerBlocks ); +const blockToClassic = ( block ) => + createBlock( 'core/freeform', { + content: block.originalContent, + } ); +const blockToHTML = ( block ) => + createBlock( 'core/html', { + content: block.originalContent, + } ); +const blockToBlocks = ( block ) => + rawHandler( { + HTML: block.originalContent, + } ); +const recoverBlock = ( { name, attributes, innerBlocks } ) => + createBlock( name, attributes, innerBlocks ); export default compose( [ withSelect( ( select, { clientId } ) => ( { 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 index 08edb75976fba..be93d313342ad 100644 --- 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 @@ -11,10 +11,7 @@ import styles from './block-mobile-floating-toolbar.scss'; const FloatingToolbar = ( { children } ) => { return ( - { children } - + { children } ); }; 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 cb563c3319f21..2a70b80c2dafa 100644 --- a/packages/block-editor/src/components/block-list/block-popover.js +++ b/packages/block-editor/src/components/block-list/block-popover.js @@ -7,7 +7,7 @@ import classnames from 'classnames'; /** * WordPress dependencies */ -import { useState, useCallback } from '@wordpress/element'; +import { useState, useCallback, useContext } from '@wordpress/element'; import { isUnmodifiedDefaultBlock } from '@wordpress/blocks'; import { Popover } from '@wordpress/components'; import { useSelect } from '@wordpress/data'; @@ -20,6 +20,7 @@ import { useViewportMatch } from '@wordpress/compose'; import BlockBreadcrumb from './breadcrumb'; import BlockContextualToolbar from './block-contextual-toolbar'; import Inserter from '../inserter'; +import { BlockNodes } from './root-container'; function selector( select ) { const { @@ -29,6 +30,7 @@ function selector( select ) { isTyping, isCaretWithinFormattedText, getSettings, + getLastMultiSelectedBlockClientId, } = select( 'core/block-editor' ); return { isNavigationMode: isNavigationMode(), @@ -37,6 +39,7 @@ function selector( select ) { isCaretWithinFormattedText: isCaretWithinFormattedText(), hasMultiSelection: hasMultiSelection(), hasFixedToolbar: getSettings().hasFixedToolbar, + lastClientId: getLastMultiSelectedBlockClientId(), }; } @@ -57,12 +60,15 @@ function BlockPopover( { isCaretWithinFormattedText, hasMultiSelection, hasFixedToolbar, + lastClientId, } = useSelect( selector, [] ); const isLargeViewport = useViewportMatch( 'medium' ); const [ isToolbarForced, setIsToolbarForced ] = useState( false ); const [ isInserterShown, setIsInserterShown ] = useState( false ); + const [ blockNodes ] = useContext( BlockNodes ); - const showEmptyBlockSideInserter = ! isNavigationMode && isEmptyDefaultBlock && isValid; + const showEmptyBlockSideInserter = + ! isNavigationMode && isEmptyDefaultBlock && isValid; const shouldShowBreadcrumb = isNavigationMode; const shouldShowContextualToolbar = ! isNavigationMode && @@ -80,7 +86,11 @@ function BlockPopover( { useShortcut( 'core/block-editor/focus-toolbar', useCallback( () => setIsToolbarForced( true ), [] ), - { bindGlobal: true, eventName: 'keydown', isDisabled: ! canFocusHiddenToolbar } + { + bindGlobal: true, + eventName: 'keydown', + isDisabled: ! canFocusHiddenToolbar, + } ); if ( @@ -92,7 +102,11 @@ function BlockPopover( { return null; } - let node = document.getElementById( 'block-' + capturingClientId ); + let node = blockNodes[ clientId ]; + + if ( capturingClientId ) { + node = document.getElementById( 'block-' + capturingClientId ); + } if ( ! node ) { return null; @@ -103,6 +117,23 @@ function BlockPopover( { node = node.querySelector( '.is-block-content' ) || node; } + let anchorRef = node; + + if ( hasMultiSelection ) { + const bottomNode = blockNodes[ lastClientId ]; + + // Wait to render the popover until the bottom reference is available + // as well. + if ( ! bottomNode ) { + return null; + } + + anchorRef = { + top: node, + bottom: bottomNode, + }; + } + function onFocus() { setIsInserterShown( true ); } @@ -115,8 +146,9 @@ function BlockPopover( { // left corner. For the side inserter, pop out towards the left, and // position in the right corner. // To do: refactor `Popover` to make this prop clearer. - const popoverPosition = showEmptyBlockSideInserter ? 'top left right' : 'top right left'; - const popoverIsSticky = hasMultiSelection ? '.wp-block.is-multi-selected' : true; + const popoverPosition = showEmptyBlockSideInserter + ? 'top left right' + : 'top right left'; return ( setIsToolbarForced( false ) } shouldAnchorIncludePadding > @@ -147,10 +183,15 @@ function BlockPopover( { tabIndex={ -1 } className={ classnames( 'block-editor-block-list__block-popover-inserter', - { 'is-visible': isInserterShown } + { + 'is-visible': isInserterShown, + } ) } > - +
        ) } { ( shouldShowContextualToolbar || isToolbarForced ) && ( @@ -188,46 +229,56 @@ function wrapperSelector( select ) { getSelectedBlockClientId, getFirstMultiSelectedBlockClientId, getBlockRootClientId, - __unstableGetSelectedMountedBlock, __unstableGetBlockWithoutInnerBlocks, getBlockParents, getBlockListSettings, __experimentalGetBlockListSettingsForBlocks, } = select( 'core/block-editor' ); - const clientId = getSelectedBlockClientId() || getFirstMultiSelectedBlockClientId(); + const clientId = + getSelectedBlockClientId() || getFirstMultiSelectedBlockClientId(); if ( ! clientId ) { return; } const rootClientId = getBlockRootClientId( clientId ); - const { name, attributes = {}, isValid } = __unstableGetBlockWithoutInnerBlocks( clientId ) || {}; + const { name, attributes = {}, isValid } = + __unstableGetBlockWithoutInnerBlocks( clientId ) || {}; const blockParentsClientIds = getBlockParents( clientId ); - const { __experimentalMoverDirection } = getBlockListSettings( rootClientId ) || {}; + const { __experimentalMoverDirection } = + getBlockListSettings( rootClientId ) || {}; // Get Block List Settings for all ancestors of the current Block clientId - const ancestorBlockListSettings = __experimentalGetBlockListSettingsForBlocks( blockParentsClientIds ); + const ancestorBlockListSettings = __experimentalGetBlockListSettingsForBlocks( + blockParentsClientIds + ); // Find the index of the first Block with the `captureDescendantsToolbars` prop defined // This will be the top most ancestor because getBlockParents() returns tree from top -> bottom - const topmostAncestorWithCaptureDescendantsToolbarsIndex = findIndex( ancestorBlockListSettings, [ '__experimentalCaptureToolbars', true ] ); + const topmostAncestorWithCaptureDescendantsToolbarsIndex = findIndex( + ancestorBlockListSettings, + [ '__experimentalCaptureToolbars', true ] + ); - let capturingClientId = clientId; + let capturingClientId; if ( topmostAncestorWithCaptureDescendantsToolbarsIndex !== -1 ) { - capturingClientId = blockParentsClientIds[ topmostAncestorWithCaptureDescendantsToolbarsIndex ]; + capturingClientId = + blockParentsClientIds[ + topmostAncestorWithCaptureDescendantsToolbarsIndex + ]; } return { clientId, rootClientId: getBlockRootClientId( clientId ), - isMounted: __unstableGetSelectedMountedBlock() === clientId, name, align: attributes.align, isValid, moverDirection: __experimentalMoverDirection, - isEmptyDefaultBlock: name && isUnmodifiedDefaultBlock( { name, attributes } ), + isEmptyDefaultBlock: + name && isUnmodifiedDefaultBlock( { name, attributes } ), capturingClientId, }; } @@ -242,7 +293,6 @@ export default function WrappedBlockPopover() { const { clientId, rootClientId, - isMounted, name, align, isValid, @@ -251,7 +301,7 @@ export default function WrappedBlockPopover() { capturingClientId, } = selected; - if ( ! name || ! isMounted ) { + if ( ! name ) { return null; } diff --git a/packages/block-editor/src/components/block-list/block.js b/packages/block-editor/src/components/block-list/block.js index 19958b7ae884b..3fb84e824f108 100644 --- a/packages/block-editor/src/components/block-list/block.js +++ b/packages/block-editor/src/components/block-list/block.js @@ -2,18 +2,20 @@ * External dependencies */ import classnames from 'classnames'; -import { first, last } from 'lodash'; +import { first, last, omit } from 'lodash'; import { animated } from 'react-spring/web.cjs'; /** * WordPress dependencies */ -import { useRef, useEffect, useLayoutEffect, useState, useContext } from '@wordpress/element'; import { - focus, - isTextField, - placeCaretAtHorizontalEdge, -} from '@wordpress/dom'; + useRef, + useEffect, + useLayoutEffect, + useState, + useContext, +} from '@wordpress/element'; +import { focus, isTextField, placeCaretAtHorizontalEdge } from '@wordpress/dom'; import { BACKSPACE, DELETE, ENTER } from '@wordpress/keycodes'; import { getBlockType, @@ -24,12 +26,7 @@ import { } from '@wordpress/blocks'; import { withFilters } from '@wordpress/components'; import { __, sprintf } from '@wordpress/i18n'; -import { - withDispatch, - withSelect, - useSelect, - useDispatch, -} from '@wordpress/data'; +import { withDispatch, withSelect, useSelect } from '@wordpress/data'; import { withViewportMatch } from '@wordpress/viewport'; import { compose, pure, ifCondition } from '@wordpress/compose'; @@ -43,7 +40,7 @@ import BlockCrashBoundary from './block-crash-boundary'; import BlockHtml from './block-html'; import { isInsideRootBlock } from '../../utils/dom'; import useMovingAnimation from './moving-animation'; -import { Context } from './root-container'; +import { Context, BlockNodes } from './root-container'; function BlockListBlock( { mode, @@ -54,6 +51,7 @@ function BlockListBlock( { isMultiSelected, isPartOfMultiSelection, isFirstMultiSelected, + isLastMultiSelected, isTypingWithinBlock, isEmptyDefaultBlock, isAncestorOfSelectedBlock, @@ -78,6 +76,7 @@ function BlockListBlock( { hasSelectedUI = true, } ) { const onSelectionStart = useContext( Context ); + const [ , setBlockNodes ] = useContext( BlockNodes ); // In addition to withSelect, we should favor using useSelect in this component going forward // to avoid leaking new props to the public API (editor.BlockListBlock filter) const { isDraggingBlocks } = useSelect( ( select ) => { @@ -85,28 +84,31 @@ function BlockListBlock( { isDraggingBlocks: select( 'core/block-editor' ).isDraggingBlocks(), }; }, [] ); - const { - __unstableSetSelectedMountedBlock, - } = useDispatch( 'core/block-editor' ); // Reference of the wrapper const wrapper = useRef( null ); + // Provide the selected node, or the first and last nodes of a multi- + // selection, so it can be used to position the contextual block toolbar. + // We only provide what is necessary, and remove the nodes again when they + // are no longer selected. useLayoutEffect( () => { - if ( isSelected || isFirstMultiSelected ) { - __unstableSetSelectedMountedBlock( clientId ); + if ( isSelected || isFirstMultiSelected || isLastMultiSelected ) { + const node = wrapper.current; + setBlockNodes( ( nodes ) => ( { ...nodes, [ clientId ]: node } ) ); + return () => { + setBlockNodes( ( nodes ) => omit( nodes, clientId ) ); + }; } - }, [ isSelected, isFirstMultiSelected ] ); + }, [ isSelected, isFirstMultiSelected, isLastMultiSelected ] ); // Handling the error state const [ hasError, setErrorState ] = useState( false ); const onBlockError = () => setErrorState( true ); const blockType = getBlockType( name ); - const blockLabel = isFirstMultiSelected ? - __( 'Multiple selected blocks' ) : - // translators: %s: Type of block (i.e. Text, Image etc) - sprintf( __( 'Block: %s' ), blockType.title ); + // translators: %s: Type of block (i.e. Text, Image etc) + const blockLabel = sprintf( __( 'Block: %s' ), blockType.title ); // Handing the focus of the block on creation and update @@ -129,7 +131,11 @@ function BlockListBlock( { .find( wrapper.current ) .filter( isTextField ) // Exclude inner blocks - .filter( ( node ) => ! ignoreInnerBlocks || isInsideRootBlock( wrapper.current, node ) ); + .filter( + ( node ) => + ! ignoreInnerBlocks || + isInsideRootBlock( wrapper.current, node ) + ); // If reversed (e.g. merge via backspace), use the last in the set of // tabbables. @@ -148,24 +154,21 @@ function BlockListBlock( { const isMounting = useRef( true ); useEffect( () => { - if ( ! isMultiSelecting && ! isNavigationMode ) { - if ( isSelected ) { - focusTabbable( ! isMounting.current ); - } else if ( isFirstMultiSelected ) { - wrapper.current.focus(); - } + if ( ! isMultiSelecting && ! isNavigationMode && isSelected ) { + focusTabbable( ! isMounting.current ); } isMounting.current = false; - }, [ - isSelected, - isFirstMultiSelected, - isMultiSelecting, - isNavigationMode, - ] ); + }, [ isSelected, isMultiSelecting, isNavigationMode ] ); // Block Reordering animation - const animationStyle = useMovingAnimation( wrapper, isSelected || isPartOfMultiSelection, isSelected || isFirstMultiSelected, enableAnimation, animateOnChange ); + const animationStyle = useMovingAnimation( + wrapper, + isSelected || isPartOfMultiSelection, + isSelected || isFirstMultiSelected, + enableAnimation, + animateOnChange + ); // Other event handlers @@ -215,14 +218,16 @@ function BlockListBlock( { // If the block is selected and we're typing the block should not appear. // Empty paragraph blocks should always show up as unselected. - const showEmptyBlockSideInserter = ! isNavigationMode && isSelected && isEmptyDefaultBlock && isValid; + const showEmptyBlockSideInserter = + ! isNavigationMode && isSelected && isEmptyDefaultBlock && isValid; const shouldAppearSelected = ! isFocusMode && ! showEmptyBlockSideInserter && isSelected && ! isTypingWithinBlock; - const isDragging = isDraggingBlocks && ( isSelected || isPartOfMultiSelection ); + const isDragging = + isDraggingBlocks && ( isSelected || isPartOfMultiSelection ); // Determine whether the block has props to apply to the wrapper. if ( blockType.getEditWrapperProps ) { @@ -242,12 +247,12 @@ function BlockListBlock( { 'has-selected-ui': hasSelectedUI, 'has-warning': ! isValid || !! hasError || isUnregisteredBlock, 'is-selected': shouldAppearSelected && hasSelectedUI, - 'is-navigate-mode': isNavigationMode, 'is-multi-selected': isMultiSelected, 'is-reusable': isReusableBlock( blockType ), 'is-dragging': isDragging, 'is-typing': isTypingWithinBlock, - 'is-focused': isFocusMode && ( isSelected || isAncestorOfSelectedBlock ), + 'is-focused': + isFocusMode && ( isSelected || isAncestorOfSelectedBlock ), 'is-focus-mode': isFocusMode, 'has-child-selected': isAncestorOfSelectedBlock, 'is-block-collapsed': isAligned, @@ -303,12 +308,12 @@ function BlockListBlock( { role="group" { ...wrapperProps } style={ - wrapperProps && wrapperProps.style ? - { - ...wrapperProps.style, - ...animationStyle, - } : - animationStyle + wrapperProps && wrapperProps.style + ? { + ...wrapperProps.style, + ...animationStyle, + } + : animationStyle } > @@ -338,6 +343,7 @@ const applyWithSelect = withSelect( isAncestorMultiSelected, isBlockMultiSelected, isFirstMultiSelectedBlock, + getLastMultiSelectedBlockClientId, isTyping, getBlockMode, isSelectionEnabled, @@ -356,7 +362,10 @@ const applyWithSelect = withSelect( const checkDeep = true; // "ancestor" is the more appropriate label due to "deep" check - const isAncestorOfSelectedBlock = hasSelectedInnerBlock( clientId, checkDeep ); + const isAncestorOfSelectedBlock = hasSelectedInnerBlock( + clientId, + checkDeep + ); // The fallback to `{}` is a temporary fix. // This function should never be called when a block is not present in the state. @@ -366,8 +375,11 @@ const applyWithSelect = withSelect( return { isMultiSelected: isBlockMultiSelected( clientId ), isPartOfMultiSelection: - isBlockMultiSelected( clientId ) || isAncestorMultiSelected( clientId ), + isBlockMultiSelected( clientId ) || + isAncestorMultiSelected( clientId ), isFirstMultiSelected: isFirstMultiSelectedBlock( clientId ), + isLastMultiSelected: + getLastMultiSelectedBlockClientId() === clientId, // We only care about this prop when the block is selected // Thus to avoid unnecessary rerenders we avoid updating the prop if the block is not selected. @@ -376,7 +388,9 @@ const applyWithSelect = withSelect( mode: getBlockMode( clientId ), isSelectionEnabled: isSelectionEnabled(), - initialPosition: isSelected ? getSelectedBlocksInitialCaretPosition() : null, + initialPosition: isSelected + ? getSelectedBlocksInitialCaretPosition() + : null, isEmptyDefaultBlock: name && isUnmodifiedDefaultBlock( { name, attributes } ), isLocked: !! templateLock, @@ -421,17 +435,13 @@ const applyWithDispatch = withDispatch( ( dispatch, ownProps, { select } ) => { }, onInsertDefaultBlockAfter() { const { clientId, rootClientId } = ownProps; - const { - getBlockIndex, - } = select( 'core/block-editor' ); + const { getBlockIndex } = select( 'core/block-editor' ); const index = getBlockIndex( clientId, rootClientId ); insertDefaultBlock( {}, rootClientId, index + 1 ); }, onInsertBlocksAfter( blocks ) { const { clientId, rootClientId } = ownProps; - const { - getBlockIndex, - } = select( 'core/block-editor' ); + const { getBlockIndex } = select( 'core/block-editor' ); const index = getBlockIndex( clientId, rootClientId ); insertBlocks( blocks, index + 1, rootClientId ); }, @@ -440,10 +450,9 @@ const applyWithDispatch = withDispatch( ( dispatch, ownProps, { select } ) => { }, onMerge( forward ) { const { clientId } = ownProps; - const { - getPreviousBlockClientId, - getNextBlockClientId, - } = select( 'core/block-editor' ); + const { getPreviousBlockClientId, getNextBlockClientId } = select( + 'core/block-editor' + ); if ( forward ) { const nextBlockClientId = getNextBlockClientId( clientId ); @@ -451,7 +460,9 @@ const applyWithDispatch = withDispatch( ( dispatch, ownProps, { select } ) => { mergeBlocks( clientId, nextBlockClientId ); } } else { - const previousBlockClientId = getPreviousBlockClientId( clientId ); + const previousBlockClientId = getPreviousBlockClientId( + clientId + ); if ( previousBlockClientId ) { mergeBlocks( previousBlockClientId, clientId ); } 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 ee70886738af9..9092826676b3d 100644 --- a/packages/block-editor/src/components/block-list/block.native.js +++ b/packages/block-editor/src/components/block-list/block.native.js @@ -1,11 +1,7 @@ /** * External dependencies */ -import { - View, - Text, - TouchableWithoutFeedback, -} from 'react-native'; +import { View, Text, TouchableWithoutFeedback } from 'react-native'; /** * WordPress dependencies @@ -67,7 +63,9 @@ class BlockListBlock extends Component { onReplace={ this.props.onReplace } insertBlocksAfter={ this.insertBlocksAfter } mergeBlocks={ this.props.mergeBlocks } - onCaretVerticalPositionChange={ this.props.onCaretVerticalPositionChange } + onCaretVerticalPositionChange={ + this.props.onCaretVerticalPositionChange + } clientId={ this.props.clientId } /> ); @@ -89,13 +87,18 @@ class BlockListBlock extends Component { isRootListInnerBlockHolder, } = this.props; - const fullSolidBorderStyle = { // define style for full border + const fullSolidBorderStyle = { + // define style for full border ...styles.fullSolidBordered, - ...getStylesFromColorScheme( styles.solidBorderColor, styles.solidBorderColorDark ), + ...getStylesFromColorScheme( + styles.solidBorderColor, + styles.solidBorderColorDark + ), }; - if ( hasChildren ) { // if block has children apply style for selected parent - return { ...styles.selectedParent, ...fullSolidBorderStyle }; + if ( hasChildren ) { + // if block has children apply style for selected parent + return { ...styles.selectedParent, ...fullSolidBorderStyle }; } // apply semi border selected style when screen is in vertical position @@ -130,20 +133,26 @@ class BlockListBlock extends Component { return hasChildren ? styles.neutral : styles.full; } - if ( isParentSelected ) { // parent of a block is selected - const dashedBorderStyle = { // define style for dashed border + if ( isParentSelected ) { + // parent of a block is selected + const dashedBorderStyle = { + // define style for dashed border ...styles.dashedBordered, - ...getStylesFromColorScheme( styles.dashedBorderColor, styles.dashedBorderColorDark ), + ...getStylesFromColorScheme( + styles.dashedBorderColor, + styles.dashedBorderColorDark + ), }; // return apply childOfSelected or childOfSelectedLeaf // margins depending if block has children or not - return hasChildren ? - { ...styles.childOfSelected, ...dashedBorderStyle } : - { ...styles.childOfSelectedLeaf, ...dashedBorderStyle }; + return hasChildren + ? { ...styles.childOfSelected, ...dashedBorderStyle } + : { ...styles.childOfSelectedLeaf, ...dashedBorderStyle }; } - if ( isAncestorSelected ) { // ancestor of a block is selected + if ( isAncestorSelected ) { + // ancestor of a block is selected return { ...styles.descendantOfSelectedLeaf, ...( hasChildren && styles.marginHorizontalNone ), @@ -156,22 +165,18 @@ class BlockListBlock extends Component { } applyBlockStyle() { - const { - isSelected, - isDimmed, - } = this.props; + const { isSelected, isDimmed } = this.props; return [ - isSelected ? this.applySelectedBlockStyle() : this.applyUnSelectedBlockStyle(), + isSelected + ? this.applySelectedBlockStyle() + : this.applyUnSelectedBlockStyle(), isDimmed && styles.dimmed, ]; } applyToolbarStyle() { - const { - hasChildren, - isUnregisteredBlock, - } = this.props; + const { hasChildren, isUnregisteredBlock } = this.props; if ( ! hasChildren || isUnregisteredBlock ) { return styles.neutralToolbar; @@ -193,23 +198,29 @@ class BlockListBlock extends Component { isTouchable, } = this.props; - const accessibilityLabel = getAccessibleBlockLabel( blockType, attributes, order + 1 ); + const accessibilityLabel = getAccessibleBlockLabel( + blockType, + attributes, + order + 1 + ); return ( <> - { showFloatingToolbar && - ( + { showFloatingToolbar && ( + this.props.onSelect( parentId ) } + onClick={ () => + this.props.onSelect( parentId ) + } icon={ NavigateUpSVG } /> - ) } + ) } - { isValid ? this.getBlockForType() : } - { isSelected && } + { isValid ? ( + this.getBlockForType() + ) : ( + + ) } + + { isSelected && ( + + ) } + @@ -245,9 +267,7 @@ export default compose( [ getBlockCount, } = select( 'core/block-editor' ); - const { - getGroupingBlockName, - } = select( 'core/blocks' ); + const { getGroupingBlockName } = select( 'core/blocks' ); const order = getBlockIndex( clientId, rootClientId ); const isSelected = isBlockSelected( clientId ); @@ -271,24 +291,47 @@ export default compose( [ const selectedBlockClientId = getSelectedBlockClientId(); - const commonAncestor = getLowestCommonAncestorWithSelectedBlock( clientId ); + const commonAncestor = getLowestCommonAncestorWithSelectedBlock( + clientId + ); const commonAncestorIndex = parents.indexOf( commonAncestor ) - 1; - const firstToSelectId = commonAncestor ? parents[ commonAncestorIndex ] : parents[ parents.length - 1 ]; + const firstToSelectId = commonAncestor + ? parents[ commonAncestorIndex ] + : parents[ parents.length - 1 ]; - const hasChildren = ! isUnregisteredBlock && !! getBlockCount( clientId ); + const hasChildren = + ! isUnregisteredBlock && !! getBlockCount( clientId ); const hasParent = !! parentId; - const isParentSelected = selectedBlockClientId && selectedBlockClientId === parentId; - const isAncestorSelected = selectedBlockClientId && parents.includes( selectedBlockClientId ); - const isSelectedBlockNested = !! getBlockRootClientId( selectedBlockClientId ); + const isParentSelected = + selectedBlockClientId && selectedBlockClientId === parentId; + const isAncestorSelected = + selectedBlockClientId && parents.includes( selectedBlockClientId ); + const isSelectedBlockNested = !! getBlockRootClientId( + selectedBlockClientId + ); - const selectedParents = selectedBlockClientId ? getBlockParents( selectedBlockClientId ) : []; + const selectedParents = selectedBlockClientId + ? getBlockParents( selectedBlockClientId ) + : []; const isDescendantSelected = selectedParents.includes( clientId ); - const isDescendantOfParentSelected = selectedParents.includes( parentId ); - const isTouchable = isSelected || isDescendantOfParentSelected || isParentSelected || parentId === ''; - const isDimmed = ! isSelected && isSelectedBlockNested && ! isAncestorSelected && ! isDescendantSelected && ( isDescendantOfParentSelected || rootBlockId === clientId ); + const isDescendantOfParentSelected = selectedParents.includes( + parentId + ); + const isTouchable = + isSelected || + isDescendantOfParentSelected || + isParentSelected || + parentId === ''; + const isDimmed = + ! isSelected && + isSelectedBlockNested && + ! isAncestorSelected && + ! isDescendantSelected && + ( isDescendantOfParentSelected || rootBlockId === clientId ); const isInnerBlockHolder = name === getGroupingBlockName(); - const isRootListInnerBlockHolder = ! isSelectedBlockNested && isInnerBlockHolder; + const isRootListInnerBlockHolder = + ! isSelectedBlockNested && isInnerBlockHolder; return { icon, @@ -336,7 +379,9 @@ export default compose( [ mergeBlocks( clientId, nextBlockClientId ); } } else { - const previousBlockClientId = getPreviousBlockClientId( clientId ); + const previousBlockClientId = getPreviousBlockClientId( + clientId + ); if ( previousBlockClientId ) { mergeBlocks( previousBlockClientId, clientId ); } diff --git a/packages/block-editor/src/components/block-list/breadcrumb.js b/packages/block-editor/src/components/block-list/breadcrumb.js index 2f0c4f28bd918..a47db75152663 100644 --- a/packages/block-editor/src/components/block-list/breadcrumb.js +++ b/packages/block-editor/src/components/block-list/breadcrumb.js @@ -25,21 +25,30 @@ import BlockTitle from '../block-title'; * * @return {WPComponent} The component to be rendered. */ -function BlockBreadcrumb( { clientId, rootClientId, moverDirection, ...props } ) { - const selected = useSelect( ( select ) => { - const { - __unstableGetBlockWithoutInnerBlocks, - getBlockIndex, - } = select( 'core/block-editor' ); - const index = getBlockIndex( clientId, rootClientId ); - const { name, attributes } = __unstableGetBlockWithoutInnerBlocks( clientId ); - return { index, name, attributes }; - }, [ clientId, rootClientId ] ); +function BlockBreadcrumb( { + clientId, + rootClientId, + moverDirection, + ...props +} ) { + const selected = useSelect( + ( select ) => { + const { + __unstableGetBlockWithoutInnerBlocks, + getBlockIndex, + } = select( 'core/block-editor' ); + const index = getBlockIndex( clientId, rootClientId ); + const { name, attributes } = __unstableGetBlockWithoutInnerBlocks( + clientId + ); + return { index, name, attributes }; + }, + [ clientId, rootClientId ] + ); const { index, name, attributes } = selected; - const { - setNavigationMode, - removeBlock, - } = useDispatch( 'core/block-editor' ); + const { setNavigationMode, removeBlock } = useDispatch( + 'core/block-editor' + ); const ref = useRef(); // Focus the breadcrumb in navigation mode. @@ -57,7 +66,12 @@ function BlockBreadcrumb( { clientId, rootClientId, moverDirection, ...props } ) } const blockType = getBlockType( name ); - const label = getAccessibleBlockLabel( blockType, attributes, index + 1, moverDirection ); + const label = getAccessibleBlockLabel( + blockType, + attributes, + index + 1, + moverDirection + ); return (
        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 ae5d615f43b87..37d26abe1cff5 100644 --- a/packages/block-editor/src/components/block-list/breadcrumb.native.js +++ b/packages/block-editor/src/components/block-list/breadcrumb.native.js @@ -19,20 +19,40 @@ import SubdirectorSVG from './subdirectory-icon'; import styles from './breadcrumb.scss'; -const BlockBreadcrumb = ( { clientId, blockIcon, rootClientId, rootBlockIcon } ) => { +const BlockBreadcrumb = ( { + clientId, + blockIcon, + rootClientId, + rootBlockIcon, +} ) => { return ( {/* Open BottomSheet with markup */} } - disabled={ true } /* Disable temporarily since onPress function is empty */ + onPress={ () => { + /* Open BottomSheet with markup */ + } } + disabled={ + true + } /* Disable temporarily since onPress function is empty */ > - { rootClientId && rootBlockIcon && ( - [ , - , - ] - ) } - + { rootClientId && + rootBlockIcon && [ + , + + + , + ] } + { - const { - getBlockRootClientId, - getBlockName, - } = select( 'core/block-editor' ); + const { getBlockRootClientId, getBlockName } = select( + 'core/block-editor' + ); const blockName = getBlockName( clientId ); const blockType = getBlockType( blockName ); diff --git a/packages/block-editor/src/components/block-list/index.js b/packages/block-editor/src/components/block-list/index.js index 1fd0f8afa9fc5..ffb5320faa1aa 100644 --- a/packages/block-editor/src/components/block-list/index.js +++ b/packages/block-editor/src/components/block-list/index.js @@ -56,10 +56,9 @@ function BlockList( { selectedBlockClientId: getSelectedBlockClientId(), multiSelectedBlockClientIds: getMultiSelectedBlockClientIds(), hasMultiSelection: hasMultiSelection(), - enableAnimation: ( + enableAnimation: ! isTyping() && - getGlobalBlockCount() <= BLOCK_ANIMATION_THRESHOLD - ), + getGlobalBlockCount() <= BLOCK_ANIMATION_THRESHOLD, }; } @@ -88,12 +87,15 @@ function BlockList( { ) } > { blockClientIds.map( ( clientId, index ) => { - const isBlockInSelection = hasMultiSelection ? - multiSelectedBlockClientIds.includes( clientId ) : - selectedBlockClientId === clientId; + const isBlockInSelection = hasMultiSelection + ? multiSelectedBlockClientIds.includes( clientId ) + : selectedBlockClientId === clientId; return ( - + ); @@ -113,7 +121,9 @@ function BlockList( { <__experimentalBlockListFooter.Slot /> diff --git a/packages/block-editor/src/components/block-list/index.native.js b/packages/block-editor/src/components/block-list/index.native.js index a936cd64a2870..c3e39232598e8 100644 --- a/packages/block-editor/src/components/block-list/index.native.js +++ b/packages/block-editor/src/components/block-list/index.native.js @@ -10,8 +10,11 @@ import { View, Platform, TouchableWithoutFeedback } from 'react-native'; import { Component } from '@wordpress/element'; import { withDispatch, withSelect } from '@wordpress/data'; import { compose, withPreferredColorScheme } from '@wordpress/compose'; -import { createBlock, isUnmodifiedDefaultBlock } from '@wordpress/blocks'; -import { KeyboardAwareFlatList, ReadableContentView } from '@wordpress/components'; +import { createBlock } from '@wordpress/blocks'; +import { + KeyboardAwareFlatList, + ReadableContentView, +} from '@wordpress/components'; /** * Internal dependencies @@ -30,11 +33,20 @@ export class BlockList extends Component { this.renderItem = this.renderItem.bind( this ); this.renderBlockListFooter = this.renderBlockListFooter.bind( this ); - this.renderDefaultBlockAppender = this.renderDefaultBlockAppender.bind( this ); - this.onCaretVerticalPositionChange = this.onCaretVerticalPositionChange.bind( this ); + this.renderDefaultBlockAppender = this.renderDefaultBlockAppender.bind( + this + ); + this.onCaretVerticalPositionChange = this.onCaretVerticalPositionChange.bind( + this + ); this.scrollViewInnerRef = this.scrollViewInnerRef.bind( this ); this.addBlockToEndOfPost = this.addBlockToEndOfPost.bind( this ); - this.shouldFlatListPreventAutomaticScroll = this.shouldFlatListPreventAutomaticScroll.bind( this ); + this.shouldFlatListPreventAutomaticScroll = this.shouldFlatListPreventAutomaticScroll.bind( + this + ); + this.shouldShowInnerBlockAppender = this.shouldShowInnerBlockAppender.bind( + this + ); } addBlockToEndOfPost( newBlock ) { @@ -42,7 +54,12 @@ export class BlockList extends Component { } onCaretVerticalPositionChange( targetId, caretY, previousCaretY ) { - KeyboardAwareFlatList.handleCaretVerticalPositionChange( this.scrollViewRef, targetId, caretY, previousCaretY ); + KeyboardAwareFlatList.handleCaretVerticalPositionChange( + this.scrollViewRef, + targetId, + caretY, + previousCaretY + ); } scrollViewInnerRef( ref ) { @@ -58,7 +75,7 @@ export class BlockList extends Component { const willShowInsertionPoint = shouldShowInsertionPointBefore(); // call without the client_id argument since this is the appender return ( - 0; + } + render() { const { clearSelectedBlock, @@ -75,7 +97,6 @@ export class BlockList extends Component { title, header, withFooter = true, - renderAppender, isReadOnly, isRootList, } = this.props; @@ -86,7 +107,9 @@ export class BlockList extends Component { onAccessibilityEscape={ clearSelectedBlock } > - { renderAppender && blockClientIds.length > 0 && ( + { this.shouldShowInnerBlockAppender() && ( - ) - } - + ) } ); } - isReplaceable( block ) { - if ( ! block ) { - return false; - } - return isUnmodifiedDefaultBlock( block ); - } - - renderItem( { item: clientId, index } ) { + renderItem( { item: clientId } ) { const { isReadOnly, - shouldShowBlockAtIndex, shouldShowInsertionPointBefore, shouldShowInsertionPointAfter, } = this.props; @@ -136,17 +156,23 @@ export class BlockList extends Component { return ( - { shouldShowInsertionPointBefore( clientId ) && } - { shouldShowBlockAtIndex( index ) && ( - ) } - { shouldShowInsertionPointAfter( clientId ) && } + { shouldShowInsertionPointBefore( clientId ) && ( + + ) } + + { ! this.shouldShowInnerBlockAppender() && + shouldShowInsertionPointAfter( clientId ) && ( + + ) } ); @@ -156,9 +182,11 @@ export class BlockList extends Component { const paragraphBlock = createBlock( 'core/paragraph' ); return ( <> - { - this.addBlockToEndOfPost( paragraphBlock ); - } } > + { + this.addBlockToEndOfPost( paragraphBlock ); + } } + > <__experimentalBlockListFooter.Slot /> @@ -171,70 +199,44 @@ export default compose( [ withSelect( ( select, { rootClientId } ) => { const { getBlockCount, - getBlockIndex, getBlockOrder, getSelectedBlockClientId, getBlockInsertionPoint, isBlockInsertionPointVisible, - getSelectedBlock, getSettings, } = select( 'core/block-editor' ); - const { - getGroupingBlockName, - } = select( 'core/blocks' ); - const selectedBlockClientId = getSelectedBlockClientId(); const blockClientIds = getBlockOrder( rootClientId ); const insertionPoint = getBlockInsertionPoint(); const blockInsertionPointIsVisible = isBlockInsertionPointVisible(); - const selectedBlock = getSelectedBlock(); - const hasInnerBlocks = selectedBlock && selectedBlock.name === getGroupingBlockName(); const shouldShowInsertionPointBefore = ( clientId ) => { return ( blockInsertionPointIsVisible && insertionPoint.rootClientId === rootClientId && - ( - // if list is empty, show the insertion point (via the default appender) - blockClientIds.length === 0 || + // if list is empty, show the insertion point (via the default appender) + ( blockClientIds.length === 0 || // or if the insertion point is right before the denoted block - blockClientIds[ insertionPoint.index ] === clientId - ) + blockClientIds[ insertionPoint.index ] === clientId ) ); }; const shouldShowInsertionPointAfter = ( clientId ) => { return ( blockInsertionPointIsVisible && insertionPoint.rootClientId === rootClientId && - // if the insertion point is at the end of the list blockClientIds.length === insertionPoint.index && - // and the denoted block is the last one on the list, show the indicator at the end of the block blockClientIds[ insertionPoint.index - 1 ] === clientId ); }; - const selectedBlockIndex = getBlockIndex( selectedBlockClientId, rootClientId ); - - const shouldShowBlockAtIndex = ( index ) => { - const shouldHideBlockAtIndex = ( - ! hasInnerBlocks && blockInsertionPointIsVisible && - // if `index` === `insertionPoint.index`, then block is replaceable - index === insertionPoint.index && - // only hide selected block - index === selectedBlockIndex - ); - return ! shouldHideBlockAtIndex; - }; - const isReadOnly = getSettings().readOnly; return { blockClientIds, blockCount: getBlockCount( rootClientId ), isBlockInsertionPointVisible: isBlockInsertionPointVisible(), - shouldShowBlockAtIndex, shouldShowInsertionPointBefore, shouldShowInsertionPointAfter, selectedBlockClientId, @@ -243,11 +245,9 @@ export default compose( [ }; } ), withDispatch( ( dispatch ) => { - const { - insertBlock, - replaceBlock, - clearSelectedBlock, - } = dispatch( 'core/block-editor' ); + const { insertBlock, replaceBlock, clearSelectedBlock } = dispatch( + 'core/block-editor' + ); return { clearSelectedBlock, diff --git a/packages/block-editor/src/components/block-list/insertion-point.js b/packages/block-editor/src/components/block-list/insertion-point.js index 80fdee37f18ff..11ef726060509 100644 --- a/packages/block-editor/src/components/block-list/insertion-point.js +++ b/packages/block-editor/src/components/block-list/insertion-point.js @@ -19,28 +19,33 @@ import { getClosestTabbable } from '../writing-flow'; import { getBlockDOMNode } from '../../utils/dom'; function Indicator( { clientId } ) { - const showInsertionPoint = useSelect( ( select ) => { - const { - getBlockIndex, - getBlockInsertionPoint, - isBlockInsertionPointVisible, - getBlockRootClientId, - } = select( 'core/block-editor' ); - const rootClientId = getBlockRootClientId( clientId ); - const blockIndex = getBlockIndex( clientId, rootClientId ); - const insertionPoint = getBlockInsertionPoint(); - return ( - isBlockInsertionPointVisible() && - insertionPoint.index === blockIndex && - insertionPoint.rootClientId === rootClientId - ); - }, [ clientId ] ); + const showInsertionPoint = useSelect( + ( select ) => { + const { + getBlockIndex, + getBlockInsertionPoint, + isBlockInsertionPointVisible, + getBlockRootClientId, + } = select( 'core/block-editor' ); + const rootClientId = getBlockRootClientId( clientId ); + const blockIndex = getBlockIndex( clientId, rootClientId ); + const insertionPoint = getBlockInsertionPoint(); + return ( + isBlockInsertionPointVisible() && + insertionPoint.index === blockIndex && + insertionPoint.rootClientId === rootClientId + ); + }, + [ clientId ] + ); if ( ! showInsertionPoint ) { return null; } - return
        ; + return ( +
        + ); } export default function InsertionPoint( { @@ -66,9 +71,11 @@ export default function InsertionPoint( { const rect = event.target.getBoundingClientRect(); const offset = event.clientY - rect.top; - const element = Array.from( event.target.children ).find( ( blockEl ) => { - return blockEl.offsetTop > offset; - } ); + const element = Array.from( event.target.children ).find( + ( blockEl ) => { + return blockEl.offsetTop > offset; + } + ); if ( ! element ) { return; @@ -82,7 +89,10 @@ export default function InsertionPoint( { const elementRect = element.getBoundingClientRect(); - if ( event.clientX > elementRect.right || event.clientX < elementRect.left ) { + if ( + event.clientX > elementRect.right || + event.clientX < elementRect.left + ) { if ( isInserterShown ) { setIsInserterShown( false ); } @@ -104,7 +114,7 @@ export default function InsertionPoint( { } const targetRect = target.getBoundingClientRect(); - const isReverse = clientY < targetRect.top + ( targetRect.height / 2 ); + const isReverse = clientY < targetRect.top + targetRect.height / 2; const blockNode = getBlockDOMNode( inserterClientId ); const container = isReverse ? containerRef.current : blockNode; const closest = getClosestTabbable( blockNode, true, container ); @@ -115,45 +125,61 @@ export default function InsertionPoint( { } } - return <> - { ! isMultiSelecting && ( isInserterShown || isInserterForced ) && -
        - - { /* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */ } -
        setIsInserterForced( true ) } - onBlur={ () => setIsInserterForced( false ) } - onClick={ focusClosestTabbable } - // While ideally it would be enough to capture the - // bubbling focus event from the Inserter, due to the - // characteristics of click focusing of `button`s in - // Firefox and Safari, it is not reliable. - // - // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus - tabIndex={ -1 } - className={ classnames( - 'block-editor-block-list__insertion-point-inserter', - { - // Hide the inserter above the selected block. - 'is-inserter-hidden': inserterClientId === selectedBlockClientId, - } - ) } + return ( + <> + { ! isMultiSelecting && ( isInserterShown || isInserterForced ) && ( + - -
        +
        + + { /* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */ } +
        setIsInserterForced( true ) } + onBlur={ () => setIsInserterForced( false ) } + onClick={ focusClosestTabbable } + // While ideally it would be enough to capture the + // bubbling focus event from the Inserter, due to the + // characteristics of click focusing of `button`s in + // Firefox and Safari, it is not reliable. + // + // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus + tabIndex={ -1 } + className={ classnames( + 'block-editor-block-list__insertion-point-inserter', + { + // Hide the inserter above the selected block. + 'is-inserter-hidden': + inserterClientId === + selectedBlockClientId, + } + ) } + > + +
        +
        + + ) } +
        + { children }
        - } -
        - { children } -
        - ; + + ); } diff --git a/packages/block-editor/src/components/block-list/insertion-point.native.js b/packages/block-editor/src/components/block-list/insertion-point.native.js index a9a2741514783..5f19827ba6840 100644 --- a/packages/block-editor/src/components/block-list/insertion-point.native.js +++ b/packages/block-editor/src/components/block-list/insertion-point.native.js @@ -15,13 +15,19 @@ import { withPreferredColorScheme } from '@wordpress/compose'; import styles from './style.scss'; const BlockInsertionPoint = ( { getStylesFromColorScheme } ) => { - const lineStyle = getStylesFromColorScheme( styles.lineStyleAddHere, styles.lineStyleAddHereDark ); - const labelStyle = getStylesFromColorScheme( styles.labelStyleAddHere, styles.labelStyleAddHereDark ); + const lineStyle = getStylesFromColorScheme( + styles.lineStyleAddHere, + styles.lineStyleAddHereDark + ); + const labelStyle = getStylesFromColorScheme( + styles.labelStyleAddHere, + styles.labelStyleAddHereDark + ); return ( - + - { __( 'ADD BLOCK HERE' ) } + { __( 'ADD BLOCK HERE' ) } ); diff --git a/packages/block-editor/src/components/block-list/moving-animation.js b/packages/block-editor/src/components/block-list/moving-animation.js index afa36bb40304d..6af4ba78ea634 100644 --- a/packages/block-editor/src/components/block-list/moving-animation.js +++ b/packages/block-editor/src/components/block-list/moving-animation.js @@ -6,7 +6,12 @@ import { useSpring, interpolate } from 'react-spring/web.cjs'; /** * WordPress dependencies */ -import { useState, useLayoutEffect, useReducer, useMemo } from '@wordpress/element'; +import { + useState, + useLayoutEffect, + useReducer, + useMemo, +} from '@wordpress/element'; import { useReducedMotion } from '@wordpress/compose'; import { getScrollContainer } from '@wordpress/dom'; @@ -44,11 +49,24 @@ const getAbsolutePosition = ( element ) => { * * @return {Object} Style object. */ -function useMovingAnimation( ref, isSelected, adjustScrolling, enableAnimation, triggerAnimationOnChange ) { +function useMovingAnimation( + ref, + isSelected, + adjustScrolling, + enableAnimation, + triggerAnimationOnChange +) { const prefersReducedMotion = useReducedMotion() || ! enableAnimation; - const [ triggeredAnimation, triggerAnimation ] = useReducer( counterReducer, 0 ); + const [ triggeredAnimation, triggerAnimation ] = useReducer( + counterReducer, + 0 + ); const [ finishedAnimation, endAnimation ] = useReducer( counterReducer, 0 ); - const [ transform, setTransform ] = useState( { x: 0, y: 0, scrollTop: 0 } ); + const [ transform, setTransform ] = useState( { + x: 0, + y: 0, + scrollTop: 0, + } ); const previous = ref.current ? getAbsolutePosition( ref.current ) : null; const scrollContainer = useMemo( () => { @@ -70,7 +88,8 @@ function useMovingAnimation( ref, isSelected, adjustScrolling, enableAnimation, // just move directly to the final scroll position ref.current.style.transform = 'none'; const destination = getAbsolutePosition( ref.current ); - scrollContainer.scrollTop = scrollContainer.scrollTop - previous.top + destination.top; + scrollContainer.scrollTop = + scrollContainer.scrollTop - previous.top + destination.top; } return; @@ -80,11 +99,15 @@ function useMovingAnimation( ref, isSelected, adjustScrolling, enableAnimation, const newTransform = { x: previous ? previous.left - destination.left : 0, y: previous ? previous.top - destination.top : 0, - scrollTop: previous && scrollContainer ? scrollContainer.scrollTop - previous.top + destination.top : 0, + scrollTop: + previous && scrollContainer + ? scrollContainer.scrollTop - previous.top + destination.top + : 0, }; - ref.current.style.transform = newTransform.x === 0 && newTransform.y === 0 ? - undefined : - `translate3d(${ newTransform.x }px,${ newTransform.y }px,0)`; + ref.current.style.transform = + newTransform.x === 0 && newTransform.y === 0 + ? undefined + : `translate3d(${ newTransform.x }px,${ newTransform.y }px,0)`; triggerAnimation(); setTransform( newTransform ); }, [ triggerAnimationOnChange ] ); @@ -102,32 +125,35 @@ function useMovingAnimation( ref, isSelected, adjustScrolling, enableAnimation, config: { mass: 5, tension: 2000, friction: 200 }, immediate: prefersReducedMotion, onFrame: ( props ) => { - if ( adjustScrolling && scrollContainer && ! prefersReducedMotion && props.y ) { + if ( + adjustScrolling && + scrollContainer && + ! prefersReducedMotion && + props.y + ) { scrollContainer.scrollTop = transform.scrollTop + props.y; } }, } ); // Dismiss animations if disabled. - return prefersReducedMotion ? - {} : - { - transformOrigin: 'center', - transform: interpolate( - [ - animationProps.x, - animationProps.y, - ], - ( x, y ) => x === 0 && y === 0 ? undefined : `translate3d(${ x }px,${ y }px,0)` - ), - zIndex: interpolate( - [ - animationProps.x, - animationProps.y, - ], - ( x, y ) => ! isSelected || ( x === 0 && y === 0 ) ? undefined : `1` - ), - }; + return prefersReducedMotion + ? {} + : { + transformOrigin: 'center', + transform: interpolate( + [ animationProps.x, animationProps.y ], + ( x, y ) => + x === 0 && y === 0 + ? undefined + : `translate3d(${ x }px,${ y }px,0)` + ), + zIndex: interpolate( + [ animationProps.x, animationProps.y ], + ( x, y ) => + ! isSelected || ( x === 0 && y === 0 ) ? undefined : `1` + ), + }; } export default useMovingAnimation; diff --git a/packages/block-editor/src/components/block-list/nav-up-icon.js b/packages/block-editor/src/components/block-list/nav-up-icon.js index 8fa1c8d20bd76..ae1d897660af7 100644 --- a/packages/block-editor/src/components/block-list/nav-up-icon.js +++ b/packages/block-editor/src/components/block-list/nav-up-icon.js @@ -3,6 +3,21 @@ */ import { SVG, Path } from '@wordpress/components'; -const NavigateUp = ; +const NavigateUp = ( + + + + +); export default NavigateUp; diff --git a/packages/block-editor/src/components/block-list/root-container.js b/packages/block-editor/src/components/block-list/root-container.js index 5542b3edfe80a..84985f8fd7c07 100644 --- a/packages/block-editor/src/components/block-list/root-container.js +++ b/packages/block-editor/src/components/block-list/root-container.js @@ -1,7 +1,7 @@ /** * WordPress dependencies */ -import { createContext, forwardRef } from '@wordpress/element'; +import { createContext, forwardRef, useState } from '@wordpress/element'; import { useSelect, useDispatch } from '@wordpress/data'; /** @@ -15,6 +15,7 @@ import BlockPopover from './block-popover'; /** @typedef {import('@wordpress/element').WPSyntheticEvent} WPSyntheticEvent */ export const Context = createContext(); +export const BlockNodes = createContext(); function selector( select ) { const { @@ -80,17 +81,19 @@ function RootContainer( { children, className }, ref ) { selectedBlockClientId={ selectedBlockClientId } containerRef={ ref } > - -
        - - { children } - -
        + + +
        + + { children } + +
        +
        ); } diff --git a/packages/block-editor/src/components/block-list/style.scss b/packages/block-editor/src/components/block-list/style.scss index ff63879a08f61..739aa957b266d 100644 --- a/packages/block-editor/src/components/block-list/style.scss +++ b/packages/block-editor/src/components/block-list/style.scss @@ -127,7 +127,7 @@ } } - &.is-navigate-mode::before { + .is-navigate-mode &::before { border-color: $blue-medium-focus; box-shadow: inset $block-left-border-width 0 0 0 $blue-medium-focus; @@ -277,7 +277,7 @@ } // Select tool/navigation mode shows the default cursor until an additional click edits. - &.is-navigate-mode { + .is-navigate-mode & { cursor: default; } @@ -418,7 +418,8 @@ background: $white; height: $block-padding * 2; width: $block-padding * 2; - padding: $grid-size-small; + padding: 0; + justify-content: center; &:not(:disabled):not([aria-disabled="true"]):hover { box-shadow: none; @@ -537,6 +538,17 @@ } } +.block-editor-block-list__insertion-point-popover { + z-index: z-index(".block-editor-block-list__insertion-point-popover"); + + .components-popover__content { + background: none; + border: none; + box-shadow: none; + overflow-y: visible; + } +} + .components-popover.block-editor-block-list__block-popover { z-index: z-index(".block-editor-block-list__block-popover"); 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 9da2bc4a1c88a..f024c51880e4b 100644 --- a/packages/block-editor/src/components/block-list/subdirectory-icon.js +++ b/packages/block-editor/src/components/block-list/subdirectory-icon.js @@ -12,7 +12,6 @@ const Subdirectory = ( { ...extraProps } ) => ( { ...extraProps } > - ) -; - + +); export default Subdirectory; diff --git a/packages/block-editor/src/components/block-list/use-multi-selection.js b/packages/block-editor/src/components/block-list/use-multi-selection.js index 3750c9334a1f6..1e77f8711a51d 100644 --- a/packages/block-editor/src/components/block-list/use-multi-selection.js +++ b/packages/block-editor/src/components/block-list/use-multi-selection.js @@ -56,15 +56,15 @@ function selector( select ) { } function toggleRichText( container, toggle ) { - Array - .from( container.querySelectorAll( '.rich-text' ) ) - .forEach( ( node ) => { + Array.from( container.querySelectorAll( '.rich-text' ) ).forEach( + ( node ) => { if ( toggle ) { node.setAttribute( 'contenteditable', true ); } else { node.removeAttribute( 'contenteditable' ); } - } ); + } + ); } export default function useMultiSelection( ref ) { @@ -100,7 +100,9 @@ export default function useMultiSelection( ref ) { if ( selection.rangeCount && ! selection.isCollapsed ) { const blockNode = getBlockDOMNode( selectedBlockClientId ); - const { startContainer, endContainer } = selection.getRangeAt( 0 ); + const { startContainer, endContainer } = selection.getRangeAt( + 0 + ); if ( ! blockNode.contains( startContainer ) || @@ -147,26 +149,58 @@ export default function useMultiSelection( ref ) { selectedBlockClientId, ] ); - const onSelectionChange = useCallback( () => { - const selection = window.getSelection(); - - // If no selection is found, end multi selection. - if ( ! selection.rangeCount || selection.isCollapsed ) { - return; - } - - const clientId = getBlockClientId( selection.focusNode ); + const onSelectionChange = useCallback( + ( { isSelectionEnd } ) => { + const selection = window.getSelection(); - if ( startClientId.current === clientId ) { - selectBlock( clientId ); - } else { - const startPath = [ ...getBlockParents( startClientId.current ), startClientId.current ]; - const endPath = [ ...getBlockParents( clientId ), clientId ]; - const depth = Math.min( startPath.length, endPath.length ) - 1; + // If no selection is found, end multi selection and enable all rich + // text areas. + if ( ! selection.rangeCount || selection.isCollapsed ) { + toggleRichText( ref.current, true ); + return; + } - multiSelect( startPath[ depth ], endPath[ depth ] ); - } - }, [ selectBlock, getBlockParents, multiSelect ] ); + const clientId = getBlockClientId( selection.focusNode ); + const isSingularSelection = startClientId.current === clientId; + + if ( isSingularSelection ) { + selectBlock( clientId ); + + // If the selection is complete (on mouse up), and no multiple + // blocks have been selected, set focus back to the anchor element + // if the anchor element contains the selection. Additionally, rich + // text elements that were previously disabled can now be enabled + // again. + if ( isSelectionEnd ) { + toggleRichText( ref.current, true ); + + if ( selection.rangeCount ) { + const { + commonAncestorContainer, + } = selection.getRangeAt( 0 ); + + if ( + anchorElement.current.contains( + commonAncestorContainer + ) + ) { + anchorElement.current.focus(); + } + } + } + } else { + const startPath = [ + ...getBlockParents( startClientId.current ), + startClientId.current, + ]; + const endPath = [ ...getBlockParents( clientId ), clientId ]; + const depth = Math.min( startPath.length, endPath.length ) - 1; + + multiSelect( startPath[ depth ], endPath[ depth ] ); + } + }, + [ selectBlock, getBlockParents, multiSelect ] + ); /** * Handles a mouseup event to end the current mouse multi-selection. @@ -178,58 +212,54 @@ export default function useMultiSelection( ref ) { // The browser selection won't have updated yet at this point, so wait // until the next animation frame to get the browser selection. rafId.current = window.requestAnimationFrame( () => { - onSelectionChange(); + onSelectionChange( { isSelectionEnd: true } ); stopMultiSelect(); - toggleRichText( ref.current, true ); - - const selection = window.getSelection(); - - // If the anchor element contains the selection, set focus back to - // the anchor element. - if ( selection.rangeCount ) { - const { commonAncestorContainer } = selection.getRangeAt( 0 ); - - if ( anchorElement.current.contains( commonAncestorContainer ) ) { - anchorElement.current.focus(); - } - } } ); }, [ onSelectionChange, stopMultiSelect ] ); // Only clean up when unmounting, these are added and cleaned up elsewhere. - useEffect( () => () => { - document.removeEventListener( 'selectionchange', onSelectionChange ); - window.removeEventListener( 'mouseup', onSelectionEnd ); - window.cancelAnimationFrame( rafId.current ); - }, [ onSelectionChange, onSelectionEnd ] ); + useEffect( + () => () => { + document.removeEventListener( + 'selectionchange', + onSelectionChange + ); + window.removeEventListener( 'mouseup', onSelectionEnd ); + window.cancelAnimationFrame( rafId.current ); + }, + [ onSelectionChange, onSelectionEnd ] + ); /** * Binds event handlers to the document for tracking a pending multi-select * in response to a mousedown event occurring in a rendered block. */ - return useCallback( ( clientId ) => { - if ( ! isSelectionEnabled ) { - return; - } + return useCallback( + ( clientId ) => { + if ( ! isSelectionEnabled ) { + return; + } - startClientId.current = clientId; - anchorElement.current = document.activeElement; - startMultiSelect(); - - // `onSelectionStart` is called after `mousedown` and `mouseleave` - // (from a block). The selection ends when `mouseup` happens anywhere - // in the window. - document.addEventListener( 'selectionchange', onSelectionChange ); - window.addEventListener( 'mouseup', onSelectionEnd ); - - // Removing the contenteditable attributes within the block editor is - // essential for selection to work across editable areas. The edible - // hosts are removed, allowing selection to be extended outside the - // DOM element. `startMultiSelect` sets a flag in the store so the rich - // text components are updated, but the rerender may happen very slowly, - // especially in Safari for the blocks that are asynchonously rendered. - // To ensure the browser instantly removes the selection boundaries, we - // remove the contenteditable attributes manually. - toggleRichText( ref.current, false ); - }, [ isSelectionEnabled, startMultiSelect, onSelectionEnd ] ); + startClientId.current = clientId; + anchorElement.current = document.activeElement; + startMultiSelect(); + + // `onSelectionStart` is called after `mousedown` and `mouseleave` + // (from a block). The selection ends when `mouseup` happens anywhere + // in the window. + document.addEventListener( 'selectionchange', onSelectionChange ); + window.addEventListener( 'mouseup', onSelectionEnd ); + + // Removing the contenteditable attributes within the block editor is + // essential for selection to work across editable areas. The edible + // hosts are removed, allowing selection to be extended outside the + // DOM element. `startMultiSelect` sets a flag in the store so the rich + // text components are updated, but the rerender may happen very slowly, + // especially in Safari for the blocks that are asynchonously rendered. + // To ensure the browser instantly removes the selection boundaries, we + // remove the contenteditable attributes manually. + toggleRichText( ref.current, false ); + }, + [ isSelectionEnabled, startMultiSelect, onSelectionEnd ] + ); } diff --git a/packages/block-editor/src/components/block-mobile-toolbar/index.js b/packages/block-editor/src/components/block-mobile-toolbar/index.js index 689e455d83388..968b645ce72f3 100644 --- a/packages/block-editor/src/components/block-mobile-toolbar/index.js +++ b/packages/block-editor/src/components/block-mobile-toolbar/index.js @@ -16,7 +16,10 @@ function BlockMobileToolbar( { clientId, moverDirection } ) { return (
        - +
        ); } 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 46580878ff684..43a34c0466b54 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 @@ -10,6 +10,7 @@ import { ToolbarButton } from '@wordpress/components'; import { __, sprintf } from '@wordpress/i18n'; import { withDispatch, withSelect } from '@wordpress/data'; import { compose } from '@wordpress/compose'; +import { trash } from '@wordpress/icons'; /** * Internal dependencies @@ -18,11 +19,7 @@ import styles from './style.scss'; import BlockMover from '../block-mover'; import { BlockSettingsButton } from '../block-settings'; -const BlockMobileToolbar = ( { - clientId, - onDelete, - order, -} ) => ( +const BlockMobileToolbar = ( { clientId, onDelete, order } ) => ( @@ -31,15 +28,13 @@ const BlockMobileToolbar = ( { @@ -47,9 +42,7 @@ const BlockMobileToolbar = ( { export default compose( withSelect( ( select, { clientId } ) => { - const { - getBlockIndex, - } = select( 'core/block-editor' ); + const { getBlockIndex } = select( 'core/block-editor' ); return { order: getBlockIndex( clientId ), @@ -63,5 +56,5 @@ export default compose( removeBlock( clientId, rootClientId ); }, }; - } ), + } ) )( BlockMobileToolbar ); diff --git a/packages/block-editor/src/components/block-mover/icons.js b/packages/block-editor/src/components/block-mover/icons.js index 2a15b8a6159d5..1ebd7922cd4b4 100644 --- a/packages/block-editor/src/components/block-mover/icons.js +++ b/packages/block-editor/src/components/block-mover/icons.js @@ -1,36 +1,41 @@ /** * WordPress dependencies */ -import { Path, Polygon, SVG } from '@wordpress/components'; - -export const upArrow = ( - - - -); +import { Path, SVG } from '@wordpress/components'; export const leftArrow = ( - + ); -export const downArrow = ( - - - -); - export const rightArrow = ( - + ); export const dragHandle = ( - - + + C8.4,6,8,6.4,8,7s0.4,1,1,1s1-0.4,1-1S9.6,6,9,6z M9,10c-0.6,0-1,0.4-1,1s0.4,1,1,1s1-0.4,1-1S9.6,10,9,10z" + /> ); diff --git a/packages/block-editor/src/components/block-mover/index.js b/packages/block-editor/src/components/block-mover/index.js index 84475b9c60b98..7e29326458fd1 100644 --- a/packages/block-editor/src/components/block-mover/index.js +++ b/packages/block-editor/src/components/block-mover/index.js @@ -18,7 +18,8 @@ import { withInstanceId, compose } from '@wordpress/compose'; * Internal dependencies */ import { getBlockMoverDescription } from './mover-description'; -import { leftArrow, rightArrow, upArrow, downArrow, dragHandle } from './icons'; +import { leftArrow, rightArrow, dragHandle } from './icons'; +import { chevronUp, chevronDown } from '@wordpress/icons'; import BlockDraggable from '../block-draggable'; export class BlockMover extends Component { @@ -44,7 +45,21 @@ export class BlockMover extends Component { } render() { - const { onMoveUp, onMoveDown, __experimentalOrientation: orientation, isRTL, isFirst, isLast, clientIds, blockType, firstIndex, isLocked, instanceId, isHidden, rootClientId } = this.props; + const { + onMoveUp, + onMoveDown, + __experimentalOrientation: orientation, + isRTL, + isFirst, + isLast, + clientIds, + blockType, + firstIndex, + isLocked, + instanceId, + isHidden, + rootClientId, + } = this.props; const { isFocused } = this.state; const blocksCount = castArray( clientIds ).length; if ( isLocked || ( isFirst && isLast && ! rootClientId ) ) { @@ -56,12 +71,12 @@ export class BlockMover extends Component { if ( orientation === 'horizontal' ) { return isRTL ? rightArrow : leftArrow; } - return upArrow; + return chevronUp; } else if ( moveDirection === 'down' ) { if ( orientation === 'horizontal' ) { return isRTL ? leftArrow : rightArrow; } - return downArrow; + return chevronDown; } return null; }; @@ -86,13 +101,21 @@ export class BlockMover extends Component { // to an unfocused state (body as active element) without firing blur on, // the rendering parent, leaving it unable to react to focus out. return ( - + - - { - getBlockMoverDescription( - blocksCount, - blockType && blockType.title, - firstIndex, - isFirst, - isLast, - -1, - orientation, - isRTL, - ) - } + + { getBlockMoverDescription( + blocksCount, + blockType && blockType.title, + firstIndex, + isFirst, + isLast, + -1, + orientation, + isRTL + ) } - - { - getBlockMoverDescription( - blocksCount, - blockType && blockType.title, - firstIndex, - isFirst, - isLast, - 1, - orientation, - isRTL, - ) - } + + { getBlockMoverDescription( + blocksCount, + blockType && blockType.title, + firstIndex, + isFirst, + isLast, + 1, + orientation, + isRTL + ) } ); @@ -161,18 +189,27 @@ export class BlockMover extends Component { export default compose( withSelect( ( select, { clientIds } ) => { - const { getBlock, getBlockIndex, getTemplateLock, getBlockRootClientId, getBlockOrder } = select( 'core/block-editor' ); + const { + getBlock, + getBlockIndex, + getTemplateLock, + getBlockRootClientId, + getBlockOrder, + } = select( 'core/block-editor' ); const normalizedClientIds = castArray( clientIds ); const firstClientId = first( normalizedClientIds ); const block = getBlock( firstClientId ); - const rootClientId = getBlockRootClientId( first( normalizedClientIds ) ); + const rootClientId = getBlockRootClientId( + first( normalizedClientIds ) + ); const blockOrder = getBlockOrder( rootClientId ); const firstIndex = getBlockIndex( firstClientId, rootClientId ); - const lastIndex = getBlockIndex( last( normalizedClientIds ), rootClientId ); + const lastIndex = getBlockIndex( + last( normalizedClientIds ), + rootClientId + ); const { getSettings } = select( 'core/block-editor' ); - const { - isRTL, - } = getSettings(); + const { isRTL } = getSettings(); return { blockType: block ? getBlockType( block.name ) : null, @@ -185,11 +222,13 @@ export default compose( }; } ), withDispatch( ( dispatch, { clientIds, rootClientId } ) => { - const { moveBlocksDown, moveBlocksUp } = dispatch( 'core/block-editor' ); + const { moveBlocksDown, moveBlocksUp } = dispatch( + 'core/block-editor' + ); return { onMoveDown: partial( moveBlocksDown, clientIds, rootClientId ), onMoveUp: partial( moveBlocksUp, clientIds, rootClientId ), }; } ), - withInstanceId, + withInstanceId )( BlockMover ); 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 40bc4d550b7ab..27bf29650e9a9 100644 --- a/packages/block-editor/src/components/block-mover/index.native.js +++ b/packages/block-editor/src/components/block-mover/index.native.js @@ -27,14 +27,15 @@ const BlockMover = ( { return ( <> ); @@ -63,13 +69,21 @@ const BlockMover = ( { export default compose( withSelect( ( select, { clientIds } ) => { - const { getBlockIndex, getTemplateLock, getBlockRootClientId, getBlockOrder } = select( 'core/block-editor' ); + const { + getBlockIndex, + getTemplateLock, + getBlockRootClientId, + getBlockOrder, + } = select( 'core/block-editor' ); const normalizedClientIds = castArray( clientIds ); const firstClientId = first( normalizedClientIds ); const rootClientId = getBlockRootClientId( firstClientId ); const blockOrder = getBlockOrder( rootClientId ); const firstIndex = getBlockIndex( firstClientId, rootClientId ); - const lastIndex = getBlockIndex( last( normalizedClientIds ), rootClientId ); + const lastIndex = getBlockIndex( + last( normalizedClientIds ), + rootClientId + ); return { firstIndex, @@ -80,11 +94,13 @@ export default compose( }; } ), withDispatch( ( dispatch, { clientIds, rootClientId } ) => { - const { moveBlocksDown, moveBlocksUp } = dispatch( 'core/block-editor' ); + const { moveBlocksDown, moveBlocksUp } = dispatch( + 'core/block-editor' + ); return { onMoveDown: partial( moveBlocksDown, clientIds, rootClientId ), onMoveUp: partial( moveBlocksUp, clientIds, rootClientId ), }; } ), - withInstanceId, + withInstanceId )( BlockMover ); diff --git a/packages/block-editor/src/components/block-mover/mover-description.js b/packages/block-editor/src/components/block-mover/mover-description.js index d9a62de176d82..88e67e5ff4a71 100644 --- a/packages/block-editor/src/components/block-mover/mover-description.js +++ b/packages/block-editor/src/components/block-mover/mover-description.js @@ -20,8 +20,17 @@ import { __, _n, sprintf } from '@wordpress/i18n'; * * @return {string} Label for the block movement controls. */ -export function getBlockMoverDescription( selectedCount, type, firstIndex, isFirst, isLast, dir, orientation, isRTL ) { - const position = ( firstIndex + 1 ); +export function getBlockMoverDescription( + selectedCount, + type, + firstIndex, + isFirst, + isLast, + dir, + orientation, + isRTL +) { + const position = firstIndex + 1; const getMovementDirection = ( moveDirection ) => { if ( moveDirection === 'up' ) { @@ -39,57 +48,171 @@ export function getBlockMoverDescription( selectedCount, type, firstIndex, isFir }; if ( selectedCount > 1 ) { - return getMultiBlockMoverDescription( selectedCount, firstIndex, isFirst, isLast, dir ); + return getMultiBlockMoverDescription( + selectedCount, + firstIndex, + isFirst, + isLast, + dir + ); } if ( isFirst && isLast ) { // translators: %s: Type of block (i.e. Text, Image etc) - return sprintf( __( 'Block %s is the only block, and cannot be moved' ), type ); + return sprintf( + __( 'Block %s is the only block, and cannot be moved' ), + type + ); } if ( dir > 0 && ! isLast ) { // moving down - return sprintf( - // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: Direction of movement ( up, down, left, right ), 4: New position - __( 'Move %1$s block from position %2$d %3$s to position %4$d' ), - type, - position, - getMovementDirection( 'down' ), - ( position + 1 ), - ); + const movementDirection = getMovementDirection( 'down' ); + + if ( movementDirection === 'down' ) { + return sprintf( + // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: New position + __( + 'Move %1$s block from position %2$d down to position %3$d' + ), + type, + position, + position + 1 + ); + } + + if ( movementDirection === 'left' ) { + return sprintf( + // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: New position + __( + 'Move %1$s block from position %2$d left to position %3$d' + ), + type, + position, + position + 1 + ); + } + + if ( movementDirection === 'right' ) { + return sprintf( + // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: New position + __( + 'Move %1$s block from position %2$d right to position %3$d' + ), + type, + position, + position + 1 + ); + } } if ( dir > 0 && isLast ) { // moving down, and is the last item - // translators: 1: Type of block (i.e. Text, Image etc), 2: Direction of movement ( up, down, left, right ) - return sprintf( - __( 'Block %1$s is at the end of the content and can’t be moved %2$s' ), - type, - getMovementDirection( 'down' ), + const movementDirection = getMovementDirection( 'down' ); - ); + if ( movementDirection === 'down' ) { + return sprintf( + // translators: 1: Type of block (i.e. Text, Image etc) + __( + 'Block %1$s is at the end of the content and can’t be moved down' + ), + type + ); + } + + if ( movementDirection === 'left' ) { + return sprintf( + // translators: 1: Type of block (i.e. Text, Image etc) + __( + 'Block %1$s is at the end of the content and can’t be moved left' + ), + type + ); + } + + if ( movementDirection === 'right' ) { + return sprintf( + // translators: 1: Type of block (i.e. Text, Image etc) + __( + 'Block %1$s is at the end of the content and can’t be moved right' + ), + type + ); + } } if ( dir < 0 && ! isFirst ) { // moving up - return sprintf( - // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: Direction of movement ( up, down, left, right ), 4: New position - __( 'Move %1$s block from position %2$d %3$s to position %4$d' ), - type, - position, - getMovementDirection( 'up' ), - ( position - 1 ), - ); + const movementDirection = getMovementDirection( 'up' ); + + if ( movementDirection === 'up' ) { + return sprintf( + // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: New position + __( 'Move %1$s block from position %2$d up to position %3$d' ), + type, + position, + position - 1 + ); + } + + if ( movementDirection === 'left' ) { + return sprintf( + // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: New position + __( + 'Move %1$s block from position %2$d left to position %3$d' + ), + type, + position, + position - 1 + ); + } + + if ( movementDirection === 'right' ) { + return sprintf( + // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: New position + __( + 'Move %1$s block from position %2$d right to position %3$d' + ), + type, + position, + position - 1 + ); + } } if ( dir < 0 && isFirst ) { // moving up, and is the first item - // translators: 1: Type of block (i.e. Text, Image etc), 2: Direction of movement ( up, down, left, right ) - return sprintf( - __( 'Block %1$s is at the beginning of the content and can’t be moved %2$s' ), - type, - getMovementDirection( 'up' ), - ); + const movementDirection = getMovementDirection( 'up' ); + + if ( movementDirection === 'up' ) { + return sprintf( + // translators: 1: Type of block (i.e. Text, Image etc) + __( + 'Block %1$s is at the beginning of the content and can’t be moved up' + ), + type + ); + } + + if ( movementDirection === 'left' ) { + return sprintf( + // translators: 1: Type of block (i.e. Text, Image etc) + __( + 'Block %1$s is at the beginning of the content and can’t be moved left' + ), + type + ); + } + + if ( movementDirection === 'right' ) { + return sprintf( + // translators: 1: Type of block (i.e. Text, Image etc) + __( + 'Block %1$s is at the beginning of the content and can’t be moved right' + ), + type + ); + } } } @@ -105,15 +228,23 @@ export function getBlockMoverDescription( selectedCount, type, firstIndex, isFir * * @return {string} Label for the block movement controls. */ -export function getMultiBlockMoverDescription( selectedCount, firstIndex, isFirst, isLast, dir ) { - const position = ( firstIndex + 1 ); +export function getMultiBlockMoverDescription( + selectedCount, + firstIndex, + isFirst, + isLast, + dir +) { + const position = firstIndex + 1; if ( dir < 0 && isFirst ) { return __( 'Blocks cannot be moved up as they are already at the top' ); } if ( dir > 0 && isLast ) { - return __( 'Blocks cannot be moved down as they are already at the bottom' ); + return __( + 'Blocks cannot be moved down as they are already at the bottom' + ); } if ( dir < 0 && ! isFirst ) { diff --git a/packages/block-editor/src/components/block-mover/test/index.js b/packages/block-editor/src/components/block-mover/test/index.js index 5437249304829..0f78a8250bee4 100644 --- a/packages/block-editor/src/components/block-mover/test/index.js +++ b/packages/block-editor/src/components/block-mover/test/index.js @@ -3,11 +3,15 @@ */ import { shallow } from 'enzyme'; +/** + * WordPress dependencies + */ +import { chevronUp, chevronDown } from '@wordpress/icons'; + /** * Internal dependencies */ import { BlockMover } from '../'; -import { upArrow, downArrow } from '../icons'; describe( 'BlockMover', () => { describe( 'basic rendering', () => { @@ -31,7 +35,9 @@ describe( 'BlockMover', () => { instanceId={ 1 } /> ); - expect( blockMover.hasClass( 'block-editor-block-mover' ) ).toBe( true ); + expect( blockMover.hasClass( 'block-editor-block-mover' ) ).toBe( + true + ); const moveUp = blockMover.childAt( 0 ); const drag = blockMover.childAt( 1 ); @@ -45,20 +51,26 @@ describe( 'BlockMover', () => { className: 'block-editor-block-mover__control', onClick: undefined, label: 'Move up', - icon: upArrow, + icon: chevronUp, 'aria-disabled': undefined, - 'aria-describedby': 'block-editor-block-mover__up-description-1', + 'aria-describedby': + 'block-editor-block-mover__up-description-1', } ); expect( moveDown.props() ).toMatchObject( { className: 'block-editor-block-mover__control', onClick: undefined, label: 'Move down', - icon: downArrow, + icon: chevronDown, 'aria-disabled': undefined, - 'aria-describedby': 'block-editor-block-mover__down-description-1', + 'aria-describedby': + 'block-editor-block-mover__down-description-1', } ); - expect( moveUpDesc.text() ).toBe( 'Move 2 blocks from position 1 up by one place' ); - expect( moveDownDesc.text() ).toBe( 'Move 2 blocks from position 1 down by one place' ); + expect( moveUpDesc.text() ).toBe( + 'Move 2 blocks from position 1 up by one place' + ); + expect( moveDownDesc.text() ).toBe( + 'Move 2 blocks from position 1 down by one place' + ); } ); it( 'should render the up arrow with a onMoveUp callback', () => { diff --git a/packages/block-editor/src/components/block-mover/test/mover-description.js b/packages/block-editor/src/components/block-mover/test/mover-description.js index 4f491512d7049..6098dc5619e0a 100644 --- a/packages/block-editor/src/components/block-mover/test/mover-description.js +++ b/packages/block-editor/src/components/block-mover/test/mover-description.js @@ -1,7 +1,10 @@ /** * Internal dependencies */ -import { getBlockMoverDescription, getMultiBlockMoverDescription } from '../mover-description'; +import { + getBlockMoverDescription, + getMultiBlockMoverDescription, +} from '../mover-description'; describe( 'block mover', () => { const negativeDirection = -1, @@ -11,152 +14,192 @@ describe( 'block mover', () => { const label = 'Header: Some Header Text'; it( 'generates a title for the first item moving up', () => { - expect( getBlockMoverDescription( - 1, - label, - 0, - true, - false, - negativeDirection - ) ).toBe( + expect( + getBlockMoverDescription( + 1, + label, + 0, + true, + false, + negativeDirection + ) + ).toBe( `Block ${ label } is at the beginning of the content and can’t be moved up` ); } ); it( 'generates a title for the last item moving down', () => { - expect( getBlockMoverDescription( - 1, - label, - 3, - false, - true, - positiveDirection, - ) ).toBe( `Block ${ label } is at the end of the content and can’t be moved down` ); + expect( + getBlockMoverDescription( + 1, + label, + 3, + false, + true, + positiveDirection + ) + ).toBe( + `Block ${ label } is at the end of the content and can’t be moved down` + ); } ); it( 'generates a title for the second item moving up', () => { - expect( getBlockMoverDescription( - 1, - label, - 1, - false, - false, - negativeDirection, - ) ).toBe( `Move ${ label } block from position 2 up to position 1` ); + expect( + getBlockMoverDescription( + 1, + label, + 1, + false, + false, + negativeDirection + ) + ).toBe( `Move ${ label } block from position 2 up to position 1` ); } ); it( 'generates a title for the second item moving down', () => { - expect( getBlockMoverDescription( - 1, - label, - 1, - false, - false, - positiveDirection, - ) ).toBe( `Move ${ label } block from position 2 down to position 3` ); + expect( + getBlockMoverDescription( + 1, + label, + 1, + false, + false, + positiveDirection + ) + ).toBe( + `Move ${ label } block from position 2 down to position 3` + ); } ); it( 'generates a title for the only item in the list', () => { - expect( getBlockMoverDescription( - 1, - label, - 0, - true, - true, - positiveDirection, - ) ).toBe( `Block ${ label } is the only block, and cannot be moved` ); + expect( + getBlockMoverDescription( + 1, + label, + 0, + true, + true, + positiveDirection + ) + ).toBe( `Block ${ label } is the only block, and cannot be moved` ); } ); it( 'indicates that the block can be moved left when the orientation is horizontal and the direction is negative', () => { - expect( getBlockMoverDescription( - 1, - label, - 1, - false, - false, - negativeDirection, - 'horizontal' - ) ).toBe( `Move ${ label } block from position 2 left to position 1` ); + expect( + getBlockMoverDescription( + 1, + label, + 1, + false, + false, + negativeDirection, + 'horizontal' + ) + ).toBe( + `Move ${ label } block from position 2 left to position 1` + ); } ); it( 'indicates that the block can be moved right when the orientation is horizontal and the direction is positive', () => { - expect( getBlockMoverDescription( - 1, - label, - 1, - false, - false, - positiveDirection, - 'horizontal' - ) ).toBe( `Move ${ label } block from position 2 right to position 3` ); + expect( + getBlockMoverDescription( + 1, + label, + 1, + false, + false, + positiveDirection, + 'horizontal' + ) + ).toBe( + `Move ${ label } block from position 2 right to position 3` + ); } ); it( 'indicates that the block cannot be moved left when the orientation is horizontal and the block is the first block', () => { - expect( getBlockMoverDescription( - 1, - label, - 0, - true, - false, - negativeDirection, - 'horizontal' - ) ).toBe( + expect( + getBlockMoverDescription( + 1, + label, + 0, + true, + false, + negativeDirection, + 'horizontal' + ) + ).toBe( `Block ${ label } is at the beginning of the content and can’t be moved left` ); } ); it( 'indicates that the block cannot be moved right when the orientation is horizontal and the block is the last block', () => { - expect( getBlockMoverDescription( - 1, - label, - 3, - false, - true, - positiveDirection, - 'horizontal' - ) ).toBe( `Block ${ label } is at the end of the content and can’t be moved right` ); + expect( + getBlockMoverDescription( + 1, + label, + 3, + false, + true, + positiveDirection, + 'horizontal' + ) + ).toBe( + `Block ${ label } is at the end of the content and can’t be moved right` + ); } ); } ); describe( 'getMultiBlockMoverDescription', () => { it( 'generates a title moving multiple blocks up', () => { - expect( getMultiBlockMoverDescription( - 4, - 1, - false, - true, - negativeDirection - ) ).toBe( 'Move 4 blocks from position 2 up by one place' ); + expect( + getMultiBlockMoverDescription( + 4, + 1, + false, + true, + negativeDirection + ) + ).toBe( 'Move 4 blocks from position 2 up by one place' ); } ); it( 'generates a title moving multiple blocks down', () => { - expect( getMultiBlockMoverDescription( - 4, - 0, - true, - false, - positiveDirection - ) ).toBe( 'Move 4 blocks from position 1 down by one place' ); + expect( + getMultiBlockMoverDescription( + 4, + 0, + true, + false, + positiveDirection + ) + ).toBe( 'Move 4 blocks from position 1 down by one place' ); } ); it( 'generates a title for a selection of blocks at the top', () => { - expect( getMultiBlockMoverDescription( - 4, - 1, - true, - true, - negativeDirection - ) ).toBe( 'Blocks cannot be moved up as they are already at the top' ); + expect( + getMultiBlockMoverDescription( + 4, + 1, + true, + true, + negativeDirection + ) + ).toBe( + 'Blocks cannot be moved up as they are already at the top' + ); } ); it( 'generates a title for a selection of blocks at the bottom', () => { - expect( getMultiBlockMoverDescription( - 4, - 2, - false, - true, - positiveDirection - ) ).toBe( 'Blocks cannot be moved down as they are already at the bottom' ); + expect( + getMultiBlockMoverDescription( + 4, + 2, + false, + true, + positiveDirection + ) + ).toBe( + 'Blocks cannot be moved down as they are already at the bottom' + ); } ); } ); } ); diff --git a/packages/block-editor/src/components/block-navigation/dropdown.js b/packages/block-editor/src/components/block-navigation/dropdown.js index a76a7ab563e1c..24ebb27244dc9 100644 --- a/packages/block-editor/src/components/block-navigation/dropdown.js +++ b/packages/block-editor/src/components/block-navigation/dropdown.js @@ -13,15 +13,31 @@ import { useCallback } from '@wordpress/element'; import BlockNavigation from './'; const MenuIcon = ( - + ); function BlockNavigationDropdownToggle( { isEnabled, onToggle, isOpen } ) { - useShortcut( 'core/edit-post/toggle-block-navigation', useCallback( onToggle, [ onToggle ] ), { bindGlobal: true, isDisabled: ! isEnabled } ); - const shortcut = useSelect( ( select ) => - select( 'core/keyboard-shortcuts' ).getShortcutRepresentation( 'core/edit-post/toggle-block-navigation' ), [] + useShortcut( + 'core/edit-post/toggle-block-navigation', + useCallback( onToggle, [ onToggle ] ), + { + bindGlobal: true, + isDisabled: ! isEnabled, + } + ); + const shortcut = useSelect( + ( select ) => + select( 'core/keyboard-shortcuts' ).getShortcutRepresentation( + 'core/edit-post/toggle-block-navigation' + ), + [] ); return ( @@ -38,14 +54,20 @@ function BlockNavigationDropdownToggle( { isEnabled, onToggle, isOpen } ) { } function BlockNavigationDropdown( { isDisabled } ) { - const hasBlocks = useSelect( ( select ) => !! select( 'core/block-editor' ).getBlockCount(), [] ); + const hasBlocks = useSelect( + ( select ) => !! select( 'core/block-editor' ).getBlockCount(), + [] + ); const isEnabled = hasBlocks && ! isDisabled; - return ( + return ( ( - + ) } renderContent={ ( { onClose } ) => ( diff --git a/packages/block-editor/src/components/block-navigation/index.js b/packages/block-editor/src/components/block-navigation/index.js index 0e4413c2d85a3..4d25ffda1bb01 100644 --- a/packages/block-editor/src/components/block-navigation/index.js +++ b/packages/block-editor/src/components/block-navigation/index.js @@ -16,24 +16,29 @@ import { __ } from '@wordpress/i18n'; */ import BlockNavigationList from './list'; -function BlockNavigation( { rootBlock, rootBlocks, selectedBlockClientId, selectBlock } ) { +function BlockNavigation( { + rootBlock, + rootBlocks, + selectedBlockClientId, + selectBlock, +} ) { if ( ! rootBlocks || rootBlocks.length === 0 ) { return null; } - const hasHierarchy = ( - rootBlock && ( - rootBlock.clientId !== selectedBlockClientId || - ( rootBlock.innerBlocks && rootBlock.innerBlocks.length !== 0 ) - ) - ); + const hasHierarchy = + rootBlock && + ( rootBlock.clientId !== selectedBlockClientId || + ( rootBlock.innerBlocks && rootBlock.innerBlocks.length !== 0 ) ); return ( -

        { __( 'Block navigation' ) }

        +

        + { __( 'Block navigation' ) } +

        { hasHierarchy && (
        - { showNestedBlocks && !! block.innerBlocks && !! block.innerBlocks.length && ( - - ) } + { showNestedBlocks && + !! block.innerBlocks && + !! block.innerBlocks.length && ( + + ) } ); } ) } diff --git a/packages/block-editor/src/components/block-pattern-picker/index.js b/packages/block-editor/src/components/block-pattern-picker/index.js deleted file mode 100644 index 87ea8d5021b9b..0000000000000 --- a/packages/block-editor/src/components/block-pattern-picker/index.js +++ /dev/null @@ -1,67 +0,0 @@ -/** - * External dependencies - */ -import classnames from 'classnames'; - -/** - * WordPress dependencies - */ -import { __ } from '@wordpress/i18n'; -import { Button, Placeholder } from '@wordpress/components'; - -function BlockPatternPicker( { - icon = 'layout', - label = __( 'Choose pattern' ), - instructions = __( 'Select a pattern to start with.' ), - patterns, - onSelect, - allowSkip, -} ) { - const classes = classnames( 'block-editor-block-pattern-picker', { - 'has-many-patterns': patterns.length > 4, - } ); - - return ( - - { - /* - * Disable reason: The `list` ARIA role is redundant but - * Safari+VoiceOver won't announce the list otherwise. - */ - /* eslint-disable jsx-a11y/no-redundant-roles */ - } -
          - { patterns.map( ( pattern ) => ( -
        • -
        • - ) ) } -
        - { /* eslint-enable jsx-a11y/no-redundant-roles */ } - { allowSkip && ( -
        - -
        - ) } -
        - ); -} - -export default BlockPatternPicker; diff --git a/packages/block-editor/src/components/block-preview/index.js b/packages/block-editor/src/components/block-preview/index.js index e745dedc49f20..9215221096e95 100644 --- a/packages/block-editor/src/components/block-preview/index.js +++ b/packages/block-editor/src/components/block-preview/index.js @@ -9,7 +9,13 @@ import classnames from 'classnames'; */ import { Disabled } from '@wordpress/components'; import { withSelect } from '@wordpress/data'; -import { useLayoutEffect, useState, useRef, useReducer, useMemo } from '@wordpress/element'; +import { + useLayoutEffect, + useState, + useRef, + useReducer, + useMemo, +} from '@wordpress/element'; /** * Internal dependencies @@ -37,24 +43,36 @@ function ScaledBlockPreview( { blocks, viewportWidth, padding = 0 } ) { // If we're previewing a single block, scale the preview to fit it. if ( blocks.length === 1 ) { const block = blocks[ 0 ]; - const previewElement = getBlockPreviewContainerDOMNode( block.clientId ); + const previewElement = getBlockPreviewContainerDOMNode( + block.clientId + ); if ( ! previewElement ) { return; } let containerElementRect = containerElement.getBoundingClientRect(); containerElementRect = { - width: containerElementRect.width - ( padding * 2 ), - height: containerElementRect.height - ( padding * 2 ), + width: containerElementRect.width - padding * 2, + height: containerElementRect.height - padding * 2, left: containerElementRect.left, top: containerElementRect.top, }; const scaledElementRect = previewElement.getBoundingClientRect(); - const scale = containerElementRect.width / scaledElementRect.width || 1; - const offsetX = ( -( scaledElementRect.left - containerElementRect.left ) * scale ) + padding; - const offsetY = ( containerElementRect.height > scaledElementRect.height * scale ) ? - ( ( containerElementRect.height - ( scaledElementRect.height * scale ) ) / 2 ) + padding : 0; + const scale = + containerElementRect.width / scaledElementRect.width || 1; + const offsetX = + -( scaledElementRect.left - containerElementRect.left ) * + scale + + padding; + const offsetY = + containerElementRect.height > + scaledElementRect.height * scale + ? ( containerElementRect.height - + scaledElementRect.height * scale ) / + 2 + + padding + : 0; setPreviewScale( scale ); setPosition( { x: offsetX, y: offsetY } ); @@ -92,34 +110,43 @@ function ScaledBlockPreview( { blocks, viewportWidth, padding = 0 } ) { return (
        - +
        ); } -export function BlockPreview( { blocks, viewportWidth = 700, padding, settings } ) { +export function BlockPreview( { + blocks, + viewportWidth = 700, + padding, + settings, +} ) { const renderedBlocks = useMemo( () => castArray( blocks ), [ blocks ] ); - const [ recompute, triggerRecompute ] = useReducer( ( state ) => state + 1, 0 ); + const [ recompute, triggerRecompute ] = useReducer( + ( state ) => state + 1, + 0 + ); useLayoutEffect( triggerRecompute, [ blocks ] ); return ( - - { - /* - * The key prop is used to force recomputing the preview - * by remounting the component, ScaledBlockPreview is not meant to - * be rerendered. - */ - } + + { /* + * The key prop is used to force recomputing the preview + * by remounting the component, ScaledBlockPreview is not meant to + * be rerendered. + */ } { - const { hasSelectedBlock, hasMultiSelection } = select( 'core/block-editor' ); + const { hasSelectedBlock, hasMultiSelection } = select( + 'core/block-editor' + ); return { hasSelectedBlock: hasSelectedBlock(), diff --git a/packages/block-editor/src/components/block-settings-menu/block-convert-button.js b/packages/block-editor/src/components/block-settings-menu/block-convert-button.js index d0e6f8323bbd2..3d321a2010ec0 100644 --- a/packages/block-editor/src/components/block-settings-menu/block-convert-button.js +++ b/packages/block-editor/src/components/block-settings-menu/block-convert-button.js @@ -11,10 +11,7 @@ export default function BlockConvertButton( { shouldRender, onClick, small } ) { const label = __( 'Convert to Blocks' ); return ( - + { ! small && label } ); diff --git a/packages/block-editor/src/components/block-settings-menu/block-html-convert-button.js b/packages/block-editor/src/components/block-settings-menu/block-html-convert-button.js index 3527d7d0d460c..339b6cdbd11e7 100644 --- a/packages/block-editor/src/components/block-settings-menu/block-html-convert-button.js +++ b/packages/block-editor/src/components/block-settings-menu/block-html-convert-button.js @@ -16,13 +16,14 @@ export default compose( return { block, - shouldRender: ( block && block.name === 'core/html' ), + shouldRender: block && block.name === 'core/html', }; } ), withDispatch( ( dispatch, { block } ) => ( { - onClick: () => dispatch( 'core/block-editor' ).replaceBlocks( - block.clientId, - rawHandler( { HTML: getBlockContent( block ) } ), - ), - } ) ), + onClick: () => + dispatch( 'core/block-editor' ).replaceBlocks( + block.clientId, + rawHandler( { HTML: getBlockContent( block ) } ) + ), + } ) ) )( BlockConvertButton ); diff --git a/packages/block-editor/src/components/block-settings-menu/block-mode-toggle.js b/packages/block-editor/src/components/block-settings-menu/block-mode-toggle.js index 57f285024538c..acf1f37830e13 100644 --- a/packages/block-editor/src/components/block-settings-menu/block-mode-toggle.js +++ b/packages/block-editor/src/components/block-settings-menu/block-mode-toggle.js @@ -12,20 +12,25 @@ import { getBlockType, hasBlockSupport } from '@wordpress/blocks'; import { withSelect, withDispatch } from '@wordpress/data'; import { compose } from '@wordpress/compose'; -export function BlockModeToggle( { blockType, mode, onToggleMode, small = false, isCodeEditingEnabled = true } ) { - if ( ! hasBlockSupport( blockType, 'html', true ) || ! isCodeEditingEnabled ) { +export function BlockModeToggle( { + blockType, + mode, + onToggleMode, + small = false, + isCodeEditingEnabled = true, +} ) { + if ( + ! hasBlockSupport( blockType, 'html', true ) || + ! isCodeEditingEnabled + ) { return null; } - const label = mode === 'visual' ? - __( 'Edit as HTML' ) : - __( 'Edit visually' ); + const label = + mode === 'visual' ? __( 'Edit as HTML' ) : __( 'Edit visually' ); return ( - + { ! small && label } ); @@ -33,7 +38,9 @@ export function BlockModeToggle( { blockType, mode, onToggleMode, small = false, export default compose( [ withSelect( ( select, { clientId } ) => { - const { getBlock, getBlockMode, getSettings } = select( 'core/block-editor' ); + const { getBlock, getBlockMode, getSettings } = select( + 'core/block-editor' + ); const block = getBlock( clientId ); const isCodeEditingEnabled = getSettings().codeEditingEnabled; diff --git a/packages/block-editor/src/components/block-settings-menu/block-settings-menu-first-item.js b/packages/block-editor/src/components/block-settings-menu/block-settings-menu-first-item.js index e01f943684ffe..43f83d136abe7 100644 --- a/packages/block-editor/src/components/block-settings-menu/block-settings-menu-first-item.js +++ b/packages/block-editor/src/components/block-settings-menu/block-settings-menu-first-item.js @@ -3,7 +3,9 @@ */ import { createSlotFill } from '@wordpress/components'; -const { Fill: __experimentalBlockSettingsMenuFirstItem, Slot } = createSlotFill( '__experimentalBlockSettingsMenuFirstItem' ); +const { Fill: __experimentalBlockSettingsMenuFirstItem, Slot } = createSlotFill( + '__experimentalBlockSettingsMenuFirstItem' +); __experimentalBlockSettingsMenuFirstItem.Slot = Slot; diff --git a/packages/block-editor/src/components/block-settings-menu/block-settings-menu-plugins-extension.js b/packages/block-editor/src/components/block-settings-menu/block-settings-menu-plugins-extension.js index a750b5b36cc18..7a3058b4c945b 100644 --- a/packages/block-editor/src/components/block-settings-menu/block-settings-menu-plugins-extension.js +++ b/packages/block-editor/src/components/block-settings-menu/block-settings-menu-plugins-extension.js @@ -3,7 +3,10 @@ */ import { createSlotFill } from '@wordpress/components'; -const { Fill: __experimentalBlockSettingsMenuPluginsExtension, Slot } = createSlotFill( '__experimentalBlockSettingsMenuPluginsExtension' ); +const { + Fill: __experimentalBlockSettingsMenuPluginsExtension, + Slot, +} = createSlotFill( '__experimentalBlockSettingsMenuPluginsExtension' ); __experimentalBlockSettingsMenuPluginsExtension.Slot = Slot; diff --git a/packages/block-editor/src/components/block-settings-menu/block-unknown-convert-button.js b/packages/block-editor/src/components/block-settings-menu/block-unknown-convert-button.js index 46eda45141ad1..7bbce60bf6dfe 100644 --- a/packages/block-editor/src/components/block-settings-menu/block-unknown-convert-button.js +++ b/packages/block-editor/src/components/block-settings-menu/block-unknown-convert-button.js @@ -1,7 +1,11 @@ /** * WordPress dependencies */ -import { getFreeformContentHandlerName, rawHandler, serialize } from '@wordpress/blocks'; +import { + getFreeformContentHandlerName, + rawHandler, + serialize, +} from '@wordpress/blocks'; import { compose } from '@wordpress/compose'; import { withSelect, withDispatch } from '@wordpress/data'; @@ -16,13 +20,15 @@ export default compose( return { block, - shouldRender: ( block && block.name === getFreeformContentHandlerName() ), + shouldRender: + block && block.name === getFreeformContentHandlerName(), }; } ), withDispatch( ( dispatch, { block } ) => ( { - onClick: () => dispatch( 'core/block-editor' ).replaceBlocks( - block.clientId, - rawHandler( { HTML: serialize( block ) } ) - ), - } ) ), + onClick: () => + dispatch( 'core/block-editor' ).replaceBlocks( + block.clientId, + rawHandler( { HTML: serialize( block ) } ) + ), + } ) ) )( BlockConvertButton ); diff --git a/packages/block-editor/src/components/block-settings-menu/index.js b/packages/block-editor/src/components/block-settings-menu/index.js index c73d3ca615eea..8bd25660890eb 100644 --- a/packages/block-editor/src/components/block-settings-menu/index.js +++ b/packages/block-editor/src/components/block-settings-menu/index.js @@ -14,6 +14,7 @@ import { MenuItem, } from '@wordpress/components'; import { useSelect } from '@wordpress/data'; +import { trash } from '@wordpress/icons'; /** * Internal dependencies @@ -36,12 +37,20 @@ export function BlockSettingsMenu( { clientIds } ) { const firstBlockClientId = blockClientIds[ 0 ]; const shortcuts = useSelect( ( select ) => { - const { getShortcutRepresentation } = select( 'core/keyboard-shortcuts' ); + const { getShortcutRepresentation } = select( + 'core/keyboard-shortcuts' + ); return { - duplicate: getShortcutRepresentation( 'core/block-editor/duplicate' ), + duplicate: getShortcutRepresentation( + 'core/block-editor/duplicate' + ), remove: getShortcutRepresentation( 'core/block-editor/remove' ), - insertAfter: getShortcutRepresentation( 'core/block-editor/insert-after' ), - insertBefore: getShortcutRepresentation( 'core/block-editor/insert-before' ), + insertAfter: getShortcutRepresentation( + 'core/block-editor/insert-after' + ), + insertBefore: getShortcutRepresentation( + 'core/block-editor/insert-before' + ), }; }, [] ); @@ -81,7 +90,10 @@ export function BlockSettingsMenu( { clientIds } ) { ) } { canDuplicate && ( @@ -91,16 +103,26 @@ export function BlockSettingsMenu( { clientIds } ) { { canInsertDefaultBlock && ( <> { __( 'Insert Before' ) } { __( 'Insert After' ) } @@ -119,11 +141,18 @@ export function BlockSettingsMenu( { clientIds } ) { { ! isLocked && ( - { _n( 'Remove Block', 'Remove Blocks', count ) } + { _n( + 'Remove Block', + 'Remove Blocks', + count + ) } ) } diff --git a/packages/block-editor/src/components/block-settings/button.native.js b/packages/block-editor/src/components/block-settings/button.native.js index ab2e1601a8880..5225e8bb988c4 100644 --- a/packages/block-editor/src/components/block-settings/button.native.js +++ b/packages/block-editor/src/components/block-settings/button.native.js @@ -7,12 +7,13 @@ import { withDispatch } from '@wordpress/data'; const { Fill, Slot } = createSlotFill( 'SettingsToolbarButton' ); -const SettingsButton = ( { openGeneralSidebar } ) => +const SettingsButton = ( { openGeneralSidebar } ) => ( ; + /> +); const SettingsButtonFill = ( props ) => ( diff --git a/packages/block-editor/src/components/block-settings/container.native.js b/packages/block-editor/src/components/block-settings/container.native.js index 1b59377f29161..fe59d3060a29f 100644 --- a/packages/block-editor/src/components/block-settings/container.native.js +++ b/packages/block-editor/src/components/block-settings/container.native.js @@ -11,7 +11,11 @@ import { InspectorControls } from '@wordpress/block-editor'; */ import styles from './container.native.scss'; -function BottomSheetSettings( { editorSidebarOpened, closeGeneralSidebar, ...props } ) { +function BottomSheetSettings( { + editorSidebarOpened, + closeGeneralSidebar, + ...props +} ) { return ( - + ); } export default compose( [ withSelect( ( select ) => { - const { - isEditorSidebarOpened, - } = select( 'core/edit-post' ); + const { isEditorSidebarOpened } = select( 'core/edit-post' ); return { editorSidebarOpened: isEditorSidebarOpened(), @@ -42,5 +44,4 @@ export default compose( [ closeGeneralSidebar, }; } ), -] -)( BottomSheetSettings ); +] )( BottomSheetSettings ); diff --git a/packages/block-editor/src/components/block-styles/index.js b/packages/block-editor/src/components/block-styles/index.js index f3fd2b2f85a8a..0c4352d41530a 100644 --- a/packages/block-editor/src/components/block-styles/index.js +++ b/packages/block-editor/src/components/block-styles/index.js @@ -12,7 +12,11 @@ import { withSelect, withDispatch } from '@wordpress/data'; import TokenList from '@wordpress/token-list'; import { ENTER, SPACE } from '@wordpress/keycodes'; import { _x } from '@wordpress/i18n'; -import { getBlockType, cloneBlock, getBlockFromExample } from '@wordpress/blocks'; +import { + getBlockType, + cloneBlock, + getBlockFromExample, +} from '@wordpress/blocks'; /** * Internal dependencies @@ -90,7 +94,11 @@ function BlockStyles( { const activeStyle = getActiveStyle( styles, className ); function updateClassName( style ) { - const updatedClassName = replaceActiveStyle( className, activeStyle, style ); + const updatedClassName = replaceActiveStyle( + className, + activeStyle, + style + ); onChangeClassName( updatedClassName ); onHoverClassName( null ); onSwitch(); @@ -99,23 +107,33 @@ function BlockStyles( { return (
        { styles.map( ( style ) => { - const styleClassName = replaceActiveStyle( className, activeStyle, style ); + const styleClassName = replaceActiveStyle( + className, + activeStyle, + style + ); return (
        updateClassName( style ) } onKeyDown={ ( event ) => { - if ( ENTER === event.keyCode || SPACE === event.keyCode ) { + if ( + ENTER === event.keyCode || + SPACE === event.keyCode + ) { event.preventDefault(); updateClassName( style ); } } } - onMouseEnter={ () => onHoverClassName( styleClassName ) } + onMouseEnter={ () => + onHoverClassName( styleClassName ) + } onMouseLeave={ () => onHoverClassName( null ) } role="button" tabIndex="0" @@ -125,12 +143,18 @@ function BlockStyles( {
        @@ -161,9 +185,12 @@ export default compose( [ withDispatch( ( dispatch, { clientId } ) => { return { onChangeClassName( newClassName ) { - dispatch( 'core/block-editor' ).updateBlockAttributes( clientId, { - className: newClassName, - } ); + dispatch( 'core/block-editor' ).updateBlockAttributes( + clientId, + { + className: newClassName, + } + ); }, }; } ), diff --git a/packages/block-editor/src/components/block-styles/test/index.js b/packages/block-editor/src/components/block-styles/test/index.js index 639d92ed4aeaa..6b73864d08c94 100644 --- a/packages/block-editor/src/components/block-styles/test/index.js +++ b/packages/block-editor/src/components/block-styles/test/index.js @@ -5,40 +5,28 @@ import { getActiveStyle, replaceActiveStyle } from '../'; describe( 'getActiveStyle', () => { it( 'Should return the undefined if no active style', () => { - const styles = [ - { name: 'small' }, - { name: 'big' }, - ]; + const styles = [ { name: 'small' }, { name: 'big' } ]; const className = 'custom-className'; expect( getActiveStyle( styles, className ) ).toBeUndefined(); } ); it( 'Should return the default style if no active style', () => { - const styles = [ - { name: 'small' }, - { name: 'big', isDefault: true }, - ]; + const styles = [ { name: 'small' }, { name: 'big', isDefault: true } ]; const className = 'custom-className'; expect( getActiveStyle( styles, className ).name ).toBe( 'big' ); } ); it( 'Should return the active style', () => { - const styles = [ - { name: 'small' }, - { name: 'big', isDefault: true }, - ]; + const styles = [ { name: 'small' }, { name: 'big', isDefault: true } ]; const className = 'this-is-custom is-style-small'; expect( getActiveStyle( styles, className ).name ).toBe( 'small' ); } ); it( 'Should return the first active style', () => { - const styles = [ - { name: 'small' }, - { name: 'big', isDefault: true }, - ]; + const styles = [ { name: 'small' }, { name: 'big', isDefault: true } ]; const className = 'this-is-custom is-style-small is-style-big'; expect( getActiveStyle( styles, className ).name ).toBe( 'small' ); @@ -51,8 +39,9 @@ describe( 'replaceActiveStyle', () => { const newStyle = { name: 'small' }; const className = 'custom-class'; - expect( replaceActiveStyle( className, activeStyle, newStyle ) ) - .toBe( 'custom-class is-style-small' ); + expect( replaceActiveStyle( className, activeStyle, newStyle ) ).toBe( + 'custom-class is-style-small' + ); } ); it( 'Should add the new style if no active style (no existing class)', () => { @@ -60,8 +49,9 @@ describe( 'replaceActiveStyle', () => { const newStyle = { name: 'small' }; const className = ''; - expect( replaceActiveStyle( className, activeStyle, newStyle ) ) - .toBe( 'is-style-small' ); + expect( replaceActiveStyle( className, activeStyle, newStyle ) ).toBe( + 'is-style-small' + ); } ); it( 'Should add the new style if no active style (unassigned default)', () => { @@ -69,8 +59,9 @@ describe( 'replaceActiveStyle', () => { const newStyle = { name: 'small' }; const className = ''; - expect( replaceActiveStyle( className, activeStyle, newStyle ) ) - .toBe( 'is-style-small' ); + expect( replaceActiveStyle( className, activeStyle, newStyle ) ).toBe( + 'is-style-small' + ); } ); it( 'Should replace the previous active style', () => { @@ -78,7 +69,8 @@ describe( 'replaceActiveStyle', () => { const newStyle = { name: 'small' }; const className = 'custom-class is-style-large'; - expect( replaceActiveStyle( className, activeStyle, newStyle ) ) - .toBe( 'custom-class is-style-small' ); + expect( replaceActiveStyle( className, activeStyle, newStyle ) ).toBe( + 'custom-class is-style-small' + ); } ); } ); diff --git a/packages/block-editor/src/components/block-switcher/index.js b/packages/block-editor/src/components/block-switcher/index.js index 09561f63199cd..421c26ebe09b5 100644 --- a/packages/block-editor/src/components/block-switcher/index.js +++ b/packages/block-editor/src/components/block-switcher/index.js @@ -7,8 +7,21 @@ import { castArray, filter, first, mapKeys, orderBy, uniq, map } from 'lodash'; * WordPress dependencies */ import { __, _n, sprintf } from '@wordpress/i18n'; -import { Dropdown, Button, Toolbar, PanelBody, Path, SVG } from '@wordpress/components'; -import { getBlockType, getPossibleBlockTransformations, switchToBlockType, cloneBlock, getBlockFromExample } from '@wordpress/blocks'; +import { + Dropdown, + Button, + Toolbar, + PanelBody, + Path, + SVG, +} from '@wordpress/components'; +import { + getBlockType, + getPossibleBlockTransformations, + switchToBlockType, + cloneBlock, + getBlockFromExample, +} from '@wordpress/blocks'; import { Component } from '@wordpress/element'; import { DOWN } from '@wordpress/keycodes'; import { withSelect, withDispatch } from '@wordpress/data'; @@ -36,7 +49,12 @@ export class BlockSwitcher extends Component { } render() { - const { blocks, onTransform, inserterItems, hasBlockStyles } = this.props; + const { + blocks, + onTransform, + inserterItems, + hasBlockStyles, + } = this.props; const { hoveredClassName } = this.state; if ( ! blocks || ! blocks.length ) { @@ -44,7 +62,9 @@ export class BlockSwitcher extends Component { } const hoveredBlock = hoveredClassName ? blocks[ 0 ] : null; - const hoveredBlockType = hoveredClassName ? getBlockType( hoveredBlock.name ) : null; + const hoveredBlockType = hoveredClassName + ? getBlockType( hoveredBlock.name ) + : null; const itemsByName = mapKeys( inserterItems, ( { name } ) => name ); const possibleBlockTransformations = orderBy( @@ -58,7 +78,8 @@ export class BlockSwitcher extends Component { // When selection consists of blocks of multiple types, display an // appropriate icon to communicate the non-uniformity. - const isSelectionOfSameType = uniq( map( blocks, 'name' ) ).length === 1; + const isSelectionOfSameType = + uniq( map( blocks, 'name' ) ).length === 1; let icon; if ( isSelectionOfSameType ) { @@ -95,18 +116,17 @@ export class BlockSwitcher extends Component { onToggle(); } }; - const label = ( - 1 === blocks.length ? - __( 'Change block type or style' ) : - sprintf( - _n( - 'Change type of %d block', - 'Change type of %d blocks', + const label = + 1 === blocks.length + ? __( 'Change block type or style' ) + : sprintf( + _n( + 'Change type of %d block', + 'Change type of %d blocks', + blocks.length + ), blocks.length - ), - blocks.length - ) - ); + ); return ( @@ -118,21 +138,28 @@ export class BlockSwitcher extends Component { label={ label } onKeyDown={ openOnArrowDown } showTooltip - icon={ ( + icon={ <> - + + + - ) } + } /> ); } } renderContent={ ( { onClose } ) => ( <> - { ( hasBlockStyles || possibleBlockTransformations.length !== 0 ) && + { ( hasBlockStyles || + possibleBlockTransformations.length !== 0 ) && (
        - { hasBlockStyles && + { hasBlockStyles && ( - } - { possibleBlockTransformations.length !== 0 && + ) } + { possibleBlockTransformations.length !== 0 && ( ( { - id: destinationBlockType.name, - icon: destinationBlockType.icon, - title: destinationBlockType.title, - } ) ) } + items={ possibleBlockTransformations.map( + ( destinationBlockType ) => ( { + id: + destinationBlockType.name, + icon: + destinationBlockType.icon, + title: + destinationBlockType.title, + } ) + ) } onSelect={ ( item ) => { onTransform( blocks, item.id ); onClose(); } } /> - } + ) }
        - } - { ( hoveredClassName !== null ) && + ) } + { hoveredClassName !== null && (
        -
        { __( 'Preview' ) }
        +
        + { __( 'Preview' ) } +
        - } + ) } ) } /> @@ -189,9 +238,15 @@ export class BlockSwitcher extends Component { export default compose( withSelect( ( select, { clientIds } ) => { - const { getBlocksByClientId, getBlockRootClientId, getInserterItems } = select( 'core/block-editor' ); + const { + getBlocksByClientId, + getBlockRootClientId, + getInserterItems, + } = select( 'core/block-editor' ); const { getBlockStyles } = select( 'core/blocks' ); - const rootClientId = getBlockRootClientId( first( castArray( clientIds ) ) ); + const rootClientId = getBlockRootClientId( + first( castArray( clientIds ) ) + ); const blocks = getBlocksByClientId( clientIds ); const firstBlock = blocks && blocks.length === 1 ? blocks[ 0 ] : null; const styles = firstBlock && getBlockStyles( firstBlock.name ); @@ -208,5 +263,5 @@ export default compose( switchToBlockType( blocks, name ) ); }, - } ) ), + } ) ) )( BlockSwitcher ); diff --git a/packages/block-editor/src/components/block-switcher/multi-blocks-switcher.js b/packages/block-editor/src/components/block-switcher/multi-blocks-switcher.js index 8adae420dab99..a68093f982b0f 100644 --- a/packages/block-editor/src/components/block-switcher/multi-blocks-switcher.js +++ b/packages/block-editor/src/components/block-switcher/multi-blocks-switcher.js @@ -8,7 +8,10 @@ import { withSelect } from '@wordpress/data'; */ import BlockSwitcher from './'; -export function MultiBlocksSwitcher( { isMultiBlockSelection, selectedBlockClientIds } ) { +export function MultiBlocksSwitcher( { + isMultiBlockSelection, + selectedBlockClientIds, +} ) { if ( ! isMultiBlockSelection ) { return null; } @@ -17,12 +20,12 @@ export function MultiBlocksSwitcher( { isMultiBlockSelection, selectedBlockClien ); } -export default withSelect( - ( select ) => { - const selectedBlockClientIds = select( 'core/block-editor' ).getMultiSelectedBlockClientIds(); - return { - isMultiBlockSelection: selectedBlockClientIds.length > 1, - selectedBlockClientIds, - }; - } -)( MultiBlocksSwitcher ); +export default withSelect( ( select ) => { + const selectedBlockClientIds = select( + 'core/block-editor' + ).getMultiSelectedBlockClientIds(); + return { + isMultiBlockSelection: selectedBlockClientIds.length > 1, + selectedBlockClientIds, + }; +} )( MultiBlocksSwitcher ); diff --git a/packages/block-editor/src/components/block-switcher/test/index.js b/packages/block-editor/src/components/block-switcher/test/index.js index daa39038cbbf2..dea53770ca7d0 100644 --- a/packages/block-editor/src/components/block-switcher/test/index.js +++ b/packages/block-editor/src/components/block-switcher/test/index.js @@ -51,7 +51,7 @@ describe( 'BlockSwitcher', () => { registerBlockType( 'core/heading', { category: 'common', title: 'Heading', - edit: () => { }, + edit: () => {}, save: () => {}, transforms: { to: [ @@ -73,14 +73,16 @@ describe( 'BlockSwitcher', () => { registerBlockType( 'core/paragraph', { category: 'common', title: 'Paragraph', - edit: () => { }, + edit: () => {}, save: () => {}, transforms: { - to: [ { - type: 'block', - blocks: [ 'core/heading' ], - transform: () => {}, - } ], + to: [ + { + type: 'block', + blocks: [ 'core/heading' ], + transform: () => {}, + }, + ], }, } ); } ); @@ -97,15 +99,15 @@ describe( 'BlockSwitcher', () => { } ); test( 'should render switcher with blocks', () => { - const blocks = [ - headingBlock1, - ]; + const blocks = [ headingBlock1 ]; const inserterItems = [ { name: 'core/heading', frecency: 1 }, { name: 'core/paragraph', frecency: 1 }, ]; - const wrapper = shallow( ); + const wrapper = shallow( + + ); expect( wrapper ).toMatchSnapshot(); } ); @@ -117,7 +119,9 @@ describe( 'BlockSwitcher', () => { { name: 'core/paragraph', frecency: 1 }, ]; - const wrapper = shallow( ); + const wrapper = shallow( + + ); expect( wrapper ).toMatchSnapshot(); } ); @@ -129,15 +133,15 @@ describe( 'BlockSwitcher', () => { { name: 'core/paragraph', frecency: 1 }, ]; - const wrapper = shallow( ); + const wrapper = shallow( + + ); expect( wrapper ).toMatchSnapshot(); } ); describe( 'Dropdown', () => { - const blocks = [ - headingBlock1, - ]; + const blocks = [ headingBlock1 ]; const inserterItems = [ { name: 'core/quote', frecency: 1 }, @@ -149,7 +153,13 @@ describe( 'BlockSwitcher', () => { const onTransformStub = jest.fn(); const getDropdown = () => { - const blockSwitcher = shallow( ); + const blockSwitcher = shallow( + + ); return blockSwitcher.find( 'Dropdown' ); }; @@ -170,8 +180,17 @@ describe( 'BlockSwitcher', () => { } ); test( 'should simulate a keydown event, which should call onToggle and open transform toggle.', () => { - const toggleClosed = shallow( getDropdown().props().renderToggle( { onToggle: onToggleStub, isOpen: false } ) ); - const iconButtonClosed = toggleClosed.find( 'ForwardRef(Button)' ); + const toggleClosed = shallow( + getDropdown() + .props() + .renderToggle( { + onToggle: onToggleStub, + isOpen: false, + } ) + ); + const iconButtonClosed = toggleClosed.find( + 'ForwardRef(Button)' + ); iconButtonClosed.simulate( 'keydown', mockKeyDown ); @@ -179,7 +198,14 @@ describe( 'BlockSwitcher', () => { } ); test( 'should simulate a click event, which should call onToggle.', () => { - const toggleOpen = shallow( getDropdown().props().renderToggle( { onToggle: onToggleStub, isOpen: true } ) ); + const toggleOpen = shallow( + getDropdown() + .props() + .renderToggle( { + onToggle: onToggleStub, + isOpen: true, + } ) + ); const iconButtonOpen = toggleOpen.find( 'ForwardRef(Button)' ); iconButtonOpen.simulate( 'keydown', mockKeyDown ); @@ -191,7 +217,13 @@ describe( 'BlockSwitcher', () => { describe( '.renderContent', () => { test( 'should create the transform items for the chosen block. A heading block will have 3 items', () => { const onCloseStub = jest.fn(); - const content = shallow(
        { getDropdown().props().renderContent( { onClose: onCloseStub } ) }
        ); + const content = shallow( +
        + { getDropdown() + .props() + .renderContent( { onClose: onCloseStub } ) } +
        + ); const blockList = content.find( 'BlockTypesList' ); expect( blockList.prop( 'items' ) ).toHaveLength( 1 ); } ); diff --git a/packages/block-editor/src/components/block-switcher/test/multi-blocks-switcher.js b/packages/block-editor/src/components/block-switcher/test/multi-blocks-switcher.js index 30199f6c59852..5e99eaba7f675 100644 --- a/packages/block-editor/src/components/block-switcher/test/multi-blocks-switcher.js +++ b/packages/block-editor/src/components/block-switcher/test/multi-blocks-switcher.js @@ -11,9 +11,7 @@ import { MultiBlocksSwitcher } from '../multi-blocks-switcher'; describe( 'MultiBlocksSwitcher', () => { test( 'should return null when the selection is not a multi block selection.', () => { const isMultiBlockSelection = false; - const selectedBlockClientIds = [ - 'clientid', - ]; + const selectedBlockClientIds = [ 'clientid' ]; const wrapper = shallow( { test( 'should return a BlockSwitcher element matching the snapshot.', () => { const isMultiBlockSelection = true; - const selectedBlockClientIds = [ - 'clientid-1', - 'clientid-2', - ]; + const selectedBlockClientIds = [ 'clientid-1', 'clientid-2' ]; const wrapper = shallow( 1 ) { return (
        - { hasMovers && ( ) } + { hasMovers && ( + + ) }
        @@ -70,15 +74,23 @@ export default function BlockToolbar() { return (
        - { hasMovers && ( ) } + { hasMovers && ( + + ) } { mode === 'visual' && isValid && ( <> - - + + ) } diff --git a/packages/block-editor/src/components/block-toolbar/index.native.js b/packages/block-editor/src/components/block-toolbar/index.native.js index 13627f86d6f43..1819c5b2e5ba1 100644 --- a/packages/block-editor/src/components/block-toolbar/index.native.js +++ b/packages/block-editor/src/components/block-toolbar/index.native.js @@ -21,12 +21,14 @@ export default function BlockToolbar() { return { blockClientIds: selectedBlockClientIds, - isValid: selectedBlockClientIds.length === 1 ? - isBlockValid( selectedBlockClientIds[ 0 ] ) : - null, - mode: selectedBlockClientIds.length === 1 ? - getBlockMode( selectedBlockClientIds[ 0 ] ) : - null, + isValid: + selectedBlockClientIds.length === 1 + ? isBlockValid( selectedBlockClientIds[ 0 ] ) + : null, + mode: + selectedBlockClientIds.length === 1 + ? getBlockMode( selectedBlockClientIds[ 0 ] ) + : null, }; }, [] ); diff --git a/packages/block-editor/src/components/block-types-list/index.js b/packages/block-editor/src/components/block-types-list/index.js index 42b85658c7d39..b806457e71a40 100644 --- a/packages/block-editor/src/components/block-types-list/index.js +++ b/packages/block-editor/src/components/block-types-list/index.js @@ -8,7 +8,50 @@ import { getBlockMenuDefaultClassName } from '@wordpress/blocks'; */ import InserterListItem from '../inserter-list-item'; -function BlockTypesList( { items, onSelect, onHover = () => {}, children } ) { +function BlockTypesList( { + items = [], + onSelect, + onHover = () => {}, + children, +} ) { + const normalizedItems = items.reduce( ( result, item ) => { + const { variations = [] } = item; + const hasDefaultVariation = variations.some( + ( { isDefault } ) => isDefault + ); + + // If there is no default inserter variation provided, + // then default block type is displayed. + if ( ! hasDefaultVariation ) { + result.push( item ); + } + + if ( variations.length ) { + result = result.concat( + variations.map( ( variation ) => { + return { + ...item, + id: `${ item.id }-${ variation.name }`, + icon: variation.icon || item.icon, + title: variation.title || item.title, + description: variation.description || item.description, + // If `example` is explicitly undefined for the variation, the preview will not be shown. + example: variation.hasOwnProperty( 'example' ) + ? variation.example + : item.example, + initialAttributes: { + ...item.initialAttributes, + ...variation.attributes, + }, + innerBlocks: variation.innerBlocks, + }; + } ) + ); + } + + return result; + }, [] ); + return ( /* * Disable reason: The `list` ARIA role is redundant but @@ -16,23 +59,25 @@ function BlockTypesList( { items, onSelect, onHover = () => {}, children } ) { */ /* eslint-disable jsx-a11y/no-redundant-roles */
          - { items && items.map( ( item ) => - { - onSelect( item ); - onHover( null ); - } } - onFocus={ () => onHover( item ) } - onMouseEnter={ () => onHover( item ) } - onMouseLeave={ () => onHover( null ) } - onBlur={ () => onHover( null ) } - isDisabled={ item.isDisabled } - title={ item.title } - /> - ) } + { normalizedItems.map( ( item ) => { + return ( + { + onSelect( item ); + onHover( null ); + } } + onFocus={ () => onHover( item ) } + onMouseEnter={ () => onHover( item ) } + onMouseLeave={ () => onHover( null ) } + onBlur={ () => onHover( null ) } + isDisabled={ item.isDisabled } + title={ item.title } + /> + ); + } ) } { children }
        /* eslint-enable jsx-a11y/no-redundant-roles */ diff --git a/packages/block-editor/src/components/block-variation-picker/index.js b/packages/block-editor/src/components/block-variation-picker/index.js new file mode 100644 index 0000000000000..6bf2646f83349 --- /dev/null +++ b/packages/block-editor/src/components/block-variation-picker/index.js @@ -0,0 +1,65 @@ +/** + * External dependencies + */ +import classnames from 'classnames'; + +/** + * WordPress dependencies + */ +import { __ } from '@wordpress/i18n'; +import { Button, Placeholder } from '@wordpress/components'; + +function BlockVariationPicker( { + icon = 'layout', + label = __( 'Choose variation' ), + instructions = __( 'Select a variation to start with.' ), + variations, + onSelect, + allowSkip, +} ) { + const classes = classnames( 'block-editor-block-variation-picker', { + 'has-many-variations': variations.length > 4, + } ); + + return ( + + { /* + * Disable reason: The `list` ARIA role is redundant but + * Safari+VoiceOver won't announce the list otherwise. + */ + /* eslint-disable jsx-a11y/no-redundant-roles */ } +
          + { variations.map( ( variation ) => ( +
        • +
        • + ) ) } +
        + { /* eslint-enable jsx-a11y/no-redundant-roles */ } + { allowSkip && ( +
        + +
        + ) } +
        + ); +} + +export default BlockVariationPicker; diff --git a/packages/block-editor/src/components/block-pattern-picker/style.scss b/packages/block-editor/src/components/block-variation-picker/style.scss similarity index 81% rename from packages/block-editor/src/components/block-pattern-picker/style.scss rename to packages/block-editor/src/components/block-variation-picker/style.scss index feaca246095fb..63460d6fcfe98 100644 --- a/packages/block-editor/src/components/block-pattern-picker/style.scss +++ b/packages/block-editor/src/components/block-variation-picker/style.scss @@ -1,4 +1,4 @@ -.block-editor-block-pattern-picker { +.block-editor-block-variation-picker { .components-placeholder__instructions { // Defer to vertical margins applied by template picker options. margin-bottom: 0; @@ -10,14 +10,14 @@ flex-direction: column; } - &.has-many-patterns .components-placeholder__fieldset { + &.has-many-variations .components-placeholder__fieldset { // Allow options to occupy a greater amount of the available space if // many options exist. max-width: 90%; } } -.block-editor-block-pattern-picker__patterns.block-editor-block-pattern-picker__patterns { +.block-editor-block-variation-picker__variations.block-editor-block-variation-picker__variations { display: flex; justify-content: flex-start; flex-direction: row; @@ -34,12 +34,12 @@ max-width: 100px; } - .block-editor-block-pattern-picker__pattern { + .block-editor-block-variation-picker__variation { padding: $grid-size; } } -.block-editor-block-pattern-picker__pattern { +.block-editor-block-variation-picker__variation { width: 100%; &.components-button.has-icon { diff --git a/packages/block-editor/src/components/block-vertical-alignment-toolbar/icons.js b/packages/block-editor/src/components/block-vertical-alignment-toolbar/icons.js index 4642eddb367c7..1404e63a33205 100644 --- a/packages/block-editor/src/components/block-vertical-alignment-toolbar/icons.js +++ b/packages/block-editor/src/components/block-vertical-alignment-toolbar/icons.js @@ -4,22 +4,36 @@ import { Path, SVG } from '@wordpress/components'; export const alignBottom = ( - + ); export const alignCenter = ( - + - + ); export const alignTop = ( - + diff --git a/packages/block-editor/src/components/block-vertical-alignment-toolbar/index.js b/packages/block-editor/src/components/block-vertical-alignment-toolbar/index.js index 917353c5a50dd..ee48eae9ee5ed 100644 --- a/packages/block-editor/src/components/block-vertical-alignment-toolbar/index.js +++ b/packages/block-editor/src/components/block-vertical-alignment-toolbar/index.js @@ -16,40 +16,57 @@ const BLOCK_ALIGNMENTS_CONTROLS = { }, center: { icon: alignCenter, - title: _x( 'Vertically Align Middle', 'Block vertical alignment setting' ), + title: _x( + 'Vertically Align Middle', + 'Block vertical alignment setting' + ), }, bottom: { icon: alignBottom, - title: _x( 'Vertically Align Bottom', 'Block vertical alignment setting' ), + title: _x( + 'Vertically Align Bottom', + 'Block vertical alignment setting' + ), }, }; const DEFAULT_CONTROLS = [ 'top', 'center', 'bottom' ]; const DEFAULT_CONTROL = 'top'; -export function BlockVerticalAlignmentToolbar( { value, onChange, controls = DEFAULT_CONTROLS, isCollapsed = true } ) { +export function BlockVerticalAlignmentToolbar( { + value, + onChange, + controls = DEFAULT_CONTROLS, + isCollapsed = true, +} ) { function applyOrUnset( align ) { return () => onChange( value === align ? undefined : align ); } const activeAlignment = BLOCK_ALIGNMENTS_CONTROLS[ value ]; - const defaultAlignmentControl = BLOCK_ALIGNMENTS_CONTROLS[ DEFAULT_CONTROL ]; + const defaultAlignmentControl = + BLOCK_ALIGNMENTS_CONTROLS[ DEFAULT_CONTROL ]; return ( { - return { - ...BLOCK_ALIGNMENTS_CONTROLS[ control ], - isActive: value === control, - role: isCollapsed ? 'menuitemradio' : undefined, - onClick: applyOrUnset( control ), - }; - } ) + icon={ + activeAlignment + ? activeAlignment.icon + : defaultAlignmentControl.icon } + label={ _x( + 'Change vertical alignment', + 'Block vertical alignment setting label' + ) } + controls={ controls.map( ( control ) => { + return { + ...BLOCK_ALIGNMENTS_CONTROLS[ control ], + isActive: value === control, + role: isCollapsed ? 'menuitemradio' : undefined, + onClick: applyOrUnset( control ), + }; + } ) } /> ); } diff --git a/packages/block-editor/src/components/block-vertical-alignment-toolbar/test/index.js b/packages/block-editor/src/components/block-vertical-alignment-toolbar/test/index.js index 6840e35ba6331..60a84fbe872c6 100644 --- a/packages/block-editor/src/components/block-vertical-alignment-toolbar/test/index.js +++ b/packages/block-editor/src/components/block-vertical-alignment-toolbar/test/index.js @@ -12,7 +12,12 @@ describe( 'BlockVerticalAlignmentToolbar', () => { const alignment = 'top'; const onChange = jest.fn(); - const wrapper = shallow( ); + const wrapper = shallow( + + ); const controls = wrapper.props().controls; @@ -25,7 +30,9 @@ describe( 'BlockVerticalAlignmentToolbar', () => { } ); it( 'should call onChange with undefined, when the control is already active', () => { - const activeControl = controls.find( ( { title } ) => title.toLowerCase().includes( alignment ) ); + const activeControl = controls.find( ( { title } ) => + title.toLowerCase().includes( alignment ) + ); activeControl.onClick(); expect( activeControl.isActive ).toBe( true ); @@ -35,7 +42,9 @@ describe( 'BlockVerticalAlignmentToolbar', () => { it( 'should call onChange with alignment value when the control is inactive', () => { // note "middle" alias for "center" - const inactiveCenterControl = controls.find( ( { title } ) => title.toLowerCase().includes( 'middle' ) ); + const inactiveCenterControl = controls.find( ( { title } ) => + title.toLowerCase().includes( 'middle' ) + ); inactiveCenterControl.onClick(); diff --git a/packages/block-editor/src/components/button-block-appender/index.js b/packages/block-editor/src/components/button-block-appender/index.js index 04ca29a71079f..3991b5bb530f3 100644 --- a/packages/block-editor/src/components/button-block-appender/index.js +++ b/packages/block-editor/src/components/button-block-appender/index.js @@ -6,40 +6,66 @@ import classnames from 'classnames'; /** * WordPress dependencies */ -import { Button, Icon, Tooltip } from '@wordpress/components'; +import { Button, Tooltip } from '@wordpress/components'; import { _x, sprintf } from '@wordpress/i18n'; +import { Icon, plusCircle } from '@wordpress/icons'; /** * Internal dependencies */ import Inserter from '../inserter'; -function ButtonBlockAppender( { rootClientId, className, __experimentalSelectBlockOnInsert: selectBlockOnInsert } ) { +function ButtonBlockAppender( { + rootClientId, + className, + __experimentalSelectBlockOnInsert: selectBlockOnInsert, +} ) { return ( { + renderToggle={ ( { + onToggle, + disabled, + isOpen, + blockTitle, + hasSingleBlockType, + } ) => { let label; if ( hasSingleBlockType ) { // translators: %s: the name of the block when there is only one - label = sprintf( _x( 'Add %s', 'directly add the only allowed block' ), blockTitle ); + label = sprintf( + _x( 'Add %s', 'directly add the only allowed block' ), + blockTitle + ); } else { - label = _x( 'Add block', 'Generic label for block inserter button' ); + label = _x( + 'Add block', + 'Generic label for block inserter button' + ); } const isToggleButton = ! hasSingleBlockType; return ( { label } - + + { label } + + ); 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 2a3f6ef2ea9fb..070993d3d9848 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 @@ -15,9 +15,22 @@ import { Button, Dashicon } from '@wordpress/components'; import Inserter from '../inserter'; import styles from './styles.scss'; -function ButtonBlockAppender( { rootClientId, getStylesFromColorScheme, showSeparator } ) { - const appenderStyle = { ...styles.appender, ...getStylesFromColorScheme( styles.appenderLight, styles.appenderDark ) }; - const addBlockButtonStyle = getStylesFromColorScheme( styles.addBlockButton, styles.addBlockButtonDark ); +function ButtonBlockAppender( { + rootClientId, + getStylesFromColorScheme, + showSeparator, +} ) { + const appenderStyle = { + ...styles.appender, + ...getStylesFromColorScheme( + styles.appenderLight, + styles.appenderDark + ), + }; + const addBlockButtonStyle = getStylesFromColorScheme( + styles.addBlockButton, + styles.addBlockButtonDark + ); return ( <> diff --git a/packages/block-editor/src/components/caption/index.native.js b/packages/block-editor/src/components/caption/index.native.js index eb782c46e519c..4669f1b8a4c3e 100644 --- a/packages/block-editor/src/components/caption/index.native.js +++ b/packages/block-editor/src/components/caption/index.native.js @@ -24,7 +24,11 @@ const Caption = ( { value, } ) => ( { title } - + ); return ( @@ -129,17 +147,21 @@ export const PanelColorGradientSettingsInner = ( { }; const PanelColorGradientSettingsSelect = ( props ) => { - const colorGradientSettings = useSelect( - ( select ) => { - const settings = select( 'core/block-editor' ).getSettings(); - return pick( settings, colorsAndGradientKeys ); - } + const colorGradientSettings = useSelect( ( select ) => { + const settings = select( 'core/block-editor' ).getSettings(); + return pick( settings, colorsAndGradientKeys ); + } ); + return ( + ); - return ; }; const PanelColorGradientSettings = ( props ) => { - if ( every( colorsAndGradientKeys, ( key ) => ( props.hasOwnProperty( key ) ) ) ) { + if ( + every( colorsAndGradientKeys, ( key ) => props.hasOwnProperty( key ) ) + ) { return ; } return ; diff --git a/packages/block-editor/src/components/colors-gradients/test/control.js b/packages/block-editor/src/components/colors-gradients/test/control.js new file mode 100644 index 0000000000000..b3396bb0ce2e7 --- /dev/null +++ b/packages/block-editor/src/components/colors-gradients/test/control.js @@ -0,0 +1,193 @@ +/** + * External dependencies + */ +import { create, act } from 'react-test-renderer'; +import { noop } from 'lodash'; + +/** + * Internal dependencies + */ +import ColorGradientControl from '../control'; + +const getButtonWithTestPredicate = ( text ) => ( element ) => { + return ( + element.type === 'button' && + element.children[ 0 ] === text && + element.children.length === 1 + ); +}; + +const getButtonWithAriaLabelStartPredicate = ( ariaLabelStart ) => ( + element +) => { + return ( + element.type === 'button' && + element.props[ 'aria-label' ] && + element.props[ 'aria-label' ].startsWith( ariaLabelStart ) + ); +}; + +const colorTabButtonPredicate = getButtonWithTestPredicate( 'Solid Color' ); +const gradientTabButtonPredicate = getButtonWithTestPredicate( 'Gradient' ); + +describe( 'ColorPaletteControl', () => { + it( 'renders tabs if it is possible to select a color and a gradient rendering a color picker at the start', async () => { + let wrapper; + + await act( async () => { + wrapper = create( + + ); + } ); + + // Is showing the two tab buttons. + expect( wrapper.root.findAll( colorTabButtonPredicate ) ).toHaveLength( + 1 + ); + expect( + wrapper.root.findAll( gradientTabButtonPredicate ) + ).toHaveLength( 1 ); + + // Is showing the two predefined Colors. + expect( + wrapper.root.findAll( + ( element ) => + element.type === 'button' && + element.props && + element.props[ 'aria-label' ] && + element.props[ 'aria-label' ].startsWith( 'Color:' ) + ) + ).toHaveLength( 2 ); + + // Is showing the custom color picker. + expect( + wrapper.root.findAll( getButtonWithTestPredicate( 'Custom Color' ) ) + ).toHaveLength( 1 ); + } ); + + it( 'renders the color picker and does not render tabs if it is only possible to select a color', async () => { + let wrapper; + + await act( async () => { + wrapper = create( + + ); + } ); + + // Is not showing the two tab buttons. + expect( wrapper.root.findAll( colorTabButtonPredicate ) ).toHaveLength( + 0 + ); + expect( + wrapper.root.findAll( gradientTabButtonPredicate ) + ).toHaveLength( 0 ); + + // Is showing the two predefined Colors. + expect( + wrapper.root.findAll( + getButtonWithAriaLabelStartPredicate( 'Color:' ) + ) + ).toHaveLength( 2 ); + + // Is showing the custom color picker. + expect( + wrapper.root.findAll( getButtonWithTestPredicate( 'Custom Color' ) ) + ).toHaveLength( 1 ); + } ); + + it( 'renders the gradient picker and does not render tabs if it is only possible to select a gradient', async () => { + let wrapper; + + await act( async () => { + wrapper = create( + + ); + } ); + + // Is not showing the two tab buttons. + expect( wrapper.root.findAll( colorTabButtonPredicate ) ).toHaveLength( + 0 + ); + expect( + wrapper.root.findAll( gradientTabButtonPredicate ) + ).toHaveLength( 0 ); + + // Is showing the two predefined Gradients. + expect( + wrapper.root.findAll( + getButtonWithAriaLabelStartPredicate( 'Gradient:' ) + ) + ).toHaveLength( 2 ); + + // Is showing the custom gradient picker. + expect( + wrapper.root.findAll( + ( element ) => + element.props && + element.props.className && + element.props.className.includes( + 'components-custom-gradient-picker' + ) + ).length + ).toBeGreaterThanOrEqual( 1 ); + } ); +} ); diff --git a/packages/block-editor/src/components/colors/index.js b/packages/block-editor/src/components/colors/index.js index cadb34a8c9aa3..91cbb9beca726 100644 --- a/packages/block-editor/src/components/colors/index.js +++ b/packages/block-editor/src/components/colors/index.js @@ -3,8 +3,5 @@ export { getColorObjectByAttributeValues, getColorObjectByColorValue, } from './utils'; -export { - createCustomColorsHOC, - default as withColors, -} from './with-colors'; +export { createCustomColorsHOC, default as withColors } from './with-colors'; export { default as __experimentalUseColors } from './use-colors'; diff --git a/packages/block-editor/src/components/colors/test/utils.js b/packages/block-editor/src/components/colors/test/utils.js index 8eb370394aae8..1ed18cef831c8 100644 --- a/packages/block-editor/src/components/colors/test/utils.js +++ b/packages/block-editor/src/components/colors/test/utils.js @@ -17,7 +17,15 @@ describe( 'color utils', () => { ]; const customColor = '#ffffff'; - expect( getColorObjectByAttributeValues( colors, undefined, customColor ) ).toEqual( { color: customColor } ); + expect( + getColorObjectByAttributeValues( + colors, + undefined, + customColor + ) + ).toEqual( { + color: customColor, + } ); } ); it( 'should return the custom color object when definedColor was not found', () => { @@ -29,7 +37,15 @@ describe( 'color utils', () => { const definedColor = 'purple'; const customColor = '#ffffff'; - expect( getColorObjectByAttributeValues( colors, definedColor, customColor ) ).toEqual( { color: customColor } ); + expect( + getColorObjectByAttributeValues( + colors, + definedColor, + customColor + ) + ).toEqual( { + color: customColor, + } ); } ); it( 'should return the found color object', () => { @@ -41,7 +57,15 @@ describe( 'color utils', () => { const definedColor = 'blue'; const customColor = '#ffffff'; - expect( getColorObjectByAttributeValues( colors, definedColor, customColor ) ).toEqual( { slug: 'blue' } ); + expect( + getColorObjectByAttributeValues( + colors, + definedColor, + customColor + ) + ).toEqual( { + slug: 'blue', + } ); } ); } ); @@ -53,7 +77,9 @@ describe( 'color utils', () => { { slug: 'blue', color: '#0000ff' }, ]; - expect( getColorObjectByColorValue( colors, '#ffffff' ) ).toBeUndefined(); + expect( + getColorObjectByColorValue( colors, '#ffffff' ) + ).toBeUndefined(); } ); it( 'should return a color object for the given color value', () => { @@ -63,21 +89,30 @@ describe( 'color utils', () => { { slug: 'blue', color: '#0000ff' }, ]; - expect( getColorObjectByColorValue( colors, '#00ff00' ) ).toEqual( { slug: 'green', color: '#00ff00' } ); + expect( getColorObjectByColorValue( colors, '#00ff00' ) ).toEqual( { + slug: 'green', + color: '#00ff00', + } ); } ); } ); describe( 'getColorClassName', () => { it( 'should return undefined if colorContextName is missing', () => { - expect( getColorClassName( undefined, 'Light Purple' ) ).toBeUndefined(); + expect( + getColorClassName( undefined, 'Light Purple' ) + ).toBeUndefined(); } ); it( 'should return undefined if colorSlug is missing', () => { - expect( getColorClassName( 'background', undefined ) ).toBeUndefined(); + expect( + getColorClassName( 'background', undefined ) + ).toBeUndefined(); } ); it( 'should return a class name with the color slug in kebab case', () => { - expect( getColorClassName( 'background', 'Light Purple' ) ).toBe( 'has-light-purple-background' ); + expect( getColorClassName( 'background', 'Light Purple' ) ).toBe( + 'has-light-purple-background' + ); } ); } ); } ); diff --git a/packages/block-editor/src/components/colors/test/with-colors.js b/packages/block-editor/src/components/colors/test/with-colors.js index 07c19ce0c11e7..acbc8659953ce 100644 --- a/packages/block-editor/src/components/colors/test/with-colors.js +++ b/packages/block-editor/src/components/colors/test/with-colors.js @@ -10,7 +10,9 @@ import { createCustomColorsHOC } from '../with-colors'; describe( 'createCustomColorsHOC', () => { it( 'provides the the wrapped component with color values and setter functions as props', () => { - const withCustomColors = createCustomColorsHOC( [ { name: 'Red', slug: 'red', color: 'ff0000' } ] ); + const withCustomColors = createCustomColorsHOC( [ + { name: 'Red', slug: 'red', color: 'ff0000' }, + ] ); const EnhancedComponent = withCustomColors( 'backgroundColor' )( () => (
        ) ); @@ -23,34 +25,58 @@ describe( 'createCustomColorsHOC', () => { } ); it( 'setting the color to a value in the provided custom color array updated the backgroundColor attribute', () => { - const withCustomColors = createCustomColorsHOC( [ { name: 'Red', slug: 'red', color: 'ff0000' } ] ); - const EnhancedComponent = withCustomColors( 'backgroundColor' )( ( props ) => ( - + const withCustomColors = createCustomColorsHOC( [ + { name: 'Red', slug: 'red', color: 'ff0000' }, + ] ); + const EnhancedComponent = withCustomColors( + 'backgroundColor' + )( ( props ) => ( + ) ); const setAttributes = jest.fn(); const wrapper = mount( - + ); wrapper.find( 'button' ).simulate( 'click' ); - expect( setAttributes ).toHaveBeenCalledWith( { backgroundColor: 'red', customBackgroundColor: undefined } ); + expect( setAttributes ).toHaveBeenCalledWith( { + backgroundColor: 'red', + customBackgroundColor: undefined, + } ); } ); it( 'setting the color to a value not in the provided custom color array updates customBackgroundColor attribute', () => { - const withCustomColors = createCustomColorsHOC( [ { name: 'Red', slug: 'red', color: 'ff0000' } ] ); - const EnhancedComponent = withCustomColors( 'backgroundColor' )( ( props ) => ( - + const withCustomColors = createCustomColorsHOC( [ + { name: 'Red', slug: 'red', color: 'ff0000' }, + ] ); + const EnhancedComponent = withCustomColors( + 'backgroundColor' + )( ( props ) => ( + ) ); const setAttributes = jest.fn(); const wrapper = mount( - + ); wrapper.find( 'button' ).simulate( 'click' ); - expect( setAttributes ).toHaveBeenCalledWith( { backgroundColor: undefined, customBackgroundColor: '000000' } ); + expect( setAttributes ).toHaveBeenCalledWith( { + backgroundColor: undefined, + customBackgroundColor: '000000', + } ); } ); } ); diff --git a/packages/block-editor/src/components/colors/use-colors.js b/packages/block-editor/src/components/colors/use-colors.js index 75b7a8a0c4dad..8ff23ec2ab8d6 100644 --- a/packages/block-editor/src/components/colors/use-colors.js +++ b/packages/block-editor/src/components/colors/use-colors.js @@ -60,51 +60,53 @@ const ColorPanel = ( { { ...colorPanelProps } > { contrastCheckers && - ( Array.isArray( contrastCheckers ) ? - contrastCheckers.map( ( { backgroundColor, textColor, ...rest } ) => { - backgroundColor = resolveContrastCheckerColor( - backgroundColor, - colorSettings, - detectedBackgroundColor - ); - textColor = resolveContrastCheckerColor( - textColor, - colorSettings, - detectedColor - ); - return ( - - ); - } ) : - map( colorSettings, ( { value } ) => { - let { backgroundColor, textColor } = contrastCheckers; - backgroundColor = resolveContrastCheckerColor( - backgroundColor || value, - colorSettings, - detectedBackgroundColor - ); - textColor = resolveContrastCheckerColor( - textColor || value, - colorSettings, - detectedColor - ); - return ( - - ); - } ) ) } - { typeof panelChildren === 'function' ? - panelChildren( colorSettings ) : - panelChildren } + ( Array.isArray( contrastCheckers ) + ? contrastCheckers.map( + ( { backgroundColor, textColor, ...rest } ) => { + backgroundColor = resolveContrastCheckerColor( + backgroundColor, + colorSettings, + detectedBackgroundColor + ); + textColor = resolveContrastCheckerColor( + textColor, + colorSettings, + detectedColor + ); + return ( + + ); + } + ) + : map( colorSettings, ( { value } ) => { + let { backgroundColor, textColor } = contrastCheckers; + backgroundColor = resolveContrastCheckerColor( + backgroundColor || value, + colorSettings, + detectedBackgroundColor + ); + textColor = resolveContrastCheckerColor( + textColor || value, + colorSettings, + detectedColor + ); + return ( + + ); + } ) ) } + { typeof panelChildren === 'function' + ? panelChildren( colorSettings ) + : panelChildren } ); const InspectorControlsColorPanel = ( props ) => ( @@ -116,7 +118,7 @@ const InspectorControlsColorPanel = ( props ) => ( export default function __experimentalUseColors( colorConfigs, { - panelTitle = __( 'Color Settings' ), + panelTitle = __( 'Color settings' ), colorPanelProps, contrastCheckers, panelChildren, @@ -126,18 +128,21 @@ export default function __experimentalUseColors( textColorTargetRef = targetRef, } = {}, } = { - panelTitle: __( 'Color Settings' ), + panelTitle: __( 'Color settings' ), }, deps = [] ) { const { clientId } = useBlockEditContext(); const { attributes, settingsColors } = useSelect( ( select ) => { - const { getBlockAttributes, getSettings } = select( 'core/block-editor' ); + const { getBlockAttributes, getSettings } = select( + 'core/block-editor' + ); const colors = getSettings().colors; return { attributes: getBlockAttributes( clientId ), - settingsColors: ! colors || colors === true ? DEFAULT_COLORS : colors, + settingsColors: + ! colors || colors === true ? DEFAULT_COLORS : colors, }; }, [ clientId ] @@ -151,7 +156,14 @@ export default function __experimentalUseColors( const createComponent = useMemo( () => memoize( - ( name, property, className, color, colorValue, customColor ) => ( { + ( + name, + property, + className, + color, + colorValue, + customColor + ) => ( { children, className: componentClassName = '', style: componentStyle = {}, @@ -167,10 +179,18 @@ export default function __experimentalUseColors( } return cloneElement( child, { - className: classnames( componentClassName, child.props.className, { - [ `has-${ kebabCase( color ) }-${ kebabCase( property ) }` ]: color, - [ className || `has-${ kebabCase( name ) }` ]: color || customColor, - } ), + className: classnames( + componentClassName, + child.props.className, + { + [ `has-${ kebabCase( color ) }-${ kebabCase( + property + ) }` ]: color, + [ className || + `has-${ kebabCase( name ) }` ]: + color || customColor, + } + ), style: { ...colorStyle, ...componentStyle, @@ -186,14 +206,20 @@ export default function __experimentalUseColors( () => memoize( ( name, colors ) => ( newColor ) => { - const color = colors.find( ( _color ) => _color.color === newColor ); + const color = colors.find( + ( _color ) => _color.color === newColor + ); setAttributes( { - [ color ? camelCase( `custom ${ name }` ) : name ]: undefined, + [ color + ? camelCase( `custom ${ name }` ) + : name ]: undefined, } ); setAttributes( { - [ color ? name : camelCase( `custom ${ name }` ) ]: color ? - color.slug : - newColor, + [ color + ? name + : camelCase( `custom ${ name }` ) ]: color + ? color.slug + : newColor, } ); }, { @@ -212,7 +238,9 @@ export default function __experimentalUseColors( } let needsBackgroundColor = false; let needsColor = false; - for ( const { backgroundColor, textColor } of castArray( contrastCheckers ) ) { + for ( const { backgroundColor, textColor } of castArray( + contrastCheckers + ) ) { if ( ! needsBackgroundColor ) { needsBackgroundColor = backgroundColor === true; } @@ -225,7 +253,9 @@ export default function __experimentalUseColors( } if ( needsColor ) { - setDetectedColor( getComputedStyle( textColorTargetRef.current ).color ); + setDetectedColor( + getComputedStyle( textColorTargetRef.current ).color + ); } if ( needsBackgroundColor ) { @@ -280,9 +310,9 @@ export default function __experimentalUseColors( const customColor = attributes[ camelCase( `custom ${ name }` ) ]; // We memoize the non-primitives to avoid unnecessary updates // when they are used as props for other components. - const _color = customColor ? - undefined : - colors.find( ( __color ) => __color.slug === color ); + const _color = customColor + ? undefined + : colors.find( ( __color ) => __color.slug === color ); acc[ componentName ] = createComponent( name, property, @@ -292,14 +322,16 @@ export default function __experimentalUseColors( customColor ); acc[ componentName ].displayName = componentName; - acc[ componentName ].color = customColor ? - customColor : - _color && _color.color; + acc[ componentName ].color = customColor + ? customColor + : _color && _color.color; acc[ componentName ].slug = color; acc[ componentName ].setColor = createSetColor( name, colors ); colorSettings[ componentName ] = { - value: _color ? _color.color : attributes[ camelCase( `custom ${ name }` ) ], + value: _color + ? _color.color + : attributes[ camelCase( `custom ${ name }` ) ], onChange: acc[ componentName ].setColor, label: panelLabel, colors, @@ -332,5 +364,11 @@ export default function __experimentalUseColors( ), }; - }, [ attributes, setAttributes, detectedColor, detectedBackgroundColor, ...deps ] ); + }, [ + attributes, + setAttributes, + detectedColor, + detectedBackgroundColor, + ...deps, + ] ); } diff --git a/packages/block-editor/src/components/colors/utils.js b/packages/block-editor/src/components/colors/utils.js index 764b02acde282..903d7033eedee 100644 --- a/packages/block-editor/src/components/colors/utils.js +++ b/packages/block-editor/src/components/colors/utils.js @@ -16,7 +16,11 @@ import tinycolor from 'tinycolor2'; * the color object exactly as set by the theme or editor defaults is returned. * Otherwise, an object that just sets the color is defined. */ -export const getColorObjectByAttributeValues = ( colors, definedColor, customColor ) => { +export const getColorObjectByAttributeValues = ( + colors, + definedColor, + customColor +) => { if ( definedColor ) { const colorObj = find( colors, { slug: definedColor } ); @@ -68,8 +72,7 @@ export function getColorClassName( colorContextName, colorSlug ) { * @return {string} String with the color value of the most readable color. */ export function getMostReadableColor( colors, colorValue ) { - return tinycolor.mostReadable( - colorValue, - map( colors, 'color' ) - ).toHexString(); + return tinycolor + .mostReadable( colorValue, map( colors, 'color' ) ) + .toHexString(); } diff --git a/packages/block-editor/src/components/colors/with-colors.js b/packages/block-editor/src/components/colors/with-colors.js index 4544c6c8c49e1..6bd4a66d5c40e 100644 --- a/packages/block-editor/src/components/colors/with-colors.js +++ b/packages/block-editor/src/components/colors/with-colors.js @@ -13,7 +13,12 @@ import { compose, createHigherOrderComponent } from '@wordpress/compose'; /** * Internal dependencies */ -import { getColorClassName, getColorObjectByColorValue, getColorObjectByAttributeValues, getMostReadableColor } from './utils'; +import { + getColorClassName, + getColorObjectByColorValue, + getColorObjectByAttributeValues, + getMostReadableColor, +} from './utils'; const DEFAULT_COLORS = []; @@ -25,9 +30,13 @@ const DEFAULT_COLORS = []; * * @return {Function} The higher order component. */ -const withCustomColorPalette = ( colorsArray ) => createHigherOrderComponent( ( WrappedComponent ) => ( props ) => ( - -), 'withCustomColorPalette' ); +const withCustomColorPalette = ( colorsArray ) => + createHigherOrderComponent( + ( WrappedComponent ) => ( props ) => ( + + ), + 'withCustomColorPalette' + ); /** * Higher order component factory for injecting the editor colors as the @@ -35,12 +44,13 @@ const withCustomColorPalette = ( colorsArray ) => createHigherOrderComponent( ( * * @return {Function} The higher order component. */ -const withEditorColorPalette = () => withSelect( ( select ) => { - const settings = select( 'core/block-editor' ).getSettings(); - return { - colors: get( settings, [ 'colors' ], DEFAULT_COLORS ), - }; -} ); +const withEditorColorPalette = () => + withSelect( ( select ) => { + const settings = select( 'core/block-editor' ).getSettings(); + return { + colors: get( settings, [ 'colors' ], DEFAULT_COLORS ), + }; + } ); /** * Helper function used with `createHigherOrderComponent` to create @@ -52,12 +62,18 @@ const withEditorColorPalette = () => withSelect( ( select ) => { * @return {WPComponent} The component that can be used as a HOC. */ function createColorHOC( colorTypes, withColorPalette ) { - const colorMap = reduce( colorTypes, ( colorObject, colorType ) => { - return { - ...colorObject, - ...( isString( colorType ) ? { [ colorType ]: kebabCase( colorType ) } : colorType ), - }; - }, {} ); + const colorMap = reduce( + colorTypes, + ( colorObject, colorType ) => { + return { + ...colorObject, + ...( isString( colorType ) + ? { [ colorType ]: kebabCase( colorType ) } + : colorType ), + }; + }, + {} + ); return compose( [ withColorPalette, @@ -68,7 +84,9 @@ function createColorHOC( colorTypes, withColorPalette ) { this.setters = this.createSetters(); this.colorUtils = { - getMostReadableColor: this.getMostReadableColor.bind( this ), + getMostReadableColor: this.getMostReadableColor.bind( + this + ), }; this.state = {}; @@ -80,50 +98,95 @@ function createColorHOC( colorTypes, withColorPalette ) { } createSetters() { - return reduce( colorMap, ( settersAccumulator, colorContext, colorAttributeName ) => { - const upperFirstColorAttributeName = upperFirst( colorAttributeName ); - const customColorAttributeName = `custom${ upperFirstColorAttributeName }`; - settersAccumulator[ `set${ upperFirstColorAttributeName }` ] = - this.createSetColor( colorAttributeName, customColorAttributeName ); - return settersAccumulator; - }, {} ); + return reduce( + colorMap, + ( + settersAccumulator, + colorContext, + colorAttributeName + ) => { + const upperFirstColorAttributeName = upperFirst( + colorAttributeName + ); + const customColorAttributeName = `custom${ upperFirstColorAttributeName }`; + settersAccumulator[ + `set${ upperFirstColorAttributeName }` + ] = this.createSetColor( + colorAttributeName, + customColorAttributeName + ); + return settersAccumulator; + }, + {} + ); } createSetColor( colorAttributeName, customColorAttributeName ) { return ( colorValue ) => { - const colorObject = getColorObjectByColorValue( this.props.colors, colorValue ); + const colorObject = getColorObjectByColorValue( + this.props.colors, + colorValue + ); this.props.setAttributes( { - [ colorAttributeName ]: colorObject && colorObject.slug ? colorObject.slug : undefined, - [ customColorAttributeName ]: colorObject && colorObject.slug ? undefined : colorValue, + [ colorAttributeName ]: + colorObject && colorObject.slug + ? colorObject.slug + : undefined, + [ customColorAttributeName ]: + colorObject && colorObject.slug + ? undefined + : colorValue, } ); }; } - static getDerivedStateFromProps( { attributes, colors }, previousState ) { - return reduce( colorMap, ( newState, colorContext, colorAttributeName ) => { - const colorObject = getColorObjectByAttributeValues( - colors, - attributes[ colorAttributeName ], - attributes[ `custom${ upperFirst( colorAttributeName ) }` ], - ); + static getDerivedStateFromProps( + { attributes, colors }, + previousState + ) { + return reduce( + colorMap, + ( newState, colorContext, colorAttributeName ) => { + const colorObject = getColorObjectByAttributeValues( + colors, + attributes[ colorAttributeName ], + attributes[ + `custom${ upperFirst( + colorAttributeName + ) }` + ] + ); - const previousColorObject = previousState[ colorAttributeName ]; - const previousColor = get( previousColorObject, [ 'color' ] ); - /** - * The "and previousColorObject" condition checks that a previous color object was already computed. - * At the start previousColorObject and colorValue are both equal to undefined - * bus as previousColorObject does not exist we should compute the object. - */ - if ( previousColor === colorObject.color && previousColorObject ) { - newState[ colorAttributeName ] = previousColorObject; - } else { - newState[ colorAttributeName ] = { - ...colorObject, - class: getColorClassName( colorContext, colorObject.slug ), - }; - } - return newState; - }, {} ); + const previousColorObject = + previousState[ colorAttributeName ]; + const previousColor = get( previousColorObject, [ + 'color', + ] ); + /** + * The "and previousColorObject" condition checks that a previous color object was already computed. + * At the start previousColorObject and colorValue are both equal to undefined + * bus as previousColorObject does not exist we should compute the object. + */ + if ( + previousColor === colorObject.color && + previousColorObject + ) { + newState[ + colorAttributeName + ] = previousColorObject; + } else { + newState[ colorAttributeName ] = { + ...colorObject, + class: getColorClassName( + colorContext, + colorObject.slug + ), + }; + } + return newState; + }, + {} + ); } render() { @@ -169,7 +232,10 @@ function createColorHOC( colorTypes, withColorPalette ) { export function createCustomColorsHOC( colorsArray ) { return ( ...colorTypes ) => { const withColorPalette = withCustomColorPalette( colorsArray ); - return createHigherOrderComponent( createColorHOC( colorTypes, withColorPalette ), 'withCustomColors' ); + return createHigherOrderComponent( + createColorHOC( colorTypes, withColorPalette ), + 'withCustomColors' + ); }; } @@ -199,5 +265,8 @@ export function createCustomColorsHOC( colorsArray ) { */ export default function withColors( ...colorTypes ) { const withColorPalette = withEditorColorPalette(); - return createHigherOrderComponent( createColorHOC( colorTypes, withColorPalette ), 'withColors' ); + return createHigherOrderComponent( + createColorHOC( colorTypes, withColorPalette ), + 'withColors' + ); } diff --git a/packages/block-editor/src/components/contrast-checker/index.js b/packages/block-editor/src/components/contrast-checker/index.js index 251b0023c024b..e75eb24278dd9 100644 --- a/packages/block-editor/src/components/contrast-checker/index.js +++ b/packages/block-editor/src/components/contrast-checker/index.js @@ -11,10 +11,20 @@ import { __ } from '@wordpress/i18n'; import { Notice } from '@wordpress/components'; import { useEffect } from '@wordpress/element'; -function ContrastCheckerMessage( { tinyBackgroundColor, tinyTextColor, backgroundColor, textColor } ) { - const msg = tinyBackgroundColor.getBrightness() < tinyTextColor.getBrightness() ? - __( 'This color combination may be hard for people to read. Try using a darker background color and/or a brighter text color.' ) : - __( 'This color combination may be hard for people to read. Try using a brighter background color and/or a darker text color.' ); +function ContrastCheckerMessage( { + tinyBackgroundColor, + tinyTextColor, + backgroundColor, + textColor, +} ) { + const msg = + tinyBackgroundColor.getBrightness() < tinyTextColor.getBrightness() + ? __( + 'This color combination may be hard for people to read. Try using a darker background color and/or a brighter text color.' + ) + : __( + 'This color combination may be hard for people to read. Try using a brighter background color and/or a darker text color.' + ); useEffect( () => { speak( __( 'This color combination may be hard for people to read.' ) ); }, [ backgroundColor, textColor ] ); @@ -35,18 +45,29 @@ function ContrastChecker( { isLargeText, textColor, } ) { - if ( ! ( backgroundColor || fallbackBackgroundColor ) || ! ( textColor || fallbackTextColor ) ) { + if ( + ! ( backgroundColor || fallbackBackgroundColor ) || + ! ( textColor || fallbackTextColor ) + ) { return null; } - const tinyBackgroundColor = tinycolor( backgroundColor || fallbackBackgroundColor ); + const tinyBackgroundColor = tinycolor( + backgroundColor || fallbackBackgroundColor + ); const tinyTextColor = tinycolor( textColor || fallbackTextColor ); - const hasTransparency = tinyBackgroundColor.getAlpha() !== 1 || tinyTextColor.getAlpha() !== 1; + const hasTransparency = + tinyBackgroundColor.getAlpha() !== 1 || tinyTextColor.getAlpha() !== 1; - if ( hasTransparency || tinycolor.isReadable( - tinyBackgroundColor, - tinyTextColor, - { level: 'AA', size: ( isLargeText || ( isLargeText !== false && fontSize >= 24 ) ? 'large' : 'small' ) } - ) ) { + if ( + hasTransparency || + tinycolor.isReadable( tinyBackgroundColor, tinyTextColor, { + level: 'AA', + size: + isLargeText || ( isLargeText !== false && fontSize >= 24 ) + ? 'large' + : 'small', + } ) + ) { return null; } diff --git a/packages/block-editor/src/components/contrast-checker/test/index.js b/packages/block-editor/src/components/contrast-checker/test/index.js index c0f3887782309..8d358437e4d9c 100644 --- a/packages/block-editor/src/components/contrast-checker/test/index.js +++ b/packages/block-editor/src/components/contrast-checker/test/index.js @@ -33,7 +33,8 @@ describe( 'ContrastChecker', () => { textColor={ textColor } isLargeText={ isLargeText } fallbackBackgroundColor={ fallbackBackgroundColor } - fallbackTextColor={ fallbackTextColor } /> + fallbackTextColor={ fallbackTextColor } + /> ); expect( wrapper.html() ).toBeNull(); @@ -46,10 +47,18 @@ describe( 'ContrastChecker', () => { textColor={ sameShade } isLargeText={ isLargeText } fallbackBackgroundColor={ fallbackBackgroundColor } - fallbackTextColor={ fallbackTextColor } /> + fallbackTextColor={ fallbackTextColor } + /> ); - expect( wrapper.find( Notice ).children().text() ).toBe( 'This color combination may be hard for people to read. Try using a brighter background color and/or a darker text color.' ); + expect( + wrapper + .find( Notice ) + .children() + .text() + ).toBe( + 'This color combination may be hard for people to read. Try using a brighter background color and/or a darker text color.' + ); } ); test( 'should render render null if background color contains a transparency', () => { @@ -59,7 +68,8 @@ describe( 'ContrastChecker', () => { textColor={ sameShade } isLargeText={ isLargeText } fallbackBackgroundColor={ fallbackBackgroundColor } - fallbackTextColor={ fallbackTextColor } /> + fallbackTextColor={ fallbackTextColor } + /> ); expect( wrapper.html() ).toBeNull(); @@ -72,7 +82,8 @@ describe( 'ContrastChecker', () => { textColor={ colorWithTransparency } isLargeText={ isLargeText } fallbackBackgroundColor={ fallbackBackgroundColor } - fallbackTextColor={ fallbackTextColor } /> + fallbackTextColor={ fallbackTextColor } + /> ); expect( wrapper.html() ).toBeNull(); @@ -87,10 +98,18 @@ describe( 'ContrastChecker', () => { textColor={ sameShade } isLargeText={ ! isLargeText } fallbackBackgroundColor={ fallbackBackgroundColor } - fallbackTextColor={ fallbackTextColor } /> + fallbackTextColor={ fallbackTextColor } + /> ); - expect( wrapper.find( Notice ).children().text() ).toBe( 'This color combination may be hard for people to read. Try using a darker background color and/or a brighter text color.' ); + expect( + wrapper + .find( Notice ) + .children() + .text() + ).toBe( + 'This color combination may be hard for people to read. Try using a darker background color and/or a brighter text color.' + ); } ); test( 'should take into consideration wherever text is large or not', () => { @@ -102,7 +121,14 @@ describe( 'ContrastChecker', () => { /> ); - expect( wrapperSmallText.find( Notice ).children().text() ).toBe( 'This color combination may be hard for people to read. Try using a brighter background color and/or a darker text color.' ); + expect( + wrapperSmallText + .find( Notice ) + .children() + .text() + ).toBe( + 'This color combination may be hard for people to read. Try using a brighter background color and/or a darker text color.' + ); const wrapperLargeText = mount( { /> ); - expect( wrapperSmallFontSize.find( Notice ).children().text() ).toBe( 'This color combination may be hard for people to read. Try using a brighter background color and/or a darker text color.' ); + expect( + wrapperSmallFontSize + .find( Notice ) + .children() + .text() + ).toBe( + 'This color combination may be hard for people to read. Try using a brighter background color and/or a darker text color.' + ); const wrapperLargeText = mount( { /> ); - expect( wrapperNoLargeText.find( Notice ).children().text() ).toBe( 'This color combination may be hard for people to read. Try using a brighter background color and/or a darker text color.' ); + expect( + wrapperNoLargeText + .find( Notice ) + .children() + .text() + ).toBe( + 'This color combination may be hard for people to read. Try using a brighter background color and/or a darker text color.' + ); } ); test( 'should render null when the colors meet AA WCAG guidelines, with only fallback colors.', () => { @@ -166,7 +206,8 @@ describe( 'ContrastChecker', () => { + fallbackTextColor={ fallbackTextColor } + /> ); expect( wrapper.html() ).toBeNull(); @@ -176,9 +217,17 @@ describe( 'ContrastChecker', () => { const wrapper = mount( + fallbackBackgroundColor={ textColor } + /> ); - expect( wrapper.find( Notice ).children().text() ).toBe( 'This color combination may be hard for people to read. Try using a brighter background color and/or a darker text color.' ); + expect( + wrapper + .find( Notice ) + .children() + .text() + ).toBe( + 'This color combination may be hard for people to read. Try using a brighter background color and/or a darker text color.' + ); } ); } ); diff --git a/packages/block-editor/src/components/copy-handler/index.js b/packages/block-editor/src/components/copy-handler/index.js index a369144b2c6a9..be6e03097a467 100644 --- a/packages/block-editor/src/components/copy-handler/index.js +++ b/packages/block-editor/src/components/copy-handler/index.js @@ -49,7 +49,9 @@ export default compose( [ event.preventDefault(); if ( event.type === 'copy' || event.type === 'cut' ) { - const blocks = getBlocksByClientId( selectedBlockClientIds ); + const blocks = getBlocksByClientId( + selectedBlockClientIds + ); const serialized = serialize( blocks ); event.clipboardData.setData( 'text/plain', serialized ); diff --git a/packages/block-editor/src/components/default-block-appender/index.js b/packages/block-editor/src/components/default-block-appender/index.js index 29262787f095d..865f9a76f226e 100644 --- a/packages/block-editor/src/components/default-block-appender/index.js +++ b/packages/block-editor/src/components/default-block-appender/index.js @@ -29,7 +29,9 @@ export function DefaultBlockAppender( { return null; } - const value = decodeEntities( placeholder ) || __( 'Start writing or type / to choose a block' ); + const value = + decodeEntities( placeholder ) || + __( 'Start writing or type / to choose a block' ); // The appender "button" is in-fact a text field so as to support // transitions by WritingFlow occurring by arrow key press. WritingFlow @@ -59,17 +61,29 @@ export function DefaultBlockAppender( { onFocus={ onAppend } value={ showPrompt ? value : '' } /> - +
        ); } export default compose( withSelect( ( select, ownProps ) => { - const { getBlockCount, getBlockName, isBlockValid, getSettings, getTemplateLock } = select( 'core/block-editor' ); + const { + getBlockCount, + getBlockName, + isBlockValid, + getSettings, + getTemplateLock, + } = select( 'core/block-editor' ); const isEmpty = ! getBlockCount( ownProps.rootClientId ); - const isLastBlockDefault = getBlockName( ownProps.lastBlockClientId ) === getDefaultBlockName(); + const isLastBlockDefault = + getBlockName( ownProps.lastBlockClientId ) === + getDefaultBlockName(); const isLastBlockValid = isBlockValid( ownProps.lastBlockClientId ); const { bodyPlaceholder } = getSettings(); @@ -81,10 +95,9 @@ export default compose( }; } ), withDispatch( ( dispatch, ownProps ) => { - const { - insertDefaultBlock, - startTyping, - } = dispatch( 'core/block-editor' ); + const { insertDefaultBlock, startTyping } = dispatch( + 'core/block-editor' + ); return { onAppend() { @@ -94,5 +107,5 @@ export default compose( startTyping(); }, }; - } ), + } ) )( DefaultBlockAppender ); diff --git a/packages/block-editor/src/components/default-block-appender/index.native.js b/packages/block-editor/src/components/default-block-appender/index.native.js index 4f361376f6d58..726c060241d63 100644 --- a/packages/block-editor/src/components/default-block-appender/index.native.js +++ b/packages/block-editor/src/components/default-block-appender/index.native.js @@ -29,17 +29,18 @@ export function DefaultBlockAppender( { return null; } - const value = typeof placeholder === 'string' ? decodeEntities( placeholder ) : __( 'Start writing…' ); + const value = + typeof placeholder === 'string' + ? decodeEntities( placeholder ) + : __( 'Start writing…' ); return ( - - - {} } - /> + + + {} } /> ); @@ -47,10 +48,17 @@ export function DefaultBlockAppender( { export default compose( withSelect( ( select, ownProps ) => { - const { getBlockCount, getBlockName, isBlockValid, getTemplateLock } = select( 'core/block-editor' ); + const { + getBlockCount, + getBlockName, + isBlockValid, + getTemplateLock, + } = select( 'core/block-editor' ); const isEmpty = ! getBlockCount( ownProps.rootClientId ); - const isLastBlockDefault = getBlockName( ownProps.lastBlockClientId ) === getDefaultBlockName(); + const isLastBlockDefault = + getBlockName( ownProps.lastBlockClientId ) === + getDefaultBlockName(); const isLastBlockValid = isBlockValid( ownProps.lastBlockClientId ); return { @@ -59,10 +67,9 @@ export default compose( }; } ), withDispatch( ( dispatch, ownProps ) => { - const { - insertDefaultBlock, - startTyping, - } = dispatch( 'core/block-editor' ); + const { insertDefaultBlock, startTyping } = dispatch( + 'core/block-editor' + ); return { onAppend() { @@ -72,5 +79,5 @@ export default compose( startTyping(); }, }; - } ), + } ) )( DefaultBlockAppender ); diff --git a/packages/block-editor/src/components/default-block-appender/test/index.js b/packages/block-editor/src/components/default-block-appender/test/index.js index 80517843ee661..407adb838f9aa 100644 --- a/packages/block-editor/src/components/default-block-appender/test/index.js +++ b/packages/block-editor/src/components/default-block-appender/test/index.js @@ -22,14 +22,18 @@ describe( 'DefaultBlockAppender', () => { it( 'should match snapshot', () => { const onAppend = jest.fn(); - const wrapper = shallow( ); + const wrapper = shallow( + + ); expect( wrapper ).toMatchSnapshot(); } ); it( 'should append a default block when input focused', () => { const onAppend = jest.fn(); - const wrapper = shallow( ); + const wrapper = shallow( + + ); wrapper.find( 'TextareaAutosize' ).simulate( 'focus' ); @@ -40,7 +44,13 @@ describe( 'DefaultBlockAppender', () => { it( 'should optionally show without prompt', () => { const onAppend = jest.fn(); - const wrapper = shallow( ); + const wrapper = shallow( + + ); const input = wrapper.find( 'TextareaAutosize' ); expect( input.prop( 'value' ) ).toEqual( '' ); diff --git a/packages/block-editor/src/components/default-style-picker/index.js b/packages/block-editor/src/components/default-style-picker/index.js index 7be972419f67b..5880d8bd5850b 100644 --- a/packages/block-editor/src/components/default-style-picker/index.js +++ b/packages/block-editor/src/components/default-style-picker/index.js @@ -19,12 +19,13 @@ export default function DefaultStylePicker( { blockName } ) { } = useSelect( ( select ) => { const settings = select( 'core/block-editor' ).getSettings(); - const preferredStyleVariations = settings.__experimentalPreferredStyleVariations; + const preferredStyleVariations = + settings.__experimentalPreferredStyleVariations; return { - preferredStyle: get( - preferredStyleVariations, - [ 'value', blockName ] - ), + preferredStyle: get( preferredStyleVariations, [ + 'value', + blockName, + ] ), onUpdatePreferredStyleVariations: get( preferredStyleVariations, [ 'onChange' ], @@ -36,11 +37,11 @@ export default function DefaultStylePicker( { blockName } ) { [ blockName ] ); const selectOptions = useMemo( - () => ( [ + () => [ { label: __( 'Not set' ), value: '' }, ...styles.map( ( { label, name } ) => ( { label, value: name } ) ), - ] ), - [ styles ], + ], + [ styles ] ); const selectOnChange = useCallback( ( blockStyle ) => { @@ -49,12 +50,14 @@ export default function DefaultStylePicker( { blockName } ) { [ blockName, onUpdatePreferredStyleVariations ] ); - return onUpdatePreferredStyleVariations && ( - + return ( + onUpdatePreferredStyleVariations && ( + + ) ); } diff --git a/packages/block-editor/src/components/font-sizes/font-size-picker.js b/packages/block-editor/src/components/font-sizes/font-size-picker.js index e2dbe3dba8134..9200924ad22be 100644 --- a/packages/block-editor/src/components/font-sizes/font-size-picker.js +++ b/packages/block-editor/src/components/font-sizes/font-size-picker.js @@ -4,16 +4,13 @@ import { FontSizePicker } from '@wordpress/components'; import { withSelect } from '@wordpress/data'; -export default withSelect( - ( select ) => { - const { - disableCustomFontSizes, - fontSizes, - } = select( 'core/block-editor' ).getSettings(); +export default withSelect( ( select ) => { + const { disableCustomFontSizes, fontSizes } = select( + 'core/block-editor' + ).getSettings(); - return { - disableCustomFontSizes, - fontSizes, - }; - } -)( FontSizePicker ); + return { + disableCustomFontSizes, + fontSizes, + }; +} )( FontSizePicker ); diff --git a/packages/block-editor/src/components/font-sizes/utils.js b/packages/block-editor/src/components/font-sizes/utils.js index 09de76dcf7f6a..17f3cfe680dc7 100644 --- a/packages/block-editor/src/components/font-sizes/utils.js +++ b/packages/block-editor/src/components/font-sizes/utils.js @@ -14,7 +14,11 @@ import { find, kebabCase } from 'lodash'; * @return {?string} If fontSizeAttribute is set and an equal slug is found in fontSizes it returns the font size object for that slug. * Otherwise, an object with just the size value based on customFontSize is returned. */ -export const getFontSize = ( fontSizes, fontSizeAttribute, customFontSizeAttribute ) => { +export const getFontSize = ( + fontSizes, + fontSizeAttribute, + customFontSizeAttribute +) => { if ( fontSizeAttribute ) { const fontSizeObject = find( fontSizes, { slug: fontSizeAttribute } ); if ( fontSizeObject ) { diff --git a/packages/block-editor/src/components/font-sizes/with-font-sizes.js b/packages/block-editor/src/components/font-sizes/with-font-sizes.js index f64fe8d4f7600..4476484d30a3d 100644 --- a/packages/block-editor/src/components/font-sizes/with-font-sizes.js +++ b/packages/block-editor/src/components/font-sizes/with-font-sizes.js @@ -27,19 +27,27 @@ import { getFontSize, getFontSizeClass } from './utils'; */ export default ( ...fontSizeNames ) => { /* - * Computes an object whose key is the font size attribute name as passed in the array, - * and the value is the custom font size attribute name. - * Custom font size is automatically compted by appending custom followed by the font size attribute name in with the first letter capitalized. - */ - const fontSizeAttributeNames = reduce( fontSizeNames, ( fontSizeAttributeNamesAccumulator, fontSizeAttributeName ) => { - fontSizeAttributeNamesAccumulator[ fontSizeAttributeName ] = `custom${ upperFirst( fontSizeAttributeName ) }`; - return fontSizeAttributeNamesAccumulator; - }, {} ); + * Computes an object whose key is the font size attribute name as passed in the array, + * and the value is the custom font size attribute name. + * Custom font size is automatically compted by appending custom followed by the font size attribute name in with the first letter capitalized. + */ + const fontSizeAttributeNames = reduce( + fontSizeNames, + ( fontSizeAttributeNamesAccumulator, fontSizeAttributeName ) => { + fontSizeAttributeNamesAccumulator[ + fontSizeAttributeName + ] = `custom${ upperFirst( fontSizeAttributeName ) }`; + return fontSizeAttributeNamesAccumulator; + }, + {} + ); return createHigherOrderComponent( compose( [ withSelect( ( select ) => { - const { fontSizes } = select( 'core/block-editor' ).getSettings(); + const { fontSizes } = select( + 'core/block-editor' + ).getSettings(); return { fontSizes, }; @@ -55,46 +63,98 @@ export default ( ...fontSizeNames ) => { } createSetters() { - return reduce( fontSizeAttributeNames, ( settersAccumulator, customFontSizeAttributeName, fontSizeAttributeName ) => { - const upperFirstFontSizeAttributeName = upperFirst( fontSizeAttributeName ); - settersAccumulator[ `set${ upperFirstFontSizeAttributeName }` ] = - this.createSetFontSize( fontSizeAttributeName, customFontSizeAttributeName ); - return settersAccumulator; - }, {} ); + return reduce( + fontSizeAttributeNames, + ( + settersAccumulator, + customFontSizeAttributeName, + fontSizeAttributeName + ) => { + const upperFirstFontSizeAttributeName = upperFirst( + fontSizeAttributeName + ); + settersAccumulator[ + `set${ upperFirstFontSizeAttributeName }` + ] = this.createSetFontSize( + fontSizeAttributeName, + customFontSizeAttributeName + ); + return settersAccumulator; + }, + {} + ); } - createSetFontSize( fontSizeAttributeName, customFontSizeAttributeName ) { + createSetFontSize( + fontSizeAttributeName, + customFontSizeAttributeName + ) { return ( fontSizeValue ) => { - const fontSizeObject = find( this.props.fontSizes, { size: Number( fontSizeValue ) } ); + const fontSizeObject = find( this.props.fontSizes, { + size: Number( fontSizeValue ), + } ); this.props.setAttributes( { - [ fontSizeAttributeName ]: fontSizeObject && fontSizeObject.slug ? fontSizeObject.slug : undefined, - [ customFontSizeAttributeName ]: fontSizeObject && fontSizeObject.slug ? undefined : fontSizeValue, + [ fontSizeAttributeName ]: + fontSizeObject && fontSizeObject.slug + ? fontSizeObject.slug + : undefined, + [ customFontSizeAttributeName ]: + fontSizeObject && fontSizeObject.slug + ? undefined + : fontSizeValue, } ); }; } - static getDerivedStateFromProps( { attributes, fontSizes }, previousState ) { - const didAttributesChange = ( customFontSizeAttributeName, fontSizeAttributeName ) => { + static getDerivedStateFromProps( + { attributes, fontSizes }, + previousState + ) { + const didAttributesChange = ( + customFontSizeAttributeName, + fontSizeAttributeName + ) => { if ( previousState[ fontSizeAttributeName ] ) { // if new font size is name compare with the previous slug if ( attributes[ fontSizeAttributeName ] ) { - return attributes[ fontSizeAttributeName ] !== previousState[ fontSizeAttributeName ].slug; + return ( + attributes[ fontSizeAttributeName ] !== + previousState[ fontSizeAttributeName ] + .slug + ); } // if font size is not named, update when the font size value changes. - return previousState[ fontSizeAttributeName ].size !== attributes[ customFontSizeAttributeName ]; + return ( + previousState[ fontSizeAttributeName ] + .size !== + attributes[ customFontSizeAttributeName ] + ); } // in this case we need to build the font size object return true; }; - if ( ! some( fontSizeAttributeNames, didAttributesChange ) ) { + if ( + ! some( + fontSizeAttributeNames, + didAttributesChange + ) + ) { return null; } const newState = reduce( - pickBy( fontSizeAttributeNames, didAttributesChange ), - ( newStateAccumulator, customFontSizeAttributeName, fontSizeAttributeName ) => { - const fontSizeAttributeValue = attributes[ fontSizeAttributeName ]; + pickBy( + fontSizeAttributeNames, + didAttributesChange + ), + ( + newStateAccumulator, + customFontSizeAttributeName, + fontSizeAttributeName + ) => { + const fontSizeAttributeValue = + attributes[ fontSizeAttributeName ]; const fontSizeObject = getFontSize( fontSizes, fontSizeAttributeValue, @@ -102,7 +162,9 @@ export default ( ...fontSizeNames ) => { ); newStateAccumulator[ fontSizeAttributeName ] = { ...fontSizeObject, - class: getFontSizeClass( fontSizeAttributeValue ), + class: getFontSizeClass( + fontSizeAttributeValue + ), }; return newStateAccumulator; }, diff --git a/packages/block-editor/src/components/gradient-picker/control.js b/packages/block-editor/src/components/gradient-picker/control.js index 16179ff0bb9be..f57802aada39b 100644 --- a/packages/block-editor/src/components/gradient-picker/control.js +++ b/packages/block-editor/src/components/gradient-picker/control.js @@ -1,4 +1,3 @@ - /** * External dependencies */ @@ -17,13 +16,21 @@ import { useSelect } from '@wordpress/data'; */ import GradientPicker from './'; -export default function( { className, value, onChange, label = __( 'Gradient Presets' ), ...props } ) { - const { gradients = [], disableCustomGradients } = useSelect( ( select ) => ( - pick( - select( 'core/block-editor' ).getSettings(), - [ 'gradients', 'disableCustomGradients' ] - ) - ), [] ); +export default function( { + className, + value, + onChange, + label = __( 'Gradient Presets' ), + ...props +} ) { + const { gradients = [], disableCustomGradients } = useSelect( + ( select ) => + pick( select( 'core/block-editor' ).getSettings(), [ + 'gradients', + 'disableCustomGradients', + ] ), + [] + ); if ( isEmpty( gradients ) && disableCustomGradients ) { return null; } @@ -34,9 +41,7 @@ export default function( { className, value, onChange, label = __( 'Gradient Pre className ) } > - - { label } - + { label } ( - pick( - select( 'core/block-editor' ).getSettings(), - [ 'gradients', 'disableCustomGradients' ] - ) - ), [] ); + const { gradients, disableCustomGradients } = useSelect( + ( select ) => + pick( select( 'core/block-editor' ).getSettings(), [ + 'gradients', + 'disableCustomGradients', + ] ), + [] + ); return ( <__experimentalGradientPicker - gradients={ props.gradients !== undefined ? props.gradient : gradients } - disableCustomGradients={ props.disableCustomGradients !== undefined ? props.disableCustomGradients : disableCustomGradients } + gradients={ + props.gradients !== undefined ? props.gradient : gradients + } + disableCustomGradients={ + props.disableCustomGradients !== undefined + ? props.disableCustomGradients + : disableCustomGradients + } { ...props } /> ); } export default function( props ) { - const ComponentToUse = props.gradients !== undefined && props.disableCustomGradients !== undefined ? - __experimentalGradientPicker : - GradientPickerWithGradients; - return ( ); + const ComponentToUse = + props.gradients !== undefined && + props.disableCustomGradients !== undefined + ? __experimentalGradientPicker + : GradientPickerWithGradients; + return ; } diff --git a/packages/block-editor/src/components/gradient-picker/panel.js b/packages/block-editor/src/components/gradient-picker/panel.js index 25d07234e9cf5..de754d46cb85f 100644 --- a/packages/block-editor/src/components/gradient-picker/panel.js +++ b/packages/block-editor/src/components/gradient-picker/panel.js @@ -16,17 +16,16 @@ import { __ } from '@wordpress/i18n'; import GradientPicker from './control'; export default function GradientPanel( props ) { - const gradients = useSelect( ( select ) => ( - select( 'core/block-editor' ).getSettings().gradients - ), [] ); + const gradients = useSelect( + ( select ) => select( 'core/block-editor' ).getSettings().gradients, + [] + ); if ( isEmpty( gradients ) ) { return null; } return ( - + ); } diff --git a/packages/block-editor/src/components/gradients/index.js b/packages/block-editor/src/components/gradients/index.js index abd623c817786..988ca37da2cfe 100644 --- a/packages/block-editor/src/components/gradients/index.js +++ b/packages/block-editor/src/components/gradients/index.js @@ -26,13 +26,19 @@ function getGradientValueBySlug( gradients, slug ) { return gradient && gradient.gradient; } -export function __experimentalGetGradientObjectByGradientValue( gradients, value ) { +export function __experimentalGetGradientObjectByGradientValue( + gradients, + value +) { const gradient = find( gradients, [ 'gradient', value ] ); return gradient; } function getGradientSlugByValue( gradients, value ) { - const gradient = __experimentalGetGradientObjectByGradientValue( gradients, value ); + const gradient = __experimentalGetGradientObjectByGradientValue( + gradients, + value + ); return gradient && gradient.slug; } @@ -42,15 +48,20 @@ export function __experimentalUseGradient( { } = {} ) { const { clientId } = useBlockEditContext(); - const { gradients, gradient, customGradient } = useSelect( ( select ) => { - const { getBlockAttributes, getSettings } = select( 'core/block-editor' ); - const attributes = getBlockAttributes( clientId ); - return { - gradient: attributes[ gradientAttribute ], - customGradient: attributes[ customGradientAttribute ], - gradients: getSettings().gradients, - }; - }, [ clientId, gradientAttribute, customGradientAttribute ] ); + const { gradients, gradient, customGradient } = useSelect( + ( select ) => { + const { getBlockAttributes, getSettings } = select( + 'core/block-editor' + ); + const attributes = getBlockAttributes( clientId ); + return { + gradient: attributes[ gradientAttribute ], + customGradient: attributes[ customGradientAttribute ], + gradients: getSettings().gradients, + }; + }, + [ clientId, gradientAttribute, customGradientAttribute ] + ); const { updateBlockAttributes } = useDispatch( 'core/block-editor' ); const setGradient = useCallback( diff --git a/packages/block-editor/src/components/image-size-control/index.js b/packages/block-editor/src/components/image-size-control/index.js index f77227e650eb1..1637c6c611532 100644 --- a/packages/block-editor/src/components/image-size-control/index.js +++ b/packages/block-editor/src/components/image-size-control/index.js @@ -7,7 +7,12 @@ import { isEmpty, noop } from 'lodash'; * WordPress dependencies */ import { __ } from '@wordpress/i18n'; -import { Button, ButtonGroup, SelectControl, TextControl } from '@wordpress/components'; +import { + Button, + ButtonGroup, + SelectControl, + TextControl, +} from '@wordpress/components'; import { Component } from '@wordpress/element'; class ImageSizeControl extends Component { @@ -63,7 +68,9 @@ class ImageSizeControl extends Component { label={ __( 'Width' ) } value={ width || imageWidth || '' } min={ 1 } - onChange={ ( value ) => onChange( { width: parseInt( value, 10 ) } ) } + onChange={ ( value ) => + onChange( { width: parseInt( value, 10 ) } ) + } /> onChange( { height: parseInt( value, 10 ) } ) } + onChange={ ( value ) => + onChange( { + height: parseInt( value, 10 ), + } ) + } />
        { [ 25, 50, 75, 100 ].map( ( scale ) => { - const scaledWidth = Math.round( imageWidth * ( scale / 100 ) ); - const scaledHeight = Math.round( imageHeight * ( scale / 100 ) ); + const scaledWidth = Math.round( + imageWidth * ( scale / 100 ) + ); + const scaledHeight = Math.round( + imageHeight * ( scale / 100 ) + ); - const isCurrent = width === scaledWidth && height === scaledHeight; + const isCurrent = + width === scaledWidth && + height === scaledHeight; return ( ); } ) } -
        diff --git a/packages/block-editor/src/components/index.js b/packages/block-editor/src/components/index.js index 48e8559d7990b..b5039d38b4649 100644 --- a/packages/block-editor/src/components/index.js +++ b/packages/block-editor/src/components/index.js @@ -15,7 +15,7 @@ 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 __experimentalBlockPatternPicker } from './block-pattern-picker'; +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'; export { default as ColorPalette } from './color-palette'; diff --git a/packages/block-editor/src/components/index.native.js b/packages/block-editor/src/components/index.native.js index fefdf12be3995..0227ceabcc647 100644 --- a/packages/block-editor/src/components/index.native.js +++ b/packages/block-editor/src/components/index.native.js @@ -18,8 +18,13 @@ export { __unstableRichTextInputEvent, } from './rich-text'; export { default as MediaPlaceholder } from './media-placeholder'; -export { default as MediaUpload, MEDIA_TYPE_IMAGE, MEDIA_TYPE_VIDEO } from './media-upload'; +export { + default as MediaUpload, + MEDIA_TYPE_IMAGE, + MEDIA_TYPE_VIDEO, +} from './media-upload'; export { default as MediaUploadProgress } from './media-upload-progress'; +export { default as MediaEdit } from './media-edit'; export { default as URLInput } from './url-input'; export { default as BlockInvalidWarning } from './block-list/block-invalid-warning'; export { default as BlockCaption } from './block-caption'; diff --git a/packages/block-editor/src/components/inner-blocks/README.md b/packages/block-editor/src/components/inner-blocks/README.md index 5d6d7a2650b52..79636d548f198 100644 --- a/packages/block-editor/src/components/inner-blocks/README.md +++ b/packages/block-editor/src/components/inner-blocks/README.md @@ -71,7 +71,7 @@ The previous code block restricts all blocks, so only child blocks explicitly re * **Type:** `Array>` The template is defined as a list of block items. Such blocks can have predefined attributes, placeholder, content, etc. Block templates allow specifying a default initial state for an InnerBlocks area. -More information about templates can be found in [template docs](/docs/developers/block-api/block-templates.md). +More information about templates can be found in [template docs](/docs/designers-developers/developers/block-api/block-templates.md). ```jsx const TEMPLATE = [ [ 'core/columns', {}, [ @@ -100,7 +100,7 @@ If false the selection should not be updated when child blocks specified in the ### `templateLock` * **Type:** `String|Boolean` -Template locking of `InnerBlocks` is similar to [Custom Post Type templates locking](/docs/developers/block-api/block-templates.md#locking). +Template locking of `InnerBlocks` is similar to [Custom Post Type templates locking](/docs/designers-developers/developers/block-api/block-templates.md#locking). Template locking allows locking the `InnerBlocks` area for the current template. *Options:* 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 6e26bb0856b5a..5823a5e42c7b0 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 @@ -6,7 +6,10 @@ import withClientId from './with-client-id'; export const ButtonBlockAppender = ( { clientId, showSeparator } ) => { return ( - + ); }; diff --git a/packages/block-editor/src/components/inner-blocks/default-block-appender.js b/packages/block-editor/src/components/inner-blocks/default-block-appender.js index 43a98be106a2b..4874704148e91 100644 --- a/packages/block-editor/src/components/inner-blocks/default-block-appender.js +++ b/packages/block-editor/src/components/inner-blocks/default-block-appender.js @@ -27,9 +27,7 @@ export const DefaultBlockAppender = ( { clientId, lastBlockClientId } ) => { export default compose( [ withClientId, withSelect( ( select, { clientId } ) => { - const { - getBlockOrder, - } = select( 'core/block-editor' ); + const { getBlockOrder } = select( 'core/block-editor' ); const blockClientIds = getBlockOrder( clientId ); diff --git a/packages/block-editor/src/components/inner-blocks/index.js b/packages/block-editor/src/components/inner-blocks/index.js index a9dc9ae26ddb0..c8a54479d420d 100644 --- a/packages/block-editor/src/components/inner-blocks/index.js +++ b/packages/block-editor/src/components/inner-blocks/index.js @@ -10,7 +10,10 @@ import classnames from 'classnames'; import { withViewportMatch } from '@wordpress/viewport'; import { Component } from '@wordpress/element'; import { withSelect, withDispatch } from '@wordpress/data'; -import { synchronizeBlocksWithTemplate, withBlockContentContext } from '@wordpress/blocks'; +import { + synchronizeBlocksWithTemplate, + withBlockContentContext, +} from '@wordpress/blocks'; import isShallowEqual from '@wordpress/is-shallow-equal'; import { compose } from '@wordpress/compose'; @@ -76,7 +79,10 @@ class InnerBlocks extends Component { this.updateNestedSettings(); // Only synchronize innerBlocks with template if innerBlocks are empty or a locking all exists directly on the block. if ( innerBlocks.length === 0 || templateLock === 'all' ) { - const hasTemplateChanged = ! isEqual( template, prevProps.template ); + const hasTemplateChanged = ! isEqual( + template, + prevProps.template + ); if ( hasTemplateChanged ) { this.synchronizeBlocksWithTemplate(); } @@ -101,8 +107,11 @@ class InnerBlocks extends Component { const { innerBlocks } = block; // Synchronize with templates. If the next set differs, replace. - const nextBlocks = synchronizeBlocksWithTemplate( innerBlocks, template ); - if ( ! isEqual( nextBlocks, innerBlocks ) ) { + const nextBlocks = synchronizeBlocksWithTemplate( + innerBlocks, + template + ); + if ( ! isEqual( nextBlocks, innerBlocks ) ) { replaceInnerBlocks( nextBlocks ); } } @@ -121,8 +130,10 @@ class InnerBlocks extends Component { const newSettings = { allowedBlocks, - templateLock: templateLock === undefined ? parentLock : templateLock, - __experimentalCaptureToolbars: __experimentalCaptureToolbars || false, + templateLock: + templateLock === undefined ? parentLock : templateLock, + __experimentalCaptureToolbars: + __experimentalCaptureToolbars || false, __experimentalMoverDirection, __experimentalUIParts, }; @@ -150,10 +161,7 @@ class InnerBlocks extends Component { return (
        { ! templateInProcess && ( - + ) }
        ); @@ -181,7 +189,10 @@ InnerBlocks = compose( [ return { block, blockListSettings: getBlockListSettings( clientId ), - hasOverlay: block.name !== 'core/template' && ! isBlockSelected( clientId ) && ! hasSelectedInnerBlock( clientId, true ), + hasOverlay: + block.name !== 'core/template' && + ! isBlockSelected( clientId ) && + ! hasSelectedInnerBlock( clientId, true ), parentLock: getTemplateLock( rootClientId ), enableClickThrough: isNavigationMode() || isSmallScreen, isLastBlockChangePersistent: isLastBlockChangePersistent(), @@ -193,7 +204,11 @@ InnerBlocks = compose( [ __unstableMarkNextChangeAsNotPersistent, updateBlockListSettings, } = dispatch( 'core/block-editor' ); - const { block, clientId, templateInsertUpdatesSelection = true } = ownProps; + const { + block, + clientId, + templateInsertUpdatesSelection = true, + } = ownProps; return { replaceInnerBlocks( blocks ) { @@ -217,9 +232,9 @@ InnerBlocks = compose( [ InnerBlocks.DefaultBlockAppender = DefaultBlockAppender; InnerBlocks.ButtonBlockAppender = ButtonBlockAppender; -InnerBlocks.Content = withBlockContentContext( - ( { BlockContent } ) => -); +InnerBlocks.Content = withBlockContentContext( ( { BlockContent } ) => ( + +) ); /** * @see https://github.com/WordPress/gutenberg/blob/master/packages/block-editor/src/components/inner-blocks/README.md 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 145c961f08233..6ff8468565921 100644 --- a/packages/block-editor/src/components/inner-blocks/index.native.js +++ b/packages/block-editor/src/components/inner-blocks/index.native.js @@ -8,7 +8,10 @@ import { pick, isEqual } from 'lodash'; */ import { Component } from '@wordpress/element'; import { withSelect, withDispatch } from '@wordpress/data'; -import { synchronizeBlocksWithTemplate, withBlockContentContext } from '@wordpress/blocks'; +import { + synchronizeBlocksWithTemplate, + withBlockContentContext, +} from '@wordpress/blocks'; import isShallowEqual from '@wordpress/is-shallow-equal'; import { compose } from '@wordpress/compose'; @@ -34,10 +37,7 @@ class InnerBlocks extends Component { } getTemplateLock() { - const { - templateLock, - parentLock, - } = this.props; + const { templateLock, parentLock } = this.props; return templateLock === undefined ? parentLock : templateLock; } @@ -62,7 +62,10 @@ class InnerBlocks extends Component { this.updateNestedSettings(); // only synchronize innerBlocks with template if innerBlocks are empty or a locking all exists if ( innerBlocks.length === 0 || this.getTemplateLock() === 'all' ) { - const hasTemplateChanged = ! isEqual( template, prevProps.template ); + const hasTemplateChanged = ! isEqual( + template, + prevProps.template + ); if ( hasTemplateChanged ) { this.synchronizeBlocksWithTemplate(); } @@ -79,8 +82,11 @@ class InnerBlocks extends Component { const { innerBlocks } = block; // Synchronize with templates. If the next set differs, replace. - const nextBlocks = synchronizeBlocksWithTemplate( innerBlocks, template ); - if ( ! isEqual( nextBlocks, innerBlocks ) ) { + const nextBlocks = synchronizeBlocksWithTemplate( + innerBlocks, + template + ); + if ( ! isEqual( nextBlocks, innerBlocks ) ) { replaceInnerBlocks( nextBlocks ); } } @@ -103,10 +109,7 @@ class InnerBlocks extends Component { } render() { - const { - clientId, - renderAppender, - } = this.props; + const { clientId, renderAppender } = this.props; const { templateInProcess } = this.state; return ( @@ -142,20 +145,31 @@ InnerBlocks = compose( [ return { block, blockListSettings: getBlockListSettings( clientId ), - hasOverlay: block.name !== 'core/template' && ! isBlockSelected( clientId ) && ! hasSelectedInnerBlock( clientId, true ), + hasOverlay: + block.name !== 'core/template' && + ! isBlockSelected( clientId ) && + ! hasSelectedInnerBlock( clientId, true ), parentLock: getTemplateLock( rootClientId ), }; } ), withDispatch( ( dispatch, ownProps ) => { + const { replaceInnerBlocks, updateBlockListSettings } = dispatch( + 'core/block-editor' + ); const { - replaceInnerBlocks, - updateBlockListSettings, - } = dispatch( 'core/block-editor' ); - const { block, clientId, templateInsertUpdatesSelection = true } = ownProps; + block, + clientId, + templateInsertUpdatesSelection = true, + } = ownProps; return { replaceInnerBlocks( blocks ) { - replaceInnerBlocks( clientId, blocks, block.innerBlocks.length === 0 && templateInsertUpdatesSelection ); + replaceInnerBlocks( + clientId, + blocks, + block.innerBlocks.length === 0 && + templateInsertUpdatesSelection + ); }, updateNestedSettings( settings ) { dispatch( updateBlockListSettings( clientId, settings ) ); @@ -168,9 +182,9 @@ InnerBlocks = compose( [ InnerBlocks.DefaultBlockAppender = DefaultBlockAppender; InnerBlocks.ButtonBlockAppender = ButtonBlockAppender; -InnerBlocks.Content = withBlockContentContext( - ( { BlockContent } ) => -); +InnerBlocks.Content = withBlockContentContext( ( { BlockContent } ) => ( + +) ); /** * @see https://github.com/WordPress/gutenberg/blob/master/packages/block-editor/src/components/inner-blocks/README.md diff --git a/packages/block-editor/src/components/inner-blocks/test/index.js b/packages/block-editor/src/components/inner-blocks/test/index.js index 19bfd1bc383d7..ac242fe9ddb11 100644 --- a/packages/block-editor/src/components/inner-blocks/test/index.js +++ b/packages/block-editor/src/components/inner-blocks/test/index.js @@ -50,11 +50,9 @@ describe( 'InnerBlocks', () => { } ); const saved = renderToString( - getSaveElement( - 'core/fruit', - { fruit: 'Bananas' }, - [ createBlock( 'core/fruit', { fruit: 'Apples' } ) ], - ) + getSaveElement( 'core/fruit', { fruit: 'Bananas' }, [ + createBlock( 'core/fruit', { fruit: 'Apples' } ), + ] ) ); expect( saved ).toMatchSnapshot(); @@ -94,11 +92,9 @@ describe( 'InnerBlocks', () => { title: 'block title', }; registerBlockType( 'core/test-block', blockType ); - const block = createBlock( - 'core/test-block', - { content: 'Invalid' }, - [ createBlock( 'core/test-block' ) ] - ); + const block = createBlock( 'core/test-block', { content: 'Invalid' }, [ + createBlock( 'core/test-block' ), + ] ); block.isValid = false; block.originalContent = 'Original'; diff --git a/packages/block-editor/src/components/inner-blocks/with-client-id.js b/packages/block-editor/src/components/inner-blocks/with-client-id.js index 35672ba1681f2..6a49c22abe3e3 100644 --- a/packages/block-editor/src/components/inner-blocks/with-client-id.js +++ b/packages/block-editor/src/components/inner-blocks/with-client-id.js @@ -14,7 +14,10 @@ import { createHigherOrderComponent } from '@wordpress/compose'; import { withBlockEditContext } from '../block-edit/context'; const withClientId = createHigherOrderComponent( - ( WrappedComponent ) => withBlockEditContext( ( context ) => pick( context, [ 'clientId' ] ) )( WrappedComponent ), + ( WrappedComponent ) => + withBlockEditContext( ( context ) => pick( context, [ 'clientId' ] ) )( + WrappedComponent + ), 'withClientId' ); diff --git a/packages/block-editor/src/components/inserter-list-item/index.js b/packages/block-editor/src/components/inserter-list-item/index.js index 674db0f6deedc..b4c8e40cf5efe 100644 --- a/packages/block-editor/src/components/inserter-list-item/index.js +++ b/packages/block-editor/src/components/inserter-list-item/index.js @@ -21,20 +21,20 @@ function InserterListItem( { className, ...props } ) { - const itemIconStyle = icon ? { - backgroundColor: icon.background, - color: icon.foreground, - } : {}; + const itemIconStyle = icon + ? { + backgroundColor: icon.background, + color: icon.foreground, + } + : {}; return (
      • ); }; export default LinkControlSearchItem; - diff --git a/packages/block-editor/src/components/link-control/settings-drawer.js b/packages/block-editor/src/components/link-control/settings-drawer.js index 3100ea87ef661..0df253d11a1eb 100644 --- a/packages/block-editor/src/components/link-control/settings-drawer.js +++ b/packages/block-editor/src/components/link-control/settings-drawer.js @@ -7,9 +7,7 @@ import { noop } from 'lodash'; * WordPress dependencies */ import { __ } from '@wordpress/i18n'; -import { - ToggleControl, -} from '@wordpress/components'; +import { ToggleControl } from '@wordpress/components'; const defaultSettings = [ { @@ -18,7 +16,11 @@ const defaultSettings = [ }, ]; -const LinkControlSettingsDrawer = ( { value, onChange = noop, settings = defaultSettings } ) => { +const LinkControlSettingsDrawer = ( { + value, + onChange = noop, + settings = defaultSettings, +} ) => { if ( ! settings || ! settings.length ) { return null; } @@ -36,7 +38,8 @@ const LinkControlSettingsDrawer = ( { value, onChange = noop, settings = default key={ setting.id } label={ setting.title } onChange={ handleSettingChange( setting ) } - checked={ value ? value[ setting.id ] : false } /> + checked={ value ? value[ setting.id ] : false } + /> ) ); return ( diff --git a/packages/block-editor/src/components/link-control/test/__snapshots__/index.js.snap b/packages/block-editor/src/components/link-control/test/__snapshots__/index.js.snap index 046a4d31fd861..f634dc91d0985 100644 --- a/packages/block-editor/src/components/link-control/test/__snapshots__/index.js.snap +++ b/packages/block-editor/src/components/link-control/test/__snapshots__/index.js.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Basic rendering should render 1`] = `""`; +exports[`Basic rendering should render 1`] = `""`; diff --git a/packages/block-editor/src/components/link-control/test/fixtures/index.js b/packages/block-editor/src/components/link-control/test/fixtures/index.js index 9c926a8f629cb..b470155977a30 100644 --- a/packages/block-editor/src/components/link-control/test/fixtures/index.js +++ b/packages/block-editor/src/components/link-control/test/fixtures/index.js @@ -27,7 +27,8 @@ export const fauxEntitySuggestions = [ }, { id: uniqueId(), - title: 'This is another Post with a much longer title just to be really annoying and to try and break the UI', + title: + 'This is another Post with a much longer title just to be really annoying and to try and break the UI', type: 'Post', info: '1 month ago', url: `?p=${ uniqueId() }`, @@ -35,10 +36,13 @@ export const fauxEntitySuggestions = [ ]; /* eslint-disable no-unused-vars */ -export const fetchFauxEntitySuggestions = ( val = '', { - perPage = null, -} = {} ) => { - const suggestions = perPage ? take( fauxEntitySuggestions, perPage ) : fauxEntitySuggestions; +export const fetchFauxEntitySuggestions = ( + val = '', + { perPage = null } = {} +) => { + const suggestions = perPage + ? take( fauxEntitySuggestions, perPage ) + : fauxEntitySuggestions; return Promise.resolve( suggestions ); }; /* eslint-enable no-unused-vars */ diff --git a/packages/block-editor/src/components/link-control/test/index.js b/packages/block-editor/src/components/link-control/test/index.js index 9c029a9d59e4b..44424efe33429 100644 --- a/packages/block-editor/src/components/link-control/test/index.js +++ b/packages/block-editor/src/components/link-control/test/index.js @@ -57,7 +57,9 @@ describe( 'Basic rendering', () => { } ); // Search Input UI - const searchInput = container.querySelector( 'input[aria-label="URL"]' ); + const searchInput = container.querySelector( + 'input[aria-label="URL"]' + ); expect( searchInput ).not.toBeNull(); expect( container.innerHTML ).toMatchSnapshot(); @@ -70,9 +72,10 @@ describe( 'Searching for a link', () => { let resolver; - const fauxRequest = () => new Promise( ( resolve ) => { - resolver = resolve; - } ); + const fauxRequest = () => + new Promise( ( resolve ) => { + resolver = resolve; + } ); mockFetchSearchSuggestions.mockImplementation( fauxRequest ); @@ -81,7 +84,9 @@ describe( 'Searching for a link', () => { } ); // Search Input UI - const searchInput = container.querySelector( 'input[aria-label="URL"]' ); + const searchInput = container.querySelector( + 'input[aria-label="URL"]' + ); // Simulate searching for a term act( () => { @@ -92,7 +97,9 @@ describe( 'Searching for a link', () => { await eventLoopTick(); // TODO: select these by aria relationship to autocomplete rather than arbitary selector. - const searchResultElements = container.querySelectorAll( '[role="menu"] button[role="menuitem"]' ); + const searchResultElements = container.querySelectorAll( + '[role="menu"] button[role="menuitem"]' + ); let loadingUI = container.querySelector( '.components-spinner' ); @@ -111,7 +118,7 @@ describe( 'Searching for a link', () => { expect( loadingUI ).toBeNull(); } ); - it( 'should display only search suggestions when current input value is not URL-like', async ( ) => { + it( 'should display only search suggestions when current input value is not URL-like', async () => { const searchTerm = 'Hello world'; const firstFauxSuggestion = first( fauxEntitySuggestions ); @@ -120,7 +127,9 @@ describe( 'Searching for a link', () => { } ); // Search Input UI - const searchInput = container.querySelector( 'input[aria-label="URL"]' ); + const searchInput = container.querySelector( + 'input[aria-label="URL"]' + ); // Simulate searching for a term act( () => { @@ -131,55 +140,85 @@ describe( 'Searching for a link', () => { await eventLoopTick(); // TODO: select these by aria relationship to autocomplete rather than arbitary selector. - const searchResultElements = container.querySelectorAll( '[role="listbox"] [role="option"]' ); - const firstSearchResultItemHTML = first( searchResultElements ).innerHTML; + const searchResultElements = container.querySelectorAll( + '[role="listbox"] [role="option"]' + ); + const firstSearchResultItemHTML = first( searchResultElements ) + .innerHTML; const lastSearchResultItemHTML = last( searchResultElements ).innerHTML; - expect( searchResultElements ).toHaveLength( fauxEntitySuggestions.length ); + expect( searchResultElements ).toHaveLength( + fauxEntitySuggestions.length + ); // Sanity check that a search suggestion shows up corresponding to the data - expect( firstSearchResultItemHTML ).toEqual( expect.stringContaining( firstFauxSuggestion.title ) ); - expect( firstSearchResultItemHTML ).toEqual( expect.stringContaining( firstFauxSuggestion.type ) ); + expect( firstSearchResultItemHTML ).toEqual( + expect.stringContaining( firstFauxSuggestion.title ) + ); + expect( firstSearchResultItemHTML ).toEqual( + expect.stringContaining( firstFauxSuggestion.type ) + ); // The fallback URL suggestion should not be shown when input is not URL-like - expect( lastSearchResultItemHTML ).not.toEqual( expect.stringContaining( 'URL' ) ); + expect( lastSearchResultItemHTML ).not.toEqual( + expect.stringContaining( 'URL' ) + ); } ); it.each( [ [ 'couldbeurlorentitysearchterm' ], [ 'ThisCouldAlsoBeAValidURL' ], - ] )( 'should display a URL suggestion as a default fallback for the search term "%s" which could potentially be a valid url.', async ( searchTerm ) => { - act( () => { - render( , container ); - } ); - - // Search Input UI - const searchInput = container.querySelector( 'input[aria-label="URL"]' ); + ] )( + 'should display a URL suggestion as a default fallback for the search term "%s" which could potentially be a valid url.', + async ( searchTerm ) => { + act( () => { + render( , container ); + } ); - // Simulate searching for a term - act( () => { - Simulate.change( searchInput, { target: { value: searchTerm } } ); - } ); + // Search Input UI + const searchInput = container.querySelector( + 'input[aria-label="URL"]' + ); - // fetchFauxEntitySuggestions resolves on next "tick" of event loop - await eventLoopTick(); + // Simulate searching for a term + act( () => { + Simulate.change( searchInput, { + target: { value: searchTerm }, + } ); + } ); - // TODO: select these by aria relationship to autocomplete rather than arbitary selector. - const searchResultElements = container.querySelectorAll( '[role="listbox"] [role="option"]' ); - const lastSearchResultItemHTML = last( searchResultElements ).innerHTML; - const additionalDefaultFallbackURLSuggestionLength = 1; + // fetchFauxEntitySuggestions resolves on next "tick" of event loop + await eventLoopTick(); - // We should see a search result for each of the expect search suggestions - // plus 1 additional one for the fallback URL suggestion - expect( searchResultElements ).toHaveLength( fauxEntitySuggestions.length + additionalDefaultFallbackURLSuggestionLength ); + // TODO: select these by aria relationship to autocomplete rather than arbitary selector. + const searchResultElements = container.querySelectorAll( + '[role="listbox"] [role="option"]' + ); + const lastSearchResultItemHTML = last( searchResultElements ) + .innerHTML; + const additionalDefaultFallbackURLSuggestionLength = 1; + + // We should see a search result for each of the expect search suggestions + // plus 1 additional one for the fallback URL suggestion + expect( searchResultElements ).toHaveLength( + fauxEntitySuggestions.length + + additionalDefaultFallbackURLSuggestionLength + ); - // The last item should be a URL search suggestion - expect( lastSearchResultItemHTML ).toEqual( expect.stringContaining( searchTerm ) ); - expect( lastSearchResultItemHTML ).toEqual( expect.stringContaining( 'URL' ) ); - expect( lastSearchResultItemHTML ).toEqual( expect.stringContaining( 'Press ENTER to add this link' ) ); - } ); + // The last item should be a URL search suggestion + expect( lastSearchResultItemHTML ).toEqual( + expect.stringContaining( searchTerm ) + ); + expect( lastSearchResultItemHTML ).toEqual( + expect.stringContaining( 'URL' ) + ); + expect( lastSearchResultItemHTML ).toEqual( + expect.stringContaining( 'Press ENTER to add this link' ) + ); + } + ); - it( 'should reset the input field and the search results when search term is cleared or reset', async ( ) => { + it( 'should reset the input field and the search results when search term is cleared or reset', async () => { const searchTerm = 'Hello world'; act( () => { @@ -201,10 +240,14 @@ describe( 'Searching for a link', () => { await eventLoopTick(); // TODO: select these by aria relationship to autocomplete rather than arbitary selector. - searchResultElements = container.querySelectorAll( '[role="listbox"] [role="option"]' ); + searchResultElements = container.querySelectorAll( + '[role="listbox"] [role="option"]' + ); // Check we have definitely rendered some suggestions - expect( searchResultElements ).toHaveLength( fauxEntitySuggestions.length ); + expect( searchResultElements ).toHaveLength( + fauxEntitySuggestions.length + ); // Grab the reset button now it's available const resetUI = container.querySelector( '[aria-label="Reset"]' ); @@ -216,7 +259,9 @@ describe( 'Searching for a link', () => { await eventLoopTick(); // TODO: select these by aria relationship to autocomplete rather than arbitary selector. - searchResultElements = container.querySelectorAll( '[role="listbox"] [role="option"]' ); + searchResultElements = container.querySelectorAll( + '[role="listbox"] [role="option"]' + ); searchInput = container.querySelector( 'input[aria-label="URL"]' ); expect( searchInput.value ).toBe( '' ); @@ -229,66 +274,100 @@ describe( 'Manual link entry', () => { [ 'https://make.wordpress.org' ], // explicit https [ 'http://make.wordpress.org' ], // explicit http [ 'www.wordpress.org' ], // usage of "www" - ] )( 'should display a single suggestion result when the current input value is URL-like (eg: %s)', async ( searchTerm ) => { - act( () => { - render( , container ); - } ); - - // Search Input UI - const searchInput = container.querySelector( 'input[aria-label="URL"]' ); - - // Simulate searching for a term - act( () => { - Simulate.change( searchInput, { target: { value: searchTerm } } ); - } ); - - // fetchFauxEntitySuggestions resolves on next "tick" of event loop - await eventLoopTick(); - - // TODO: select these by aria relationship to autocomplete rather than arbitary selector. - const searchResultElements = container.querySelectorAll( '[role="listbox"] [role="option"]' ); - const firstSearchResultItemHTML = searchResultElements[ 0 ].innerHTML; - const expectedResultsLength = 1; - - expect( searchResultElements ).toHaveLength( expectedResultsLength ); - expect( firstSearchResultItemHTML ).toEqual( expect.stringContaining( searchTerm ) ); - expect( firstSearchResultItemHTML ).toEqual( expect.stringContaining( 'URL' ) ); - expect( firstSearchResultItemHTML ).toEqual( expect.stringContaining( 'Press ENTER to add this link' ) ); - } ); - - describe( 'Alternative link protocols and formats', () => { - it.each( [ - [ 'mailto:example123456@wordpress.org', 'mailto' ], - [ 'tel:example123456@wordpress.org', 'tel' ], - [ '#internal-anchor', 'internal' ], - ] )( 'should recognise "%s" as a %s link and handle as manual entry by displaying a single suggestion', async ( searchTerm, searchType ) => { + ] )( + 'should display a single suggestion result when the current input value is URL-like (eg: %s)', + async ( searchTerm ) => { act( () => { - render( - , container - ); + render( , container ); } ); // Search Input UI - const searchInput = container.querySelector( 'input[aria-label="URL"]' ); + const searchInput = container.querySelector( + 'input[aria-label="URL"]' + ); // Simulate searching for a term act( () => { - Simulate.change( searchInput, { target: { value: searchTerm } } ); + Simulate.change( searchInput, { + target: { value: searchTerm }, + } ); } ); // fetchFauxEntitySuggestions resolves on next "tick" of event loop await eventLoopTick(); // TODO: select these by aria relationship to autocomplete rather than arbitary selector. - const searchResultElements = container.querySelectorAll( '[role="listbox"] [role="option"]' ); - const firstSearchResultItemHTML = searchResultElements[ 0 ].innerHTML; + const searchResultElements = container.querySelectorAll( + '[role="listbox"] [role="option"]' + ); + const firstSearchResultItemHTML = + searchResultElements[ 0 ].innerHTML; const expectedResultsLength = 1; - expect( searchResultElements ).toHaveLength( expectedResultsLength ); - expect( firstSearchResultItemHTML ).toEqual( expect.stringContaining( searchTerm ) ); - expect( firstSearchResultItemHTML ).toEqual( expect.stringContaining( searchType ) ); - expect( firstSearchResultItemHTML ).toEqual( expect.stringContaining( 'Press ENTER to add this link' ) ); - } ); + expect( searchResultElements ).toHaveLength( + expectedResultsLength + ); + expect( firstSearchResultItemHTML ).toEqual( + expect.stringContaining( searchTerm ) + ); + expect( firstSearchResultItemHTML ).toEqual( + expect.stringContaining( 'URL' ) + ); + expect( firstSearchResultItemHTML ).toEqual( + expect.stringContaining( 'Press ENTER to add this link' ) + ); + } + ); + + describe( 'Alternative link protocols and formats', () => { + it.each( [ + [ 'mailto:example123456@wordpress.org', 'mailto' ], + [ 'tel:example123456@wordpress.org', 'tel' ], + [ '#internal-anchor', 'internal' ], + ] )( + 'should recognise "%s" as a %s link and handle as manual entry by displaying a single suggestion', + async ( searchTerm, searchType ) => { + act( () => { + render( , container ); + } ); + + // Search Input UI + const searchInput = container.querySelector( + 'input[aria-label="URL"]' + ); + + // Simulate searching for a term + act( () => { + Simulate.change( searchInput, { + target: { value: searchTerm }, + } ); + } ); + + // fetchFauxEntitySuggestions resolves on next "tick" of event loop + await eventLoopTick(); + + // TODO: select these by aria relationship to autocomplete rather than arbitary selector. + const searchResultElements = container.querySelectorAll( + '[role="listbox"] [role="option"]' + ); + const firstSearchResultItemHTML = + searchResultElements[ 0 ].innerHTML; + const expectedResultsLength = 1; + + expect( searchResultElements ).toHaveLength( + expectedResultsLength + ); + expect( firstSearchResultItemHTML ).toEqual( + expect.stringContaining( searchTerm ) + ); + expect( firstSearchResultItemHTML ).toEqual( + expect.stringContaining( searchType ) + ); + expect( firstSearchResultItemHTML ).toEqual( + expect.stringContaining( 'Press ENTER to add this link' ) + ); + } + ); } ); } ); @@ -297,21 +376,27 @@ describe( 'Default search suggestions', () => { const expectedResultsLength = 3; // set within `LinkControl` act( () => { - render( - , container - ); + render( , container ); } ); await eventLoopTick(); // Search Input UI - const searchInput = container.querySelector( 'input[aria-label="URL"]' ); + const searchInput = container.querySelector( + 'input[aria-label="URL"]' + ); // TODO: select these by aria relationship to autocomplete rather than arbitary selector. - const searchResultsWrapper = container.querySelector( '[role="listbox"]' ); - const initialSearchResultElements = searchResultsWrapper.querySelectorAll( '[role="option"]' ); + const searchResultsWrapper = container.querySelector( + '[role="listbox"]' + ); + const initialSearchResultElements = searchResultsWrapper.querySelectorAll( + '[role="option"]' + ); - const searchResultsLabel = container.querySelector( `#${ searchResultsWrapper.getAttribute( 'aria-labelledby' ) }` ); + const searchResultsLabel = container.querySelector( + `#${ searchResultsWrapper.getAttribute( 'aria-labelledby' ) }` + ); // Verify input has no value has default suggestions should only show // when this does not have a value @@ -323,7 +408,9 @@ describe( 'Default search suggestions', () => { expect( mockFetchSearchSuggestions ).toHaveBeenCalledTimes( 1 ); // Verify the search results already display the initial suggestions - expect( initialSearchResultElements ).toHaveLength( expectedResultsLength ); + expect( initialSearchResultElements ).toHaveLength( + expectedResultsLength + ); expect( searchResultsLabel.innerHTML ).toEqual( 'Recently updated' ); } ); @@ -339,7 +426,8 @@ describe( 'Default search suggestions', () => { , container + />, + container ); } ); @@ -351,7 +439,9 @@ describe( 'Default search suggestions', () => { // Click the "Edit/Change" button and check initial suggestions are not // shown. // - const currentLinkUI = container.querySelector( '.block-editor-link-control__search-item.is-current' ); + const currentLinkUI = container.querySelector( + '.block-editor-link-control__search-item.is-current' + ); const currentLinkBtn = currentLinkUI.querySelector( 'button' ); act( () => { @@ -360,7 +450,9 @@ describe( 'Default search suggestions', () => { await eventLoopTick(); - searchResultElements = container.querySelectorAll( '[role="listbox"] [role="option"]' ); + searchResultElements = container.querySelectorAll( + '[role="listbox"] [role="option"]' + ); expect( searchResultElements ).toHaveLength( 0 ); @@ -377,7 +469,9 @@ describe( 'Default search suggestions', () => { await eventLoopTick(); - searchResultElements = container.querySelectorAll( '[role="listbox"] [role="option"]' ); + searchResultElements = container.querySelectorAll( + '[role="listbox"] [role="option"]' + ); expect( searchResultElements ).toHaveLength( 3 ); @@ -403,12 +497,20 @@ describe( 'Selecting links', () => { } ); // TODO: select by aria role or visible text - const currentLink = container.querySelector( '.block-editor-link-control__search-item.is-current' ); + const currentLink = container.querySelector( + '.block-editor-link-control__search-item.is-current' + ); const currentLinkHTML = currentLink.innerHTML; - const currentLinkAnchor = currentLink.querySelector( `[href="${ selectedLink.url }"]` ); - - expect( currentLinkHTML ).toEqual( expect.stringContaining( selectedLink.title ) ); - expect( currentLinkHTML ).toEqual( expect.stringContaining( selectedLink.type ) ); + const currentLinkAnchor = currentLink.querySelector( + `[href="${ selectedLink.url }"]` + ); + + expect( currentLinkHTML ).toEqual( + expect.stringContaining( selectedLink.title ) + ); + expect( currentLinkHTML ).toEqual( + expect.stringContaining( selectedLink.type ) + ); expect( currentLinkHTML ).toEqual( expect.stringContaining( 'Edit' ) ); expect( currentLinkAnchor ).not.toBeNull(); } ); @@ -432,7 +534,9 @@ describe( 'Selecting links', () => { } ); // Required in order to select the button below - let currentLinkUI = container.querySelector( '.block-editor-link-control__search-item.is-current' ); + let currentLinkUI = container.querySelector( + '.block-editor-link-control__search-item.is-current' + ); const currentLinkBtn = currentLinkUI.querySelector( 'button' ); // Simulate searching for a term @@ -440,8 +544,12 @@ describe( 'Selecting links', () => { Simulate.click( currentLinkBtn ); } ); - const searchInput = container.querySelector( 'input[aria-label="URL"]' ); - currentLinkUI = container.querySelector( '.block-editor-link-control__search-item.is-current' ); + const searchInput = container.querySelector( + 'input[aria-label="URL"]' + ); + currentLinkUI = container.querySelector( + '.block-editor-link-control__search-item.is-current' + ); // We should be back to showing the search input expect( searchInput ).not.toBeNull(); @@ -452,152 +560,211 @@ describe( 'Selecting links', () => { describe( 'Selection using mouse click', () => { it.each( [ [ 'entity', 'hello world', first( fauxEntitySuggestions ) ], // entity search - [ 'url', 'https://www.wordpress.org', { - id: '1', - title: 'https://www.wordpress.org', - url: 'https://www.wordpress.org', - type: 'URL', - } ], // url - ] )( 'should display a current selected link UI when a %s suggestion for the search "%s" is clicked', async ( type, searchTerm, selectedLink ) => { - const LinkControlConsumer = () => { - const [ link, setLink ] = useState(); - - return ( - setLink( suggestion ) } - /> - ); - }; + [ + 'url', + 'https://www.wordpress.org', + { + id: '1', + title: 'https://www.wordpress.org', + url: 'https://www.wordpress.org', + type: 'URL', + }, + ], // url + ] )( + 'should display a current selected link UI when a %s suggestion for the search "%s" is clicked', + async ( type, searchTerm, selectedLink ) => { + const LinkControlConsumer = () => { + const [ link, setLink ] = useState(); + + return ( + setLink( suggestion ) } + /> + ); + }; - act( () => { - render( - , container - ); - } ); + act( () => { + render( , container ); + } ); - // Search Input UI - const searchInput = container.querySelector( 'input[aria-label="URL"]' ); + // Search Input UI + const searchInput = container.querySelector( + 'input[aria-label="URL"]' + ); - // Simulate searching for a term - act( () => { - Simulate.change( searchInput, { target: { value: searchTerm } } ); - } ); + // Simulate searching for a term + act( () => { + Simulate.change( searchInput, { + target: { value: searchTerm }, + } ); + } ); - // fetchFauxEntitySuggestions resolves on next "tick" of event loop - await eventLoopTick(); + // fetchFauxEntitySuggestions resolves on next "tick" of event loop + await eventLoopTick(); - // TODO: select these by aria relationship to autocomplete rather than arbitary selector. - const searchResultElements = container.querySelectorAll( '[role="listbox"] [role="option"]' ); + // TODO: select these by aria relationship to autocomplete rather than arbitary selector. + const searchResultElements = container.querySelectorAll( + '[role="listbox"] [role="option"]' + ); - const firstSearchSuggestion = first( searchResultElements ); + const firstSearchSuggestion = first( searchResultElements ); - // Simulate selecting the first of the search suggestions - act( () => { - Simulate.click( firstSearchSuggestion ); - } ); + // Simulate selecting the first of the search suggestions + act( () => { + Simulate.click( firstSearchSuggestion ); + } ); - const currentLink = container.querySelector( '.block-editor-link-control__search-item.is-current' ); - const currentLinkHTML = currentLink.innerHTML; - const currentLinkAnchor = currentLink.querySelector( `[href="${ selectedLink.url }"]` ); + const currentLink = container.querySelector( + '.block-editor-link-control__search-item.is-current' + ); + const currentLinkHTML = currentLink.innerHTML; + const currentLinkAnchor = currentLink.querySelector( + `[href="${ selectedLink.url }"]` + ); - // Check that this suggestion is now shown as selected - expect( currentLinkHTML ).toEqual( expect.stringContaining( selectedLink.title ) ); - expect( currentLinkHTML ).toEqual( expect.stringContaining( 'Edit' ) ); - expect( currentLinkAnchor ).not.toBeNull(); - } ); + // Check that this suggestion is now shown as selected + expect( currentLinkHTML ).toEqual( + expect.stringContaining( selectedLink.title ) + ); + expect( currentLinkHTML ).toEqual( + expect.stringContaining( 'Edit' ) + ); + expect( currentLinkAnchor ).not.toBeNull(); + } + ); } ); describe( 'Selection using keyboard', () => { it.each( [ [ 'entity', 'hello world', first( fauxEntitySuggestions ) ], // entity search - [ 'url', 'https://www.wordpress.org', { - id: '1', - title: 'https://www.wordpress.org', - url: 'https://www.wordpress.org', - type: 'URL', - } ], // url - ] )( 'should display a current selected link UI when an %s suggestion for the search "%s" is selected using the keyboard', async ( type, searchTerm, selectedLink ) => { - const LinkControlConsumer = () => { - const [ link, setLink ] = useState(); - - return ( - setLink( suggestion ) } - /> - ); - }; + [ + 'url', + 'https://www.wordpress.org', + { + id: '1', + title: 'https://www.wordpress.org', + url: 'https://www.wordpress.org', + type: 'URL', + }, + ], // url + ] )( + 'should display a current selected link UI when an %s suggestion for the search "%s" is selected using the keyboard', + async ( type, searchTerm, selectedLink ) => { + const LinkControlConsumer = () => { + const [ link, setLink ] = useState(); + + return ( + setLink( suggestion ) } + /> + ); + }; - act( () => { - render( - , container - ); - } ); - - // Search Input UI - const searchInput = container.querySelector( 'input[aria-label="URL"]' ); - - // Simulate searching for a term - act( () => { - Simulate.change( searchInput, { target: { value: searchTerm } } ); - } ); - - //fetchFauxEntitySuggestions resolves on next "tick" of event loop - await eventLoopTick(); - - // Step down into the search results, highlighting the first result item - act( () => { - Simulate.keyDown( searchInput, { keyCode: DOWN } ); - } ); + act( () => { + render( , container ); + } ); - // TODO: select these by aria relationship to autocomplete rather than arbitary selector. - const searchResultElements = container.querySelectorAll( '[role="listbox"] [role="option"]' ); - const firstSearchSuggestion = first( searchResultElements ); - const secondSearchSuggestion = nth( searchResultElements, 1 ); + // Search Input UI + const searchInput = container.querySelector( + 'input[aria-label="URL"]' + ); + const form = container.querySelector( 'form' ); - let selectedSearchResultElement = container.querySelector( '[role="option"][aria-selected="true"]' ); + // Simulate searching for a term + act( () => { + Simulate.change( searchInput, { + target: { value: searchTerm }, + } ); + } ); - // We should have highlighted the first item using the keyboard - expect( selectedSearchResultElement ).toEqual( firstSearchSuggestion ); + //fetchFauxEntitySuggestions resolves on next "tick" of event loop + await eventLoopTick(); - // Only entity searches contain more than 1 suggestion - if ( type === 'entity' ) { - // Check we can go down again using the down arrow + // Step down into the search results, highlighting the first result item act( () => { Simulate.keyDown( searchInput, { keyCode: DOWN } ); } ); - selectedSearchResultElement = container.querySelector( '[role="option"][aria-selected="true"]' ); + // TODO: select these by aria relationship to autocomplete rather than arbitary selector. + const searchResultElements = container.querySelectorAll( + '[role="listbox"] [role="option"]' + ); + const firstSearchSuggestion = first( searchResultElements ); + const secondSearchSuggestion = nth( searchResultElements, 1 ); + + let selectedSearchResultElement = container.querySelector( + '[role="option"][aria-selected="true"]' + ); // We should have highlighted the first item using the keyboard - expect( selectedSearchResultElement ).toEqual( secondSearchSuggestion ); + expect( selectedSearchResultElement ).toEqual( + firstSearchSuggestion + ); - // Check we can go back up via up arrow + // Only entity searches contain more than 1 suggestion + if ( type === 'entity' ) { + // Check we can go down again using the down arrow + act( () => { + Simulate.keyDown( searchInput, { keyCode: DOWN } ); + } ); + + selectedSearchResultElement = container.querySelector( + '[role="option"][aria-selected="true"]' + ); + + // We should have highlighted the first item using the keyboard + expect( selectedSearchResultElement ).toEqual( + secondSearchSuggestion + ); + + // Check we can go back up via up arrow + act( () => { + Simulate.keyDown( searchInput, { keyCode: UP } ); + } ); + + selectedSearchResultElement = container.querySelector( + '[role="option"][aria-selected="true"]' + ); + + // We should be back to highlighting the first search result again + expect( selectedSearchResultElement ).toEqual( + firstSearchSuggestion + ); + } + + // Commit the selected item as the current link act( () => { - Simulate.keyDown( searchInput, { keyCode: UP } ); + Simulate.keyDown( searchInput, { keyCode: ENTER } ); + } ); + act( () => { + Simulate.submit( form ); } ); - selectedSearchResultElement = container.querySelector( '[role="option"][aria-selected="true"]' ); - - // We should be back to highlighting the first search result again - expect( selectedSearchResultElement ).toEqual( firstSearchSuggestion ); - } - - // Commit the selected item as the current link - act( () => { - Simulate.keyDown( searchInput, { keyCode: ENTER } ); - } ); + // Check that the suggestion selected via is now shown as selected + const currentLink = container.querySelector( + '.block-editor-link-control__search-item.is-current' + ); + const currentLinkHTML = currentLink.innerHTML; + const currentLinkAnchor = currentLink.querySelector( + `[href="${ selectedLink.url }"]` + ); - // Check that the suggestion selected via is now shown as selected - const currentLink = container.querySelector( '.block-editor-link-control__search-item.is-current' ); - const currentLinkHTML = currentLink.innerHTML; - const currentLinkAnchor = currentLink.querySelector( `[href="${ selectedLink.url }"]` ); + // Make sure focus is retained after submission. + expect( container.contains( document.activeElement ) ).toBe( + true + ); - expect( currentLinkHTML ).toEqual( expect.stringContaining( selectedLink.title ) ); - expect( currentLinkHTML ).toEqual( expect.stringContaining( 'Edit' ) ); - expect( currentLinkAnchor ).not.toBeNull(); - } ); + expect( currentLinkHTML ).toEqual( + expect.stringContaining( selectedLink.title ) + ); + expect( currentLinkHTML ).toEqual( + expect.stringContaining( 'Edit' ) + ); + expect( currentLinkAnchor ).not.toBeNull(); + } + ); } ); } ); @@ -616,11 +783,21 @@ describe( 'Addition Settings UI', () => { render( , container ); } ); - const newTabSettingLabel = Array.from( container.querySelectorAll( 'label' ) ).find( ( label ) => label.innerHTML && label.innerHTML.includes( expectedSettingText ) ); + const newTabSettingLabel = Array.from( + container.querySelectorAll( 'label' ) + ).find( + ( label ) => + label.innerHTML && + label.innerHTML.includes( expectedSettingText ) + ); expect( newTabSettingLabel ).not.toBeUndefined(); // find() returns "undefined" if not found - const newTabSettingLabelForAttr = newTabSettingLabel.getAttribute( 'for' ); - const newTabSettingInput = container.querySelector( `#${ newTabSettingLabelForAttr }` ); + const newTabSettingLabelForAttr = newTabSettingLabel.getAttribute( + 'for' + ); + const newTabSettingInput = container.querySelector( + `#${ newTabSettingLabelForAttr }` + ); expect( newTabSettingInput ).not.toBeNull(); expect( newTabSettingInput.checked ).toBe( false ); } ); @@ -639,7 +816,9 @@ describe( 'Addition Settings UI', () => { }, ]; - const customSettingsLabelsText = customSettings.map( ( setting ) => setting.title ); + const customSettingsLabelsText = customSettings.map( + ( setting ) => setting.title + ); const LinkControlConsumer = () => { const [ link ] = useState( selectedLink ); @@ -657,20 +836,34 @@ describe( 'Addition Settings UI', () => { } ); // Grab the elements using user perceivable DOM queries - const settingsLegend = Array.from( container.querySelectorAll( 'legend' ) ).find( ( legend ) => legend.innerHTML && legend.innerHTML.includes( 'Currently selected link settings' ) ); + const settingsLegend = Array.from( + container.querySelectorAll( 'legend' ) + ).find( + ( legend ) => + legend.innerHTML && + legend.innerHTML.includes( 'Currently selected link settings' ) + ); const settingsFieldset = settingsLegend.closest( 'fieldset' ); - const settingControlsLabels = Array.from( settingsFieldset.querySelectorAll( 'label' ) ); + const settingControlsLabels = Array.from( + settingsFieldset.querySelectorAll( 'label' ) + ); const settingControlsInputs = settingControlsLabels.map( ( label ) => { - return settingsFieldset.querySelector( `#${ label.getAttribute( 'for' ) }` ); + return settingsFieldset.querySelector( + `#${ label.getAttribute( 'for' ) }` + ); } ); - const settingControlLabelsText = Array.from( settingControlsLabels ).map( ( label ) => label.innerHTML ); + const settingControlLabelsText = Array.from( + settingControlsLabels + ).map( ( label ) => label.innerHTML ); // Check we have the correct number of controls expect( settingControlsLabels ).toHaveLength( 2 ); // Check the labels match - expect( settingControlLabelsText ).toEqual( expect.arrayContaining( customSettingsLabelsText ) ); + expect( settingControlLabelsText ).toEqual( + expect.arrayContaining( customSettingsLabelsText ) + ); // Assert the default "checked" states match the expected expect( settingControlsInputs[ 0 ].checked ).toEqual( false ); diff --git a/packages/block-editor/src/components/media-edit/index.native.js b/packages/block-editor/src/components/media-edit/index.native.js new file mode 100644 index 0000000000000..fd10c10e2ef5b --- /dev/null +++ b/packages/block-editor/src/components/media-edit/index.native.js @@ -0,0 +1,88 @@ +/** + * External dependencies + */ +import React from 'react'; +import { + requestMediaEditor, + mediaSources, +} from 'react-native-gutenberg-bridge'; + +/** + * WordPress dependencies + */ +import { __ } from '@wordpress/i18n'; +import { Picker } from '@wordpress/components'; + +export const MEDIA_TYPE_IMAGE = 'image'; + +export const MEDIA_EDITOR = 'MEDIA_EDITOR'; + +const editOption = { + id: MEDIA_EDITOR, + value: MEDIA_EDITOR, + label: __( 'Edit' ), + types: [ MEDIA_TYPE_IMAGE ], + icon: 'admin-appearance', +}; + +const replaceOption = { + id: mediaSources.deviceLibrary, + value: mediaSources.deviceLibrary, + label: __( 'Replace' ), + types: [ MEDIA_TYPE_IMAGE ], + icon: 'update', +}; + +const options = [ editOption, replaceOption ]; + +export class MediaEdit extends React.Component { + constructor( props ) { + super( props ); + this.onPickerPresent = this.onPickerPresent.bind( this ); + this.onPickerSelect = this.onPickerSelect.bind( this ); + } + + getMediaOptionsItems() { + return options; + } + + onPickerPresent() { + if ( this.picker ) { + this.picker.presentPicker(); + } + } + + onPickerSelect( value ) { + const { onSelect, multiple = false } = this.props; + + switch ( value ) { + case MEDIA_EDITOR: + requestMediaEditor( this.props.source.uri, ( media ) => { + if ( ( multiple && media ) || ( media && media.id ) ) { + onSelect( media ); + } + } ); + break; + default: + this.props.openReplaceMediaOptions(); + } + } + + render() { + const mediaOptions = () => ( + ( this.picker = instance ) } + options={ this.getMediaOptionsItems() } + onChange={ this.onPickerSelect } + /> + ); + + return this.props.render( { + open: this.onPickerPresent, + mediaOptions, + } ); + } +} + +export default MediaEdit; diff --git a/packages/block-editor/src/components/media-placeholder/index.js b/packages/block-editor/src/components/media-placeholder/index.js index e22befc7e0ed4..1874c431a83d0 100644 --- a/packages/block-editor/src/components/media-placeholder/index.js +++ b/packages/block-editor/src/components/media-placeholder/index.js @@ -1,13 +1,7 @@ /** * External dependencies */ -import { - every, - get, - isArray, - noop, - startsWith, -} from 'lodash'; +import { every, get, isArray, noop, startsWith } from 'lodash'; import classnames from 'classnames'; /** @@ -78,7 +72,9 @@ export class MediaPlaceholder extends Component { return false; } return every( allowedTypes, ( allowedType ) => { - return allowedType === 'image' || startsWith( allowedType, 'image/' ); + return ( + allowedType === 'image' || startsWith( allowedType, 'image/' ) + ); } ); } @@ -87,7 +83,10 @@ export class MediaPlaceholder extends Component { } componentDidUpdate( prevProps ) { - if ( get( prevProps.value, [ 'src' ], '' ) !== get( this.props.value, [ 'src' ], '' ) ) { + if ( + get( prevProps.value, [ 'src' ], '' ) !== + get( this.props.value, [ 'src' ], '' ) + ) { this.setState( { src: get( this.props.value, [ 'src' ], '' ) } ); } } @@ -166,7 +165,9 @@ export class MediaPlaceholder extends Component { let title = labels.title; if ( ! mediaUpload && ! onSelectURL ) { - instructions = __( 'To edit this block, you need permission to upload media.' ); + instructions = __( + 'To edit this block, you need permission to upload media.' + ); } if ( instructions === undefined || title === undefined ) { @@ -176,14 +177,22 @@ export class MediaPlaceholder extends Component { const isVideo = isOneType && 'video' === allowedTypes[ 0 ]; if ( instructions === undefined && mediaUpload ) { - instructions = __( 'Upload a media file or pick one from your media library.' ); + instructions = __( + 'Upload a media file or pick one from your media library.' + ); if ( isAudio ) { - instructions = __( 'Upload an audio file, pick one from your media library, or add one with a URL.' ); + instructions = __( + 'Upload an audio file, pick one from your media library, or add one with a URL.' + ); } else if ( isImage ) { - instructions = __( 'Upload an image file, pick one from your media library, or add one with a URL.' ); + instructions = __( + 'Upload an image file, pick one from your media library, or add one with a URL.' + ); } else if ( isVideo ) { - instructions = __( 'Upload a video file, pick one from your media library, or add one with a URL.' ); + instructions = __( + 'Upload a video file, pick one from your media library, or add one with a URL.' + ); } } @@ -203,7 +212,9 @@ export class MediaPlaceholder extends Component { const placeholderClassName = classnames( 'block-editor-media-placeholder', className, - { 'is-appender': isAppender } + { + 'is-appender': isAppender, + } ); return ( @@ -239,32 +250,27 @@ export class MediaPlaceholder extends Component { } renderCancelLink() { - const { - onCancel, - } = this.props; - return ( onCancel && - + const { onCancel } = this.props; + return ( + onCancel && ( + + ) ); } renderUrlSelectionUI() { - const { - onSelectURL, - } = this.props; + const { onSelectURL } = this.props; if ( ! onSelectURL ) { return null; } - const { - isURLInputVisible, - src, - } = this.state; + const { isURLInputVisible, src } = this.state; return (
        + selectedBlockClientId && ( + + ) ); }; export default withSelect( ( select ) => { return { - selectedBlockClientId: select( 'core/block-editor' ).getBlockSelectionStart(), + selectedBlockClientId: select( + 'core/block-editor' + ).getBlockSelectionStart(), }; } )( SkipToSelectedBlock ); diff --git a/packages/block-editor/src/components/tool-selector/index.js b/packages/block-editor/src/components/tool-selector/index.js index e032f33c3c576..1b9b7e0e5a0b2 100644 --- a/packages/block-editor/src/components/tool-selector/index.js +++ b/packages/block-editor/src/components/tool-selector/index.js @@ -13,11 +13,33 @@ import { __ } from '@wordpress/i18n'; import { useSelect, useDispatch } from '@wordpress/data'; import { useViewportMatch } from '@wordpress/compose'; -const editIcon = ; -const selectIcon = ; +const editIcon = ( + + + + +); +const selectIcon = ( + + + +); function ToolSelector() { - const isNavigationTool = useSelect( ( select ) => select( 'core/block-editor' ).isNavigationMode(), [] ); + const isNavigationTool = useSelect( + ( select ) => select( 'core/block-editor' ).isNavigationMode(), + [] + ); const { setNavigationMode } = useDispatch( 'core/block-editor' ); const isMediumViewport = useViewportMatch( 'medium' ); if ( ! isMediumViewport ) { @@ -40,10 +62,7 @@ function ToolSelector() { ) } renderContent={ () => ( <> - +
        - { __( 'Tools offer different interactions for block selection & editing. To select, press Escape, to go back to editing, press Enter.' ) } + { __( + 'Tools offer different interactions for block selection & editing. To select, press Escape, to go back to editing, press Enter.' + ) }
        ) } diff --git a/packages/block-editor/src/components/typewriter/index.js b/packages/block-editor/src/components/typewriter/index.js index 99487f7a31cf2..b9b2e18ea6104 100644 --- a/packages/block-editor/src/components/typewriter/index.js +++ b/packages/block-editor/src/components/typewriter/index.js @@ -18,12 +18,18 @@ class Typewriter extends Component { this.ref = createRef(); this.onKeyDown = this.onKeyDown.bind( this ); - this.addSelectionChangeListener = this.addSelectionChangeListener.bind( this ); - this.computeCaretRectOnSelectionChange = this.computeCaretRectOnSelectionChange.bind( this ); + this.addSelectionChangeListener = this.addSelectionChangeListener.bind( + this + ); + this.computeCaretRectOnSelectionChange = this.computeCaretRectOnSelectionChange.bind( + this + ); this.maintainCaretPosition = this.maintainCaretPosition.bind( this ); this.computeCaretRect = this.computeCaretRect.bind( this ); this.onScrollResize = this.onScrollResize.bind( this ); - this.isSelectionEligibleForScroll = this.isSelectionEligibleForScroll.bind( this ); + this.isSelectionEligibleForScroll = this.isSelectionEligibleForScroll.bind( + this + ); } componentDidMount() { @@ -36,7 +42,10 @@ class Typewriter extends Component { componentWillUnmount() { window.removeEventListener( 'scroll', this.onScrollResize, true ); window.removeEventListener( 'resize', this.onScrollResize, true ); - document.removeEventListener( 'selectionchange', this.computeCaretRectOnSelectionChange ); + document.removeEventListener( + 'selectionchange', + this.computeCaretRectOnSelectionChange + ); if ( this.onScrollResize.rafId ) { window.cancelAnimationFrame( this.onScrollResize.rafId ); @@ -61,7 +70,10 @@ class Typewriter extends Component { * event. Also removes the listener, so it acts as a one-time listener. */ computeCaretRectOnSelectionChange() { - document.removeEventListener( 'selectionchange', this.computeCaretRectOnSelectionChange ); + document.removeEventListener( + 'selectionchange', + this.computeCaretRectOnSelectionChange + ); this.computeCaretRect(); } @@ -145,16 +157,16 @@ class Typewriter extends Component { } const windowScroll = scrollContainer === document.body; - const scrollY = windowScroll ? - window.scrollY : - scrollContainer.scrollTop; - const scrollContainerY = windowScroll ? - 0 : - scrollContainer.getBoundingClientRect().top; - const relativeScrollPosition = windowScroll ? - this.caretRect.top / window.innerHeight : - ( this.caretRect.top - scrollContainerY ) / - ( window.innerHeight - scrollContainerY ); + const scrollY = windowScroll + ? window.scrollY + : scrollContainer.scrollTop; + const scrollContainerY = windowScroll + ? 0 + : scrollContainer.getBoundingClientRect().top; + const relativeScrollPosition = windowScroll + ? this.caretRect.top / window.innerHeight + : ( this.caretRect.top - scrollContainerY ) / + ( window.innerHeight - scrollContainerY ); // If the scroll position is at the start, the active editable element // is the last one, and the caret is positioned within the initial @@ -172,9 +184,9 @@ class Typewriter extends Component { return; } - const scrollContainerHeight = windowScroll ? - window.innerHeight : - scrollContainer.clientHeight; + const scrollContainerHeight = windowScroll + ? window.innerHeight + : scrollContainer.clientHeight; // Abort if the target scroll position would scroll the caret out of // view. @@ -202,7 +214,10 @@ class Typewriter extends Component { * maintained. */ addSelectionChangeListener() { - document.addEventListener( 'selectionchange', this.computeCaretRectOnSelectionChange ); + document.addEventListener( + 'selectionchange', + this.computeCaretRectOnSelectionChange + ); } onKeyDown( event ) { diff --git a/packages/block-editor/src/components/ungroup-button/icon.js b/packages/block-editor/src/components/ungroup-button/icon.js index 4ef9e2694bd6e..d71219e469666 100644 --- a/packages/block-editor/src/components/ungroup-button/icon.js +++ b/packages/block-editor/src/components/ungroup-button/icon.js @@ -3,6 +3,24 @@ */ import { SVG, Path } from '@wordpress/components'; -const UngroupSVG = ; +const UngroupSVG = ( + + + + +); export default UngroupSVG; diff --git a/packages/block-editor/src/components/ungroup-button/index.native.js b/packages/block-editor/src/components/ungroup-button/index.native.js index df006897210f9..e3056a5104e9e 100644 --- a/packages/block-editor/src/components/ungroup-button/index.native.js +++ b/packages/block-editor/src/components/ungroup-button/index.native.js @@ -6,10 +6,7 @@ import { noop } from 'lodash'; /** * WordPress dependencies */ -import { - Toolbar, - ToolbarButton, -} from '@wordpress/components'; +import { Toolbar, ToolbarButton } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; import { withSelect, withDispatch } from '@wordpress/data'; import { compose } from '@wordpress/compose'; @@ -19,10 +16,7 @@ import { compose } from '@wordpress/compose'; */ import UngroupIcon from './icon'; -export function UngroupButton( { - onConvertFromGroup, - isUngroupable = false, -} ) { +export function UngroupButton( { onConvertFromGroup, isUngroupable = false } ) { if ( ! isUngroupable ) { return null; } @@ -39,21 +33,22 @@ export function UngroupButton( { export default compose( [ withSelect( ( select ) => { - const { - getSelectedBlockClientId, - getBlock, - } = select( 'core/block-editor' ); + const { getSelectedBlockClientId, getBlock } = select( + 'core/block-editor' + ); - const { - getGroupingBlockName, - } = select( 'core/blocks' ); + const { getGroupingBlockName } = select( 'core/blocks' ); const selectedId = getSelectedBlockClientId(); const selectedBlock = getBlock( selectedId ); const groupingBlockName = getGroupingBlockName(); - const isUngroupable = selectedBlock && selectedBlock.innerBlocks && !! selectedBlock.innerBlocks.length && selectedBlock.name === groupingBlockName; + const isUngroupable = + selectedBlock && + selectedBlock.innerBlocks && + !! selectedBlock.innerBlocks.length && + selectedBlock.name === groupingBlockName; const innerBlocks = isUngroupable ? selectedBlock.innerBlocks : []; return { @@ -63,9 +58,7 @@ export default compose( [ }; } ), withDispatch( ( dispatch, { clientId, innerBlocks, onToggle = noop } ) => { - const { - replaceBlocks, - } = dispatch( 'core/block-editor' ); + const { replaceBlocks } = dispatch( 'core/block-editor' ); return { onConvertFromGroup() { @@ -73,10 +66,7 @@ export default compose( [ return; } - replaceBlocks( - clientId, - innerBlocks - ); + replaceBlocks( clientId, innerBlocks ); onToggle(); }, diff --git a/packages/block-editor/src/components/url-input/button.js b/packages/block-editor/src/components/url-input/button.js index fbaf3eedacb13..e262dce201b3e 100644 --- a/packages/block-editor/src/components/url-input/button.js +++ b/packages/block-editor/src/components/url-input/button.js @@ -43,7 +43,7 @@ class URLInputButton extends Component { className="components-toolbar__control" isPressed={ !! url } /> - { expanded && + { expanded && (
        - +
        - } + ) }
      • ); } diff --git a/packages/block-editor/src/components/url-input/index.js b/packages/block-editor/src/components/url-input/index.js index 3f4d6d4e40e13..2ef7b911877c7 100644 --- a/packages/block-editor/src/components/url-input/index.js +++ b/packages/block-editor/src/components/url-input/index.js @@ -11,7 +11,13 @@ import scrollIntoView from 'dom-scroll-into-view'; import { __, sprintf, _n } from '@wordpress/i18n'; import { Component, createRef } from '@wordpress/element'; import { UP, DOWN, ENTER, TAB } from '@wordpress/keycodes'; -import { BaseControl, Button, Spinner, withSpokenMessages, Popover } from '@wordpress/components'; +import { + BaseControl, + Button, + Spinner, + withSpokenMessages, + Popover, +} from '@wordpress/components'; import { withInstanceId, withSafeTimeout, compose } from '@wordpress/compose'; import { withSelect } from '@wordpress/data'; import { isURL } from '@wordpress/url'; @@ -32,7 +38,10 @@ class URLInput extends Component { this.bindSuggestionNode = this.bindSuggestionNode.bind( this ); this.autocompleteRef = props.autocompleteRef || createRef(); this.inputRef = createRef(); - this.updateSuggestions = throttle( this.updateSuggestions.bind( this ), 200 ); + this.updateSuggestions = throttle( + this.updateSuggestions.bind( this ), + 200 + ); this.suggestionNodes = []; @@ -50,12 +59,20 @@ class URLInput extends Component { // only have to worry about scrolling selected suggestion into view // when already expanded - if ( showSuggestions && selectedSuggestion !== null && ! this.scrollingIntoView ) { + if ( + showSuggestions && + selectedSuggestion !== null && + ! this.scrollingIntoView + ) { this.scrollingIntoView = true; - scrollIntoView( this.suggestionNodes[ selectedSuggestion ], this.autocompleteRef.current, { - onlyScrollIfNeeded: true, - } ); + scrollIntoView( + this.suggestionNodes[ selectedSuggestion ], + this.autocompleteRef.current, + { + onlyScrollIfNeeded: true, + } + ); this.props.setTimeout( () => { this.scrollingIntoView = false; @@ -85,8 +102,16 @@ class URLInput extends Component { shouldShowInitialSuggestions() { const { suggestions } = this.state; - const { __experimentalShowInitialSuggestions = false, value } = this.props; - return ! this.isUpdatingSuggestions && __experimentalShowInitialSuggestions && ! ( value && value.length ) && ! ( suggestions && suggestions.length ); + const { + __experimentalShowInitialSuggestions = false, + value, + } = this.props; + return ( + ! this.isUpdatingSuggestions && + __experimentalShowInitialSuggestions && + ! ( value && value.length ) && + ! ( suggestions && suggestions.length ) + ); } updateSuggestions( value = '' ) { @@ -105,7 +130,10 @@ class URLInput extends Component { // - there are at least 2 characters in the search input (except manual searches where // search input length is not required to trigger a fetch) // - this is a direct entry (eg: a URL) - if ( ! isInitialSuggestions && ( value.length < 2 || ( ! handleURLSuggestions && isURL( value ) ) ) ) { + if ( + ! isInitialSuggestions && + ( value.length < 2 || ( ! handleURLSuggestions && isURL( value ) ) ) + ) { this.setState( { showSuggestions: false, selectedSuggestion: null, @@ -127,37 +155,48 @@ class URLInput extends Component { isInitialSuggestions, } ); - request.then( ( suggestions ) => { - // A fetch Promise doesn't have an abort option. It's mimicked by - // comparing the request reference in on the instance, which is - // reset or deleted on subsequent requests or unmounting. - if ( this.suggestionsRequest !== request ) { - return; - } - - this.setState( { - suggestions, - loading: false, - } ); + request + .then( ( suggestions ) => { + // A fetch Promise doesn't have an abort option. It's mimicked by + // comparing the request reference in on the instance, which is + // reset or deleted on subsequent requests or unmounting. + if ( this.suggestionsRequest !== request ) { + return; + } - if ( !! suggestions.length ) { - this.props.debouncedSpeak( sprintf( _n( - '%d result found, use up and down arrow keys to navigate.', - '%d results found, use up and down arrow keys to navigate.', - suggestions.length - ), suggestions.length ), 'assertive' ); - } else { - this.props.debouncedSpeak( __( 'No results.' ), 'assertive' ); - } - this.isUpdatingSuggestions = false; - } ).catch( () => { - if ( this.suggestionsRequest === request ) { this.setState( { + suggestions, loading: false, } ); + + if ( !! suggestions.length ) { + this.props.debouncedSpeak( + sprintf( + _n( + '%d result found, use up and down arrow keys to navigate.', + '%d results found, use up and down arrow keys to navigate.', + suggestions.length + ), + suggestions.length + ), + 'assertive' + ); + } else { + this.props.debouncedSpeak( + __( 'No results.' ), + 'assertive' + ); + } this.isUpdatingSuggestions = false; - } - } ); + } ) + .catch( () => { + if ( this.suggestionsRequest === request ) { + this.setState( { + loading: false, + } ); + this.isUpdatingSuggestions = false; + } + } ); // Note that this assignment is handled *before* the async search request // as a Promise always resolves on the next tick of the event loop. @@ -174,13 +213,16 @@ class URLInput extends Component { } onKeyDown( event ) { - const { showSuggestions, selectedSuggestion, suggestions, loading } = this.state; + const { + showSuggestions, + selectedSuggestion, + suggestions, + loading, + } = this.state; // If the suggestions are not shown or loading, we shouldn't handle the arrow keys // We shouldn't preventDefault to allow block arrow keys navigation - if ( - ( ! showSuggestions || ! suggestions.length || loading ) - ) { + if ( ! showSuggestions || ! suggestions.length || loading ) { // In the Windows version of Firefox the up and down arrows don't move the caret // within an input field like they do for Mac Firefox/Chrome/Safari. This causes // a form of focus trapping that is disruptive to the user experience. This disruption @@ -202,12 +244,17 @@ class URLInput extends Component { // When DOWN is pressed, if the caret is not at the end of the text, move it to the // last position. case DOWN: { - if ( this.props.value.length !== event.target.selectionStart ) { + if ( + this.props.value.length !== event.target.selectionStart + ) { event.stopPropagation(); event.preventDefault(); // Set the input caret to the last position - event.target.setSelectionRange( this.props.value.length, this.props.value.length ); + event.target.setSelectionRange( + this.props.value.length, + this.props.value.length + ); } break; } @@ -216,13 +263,17 @@ class URLInput extends Component { return; } - const suggestion = this.state.suggestions[ this.state.selectedSuggestion ]; + const suggestion = this.state.suggestions[ + this.state.selectedSuggestion + ]; switch ( event.keyCode ) { case UP: { event.stopPropagation(); event.preventDefault(); - const previousIndex = ! selectedSuggestion ? suggestions.length - 1 : selectedSuggestion - 1; + const previousIndex = ! selectedSuggestion + ? suggestions.length - 1 + : selectedSuggestion - 1; this.setState( { selectedSuggestion: previousIndex, } ); @@ -231,7 +282,11 @@ class URLInput extends Component { case DOWN: { event.stopPropagation(); event.preventDefault(); - const nextIndex = selectedSuggestion === null || ( selectedSuggestion === suggestions.length - 1 ) ? 0 : selectedSuggestion + 1; + const nextIndex = + selectedSuggestion === null || + selectedSuggestion === suggestions.length - 1 + ? 0 + : selectedSuggestion + 1; this.setState( { selectedSuggestion: nextIndex, } ); @@ -269,7 +324,14 @@ class URLInput extends Component { this.inputRef.current.focus(); } - static getDerivedStateFromProps( { value, disableSuggestions, __experimentalShowInitialSuggestions = false }, { showSuggestions } ) { + static getDerivedStateFromProps( + { + value, + disableSuggestions, + __experimentalShowInitialSuggestions = false, + }, + { showSuggestions } + ) { let shouldShowSuggestions = showSuggestions; const hasValue = value && value.length; @@ -353,50 +415,71 @@ class URLInput extends Component { aria-expanded={ showSuggestions } aria-autocomplete="list" aria-owns={ suggestionsListboxId } - aria-activedescendant={ selectedSuggestion !== null ? `${ suggestionOptionIdPrefix }-${ selectedSuggestion }` : undefined } + aria-activedescendant={ + selectedSuggestion !== null + ? `${ suggestionOptionIdPrefix }-${ selectedSuggestion }` + : undefined + } ref={ this.inputRef } /> - { ( loading ) && } - - { isFunction( renderSuggestions ) && showSuggestions && !! suggestions.length && renderSuggestions( { - suggestions, - selectedSuggestion, - suggestionsListProps, - buildSuggestionItemProps, - isLoading: loading, - handleSuggestionClick: this.handleOnClick, - isInitialSuggestions: __experimentalShowInitialSuggestions && ! ( value && value.length ), - } ) } - - { ! isFunction( renderSuggestions ) && showSuggestions && !! suggestions.length && - -
        } + + { isFunction( renderSuggestions ) && + showSuggestions && + !! suggestions.length && + renderSuggestions( { + suggestions, + selectedSuggestion, + suggestionsListProps, + buildSuggestionItemProps, + isLoading: loading, + handleSuggestionClick: this.handleOnClick, + isInitialSuggestions: + __experimentalShowInitialSuggestions && + ! ( value && value.length ), + } ) } + + { ! isFunction( renderSuggestions ) && + showSuggestions && + !! suggestions.length && ( + - { suggestions.map( ( suggestion, index ) => ( - - ) ) } -
        -
        - } +
        + { suggestions.map( ( suggestion, index ) => ( + + ) ) } +
        + + ) } ); /* eslint-enable jsx-a11y/no-autofocus */ @@ -418,7 +501,8 @@ export default compose( } const { getSettings } = select( 'core/block-editor' ); return { - __experimentalFetchLinkSuggestions: getSettings().__experimentalFetchLinkSuggestions, + __experimentalFetchLinkSuggestions: getSettings() + .__experimentalFetchLinkSuggestions, }; } ) )( URLInput ); diff --git a/packages/block-editor/src/components/url-input/test/button.js b/packages/block-editor/src/components/url-input/test/button.js index f9898fd41ea6a..04601dfea51c4 100644 --- a/packages/block-editor/src/components/url-input/test/button.js +++ b/packages/block-editor/src/components/url-input/test/button.js @@ -14,19 +14,28 @@ import URLInputButton from '../button'; import '../../../store'; describe( 'URLInputButton', () => { - const clickEditLink = ( wrapper ) => wrapper.find( 'ForwardRef(Button).components-toolbar__control' ).simulate( 'click' ); + const clickEditLink = ( wrapper ) => + wrapper + .find( 'ForwardRef(Button).components-toolbar__control' ) + .simulate( 'click' ); it( 'should have a valid class name in the wrapper tag', () => { const wrapper = shallow( ); - expect( wrapper.hasClass( 'block-editor-url-input__button' ) ).toBe( true ); + expect( wrapper.hasClass( 'block-editor-url-input__button' ) ).toBe( + true + ); } ); it( 'should have isPressed props set to false when url prop not defined', () => { const wrapper = shallow( ); - expect( wrapper.find( 'ForwardRef(Button)' ).prop( 'isPressed' ) ).toBe( false ); + expect( wrapper.find( 'ForwardRef(Button)' ).prop( 'isPressed' ) ).toBe( + false + ); } ); it( 'should have isPressed prop set to true if url prop defined', () => { const wrapper = shallow( ); - expect( wrapper.find( 'ForwardRef(Button)' ).prop( 'isPressed' ) ).toBe( true ); + expect( wrapper.find( 'ForwardRef(Button)' ).prop( 'isPressed' ) ).toBe( + true + ); } ); it( 'should have hidden form by default', () => { const wrapper = shallow( ); @@ -63,19 +72,20 @@ describe( 'URLInputButton', () => { } ); it( 'should close the form when user submits it', () => { const wrapper = TestUtils.renderIntoDocument( ); - const buttonElement = () => TestUtils.scryRenderedDOMComponentsWithClass( - wrapper, - 'components-toolbar__control' - ); - const formElement = () => TestUtils.scryRenderedDOMComponentsWithTag( - wrapper, - 'form' - ); + const buttonElement = () => + TestUtils.scryRenderedDOMComponentsWithClass( + wrapper, + 'components-toolbar__control' + ); + const formElement = () => + TestUtils.scryRenderedDOMComponentsWithTag( wrapper, 'form' ); TestUtils.Simulate.click( buttonElement().shift() ); expect( wrapper.state.expanded ).toBe( true ); TestUtils.Simulate.submit( formElement().shift() ); expect( wrapper.state.expanded ).toBe( false ); - // eslint-disable-next-line react/no-find-dom-node - ReactDOM.unmountComponentAtNode( ReactDOM.findDOMNode( wrapper ).parentNode ); + ReactDOM.unmountComponentAtNode( + // eslint-disable-next-line react/no-find-dom-node + ReactDOM.findDOMNode( wrapper ).parentNode + ); } ); } ); diff --git a/packages/block-editor/src/components/url-popover/image-url-input-ui.js b/packages/block-editor/src/components/url-popover/image-url-input-ui.js index f8fabb072b38c..5263dbe57c74c 100644 --- a/packages/block-editor/src/components/url-popover/image-url-input-ui.js +++ b/packages/block-editor/src/components/url-popover/image-url-input-ui.js @@ -17,14 +17,7 @@ import { SVG, Path, } from '@wordpress/components'; -import { - LEFT, - RIGHT, - UP, - DOWN, - BACKSPACE, - ENTER, -} from '@wordpress/keycodes'; +import { LEFT, RIGHT, UP, DOWN, BACKSPACE, ENTER } from '@wordpress/keycodes'; /** * Internal dependencies @@ -37,7 +30,13 @@ const LINK_DESTINATION_MEDIA = 'media'; const LINK_DESTINATION_ATTACHMENT = 'attachment'; const NEW_TAB_REL = [ 'noreferrer', 'noopener' ]; -const icon = ; +const icon = ( + + + + + +); const ImageURLInputUI = ( { linkDestination, @@ -65,14 +64,19 @@ const ImageURLInputUI = ( { }; const stopPropagationRelevantKeys = ( event ) => { - if ( [ LEFT, DOWN, RIGHT, UP, BACKSPACE, ENTER ].indexOf( event.keyCode ) > -1 ) { + if ( + [ LEFT, DOWN, RIGHT, UP, BACKSPACE, ENTER ].indexOf( + event.keyCode + ) > -1 + ) { // Stop the key event from propagating up to ObserveTyping.startTypingInTextField. event.stopPropagation(); } }; const startEditLink = useCallback( () => { - if ( linkDestination === LINK_DESTINATION_MEDIA || + if ( + linkDestination === LINK_DESTINATION_MEDIA || linkDestination === LINK_DESTINATION_ATTACHMENT ) { setUrlInput( '' ); @@ -137,7 +141,10 @@ const ImageURLInputUI = ( { // LinkContainer. Detect clicks on autocomplete suggestions using a ref here, and // return to avoid the popover being closed. const autocompleteElement = autocompleteRef.current; - if ( autocompleteElement && autocompleteElement.contains( event.target ) ) { + if ( + autocompleteElement && + autocompleteElement.contains( event.target ) + ) { return; } setIsOpen( false ); @@ -176,7 +183,12 @@ const ImageURLInputUI = ( { linkDestination: LINK_DESTINATION_ATTACHMENT, title: __( 'Attachment Page' ), url: mediaType === 'image' ? mediaLink : undefined, - icon: , + icon: ( + + + + + ), }, ]; }; @@ -190,8 +202,7 @@ const ImageURLInputUI = ( { linkDestinationInput = ( find( linkDestinations, ( destination ) => { return destination.url === value; - } ) || - { linkDestination: LINK_DESTINATION_CUSTOM } + } ) || { linkDestination: LINK_DESTINATION_CUSTOM } ).linkDestination; } onChangeUrl( { @@ -218,7 +229,8 @@ const ImageURLInputUI = ( { + checked={ linkTarget === '_blank' } + /> @@ -254,10 +269,10 @@ const ImageURLInputUI = ( { onFocusOutside={ onFocusOutside() } onClose={ closeLinkUI } renderSettings={ () => advancedOptions } - additionalControls={ ! linkEditorValue && ( - - { - map( getLinkDestinations(), ( link ) => ( + additionalControls={ + ! linkEditorValue && ( + + { map( getLinkDestinations(), ( link ) => ( { link.title } - ) ) - } - - ) } + ) ) } + + ) + } > { ( ! url || isEditingLink ) && ( ) } - { ( url && ! isEditingLink ) && ( + { url && ! isEditingLink && ( <> { additionalControls && ! showSettings && ( -
        +
        { additionalControls }
        ) } 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 bdf657ae42439..570c773124e50 100644 --- a/packages/block-editor/src/components/url-popover/link-viewer.js +++ b/packages/block-editor/src/components/url-popover/link-viewer.js @@ -7,10 +7,7 @@ import classnames from 'classnames'; * WordPress dependencies */ import { __ } from '@wordpress/i18n'; -import { - ExternalLink, - Button, -} from '@wordpress/components'; +import { ExternalLink, Button } from '@wordpress/components'; import { safeDecodeURI, filterURLForDisplay } from '@wordpress/url'; function LinkViewerUrl( { url, urlLabel, className } ) { @@ -24,10 +21,7 @@ function LinkViewerUrl( { url, urlLabel, className } ) { } return ( - + { urlLabel || filterURLForDisplay( safeDecodeURI( url ) ) } ); @@ -49,8 +43,18 @@ export default function LinkViewer( { ) } { ...props } > - - { onEditLinkClick &&
        ); } diff --git a/packages/block-editor/src/components/url-popover/test/index.js b/packages/block-editor/src/components/url-popover/test/index.js index e541343151034..af15793510435 100644 --- a/packages/block-editor/src/components/url-popover/test/index.js +++ b/packages/block-editor/src/components/url-popover/test/index.js @@ -11,11 +11,7 @@ import URLPopover from '../'; describe( 'URLPopover', () => { it( 'matches the snapshot in its default state', () => { const wrapper = shallow( - ( -
        Settings
        - ) } - > +
        Settings
        }>
        Editor
        ); @@ -25,16 +21,14 @@ describe( 'URLPopover', () => { it( 'matches the snapshot when the settings are toggled open', () => { const wrapper = shallow( - ( -
        Settings
        - ) } - > +
        Settings
        }>
        Editor
        ); - const toggleButton = wrapper.find( '.block-editor-url-popover__settings-toggle' ); + const toggleButton = wrapper.find( + '.block-editor-url-popover__settings-toggle' + ); expect( toggleButton ).toHaveLength( 1 ); toggleButton.simulate( 'click' ); diff --git a/packages/block-editor/src/components/video-player/gridicon-play.native.js b/packages/block-editor/src/components/video-player/gridicon-play.native.js index 6f14d04f16a29..037cdfd36272c 100644 --- a/packages/block-editor/src/components/video-player/gridicon-play.native.js +++ b/packages/block-editor/src/components/video-player/gridicon-play.native.js @@ -3,5 +3,11 @@ */ import { Path, SVG } from '@wordpress/components'; -export default ; - +export default ( + + + +); diff --git a/packages/block-editor/src/components/video-player/index.native.js b/packages/block-editor/src/components/video-player/index.native.js index 73c2038a0b457..a409c1d4ad99f 100644 --- a/packages/block-editor/src/components/video-player/index.native.js +++ b/packages/block-editor/src/components/video-player/index.native.js @@ -54,17 +54,33 @@ class Video extends Component { // Tries opening the URL outside of the app openURL( url ) { - Linking.canOpenURL( url ).then( ( supported ) => { - if ( ! supported ) { - Alert.alert( __( 'Problem opening the video' ), __( 'No application can handle this request. Please install a Web browser.' ) ); - window.console.warn( 'No application found that can open the video with URL: ' + url ); - } else { - return Linking.openURL( url ); - } - } ).catch( ( err ) => { - Alert.alert( __( 'Problem opening the video' ), __( 'An unknown error occurred. Please try again.' ) ); - window.console.error( 'An error occurred while opening the video URL: ' + url, err ); - } ); + Linking.canOpenURL( url ) + .then( ( supported ) => { + if ( ! supported ) { + Alert.alert( + __( 'Problem opening the video' ), + __( + 'No application can handle this request. Please install a Web browser.' + ) + ); + window.console.warn( + 'No application found that can open the video with URL: ' + + url + ); + } else { + return Linking.openURL( url ); + } + } ) + .catch( ( err ) => { + Alert.alert( + __( 'Problem opening the video' ), + __( 'An unknown error occurred. Please try again.' ) + ); + window.console.error( + 'An error occurred while opening the video URL: ' + url, + err + ); + } ); } render() { @@ -93,14 +109,22 @@ class Video extends Component { this.setState( { isFullScreen: false } ); } } /> - { showPlayButton && - // If we add the play icon as a subview to VideoPlayer then react-native-video decides to show control buttons - // even if we set controls={ false }, so we are adding our play button as a sibling overlay view. - - - - - } + { showPlayButton && ( + // If we add the play icon as a subview to VideoPlayer then react-native-video decides to show control buttons + // even if we set controls={ false }, so we are adding our play button as a sibling overlay view. + + + + + ) }
        ); } diff --git a/packages/block-editor/src/components/warning/index.js b/packages/block-editor/src/components/warning/index.js index 1806501fff4e7..9c5765ff9cf5e 100644 --- a/packages/block-editor/src/components/warning/index.js +++ b/packages/block-editor/src/components/warning/index.js @@ -19,7 +19,10 @@ function Warning( { className, actions, children, secondaryActions } ) { { Children.count( actions ) > 0 && (
        { Children.map( actions, ( action, i ) => ( - + { action } ) ) } @@ -41,11 +44,11 @@ function Warning( { className, actions, children, secondaryActions } ) { ) } renderContent={ () => ( - { secondaryActions.map( ( item, pos ) => + { secondaryActions.map( ( item, pos ) => ( { item.title } - ) } + ) ) } ) } /> diff --git a/packages/block-editor/src/components/warning/index.native.js b/packages/block-editor/src/components/warning/index.native.js index dc7e83d16509a..cda7f13a68405 100644 --- a/packages/block-editor/src/components/warning/index.native.js +++ b/packages/block-editor/src/components/warning/index.native.js @@ -15,15 +15,32 @@ import { normalizeIconObject } from '@wordpress/blocks'; */ import styles from './style.scss'; -function Warning( { title, message, icon, iconClass, preferredColorScheme, getStylesFromColorScheme, ...viewProps } ) { +function Warning( { + title, + message, + icon, + iconClass, + preferredColorScheme, + getStylesFromColorScheme, + ...viewProps +} ) { icon = icon && normalizeIconObject( icon ); const internalIconClass = 'warning-icon' + '-' + preferredColorScheme; - const titleStyle = getStylesFromColorScheme( styles.title, styles.titleDark ); - const messageStyle = getStylesFromColorScheme( styles.message, styles.messageDark ); + const titleStyle = getStylesFromColorScheme( + styles.title, + styles.titleDark + ); + const messageStyle = getStylesFromColorScheme( + styles.message, + styles.messageDark + ); return ( { icon && ( @@ -34,12 +51,8 @@ function Warning( { title, message, icon, iconClass, preferredColorScheme, getSt /> ) } - { title && ( - { title } - ) } - { message && ( - { message } - ) } + { title && { title } } + { message && { message } } ); } diff --git a/packages/block-editor/src/components/warning/test/index.js b/packages/block-editor/src/components/warning/test/index.js index f1a10c4e6fbc3..b8fcdbee4e490 100644 --- a/packages/block-editor/src/components/warning/test/index.js +++ b/packages/block-editor/src/components/warning/test/index.js @@ -19,23 +19,35 @@ describe( 'Warning', () => { const wrapper = shallow( ); expect( wrapper.hasClass( 'block-editor-warning' ) ).toBe( true ); - expect( wrapper.find( '.block-editor-warning__actions' ) ).toHaveLength( 0 ); - expect( wrapper.find( '.block-editor-warning__hidden' ) ).toHaveLength( 0 ); + expect( wrapper.find( '.block-editor-warning__actions' ) ).toHaveLength( + 0 + ); + expect( wrapper.find( '.block-editor-warning__hidden' ) ).toHaveLength( + 0 + ); } ); it( 'should show child error message element', () => { - const wrapper = shallow( }>Message ); + const wrapper = shallow( + }>Message + ); const actions = wrapper.find( '.block-editor-warning__actions' ); const action = actions.childAt( 0 ); expect( actions ).toHaveLength( 1 ); - expect( action.hasClass( 'block-editor-warning__action' ) ).toBe( true ); + expect( action.hasClass( 'block-editor-warning__action' ) ).toBe( + true + ); expect( action.childAt( 0 ).type() ).toBe( 'button' ); } ); it( 'should show hidden actions', () => { - const wrapper = shallow( Message ); + const wrapper = shallow( + + Message + + ); const actions = wrapper.find( '.block-editor-warning__secondary' ); diff --git a/packages/block-editor/src/components/writing-flow/focus-capture.js b/packages/block-editor/src/components/writing-flow/focus-capture.js index b1753c6ea7b15..8440a3097e042 100644 --- a/packages/block-editor/src/components/writing-flow/focus-capture.js +++ b/packages/block-editor/src/components/writing-flow/focus-capture.js @@ -30,67 +30,79 @@ import { getBlockDOMNode } from '../../utils/dom'; * * @return {WPElement} The focus capture element. */ -const FocusCapture = forwardRef( ( { - selectedClientId, - isReverse, - containerRef, - noCapture, -}, ref ) => { - const isNavigationMode = useSelect( ( select ) => - select( 'core/block-editor' ).isNavigationMode() - ); - const { setNavigationMode } = useDispatch( 'core/block-editor' ); +const FocusCapture = forwardRef( + ( + { + selectedClientId, + isReverse, + containerRef, + noCapture, + hasMultiSelection, + multiSelectionContainer, + }, + ref + ) => { + const isNavigationMode = useSelect( ( select ) => + select( 'core/block-editor' ).isNavigationMode() + ); + const { setNavigationMode } = useDispatch( 'core/block-editor' ); - function onFocus() { - // Do not capture incoming focus if set by us in WritingFlow. - if ( noCapture.current ) { - noCapture.current = null; - return; - } + function onFocus() { + // Do not capture incoming focus if set by us in WritingFlow. + if ( noCapture.current ) { + noCapture.current = null; + return; + } - // When focus coming in from out of the block list, and no block is - // selected, enable Navigation mode and select the first or last block - // depending on the direction. - if ( ! selectedClientId ) { - setNavigationMode( true ); + // When focus coming in from out of the block list, and no block is + // selected, enable Navigation mode and select the first or last block + // depending on the direction. + if ( ! selectedClientId ) { + if ( hasMultiSelection ) { + multiSelectionContainer.current.focus(); + return; + } - const tabbables = focus.tabbable.find( containerRef.current ); + setNavigationMode( true ); - if ( tabbables.length ) { - if ( isReverse ) { - last( tabbables ).focus(); - } else { - first( tabbables ).focus(); + const tabbables = focus.tabbable.find( containerRef.current ); + + if ( tabbables.length ) { + if ( isReverse ) { + last( tabbables ).focus(); + } else { + first( tabbables ).focus(); + } } - } - return; - } + return; + } - // If there is a selected block, move focus to the first or last - // tabbable element depending on the direction. - const wrapper = getBlockDOMNode( selectedClientId ); + // If there is a selected block, move focus to the first or last + // tabbable element depending on the direction. + const wrapper = getBlockDOMNode( selectedClientId ); - if ( isReverse ) { - const tabbables = focus.tabbable.find( wrapper ); - const lastTabbable = last( tabbables ) || wrapper; - lastTabbable.focus(); - } else { - wrapper.focus(); + if ( isReverse ) { + const tabbables = focus.tabbable.find( wrapper ); + const lastTabbable = last( tabbables ) || wrapper; + lastTabbable.focus(); + } else { + wrapper.focus(); + } } - } - return ( -
        - ); -} ); + return ( +
        + ); + } +); export default FocusCapture; diff --git a/packages/block-editor/src/components/writing-flow/index.js b/packages/block-editor/src/components/writing-flow/index.js index 9248931df8196..91b0dcfe274ec 100644 --- a/packages/block-editor/src/components/writing-flow/index.js +++ b/packages/block-editor/src/components/writing-flow/index.js @@ -2,11 +2,12 @@ * External dependencies */ import { overEvery, find, findLast, reverse, first, last } from 'lodash'; +import classnames from 'classnames'; /** * WordPress dependencies */ -import { useRef } from '@wordpress/element'; +import { useRef, useEffect } from '@wordpress/element'; import { computeCaretRect, focus, @@ -17,8 +18,17 @@ import { placeCaretAtVerticalEdge, isEntirelySelected, } from '@wordpress/dom'; -import { UP, DOWN, LEFT, RIGHT, TAB, isKeyboardEvent, ESCAPE } from '@wordpress/keycodes'; +import { + UP, + DOWN, + LEFT, + RIGHT, + TAB, + isKeyboardEvent, + ESCAPE, +} from '@wordpress/keycodes'; import { useSelect, useDispatch } from '@wordpress/data'; +import { __ } from '@wordpress/i18n'; /** * Internal dependencies @@ -63,7 +73,7 @@ const isTabbableTextField = overEvery( [ * @return {boolean} Whether element should consider edge navigation. */ export function isNavigationCandidate( element, keyCode, hasModifier ) { - const isVertical = ( keyCode === UP || keyCode === DOWN ); + const isVertical = keyCode === UP || keyCode === DOWN; // Currently, all elements support unmodified vertical navigation. if ( isVertical && ! hasModifier ) { @@ -98,7 +108,9 @@ export function getClosestTabbable( target, isReverse, containerElement ) { // Consider as candidates those focusables after the current target. // It's assumed this can only be reached if the target is focusable // (on its keydown event), so no need to verify it exists in the set. - focusableNodes = focusableNodes.slice( focusableNodes.indexOf( target ) + 1 ); + focusableNodes = focusableNodes.slice( + focusableNodes.indexOf( target ) + 1 + ); function isTabCandidate( node, i, array ) { // Not a candidate if the node is not tabbable. @@ -130,7 +142,11 @@ export function getClosestTabbable( target, isReverse, containerElement ) { // In case of block focus stop, check to see if there's a better // text field candidate within. - for ( let offset = 1, nextNode; ( nextNode = array[ i + offset ] ); offset++ ) { + for ( + let offset = 1, nextNode; + ( nextNode = array[ i + offset ] ); + offset++ + ) { // Abort if no longer testing descendents of focus stop. if ( ! node.contains( nextNode ) ) { break; @@ -164,6 +180,7 @@ function selector( select ) { isNavigationMode, isSelectionEnabled, getBlockSelectionStart, + isMultiSelecting, } = select( 'core/block-editor' ); const selectedBlockClientId = getSelectedBlockClientId(); @@ -173,8 +190,12 @@ function selector( select ) { return { selectedBlockClientId, selectionStartClientId, - selectionBeforeEndClientId: getPreviousBlockClientId( selectionEndClientId || selectedBlockClientId ), - selectionAfterEndClientId: getNextBlockClientId( selectionEndClientId || selectedBlockClientId ), + selectionBeforeEndClientId: getPreviousBlockClientId( + selectionEndClientId || selectedBlockClientId + ), + selectionAfterEndClientId: getNextBlockClientId( + selectionEndClientId || selectedBlockClientId + ), selectedFirstClientId: getFirstMultiSelectedBlockClientId(), selectedLastClientId: getLastMultiSelectedBlockClientId(), hasMultiSelection: hasMultiSelection(), @@ -182,6 +203,7 @@ function selector( select ) { isNavigationMode: isNavigationMode(), isSelectionEnabled: isSelectionEnabled(), blockSelectionStart: getBlockSelectionStart(), + isMultiSelecting: isMultiSelecting(), }; } @@ -193,6 +215,7 @@ export default function WritingFlow( { children } ) { const container = useRef(); const focusCaptureBeforeRef = useRef(); const focusCaptureAfterRef = useRef(); + const multiSelectionContainer = useRef(); const entirelySelected = useRef(); @@ -217,6 +240,7 @@ export default function WritingFlow( { children } ) { isNavigationMode, isSelectionEnabled, blockSelectionStart, + isMultiSelecting, } = useSelect( selector, [] ); const { multiSelect, @@ -232,7 +256,10 @@ export default function WritingFlow( { children } ) { if ( isNavigationMode && selectedBlockClientId && - isInsideRootBlock( getBlockDOMNode( selectedBlockClientId ), event.target ) + isInsideRootBlock( + getBlockDOMNode( selectedBlockClientId ), + event.target + ) ) { setNavigationMode( false ); } @@ -252,11 +279,11 @@ export default function WritingFlow( { children } ) { multiSelect( blockSelectionStart, clientId ); event.preventDefault(); } - // Allow user to escape out of a multi-selection to a singular - // selection of a block via click. This is handled here since - // focus handling excludes blocks when there is multiselection, - // as focus can be incurred by starting a multiselection (focus - // moved to first block's multi-controls). + // Allow user to escape out of a multi-selection to a singular + // selection of a block via click. This is handled here since + // focus handling excludes blocks when there is multiselection, + // as focus can be incurred by starting a multiselection (focus + // moved to first block's multi-controls). } else if ( hasMultiSelection ) { selectBlock( clientId ); } @@ -265,9 +292,9 @@ export default function WritingFlow( { children } ) { } function expandSelection( isReverse ) { - const nextSelectionEndClientId = isReverse ? - selectionBeforeEndClientId : - selectionAfterEndClientId; + const nextSelectionEndClientId = isReverse + ? selectionBeforeEndClientId + : selectionAfterEndClientId; if ( nextSelectionEndClientId ) { multiSelect( @@ -278,7 +305,9 @@ export default function WritingFlow( { children } ) { } function moveSelection( isReverse ) { - const focusedBlockClientId = isReverse ? selectedFirstClientId : selectedLastClientId; + const focusedBlockClientId = isReverse + ? selectedFirstClientId + : selectedLastClientId; if ( focusedBlockClientId ) { selectBlock( focusedBlockClientId ); @@ -297,7 +326,11 @@ export default function WritingFlow( { children } ) { * @return {boolean} Whether field is at edge for tab transition. */ function isTabbableEdge( target, isReverse ) { - const closestTabbable = getClosestTabbable( target, isReverse, container.current ); + const closestTabbable = getClosestTabbable( + target, + isReverse, + container.current + ); return ! closestTabbable || ! isInSameBlock( target, closestTabbable ); } @@ -314,14 +347,17 @@ export default function WritingFlow( { children } ) { const isVertical = isUp || isDown; const isNav = isHorizontal || isVertical; const isShift = event.shiftKey; - const hasModifier = isShift || event.ctrlKey || event.altKey || event.metaKey; + const hasModifier = + isShift || event.ctrlKey || event.altKey || event.metaKey; const isNavEdge = isVertical ? isVerticalEdge : isHorizontalEdge; // In navigation mode, tab and arrows navigate from block to block. if ( isNavigationMode ) { const navigateUp = ( isTab && isShift ) || isUp; const navigateDown = ( isTab && ! isShift ) || isDown; - const focusedBlockUid = navigateUp ? selectionBeforeEndClientId : selectionAfterEndClientId; + const focusedBlockUid = navigateUp + ? selectionBeforeEndClientId + : selectionAfterEndClientId; if ( navigateDown || navigateUp ) { if ( focusedBlockUid ) { @@ -348,18 +384,16 @@ export default function WritingFlow( { children } ) { return; } - const clientId = selectedBlockClientId || selectedFirstClientId; - // In Edit mode, Tab should focus the first tabbable element after the // content, which is normally the sidebar (with block controls) and // Shift+Tab should focus the first tabbable element before the content, // which is normally the block toolbar. // Arrow keys can be used, and Tab and arrow keys can be used in // Navigation mode (press Esc), to navigate through blocks. - if ( clientId ) { - const wrapper = getBlockDOMNode( clientId ); - + if ( selectedBlockClientId ) { if ( isTab ) { + const wrapper = getBlockDOMNode( selectedBlockClientId ); + if ( isShift ) { if ( target === wrapper ) { // Disable focus capturing on the focus capture element, so @@ -383,6 +417,21 @@ export default function WritingFlow( { children } ) { } else if ( isEscape ) { setNavigationMode( true ); } + } else if ( + hasMultiSelection && + isTab && + target === multiSelectionContainer.current + ) { + // See comment above. + noCapture.current = true; + + if ( isShift ) { + focusCaptureBeforeRef.current.focus(); + } else { + focusCaptureAfterRef.current.focus(); + } + + return; } // When presing any key other than up or down, the initial vertical @@ -412,7 +461,11 @@ export default function WritingFlow( { children } ) { // have been set by the browser earlier in this call stack. We // need check the previous result, otherwise all blocks will be // selected right away. - if ( target.isContentEditable ? entirelySelected.current : isEntirelySelected( target ) ) { + if ( + target.isContentEditable + ? entirelySelected.current + : isEntirelySelected( target ) + ) { multiSelect( first( blocks ), last( blocks ) ); event.preventDefault(); } @@ -440,20 +493,16 @@ export default function WritingFlow( { children } ) { // In the case of RTL scripts, right means previous and left means next, // which is the exact reverse of LTR. const { direction } = getComputedStyle( target ); - const isReverseDir = direction === 'rtl' ? ( ! isReverse ) : isReverse; + const isReverseDir = direction === 'rtl' ? ! isReverse : isReverse; if ( isShift ) { if ( - ( - // Ensure that there is a target block. - ( isReverse && selectionBeforeEndClientId ) || - ( ! isReverse && selectionAfterEndClientId ) - ) && ( - hasMultiSelection || ( - isTabbableEdge( target, isReverse ) && - isNavEdge( target, isReverse ) - ) - ) + // Ensure that there is a target block. + ( ( isReverse && selectionBeforeEndClientId ) || + ( ! isReverse && selectionAfterEndClientId ) ) && + ( hasMultiSelection || + ( isTabbableEdge( target, isReverse ) && + isNavEdge( target, isReverse ) ) ) ) { // Shift key is down, and there is multi selection or we're at // the end of the current block. @@ -465,14 +514,30 @@ export default function WritingFlow( { children } ) { moveSelection( isReverse ); event.preventDefault(); } else if ( isVertical && isVerticalEdge( target, isReverse ) ) { - const closestTabbable = getClosestTabbable( target, isReverse, container.current ); + const closestTabbable = getClosestTabbable( + target, + isReverse, + container.current + ); if ( closestTabbable ) { - placeCaretAtVerticalEdge( closestTabbable, isReverse, verticalRect.current ); + placeCaretAtVerticalEdge( + closestTabbable, + isReverse, + verticalRect.current + ); event.preventDefault(); } - } else if ( isHorizontal && getSelection().isCollapsed && isHorizontalEdge( target, isReverseDir ) ) { - const closestTabbable = getClosestTabbable( target, isReverseDir, container.current ); + } else if ( + isHorizontal && + getSelection().isCollapsed && + isHorizontalEdge( target, isReverseDir ) + ) { + const closestTabbable = getClosestTabbable( + target, + isReverseDir, + container.current + ); placeCaretAtHorizontalEdge( closestTabbable, isReverseDir ); event.preventDefault(); } @@ -486,31 +551,55 @@ export default function WritingFlow( { children } ) { } } - const selectedClientId = selectedBlockClientId || selectedFirstClientId; + useEffect( () => { + if ( hasMultiSelection && ! isMultiSelecting ) { + multiSelectionContainer.current.focus(); + } + }, [ hasMultiSelection, isMultiSelecting ] ); + + const className = classnames( 'block-editor-writing-flow', { + 'is-navigate-mode': isNavigationMode, + } ); // Disable reason: Wrapper itself is non-interactive, but must capture // bubbling events from children to determine focus transition intents. /* eslint-disable jsx-a11y/no-static-element-interactions */ return ( -
        +
        +
        { children }
        { it( 'should return true if vertically navigating input without modifier', () => { [ UP, DOWN ].forEach( ( keyCode ) => { - const result = isNavigationCandidate( elements.input, keyCode, false ); + const result = isNavigationCandidate( + elements.input, + keyCode, + false + ); expect( result ).toBe( true ); } ); @@ -27,7 +31,11 @@ describe( 'isNavigationCandidate', () => { it( 'should return false if vertically navigating input with modifier', () => { [ UP, DOWN ].forEach( ( keyCode ) => { - const result = isNavigationCandidate( elements.input, keyCode, true ); + const result = isNavigationCandidate( + elements.input, + keyCode, + true + ); expect( result ).toBe( false ); } ); @@ -35,7 +43,11 @@ describe( 'isNavigationCandidate', () => { it( 'should return false if horizontally navigating input', () => { [ LEFT, RIGHT ].forEach( ( keyCode ) => { - const result = isNavigationCandidate( elements.input, keyCode, false ); + const result = isNavigationCandidate( + elements.input, + keyCode, + false + ); expect( result ).toBe( false ); } ); @@ -43,7 +55,11 @@ describe( 'isNavigationCandidate', () => { it( 'should return true if horizontally navigating non-input', () => { [ LEFT, RIGHT ].forEach( ( keyCode ) => { - const result = isNavigationCandidate( elements.contentEditable, keyCode, false ); + const result = isNavigationCandidate( + elements.contentEditable, + keyCode, + false + ); expect( result ).toBe( true ); } ); diff --git a/packages/block-editor/src/hooks/align.js b/packages/block-editor/src/hooks/align.js index bd04ecd554a36..cfded941725ec 100644 --- a/packages/block-editor/src/hooks/align.js +++ b/packages/block-editor/src/hooks/align.js @@ -9,7 +9,11 @@ import { assign, get, has, includes, without } from 'lodash'; */ import { createHigherOrderComponent } from '@wordpress/compose'; import { addFilter } from '@wordpress/hooks'; -import { getBlockSupport, getBlockType, hasBlockSupport } from '@wordpress/blocks'; +import { + getBlockSupport, + getBlockType, + hasBlockSupport, +} from '@wordpress/blocks'; import { useSelect } from '@wordpress/data'; /** @@ -47,7 +51,11 @@ const WIDE_ALIGNMENTS = [ 'wide', 'full' ]; * * @return {string[]} Valid alignments. */ -export function getValidAlignments( blockAlign, hasWideBlockSupport = true, hasWideEnabled = true ) { +export function getValidAlignments( + blockAlign, + hasWideBlockSupport = true, + hasWideEnabled = true +) { let validAlignments; if ( Array.isArray( blockAlign ) ) { validAlignments = blockAlign; @@ -99,42 +107,44 @@ export function addAttribute( settings ) { * @return {Function} Wrapped component */ export const withToolbarControls = createHigherOrderComponent( - ( BlockEdit ) => ( - ( props ) => { - const { name: blockName } = props; - // Compute valid alignments without taking into account, - // if the theme supports wide alignments or not. - // BlockAlignmentToolbar takes into account the theme support. - const validAlignments = getValidAlignments( - getBlockSupport( blockName, 'align' ), - hasBlockSupport( blockName, 'alignWide', true ), - ); - - const updateAlignment = ( nextAlign ) => { - if ( ! nextAlign ) { - const blockType = getBlockType( props.name ); - const blockDefaultAlign = get( blockType, [ 'attributes', 'align', 'default' ] ); - if ( blockDefaultAlign ) { - nextAlign = ''; - } + ( BlockEdit ) => ( props ) => { + const { name: blockName } = props; + // Compute valid alignments without taking into account, + // if the theme supports wide alignments or not. + // BlockAlignmentToolbar takes into account the theme support. + const validAlignments = getValidAlignments( + getBlockSupport( blockName, 'align' ), + hasBlockSupport( blockName, 'alignWide', true ) + ); + + const updateAlignment = ( nextAlign ) => { + if ( ! nextAlign ) { + const blockType = getBlockType( props.name ); + const blockDefaultAlign = get( blockType, [ + 'attributes', + 'align', + 'default', + ] ); + if ( blockDefaultAlign ) { + nextAlign = ''; } - props.setAttributes( { align: nextAlign } ); - }; - - return [ - validAlignments.length > 0 && props.isSelected && ( - - - - ), - , - ]; - } - ), + } + props.setAttributes( { align: nextAlign } ); + }; + + return [ + validAlignments.length > 0 && props.isSelected && ( + + + + ), + , + ]; + }, 'withToolbarControls' ); @@ -144,33 +154,36 @@ export const withToolbarControls = createHigherOrderComponent( * @param {Function} BlockListBlock Original component * @return {Function} Wrapped component */ -export const withDataAlign = createHigherOrderComponent( ( BlockListBlock ) => ( props ) => { - const { name, attributes } = props; - const { align } = attributes; - const hasWideEnabled = useSelect( - ( select ) => !! select( 'core/block-editor' ).getSettings().alignWide, - [] - ); +export const withDataAlign = createHigherOrderComponent( + ( BlockListBlock ) => ( props ) => { + const { name, attributes } = props; + const { align } = attributes; + const hasWideEnabled = useSelect( + ( select ) => + !! select( 'core/block-editor' ).getSettings().alignWide, + [] + ); + + // If an alignment is not assigned, there's no need to go through the + // effort to validate or assign its value. + if ( align === undefined ) { + return ; + } - // If an alignment is not assigned, there's no need to go through the - // effort to validate or assign its value. - if ( align === undefined ) { - return ; - } + const validAlignments = getValidAlignments( + getBlockSupport( name, 'align' ), + hasBlockSupport( name, 'alignWide', true ), + hasWideEnabled + ); - const validAlignments = getValidAlignments( - getBlockSupport( name, 'align' ), - hasBlockSupport( name, 'alignWide', true ), - hasWideEnabled - ); + let wrapperProps = props.wrapperProps; + if ( includes( validAlignments, align ) ) { + wrapperProps = { ...wrapperProps, 'data-align': align }; + } - let wrapperProps = props.wrapperProps; - if ( includes( validAlignments, align ) ) { - wrapperProps = { ...wrapperProps, 'data-align': align }; + return ; } - - return ; -} ); +); /** * Override props assigned to save component to inject alignment class name if @@ -199,8 +212,23 @@ export function addAssignedAlign( props, blockType, attributes ) { return props; } -addFilter( 'blocks.registerBlockType', 'core/align/addAttribute', addAttribute ); -addFilter( 'editor.BlockListBlock', 'core/editor/align/with-data-align', withDataAlign ); -addFilter( 'editor.BlockEdit', 'core/editor/align/with-toolbar-controls', withToolbarControls ); -addFilter( 'blocks.getSaveContent.extraProps', 'core/align/addAssignedAlign', addAssignedAlign ); - +addFilter( + 'blocks.registerBlockType', + 'core/align/addAttribute', + addAttribute +); +addFilter( + 'editor.BlockListBlock', + 'core/editor/align/with-data-align', + withDataAlign +); +addFilter( + 'editor.BlockEdit', + 'core/editor/align/with-toolbar-controls', + withToolbarControls +); +addFilter( + 'blocks.getSaveContent.extraProps', + 'core/align/addAssignedAlign', + addAssignedAlign +); diff --git a/packages/block-editor/src/hooks/anchor.js b/packages/block-editor/src/hooks/anchor.js index 5f8f1ca25879f..f9aeab08ab95e 100644 --- a/packages/block-editor/src/hooks/anchor.js +++ b/packages/block-editor/src/hooks/anchor.js @@ -60,42 +60,55 @@ export function addAttribute( settings ) { * * @return {WPComponent} Wrapped component. */ -export const withInspectorControl = createHigherOrderComponent( ( BlockEdit ) => { - return ( props ) => { - const hasAnchor = hasBlockSupport( props.name, 'anchor' ); +export const withInspectorControl = createHigherOrderComponent( + ( BlockEdit ) => { + return ( props ) => { + const hasAnchor = hasBlockSupport( props.name, 'anchor' ); - if ( hasAnchor && props.isSelected ) { - return ( - <> - - - - { __( 'Enter a word or two — without spaces — to make a unique web address just for this heading, called an “anchor.” Then, you’ll be able to link directly to this section of your page.' ) } + if ( hasAnchor && props.isSelected ) { + return ( + <> + + + + { __( + 'Enter a word or two — without spaces — to make a unique web address just for this heading, called an “anchor.” Then, you’ll be able to link directly to this section of your page.' + ) } - - { __( 'Learn more about anchors' ) } - - - ) } - value={ props.attributes.anchor || '' } - onChange={ ( nextValue ) => { - nextValue = nextValue.replace( ANCHOR_REGEX, '-' ); - props.setAttributes( { - anchor: nextValue, - } ); - } } /> - - - ); - } + + { __( 'Learn more about anchors' ) } + + + } + value={ props.attributes.anchor || '' } + onChange={ ( nextValue ) => { + nextValue = nextValue.replace( + ANCHOR_REGEX, + '-' + ); + props.setAttributes( { + anchor: nextValue, + } ); + } } + /> + + + ); + } - return ; - }; -}, 'withInspectorControl' ); + return ; + }; + }, + 'withInspectorControl' +); /** * Override props assigned to save component to inject anchor ID, if block @@ -117,5 +130,13 @@ export function addSaveProps( extraProps, blockType, attributes ) { } addFilter( 'blocks.registerBlockType', 'core/anchor/attribute', addAttribute ); -addFilter( 'editor.BlockEdit', 'core/editor/anchor/with-inspector-control', withInspectorControl ); -addFilter( 'blocks.getSaveContent.extraProps', 'core/anchor/save-props', addSaveProps ); +addFilter( + 'editor.BlockEdit', + 'core/editor/anchor/with-inspector-control', + withInspectorControl +); +addFilter( + 'blocks.getSaveContent.extraProps', + 'core/anchor/save-props', + addSaveProps +); diff --git a/packages/block-editor/src/hooks/custom-class-name.js b/packages/block-editor/src/hooks/custom-class-name.js index dfbceb627389c..df461c178072d 100644 --- a/packages/block-editor/src/hooks/custom-class-name.js +++ b/packages/block-editor/src/hooks/custom-class-name.js @@ -51,32 +51,44 @@ export function addAttribute( settings ) { * * @return {WPComponent} Wrapped component. */ -export const withInspectorControl = createHigherOrderComponent( ( BlockEdit ) => { - return ( props ) => { - const hasCustomClassName = hasBlockSupport( props.name, 'customClassName', true ); - if ( hasCustomClassName && props.isSelected ) { - return ( - <> - - - { - props.setAttributes( { - className: nextValue !== '' ? nextValue : undefined, - } ); - } } - help={ __( 'Separate multiple classes with spaces.' ) } - /> - - +export const withInspectorControl = createHigherOrderComponent( + ( BlockEdit ) => { + return ( props ) => { + const hasCustomClassName = hasBlockSupport( + props.name, + 'customClassName', + true ); - } + if ( hasCustomClassName && props.isSelected ) { + return ( + <> + + + { + props.setAttributes( { + className: + nextValue !== '' + ? nextValue + : undefined, + } ); + } } + help={ __( + 'Separate multiple classes with spaces.' + ) } + /> + + + ); + } - return ; - }; -}, 'withInspectorControl' ); + return ; + }; + }, + 'withInspectorControl' +); /** * Override props assigned to save component to inject anchor ID, if block @@ -90,8 +102,14 @@ export const withInspectorControl = createHigherOrderComponent( ( BlockEdit ) => * @return {Object} Filtered props applied to save element. */ export function addSaveProps( extraProps, blockType, attributes ) { - if ( hasBlockSupport( blockType, 'customClassName', true ) && attributes.className ) { - extraProps.className = classnames( extraProps.className, attributes.className ); + if ( + hasBlockSupport( blockType, 'customClassName', true ) && + attributes.className + ) { + extraProps.className = classnames( + extraProps.className, + attributes.className + ); } return extraProps; @@ -136,7 +154,9 @@ export function addParsedDifference( blockAttributes, blockType, innerHTML ) { // attributes, with the exception of `className`. This will determine // the default set of classes. From there, any difference in innerHTML // can be considered as custom classes. - const attributesSansClassName = omit( blockAttributes, [ 'className' ] ); + const attributesSansClassName = omit( blockAttributes, [ + 'className', + ] ); const serialized = getSaveContent( blockType, attributesSansClassName ); const defaultClasses = getHTMLRootElementClasses( serialized ); const actualClasses = getHTMLRootElementClasses( innerHTML ); @@ -152,7 +172,23 @@ export function addParsedDifference( blockAttributes, blockType, innerHTML ) { return blockAttributes; } -addFilter( 'blocks.registerBlockType', 'core/custom-class-name/attribute', addAttribute ); -addFilter( 'editor.BlockEdit', 'core/editor/custom-class-name/with-inspector-control', withInspectorControl ); -addFilter( 'blocks.getSaveContent.extraProps', 'core/custom-class-name/save-props', addSaveProps ); -addFilter( 'blocks.getBlockAttributes', 'core/custom-class-name/addParsedDifference', addParsedDifference ); +addFilter( + 'blocks.registerBlockType', + 'core/custom-class-name/attribute', + addAttribute +); +addFilter( + 'editor.BlockEdit', + 'core/editor/custom-class-name/with-inspector-control', + withInspectorControl +); +addFilter( + 'blocks.getSaveContent.extraProps', + 'core/custom-class-name/save-props', + addSaveProps +); +addFilter( + 'blocks.getBlockAttributes', + 'core/custom-class-name/addParsedDifference', + addParsedDifference +); diff --git a/packages/block-editor/src/hooks/custom-class-name.native.js b/packages/block-editor/src/hooks/custom-class-name.native.js index c59d604b90305..4edfd96db65c2 100644 --- a/packages/block-editor/src/hooks/custom-class-name.native.js +++ b/packages/block-editor/src/hooks/custom-class-name.native.js @@ -47,8 +47,14 @@ export function addAttribute( settings ) { * @return {Object} Filtered props applied to save element. */ export function addSaveProps( extraProps, blockType, attributes ) { - if ( hasBlockSupport( blockType, 'customClassName', true ) && attributes.className ) { - extraProps.className = classnames( extraProps.className, attributes.className ); + if ( + hasBlockSupport( blockType, 'customClassName', true ) && + attributes.className + ) { + extraProps.className = classnames( + extraProps.className, + attributes.className + ); } return extraProps; @@ -112,6 +118,18 @@ export function addParsedDifference( blockAttributes, blockType, innerHTML ) { return blockAttributes; } -addFilter( 'blocks.registerBlockType', 'core/custom-class-name/attribute', addAttribute ); -addFilter( 'blocks.getSaveContent.extraProps', 'core/custom-class-name/save-props', addSaveProps ); -addFilter( 'blocks.getBlockAttributes', 'core/custom-class-name/addParsedDifference', addParsedDifference ); +addFilter( + 'blocks.registerBlockType', + 'core/custom-class-name/attribute', + addAttribute +); +addFilter( + 'blocks.getSaveContent.extraProps', + 'core/custom-class-name/save-props', + addSaveProps +); +addFilter( + 'blocks.getBlockAttributes', + 'core/custom-class-name/addParsedDifference', + addParsedDifference +); diff --git a/packages/block-editor/src/hooks/generated-class-name.js b/packages/block-editor/src/hooks/generated-class-name.js index c5f7d1b49502c..8a10c9b9e891d 100644 --- a/packages/block-editor/src/hooks/generated-class-name.js +++ b/packages/block-editor/src/hooks/generated-class-name.js @@ -29,7 +29,9 @@ export function addGeneratedClassName( extraProps, blockType ) { extraProps.className = uniq( [ getBlockDefaultClassName( blockType.name ), ...extraProps.className.split( ' ' ), - ] ).join( ' ' ).trim(); + ] ) + .join( ' ' ) + .trim(); } else { // There is no string in the className variable, // so we just dump the default name in there @@ -39,4 +41,8 @@ export function addGeneratedClassName( extraProps, blockType ) { return extraProps; } -addFilter( 'blocks.getSaveContent.extraProps', 'core/generated-class-name/save-props', addGeneratedClassName ); +addFilter( + 'blocks.getSaveContent.extraProps', + 'core/generated-class-name/save-props', + addGeneratedClassName +); diff --git a/packages/block-editor/src/hooks/test/align.js b/packages/block-editor/src/hooks/test/align.js index 1e348229ad675..9242cff172eab 100644 --- a/packages/block-editor/src/hooks/test/align.js +++ b/packages/block-editor/src/hooks/test/align.js @@ -39,7 +39,10 @@ describe( 'align', () => { } ); describe( 'addAttribute()', () => { - const filterRegisterBlockType = applyFilters.bind( null, 'blocks.registerBlockType' ); + const filterRegisterBlockType = applyFilters.bind( + null, + 'blocks.registerBlockType' + ); it( 'should do nothing if the block settings does not define align support', () => { const settings = filterRegisterBlockType( blockSettings ); @@ -65,54 +68,75 @@ describe( 'align', () => { } ); it( 'should return all custom aligns set', () => { - expect( - getValidAlignments( [ 'left', 'right' ] ) - ).toEqual( - [ 'left', 'right' ] - ); + expect( getValidAlignments( [ 'left', 'right' ] ) ).toEqual( [ + 'left', + 'right', + ] ); } ); it( 'should return all aligns if block defines align support as true', () => { - expect( - getValidAlignments( true ) - ).toEqual( - [ 'left', 'center', 'right', 'wide', 'full' ] - ); + expect( getValidAlignments( true ) ).toEqual( [ + 'left', + 'center', + 'right', + 'wide', + 'full', + ] ); } ); it( 'should return all aligns except wide if wide align explicitly false on the block', () => { - expect( - getValidAlignments( true, false, true ) - ).toEqual( [ 'left', 'center', 'right' ] ); - - expect( - getValidAlignments( true, false, false ) - ).toEqual( [ 'left', 'center', 'right' ] ); + expect( getValidAlignments( true, false, true ) ).toEqual( [ + 'left', + 'center', + 'right', + ] ); + + expect( getValidAlignments( true, false, false ) ).toEqual( [ + 'left', + 'center', + 'right', + ] ); } ); it( 'should return all aligns except wide if wide align is not supported by the theme', () => { - expect( - getValidAlignments( true, true, false ) - ).toEqual( [ 'left', 'center', 'right' ] ); - - expect( - getValidAlignments( true, false, false ) - ).toEqual( [ 'left', 'center', 'right' ] ); + expect( getValidAlignments( true, true, false ) ).toEqual( [ + 'left', + 'center', + 'right', + ] ); + + expect( getValidAlignments( true, false, false ) ).toEqual( [ + 'left', + 'center', + 'right', + ] ); } ); it( 'should not remove wide aligns if they are not supported by the block and were set using an array in supports align', () => { expect( - getValidAlignments( [ 'left', 'right', 'wide', 'full' ], false, true ) + getValidAlignments( + [ 'left', 'right', 'wide', 'full' ], + false, + true + ) ).toEqual( [ 'left', 'right', 'wide', 'full' ] ); } ); it( 'should remove wide aligns if they are not supported by the theme and were set using an array in supports align', () => { expect( - getValidAlignments( [ 'left', 'right', 'wide', 'full' ], true, false ) + getValidAlignments( + [ 'left', 'right', 'wide', 'full' ], + true, + false + ) ).toEqual( [ 'left', 'right' ] ); expect( - getValidAlignments( [ 'left', 'right', 'wide', 'full' ], false, false ) + getValidAlignments( + [ 'left', 'right', 'wide', 'full' ], + false, + false + ) ).toEqual( [ 'left', 'right' ] ); } ); } ); @@ -121,9 +145,9 @@ describe( 'align', () => { it( 'should do nothing if no valid alignments', () => { registerBlockType( 'core/foo', blockSettings ); - const EnhancedComponent = withToolbarControls( ( { wrapperProps } ) => ( -
        - ) ); + const EnhancedComponent = withToolbarControls( + ( { wrapperProps } ) =>
        + ); const wrapper = renderer.create( { }, } ); - const EnhancedComponent = withToolbarControls( ( { wrapperProps } ) => ( -
        - ) ); + const EnhancedComponent = withToolbarControls( + ( { wrapperProps } ) =>
        + ); const wrapper = renderer.create( { let wrapper; act( () => { wrapper = renderer.create( - + { let wrapper; act( () => { wrapper = renderer.create( - + { let wrapper; act( () => { wrapper = renderer.create( - + { it( 'should do nothing if block does not support align', () => { registerBlockType( 'core/foo', blockSettings ); - const props = addAssignedAlign( { - className: 'foo', - }, 'core/foo', { - align: 'wide', - } ); + const props = addAssignedAlign( + { + className: 'foo', + }, + 'core/foo', + { + align: 'wide', + } + ); expect( props ).toEqual( { className: 'foo', @@ -274,11 +311,15 @@ describe( 'align', () => { }, } ); - const props = addAssignedAlign( { - className: 'foo', - }, 'core/foo', { - align: 'wide', - } ); + const props = addAssignedAlign( + { + className: 'foo', + }, + 'core/foo', + { + align: 'wide', + } + ); expect( props ).toEqual( { className: 'alignwide foo', diff --git a/packages/block-editor/src/hooks/test/anchor.js b/packages/block-editor/src/hooks/test/anchor.js index d55a54fff332e..bb4d496ff477b 100644 --- a/packages/block-editor/src/hooks/test/anchor.js +++ b/packages/block-editor/src/hooks/test/anchor.js @@ -21,7 +21,10 @@ describe( 'anchor', () => { }; describe( 'addAttribute()', () => { - const registerBlockType = applyFilters.bind( null, 'blocks.registerBlockType' ); + const registerBlockType = applyFilters.bind( + null, + 'blocks.registerBlockType' + ); it( 'should do nothing if the block settings do not define anchor support', () => { const settings = registerBlockType( blockSettings ); @@ -54,40 +57,58 @@ describe( 'anchor', () => { }, } ); - expect( settings.attributes.anchor ).toEqual( { type: 'string', default: 'testAnchor' } ); + expect( settings.attributes.anchor ).toEqual( { + type: 'string', + default: 'testAnchor', + } ); } ); } ); describe( 'addSaveProps', () => { - const getSaveContentExtraProps = applyFilters.bind( null, 'blocks.getSaveContent.extraProps' ); + const getSaveContentExtraProps = applyFilters.bind( + null, + 'blocks.getSaveContent.extraProps' + ); it( 'should do nothing if the block settings do not define anchor support', () => { const attributes = { anchor: 'foo' }; - const extraProps = getSaveContentExtraProps( {}, blockSettings, attributes ); + const extraProps = getSaveContentExtraProps( + {}, + blockSettings, + attributes + ); expect( extraProps ).not.toHaveProperty( 'id' ); } ); it( 'should inject anchor attribute ID', () => { const attributes = { anchor: 'foo' }; - const extraProps = getSaveContentExtraProps( {}, { - ...blockSettings, - supports: { - anchor: true, + const extraProps = getSaveContentExtraProps( + {}, + { + ...blockSettings, + supports: { + anchor: true, + }, }, - }, attributes ); + attributes + ); expect( extraProps.id ).toBe( 'foo' ); } ); it( 'should remove an anchor attribute ID when feild is cleared', () => { const attributes = { anchor: '' }; - const extraProps = getSaveContentExtraProps( {}, { - ...blockSettings, - supports: { - anchor: true, + const extraProps = getSaveContentExtraProps( + {}, + { + ...blockSettings, + supports: { + anchor: true, + }, }, - }, attributes ); + attributes + ); expect( extraProps.id ).toBe( null ); } ); diff --git a/packages/block-editor/src/hooks/test/custom-class-name.js b/packages/block-editor/src/hooks/test/custom-class-name.js index 6b2c84b886139..8429a657859bd 100644 --- a/packages/block-editor/src/hooks/test/custom-class-name.js +++ b/packages/block-editor/src/hooks/test/custom-class-name.js @@ -22,7 +22,10 @@ describe( 'custom className', () => { }; describe( 'addAttribute()', () => { - const addAttribute = applyFilters.bind( null, 'blocks.registerBlockType' ); + const addAttribute = applyFilters.bind( + null, + 'blocks.registerBlockType' + ); it( 'should do nothing if the block settings disable custom className support', () => { const settings = addAttribute( { @@ -43,23 +46,34 @@ describe( 'custom className', () => { } ); describe( 'addSaveProps', () => { - const addSaveProps = applyFilters.bind( null, 'blocks.getSaveContent.extraProps' ); + const addSaveProps = applyFilters.bind( + null, + 'blocks.getSaveContent.extraProps' + ); it( 'should do nothing if the block settings do not define custom className support', () => { const attributes = { className: 'foo' }; - const extraProps = addSaveProps( {}, { - ...blockSettings, - supports: { - customClassName: false, + const extraProps = addSaveProps( + {}, + { + ...blockSettings, + supports: { + customClassName: false, + }, }, - }, attributes ); + attributes + ); expect( extraProps ).not.toHaveProperty( 'className' ); } ); it( 'should inject the custom className', () => { const attributes = { className: 'bar' }; - const extraProps = addSaveProps( { className: 'foo' }, blockSettings, attributes ); + const extraProps = addSaveProps( + { className: 'foo' }, + blockSettings, + attributes + ); expect( extraProps.className ).toBe( 'foo bar' ); } ); @@ -73,14 +87,19 @@ describe( 'custom className', () => { } ); it( 'return an array of parsed classes from inner HTML', () => { - const classes = getHTMLRootElementClasses( '
        ' ); + const classes = getHTMLRootElementClasses( + '
        ' + ); expect( classes ).toEqual( [ 'foo', 'bar' ] ); } ); } ); describe( 'addParsedDifference', () => { - const addParsedDifference = applyFilters.bind( null, 'blocks.getBlockAttributes' ); + const addParsedDifference = applyFilters.bind( + null, + 'blocks.getBlockAttributes' + ); it( 'should do nothing if the block settings do not define custom className support', () => { const attributes = addParsedDifference( @@ -161,7 +180,7 @@ describe( 'custom className', () => { const attributes = addParsedDifference( { className: 'custom1' }, dynamicBlockSettings, - null, + null ); expect( attributes.className ).toBe( 'custom1' ); diff --git a/packages/block-editor/src/hooks/test/generated-class-name.js b/packages/block-editor/src/hooks/test/generated-class-name.js index 397ec9ab333ce..1bf447c48ce12 100644 --- a/packages/block-editor/src/hooks/test/generated-class-name.js +++ b/packages/block-editor/src/hooks/test/generated-class-name.js @@ -22,30 +22,45 @@ describe( 'generated className', () => { }; describe( 'addSaveProps', () => { - const addSaveProps = applyFilters.bind( null, 'blocks.getSaveContent.extraProps' ); + const addSaveProps = applyFilters.bind( + null, + 'blocks.getSaveContent.extraProps' + ); it( 'should do nothing if the block settings do not define generated className support', () => { const attributes = { className: 'foo' }; - const extraProps = addSaveProps( {}, { - ...blockSettings, - supports: { - className: false, + const extraProps = addSaveProps( + {}, + { + ...blockSettings, + supports: { + className: false, + }, }, - }, attributes ); + attributes + ); expect( extraProps ).not.toHaveProperty( 'className' ); } ); it( 'should inject the generated className', () => { const attributes = { className: 'bar' }; - const extraProps = addSaveProps( { className: 'foo' }, blockSettings, attributes ); + const extraProps = addSaveProps( + { className: 'foo' }, + blockSettings, + attributes + ); expect( extraProps.className ).toBe( 'wp-block-chicken-ribs foo' ); } ); it( 'should not inject duplicates into className', () => { const attributes = { className: 'bar' }; - const extraProps = addSaveProps( { className: 'foo wp-block-chicken-ribs' }, blockSettings, attributes ); + const extraProps = addSaveProps( + { className: 'foo wp-block-chicken-ribs' }, + blockSettings, + attributes + ); expect( extraProps.className ).toBe( 'wp-block-chicken-ribs foo' ); } ); diff --git a/packages/block-editor/src/store/actions.js b/packages/block-editor/src/store/actions.js index 07106b6459777..a9162f4b6d772 100644 --- a/packages/block-editor/src/store/actions.js +++ b/packages/block-editor/src/store/actions.js @@ -6,7 +6,12 @@ import { castArray, first, get, includes, last, some } from 'lodash'; /** * WordPress dependencies */ -import { getDefaultBlockName, createBlock, hasBlockSupport, cloneBlock } from '@wordpress/blocks'; +import { + getDefaultBlockName, + createBlock, + hasBlockSupport, + cloneBlock, +} from '@wordpress/blocks'; import { speak } from '@wordpress/a11y'; import { __ } from '@wordpress/i18n'; @@ -22,10 +27,7 @@ import { select } from './controls'; * replacement, etc). */ function* ensureDefaultBlock() { - const count = yield select( - 'core/block-editor', - 'getBlockCount', - ); + const count = yield select( 'core/block-editor', 'getBlockCount' ); // To avoid a focus loss when removing the last block, assure there is // always a default block if the last of the blocks have been removed. @@ -269,7 +271,8 @@ function getBlocksWithDefaultStylesApplied( blocks, blockEditorSettings ) { ...block, attributes: { ...attributes, - className: `${ ( className || '' ) } is-style-${ blockStyle }`.trim(), + className: `${ className || + '' } is-style-${ blockStyle }`.trim(), }, }; } ); @@ -290,10 +293,7 @@ export function* replaceBlocks( clientIds, blocks, indexToSelect ) { clientIds = castArray( clientIds ); blocks = getBlocksWithDefaultStylesApplied( castArray( blocks ), - yield select( - 'core/block-editor', - 'getSettings', - ) + yield select( 'core/block-editor', 'getSettings' ) ); const rootClientId = yield select( 'core/block-editor', @@ -368,7 +368,12 @@ export const moveBlocksUp = createOnMove( 'MOVE_BLOCKS_UP' ); * * @yield {Object} Action object. */ -export function* moveBlockToPosition( clientId, fromRootClientId = '', toRootClientId = '', index ) { +export function* moveBlockToPosition( + clientId, + fromRootClientId = '', + toRootClientId = '', + index +) { const templateLock = yield select( 'core/block-editor', 'getTemplateLock', @@ -434,14 +439,9 @@ export function insertBlock( block, index, rootClientId, - updateSelection = true, + updateSelection = true ) { - return insertBlocks( - [ block ], - index, - rootClientId, - updateSelection - ); + return insertBlocks( [ block ], index, rootClientId, updateSelection ); } /** @@ -463,10 +463,7 @@ export function* insertBlocks( ) { blocks = getBlocksWithDefaultStylesApplied( castArray( blocks ), - yield select( - 'core/block-editor', - 'getSettings', - ) + yield select( 'core/block-editor', 'getSettings' ) ); const allowedBlocks = []; for ( const block of blocks ) { @@ -575,8 +572,16 @@ export function* removeBlocks( clientIds, selectPrevious = true ) { } clientIds = castArray( clientIds ); - const rootClientId = yield select( 'core/block-editor', 'getBlockRootClientId', clientIds[ 0 ] ); - const isLocked = yield select( 'core/block-editor', 'getTemplateLock', rootClientId ); + const rootClientId = yield select( + 'core/block-editor', + 'getBlockRootClientId', + clientIds[ 0 ] + ); + const isLocked = yield select( + 'core/block-editor', + 'getTemplateLock', + rootClientId + ); if ( isLocked ) { return; } @@ -619,7 +624,11 @@ export function removeBlock( clientId, selectPrevious ) { * * @return {Object} Action object. */ -export function replaceInnerBlocks( rootClientId, blocks, updateSelection = true ) { +export function replaceInnerBlocks( + rootClientId, + blocks, + updateSelection = true +) { return { type: 'REPLACE_INNER_BLOCKS', rootClientId, @@ -721,7 +730,12 @@ export function exitFormattedText() { * * @return {Object} Action object. */ -export function selectionChange( clientId, attributeKey, startOffset, endOffset ) { +export function selectionChange( + clientId, + attributeKey, + startOffset, + endOffset +) { return { type: 'SELECTION_CHANGE', clientId, @@ -839,16 +853,24 @@ export function __unstableMarkAutomaticChange() { * * @param {string} isNavigationMode Enable/Disable navigation mode. */ -export function * setNavigationMode( isNavigationMode = true ) { +export function* setNavigationMode( isNavigationMode = true ) { yield { type: 'SET_NAVIGATION_MODE', isNavigationMode, }; if ( isNavigationMode ) { - speak( __( 'You are currently in navigation mode. Navigate blocks using the Tab key. To exit navigation mode and edit the selected block, press Enter.' ) ); + speak( + __( + 'You are currently in navigation mode. Navigate blocks using the Tab key. To exit navigation mode and edit the selected block, press Enter.' + ) + ); } else { - speak( __( 'You are currently in edit mode. To return to the navigation mode, press Escape.' ) ); + speak( + __( + 'You are currently in edit mode. To return to the navigation mode, press Escape.' + ) + ); } } @@ -857,19 +879,32 @@ export function * setNavigationMode( isNavigationMode = true ) { * * @param {string[]} clientIds */ -export function * duplicateBlocks( clientIds ) { +export function* duplicateBlocks( clientIds ) { if ( ! clientIds && ! clientIds.length ) { return; } - const blocks = yield select( 'core/block-editor', 'getBlocksByClientId', clientIds ); - const rootClientId = yield select( 'core/block-editor', 'getBlockRootClientId', clientIds[ 0 ] ); + const blocks = yield select( + 'core/block-editor', + 'getBlocksByClientId', + clientIds + ); + const rootClientId = yield select( + 'core/block-editor', + 'getBlockRootClientId', + clientIds[ 0 ] + ); // Return early if blocks don't exist. if ( some( blocks, ( block ) => ! block ) ) { return; } const blockNames = blocks.map( ( block ) => block.name ); // Return early if blocks don't support multipe usage. - if ( some( blockNames, ( blockName ) => ! hasBlockSupport( blockName, 'multiple', true ) ) ) { + if ( + some( + blockNames, + ( blockName ) => ! hasBlockSupport( blockName, 'multiple', true ) + ) + ) { return; } @@ -880,11 +915,7 @@ export function * duplicateBlocks( clientIds ) { rootClientId ); const clonedBlocks = blocks.map( ( block ) => cloneBlock( block ) ); - yield insertBlocks( - clonedBlocks, - lastSelectedIndex + 1, - rootClientId - ); + yield insertBlocks( clonedBlocks, lastSelectedIndex + 1, rootClientId ); if ( clonedBlocks.length > 1 ) { yield multiSelect( first( clonedBlocks ).clientId, @@ -898,17 +929,30 @@ export function * duplicateBlocks( clientIds ) { * * @param {string} clientId */ -export function * insertBeforeBlock( clientId ) { +export function* insertBeforeBlock( clientId ) { if ( ! clientId ) { return; } - const rootClientId = yield select( 'core/block-editor', 'getBlockRootClientId', clientId ); - const isLocked = yield select( 'core/block-editor', 'getTemplateLock', rootClientId ); + const rootClientId = yield select( + 'core/block-editor', + 'getBlockRootClientId', + clientId + ); + const isLocked = yield select( + 'core/block-editor', + 'getTemplateLock', + rootClientId + ); if ( isLocked ) { return; } - const firstSelectedIndex = yield select( 'core/block-editor', 'getBlockIndex', clientId, rootClientId ); + const firstSelectedIndex = yield select( + 'core/block-editor', + 'getBlockIndex', + clientId, + rootClientId + ); yield insertDefaultBlock( {}, rootClientId, firstSelectedIndex ); } @@ -917,28 +961,29 @@ export function * insertBeforeBlock( clientId ) { * * @param {string} clientId */ -export function * insertAfterBlock( clientId ) { +export function* insertAfterBlock( clientId ) { if ( ! clientId ) { return; } - const rootClientId = yield select( 'core/block-editor', 'getBlockRootClientId', clientId ); - const isLocked = yield select( 'core/block-editor', 'getTemplateLock', rootClientId ); + const rootClientId = yield select( + 'core/block-editor', + 'getBlockRootClientId', + clientId + ); + const isLocked = yield select( + 'core/block-editor', + 'getTemplateLock', + rootClientId + ); if ( isLocked ) { return; } - const firstSelectedIndex = yield select( 'core/block-editor', 'getBlockIndex', clientId, rootClientId ); - yield insertDefaultBlock( {}, rootClientId, firstSelectedIndex + 1 ); -} - -/** - * Sets the client ID for the mounted and selected block. - * - * @param {Element} clientId The block's client ID. - */ -export function __unstableSetSelectedMountedBlock( clientId ) { - return { - type: 'SET_SELECTED_MOUNTED_BLOCK', + const firstSelectedIndex = yield select( + 'core/block-editor', + 'getBlockIndex', clientId, - }; + rootClientId + ); + yield insertDefaultBlock( {}, rootClientId, firstSelectedIndex + 1 ); } diff --git a/packages/block-editor/src/store/array.js b/packages/block-editor/src/store/array.js index 176d8936450af..3a2977eb152ae 100644 --- a/packages/block-editor/src/store/array.js +++ b/packages/block-editor/src/store/array.js @@ -36,6 +36,6 @@ export function moveTo( array, from, to, count = 1 ) { return insertAt( withoutMovedElements, array.slice( from, from + count ), - to, + to ); } diff --git a/packages/block-editor/src/store/controls.js b/packages/block-editor/src/store/controls.js index 5012ab244c21c..3a64e045f6966 100644 --- a/packages/block-editor/src/store/controls.js +++ b/packages/block-editor/src/store/controls.js @@ -22,9 +22,11 @@ export function select( storeName, selectorName, ...args ) { } const controls = { - SELECT: createRegistryControl( ( registry ) => ( { storeName, selectorName, args } ) => { - return registry.select( storeName )[ selectorName ]( ...args ); - } ), + SELECT: createRegistryControl( + ( registry ) => ( { storeName, selectorName, args } ) => { + return registry.select( storeName )[ selectorName ]( ...args ); + } + ), }; export default controls; diff --git a/packages/block-editor/src/store/defaults.js b/packages/block-editor/src/store/defaults.js index dca689127ad93..790d65a5ae6dc 100644 --- a/packages/block-editor/src/store/defaults.js +++ b/packages/block-editor/src/store/defaults.js @@ -44,10 +44,7 @@ export const SETTINGS_DEFAULTS = { slug: 'pale-pink', color: '#f78da7', }, - { name: __( 'Vivid red' ), - slug: 'vivid-red', - color: '#cf2e2e', - }, + { name: __( 'Vivid red' ), slug: 'vivid-red', color: '#cf2e2e' }, { name: __( 'Luminous vivid orange' ), slug: 'luminous-vivid-orange', @@ -129,10 +126,10 @@ export const SETTINGS_DEFAULTS = { ], imageSizes: [ - { slug: 'thumbnail', label: __( 'Thumbnail' ) }, - { slug: 'medium', label: __( 'Medium' ) }, - { slug: 'large', label: __( 'Large' ) }, - { slug: 'full', label: __( 'Full Size' ) }, + { slug: 'thumbnail', name: __( 'Thumbnail' ) }, + { slug: 'medium', name: __( 'Medium' ) }, + { slug: 'large', name: __( 'Large' ) }, + { slug: 'full', name: __( 'Full Size' ) }, ], // This is current max width of the block inner area @@ -160,62 +157,74 @@ export const SETTINGS_DEFAULTS = { gradients: [ { name: __( 'Vivid cyan blue to vivid purple' ), - gradient: 'linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%)', + gradient: + 'linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%)', slug: 'vivid-cyan-blue-to-vivid-purple', }, { name: __( 'Light green cyan to vivid green cyan' ), - gradient: 'linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%)', + gradient: + 'linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%)', slug: 'light-green-cyan-to-vivid-green-cyan', }, { name: __( 'Luminous vivid amber to luminous vivid orange' ), - gradient: 'linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%)', + gradient: + 'linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%)', slug: 'luminous-vivid-amber-to-luminous-vivid-orange', }, { name: __( 'Luminous vivid orange to vivid red' ), - gradient: 'linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%)', + gradient: + 'linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%)', slug: 'luminous-vivid-orange-to-vivid-red', }, { name: __( 'Very light gray to cyan bluish gray' ), - gradient: 'linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%)', + gradient: + 'linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%)', slug: 'very-light-gray-to-cyan-bluish-gray', }, { name: __( 'Cool to warm spectrum' ), - gradient: 'linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%)', + gradient: + 'linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%)', slug: 'cool-to-warm-spectrum', }, { name: __( 'Blush light purple' ), - gradient: 'linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%)', + gradient: + 'linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%)', slug: 'blush-light-purple', }, { name: __( 'Blush bordeaux' ), - gradient: 'linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%)', + gradient: + 'linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%)', slug: 'blush-bordeaux', }, { name: __( 'Luminous dusk' ), - gradient: 'linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%)', + gradient: + 'linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%)', slug: 'luminous-dusk', }, { name: __( 'Pale ocean' ), - gradient: 'linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%)', + gradient: + 'linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%)', slug: 'pale-ocean', }, { name: __( 'Electric grass' ), - gradient: 'linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%)', + gradient: + 'linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%)', slug: 'electric-grass', }, { name: __( 'Midnight' ), - gradient: 'linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%)', + gradient: + 'linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%)', slug: 'midnight', }, ], diff --git a/packages/block-editor/src/store/effects.js b/packages/block-editor/src/store/effects.js index fbfaee23cc715..b01e37b1e76dd 100644 --- a/packages/block-editor/src/store/effects.js +++ b/packages/block-editor/src/store/effects.js @@ -55,11 +55,10 @@ export function validateBlocksToTemplate( action, store ) { // Unlocked templates are considered always valid because they act // as default values only. - const isBlocksValidToTemplate = ( + const isBlocksValidToTemplate = ! template || templateLock !== 'all' || - doBlocksMatchTemplate( action.blocks, template ) - ); + doBlocksMatchTemplate( action.blocks, template ); // Update if validity has changed. if ( isBlocksValidToTemplate !== isValidTemplate( state ) ) { @@ -84,9 +83,11 @@ export default { const blockB = getBlock( state, clientIdB ); const blockBType = getBlockType( blockB.name ); const { clientId, attributeKey, offset } = getSelectionStart( state ); - const selectedBlockType = clientId === clientIdA ? blockAType : blockBType; - const attributeDefinition = selectedBlockType.attributes[ attributeKey ]; - const canRestoreTextSelection = ( + const selectedBlockType = + clientId === clientIdA ? blockAType : blockBType; + const attributeDefinition = + selectedBlockType.attributes[ attributeKey ]; + const canRestoreTextSelection = ( clientId === clientIdA || clientId === clientIdB ) && attributeKey !== undefined && offset !== undefined && @@ -94,8 +95,7 @@ export default { // is not a defined block attribute key. This can be the case if the // fallback intance ID is used to store selection (and no RichText // identifier is set), or when the identifier is wrong. - !! attributeDefinition - ); + !! attributeDefinition; if ( ! attributeDefinition ) { if ( typeof attributeKey === 'number' ) { @@ -125,12 +125,17 @@ export default { __unstableMultilineWrapperTags: multilineWrapperTags, __unstablePreserveWhiteSpace: preserveWhiteSpace, } = attributeDefinition; - const value = insert( create( { - html, - multilineTag, - multilineWrapperTags, - preserveWhiteSpace, - } ), START_OF_SELECTED_AREA, offset, offset ); + const value = insert( + create( { + html, + multilineTag, + multilineWrapperTags, + preserveWhiteSpace, + } ), + START_OF_SELECTED_AREA, + offset, + offset + ); selectedBlock.attributes[ attributeKey ] = toHTMLString( { value, @@ -141,9 +146,10 @@ export default { // We can only merge blocks with similar types // thus, we transform the block to merge first - const blocksWithTheSameType = blockA.name === blockB.name ? - [ cloneB ] : - switchToBlockType( cloneB, blockA.name ); + const blocksWithTheSameType = + blockA.name === blockB.name + ? [ cloneB ] + : switchToBlockType( cloneB, blockA.name ); // If the block types can not match, do nothing if ( ! blocksWithTheSameType || ! blocksWithTheSameType.length ) { @@ -157,8 +163,11 @@ export default { ); if ( canRestoreTextSelection ) { - const newAttributeKey = findKey( updatedAttributes, ( v ) => - typeof v === 'string' && v.indexOf( START_OF_SELECTED_AREA ) !== -1 + const newAttributeKey = findKey( + updatedAttributes, + ( v ) => + typeof v === 'string' && + v.indexOf( START_OF_SELECTED_AREA ) !== -1 ); const convertedHtml = updatedAttributes[ newAttributeKey ]; const { @@ -172,7 +181,9 @@ export default { multilineWrapperTags, preserveWhiteSpace, } ); - const newOffset = convertedValue.text.indexOf( START_OF_SELECTED_AREA ); + const newOffset = convertedValue.text.indexOf( + START_OF_SELECTED_AREA + ); const newValue = remove( convertedValue, newOffset, newOffset + 1 ); const newHtml = toHTMLString( { value: newValue, @@ -182,42 +193,53 @@ export default { updatedAttributes[ newAttributeKey ] = newHtml; - dispatch( selectionChange( - blockA.clientId, - newAttributeKey, - newOffset, - newOffset - ) ); + dispatch( + selectionChange( + blockA.clientId, + newAttributeKey, + newOffset, + newOffset + ) + ); } - dispatch( replaceBlocks( - [ blockA.clientId, blockB.clientId ], - [ - { - ...blockA, - attributes: { - ...blockA.attributes, - ...updatedAttributes, + dispatch( + replaceBlocks( + [ blockA.clientId, blockB.clientId ], + [ + { + ...blockA, + attributes: { + ...blockA.attributes, + ...updatedAttributes, + }, }, - }, - ...blocksWithTheSameType.slice( 1 ), - ] - ) ); + ...blocksWithTheSameType.slice( 1 ), + ] + ) + ); }, - RESET_BLOCKS: [ - validateBlocksToTemplate, - ], + RESET_BLOCKS: [ validateBlocksToTemplate ], MULTI_SELECT: ( action, { getState } ) => { const blockCount = getSelectedBlockCount( getState() ); /* translators: %s: number of selected blocks */ - speak( sprintf( _n( '%s block selected.', '%s blocks selected.', blockCount ), blockCount ), 'assertive' ); + speak( + sprintf( + _n( '%s block selected.', '%s blocks selected.', blockCount ), + blockCount + ), + 'assertive' + ); }, SYNCHRONIZE_TEMPLATE( action, { getState } ) { const state = getState(); const blocks = getBlocks( state ); const template = getTemplate( state ); - const updatedBlockList = synchronizeBlocksWithTemplate( blocks, template ); + const updatedBlockList = synchronizeBlocksWithTemplate( + blocks, + template + ); return resetBlocks( updatedBlockList ); }, diff --git a/packages/block-editor/src/store/middlewares.js b/packages/block-editor/src/store/middlewares.js index 6381132bb81e0..0f4c5aef8df70 100644 --- a/packages/block-editor/src/store/middlewares.js +++ b/packages/block-editor/src/store/middlewares.js @@ -18,15 +18,12 @@ import effects from './effects'; * @return {Object} Update Store Object. */ function applyMiddlewares( store ) { - const middlewares = [ - refx( effects ), - multi, - ]; + const middlewares = [ refx( effects ), multi ]; let enhancedDispatch = () => { throw new Error( 'Dispatching while constructing your middleware is not allowed. ' + - 'Other middleware would not be applied to this dispatch.' + 'Other middleware would not be applied to this dispatch.' ); }; let chain = []; diff --git a/packages/block-editor/src/store/reducer.js b/packages/block-editor/src/store/reducer.js index 2471be0a1e23a..45a5dc63cea04 100644 --- a/packages/block-editor/src/store/reducer.js +++ b/packages/block-editor/src/store/reducer.js @@ -27,10 +27,7 @@ import { isReusableBlock } from '@wordpress/blocks'; /** * Internal dependencies */ -import { - PREFERENCES_DEFAULTS, - SETTINGS_DEFAULTS, -} from './defaults'; +import { PREFERENCES_DEFAULTS, SETTINGS_DEFAULTS } from './defaults'; import { insertAt, moveTo } from './array'; /** @@ -67,11 +64,15 @@ function mapBlockOrder( blocks, rootClientId = '' ) { * @return {Object} Block order map object. */ function mapBlockParents( blocks, rootClientId = '' ) { - return blocks.reduce( ( result, block ) => Object.assign( - result, - { [ block.clientId ]: rootClientId }, - mapBlockParents( block.innerBlocks, block.clientId ) - ), {} ); + return blocks.reduce( + ( result, block ) => + Object.assign( + result, + { [ block.clientId ]: rootClientId }, + mapBlockParents( block.innerBlocks, block.clientId ) + ), + {} + ); } /** @@ -138,11 +139,15 @@ function getFlattenedBlockAttributes( blocks ) { * @return {Array} List of descendant client IDs. */ function getNestedBlockClientIds( blocksOrder, rootClientId = '' ) { - return reduce( blocksOrder[ rootClientId ], ( result, clientId ) => [ - ...result, - clientId, - ...getNestedBlockClientIds( blocksOrder, clientId ), - ], [] ); + return reduce( + blocksOrder[ rootClientId ], + ( result, clientId ) => [ + ...result, + clientId, + ...getNestedBlockClientIds( blocksOrder, clientId ), + ], + [] + ); } /** @@ -249,7 +254,10 @@ const withBlockCache = ( reducer ) => ( state = {}, action ) => { switch ( action.type ) { case 'RESET_BLOCKS': - newState.cache = mapValues( flattenBlocks( action.blocks ), () => ( {} ) ); + newState.cache = mapValues( + flattenBlocks( action.blocks ), + () => ( {} ) + ); break; case 'RECEIVE_BLOCKS': case 'INSERT_BLOCKS': { @@ -260,7 +268,7 @@ const withBlockCache = ( reducer ) => ( state = {}, action ) => { newState.cache = { ...newState.cache, ...fillKeysWithEmptyObject( - getBlocksWithParentsClientIds( updatedBlockUids ), + getBlocksWithParentsClientIds( updatedBlockUids ) ), }; break; @@ -270,24 +278,31 @@ const withBlockCache = ( reducer ) => ( state = {}, action ) => { newState.cache = { ...newState.cache, ...fillKeysWithEmptyObject( - getBlocksWithParentsClientIds( [ action.clientId ] ), + getBlocksWithParentsClientIds( [ action.clientId ] ) ), }; break; case 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': - const parentClientIds = fillKeysWithEmptyObject( getBlocksWithParentsClientIds( action.replacedClientIds ) ); + const parentClientIds = fillKeysWithEmptyObject( + getBlocksWithParentsClientIds( action.replacedClientIds ) + ); newState.cache = { ...omit( newState.cache, action.replacedClientIds ), ...omit( parentClientIds, action.replacedClientIds ), - ...fillKeysWithEmptyObject( keys( flattenBlocks( action.blocks ) ) ), + ...fillKeysWithEmptyObject( + keys( flattenBlocks( action.blocks ) ) + ), }; break; case 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN': newState.cache = { ...omit( newState.cache, action.removedClientIds ), ...fillKeysWithEmptyObject( - difference( getBlocksWithParentsClientIds( action.clientIds ), action.clientIds ), + difference( + getBlocksWithParentsClientIds( action.clientIds ), + action.clientIds + ) ), }; break; @@ -322,9 +337,14 @@ const withBlockCache = ( reducer ) => ( state = {}, action ) => { break; } case 'SAVE_REUSABLE_BLOCK_SUCCESS': { - const updatedBlockUids = keys( omitBy( newState.attributes, ( attributes, clientId ) => { - return newState.byClientId[ clientId ].name !== 'core/block' || attributes.ref !== action.updatedId; - } ) ); + const updatedBlockUids = keys( + omitBy( newState.attributes, ( attributes, clientId ) => { + return ( + newState.byClientId[ clientId ].name !== 'core/block' || + attributes.ref !== action.updatedId + ); + } ) + ); newState.cache = { ...newState.cache, @@ -355,14 +375,21 @@ function withPersistentBlockChange( reducer ) { return ( state, action ) => { let nextState = reducer( state, action ); - const isExplicitPersistentChange = action.type === 'MARK_LAST_CHANGE_AS_PERSISTENT' || markNextChangeAsNotPersistent; + const isExplicitPersistentChange = + action.type === 'MARK_LAST_CHANGE_AS_PERSISTENT' || + markNextChangeAsNotPersistent; // Defer to previous state value (or default) unless changing or // explicitly marking as persistent. if ( state === nextState && ! isExplicitPersistentChange ) { - markNextChangeAsNotPersistent = action.type === 'MARK_NEXT_CHANGE_AS_NOT_PERSISTENT'; - - const nextIsPersistentChange = get( state, [ 'isPersistentChange' ], true ); + markNextChangeAsNotPersistent = + action.type === 'MARK_NEXT_CHANGE_AS_NOT_PERSISTENT'; + + const nextIsPersistentChange = get( + state, + [ 'isPersistentChange' ], + true + ); if ( state.isPersistentChange === nextIsPersistentChange ) { return state; } @@ -375,16 +402,17 @@ function withPersistentBlockChange( reducer ) { nextState = { ...nextState, - isPersistentChange: isExplicitPersistentChange ? - ! markNextChangeAsNotPersistent : - ! isUpdatingSameBlockAttribute( action, lastAction ), + isPersistentChange: isExplicitPersistentChange + ? ! markNextChangeAsNotPersistent + : ! isUpdatingSameBlockAttribute( action, lastAction ), }; // In comparing against the previous action, consider only those which // would have qualified as one which would have been ignored or not // have resulted in a changed state. lastAction = action; - markNextChangeAsNotPersistent = action.type === 'MARK_NEXT_CHANGE_AS_NOT_PERSISTENT'; + markNextChangeAsNotPersistent = + action.type === 'MARK_NEXT_CHANGE_AS_NOT_PERSISTENT'; return nextState; }; @@ -406,9 +434,7 @@ function withIgnoredBlockChange( reducer ) { * * @type {Set} */ - const IGNORED_ACTION_TYPES = new Set( [ - 'RECEIVE_BLOCKS', - ] ); + const IGNORED_ACTION_TYPES = new Set( [ 'RECEIVE_BLOCKS' ] ); return ( state, action ) => { const nextState = reducer( state, action ); @@ -562,17 +588,20 @@ const withSaveReusableBlock = ( reducer ) => ( state, action ) => { state = { ...state }; - state.attributes = mapValues( state.attributes, ( attributes, clientId ) => { - const { name } = state.byClientId[ clientId ]; - if ( name === 'core/block' && attributes.ref === id ) { - return { - ...attributes, - ref: updatedId, - }; - } + state.attributes = mapValues( + state.attributes, + ( attributes, clientId ) => { + const { name } = state.byClientId[ clientId ]; + if ( name === 'core/block' && attributes.ref === id ) { + return { + ...attributes, + ref: updatedId, + }; + } - return attributes; - } ); + return attributes; + } + ); } return reducer( state, action ); @@ -594,7 +623,7 @@ export const blocks = flow( withReplaceInnerBlocks, // needs to be after withInnerBlocksRemoveCascade withBlockReset, withPersistentBlockChange, - withIgnoredBlockChange, + withIgnoredBlockChange )( { byClientId( state = {}, action ) { switch ( action.type ) { @@ -659,7 +688,10 @@ export const blocks = flow( case 'UPDATE_BLOCK': // Ignore updates if block isn't known or there are no attribute changes. - if ( ! state[ action.clientId ] || ! action.updates.attributes ) { + if ( + ! state[ action.clientId ] || + ! action.updates.attributes + ) { return state; } @@ -678,14 +710,21 @@ export const blocks = flow( } // Consider as updates only changed values - const nextAttributes = reduce( action.attributes, ( result, value, key ) => { - if ( value !== result[ key ] ) { - result = getMutateSafeObject( state[ action.clientId ], result ); - result[ key ] = value; - } - - return result; - }, state[ action.clientId ] ); + const nextAttributes = reduce( + action.attributes, + ( result, value, key ) => { + if ( value !== result[ key ] ) { + result = getMutateSafeObject( + state[ action.clientId ], + result + ); + result[ key ] = value; + } + + return result; + }, + state[ action.clientId ] + ); // Skip update if nothing has been changed. The reference will // match the original block if `reduce` had no changed values. @@ -730,18 +769,29 @@ export const blocks = flow( case 'INSERT_BLOCKS': { const { rootClientId = '' } = action; const subState = state[ rootClientId ] || []; - const mappedBlocks = mapBlockOrder( action.blocks, rootClientId ); + const mappedBlocks = mapBlockOrder( + action.blocks, + rootClientId + ); const { index = subState.length } = action; return { ...state, ...mappedBlocks, - [ rootClientId ]: insertAt( subState, mappedBlocks[ rootClientId ], index ), + [ rootClientId ]: insertAt( + subState, + mappedBlocks[ rootClientId ], + index + ), }; } case 'MOVE_BLOCK_TO_POSITION': { - const { fromRootClientId = '', toRootClientId = '', clientId } = action; + const { + fromRootClientId = '', + toRootClientId = '', + clientId, + } = action; const { index = state[ toRootClientId ].length } = action; // Moving inside the same parent block @@ -750,15 +800,26 @@ export const blocks = flow( const fromIndex = subState.indexOf( clientId ); return { ...state, - [ toRootClientId ]: moveTo( state[ toRootClientId ], fromIndex, index ), + [ toRootClientId ]: moveTo( + state[ toRootClientId ], + fromIndex, + index + ), }; } // Moving from a parent block to another return { ...state, - [ fromRootClientId ]: without( state[ fromRootClientId ], clientId ), - [ toRootClientId ]: insertAt( state[ toRootClientId ], clientId, index ), + [ fromRootClientId ]: without( + state[ fromRootClientId ], + clientId + ), + [ toRootClientId ]: insertAt( + state[ toRootClientId ], + clientId, + index + ), }; } @@ -767,7 +828,10 @@ export const blocks = flow( const firstClientId = first( clientIds ); const subState = state[ rootClientId ]; - if ( ! subState.length || firstClientId === first( subState ) ) { + if ( + ! subState.length || + firstClientId === first( subState ) + ) { return state; } @@ -775,7 +839,12 @@ export const blocks = flow( return { ...state, - [ rootClientId ]: moveTo( subState, firstIndex, firstIndex - 1, clientIds.length ), + [ rootClientId ]: moveTo( + subState, + firstIndex, + firstIndex - 1, + clientIds.length + ), }; } @@ -793,7 +862,12 @@ export const blocks = flow( return { ...state, - [ rootClientId ]: moveTo( subState, firstIndex, firstIndex + 1, clientIds.length ), + [ rootClientId ]: moveTo( + subState, + firstIndex, + firstIndex + 1, + clientIds.length + ), }; } @@ -806,27 +880,35 @@ export const blocks = flow( const mappedBlocks = mapBlockOrder( action.blocks ); return flow( [ - ( nextState ) => omit( nextState, action.replacedClientIds ), + ( nextState ) => + omit( nextState, action.replacedClientIds ), ( nextState ) => ( { ...nextState, ...omit( mappedBlocks, '' ), } ), - ( nextState ) => mapValues( nextState, ( subState ) => ( - reduce( subState, ( result, clientId ) => { - if ( clientId === clientIds[ 0 ] ) { - return [ - ...result, - ...mappedBlocks[ '' ], - ]; - } - - if ( clientIds.indexOf( clientId ) === -1 ) { - result.push( clientId ); - } - - return result; - }, [] ) - ) ), + ( nextState ) => + mapValues( nextState, ( subState ) => + reduce( + subState, + ( result, clientId ) => { + if ( clientId === clientIds[ 0 ] ) { + return [ + ...result, + ...mappedBlocks[ '' ], + ]; + } + + if ( + clientIds.indexOf( clientId ) === -1 + ) { + result.push( clientId ); + } + + return result; + }, + [] + ) + ), ] )( state ); } @@ -836,9 +918,10 @@ export const blocks = flow( ( nextState ) => omit( nextState, action.removedClientIds ), // Remove deleted blocks from other blocks' orderings - ( nextState ) => mapValues( nextState, ( subState ) => ( - without( subState, ...action.removedClientIds ) - ) ), + ( nextState ) => + mapValues( nextState, ( subState ) => + without( subState, ...action.removedClientIds ) + ), ] )( state ); } @@ -861,7 +944,10 @@ export const blocks = flow( case 'INSERT_BLOCKS': return { ...state, - ...mapBlockParents( action.blocks, action.rootClientId || '' ), + ...mapBlockParents( + action.blocks, + action.rootClientId || '' + ), }; case 'MOVE_BLOCK_TO_POSITION': { @@ -874,7 +960,10 @@ export const blocks = flow( case 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN': return { ...omit( state, action.replacedClientIds ), - ...mapBlockParents( action.blocks, state[ action.clientIds[ 0 ] ] ), + ...mapBlockParents( + action.blocks, + state[ action.clientIds[ 0 ] ] + ), }; case 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN': @@ -992,7 +1081,8 @@ function selection( state = {}, action ) { return state; } - const indexToSelect = action.indexToSelect || action.blocks.length - 1; + const indexToSelect = + action.indexToSelect || action.blocks.length - 1; const blockToSelect = action.blocks[ indexToSelect ]; if ( ! blockToSelect ) { @@ -1124,7 +1214,10 @@ export function blocksMode( state = {}, action ) { const { clientId } = action; return { ...state, - [ clientId ]: state[ clientId ] && state[ clientId ] === 'html' ? 'visual' : 'html', + [ clientId ]: + state[ clientId ] && state[ clientId ] === 'html' + ? 'visual' + : 'html', }; } @@ -1220,7 +1313,9 @@ export function preferences( state = PREFERENCES_DEFAULTS, action ) { ...prevState.insertUsage, [ id ]: { time: action.time, - count: prevState.insertUsage[ id ] ? prevState.insertUsage[ id ].count + 1 : 1, + count: prevState.insertUsage[ id ] + ? prevState.insertUsage[ id ].count + 1 + : 1, insert, }, }, @@ -1244,7 +1339,7 @@ export const blockListSettings = ( state = {}, action ) => { switch ( action.type ) { // Even if the replaced blocks have the same client ID, our logic // should correct the state. - case 'REPLACE_BLOCKS' : + case 'REPLACE_BLOCKS': case 'REMOVE_BLOCKS': { return omit( state, action.clientIds ); } @@ -1347,7 +1442,6 @@ export function automaticChangeStatus( state, action ) { return; // Undoing an automatic change should still be possible after mouse // move. - case 'SET_SELECTED_MOUNTED_BLOCK': case 'STOP_TYPING': return state; } @@ -1355,24 +1449,6 @@ export function automaticChangeStatus( state, action ) { // Reset the state by default (for any action not handled). } -/** - * Reducer returning selected and mounted block. This state is useful for - * components rendering and positioning controls around the block's node. - * - * @param {boolean} state Current state. - * @param {Object} action Dispatched action. - * - * @return {boolean} Updated state. - */ -export function selectedMountedBlock( state, action ) { - switch ( action.type ) { - case 'SET_SELECTED_MOUNTED_BLOCK': - return action.clientId; - } - - return state; -} - export default combineReducers( { blocks, isTyping, @@ -1392,5 +1468,4 @@ export default combineReducers( { lastBlockAttributesChange, isNavigationMode, automaticChangeStatus, - selectedMountedBlock, } ); diff --git a/packages/block-editor/src/store/selectors.js b/packages/block-editor/src/store/selectors.js index ceff4cb964436..f6c1f3052530a 100644 --- a/packages/block-editor/src/store/selectors.js +++ b/packages/block-editor/src/store/selectors.js @@ -66,7 +66,14 @@ export const INSERTER_UTILITY_NONE = 0; const MILLISECONDS_PER_HOUR = 3600 * 1000; const MILLISECONDS_PER_DAY = 24 * 3600 * 1000; const MILLISECONDS_PER_WEEK = 7 * 24 * 3600 * 1000; -const templateIcon = ; +const templateIcon = ( + + + + + + +); /** * Shared reference to an empty array for cases where it is important to avoid @@ -190,9 +197,8 @@ export const __unstableGetBlockWithoutInnerBlocks = createSelector( */ export const getBlocks = createSelector( ( state, rootClientId ) => { - return map( - getBlockOrder( state, rootClientId ), - ( clientId ) => getBlock( state, clientId ) + return map( getBlockOrder( state, rootClientId ), ( clientId ) => + getBlock( state, clientId ) ); }, ( state ) => [ @@ -211,10 +217,14 @@ export const getBlocks = createSelector( * * @return {Array} ids of descendants. */ -export const getClientIdsOfDescendants = ( state, clientIds ) => flatMap( clientIds, ( clientId ) => { - const descendants = getBlockOrder( state, clientId ); - return [ ...descendants, ...getClientIdsOfDescendants( state, descendants ) ]; -} ); +export const getClientIdsOfDescendants = ( state, clientIds ) => + flatMap( clientIds, ( clientId ) => { + const descendants = getBlockOrder( state, clientId ); + return [ + ...descendants, + ...getClientIdsOfDescendants( state, descendants ), + ]; + } ); /** * Returns an array containing the clientIds of the top-level blocks @@ -227,11 +237,12 @@ export const getClientIdsOfDescendants = ( state, clientIds ) => flatMap( client export const getClientIdsWithDescendants = createSelector( ( state ) => { const topLevelIds = getBlockOrder( state ); - return [ ...topLevelIds, ...getClientIdsOfDescendants( state, topLevelIds ) ]; + return [ + ...topLevelIds, + ...getClientIdsOfDescendants( state, topLevelIds ), + ]; }, - ( state ) => [ - state.blocks.order, - ] + ( state ) => [ state.blocks.order ] ); /** @@ -249,15 +260,16 @@ export const getGlobalBlockCount = createSelector( if ( ! blockName ) { return clientIds.length; } - return reduce( clientIds, ( accumulator, clientId ) => { - const block = state.blocks.byClientId[ clientId ]; - return block.name === blockName ? accumulator + 1 : accumulator; - }, 0 ); + return reduce( + clientIds, + ( accumulator, clientId ) => { + const block = state.blocks.byClientId[ clientId ]; + return block.name === blockName ? accumulator + 1 : accumulator; + }, + 0 + ); }, - ( state ) => [ - state.blocks.order, - state.blocks.byClientId, - ] + ( state ) => [ state.blocks.order, state.blocks.byClientId ] ); /** @@ -270,10 +282,10 @@ export const getGlobalBlockCount = createSelector( * @return {WPBlock[]} Block objects. */ export const getBlocksByClientId = createSelector( - ( state, clientIds ) => map( - castArray( clientIds ), - ( clientId ) => getBlock( state, clientId ) - ), + ( state, clientIds ) => + map( castArray( clientIds ), ( clientId ) => + getBlock( state, clientId ) + ), ( state ) => [ state.blocks.byClientId, state.blocks.order, @@ -351,7 +363,8 @@ export function getBlockSelectionEnd( state ) { * @return {number} Number of blocks selected in the post. */ export function getSelectedBlockCount( state ) { - const multiSelectedBlockCount = getMultiSelectedBlockClientIds( state ).length; + const multiSelectedBlockCount = getMultiSelectedBlockClientIds( state ) + .length; if ( multiSelectedBlockCount ) { return multiSelectedBlockCount; @@ -417,9 +430,9 @@ export function getSelectedBlock( state ) { * @return {?string} Root client ID, if exists */ export function getBlockRootClientId( state, clientId ) { - return state.blocks.parents[ clientId ] !== undefined ? - state.blocks.parents[ clientId ] : - null; + return state.blocks.parents[ clientId ] !== undefined + ? state.blocks.parents[ clientId ] + : null; } /** @@ -442,9 +455,7 @@ export const getBlockParents = createSelector( return ascending ? parents : parents.reverse(); }, - ( state ) => [ - state.blocks.parents, - ] + ( state ) => [ state.blocks.parents ] ); /** @@ -476,7 +487,10 @@ export function getBlockHierarchyRootClientId( state, clientId ) { export function getLowestCommonAncestorWithSelectedBlock( state, clientId ) { const selectedId = getSelectedBlockClientId( state ); const clientParents = [ ...getBlockParents( state, clientId ), clientId ]; - const selectedParents = [ ...getBlockParents( state, selectedId ), selectedId ]; + const selectedParents = [ + ...getBlockParents( state, selectedId ), + selectedId, + ]; let lowestCommonAncestor; @@ -536,7 +550,7 @@ export function getAdjacentBlockClientId( state, startClientId, modifier = 1 ) { const { order } = state.blocks; const orderSet = order[ rootClientId ]; const index = orderSet.indexOf( startClientId ); - const nextIndex = ( index + ( 1 * modifier ) ); + const nextIndex = index + 1 * modifier; // Block was first in set and we're attempting to get previous. if ( nextIndex < 0 ) { @@ -619,7 +633,10 @@ export const getSelectedBlockClientIds = createSelector( // Retrieve root client ID to aid in retrieving relevant nested block // order, being careful to allow the falsey empty string top-level root // by explicitly testing against null. - const rootClientId = getBlockRootClientId( state, selectionStart.clientId ); + const rootClientId = getBlockRootClientId( + state, + selectionStart.clientId + ); if ( rootClientId === null ) { return EMPTY_ARRAY; } @@ -638,7 +655,7 @@ export const getSelectedBlockClientIds = createSelector( state.blocks.order, state.selectionStart.clientId, state.selectionEnd.clientId, - ], + ] ); /** @@ -669,12 +686,16 @@ export function getMultiSelectedBlockClientIds( state ) { */ export const getMultiSelectedBlocks = createSelector( ( state ) => { - const multiSelectedBlockClientIds = getMultiSelectedBlockClientIds( state ); + const multiSelectedBlockClientIds = getMultiSelectedBlockClientIds( + state + ); if ( ! multiSelectedBlockClientIds.length ) { return EMPTY_ARRAY; } - return multiSelectedBlockClientIds.map( ( clientId ) => getBlock( state, clientId ) ); + return multiSelectedBlockClientIds.map( ( clientId ) => + getBlock( state, clientId ) + ); }, ( state ) => [ ...getSelectedBlockClientIds.getDependants( state ), @@ -759,7 +780,7 @@ export const isAncestorMultiSelected = createSelector( state.blocks.order, state.selectionStart.clientId, state.selectionEnd.clientId, - ], + ] ); /** * Returns the client ID of the block which begins the multi-selection set, or @@ -864,11 +885,10 @@ export function isBlockSelected( state, clientId ) { export function hasSelectedInnerBlock( state, clientId, deep = false ) { return some( getBlockOrder( state, clientId ), - ( innerClientId ) => ( + ( innerClientId ) => isBlockSelected( state, innerClientId ) || isBlockMultiSelected( state, innerClientId ) || ( deep && hasSelectedInnerBlock( state, innerClientId, deep ) ) - ) ); } @@ -1070,7 +1090,11 @@ export function getTemplateLock( state, rootClientId ) { * * @return {boolean} Whether the given block type is allowed to be inserted. */ -const canInsertBlockTypeUnmemoized = ( state, blockName, rootClientId = null ) => { +const canInsertBlockTypeUnmemoized = ( + state, + blockName, + rootClientId = null +) => { const checkAllowList = ( list, item, defaultResult = null ) => { if ( isBoolean( list ) ) { return list; @@ -1094,7 +1118,11 @@ const canInsertBlockTypeUnmemoized = ( state, blockName, rootClientId = null ) = const { allowedBlockTypes } = getSettings( state ); - const isBlockAllowedInEditor = checkAllowList( allowedBlockTypes, blockName, true ); + const isBlockAllowedInEditor = checkAllowList( + allowedBlockTypes, + blockName, + true + ); if ( ! isBlockAllowedInEditor ) { return false; } @@ -1105,12 +1133,20 @@ const canInsertBlockTypeUnmemoized = ( state, blockName, rootClientId = null ) = } const parentBlockListSettings = getBlockListSettings( state, rootClientId ); - const parentAllowedBlocks = get( parentBlockListSettings, [ 'allowedBlocks' ] ); - const hasParentAllowedBlock = checkAllowList( parentAllowedBlocks, blockName ); + const parentAllowedBlocks = get( parentBlockListSettings, [ + 'allowedBlocks', + ] ); + const hasParentAllowedBlock = checkAllowList( + parentAllowedBlocks, + blockName + ); const blockAllowedParentBlocks = blockType.parent; const parentName = getBlockName( state, rootClientId ); - const hasBlockAllowedParent = checkAllowList( blockAllowedParentBlocks, parentName ); + const hasBlockAllowedParent = checkAllowList( + blockAllowedParentBlocks, + parentName + ); if ( hasParentAllowedBlock !== null && hasBlockAllowedParent !== null ) { return hasParentAllowedBlock || hasBlockAllowedParent; @@ -1139,7 +1175,7 @@ export const canInsertBlockType = createSelector( state.blocks.byClientId[ rootClientId ], state.settings.allowedBlockTypes, state.settings.templateLock, - ], + ] ); /** @@ -1250,22 +1286,40 @@ export const getInserterItems = createSelector( let isDisabled = false; if ( ! hasBlockSupport( blockType.name, 'multiple', true ) ) { - isDisabled = some( getBlocksByClientId( state, getClientIdsWithDescendants( state ) ), { name: blockType.name } ); + isDisabled = some( + getBlocksByClientId( + state, + getClientIdsWithDescendants( state ) + ), + { + name: blockType.name, + } + ); } const isContextual = isArray( blockType.parent ); const { time, count = 0 } = getInsertUsage( state, id ) || {}; + const inserterVariations = blockType.variations.filter( + ( { scope } ) => ! scope || scope.includes( 'inserter' ) + ); return { id, name: blockType.name, initialAttributes: {}, title: blockType.title, + description: blockType.description, icon: blockType.icon, category: blockType.category, keywords: blockType.keywords, + variations: inserterVariations, + example: blockType.example, isDisabled, - utility: calculateUtility( blockType.category, count, isContextual ), + utility: calculateUtility( + blockType.category, + count, + isContextual + ), frecency: calculateFrecency( time, count ), }; }; @@ -1273,10 +1327,15 @@ export const getInserterItems = createSelector( const buildReusableBlockInserterItem = ( reusableBlock ) => { const id = `core/block/${ reusableBlock.id }`; - const referencedBlocks = __experimentalGetParsedReusableBlock( state, reusableBlock.id ); + const referencedBlocks = __experimentalGetParsedReusableBlock( + state, + reusableBlock.id + ); let referencedBlockType; if ( referencedBlocks.length === 1 ) { - referencedBlockType = getBlockType( referencedBlocks[ 0 ].name ); + referencedBlockType = getBlockType( + referencedBlocks[ 0 ].name + ); } const { time, count = 0 } = getInsertUsage( state, id ) || {}; @@ -1288,7 +1347,9 @@ export const getInserterItems = createSelector( name: 'core/block', initialAttributes: { ref: reusableBlock.id }, title: reusableBlock.title, - icon: referencedBlockType ? referencedBlockType.icon : templateIcon, + icon: referencedBlockType + ? referencedBlockType.icon + : templateIcon, category: 'reusable', keywords: [], isDisabled: false, @@ -1298,12 +1359,18 @@ export const getInserterItems = createSelector( }; const blockTypeInserterItems = getBlockTypes() - .filter( ( blockType ) => canIncludeBlockTypeInInserter( state, blockType, rootClientId ) ) + .filter( ( blockType ) => + canIncludeBlockTypeInInserter( state, blockType, rootClientId ) + ) .map( buildBlockTypeInserterItem ); - const reusableBlockInserterItems = canInsertBlockTypeUnmemoized( state, 'core/block', rootClientId ) ? - getReusableBlocks( state ).map( buildReusableBlockInserterItem ) : - []; + const reusableBlockInserterItems = canInsertBlockTypeUnmemoized( + state, + 'core/block', + rootClientId + ) + ? getReusableBlocks( state ).map( buildReusableBlockInserterItem ) + : []; return orderBy( [ ...blockTypeInserterItems, ...reusableBlockInserterItems ], @@ -1320,7 +1387,7 @@ export const getInserterItems = createSelector( state.settings.templateLock, getReusableBlocks( state ), getBlockTypes(), - ], + ] ); /** @@ -1333,17 +1400,15 @@ export const getInserterItems = createSelector( */ export const hasInserterItems = createSelector( ( state, rootClientId = null ) => { - const hasBlockType = some( - getBlockTypes(), - ( blockType ) => canIncludeBlockTypeInInserter( state, blockType, rootClientId ) + const hasBlockType = some( getBlockTypes(), ( blockType ) => + canIncludeBlockTypeInInserter( state, blockType, rootClientId ) ); if ( hasBlockType ) { return true; } - const hasReusableBlock = ( + const hasReusableBlock = canInsertBlockTypeUnmemoized( state, 'core/block', rootClientId ) && - getReusableBlocks( state ).length > 0 - ); + getReusableBlocks( state ).length > 0; return hasReusableBlock; }, @@ -1354,7 +1419,7 @@ export const hasInserterItems = createSelector( state.settings.templateLock, getReusableBlocks( state ), getBlockTypes(), - ], + ] ); /** @@ -1371,9 +1436,8 @@ export const __experimentalGetAllowedBlocks = createSelector( return; } - return filter( - getBlockTypes(), - ( blockType ) => canIncludeBlockTypeInInserter( state, blockType, rootClientId ) + return filter( getBlockTypes(), ( blockType ) => + canIncludeBlockTypeInInserter( state, blockType, rootClientId ) ); }, ( state, rootClientId ) => [ @@ -1431,11 +1495,11 @@ export function isLastBlockChangePersistent( state ) { */ export const __experimentalGetBlockListSettingsForBlocks = createSelector( ( state, clientIds ) => { - return filter( state.blockListSettings, ( value, key ) => clientIds.includes( key ) ); + return filter( state.blockListSettings, ( value, key ) => + clientIds.includes( key ) + ); }, - ( state ) => [ - state.blockListSettings, - ], + ( state ) => [ state.blockListSettings ] ); /** @@ -1458,9 +1522,7 @@ export const __experimentalGetParsedReusableBlock = createSelector( return parse( reusableBlock.content ); }, - ( state ) => [ - getReusableBlocks( state ), - ], + ( state ) => [ getReusableBlocks( state ) ] ); /** @@ -1502,7 +1564,11 @@ export function __experimentalGetLastBlockAttributeChanges( state ) { * @return {Array} Reusable blocks */ function getReusableBlocks( state ) { - return get( state, [ 'settings', '__experimentalReusableBlocks' ], EMPTY_ARRAY ); + return get( + state, + [ 'settings', '__experimentalReusableBlocks' ], + EMPTY_ARRAY + ); } /** @@ -1526,14 +1592,3 @@ export function isNavigationMode( state ) { export function didAutomaticChange( state ) { return !! state.automaticChangeStatus; } - -/** - * Gets the selected block's DOM node. - * - * @param {Object} state Global application state. - * - * @return {Element} The selected block's DOM node. - */ -export function __unstableGetSelectedMountedBlock( state ) { - return state.selectedMountedBlock; -} diff --git a/packages/block-editor/src/store/test/actions.js b/packages/block-editor/src/store/test/actions.js index d6e99912904df..3cad986cd639b 100644 --- a/packages/block-editor/src/store/test/actions.js +++ b/packages/block-editor/src/store/test/actions.js @@ -129,45 +129,35 @@ describe( 'actions', () => { // Skip getSettings select. replaceBlockGenerator.next(); - expect( - replaceBlockGenerator.next().value, - ).toEqual( { + expect( replaceBlockGenerator.next().value ).toEqual( { args: [ 'chicken' ], selectorName: 'getBlockRootClientId', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - replaceBlockGenerator.next().value, - ).toEqual( { + expect( replaceBlockGenerator.next().value ).toEqual( { args: [ 'core/test-block', undefined ], selectorName: 'canInsertBlockType', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - replaceBlockGenerator.next( true ).value, - ).toEqual( { + expect( replaceBlockGenerator.next( true ).value ).toEqual( { type: 'REPLACE_BLOCKS', clientIds: [ 'chicken' ], blocks: [ block ], time: expect.any( Number ), } ); - expect( - replaceBlockGenerator.next().value, - ).toEqual( { + expect( replaceBlockGenerator.next().value ).toEqual( { args: [], selectorName: 'getBlockCount', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - replaceBlockGenerator.next( 1 ), - ).toEqual( { + expect( replaceBlockGenerator.next( 1 ) ).toEqual( { value: undefined, done: true, } ); @@ -176,122 +166,112 @@ describe( 'actions', () => { describe( 'replaceBlocks', () => { it( 'should not yield the REPLACE_BLOCKS action if the replacement is not possible', () => { - const blocks = [ { - clientId: 'ribs', - name: 'core/test-ribs', - }, { - clientId: 'chicken', - name: 'core/test-chicken', - } ]; + const blocks = [ + { + clientId: 'ribs', + name: 'core/test-ribs', + }, + { + clientId: 'chicken', + name: 'core/test-chicken', + }, + ]; - const replaceBlockGenerator = replaceBlocks( [ 'chicken' ], blocks ); + const replaceBlockGenerator = replaceBlocks( + [ 'chicken' ], + blocks + ); - expect( - replaceBlockGenerator.next().value, - ).toEqual( { + expect( replaceBlockGenerator.next().value ).toEqual( { args: [], selectorName: 'getSettings', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - replaceBlockGenerator.next().value, - ).toEqual( { + expect( replaceBlockGenerator.next().value ).toEqual( { args: [ 'chicken' ], selectorName: 'getBlockRootClientId', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - replaceBlockGenerator.next().value, - ).toEqual( { + expect( replaceBlockGenerator.next().value ).toEqual( { args: [ 'core/test-ribs', undefined ], selectorName: 'canInsertBlockType', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - replaceBlockGenerator.next( true ).value, - ).toEqual( { + expect( replaceBlockGenerator.next( true ).value ).toEqual( { args: [ 'core/test-chicken', undefined ], selectorName: 'canInsertBlockType', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - replaceBlockGenerator.next( false ), - ).toEqual( { + expect( replaceBlockGenerator.next( false ) ).toEqual( { value: undefined, done: true, } ); } ); it( 'should yield the REPLACE_BLOCKS action if the all the replacement blocks can be inserted in the parent block', () => { - const blocks = [ { - clientId: 'ribs', - name: 'core/test-ribs', - }, { - clientId: 'chicken', - name: 'core/test-chicken', - } ]; + const blocks = [ + { + clientId: 'ribs', + name: 'core/test-ribs', + }, + { + clientId: 'chicken', + name: 'core/test-chicken', + }, + ]; - const replaceBlockGenerator = replaceBlocks( [ 'chicken' ], blocks ); + const replaceBlockGenerator = replaceBlocks( + [ 'chicken' ], + blocks + ); // Skip getSettings select. replaceBlockGenerator.next(); - expect( - replaceBlockGenerator.next().value, - ).toEqual( { + expect( replaceBlockGenerator.next().value ).toEqual( { args: [ 'chicken' ], selectorName: 'getBlockRootClientId', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - replaceBlockGenerator.next().value, - ).toEqual( { + expect( replaceBlockGenerator.next().value ).toEqual( { args: [ 'core/test-ribs', undefined ], selectorName: 'canInsertBlockType', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - replaceBlockGenerator.next( true ).value, - ).toEqual( { + expect( replaceBlockGenerator.next( true ).value ).toEqual( { args: [ 'core/test-chicken', undefined ], selectorName: 'canInsertBlockType', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - replaceBlockGenerator.next( true ).value, - ).toEqual( { + expect( replaceBlockGenerator.next( true ).value ).toEqual( { type: 'REPLACE_BLOCKS', clientIds: [ 'chicken' ], blocks, time: expect.any( Number ), } ); - expect( - replaceBlockGenerator.next().value, - ).toEqual( { + expect( replaceBlockGenerator.next().value ).toEqual( { args: [], selectorName: 'getBlockCount', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - replaceBlockGenerator.next( 1 ), - ).toEqual( { + expect( replaceBlockGenerator.next( 1 ) ).toEqual( { value: undefined, done: true, } ); @@ -306,23 +286,24 @@ describe( 'actions', () => { }; const index = 5; - const insertBlockGenerator = insertBlock( block, index, 'testclientid', true ); + const insertBlockGenerator = insertBlock( + block, + index, + 'testclientid', + true + ); // Skip getSettings select. insertBlockGenerator.next(); - expect( - insertBlockGenerator.next().value - ).toEqual( { + expect( insertBlockGenerator.next().value ).toEqual( { args: [ 'core/test-block', 'testclientid' ], selectorName: 'canInsertBlockType', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - insertBlockGenerator.next( true ), - ).toEqual( { + expect( insertBlockGenerator.next( true ) ).toEqual( { done: true, value: { type: 'INSERT_BLOCKS', @@ -350,17 +331,16 @@ describe( 'actions', () => { clientId: 'chicken-ribs', name: 'core/test-chicken-ribs', }; - const blocks = [ - ribsBlock, - chickenBlock, - chickenRibsBlock, - ]; + const blocks = [ ribsBlock, chickenBlock, chickenRibsBlock ]; - const insertBlocksGenerator = insertBlocks( blocks, 5, 'testrootid', false ); + const insertBlocksGenerator = insertBlocks( + blocks, + 5, + 'testrootid', + false + ); - expect( - insertBlocksGenerator.next().value, - ).toEqual( { + expect( insertBlocksGenerator.next().value ).toEqual( { args: [], selectorName: 'getSettings', storeName: 'core/block-editor', @@ -375,7 +355,7 @@ describe( 'actions', () => { 'core/test-chicken-ribs': 'colorful', }, }, - } ).value, + } ).value ).toEqual( { args: [ 'core/test-ribs', 'testrootid' ], selectorName: 'canInsertBlockType', @@ -383,34 +363,34 @@ describe( 'actions', () => { type: 'SELECT', } ); - expect( - insertBlocksGenerator.next( true ).value - ).toEqual( { + expect( insertBlocksGenerator.next( true ).value ).toEqual( { args: [ 'core/test-chicken', 'testrootid' ], selectorName: 'canInsertBlockType', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - insertBlocksGenerator.next( true ).value, - ).toEqual( { + expect( insertBlocksGenerator.next( true ).value ).toEqual( { args: [ 'core/test-chicken-ribs', 'testrootid' ], selectorName: 'canInsertBlockType', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - insertBlocksGenerator.next( true ), - ).toEqual( { + expect( insertBlocksGenerator.next( true ) ).toEqual( { done: true, value: { type: 'INSERT_BLOCKS', blocks: [ - { ...ribsBlock, attributes: { className: 'is-style-squared' } }, + { + ...ribsBlock, + attributes: { className: 'is-style-squared' }, + }, chickenBlock, - { ...chickenRibsBlock, attributes: { className: 'is-style-colorful' } }, + { + ...chickenRibsBlock, + attributes: { className: 'is-style-colorful' }, + }, ], index: 5, rootClientId: 'testrootid', @@ -428,15 +408,16 @@ describe( 'actions', () => { className: 'is-style-colorful', }, }; - const blocks = [ - ribsWithStyleBlock, - ]; + const blocks = [ ribsWithStyleBlock ]; - const insertBlocksGenerator = insertBlocks( blocks, 5, 'testrootid', false ); + const insertBlocksGenerator = insertBlocks( + blocks, + 5, + 'testrootid', + false + ); - expect( - insertBlocksGenerator.next().value, - ).toEqual( { + expect( insertBlocksGenerator.next().value ).toEqual( { args: [], selectorName: 'getSettings', storeName: 'core/block-editor', @@ -450,7 +431,7 @@ describe( 'actions', () => { 'core/test-ribs': 'squared', }, }, - } ).value, + } ).value ).toEqual( { args: [ 'core/test-ribs', 'testrootid' ], selectorName: 'canInsertBlockType', @@ -458,14 +439,15 @@ describe( 'actions', () => { type: 'SELECT', } ); - expect( - insertBlocksGenerator.next( true ), - ).toEqual( { + expect( insertBlocksGenerator.next( true ) ).toEqual( { done: true, value: { type: 'INSERT_BLOCKS', blocks: [ - { ...ribsWithStyleBlock, attributes: { className: 'is-style-colorful' } }, + { + ...ribsWithStyleBlock, + attributes: { className: 'is-style-colorful' }, + }, ], index: 5, rootClientId: 'testrootid', @@ -487,47 +469,40 @@ describe( 'actions', () => { clientId: 'chicken-ribs', name: 'core/test-chicken-ribs', }; - const blocks = [ - ribsBlock, - chickenBlock, - chickenRibsBlock, - ]; + const blocks = [ ribsBlock, chickenBlock, chickenRibsBlock ]; - const insertBlocksGenerator = insertBlocks( blocks, 5, 'testrootid', false ); + const insertBlocksGenerator = insertBlocks( + blocks, + 5, + 'testrootid', + false + ); // Skip getSettings select. insertBlocksGenerator.next(); - expect( - insertBlocksGenerator.next().value - ).toEqual( { + expect( insertBlocksGenerator.next().value ).toEqual( { args: [ 'core/test-ribs', 'testrootid' ], selectorName: 'canInsertBlockType', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - insertBlocksGenerator.next( true ).value - ).toEqual( { + expect( insertBlocksGenerator.next( true ).value ).toEqual( { args: [ 'core/test-chicken', 'testrootid' ], selectorName: 'canInsertBlockType', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - insertBlocksGenerator.next( false ).value, - ).toEqual( { + expect( insertBlocksGenerator.next( false ).value ).toEqual( { args: [ 'core/test-chicken-ribs', 'testrootid' ], selectorName: 'canInsertBlockType', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - insertBlocksGenerator.next( true ), - ).toEqual( { + expect( insertBlocksGenerator.next( true ) ).toEqual( { done: true, value: { type: 'INSERT_BLOCKS', @@ -549,37 +524,33 @@ describe( 'actions', () => { clientId: 'chicken', name: 'core/test-chicken', }; - const blocks = [ - ribsBlock, - chickenBlock, - ]; + const blocks = [ ribsBlock, chickenBlock ]; - const insertBlocksGenerator = insertBlocks( blocks, 5, 'testrootid', false ); + const insertBlocksGenerator = insertBlocks( + blocks, + 5, + 'testrootid', + false + ); // Skip getSettings select. insertBlocksGenerator.next(); - expect( - insertBlocksGenerator.next().value - ).toEqual( { + expect( insertBlocksGenerator.next().value ).toEqual( { args: [ 'core/test-ribs', 'testrootid' ], selectorName: 'canInsertBlockType', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - insertBlocksGenerator.next( false ).value, - ).toEqual( { + expect( insertBlocksGenerator.next( false ).value ).toEqual( { args: [ 'core/test-chicken', 'testrootid' ], selectorName: 'canInsertBlockType', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - insertBlocksGenerator.next( false ), - ).toEqual( { + expect( insertBlocksGenerator.next( false ) ).toEqual( { done: true, value: undefined, } ); @@ -606,7 +577,9 @@ describe( 'actions', () => { it( 'should return MERGE_BLOCKS action', () => { const firstBlockClientId = 'blockA'; const secondBlockClientId = 'blockB'; - expect( mergeBlocks( firstBlockClientId, secondBlockClientId ) ).toEqual( { + expect( + mergeBlocks( firstBlockClientId, secondBlockClientId ) + ).toEqual( { type: 'MERGE_BLOCKS', blocks: [ firstBlockClientId, secondBlockClientId ], } ); @@ -628,10 +601,7 @@ describe( 'actions', () => { type: 'REMOVE_BLOCKS', clientIds, }, - select( - 'core/block-editor', - 'getBlockCount', - ), + select( 'core/block-editor', 'getBlockCount' ), ] ); } ); } ); @@ -645,9 +615,7 @@ describe( 'actions', () => { 5 ); - expect( - moveBlockToPositionGenerator.next().value - ).toEqual( { + expect( moveBlockToPositionGenerator.next().value ).toEqual( { args: [ 'ribs' ], selectorName: 'getTemplateLock', storeName: 'core/block-editor', @@ -664,9 +632,7 @@ describe( 'actions', () => { index: 5, } ); - expect( - moveBlockToPositionGenerator.next().done - ).toBe( true ); + expect( moveBlockToPositionGenerator.next().done ).toBe( true ); } ); it( 'should not yield MOVE_BLOCK_TO_POSITION action if locking is all', () => { @@ -677,18 +643,14 @@ describe( 'actions', () => { 5 ); - expect( - moveBlockToPositionGenerator.next().value - ).toEqual( { + expect( moveBlockToPositionGenerator.next().value ).toEqual( { args: [ 'ribs' ], selectorName: 'getTemplateLock', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - moveBlockToPositionGenerator.next( 'all' ) - ).toEqual( { + expect( moveBlockToPositionGenerator.next( 'all' ) ).toEqual( { done: true, value: undefined, } ); @@ -702,42 +664,35 @@ describe( 'actions', () => { 5 ); - expect( - moveBlockToPositionGenerator.next().value - ).toEqual( { + expect( moveBlockToPositionGenerator.next().value ).toEqual( { args: [ 'ribs' ], selectorName: 'getTemplateLock', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - moveBlockToPositionGenerator.next( 'insert' ) - ).toEqual( { + expect( moveBlockToPositionGenerator.next( 'insert' ) ).toEqual( { done: true, value: undefined, } ); } ); it( 'should yield MOVE_BLOCK_TO_POSITION action if there is not locking in the original root block and block can be inserted in the destination', () => { - const moveBlockToPositionGenerator = moveBlockToPosition( 'chicken', + const moveBlockToPositionGenerator = moveBlockToPosition( + 'chicken', 'ribs', 'chicken-ribs', 5 ); - expect( - moveBlockToPositionGenerator.next().value - ).toEqual( { + expect( moveBlockToPositionGenerator.next().value ).toEqual( { args: [ 'ribs' ], selectorName: 'getTemplateLock', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - moveBlockToPositionGenerator.next().value - ).toEqual( { + expect( moveBlockToPositionGenerator.next().value ).toEqual( { args: [ 'chicken' ], selectorName: 'getBlockName', storeName: 'core/block-editor', @@ -745,7 +700,8 @@ describe( 'actions', () => { } ); expect( - moveBlockToPositionGenerator.next( 'myblock/chicken-block' ).value + moveBlockToPositionGenerator.next( 'myblock/chicken-block' ) + .value ).toEqual( { args: [ 'myblock/chicken-block', 'chicken-ribs' ], selectorName: 'canInsertBlockType', @@ -753,9 +709,7 @@ describe( 'actions', () => { type: 'SELECT', } ); - expect( - moveBlockToPositionGenerator.next( true ).value - ).toEqual( { + expect( moveBlockToPositionGenerator.next( true ).value ).toEqual( { type: 'MOVE_BLOCK_TO_POSITION', fromRootClientId: 'ribs', toRootClientId: 'chicken-ribs', @@ -763,33 +717,28 @@ describe( 'actions', () => { index: 5, } ); - expect( - moveBlockToPositionGenerator.next() - ).toEqual( { + expect( moveBlockToPositionGenerator.next() ).toEqual( { done: true, value: undefined, } ); } ); it( 'should not yield MOVE_BLOCK_TO_POSITION action if there is not locking in the original root block and block can be inserted in the destination', () => { - const moveBlockToPositionGenerator = moveBlockToPosition( 'chicken', + const moveBlockToPositionGenerator = moveBlockToPosition( + 'chicken', 'ribs', 'chicken-ribs', 5 ); - expect( - moveBlockToPositionGenerator.next().value - ).toEqual( { + expect( moveBlockToPositionGenerator.next().value ).toEqual( { args: [ 'ribs' ], selectorName: 'getTemplateLock', storeName: 'core/block-editor', type: 'SELECT', } ); - expect( - moveBlockToPositionGenerator.next().value - ).toEqual( { + expect( moveBlockToPositionGenerator.next().value ).toEqual( { args: [ 'chicken' ], selectorName: 'getBlockName', storeName: 'core/block-editor', @@ -797,7 +746,8 @@ describe( 'actions', () => { } ); expect( - moveBlockToPositionGenerator.next( 'myblock/chicken-block' ).value + moveBlockToPositionGenerator.next( 'myblock/chicken-block' ) + .value ).toEqual( { args: [ 'myblock/chicken-block', 'chicken-ribs' ], selectorName: 'canInsertBlockType', @@ -805,9 +755,7 @@ describe( 'actions', () => { type: 'SELECT', } ); - expect( - moveBlockToPositionGenerator.next( false ) - ).toEqual( { + expect( moveBlockToPositionGenerator.next( false ) ).toEqual( { done: true, value: undefined, } ); @@ -828,10 +776,7 @@ describe( 'actions', () => { type: 'REMOVE_BLOCKS', clientIds: [ clientId ], }, - select( - 'core/block-editor', - 'getBlockCount', - ), + select( 'core/block-editor', 'getBlockCount' ), ] ); } ); @@ -847,10 +792,7 @@ describe( 'actions', () => { type: 'REMOVE_BLOCKS', clientIds: [ clientId ], }, - select( - 'core/block-editor', - 'getBlockCount', - ), + select( 'core/block-editor', 'getBlockCount' ), ] ); } ); } ); @@ -930,7 +872,9 @@ describe( 'actions', () => { } ); it( 'should return the UPDATE_BLOCK_LIST_SETTINGS action with the passed settings', () => { - expect( updateBlockListSettings( 'chicken', { chicken: 'ribs' } ) ).toEqual( { + expect( + updateBlockListSettings( 'chicken', { chicken: 'ribs' } ) + ).toEqual( { type: 'UPDATE_BLOCK_LIST_SETTINGS', clientId: 'chicken', settings: { chicken: 'ribs' }, diff --git a/packages/block-editor/src/store/test/array.js b/packages/block-editor/src/store/test/array.js index 5edcad46ad80f..f88b6f858725d 100644 --- a/packages/block-editor/src/store/test/array.js +++ b/packages/block-editor/src/store/test/array.js @@ -7,39 +7,46 @@ describe( 'array', () => { describe( 'insertAt', () => { it( 'should insert a unique item at a given position', () => { const array = [ 'a', 'b', 'd' ]; - expect( insertAt( array, 'c', 2 ) ).toEqual( - [ 'a', 'b', 'c', 'd' ] - ); + expect( insertAt( array, 'c', 2 ) ).toEqual( [ + 'a', + 'b', + 'c', + 'd', + ] ); } ); it( 'should insert multiple items at a given position', () => { const array = [ 'a', 'b', 'e' ]; - expect( insertAt( array, [ 'c', 'd' ], 2 ) ).toEqual( - [ 'a', 'b', 'c', 'd', 'e' ] - ); + expect( insertAt( array, [ 'c', 'd' ], 2 ) ).toEqual( [ + 'a', + 'b', + 'c', + 'd', + 'e', + ] ); } ); } ); describe( 'moveTo', () => { it( 'should move an item to a given position', () => { const array = [ 'a', 'b', 'd', 'c' ]; - expect( moveTo( array, 3, 2 ) ).toEqual( - [ 'a', 'b', 'c', 'd' ] - ); + expect( moveTo( array, 3, 2 ) ).toEqual( [ 'a', 'b', 'c', 'd' ] ); } ); it( 'should move an item upwards to a given position', () => { const array = [ 'b', 'a', 'c', 'd' ]; - expect( moveTo( array, 0, 1 ) ).toEqual( - [ 'a', 'b', 'c', 'd' ] - ); + expect( moveTo( array, 0, 1 ) ).toEqual( [ 'a', 'b', 'c', 'd' ] ); } ); it( 'should move multiple items to a given position', () => { const array = [ 'a', 'c', 'd', 'b', 'e' ]; - expect( moveTo( array, 1, 2, 2 ) ).toEqual( - [ 'a', 'b', 'c', 'd', 'e' ] - ); + expect( moveTo( array, 1, 2, 2 ) ).toEqual( [ + 'a', + 'b', + 'c', + 'd', + 'e', + ] ); } ); } ); } ); diff --git a/packages/block-editor/src/store/test/effects.js b/packages/block-editor/src/store/test/effects.js index fbb93ddfd7f13..9b8702bb3342c 100644 --- a/packages/block-editor/src/store/test/effects.js +++ b/packages/block-editor/src/store/test/effects.js @@ -70,7 +70,10 @@ describe( 'effects', () => { const dispatch = jest.fn(); const getState = () => ( {} ); - handler( mergeBlocks( blockA.clientId, blockB.clientId ), { dispatch, getState } ); + handler( mergeBlocks( blockA.clientId, blockB.clientId ), { + dispatch, + getState, + } ); expect( dispatch ).toHaveBeenCalledTimes( 1 ); expect( dispatch ).toHaveBeenCalledWith( selectBlock( 'chicken' ) ); @@ -83,7 +86,10 @@ describe( 'effects', () => { }, merge( attributes, attributesToMerge ) { return { - content: attributes.content + ' ' + attributesToMerge.content, + content: + attributes.content + + ' ' + + attributesToMerge.content, }; }, save: noop, @@ -113,26 +119,34 @@ describe( 'effects', () => { offset: 0, }, } ); - handler( mergeBlocks( blockA.clientId, blockB.clientId ), { dispatch, getState } ); + handler( mergeBlocks( blockA.clientId, blockB.clientId ), { + dispatch, + getState, + } ); expect( dispatch ).toHaveBeenCalledTimes( 2 ); - expect( dispatch ).toHaveBeenCalledWith( selectionChange( - blockA.clientId, - 'content', - 'chicken'.length + 1, - 'chicken'.length + 1, - ) ); + expect( dispatch ).toHaveBeenCalledWith( + selectionChange( + blockA.clientId, + 'content', + 'chicken'.length + 1, + 'chicken'.length + 1 + ) + ); const lastCall = dispatch.mock.calls[ 1 ]; expect( lastCall ).toHaveLength( 1 ); const [ lastCallArgument ] = lastCall; - const expectedGenerator = replaceBlocks( [ 'chicken', 'ribs' ], [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: { content: 'chicken ribs' }, - } ] ); - expect( - Array.from( lastCallArgument ) - ).toEqual( + const expectedGenerator = replaceBlocks( + [ 'chicken', 'ribs' ], + [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: { content: 'chicken ribs' }, + }, + ] + ); + expect( Array.from( lastCallArgument ) ).toEqual( Array.from( expectedGenerator ) ); } ); @@ -144,7 +158,10 @@ describe( 'effects', () => { }, merge( attributes, attributesToMerge ) { return { - content: attributes.content + ' ' + attributesToMerge.content, + content: + attributes.content + + ' ' + + attributesToMerge.content, }; }, save: noop, @@ -175,7 +192,10 @@ describe( 'effects', () => { offset: 0, }, } ); - handler( mergeBlocks( blockA.clientId, blockB.clientId ), { dispatch, getState } ); + handler( mergeBlocks( blockA.clientId, blockB.clientId ), { + dispatch, + getState, + } ); expect( dispatch ).not.toHaveBeenCalled(); } ); @@ -189,7 +209,10 @@ describe( 'effects', () => { }, merge( attributes, attributesToMerge ) { return { - content: attributes.content + ' ' + attributesToMerge.content, + content: + attributes.content + + ' ' + + attributesToMerge.content, }; }, save: noop, @@ -203,15 +226,17 @@ describe( 'effects', () => { }, }, transforms: { - to: [ { - type: 'block', - blocks: [ 'core/test-block' ], - transform: ( { content2 } ) => { - return createBlock( 'core/test-block', { - content: content2, - } ); + to: [ + { + type: 'block', + blocks: [ 'core/test-block' ], + transform: ( { content2 } ) => { + return createBlock( 'core/test-block', { + content: content2, + } ); + }, }, - } ], + ], }, save: noop, category: 'common', @@ -240,26 +265,34 @@ describe( 'effects', () => { offset: 0, }, } ); - handler( mergeBlocks( blockA.clientId, blockB.clientId ), { dispatch, getState } ); + handler( mergeBlocks( blockA.clientId, blockB.clientId ), { + dispatch, + getState, + } ); expect( dispatch ).toHaveBeenCalledTimes( 2 ); - expect( dispatch ).toHaveBeenCalledWith( selectionChange( - blockA.clientId, - 'content', - 'chicken'.length + 1, - 'chicken'.length + 1, - ) ); - const expectedGenerator = replaceBlocks( [ 'chicken', 'ribs' ], [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: { content: 'chicken ribs' }, - } ] ); + expect( dispatch ).toHaveBeenCalledWith( + selectionChange( + blockA.clientId, + 'content', + 'chicken'.length + 1, + 'chicken'.length + 1 + ) + ); + const expectedGenerator = replaceBlocks( + [ 'chicken', 'ribs' ], + [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: { content: 'chicken ribs' }, + }, + ] + ); const lastCall = dispatch.mock.calls[ 1 ]; expect( lastCall ).toHaveLength( 1 ); const [ lastCallArgument ] = lastCall; - expect( - Array.from( lastCallArgument ) - ).toEqual( + expect( Array.from( lastCallArgument ) ).toEqual( Array.from( expectedGenerator ) ); } ); @@ -285,53 +318,57 @@ describe( 'effects', () => { } ); it( 'should return undefined if no template assigned', () => { - const result = validateBlocksToTemplate( resetBlocks( [ - createBlock( 'core/test-block' ), - ] ), store ); + const result = validateBlocksToTemplate( + resetBlocks( [ createBlock( 'core/test-block' ) ] ), + store + ); expect( result ).toBe( undefined ); } ); it( 'should return undefined if invalid but unlocked', () => { - store.dispatch( updateSettings( { - template: [ - [ 'core/foo', {} ], - ], - } ) ); + store.dispatch( + updateSettings( { + template: [ [ 'core/foo', {} ] ], + } ) + ); - const result = validateBlocksToTemplate( resetBlocks( [ - createBlock( 'core/test-block' ), - ] ), store ); + const result = validateBlocksToTemplate( + resetBlocks( [ createBlock( 'core/test-block' ) ] ), + store + ); expect( result ).toBe( undefined ); } ); it( 'should return undefined if locked and valid', () => { - store.dispatch( updateSettings( { - template: [ - [ 'core/test-block' ], - ], - templateLock: 'all', - } ) ); + store.dispatch( + updateSettings( { + template: [ [ 'core/test-block' ] ], + templateLock: 'all', + } ) + ); - const result = validateBlocksToTemplate( resetBlocks( [ - createBlock( 'core/test-block' ), - ] ), store ); + const result = validateBlocksToTemplate( + resetBlocks( [ createBlock( 'core/test-block' ) ] ), + store + ); expect( result ).toBe( undefined ); } ); it( 'should return validity set action if invalid on default state', () => { - store.dispatch( updateSettings( { - template: [ - [ 'core/foo' ], - ], - templateLock: 'all', - } ) ); + store.dispatch( + updateSettings( { + template: [ [ 'core/foo' ] ], + templateLock: 'all', + } ) + ); - const result = validateBlocksToTemplate( resetBlocks( [ - createBlock( 'core/test-block' ), - ] ), store ); + const result = validateBlocksToTemplate( + resetBlocks( [ createBlock( 'core/test-block' ) ] ), + store + ); expect( result ).toEqual( setTemplateValidity( false ) ); } ); diff --git a/packages/block-editor/src/store/test/reducer.js b/packages/block-editor/src/store/test/reducer.js index 606b54510e9bd..8610a1b8a3f31 100644 --- a/packages/block-editor/src/store/test/reducer.js +++ b/packages/block-editor/src/store/test/reducer.js @@ -62,7 +62,9 @@ describe( 'state', () => { clientId: '9db792c6-a25a-495d-adbd-97d56a4c4189', }; - expect( isUpdatingSameBlockAttribute( action, previousAction ) ).toBe( false ); + expect( + isUpdatingSameBlockAttribute( action, previousAction ) + ).toBe( false ); } ); it( 'should return false if last action was not updating block attributes', () => { @@ -78,7 +80,9 @@ describe( 'state', () => { clientId: '9db792c6-a25a-495d-adbd-97d56a4c4189', }; - expect( isUpdatingSameBlockAttribute( action, previousAction ) ).toBe( false ); + expect( + isUpdatingSameBlockAttribute( action, previousAction ) + ).toBe( false ); } ); it( 'should return false if not updating the same block', () => { @@ -97,7 +101,9 @@ describe( 'state', () => { }, }; - expect( isUpdatingSameBlockAttribute( action, previousAction ) ).toBe( false ); + expect( + isUpdatingSameBlockAttribute( action, previousAction ) + ).toBe( false ); } ); it( 'should return false if not updating the same block attributes', () => { @@ -116,7 +122,9 @@ describe( 'state', () => { }, }; - expect( isUpdatingSameBlockAttribute( action, previousAction ) ).toBe( false ); + expect( + isUpdatingSameBlockAttribute( action, previousAction ) + ).toBe( false ); } ); it( 'should return false if no previous action', () => { @@ -129,7 +137,9 @@ describe( 'state', () => { }; const previousAction = undefined; - expect( isUpdatingSameBlockAttribute( action, previousAction ) ).toBe( false ); + expect( + isUpdatingSameBlockAttribute( action, previousAction ) + ).toBe( false ); } ); it( 'should return true if updating the same block attributes', () => { @@ -148,7 +158,9 @@ describe( 'state', () => { }, }; - expect( isUpdatingSameBlockAttribute( action, previousAction ) ).toBe( true ); + expect( + isUpdatingSameBlockAttribute( action, previousAction ) + ).toBe( true ); } ); } ); @@ -280,7 +292,9 @@ describe( 'state', () => { [ newChildBlockId ]: {}, }, } ); - expect( state.cache.chicken ).not.toBe( existingState.cache.chicken ); + expect( state.cache.chicken ).not.toBe( + existingState.cache.chicken + ); } ); it( 'can insert a child block', () => { @@ -358,7 +372,9 @@ describe( 'state', () => { [ newChildBlockId ]: {}, }, } ); - expect( state.cache.chicken ).not.toBe( existingState.cache.chicken ); + expect( state.cache.chicken ).not.toBe( + existingState.cache.chicken + ); } ); it( 'can replace multiple child blocks', () => { @@ -474,7 +490,11 @@ describe( 'state', () => { }, order: { '': [ 'chicken' ], - chicken: [ newChildBlockId1, newChildBlockId2, newChildBlockId3 ], + chicken: [ + newChildBlockId1, + newChildBlockId2, + newChildBlockId3, + ], [ newChildBlockId1 ]: [], [ newChildBlockId2 ]: [], [ newChildBlockId3 ]: [], @@ -583,7 +603,9 @@ describe( 'state', () => { } ); // the cache key of the parent should be updated - expect( existingState.cache.chicken ).not.toBe( state.cache.chicken ); + expect( existingState.cache.chicken ).not.toBe( + state.cache.chicken + ); } ); } ); @@ -602,17 +624,16 @@ describe( 'state', () => { } ); it( 'should key by reset blocks clientId', () => { - [ - undefined, - blocks( undefined, {} ), - ].forEach( ( original ) => { + [ undefined, blocks( undefined, {} ) ].forEach( ( original ) => { const state = blocks( original, { type: 'RESET_BLOCKS', blocks: [ { clientId: 'bananas', innerBlocks: [] } ], } ); expect( Object.keys( state.byClientId ) ).toHaveLength( 1 ); - expect( values( state.byClientId )[ 0 ].clientId ).toBe( 'bananas' ); + expect( values( state.byClientId )[ 0 ].clientId ).toBe( + 'bananas' + ); expect( state.order ).toEqual( { '': [ 'bananas' ], bananas: [], @@ -627,10 +648,14 @@ describe( 'state', () => { const original = blocks( undefined, {} ); const state = blocks( original, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'bananas', - innerBlocks: [ { clientId: 'apples', innerBlocks: [] } ], - } ], + blocks: [ + { + clientId: 'bananas', + innerBlocks: [ + { clientId: 'apples', innerBlocks: [] }, + ], + }, + ], } ); expect( Object.keys( state.byClientId ) ).toHaveLength( 2 ); @@ -648,20 +673,24 @@ describe( 'state', () => { it( 'should insert block', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const state = blocks( original, { type: 'INSERT_BLOCKS', - blocks: [ { - clientId: 'ribs', - name: 'core/freeform', - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'ribs', + name: 'core/freeform', + innerBlocks: [], + }, + ], } ); expect( Object.keys( state.byClientId ) ).toHaveLength( 2 ); @@ -682,25 +711,31 @@ describe( 'state', () => { it( 'should replace the block', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const state = blocks( original, { type: 'REPLACE_BLOCKS', clientIds: [ 'chicken' ], - blocks: [ { - clientId: 'wings', - name: 'core/freeform', - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'wings', + name: 'core/freeform', + innerBlocks: [], + }, + ], } ); expect( Object.keys( state.byClientId ) ).toHaveLength( 1 ); - expect( values( state.byClientId )[ 0 ].name ).toBe( 'core/freeform' ); + expect( values( state.byClientId )[ 0 ].name ).toBe( + 'core/freeform' + ); expect( values( state.byClientId )[ 0 ].clientId ).toBe( 'wings' ); expect( state.order ).toEqual( { '': [ 'wings' ], @@ -716,28 +751,32 @@ describe( 'state', () => { it( 'should replace the block and remove references to its inner blocks', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [ - { - clientId: 'child', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, - ], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [ + { + clientId: 'child', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], + }, + ], } ); const state = blocks( original, { type: 'REPLACE_BLOCKS', clientIds: [ 'chicken' ], - blocks: [ { - clientId: 'wings', - name: 'core/freeform', - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'wings', + name: 'core/freeform', + innerBlocks: [], + }, + ], } ); expect( Object.keys( state.byClientId ) ).toHaveLength( 1 ); @@ -755,14 +794,17 @@ describe( 'state', () => { it( 'should replace the nested block', () => { const nestedBlock = createBlock( 'core/test-block' ); - const wrapperBlock = createBlock( 'core/test-block', {}, [ nestedBlock ] ); + const wrapperBlock = createBlock( 'core/test-block', {}, [ + nestedBlock, + ] ); const replacementBlock = createBlock( 'core/test-block' ); const original = blocks( undefined, { type: 'RESET_BLOCKS', blocks: [ wrapperBlock ], } ); - const originalWrapperBlockCacheKey = original.cache[ wrapperBlock.clientId ]; + const originalWrapperBlockCacheKey = + original.cache[ wrapperBlock.clientId ]; const state = blocks( original, { type: 'REPLACE_BLOCKS', @@ -770,9 +812,12 @@ describe( 'state', () => { blocks: [ replacementBlock ], } ); - const newWrapperBlockCacheKey = state.cache[ wrapperBlock.clientId ]; + const newWrapperBlockCacheKey = + state.cache[ wrapperBlock.clientId ]; - expect( newWrapperBlockCacheKey ).not.toBe( originalWrapperBlockCacheKey ); + expect( newWrapperBlockCacheKey ).not.toBe( + originalWrapperBlockCacheKey + ); expect( state.order ).toEqual( { '': [ wrapperBlock.clientId ], @@ -794,27 +839,37 @@ describe( 'state', () => { it( 'should replace the block even if the new block clientId is the same', () => { const originalState = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const replacedState = blocks( originalState, { type: 'REPLACE_BLOCKS', clientIds: [ 'chicken' ], - blocks: [ { - clientId: 'chicken', - name: 'core/freeform', - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/freeform', + innerBlocks: [], + }, + ], } ); expect( Object.keys( replacedState.byClientId ) ).toHaveLength( 1 ); - expect( values( originalState.byClientId )[ 0 ].name ).toBe( 'core/test-block' ); - expect( values( replacedState.byClientId )[ 0 ].name ).toBe( 'core/freeform' ); - expect( values( replacedState.byClientId )[ 0 ].clientId ).toBe( 'chicken' ); + expect( values( originalState.byClientId )[ 0 ].name ).toBe( + 'core/test-block' + ); + expect( values( replacedState.byClientId )[ 0 ].name ).toBe( + 'core/freeform' + ); + expect( values( replacedState.byClientId )[ 0 ].clientId ).toBe( + 'chicken' + ); expect( replacedState.order ).toEqual( { '': [ 'chicken' ], chicken: [], @@ -822,7 +877,9 @@ describe( 'state', () => { expect( replacedState.cache ).toEqual( { chicken: {}, } ); - expect( originalState.cache.chicken ).not.toBe( replacedState.cache.chicken ); + expect( originalState.cache.chicken ).not.toBe( + replacedState.cache.chicken + ); const nestedBlock = { clientId: 'chicken', @@ -830,7 +887,9 @@ describe( 'state', () => { attributes: {}, innerBlocks: [], }; - const wrapperBlock = createBlock( 'core/test-block', {}, [ nestedBlock ] ); + const wrapperBlock = createBlock( 'core/test-block', {}, [ + nestedBlock, + ] ); const replacementNestedBlock = { clientId: 'chicken', name: 'core/freeform', @@ -855,20 +914,26 @@ describe( 'state', () => { [ replacementNestedBlock.clientId ]: [], } ); - expect( originalNestedState.byClientId.chicken.name ).toBe( 'core/test-block' ); - expect( replacedNestedState.byClientId.chicken.name ).toBe( 'core/freeform' ); + expect( originalNestedState.byClientId.chicken.name ).toBe( + 'core/test-block' + ); + expect( replacedNestedState.byClientId.chicken.name ).toBe( + 'core/freeform' + ); } ); it( 'should update the block', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - isValid: false, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + isValid: false, + innerBlocks: [], + }, + ], } ); const state = blocks( deepFreeze( original ), { type: 'UPDATE_BLOCK', @@ -898,15 +963,17 @@ describe( 'state', () => { it( 'should update the reusable block reference if the temporary id is swapped', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/block', - attributes: { - ref: 'random-clientId', + blocks: [ + { + clientId: 'chicken', + name: 'core/block', + attributes: { + ref: 'random-clientId', + }, + isValid: false, + innerBlocks: [], }, - isValid: false, - innerBlocks: [], - } ], + ], } ); const state = blocks( deepFreeze( original ), { @@ -933,17 +1000,20 @@ describe( 'state', () => { it( 'should move the block up', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'ribs', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'ribs', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const state = blocks( original, { type: 'MOVE_BLOCKS_UP', @@ -958,7 +1028,10 @@ describe( 'state', () => { it( 'should move the nested block up', () => { const movedBlock = createBlock( 'core/test-block' ); const siblingBlock = createBlock( 'core/test-block' ); - const wrapperBlock = createBlock( 'core/test-block', {}, [ siblingBlock, movedBlock ] ); + const wrapperBlock = createBlock( 'core/test-block', {}, [ + siblingBlock, + movedBlock, + ] ); const original = blocks( undefined, { type: 'RESET_BLOCKS', blocks: [ wrapperBlock ], @@ -971,48 +1044,69 @@ describe( 'state', () => { expect( state.order ).toEqual( { '': [ wrapperBlock.clientId ], - [ wrapperBlock.clientId ]: [ movedBlock.clientId, siblingBlock.clientId ], + [ wrapperBlock.clientId ]: [ + movedBlock.clientId, + siblingBlock.clientId, + ], [ movedBlock.clientId ]: [], [ siblingBlock.clientId ]: [], } ); - expect( state.cache[ wrapperBlock.clientId ] ).not.toBe( original.cache[ wrapperBlock.clientId ] ); - expect( state.cache[ movedBlock.clientId ] ).toBe( original.cache[ movedBlock.clientId ] ); - expect( state.cache[ siblingBlock.clientId ] ).toBe( original.cache[ siblingBlock.clientId ] ); + expect( state.cache[ wrapperBlock.clientId ] ).not.toBe( + original.cache[ wrapperBlock.clientId ] + ); + expect( state.cache[ movedBlock.clientId ] ).toBe( + original.cache[ movedBlock.clientId ] + ); + expect( state.cache[ siblingBlock.clientId ] ).toBe( + original.cache[ siblingBlock.clientId ] + ); } ); it( 'should move multiple blocks up', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'ribs', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'veggies', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'ribs', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'veggies', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const state = blocks( original, { type: 'MOVE_BLOCKS_UP', clientIds: [ 'ribs', 'veggies' ], } ); - expect( state.order[ '' ] ).toEqual( [ 'ribs', 'veggies', 'chicken' ] ); + expect( state.order[ '' ] ).toEqual( [ + 'ribs', + 'veggies', + 'chicken', + ] ); } ); it( 'should move multiple nested blocks up', () => { const movedBlockA = createBlock( 'core/test-block' ); const movedBlockB = createBlock( 'core/test-block' ); const siblingBlock = createBlock( 'core/test-block' ); - const wrapperBlock = createBlock( 'core/test-block', {}, [ siblingBlock, movedBlockA, movedBlockB ] ); + const wrapperBlock = createBlock( 'core/test-block', {}, [ + siblingBlock, + movedBlockA, + movedBlockB, + ] ); const original = blocks( undefined, { type: 'RESET_BLOCKS', blocks: [ wrapperBlock ], @@ -1025,7 +1119,11 @@ describe( 'state', () => { expect( state.order ).toEqual( { '': [ wrapperBlock.clientId ], - [ wrapperBlock.clientId ]: [ movedBlockA.clientId, movedBlockB.clientId, siblingBlock.clientId ], + [ wrapperBlock.clientId ]: [ + movedBlockA.clientId, + movedBlockB.clientId, + siblingBlock.clientId, + ], [ movedBlockA.clientId ]: [], [ movedBlockB.clientId ]: [], [ siblingBlock.clientId ]: [], @@ -1035,17 +1133,20 @@ describe( 'state', () => { it( 'should not move the first block up', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'ribs', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'ribs', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const state = blocks( original, { type: 'MOVE_BLOCKS_UP', @@ -1058,17 +1159,20 @@ describe( 'state', () => { it( 'should move the block down', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'ribs', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'ribs', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const state = blocks( original, { type: 'MOVE_BLOCKS_DOWN', @@ -1081,7 +1185,10 @@ describe( 'state', () => { it( 'should move the nested block down', () => { const movedBlock = createBlock( 'core/test-block' ); const siblingBlock = createBlock( 'core/test-block' ); - const wrapperBlock = createBlock( 'core/test-block', {}, [ movedBlock, siblingBlock ] ); + const wrapperBlock = createBlock( 'core/test-block', {}, [ + movedBlock, + siblingBlock, + ] ); const original = blocks( undefined, { type: 'RESET_BLOCKS', blocks: [ wrapperBlock ], @@ -1094,7 +1201,10 @@ describe( 'state', () => { expect( state.order ).toEqual( { '': [ wrapperBlock.clientId ], - [ wrapperBlock.clientId ]: [ siblingBlock.clientId, movedBlock.clientId ], + [ wrapperBlock.clientId ]: [ + siblingBlock.clientId, + movedBlock.clientId, + ], [ movedBlock.clientId ]: [], [ siblingBlock.clientId ]: [], } ); @@ -1103,36 +1213,48 @@ describe( 'state', () => { it( 'should move multiple blocks down', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'ribs', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'veggies', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'ribs', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'veggies', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const state = blocks( original, { type: 'MOVE_BLOCKS_DOWN', clientIds: [ 'chicken', 'ribs' ], } ); - expect( state.order[ '' ] ).toEqual( [ 'veggies', 'chicken', 'ribs' ] ); + expect( state.order[ '' ] ).toEqual( [ + 'veggies', + 'chicken', + 'ribs', + ] ); } ); it( 'should move multiple nested blocks down', () => { const movedBlockA = createBlock( 'core/test-block' ); const movedBlockB = createBlock( 'core/test-block' ); const siblingBlock = createBlock( 'core/test-block' ); - const wrapperBlock = createBlock( 'core/test-block', {}, [ movedBlockA, movedBlockB, siblingBlock ] ); + const wrapperBlock = createBlock( 'core/test-block', {}, [ + movedBlockA, + movedBlockB, + siblingBlock, + ] ); const original = blocks( undefined, { type: 'RESET_BLOCKS', blocks: [ wrapperBlock ], @@ -1145,7 +1267,11 @@ describe( 'state', () => { expect( state.order ).toEqual( { '': [ wrapperBlock.clientId ], - [ wrapperBlock.clientId ]: [ siblingBlock.clientId, movedBlockA.clientId, movedBlockB.clientId ], + [ wrapperBlock.clientId ]: [ + siblingBlock.clientId, + movedBlockA.clientId, + movedBlockB.clientId, + ], [ movedBlockA.clientId ]: [], [ movedBlockB.clientId ]: [], [ siblingBlock.clientId ]: [], @@ -1155,17 +1281,20 @@ describe( 'state', () => { it( 'should not move the last block down', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'ribs', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'ribs', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const state = blocks( original, { type: 'MOVE_BLOCKS_DOWN', @@ -1178,17 +1307,20 @@ describe( 'state', () => { it( 'should remove the block', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'ribs', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'ribs', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const state = blocks( original, { type: 'REMOVE_BLOCKS', @@ -1217,22 +1349,26 @@ describe( 'state', () => { it( 'should remove multiple blocks', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'ribs', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'veggies', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'ribs', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'veggies', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const state = blocks( original, { type: 'REMOVE_BLOCKS', @@ -1283,52 +1419,65 @@ describe( 'state', () => { it( 'should insert at the specified index', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'kumquat', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'loquat', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'kumquat', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'loquat', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const state = blocks( original, { type: 'INSERT_BLOCKS', index: 1, - blocks: [ { - clientId: 'persimmon', - name: 'core/freeform', - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'persimmon', + name: 'core/freeform', + innerBlocks: [], + }, + ], } ); expect( Object.keys( state.byClientId ) ).toHaveLength( 3 ); - expect( state.order[ '' ] ).toEqual( [ 'kumquat', 'persimmon', 'loquat' ] ); + expect( state.order[ '' ] ).toEqual( [ + 'kumquat', + 'persimmon', + 'loquat', + ] ); } ); it( 'should move block to lower index', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'ribs', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'veggies', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'ribs', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'veggies', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const state = blocks( original, { type: 'MOVE_BLOCK_TO_POSITION', @@ -1336,28 +1485,36 @@ describe( 'state', () => { index: 0, } ); - expect( state.order[ '' ] ).toEqual( [ 'ribs', 'chicken', 'veggies' ] ); + expect( state.order[ '' ] ).toEqual( [ + 'ribs', + 'chicken', + 'veggies', + ] ); } ); it( 'should move block to higher index', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'ribs', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'veggies', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'ribs', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'veggies', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const state = blocks( original, { type: 'MOVE_BLOCK_TO_POSITION', @@ -1365,28 +1522,36 @@ describe( 'state', () => { index: 2, } ); - expect( state.order[ '' ] ).toEqual( [ 'chicken', 'veggies', 'ribs' ] ); + expect( state.order[ '' ] ).toEqual( [ + 'chicken', + 'veggies', + 'ribs', + ] ); } ); it( 'should not move block if passed same index', () => { const original = blocks( undefined, { type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'chicken', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'ribs', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - }, { - clientId: 'veggies', - name: 'core/test-block', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'chicken', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'ribs', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 'veggies', + name: 'core/test-block', + attributes: {}, + innerBlocks: [], + }, + ], } ); const state = blocks( original, { type: 'MOVE_BLOCK_TO_POSITION', @@ -1394,7 +1559,11 @@ describe( 'state', () => { index: 1, } ); - expect( state.order[ '' ] ).toEqual( [ 'chicken', 'ribs', 'veggies' ] ); + expect( state.order[ '' ] ).toEqual( [ + 'chicken', + 'ribs', + 'veggies', + ] ); } ); describe( 'blocks', () => { @@ -1425,7 +1594,9 @@ describe( 'state', () => { ], }, ]; - const original = deepFreeze( actions.reduce( blocks, undefined ) ); + const original = deepFreeze( + actions.reduce( blocks, undefined ) + ); const state = blocks( original, { type: 'RESET_BLOCKS', @@ -1452,10 +1623,12 @@ describe( 'state', () => { describe( 'byClientId', () => { it( 'should ignore updates to non-existent block', () => { - const original = deepFreeze( blocks( undefined, { - type: 'RESET_BLOCKS', - blocks: [], - } ) ); + const original = deepFreeze( + blocks( undefined, { + type: 'RESET_BLOCKS', + blocks: [], + } ) + ); const state = blocks( original, { type: 'UPDATE_BLOCK_ATTRIBUTES', clientId: 'kumquat', @@ -1468,16 +1641,20 @@ describe( 'state', () => { } ); it( 'should return with same reference if no changes in updates', () => { - const original = deepFreeze( blocks( undefined, { - type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'kumquat', - attributes: { - updated: true, - }, - innerBlocks: [], - } ], - } ) ); + const original = deepFreeze( + blocks( undefined, { + type: 'RESET_BLOCKS', + blocks: [ + { + clientId: 'kumquat', + attributes: { + updated: true, + }, + innerBlocks: [], + }, + ], + } ) + ); const state = blocks( original, { type: 'UPDATE_BLOCK_ATTRIBUTES', clientId: 'kumquat', @@ -1492,14 +1669,18 @@ describe( 'state', () => { describe( 'attributes', () => { it( 'should return with attribute block updates', () => { - const original = deepFreeze( blocks( undefined, { - type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'kumquat', - attributes: {}, - innerBlocks: [], - } ], - } ) ); + const original = deepFreeze( + blocks( undefined, { + type: 'RESET_BLOCKS', + blocks: [ + { + clientId: 'kumquat', + attributes: {}, + innerBlocks: [], + }, + ], + } ) + ); const state = blocks( original, { type: 'UPDATE_BLOCK_ATTRIBUTES', clientId: 'kumquat', @@ -1512,16 +1693,20 @@ describe( 'state', () => { } ); it( 'should accumulate attribute block updates', () => { - const original = deepFreeze( blocks( undefined, { - type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'kumquat', - attributes: { - updated: true, - }, - innerBlocks: [], - } ], - } ) ); + const original = deepFreeze( + blocks( undefined, { + type: 'RESET_BLOCKS', + blocks: [ + { + clientId: 'kumquat', + attributes: { + updated: true, + }, + innerBlocks: [], + }, + ], + } ) + ); const state = blocks( original, { type: 'UPDATE_BLOCK_ATTRIBUTES', clientId: 'kumquat', @@ -1537,10 +1722,12 @@ describe( 'state', () => { } ); it( 'should ignore updates to non-existent block', () => { - const original = deepFreeze( blocks( undefined, { - type: 'RESET_BLOCKS', - blocks: [], - } ) ); + const original = deepFreeze( + blocks( undefined, { + type: 'RESET_BLOCKS', + blocks: [], + } ) + ); const state = blocks( original, { type: 'UPDATE_BLOCK_ATTRIBUTES', clientId: 'kumquat', @@ -1553,16 +1740,20 @@ describe( 'state', () => { } ); it( 'should return with same reference if no changes in updates', () => { - const original = deepFreeze( blocks( undefined, { - type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'kumquat', - attributes: { - updated: true, - }, - innerBlocks: [], - } ], - } ) ); + const original = deepFreeze( + blocks( undefined, { + type: 'RESET_BLOCKS', + blocks: [ + { + clientId: 'kumquat', + attributes: { + updated: true, + }, + innerBlocks: [], + }, + ], + } ) + ); const state = blocks( original, { type: 'UPDATE_BLOCK_ATTRIBUTES', clientId: 'kumquat', @@ -1583,10 +1774,12 @@ describe( 'state', () => { } ); it( 'should consider any non-exempt block change as persistent', () => { - const original = deepFreeze( blocks( undefined, { - type: 'RESET_BLOCKS', - blocks: [], - } ) ); + const original = deepFreeze( + blocks( undefined, { + type: 'RESET_BLOCKS', + blocks: [], + } ) + ); const state = blocks( original, { type: 'UPDATE_BLOCK_ATTRIBUTES', @@ -1600,14 +1793,18 @@ describe( 'state', () => { } ); it( 'should consider any non-exempt block change as persistent across unchanging actions', () => { - let original = deepFreeze( blocks( undefined, { - type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'kumquat', - attributes: {}, - innerBlocks: [], - } ], - } ) ); + let original = deepFreeze( + blocks( undefined, { + type: 'RESET_BLOCKS', + blocks: [ + { + clientId: 'kumquat', + attributes: {}, + innerBlocks: [], + }, + ], + } ) + ); original = blocks( original, { type: 'NOOP', } ); @@ -1630,14 +1827,18 @@ describe( 'state', () => { } ); it( 'should consider same block attribute update as exempt', () => { - let original = deepFreeze( blocks( undefined, { - type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'kumquat', - attributes: {}, - innerBlocks: [], - } ], - } ) ); + let original = deepFreeze( + blocks( undefined, { + type: 'RESET_BLOCKS', + blocks: [ + { + clientId: 'kumquat', + attributes: {}, + innerBlocks: [], + }, + ], + } ) + ); original = blocks( original, { type: 'UPDATE_BLOCK_ATTRIBUTES', clientId: 'kumquat', @@ -1658,14 +1859,18 @@ describe( 'state', () => { } ); it( 'should flag an explicitly marked persistent change', () => { - let original = deepFreeze( blocks( undefined, { - type: 'RESET_BLOCKS', - blocks: [ { - clientId: 'kumquat', - attributes: {}, - innerBlocks: [], - } ], - } ) ); + let original = deepFreeze( + blocks( undefined, { + type: 'RESET_BLOCKS', + blocks: [ + { + clientId: 'kumquat', + attributes: {}, + innerBlocks: [], + }, + ], + } ) + ); original = blocks( original, { type: 'UPDATE_BLOCK_ATTRIBUTES', clientId: 'kumquat', @@ -1689,10 +1894,12 @@ describe( 'state', () => { } ); it( 'should retain reference for same state, same persistence', () => { - const original = deepFreeze( blocks( undefined, { - type: 'RESET_BLOCKS', - blocks: [], - } ) ); + const original = deepFreeze( + blocks( undefined, { + type: 'RESET_BLOCKS', + blocks: [], + } ) + ); const state = blocks( original, { type: '__INERT__', @@ -1704,14 +1911,18 @@ describe( 'state', () => { describe( 'isIgnoredChange', () => { it( 'should consider received blocks as ignored change', () => { - const resetState = blocks( undefined, { type: 'random action' } ); + const resetState = blocks( undefined, { + type: 'random action', + } ); const state = blocks( resetState, { type: 'RECEIVE_BLOCKS', - blocks: [ { - clientId: 'kumquat', - attributes: {}, - innerBlocks: [], - } ], + blocks: [ + { + clientId: 'kumquat', + attributes: {}, + innerBlocks: [], + }, + ], } ); expect( state.isIgnoredChange ).toBe( true ); @@ -1984,10 +2195,7 @@ describe( 'state', () => { const action = { type: 'REPLACE_BLOCKS', clientIds: [ 'wings' ], - blocks: [ - { clientId: 'chicken' }, - { clientId: 'wings' }, - ], + blocks: [ { clientId: 'chicken' }, { clientId: 'wings' } ], }; const state1 = selectionStart( original, action ); const state2 = selectionEnd( original, action ); @@ -2001,10 +2209,7 @@ describe( 'state', () => { const action = { type: 'REPLACE_BLOCKS', clientIds: [ 'chicken' ], - blocks: [ - { clientId: 'chicken' }, - { clientId: 'wings' }, - ], + blocks: [ { clientId: 'chicken' }, { clientId: 'wings' } ], }; const state1 = selectionStart( original, action ); const state2 = selectionEnd( original, action ); @@ -2114,10 +2319,12 @@ describe( 'state', () => { it( 'should record recently used blocks', () => { const state = preferences( deepFreeze( { insertUsage: {} } ), { type: 'INSERT_BLOCKS', - blocks: [ { - clientId: 'bacon', - name: 'core-embed/twitter', - } ], + blocks: [ + { + clientId: 'bacon', + name: 'core-embed/twitter', + }, + ], time: 123456, } ); @@ -2131,26 +2338,32 @@ describe( 'state', () => { }, } ); - const twoRecentBlocks = preferences( deepFreeze( { - insertUsage: { - 'core-embed/twitter': { - time: 123456, - count: 1, - insert: { name: 'core-embed/twitter' }, + const twoRecentBlocks = preferences( + deepFreeze( { + insertUsage: { + 'core-embed/twitter': { + time: 123456, + count: 1, + insert: { name: 'core-embed/twitter' }, + }, }, - }, - } ), { - type: 'INSERT_BLOCKS', - blocks: [ { - clientId: 'eggs', - name: 'core-embed/twitter', - }, { - clientId: 'bacon', - name: 'core/block', - attributes: { ref: 123 }, - } ], - time: 123457, - } ); + } ), + { + type: 'INSERT_BLOCKS', + blocks: [ + { + clientId: 'eggs', + name: 'core-embed/twitter', + }, + { + clientId: 'bacon', + name: 'core/block', + attributes: { ref: 123 }, + }, + ], + time: 123457, + } + ); expect( twoRecentBlocks ).toEqual( { insertUsage: { @@ -2185,7 +2398,10 @@ describe( 'state', () => { type: 'TOGGLE_BLOCK_MODE', clientId: 'chicken', }; - const value = blocksMode( deepFreeze( { chicken: 'html' } ), action ); + const value = blocksMode( + deepFreeze( { chicken: 'html' } ), + action + ); expect( value ).toEqual( { chicken: 'visual' } ); } ); diff --git a/packages/block-editor/src/store/test/selectors.js b/packages/block-editor/src/store/test/selectors.js index d3a59a8b00768..d6f4cfaac20e1 100644 --- a/packages/block-editor/src/store/test/selectors.js +++ b/packages/block-editor/src/store/test/selectors.js @@ -159,7 +159,10 @@ describe( 'selectors', () => { }, }; - const name = getBlockName( state, 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1' ); + const name = getBlockName( + state, + 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1' + ); expect( name ).toBe( null ); } ); @@ -186,7 +189,10 @@ describe( 'selectors', () => { }, }; - const name = getBlockName( state, 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1' ); + const name = getBlockName( + state, + 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1' + ); expect( name ).toBe( 'core/paragraph' ); } ); @@ -268,12 +274,14 @@ describe( 'selectors', () => { clientId: 123, name: 'core/paragraph', attributes: {}, - innerBlocks: [ { - clientId: 456, - name: 'core/paragraph', - attributes: {}, - innerBlocks: [], - } ], + innerBlocks: [ + { + clientId: 456, + name: 'core/paragraph', + attributes: {}, + innerBlocks: [], + }, + ], } ); } ); } ); @@ -305,8 +313,18 @@ describe( 'selectors', () => { }; expect( getBlocks( state ) ).toEqual( [ - { clientId: 123, name: 'core/paragraph', attributes: {}, innerBlocks: [] }, - { clientId: 23, name: 'core/heading', attributes: {}, innerBlocks: [] }, + { + clientId: 123, + name: 'core/paragraph', + attributes: {}, + innerBlocks: [], + }, + { + clientId: 23, + name: 'core/heading', + attributes: {}, + innerBlocks: [], + }, ] ); } ); } ); @@ -317,20 +335,38 @@ describe( 'selectors', () => { blocks: { byClientId: { 'uuid-2': { clientId: 'uuid-2', name: 'core/image' }, - 'uuid-4': { clientId: 'uuid-4', name: 'core/paragraph' }, - 'uuid-6': { clientId: 'uuid-6', name: 'core/paragraph' }, + 'uuid-4': { + clientId: 'uuid-4', + name: 'core/paragraph', + }, + 'uuid-6': { + clientId: 'uuid-6', + name: 'core/paragraph', + }, 'uuid-8': { clientId: 'uuid-8', name: 'core/block' }, - 'uuid-10': { clientId: 'uuid-10', name: 'core/columns' }, + 'uuid-10': { + clientId: 'uuid-10', + name: 'core/columns', + }, 'uuid-12': { clientId: 'uuid-12', name: 'core/column' }, 'uuid-14': { clientId: 'uuid-14', name: 'core/column' }, 'uuid-16': { clientId: 'uuid-16', name: 'core/quote' }, 'uuid-18': { clientId: 'uuid-18', name: 'core/block' }, - 'uuid-20': { clientId: 'uuid-20', name: 'core/gallery' }, + 'uuid-20': { + clientId: 'uuid-20', + name: 'core/gallery', + }, 'uuid-22': { clientId: 'uuid-22', name: 'core/block' }, - 'uuid-24': { clientId: 'uuid-24', name: 'core/columns' }, + 'uuid-24': { + clientId: 'uuid-24', + name: 'core/columns', + }, 'uuid-26': { clientId: 'uuid-26', name: 'core/column' }, 'uuid-28': { clientId: 'uuid-28', name: 'core/column' }, - 'uuid-30': { clientId: 'uuid-30', name: 'core/paragraph' }, + 'uuid-30': { + clientId: 'uuid-30', + name: 'core/paragraph', + }, }, attributes: { 'uuid-2': {}, @@ -351,19 +387,19 @@ describe( 'selectors', () => { }, order: { '': [ 'uuid-6', 'uuid-8', 'uuid-10', 'uuid-22' ], - 'uuid-2': [ ], - 'uuid-4': [ ], - 'uuid-6': [ ], - 'uuid-8': [ ], + 'uuid-2': [], + 'uuid-4': [], + 'uuid-6': [], + 'uuid-8': [], 'uuid-10': [ 'uuid-12', 'uuid-14' ], 'uuid-12': [ 'uuid-16' ], 'uuid-14': [ 'uuid-18' ], - 'uuid-16': [ ], + 'uuid-16': [], 'uuid-18': [ 'uuid-24' ], - 'uuid-20': [ ], - 'uuid-22': [ ], + 'uuid-20': [], + 'uuid-22': [], 'uuid-24': [ 'uuid-26', 'uuid-28' ], - 'uuid-26': [ ], + 'uuid-26': [], 'uuid-28': [ 'uuid-30' ], }, parents: { @@ -382,7 +418,9 @@ describe( 'selectors', () => { }, }, }; - expect( getClientIdsOfDescendants( state, [ 'uuid-10' ] ) ).toEqual( [ + expect( + getClientIdsOfDescendants( state, [ 'uuid-10' ] ) + ).toEqual( [ 'uuid-12', 'uuid-14', 'uuid-16', @@ -401,20 +439,38 @@ describe( 'selectors', () => { blocks: { byClientId: { 'uuid-2': { clientId: 'uuid-2', name: 'core/image' }, - 'uuid-4': { clientId: 'uuid-4', name: 'core/paragraph' }, - 'uuid-6': { clientId: 'uuid-6', name: 'core/paragraph' }, + 'uuid-4': { + clientId: 'uuid-4', + name: 'core/paragraph', + }, + 'uuid-6': { + clientId: 'uuid-6', + name: 'core/paragraph', + }, 'uuid-8': { clientId: 'uuid-8', name: 'core/block' }, - 'uuid-10': { clientId: 'uuid-10', name: 'core/columns' }, + 'uuid-10': { + clientId: 'uuid-10', + name: 'core/columns', + }, 'uuid-12': { clientId: 'uuid-12', name: 'core/column' }, 'uuid-14': { clientId: 'uuid-14', name: 'core/column' }, 'uuid-16': { clientId: 'uuid-16', name: 'core/quote' }, 'uuid-18': { clientId: 'uuid-18', name: 'core/block' }, - 'uuid-20': { clientId: 'uuid-20', name: 'core/gallery' }, + 'uuid-20': { + clientId: 'uuid-20', + name: 'core/gallery', + }, 'uuid-22': { clientId: 'uuid-22', name: 'core/block' }, - 'uuid-24': { clientId: 'uuid-24', name: 'core/columns' }, + 'uuid-24': { + clientId: 'uuid-24', + name: 'core/columns', + }, 'uuid-26': { clientId: 'uuid-26', name: 'core/column' }, 'uuid-28': { clientId: 'uuid-28', name: 'core/column' }, - 'uuid-30': { clientId: 'uuid-30', name: 'core/paragraph' }, + 'uuid-30': { + clientId: 'uuid-30', + name: 'core/paragraph', + }, }, attributes: { 'uuid-2': {}, @@ -435,19 +491,19 @@ describe( 'selectors', () => { }, order: { '': [ 'uuid-6', 'uuid-8', 'uuid-10', 'uuid-22' ], - 'uuid-2': [ ], - 'uuid-4': [ ], - 'uuid-6': [ ], - 'uuid-8': [ ], + 'uuid-2': [], + 'uuid-4': [], + 'uuid-6': [], + 'uuid-8': [], 'uuid-10': [ 'uuid-12', 'uuid-14' ], 'uuid-12': [ 'uuid-16' ], 'uuid-14': [ 'uuid-18' ], - 'uuid-16': [ ], + 'uuid-16': [], 'uuid-18': [ 'uuid-24' ], - 'uuid-20': [ ], - 'uuid-22': [ ], + 'uuid-20': [], + 'uuid-22': [], 'uuid-24': [ 'uuid-26', 'uuid-28' ], - 'uuid-26': [ ], + 'uuid-26': [], 'uuid-28': [ 'uuid-30' ], }, parents: { @@ -545,8 +601,12 @@ describe( 'selectors', () => { it( 'should return false if multi-selection', () => { const state = { - selectionStart: { clientId: 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1' }, - selectionEnd: { clientId: '9db792c6-a25a-495d-adbd-97d56a4c4189' }, + selectionStart: { + clientId: 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1', + }, + selectionEnd: { + clientId: '9db792c6-a25a-495d-adbd-97d56a4c4189', + }, }; expect( hasSelectedBlock( state ) ).toBe( false ); @@ -554,8 +614,12 @@ describe( 'selectors', () => { it( 'should return true if singular selection', () => { const state = { - selectionStart: { clientId: 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1' }, - selectionEnd: { clientId: 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1' }, + selectionStart: { + clientId: 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1', + }, + selectionEnd: { + clientId: 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1', + }, }; expect( hasSelectedBlock( state ) ).toBe( true ); @@ -603,7 +667,9 @@ describe( 'selectors', () => { }, }; expect( getGlobalBlockCount( emptyState ) ).toBe( 0 ); - expect( getGlobalBlockCount( emptyState, 'core/heading' ) ).toBe( 0 ); + expect( getGlobalBlockCount( emptyState, 'core/heading' ) ).toBe( + 0 + ); } ); } ); @@ -947,7 +1013,11 @@ describe( 'selectors', () => { selectionEnd: { clientId: 4 }, }; - expect( getMultiSelectedBlockClientIds( state ) ).toEqual( [ 4, 3, 2 ] ); + expect( getMultiSelectedBlockClientIds( state ) ).toEqual( [ + 4, + 3, + 2, + ] ); } ); it( 'should return selected block clientIds if there is multi selection (nested context)', () => { @@ -973,7 +1043,11 @@ describe( 'selectors', () => { selectionEnd: { clientId: 9 }, }; - expect( getMultiSelectedBlockClientIds( state ) ).toEqual( [ 9, 8, 7 ] ); + expect( getMultiSelectedBlockClientIds( state ) ).toEqual( [ + 9, + 8, + 7, + ] ); } ); } ); @@ -990,9 +1064,9 @@ describe( 'selectors', () => { selectionEnd: {}, }; - expect( + expect( getMultiSelectedBlocks( state ) ).toBe( getMultiSelectedBlocks( state ) - ).toBe( getMultiSelectedBlocks( state ) ); + ); } ); } ); @@ -1142,7 +1216,9 @@ describe( 'selectors', () => { }, }; - expect( getPreviousBlockClientId( state, 56, '123' ) ).toEqual( 456 ); + expect( getPreviousBlockClientId( state, 56, '123' ) ).toEqual( + 456 + ); } ); it( 'should return null for the first block', () => { @@ -1460,8 +1536,12 @@ describe( 'selectors', () => { it( 'should return false if singular selection', () => { const state = { - selectionStart: { clientId: 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1' }, - selectionEnd: { clientId: 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1' }, + selectionStart: { + clientId: 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1', + }, + selectionEnd: { + clientId: 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1', + }, }; expect( hasMultiSelection( state ) ).toBe( false ); @@ -1469,8 +1549,12 @@ describe( 'selectors', () => { it( 'should return true if multi-selection', () => { const state = { - selectionStart: { clientId: 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1' }, - selectionEnd: { clientId: '9db792c6-a25a-495d-adbd-97d56a4c4189' }, + selectionStart: { + clientId: 'afd1cb17-2c08-4e7a-91be-007ba7ddc3a1', + }, + selectionEnd: { + clientId: '9db792c6-a25a-495d-adbd-97d56a4c4189', + }, }; expect( hasMultiSelection( state ) ).toBe( true ); @@ -1811,7 +1895,9 @@ describe( 'selectors', () => { allowedBlockTypes: [], }, }; - expect( canInsertBlockType( state, 'core/test-block-a' ) ).toBe( false ); + expect( canInsertBlockType( state, 'core/test-block-a' ) ).toBe( + false + ); } ); it( 'should allow blocks that are allowed by the editor', () => { @@ -1825,7 +1911,9 @@ describe( 'selectors', () => { allowedBlockTypes: [ 'core/test-block-a' ], }, }; - expect( canInsertBlockType( state, 'core/test-block-a' ) ).toBe( true ); + expect( canInsertBlockType( state, 'core/test-block-a' ) ).toBe( + true + ); } ); it( 'should deny blocks when the editor has a template lock', () => { @@ -1839,7 +1927,9 @@ describe( 'selectors', () => { templateLock: 'all', }, }; - expect( canInsertBlockType( state, 'core/test-block-a' ) ).toBe( false ); + expect( canInsertBlockType( state, 'core/test-block-a' ) ).toBe( + false + ); } ); it( 'should deny blocks that restrict parent from being inserted into the root', () => { @@ -1851,7 +1941,9 @@ describe( 'selectors', () => { blockListSettings: {}, settings: {}, }; - expect( canInsertBlockType( state, 'core/test-block-c' ) ).toBe( false ); + expect( canInsertBlockType( state, 'core/test-block-c' ) ).toBe( + false + ); } ); it( 'should deny blocks that restrict parent from being inserted into a restricted parent', () => { @@ -1867,7 +1959,9 @@ describe( 'selectors', () => { blockListSettings: {}, settings: {}, }; - expect( canInsertBlockType( state, 'core/test-block-c', 'block1' ) ).toBe( false ); + expect( + canInsertBlockType( state, 'core/test-block-c', 'block1' ) + ).toBe( false ); } ); it( 'should allow blocks that restrict parent to be inserted into an allowed parent', () => { @@ -1883,7 +1977,9 @@ describe( 'selectors', () => { blockListSettings: {}, settings: {}, }; - expect( canInsertBlockType( state, 'core/test-block-c', 'block1' ) ).toBe( true ); + expect( + canInsertBlockType( state, 'core/test-block-c', 'block1' ) + ).toBe( true ); } ); it( 'should deny restricted blocks from being inserted into a block that restricts allowedBlocks', () => { @@ -1903,7 +1999,9 @@ describe( 'selectors', () => { }, settings: {}, }; - expect( canInsertBlockType( state, 'core/test-block-b', 'block1' ) ).toBe( false ); + expect( + canInsertBlockType( state, 'core/test-block-b', 'block1' ) + ).toBe( false ); } ); it( 'should allow allowed blocks to be inserted into a block that restricts allowedBlocks', () => { @@ -1923,7 +2021,9 @@ describe( 'selectors', () => { }, settings: {}, }; - expect( canInsertBlockType( state, 'core/test-block-b', 'block1' ) ).toBe( true ); + expect( + canInsertBlockType( state, 'core/test-block-b', 'block1' ) + ).toBe( true ); } ); it( 'should prioritise parent over allowedBlocks', () => { @@ -1943,7 +2043,9 @@ describe( 'selectors', () => { }, settings: {}, }; - expect( canInsertBlockType( state, 'core/test-block-c', 'block1' ) ).toBe( true ); + expect( + canInsertBlockType( state, 'core/test-block-c', 'block1' ) + ).toBe( true ); } ); it( 'should deny blocks that restrict parent to core/post-content when not in editor root', () => { @@ -1959,7 +2061,9 @@ describe( 'selectors', () => { blockListSettings: {}, settings: {}, }; - expect( canInsertBlockType( state, 'core/post-content-child', 'block1' ) ).toBe( false ); + expect( + canInsertBlockType( state, 'core/post-content-child', 'block1' ) + ).toBe( false ); } ); it( 'should allow blocks that restrict parent to core/post-content when in editor root', () => { @@ -1971,7 +2075,9 @@ describe( 'selectors', () => { blockListSettings: {}, settings: {}, }; - expect( canInsertBlockType( state, 'core/post-content-child' ) ).toBe( true ); + expect( + canInsertBlockType( state, 'core/post-content-child' ) + ).toBe( true ); } ); } ); @@ -2004,7 +2110,9 @@ describe( 'selectors', () => { blockListSettings: {}, }; const items = getInserterItems( state ); - const testBlockAItem = items.find( ( item ) => item.id === 'core/test-block-a' ); + const testBlockAItem = items.find( + ( item ) => item.id === 'core/test-block-a' + ); expect( testBlockAItem ).toEqual( { id: 'core/test-block-a', name: 'core/test-block-a', @@ -2015,11 +2123,14 @@ describe( 'selectors', () => { }, category: 'formatting', keywords: [ 'testing' ], + variations: [], isDisabled: false, utility: 0, frecency: 0, } ); - const reusableBlockItem = items.find( ( item ) => item.id === 'core/block/1' ); + const reusableBlockItem = items.find( + ( item ) => item.id === 'core/block/1' + ); expect( reusableBlockItem ).toEqual( { id: 'core/block/1', name: 'core/block', @@ -2071,7 +2182,9 @@ describe( 'selectors', () => { }, blockListSettings: {}, }; - const itemIDs = getInserterItems( state ).map( ( item ) => item.id ); + const itemIDs = getInserterItems( state ).map( + ( item ) => item.id + ); expect( itemIDs ).toEqual( [ 'core/post-content-child', 'core/block/2', @@ -2139,7 +2252,10 @@ describe( 'selectors', () => { }; const firstBlockFirstCall = getInserterItems( state, 'block3' ); - const firstBlockSecondCall = getInserterItems( stateSecondBlockRestricted, 'block3' ); + const firstBlockSecondCall = getInserterItems( + stateSecondBlockRestricted, + 'block3' + ); expect( firstBlockFirstCall ).toBe( firstBlockSecondCall ); expect( firstBlockFirstCall.map( ( item ) => item.id ) ).toEqual( [ 'core/test-block-b', @@ -2150,7 +2266,10 @@ describe( 'selectors', () => { ] ); const secondBlockFirstCall = getInserterItems( state, 'block4' ); - const secondBlockSecondCall = getInserterItems( stateSecondBlockRestricted, 'block4' ); + const secondBlockSecondCall = getInserterItems( + stateSecondBlockRestricted, + 'block4' + ); expect( secondBlockFirstCall.map( ( item ) => item.id ) ).toEqual( [ 'core/test-block-b', 'core/test-freeform', @@ -2158,16 +2277,19 @@ describe( 'selectors', () => { 'core/block/1', 'core/block/2', ] ); - expect( secondBlockSecondCall.map( ( item ) => item.id ) ).toEqual( [ - 'core/test-block-b', - ] ); + expect( + secondBlockSecondCall.map( ( item ) => item.id ) + ).toEqual( [ 'core/test-block-b' ] ); } ); it( 'should set isDisabled when a block with `multiple: false` has been used', () => { const state = { blocks: { byClientId: { - block1: { clientId: 'block1', name: 'core/test-block-b' }, + block1: { + clientId: 'block1', + name: 'core/test-block-b', + }, }, attributes: { block1: { attribute: {} }, @@ -2186,7 +2308,9 @@ describe( 'selectors', () => { settings: {}, }; const items = getInserterItems( state ); - const testBlockBItem = items.find( ( item ) => item.id === 'core/test-block-b' ); + const testBlockBItem = items.find( + ( item ) => item.id === 'core/test-block-b' + ); expect( testBlockBItem.isDisabled ).toBe( true ); } ); @@ -2206,7 +2330,9 @@ describe( 'selectors', () => { settings: {}, }; const items = getInserterItems( state ); - const testBlockBItem = items.find( ( item ) => item.id === 'core/test-block-b' ); + const testBlockBItem = items.find( + ( item ) => item.id === 'core/test-block-b' + ); expect( testBlockBItem.utility ).toBe( INSERTER_UTILITY_LOW ); } ); @@ -2228,8 +2354,12 @@ describe( 'selectors', () => { settings: {}, }; const items = getInserterItems( state ); - const reusableBlock2Item = items.find( ( item ) => item.id === 'core/test-block-b' ); - expect( reusableBlock2Item.utility ).toBe( INSERTER_UTILITY_MEDIUM ); + const reusableBlock2Item = items.find( + ( item ) => item.id === 'core/test-block-b' + ); + expect( reusableBlock2Item.utility ).toBe( + INSERTER_UTILITY_MEDIUM + ); expect( reusableBlock2Item.frecency ).toBe( 2.5 ); } ); @@ -2259,7 +2389,9 @@ describe( 'selectors', () => { settings: {}, }; const items = getInserterItems( state, 'block1' ); - const testBlockCItem = items.find( ( item ) => item.id === 'core/test-block-c' ); + const testBlockCItem = items.find( + ( item ) => item.id === 'core/test-block-c' + ); expect( testBlockCItem.utility ).toBe( INSERTER_UTILITY_HIGH ); } ); } ); @@ -2365,7 +2497,9 @@ describe( 'selectors', () => { blockListSettings: {}, }; - expect( getBlockListSettings( state, 'chicken' ) ).toBe( undefined ); + expect( getBlockListSettings( state, 'chicken' ) ).toBe( + undefined + ); } ); } ); @@ -2390,9 +2524,17 @@ describe( 'selectors', () => { }, }; - const targetBlocksClientIds = [ 'test-1-dummy-clientId', 'test-3-dummy-clientId' ]; + const targetBlocksClientIds = [ + 'test-1-dummy-clientId', + 'test-3-dummy-clientId', + ]; - expect( __experimentalGetBlockListSettingsForBlocks( state, targetBlocksClientIds ) ).toEqual( [ + expect( + __experimentalGetBlockListSettingsForBlocks( + state, + targetBlocksClientIds + ) + ).toEqual( [ { setting1: false, }, @@ -2417,9 +2559,17 @@ describe( 'selectors', () => { }, }; - const targetBlocksClientIds = [ 'test-1-dummy-clientId', 'test-3-dummy-clientId' ]; + const targetBlocksClientIds = [ + 'test-1-dummy-clientId', + 'test-3-dummy-clientId', + ]; - expect( __experimentalGetBlockListSettingsForBlocks( state, targetBlocksClientIds ) ).toEqual( [] ); + expect( + __experimentalGetBlockListSettingsForBlocks( + state, + targetBlocksClientIds + ) + ).toEqual( [] ); } ); } ); @@ -2464,7 +2614,9 @@ describe( 'selectors', () => { selectionEnd: {}, }; - expect( getLowestCommonAncestorWithSelectedBlock( state, 'd' ) ).not.toBeDefined(); + expect( + getLowestCommonAncestorWithSelectedBlock( state, 'd' ) + ).not.toBeDefined(); } ); it( 'should not be defined if selected block has no parent', () => { @@ -2474,7 +2626,9 @@ describe( 'selectors', () => { selectionEnd: { clientId: 'b' }, }; - expect( getLowestCommonAncestorWithSelectedBlock( state, 'b' ) ).toBe( 'b' ); + expect( + getLowestCommonAncestorWithSelectedBlock( state, 'b' ) + ).toBe( 'b' ); } ); it( 'should not be defined if selected block has no common parent with given block', () => { @@ -2484,7 +2638,9 @@ describe( 'selectors', () => { selectionEnd: { clientId: 'd' }, }; - expect( getLowestCommonAncestorWithSelectedBlock( state, 'f' ) ).not.toBeDefined(); + expect( + getLowestCommonAncestorWithSelectedBlock( state, 'f' ) + ).not.toBeDefined(); } ); it( 'should return block id if selected block is ancestor of given block', () => { @@ -2494,7 +2650,9 @@ describe( 'selectors', () => { selectionEnd: { clientId: 'c' }, }; - expect( getLowestCommonAncestorWithSelectedBlock( state, 'a' ) ).toBe( 'a' ); + expect( + getLowestCommonAncestorWithSelectedBlock( state, 'a' ) + ).toBe( 'a' ); } ); it( 'should return block id if selected block is nested child of given block', () => { @@ -2504,7 +2662,9 @@ describe( 'selectors', () => { selectionEnd: { clientId: 'e' }, }; - expect( getLowestCommonAncestorWithSelectedBlock( state, 'a' ) ).toBe( 'a' ); + expect( + getLowestCommonAncestorWithSelectedBlock( state, 'a' ) + ).toBe( 'a' ); } ); it( 'should return block id if selected block has common parent with given block', () => { @@ -2514,7 +2674,9 @@ describe( 'selectors', () => { selectionEnd: { clientId: 'e' }, }; - expect( getLowestCommonAncestorWithSelectedBlock( state, 'c' ) ).toBe( 'a' ); + expect( + getLowestCommonAncestorWithSelectedBlock( state, 'c' ) + ).toBe( 'a' ); } ); } ); } ); diff --git a/packages/block-editor/src/style.scss b/packages/block-editor/src/style.scss index b1e2406d94cc0..d170399ed8af6 100644 --- a/packages/block-editor/src/style.scss +++ b/packages/block-editor/src/style.scss @@ -8,13 +8,13 @@ @import "./components/block-mobile-toolbar/style.scss"; @import "./components/block-mover/style.scss"; @import "./components/block-navigation/style.scss"; -@import "./components/block-pattern-picker/style.scss"; @import "./components/block-preview/style.scss"; @import "./components/block-settings-menu/style.scss"; @import "./components/block-styles/style.scss"; @import "./components/block-switcher/style.scss"; @import "./components/block-toolbar/style.scss"; @import "./components/block-types-list/style.scss"; +@import "./components/block-variation-picker/style.scss"; @import "./components/button-block-appender/style.scss"; @import "./components/colors-gradients/style.scss"; @import "./components/contrast-checker/style.scss"; diff --git a/packages/block-editor/src/utils/dom.js b/packages/block-editor/src/utils/dom.js index 9f693a6bba275..3fb25425678ab 100644 --- a/packages/block-editor/src/utils/dom.js +++ b/packages/block-editor/src/utils/dom.js @@ -43,7 +43,10 @@ export function isBlockFocusStop( element ) { * @return {boolean} Whether elements are in the same block. */ export function isInSameBlock( a, b ) { - return a.closest( '.block-editor-block-list__block' ) === b.closest( '.block-editor-block-list__block' ); + return ( + a.closest( '.block-editor-block-list__block' ) === + b.closest( '.block-editor-block-list__block' ) + ); } /** @@ -55,9 +58,12 @@ export function isInSameBlock( a, b ) { * @return {boolean} Whether element is in the block Element but not its children. */ export function isInsideRootBlock( blockElement, element ) { - const innerBlocksContainer = blockElement.querySelector( '.block-editor-block-list__layout' ); - return blockElement.contains( element ) && ( - ! innerBlocksContainer || ! innerBlocksContainer.contains( element ) + const innerBlocksContainer = blockElement.querySelector( + '.block-editor-block-list__layout' + ); + return ( + blockElement.contains( element ) && + ( ! innerBlocksContainer || ! innerBlocksContainer.contains( element ) ) ); } diff --git a/packages/block-editor/src/utils/get-paste-event-data.js b/packages/block-editor/src/utils/get-paste-event-data.js index 20211ec336d60..7b798887c76b0 100644 --- a/packages/block-editor/src/utils/get-paste-event-data.js +++ b/packages/block-editor/src/utils/get-paste-event-data.js @@ -56,7 +56,9 @@ export function getPasteEventData( { clipboardData } ) { } } ); - files = files.filter( ( { type } ) => /^image\/(?:jpe?g|png|gif)$/.test( type ) ); + files = files.filter( ( { type } ) => + /^image\/(?:jpe?g|png|gif)$/.test( type ) + ); // Only process files if no HTML is present. // A pasted file may have the URL as plain text. diff --git a/packages/block-editor/src/utils/test/dom.js b/packages/block-editor/src/utils/test/dom.js index 69e740f629f48..b755f74bcb899 100644 --- a/packages/block-editor/src/utils/test/dom.js +++ b/packages/block-editor/src/utils/test/dom.js @@ -6,13 +6,12 @@ import { hasInnerBlocksContext } from '../dom'; describe( 'hasInnerBlocksContext()', () => { it( 'should return false for a block node which has no inner blocks', () => { const wrapper = document.createElement( 'div' ); - wrapper.innerHTML = ( + wrapper.innerHTML = '
        ' + '
        ' + '

        This is a test.

        ' + '
        ' + - '
        ' - ); + '
        '; const blockNode = wrapper.firstChild; expect( hasInnerBlocksContext( blockNode ) ).toBe( false ); @@ -20,7 +19,7 @@ describe( 'hasInnerBlocksContext()', () => { it( 'should return true for a block node which contains inner blocks', () => { const wrapper = document.createElement( 'div' ); - wrapper.innerHTML = ( + wrapper.innerHTML = '
        ' + '
        ' + '
        ' + @@ -28,8 +27,7 @@ describe( 'hasInnerBlocksContext()', () => { '
        ' + '
        ' + '
        ' + - '
        ' - ); + '
        '; const blockNode = wrapper.firstChild; expect( hasInnerBlocksContext( blockNode ) ).toBe( true ); diff --git a/packages/block-editor/src/utils/transform-styles/ast/parse.js b/packages/block-editor/src/utils/transform-styles/ast/parse.js index 11e8d22a37847..d3746488fc1fe 100644 --- a/packages/block-editor/src/utils/transform-styles/ast/parse.js +++ b/packages/block-editor/src/utils/transform-styles/ast/parse.js @@ -67,7 +67,9 @@ export default function( css, options ) { const errorsList = []; function error( msg ) { - const err = new Error( options.source + ':' + lineno + ':' + column + ': ' + msg ); + const err = new Error( + options.source + ':' + lineno + ':' + column + ': ' + msg + ); err.reason = msg; err.filename = options.source; err.line = lineno; @@ -123,7 +125,11 @@ export default function( css, options ) { const accumulator = []; whitespace(); comments( accumulator ); - while ( css.length && css.charAt( 0 ) !== '}' && ( node = atrule() || rule() ) ) { + while ( + css.length && + css.charAt( 0 ) !== '}' && + ( node = atrule() || rule() ) + ) { if ( node !== false ) { accumulator.push( node ); comments( accumulator ); @@ -163,7 +169,7 @@ export default function( css, options ) { let c; accumulator = accumulator || []; // eslint-disable-next-line no-cond-assign - while ( c = comment() ) { + while ( ( c = comment() ) ) { if ( c !== false ) { accumulator.push( c ); } @@ -182,7 +188,10 @@ export default function( css, options ) { } let i = 2; - while ( '' !== css.charAt( i ) && ( '*' !== css.charAt( i ) || '/' !== css.charAt( i + 1 ) ) ) { + while ( + '' !== css.charAt( i ) && + ( '*' !== css.charAt( i ) || '/' !== css.charAt( i + 1 ) ) + ) { ++i; } i += 2; @@ -244,7 +253,9 @@ export default function( css, options ) { } // val - const val = match( /^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^\)]*?\)|[^};])+)/ ); + const val = match( + /^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^\)]*?\)|[^};])+)/ + ); const ret = pos( { type: 'declaration', @@ -273,7 +284,7 @@ export default function( css, options ) { // declarations let decl; // eslint-disable-next-line no-cond-assign - while ( decl = declaration() ) { + while ( ( decl = declaration() ) ) { if ( decl !== false ) { decls.push( decl ); comments( decls ); @@ -296,7 +307,7 @@ export default function( css, options ) { const pos = position(); // eslint-disable-next-line no-cond-assign - while ( m = match( /^((\d+\.\d+|\.\d+|\d+)%?|[a-z]+)\s*/ ) ) { + while ( ( m = match( /^((\d+\.\d+|\.\d+|\d+)%?|[a-z]+)\s*/ ) ) ) { vals.push( m[ 1 ] ); match( /^,\s*/ ); } @@ -339,7 +350,7 @@ export default function( css, options ) { let frame; let frames = comments(); // eslint-disable-next-line no-cond-assign - while ( frame = keyframe() ) { + while ( ( frame = keyframe() ) ) { frames.push( frame ); frames = frames.concat( comments() ); } @@ -483,7 +494,7 @@ export default function( css, options ) { // declarations let decl; // eslint-disable-next-line no-cond-assign - while ( decl = declaration() ) { + while ( ( decl = declaration() ) ) { decls.push( decl ); decls = decls.concat( comments() ); } @@ -550,7 +561,7 @@ export default function( css, options ) { // declarations let decl; // eslint-disable-next-line no-cond-assign - while ( decl = declaration() ) { + while ( ( decl = declaration() ) ) { decls.push( decl ); decls = decls.concat( comments() ); } @@ -610,17 +621,19 @@ export default function( css, options ) { return; } - return atkeyframes() || - atmedia() || - atcustommedia() || - atsupports() || - atimport() || - atcharset() || - atnamespace() || - atdocument() || - atpage() || - athost() || - atfontface(); + return ( + atkeyframes() || + atmedia() || + atcustommedia() || + atsupports() || + atimport() || + atcharset() || + atnamespace() || + atdocument() || + atpage() || + athost() || + atfontface() + ); } /** diff --git a/packages/block-editor/src/utils/transform-styles/ast/stringify/compress.js b/packages/block-editor/src/utils/transform-styles/ast/stringify/compress.js index 6b3f0468c5ad6..7c9cf56ce3863 100644 --- a/packages/block-editor/src/utils/transform-styles/ast/stringify/compress.js +++ b/packages/block-editor/src/utils/transform-styles/ast/stringify/compress.js @@ -36,9 +36,7 @@ inherits( Compiler, Base ); */ Compiler.prototype.compile = function( node ) { - return node.stylesheet - .rules.map( this.visit, this ) - .join( '' ); + return node.stylesheet.rules.map( this.visit, this ).join( '' ); }; /** @@ -62,10 +60,12 @@ Compiler.prototype.import = function( node ) { */ Compiler.prototype.media = function( node ) { - return this.emit( '@media ' + node.media, node.position ) + - this.emit( '{' ) + - this.mapVisit( node.rules ) + - this.emit( '}' ); + return ( + this.emit( '@media ' + node.media, node.position ) + + this.emit( '{' ) + + this.mapVisit( node.rules ) + + this.emit( '}' ) + ); }; /** @@ -75,10 +75,12 @@ Compiler.prototype.media = function( node ) { Compiler.prototype.document = function( node ) { const doc = '@' + ( node.vendor || '' ) + 'document ' + node.document; - return this.emit( doc, node.position ) + - this.emit( '{' ) + - this.mapVisit( node.rules ) + - this.emit( '}' ); + return ( + this.emit( doc, node.position ) + + this.emit( '{' ) + + this.mapVisit( node.rules ) + + this.emit( '}' ) + ); }; /** @@ -102,10 +104,12 @@ Compiler.prototype.namespace = function( node ) { */ Compiler.prototype.supports = function( node ) { - return this.emit( '@supports ' + node.supports, node.position ) + - this.emit( '{' ) + - this.mapVisit( node.rules ) + - this.emit( '}' ); + return ( + this.emit( '@supports ' + node.supports, node.position ) + + this.emit( '{' ) + + this.mapVisit( node.rules ) + + this.emit( '}' ) + ); }; /** @@ -113,13 +117,15 @@ Compiler.prototype.supports = function( node ) { */ Compiler.prototype.keyframes = function( node ) { - return this.emit( '@' + - ( node.vendor || '' ) + - 'keyframes ' + - node.name, node.position ) + - this.emit( '{' ) + - this.mapVisit( node.keyframes ) + - this.emit( '}' ); + return ( + this.emit( + '@' + ( node.vendor || '' ) + 'keyframes ' + node.name, + node.position + ) + + this.emit( '{' ) + + this.mapVisit( node.keyframes ) + + this.emit( '}' ) + ); }; /** @@ -129,10 +135,12 @@ Compiler.prototype.keyframes = function( node ) { Compiler.prototype.keyframe = function( node ) { const decls = node.declarations; - return this.emit( node.values.join( ',' ), node.position ) + - this.emit( '{' ) + - this.mapVisit( decls ) + - this.emit( '}' ); + return ( + this.emit( node.values.join( ',' ), node.position ) + + this.emit( '{' ) + + this.mapVisit( decls ) + + this.emit( '}' ) + ); }; /** @@ -140,14 +148,14 @@ Compiler.prototype.keyframe = function( node ) { */ Compiler.prototype.page = function( node ) { - const sel = node.selectors.length ? - node.selectors.join( ', ' ) : - ''; + const sel = node.selectors.length ? node.selectors.join( ', ' ) : ''; - return this.emit( '@page ' + sel, node.position ) + - this.emit( '{' ) + - this.mapVisit( node.declarations ) + - this.emit( '}' ); + return ( + this.emit( '@page ' + sel, node.position ) + + this.emit( '{' ) + + this.mapVisit( node.declarations ) + + this.emit( '}' ) + ); }; /** @@ -155,10 +163,12 @@ Compiler.prototype.page = function( node ) { */ Compiler.prototype[ 'font-face' ] = function( node ) { - return this.emit( '@font-face', node.position ) + - this.emit( '{' ) + - this.mapVisit( node.declarations ) + - this.emit( '}' ); + return ( + this.emit( '@font-face', node.position ) + + this.emit( '{' ) + + this.mapVisit( node.declarations ) + + this.emit( '}' ) + ); }; /** @@ -166,10 +176,12 @@ Compiler.prototype[ 'font-face' ] = function( node ) { */ Compiler.prototype.host = function( node ) { - return this.emit( '@host', node.position ) + - this.emit( '{' ) + - this.mapVisit( node.rules ) + - this.emit( '}' ); + return ( + this.emit( '@host', node.position ) + + this.emit( '{' ) + + this.mapVisit( node.rules ) + + this.emit( '}' ) + ); }; /** @@ -177,7 +189,10 @@ Compiler.prototype.host = function( node ) { */ Compiler.prototype[ 'custom-media' ] = function( node ) { - return this.emit( '@custom-media ' + node.name + ' ' + node.media + ';', node.position ); + return this.emit( + '@custom-media ' + node.name + ' ' + node.media + ';', + node.position + ); }; /** @@ -190,10 +205,12 @@ Compiler.prototype.rule = function( node ) { return ''; } - return this.emit( node.selectors.join( ',' ), node.position ) + - this.emit( '{' ) + - this.mapVisit( decls ) + - this.emit( '}' ); + return ( + this.emit( node.selectors.join( ',' ), node.position ) + + this.emit( '{' ) + + this.mapVisit( decls ) + + this.emit( '}' ) + ); }; /** @@ -201,5 +218,8 @@ Compiler.prototype.rule = function( node ) { */ Compiler.prototype.declaration = function( node ) { - return this.emit( node.property + ':' + node.value, node.position ) + this.emit( ';' ); + return ( + this.emit( node.property + ':' + node.value, node.position ) + + this.emit( ';' ) + ); }; diff --git a/packages/block-editor/src/utils/transform-styles/ast/stringify/identity.js b/packages/block-editor/src/utils/transform-styles/ast/stringify/identity.js index cc15526e14946..ceb711a8dbc71 100644 --- a/packages/block-editor/src/utils/transform-styles/ast/stringify/identity.js +++ b/packages/block-editor/src/utils/transform-styles/ast/stringify/identity.js @@ -56,7 +56,10 @@ Compiler.prototype.stylesheet = function( node ) { */ Compiler.prototype.comment = function( node ) { - return this.emit( this.indent() + '/*' + node.comment + '*/', node.position ); + return this.emit( + this.indent() + '/*' + node.comment + '*/', + node.position + ); }; /** @@ -74,14 +77,9 @@ Compiler.prototype.import = function( node ) { Compiler.prototype.media = function( node ) { return ( this.emit( '@media ' + node.media, node.position ) + - this.emit( - ' {\n' + this.indent( 1 ) - ) + + this.emit( ' {\n' + this.indent( 1 ) ) + this.mapVisit( node.rules, '\n\n' ) + - this.emit( - this.indent( -1 ) + - '\n}' - ) + this.emit( this.indent( -1 ) + '\n}' ) ); }; @@ -94,16 +92,9 @@ Compiler.prototype.document = function( node ) { return ( this.emit( doc, node.position ) + - this.emit( - ' ' + - ' {\n' + - this.indent( 1 ) - ) + + this.emit( ' ' + ' {\n' + this.indent( 1 ) ) + this.mapVisit( node.rules, '\n\n' ) + - this.emit( - this.indent( -1 ) + - '\n}' - ) + this.emit( this.indent( -1 ) + '\n}' ) ); }; @@ -130,15 +121,9 @@ Compiler.prototype.namespace = function( node ) { Compiler.prototype.supports = function( node ) { return ( this.emit( '@supports ' + node.supports, node.position ) + - this.emit( - ' {\n' + - this.indent( 1 ) - ) + + this.emit( ' {\n' + this.indent( 1 ) ) + this.mapVisit( node.rules, '\n\n' ) + - this.emit( - this.indent( -1 ) + - '\n}' - ) + this.emit( this.indent( -1 ) + '\n}' ) ); }; @@ -148,16 +133,13 @@ Compiler.prototype.supports = function( node ) { Compiler.prototype.keyframes = function( node ) { return ( - this.emit( '@' + ( node.vendor || '' ) + 'keyframes ' + node.name, node.position ) + this.emit( - ' {\n' + - this.indent( 1 ) + '@' + ( node.vendor || '' ) + 'keyframes ' + node.name, + node.position ) + + this.emit( ' {\n' + this.indent( 1 ) ) + this.mapVisit( node.keyframes, '\n' ) + - this.emit( - this.indent( -1 ) + - '}' - ) + this.emit( this.indent( -1 ) + '}' ) ); }; @@ -171,16 +153,9 @@ Compiler.prototype.keyframe = function( node ) { return ( this.emit( this.indent() ) + this.emit( node.values.join( ', ' ), node.position ) + - this.emit( - ' {\n' + - this.indent( 1 ) - ) + + this.emit( ' {\n' + this.indent( 1 ) ) + this.mapVisit( decls, '\n' ) + - this.emit( - this.indent( -1 ) + - '\n' + - this.indent() + '}\n' - ) + this.emit( this.indent( -1 ) + '\n' + this.indent() + '}\n' ) ); }; @@ -189,16 +164,16 @@ Compiler.prototype.keyframe = function( node ) { */ Compiler.prototype.page = function( node ) { - const sel = node.selectors.length ? - node.selectors.join( ', ' ) + ' ' : - ''; - - return this.emit( '@page ' + sel, node.position ) + - this.emit( '{\n' ) + - this.emit( this.indent( 1 ) ) + - this.mapVisit( node.declarations, '\n' ) + - this.emit( this.indent( -1 ) ) + - this.emit( '\n}' ); + const sel = node.selectors.length ? node.selectors.join( ', ' ) + ' ' : ''; + + return ( + this.emit( '@page ' + sel, node.position ) + + this.emit( '{\n' ) + + this.emit( this.indent( 1 ) ) + + this.mapVisit( node.declarations, '\n' ) + + this.emit( this.indent( -1 ) ) + + this.emit( '\n}' ) + ); }; /** @@ -206,12 +181,14 @@ Compiler.prototype.page = function( node ) { */ Compiler.prototype[ 'font-face' ] = function( node ) { - return this.emit( '@font-face ', node.position ) + - this.emit( '{\n' ) + - this.emit( this.indent( 1 ) ) + - this.mapVisit( node.declarations, '\n' ) + - this.emit( this.indent( -1 ) ) + - this.emit( '\n}' ); + return ( + this.emit( '@font-face ', node.position ) + + this.emit( '{\n' ) + + this.emit( this.indent( 1 ) ) + + this.mapVisit( node.declarations, '\n' ) + + this.emit( this.indent( -1 ) ) + + this.emit( '\n}' ) + ); }; /** @@ -221,15 +198,9 @@ Compiler.prototype[ 'font-face' ] = function( node ) { Compiler.prototype.host = function( node ) { return ( this.emit( '@host', node.position ) + - this.emit( - ' {\n' + - this.indent( 1 ) - ) + + this.emit( ' {\n' + this.indent( 1 ) ) + this.mapVisit( node.rules, '\n\n' ) + - this.emit( - this.indent( -1 ) + - '\n}' - ) + this.emit( this.indent( -1 ) + '\n}' ) ); }; @@ -238,7 +209,10 @@ Compiler.prototype.host = function( node ) { */ Compiler.prototype[ 'custom-media' ] = function( node ) { - return this.emit( '@custom-media ' + node.name + ' ' + node.media + ';', node.position ); + return this.emit( + '@custom-media ' + node.name + ' ' + node.media + ';', + node.position + ); }; /** @@ -252,14 +226,21 @@ Compiler.prototype.rule = function( node ) { return ''; } - return this.emit( node.selectors.map( function( s ) { - return indent + s; - } ).join( ',\n' ), node.position ) + - this.emit( ' {\n' ) + - this.emit( this.indent( 1 ) ) + - this.mapVisit( decls, '\n' ) + - this.emit( this.indent( -1 ) ) + - this.emit( '\n' + this.indent() + '}' ); + return ( + this.emit( + node.selectors + .map( function( s ) { + return indent + s; + } ) + .join( ',\n' ), + node.position + ) + + this.emit( ' {\n' ) + + this.emit( this.indent( 1 ) ) + + this.mapVisit( decls, '\n' ) + + this.emit( this.indent( -1 ) ) + + this.emit( '\n' + this.indent() + '}' ) + ); }; /** @@ -267,9 +248,11 @@ Compiler.prototype.rule = function( node ) { */ Compiler.prototype.declaration = function( node ) { - return this.emit( this.indent() ) + - this.emit( node.property + ': ' + node.value, node.position ) + - this.emit( ';' ); + return ( + this.emit( this.indent() ) + + this.emit( node.property + ': ' + node.value, node.position ) + + this.emit( ';' ) + ); }; /** diff --git a/packages/block-editor/src/utils/transform-styles/ast/stringify/index.js b/packages/block-editor/src/utils/transform-styles/ast/stringify/index.js index 2dcc4d4475f02..a326ce1e54b13 100644 --- a/packages/block-editor/src/utils/transform-styles/ast/stringify/index.js +++ b/packages/block-editor/src/utils/transform-styles/ast/stringify/index.js @@ -23,9 +23,9 @@ import Identity from './identity'; export default function( node, options ) { options = options || {}; - const compiler = options.compress ? - new Compressed( options ) : - new Identity( options ); + const compiler = options.compress + ? new Compressed( options ) + : new Identity( options ); const code = compiler.compile( node ); return code; diff --git a/packages/block-editor/src/utils/transform-styles/test/traverse.js b/packages/block-editor/src/utils/transform-styles/test/traverse.js index 50d6d8da95bc3..bb1be2635fe53 100644 --- a/packages/block-editor/src/utils/transform-styles/test/traverse.js +++ b/packages/block-editor/src/utils/transform-styles/test/traverse.js @@ -10,7 +10,9 @@ describe( 'CSS traverse', () => { if ( node.type === 'rule' ) { return { ...node, - selectors: node.selectors.map( ( selector ) => 'namespace ' + selector ), + selectors: node.selectors.map( + ( selector ) => 'namespace ' + selector + ), }; } diff --git a/packages/block-editor/src/utils/transform-styles/transforms/url-rewrite.js b/packages/block-editor/src/utils/transform-styles/transforms/url-rewrite.js index 4516fffa2196d..4e0d07e4083d7 100644 --- a/packages/block-editor/src/utils/transform-styles/transforms/url-rewrite.js +++ b/packages/block-editor/src/utils/transform-styles/transforms/url-rewrite.js @@ -34,7 +34,10 @@ function isAbsolutePath( filePath ) { */ function isValidURL( meta ) { // ignore hashes or data uris - if ( meta.value.indexOf( 'data:' ) === 0 || meta.value.indexOf( '#' ) === 0 ) { + if ( + meta.value.indexOf( 'data:' ) === 0 || + meta.value.indexOf( '#' ) === 0 + ) { return false; } diff --git a/packages/block-editor/src/utils/transform-styles/transforms/wrap.js b/packages/block-editor/src/utils/transform-styles/transforms/wrap.js index d7fe709138fa8..e9cfafac5740f 100644 --- a/packages/block-editor/src/utils/transform-styles/transforms/wrap.js +++ b/packages/block-editor/src/utils/transform-styles/transforms/wrap.js @@ -15,9 +15,11 @@ const wrap = ( namespace, ignore = [] ) => ( node ) => { } // Anything other than a root tag is always prefixed. - {if ( ! selector.match( IS_ROOT_TAG ) ) { - return namespace + ' ' + selector; - }} + { + if ( ! selector.match( IS_ROOT_TAG ) ) { + return namespace + ' ' + selector; + } + } // HTML and Body elements cannot be contained within our container so lets extract their styles. return selector.replace( /^(body|html|:root)/, namespace ); diff --git a/packages/block-library/package.json b/packages/block-library/package.json index 4bd0926814895..1a99a38df771f 100644 --- a/packages/block-library/package.json +++ b/packages/block-library/package.json @@ -24,7 +24,7 @@ "build-style/**" ], "dependencies": { - "@babel/runtime": "^7.4.4", + "@babel/runtime": "^7.8.3", "@wordpress/a11y": "file:../a11y", "@wordpress/api-fetch": "file:../api-fetch", "@wordpress/autop": "file:../autop", @@ -37,10 +37,12 @@ "@wordpress/data": "file:../data", "@wordpress/date": "file:../date", "@wordpress/deprecated": "file:../deprecated", + "@wordpress/dom": "file:../dom", "@wordpress/editor": "file:../editor", "@wordpress/element": "file:../element", "@wordpress/escape-html": "file:../escape-html", "@wordpress/i18n": "file:../i18n", + "@wordpress/icons": "file:../icons", "@wordpress/is-shallow-equal": "file:../is-shallow-equal", "@wordpress/keycodes": "file:../keycodes", "@wordpress/rich-text": "file:../rich-text", diff --git a/packages/block-library/src/archives/edit.js b/packages/block-library/src/archives/edit.js index 6909b70ccc427..8223111736c63 100644 --- a/packages/block-library/src/archives/edit.js +++ b/packages/block-library/src/archives/edit.js @@ -1,11 +1,7 @@ /** * WordPress dependencies */ -import { - PanelBody, - ToggleControl, - Disabled, -} from '@wordpress/components'; +import { PanelBody, ToggleControl, Disabled } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; import { InspectorControls } from '@wordpress/block-editor'; import ServerSideRender from '@wordpress/server-side-render'; @@ -16,21 +12,32 @@ export default function ArchivesEdit( { attributes, setAttributes } ) { return ( <> - + setAttributes( { displayAsDropdown: ! displayAsDropdown } ) } + onChange={ () => + setAttributes( { + displayAsDropdown: ! displayAsDropdown, + } ) + } /> setAttributes( { showPostCounts: ! showPostCounts } ) } + onChange={ () => + setAttributes( { + showPostCounts: ! showPostCounts, + } ) + } /> - + ); diff --git a/packages/block-library/src/archives/icon.js b/packages/block-library/src/archives/icon.js deleted file mode 100644 index 074a16c79458f..0000000000000 --- a/packages/block-library/src/archives/icon.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * WordPress dependencies - */ -import { Path, SVG } from '@wordpress/components'; - -export default ( - -); diff --git a/packages/block-library/src/archives/index.js b/packages/block-library/src/archives/index.js index aa4c172ddedf6..ef8f1c484d15d 100644 --- a/packages/block-library/src/archives/index.js +++ b/packages/block-library/src/archives/index.js @@ -2,12 +2,12 @@ * WordPress dependencies */ import { __ } from '@wordpress/i18n'; +import { archive as icon } from '@wordpress/icons'; /** * Internal dependencies */ import edit from './edit'; -import icon from './icon'; export const name = 'core/archives'; diff --git a/packages/block-library/src/audio/deprecated.js b/packages/block-library/src/audio/deprecated.js index 733591bde0060..075a173db4452 100644 --- a/packages/block-library/src/audio/deprecated.js +++ b/packages/block-library/src/audio/deprecated.js @@ -47,8 +47,19 @@ export default [ return (
        -
        ); }, diff --git a/packages/block-library/src/audio/edit.js b/packages/block-library/src/audio/edit.js index 33c5828990eb3..d9970ecd93dbf 100644 --- a/packages/block-library/src/audio/edit.js +++ b/packages/block-library/src/audio/edit.js @@ -21,11 +21,7 @@ import { import { Component } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { withSelect } from '@wordpress/data'; - -/** - * Internal dependencies - */ -import icon from './icon'; +import { audio as icon } from '@wordpress/icons'; /** * Internal dependencies @@ -84,9 +80,9 @@ class AudioEdit extends Component { // the editing UI. if ( newSrc !== src ) { // Check if there's an embed block that handles this URL. - const embedBlock = createUpgradedEmbedBlock( - { attributes: { url: newSrc } } - ); + const embedBlock = createUpgradedEmbedBlock( { + attributes: { url: newSrc }, + } ); if ( undefined !== embedBlock ) { this.props.onReplace( embedBlock ); return; @@ -102,7 +98,11 @@ class AudioEdit extends Component { } getAutoplayHelp( checked ) { - return checked ? __( 'Note: Autoplaying audio may cause usability issues for some visitors.' ) : null; + return checked + ? __( + 'Note: Autoplaying audio may cause usability issues for some visitors.' + ) + : null; } render() { @@ -148,7 +148,7 @@ class AudioEdit extends Component { /> - + setAttributes( { preload: ( 'none' !== value ) ? value : undefined } ) } + onChange={ ( value ) => + setAttributes( { + preload: + 'none' !== value ? value : undefined, + } ) + } options={ [ { value: 'auto', label: __( 'Auto' ) }, { value: 'metadata', label: __( 'Metadata' ) }, @@ -186,7 +191,9 @@ class AudioEdit extends Component { tagName="figcaption" placeholder={ __( 'Write caption…' ) } value={ caption } - onChange={ ( value ) => setAttributes( { caption: value } ) } + onChange={ ( value ) => + setAttributes( { caption: value } ) + } inlineToolbar /> ) } diff --git a/packages/block-library/src/audio/icon.js b/packages/block-library/src/audio/icon.js deleted file mode 100644 index 4b871506bf478..0000000000000 --- a/packages/block-library/src/audio/icon.js +++ /dev/null @@ -1,6 +0,0 @@ -/** - * WordPress dependencies - */ -import { Path, SVG } from '@wordpress/components'; - -export default ; diff --git a/packages/block-library/src/audio/index.js b/packages/block-library/src/audio/index.js index 63013808a0439..2946d5eca61bc 100644 --- a/packages/block-library/src/audio/index.js +++ b/packages/block-library/src/audio/index.js @@ -2,13 +2,13 @@ * WordPress dependencies */ import { __ } from '@wordpress/i18n'; +import { audio as icon } from '@wordpress/icons'; /** * Internal dependencies */ import deprecated from './deprecated'; import edit from './edit'; -import icon from './icon'; import metadata from './block.json'; import save from './save'; import transforms from './transforms'; @@ -20,7 +20,12 @@ export { metadata, name }; export const settings = { title: __( 'Audio' ), description: __( 'Embed a simple audio player.' ), - keywords: [ __( 'music' ), __( 'sound' ), __( 'podcast' ), __( 'recording' ) ], + keywords: [ + __( 'music' ), + __( 'sound' ), + __( 'podcast' ), + __( 'recording' ), + ], icon, transforms, deprecated, diff --git a/packages/block-library/src/audio/save.js b/packages/block-library/src/audio/save.js index c8370c6b7d66e..f88eb0bba52e0 100644 --- a/packages/block-library/src/audio/save.js +++ b/packages/block-library/src/audio/save.js @@ -6,10 +6,20 @@ import { RichText } from '@wordpress/block-editor'; export default function save( { attributes } ) { const { autoplay, caption, loop, preload, src } = attributes; - return src && ( -
        -
        + return ( + src && ( +
        +
        + ) ); } diff --git a/packages/block-library/src/audio/transforms.js b/packages/block-library/src/audio/transforms.js index 01396eda20dff..3a61af6807cc5 100644 --- a/packages/block-library/src/audio/transforms.js +++ b/packages/block-library/src/audio/transforms.js @@ -9,7 +9,10 @@ const transforms = { { type: 'files', isMatch( files ) { - return files.length === 1 && files[ 0 ].type.indexOf( 'audio/' ) === 0; + return ( + files.length === 1 && + files[ 0 ].type.indexOf( 'audio/' ) === 0 + ); }, transform( files ) { const file = files[ 0 ]; diff --git a/packages/block-library/src/block/edit-panel/editor.scss b/packages/block-library/src/block/edit-panel/editor.scss index 12c2bcfc1ef8f..2119531329192 100644 --- a/packages/block-library/src/block/edit-panel/editor.scss +++ b/packages/block-library/src/block/edit-panel/editor.scss @@ -75,7 +75,7 @@ } } -.is-selected.is-navigate-mode .reusable-block-edit-panel { +.is-navigate-mode .is-selected .reusable-block-edit-panel { border-color: $blue-medium-focus; border-left-color: transparent; diff --git a/packages/block-library/src/block/edit-panel/index.js b/packages/block-library/src/block/edit-panel/index.js index ee2097a038b8a..4205167208ccc 100644 --- a/packages/block-library/src/block/edit-panel/index.js +++ b/packages/block-library/src/block/edit-panel/index.js @@ -31,7 +31,11 @@ class ReusableBlockEditPanel extends Component { this.titleField.current.select(); } // Move focus back to the Edit button after pressing the Escape key or Save. - if ( ( prevProps.isEditing || prevProps.isSaving ) && ! this.props.isEditing && ! this.props.isSaving ) { + if ( + ( prevProps.isEditing || prevProps.isSaving ) && + ! this.props.isEditing && + ! this.props.isSaving + ) { this.editButton.current.focus(); } } @@ -53,11 +57,18 @@ class ReusableBlockEditPanel extends Component { } render() { - const { isEditing, title, isSaving, isEditDisabled, onEdit, instanceId } = this.props; + const { + isEditing, + title, + isSaving, + isEditDisabled, + onEdit, + instanceId, + } = this.props; return ( <> - { ( ! isEditing && ! isSaving ) && ( + { ! isEditing && ! isSaving && (
        { title } @@ -74,7 +85,10 @@ class ReusableBlockEditPanel extends Component {
        ) } { ( isEditing || isSaving ) && ( -
        +