diff --git a/.eslintrc.js b/.eslintrc.js
index 9f7da03674a7df..a4a1ec153e3b2d 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -38,10 +38,22 @@ module.exports = {
globals: {
wp: 'off',
},
+ settings: {
+ jsdoc: {
+ mode: 'typescript',
+ },
+ },
rules: {
+ 'jest/expect-expect': 'off',
'@wordpress/dependency-group': 'error',
'@wordpress/gutenberg-phase': 'error',
'@wordpress/react-no-unsafe-timeout': 'error',
+ '@wordpress/i18n-text-domain': [
+ 'error',
+ {
+ allowedTextDomain: 'default',
+ },
+ ],
'no-restricted-syntax': [
'error',
// NOTE: We can't include the forward slash in our regex or
@@ -67,29 +79,6 @@ module.exports = {
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.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=/^(__|_x|_n|_nx)$/] Literal[value=/\\.{3}/]',
- message: 'Use ellipsis character (…) in place of three dots',
- },
{
selector:
'ImportDeclaration[source.value="redux"] Identifier.imported[name="combineReducers"]',
@@ -179,6 +168,9 @@ module.exports = {
{
files: [ 'packages/e2e-test*/**/*.js' ],
extends: [ 'plugin:@wordpress/eslint-plugin/test-e2e' ],
+ rules: {
+ 'jest/expect-expect': 'off',
+ },
},
],
};
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index d426bc4a2a6012..369eba93247349 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -21,11 +21,11 @@
/packages/block-editor @youknowriad @ellatrix
/packages/block-serialization-spec-parser @dmsnell
/packages/block-serialization-default-parser @dmsnell
-/packages/blocks @youknowriad @ellatrix
+/packages/blocks @youknowriad @ellatrix @aduth
/packages/edit-post
/packages/editor
/packages/list-reusable-blocks @youknowriad @noisysocks
-/packages/shortcode @aduth
+/packages/shortcode
# Widgets
/packages/edit-widgets @youknowriad
@@ -63,18 +63,18 @@
# Utilities
/packages/a11y @youknowriad @aduth
/packages/blob @aduth
-/packages/date @aduth
+/packages/date
/packages/deprecated @aduth
/packages/dom @ellatrix
/packages/dom-ready @aduth
-/packages/escape-html @aduth
-/packages/html-entities @aduth
+/packages/escape-html
+/packages/html-entities
/packages/i18n @swissspidy
/packages/is-shallow-equal @aduth
/packages/keycodes @talldan @ellatrix
/packages/priority-queue @youknowriad @aduth
/packages/token-list @aduth
-/packages/url @talldan
+/packages/url @talldan @aduth
/packages/wordcount @aduth
# Extensibility
@@ -86,6 +86,9 @@
/packages/rich-text @ellatrix @jorgefilipecosta @daniloercoli @sergioestevao @etoledom
/packages/block-editor/src/components/rich-text @ellatrix @jorgefilipecosta @daniloercoli @sergioestevao @etoledom
+# wp-env
+/packages/env @epiqueras @noahtallen @noisysocks
+
# PHP
/lib @timothybjacobs
diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md
index 20aa7016d17e90..0c5bcb7b300122 100644
--- a/.github/ISSUE_TEMPLATE/Bug_report.md
+++ b/.github/ISSUE_TEMPLATE/Bug_report.md
@@ -20,6 +20,11 @@ A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
+**Editor version (please complete the following information):**
+- WordPress version: [e.g: 5.3.2]
+- Does the website has Gutenberg plugin installed, or is it using the block editor that comes by default? [e.g: "gutenberg plugin", "default"]
+- If the Gutenberg plugin is installed, which version is it? [e.g., 7.6]
+
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
@@ -32,5 +37,4 @@ If applicable, add screenshots to help explain your problem.
- Version [e.g. 22]
**Additional context**
-- Please add the version of Gutenberg you are using in the description.
- To report a security issue, please visit the WordPress HackerOne program: https://hackerone.com/wordpress.
diff --git a/.gitignore b/.gitignore
index fc31278c325ded..a3ebac937fc66c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@
build
build-module
build-style
+build-types
node_modules
gutenberg.zip
@@ -14,6 +15,7 @@ yarn.lock
playground/dist
.cache
+*.tsbuildinfo
# Report generated from jest-junit
test/native/junit.xml
diff --git a/.prettierrc.js b/.prettierrc.js
index 0605f83bf90782..51b8aeb41505a6 100644
--- a/.prettierrc.js
+++ b/.prettierrc.js
@@ -1,3 +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' );
+module.exports = require( '@wordpress/prettier-config' );
diff --git a/.travis.yml b/.travis.yml
index d1d0c5ac032a8b..699744053a0d9f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -24,9 +24,9 @@ branches:
env:
global:
+ - PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true
- WP_DEVELOP_DIR: ./wordpress
- LOCAL_SCRIPT_DEBUG: false
- - INSTALL_COMPOSER: false
- INSTALL_WORDPRESS: true
# Make sure NodeGit gets the correct C libs.
@@ -88,10 +88,6 @@ install:
npm run env connect
npm run env cli plugin activate gutenberg
fi
- - |
- if [[ "$INSTALL_COMPOSER" = "true" ]]; then
- npm run env docker-run -- php composer install
- fi
- |
if [[ "$E2E_ROLE" = "author" ]]; then
npm run env cli -- user create author author@example.com --role=author --user_pass=authpass
@@ -113,6 +109,13 @@ jobs:
script:
- npx eslint --parser-options=ecmaVersion:5 --no-eslintrc --no-ignore ./build/**/*.js
+ - name: Typecheck
+ install:
+ - npm ci
+ script:
+ - npm run build:package-types
+
+
- name: Build artifacts
install:
# A "full" install is executed, since `npm ci` does not always exit
@@ -151,79 +154,61 @@ jobs:
- npm run test-unit:native -- --ci --maxWorkers=2 --cacheDirectory="$HOME/.jest-cache"
- name: PHP unit tests
- env: INSTALL_COMPOSER=true
script:
- npm run test-php && npm run test-unit-php-multisite
- name: PHP unit tests (PHP 5.6)
- env: INSTALL_COMPOSER=true LOCAL_PHP=5.6-fpm
+ env: LOCAL_PHP=5.6-fpm
script:
- npm run test-php && npm run test-unit-php-multisite
- name: E2E tests (Admin) (1/4)
- env: FORCE_REDUCED_MOTION=true
+ env: FORCE_REDUCED_MOTION=true PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=
script:
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 0' < ~/.jest-e2e-tests )
- name: E2E tests (Admin) (2/4)
- env: FORCE_REDUCED_MOTION=true
+ env: FORCE_REDUCED_MOTION=true PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=
script:
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 1' < ~/.jest-e2e-tests )
- name: E2E tests (Admin) (3/4)
- env: FORCE_REDUCED_MOTION=true
+ env: FORCE_REDUCED_MOTION=true PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=
script:
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 2' < ~/.jest-e2e-tests )
- name: E2E tests (Admin) (4/4)
- env: FORCE_REDUCED_MOTION=true
+ env: FORCE_REDUCED_MOTION=true PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=
script:
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 3' < ~/.jest-e2e-tests )
- name: E2E tests (Author) (1/4)
- env: E2E_ROLE=author FORCE_REDUCED_MOTION=true
+ env: E2E_ROLE=author FORCE_REDUCED_MOTION=true PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=
script:
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 0' < ~/.jest-e2e-tests )
- name: E2E tests (Author) (2/4)
- env: E2E_ROLE=author FORCE_REDUCED_MOTION=true
+ env: E2E_ROLE=author FORCE_REDUCED_MOTION=true PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=
script:
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 1' < ~/.jest-e2e-tests )
- name: E2E tests (Author) (3/4)
- env: E2E_ROLE=author FORCE_REDUCED_MOTION=true
+ env: E2E_ROLE=author FORCE_REDUCED_MOTION=true PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=
script:
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 2' < ~/.jest-e2e-tests )
- name: E2E tests (Author) (4/4)
- env: E2E_ROLE=author FORCE_REDUCED_MOTION=true
+ env: E2E_ROLE=author FORCE_REDUCED_MOTION=true PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=
script:
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --listTests > ~/.jest-e2e-tests
- $( npm bin )/wp-scripts test-e2e --config=./packages/e2e-tests/jest.config.js --cacheDirectory="$HOME/.jest-cache" --runTestsByPath $( awk 'NR % 4 == 3' < ~/.jest-e2e-tests )
- - stage: deploy
- if: (NOT type IN (pull_request)) AND (branch = master)
- name: Deploy Playground
- env: INSTALL_WORDPRESS=false
- install:
- - npm ci
- before_deploy:
- - npm run storybook:build
- deploy:
- provider: pages
- skip_cleanup: true
- github_token: $GITHUB_TOKEN
- keep_history: true
- local_dir: playground/dist
- on:
- branch: master
-
allow_failures:
# nothing is allowed to fail at the moment
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index bb46ac5f3a2385..9381a3cd9f2af5 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -12,7 +12,7 @@ To learn all about contributing to the Gutenberg project, see the [Contributor G
- Documentation? See the [documentation section](/docs/contributors/document.md).
-- Triage? We need help reviewing existing issues to make sure they’re relevant and actionable. Triage is an important contribution because it allows us to work on the highest priority issues. To learn more, please see the [triaging issues section](docs/contributors/repository-management.md#triaging-issues).
+- Triage? We need help reviewing existing issues to make sure they’re relevant and actionable. Triage is an important contribution because it allows us to work on the highest priority issues. To learn more, please see the [triaging issues section](docs/contributors/triage.md).
## Guidelines
diff --git a/bin/api-docs/are-api-docs-unstaged.js b/bin/api-docs/are-api-docs-unstaged.js
new file mode 100644
index 00000000000000..b7d956b9e145c3
--- /dev/null
+++ b/bin/api-docs/are-api-docs-unstaged.js
@@ -0,0 +1,43 @@
+#!/usr/bin/env node
+
+/**
+ * Node dependencies.
+ */
+const { extname } = require( 'path' );
+const chalk = require( 'chalk' );
+const execSync = require( 'child_process' ).execSync;
+const { readFile } = require( 'fs' ).promises;
+
+const getUnstagedFiles = () =>
+ execSync( 'git diff --name-only', { encoding: 'utf8' } )
+ .split( '\n' )
+ .filter( Boolean );
+
+const fileHasToken = async ( file ) =>
+ ( await readFile( file, 'utf8' ) ).includes( '
+ * // content within will be filled by docgen
+ *
+ *
+ * @example Delimiter tokens that use a specific source file:
+ *
+ * // content within will be filled by docgen
+ *
+ *
+ * @type {RegExp}
+ * @see DEFAULT_PATH
+ */
+const TOKEN_PATTERN = //g;
+
+/**
+ * Given an absolute file path, returns the package name.
+ *
+ * @param {string} file Absolute path.
+ *
+ * @return {string} Package name.
+ */
+function getFilePackage( file ) {
+ return relative( PACKAGES_DIR, file ).split( sep )[ 0 ];
+}
+
+/**
+ * Returns an appropriate glob pattern for the packages directory to match
+ * relevant documentation files for a given set of files.
+ *
+ * @param {string[]} files Set of files to match. Pass an empty set to match
+ * all packages.
+ *
+ * @return {string} Packages glob pattern.
+ */
+function getPackagePattern( files ) {
+ if ( ! files.length ) {
+ return '*';
+ }
+
+ // Since brace expansion doesn't work with a single package, special-case
+ // the pattern for the singular match.
+ const packages = Array.from( new Set( files.map( getFilePackage ) ) );
+ return packages.length === 1 ? packages[ 0 ] : '{' + packages.join() + '}';
+}
+
+/**
+ * Returns the conventional store name of a given package.
+ *
+ * @param {string} packageName Package name.
+ *
+ * @return {string} Store name.
+ */
+function getPackageStoreName( packageName ) {
+ let storeName = 'core';
+ if ( packageName !== 'core-data' ) {
+ storeName += '/' + packageName;
+ }
+
+ return storeName;
+}
+
+/**
+ * Returns the conventional documentation file name of a given package.
+ *
+ * @param {string} packageName Package name.
+ *
+ * @return {string} Documentation file name.
+ */
+function getDataDocumentationFile( packageName ) {
+ const storeName = getPackageStoreName( packageName );
+ return `data-${ storeName.replace( '/', '-' ) }.md`;
+}
+
+/**
+ * Returns an appropriate glob pattern for the data documentation directory to
+ * match relevant documentation files for a given set of files.
+ *
+ * @param {string[]} files Set of files to match. Pass an empty set to match
+ * all packages.
+ *
+ * @return {string} Packages glob pattern.
+ */
+function getDataDocumentationPattern( files ) {
+ if ( ! files.length ) {
+ return '*';
+ }
+
+ // Since brace expansion doesn't work with a single package, special-case
+ // the pattern for the singular match.
+ const filePackages = Array.from( new Set( files.map( getFilePackage ) ) );
+ const docFiles = filePackages.map( getDataDocumentationFile );
+
+ return docFiles.length === 1 ? docFiles[ 0 ] : '{' + docFiles.join() + '}';
+}
+
+/**
+ * Stream transform which filters out README files to include only those
+ * containing matched token pattern, yielding a tuple of the file and its
+ * matched tokens.
+ *
+ * @type {Transform}
+ */
+const filterTokenTransform = new Transform( {
+ objectMode: true,
+
+ async transform( file, _encoding, callback ) {
+ let content;
+ try {
+ content = await readFile( file, 'utf8' );
+ } catch {}
+
+ if ( content ) {
+ const tokens = [];
+
+ for ( const match of content.matchAll( TOKEN_PATTERN ) ) {
+ const [ , token, path = DEFAULT_PATH ] = match;
+ tokens.push( [ token, path ] );
+ }
+
+ if ( tokens.length ) {
+ this.push( [ file, tokens ] );
+ }
+ }
+
+ callback();
+ },
+} );
+
+/**
+ * Optional process arguments for which to generate documentation.
+ *
+ * @type {string[]}
+ */
+const files = process.argv.slice( 2 );
+
+glob.stream( [
+ `${ PACKAGES_DIR }/${ getPackagePattern( files ) }/README.md`,
+ `${ DATA_DOCS_DIR }/${ getDataDocumentationPattern( files ) }`,
+] )
+ .pipe( filterTokenTransform )
+ .on( 'data', async ( /** @type {WPReadmeFileData} */ data ) => {
+ const [ file, tokens ] = data;
+ const output = relative( ROOT_DIR, file );
+
+ // Each file can have more than one placeholder content to update, each
+ // represented by tokens. The docgen script updates one token at a time,
+ // so the tokens must be replaced in sequence to prevent the processes
+ // from overriding each other.
+ for ( const [ token, path ] of tokens ) {
+ await execa(
+ join( __dirname, '..', '..', 'node_modules', '.bin', 'docgen' ),
+ [
+ relative( ROOT_DIR, resolve( dirname( file ), path ) ),
+ `--output ${ output }`,
+ '--to-token',
+ `--use-token "${ token }"`,
+ '--ignore "/unstable|experimental/i"',
+ ],
+ { shell: true }
+ );
+ }
+ } );
diff --git a/bin/api-docs/update-readmes.js b/bin/api-docs/update-readmes.js
deleted file mode 100755
index ab1805c3fdeccd..00000000000000
--- a/bin/api-docs/update-readmes.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * Node dependencies.
- */
-const { join } = require( 'path' );
-const spawnSync = require( 'child_process' ).spawnSync;
-
-/**
- * Local dependencies.
- */
-const getPackages = require( './packages' );
-
-getPackages().forEach( ( entry ) => {
- const [ packageName, targetFiles ] = entry;
-
- Object.entries( targetFiles ).forEach( ( [ token, path ] ) => {
- // 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( 'packages', packageName, path ),
- `--output packages/${ packageName }/README.md`,
- '--to-token',
- `--use-token "${ token }"`,
- '--ignore "/unstable|experimental/i"',
- ],
- { shell: true }
- );
-
- if ( status !== 0 ) {
- process.stderr.write( `${ packageName } ${ stderr.toString() }\n` );
- process.exit( 1 );
- }
- } );
-} );
diff --git a/bin/build-plugin-zip.sh b/bin/build-plugin-zip.sh
index d68c58f0c9edb7..4aea6ac016c1e8 100755
--- a/bin/build-plugin-zip.sh
+++ b/bin/build-plugin-zip.sh
@@ -115,8 +115,7 @@ build_files=$(ls build/*/*.{js,css,asset.php} build/block-library/blocks/*.php b
status "Creating archive... 🎁"
zip -r gutenberg.zip \
gutenberg.php \
- lib/*.php \
- lib/demo-block-templates/*.html \
+ lib \
packages/block-serialization-default-parser/*.php \
post-content.php \
$vendor_scripts \
diff --git a/bin/check-latest-npm.js b/bin/check-latest-npm.js
new file mode 100644
index 00000000000000..030cff774f0fd7
--- /dev/null
+++ b/bin/check-latest-npm.js
@@ -0,0 +1,121 @@
+#!/usr/bin/env node
+
+/**
+ * External dependencies
+ */
+const { green, red, yellow } = require( 'chalk' );
+const { get } = require( 'https' );
+const { spawn } = require( 'child_process' );
+
+/**
+ * Returns a promise resolving with the version number of the latest available
+ * version of NPM.
+ *
+ * @return {Promise} Promise resolving with latest NPM version.
+ */
+async function getLatestNPMVersion() {
+ return new Promise( ( resolve, reject ) => {
+ get(
+ 'https://registry.npmjs.org/npm',
+ {
+ headers: {
+ // By passing a specialized `Accept` header, the registry
+ // will return an abbreviated form of the package data which
+ // includes enough detail to determine the latest version.
+ //
+ // See: https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md
+ Accept: 'application/vnd.npm.install-v1+json',
+ },
+ },
+ async ( response ) => {
+ if ( response.statusCode !== 200 ) {
+ return reject(
+ new Error( 'Package data for NPM not found' )
+ );
+ }
+
+ let body = '';
+ for await ( const chunk of response ) {
+ body += chunk.toString();
+ }
+
+ let data;
+ try {
+ data = JSON.parse( body );
+ } catch {
+ return reject(
+ new Error(
+ 'Package data for NPM returned invalid response body'
+ )
+ );
+ }
+
+ resolve( data[ 'dist-tags' ].latest );
+ }
+ ).on( 'error', ( error ) => {
+ if (
+ /** @type {NodeJS.ErrnoException} */ ( error ).code ===
+ 'ENOTFOUND'
+ ) {
+ error = new Error( `Could not contact the NPM registry to determine latest version.
+
+This could be due to an intermittent outage of the service, or because you are not connected to the internet.
+
+Because it is important that \`package-lock.json\` files only be committed while running the latest version of NPM, this commit has been blocked.
+
+If you are certain of your changes and desire to commit anyways, you should either connect to the internet or bypass commit verification using ${ yellow(
+ 'git commit --no-verify'
+ ) } .` );
+ }
+
+ reject( error );
+ } );
+ } );
+}
+
+/**
+ * Returns a promise resolving with the version number of the local installed
+ * version of NPM.
+ *
+ * @return {Promise} Promise resolving with local installed NPM version.
+ */
+async function getLocalNPMVersion() {
+ return new Promise( async ( resolve ) => {
+ const childProcess = spawn( 'npm', [ '-v' ] );
+
+ let output = '';
+ for await ( const chunk of childProcess.stdout ) {
+ output += chunk.toString();
+ }
+
+ resolve( output.trim() );
+ } );
+}
+
+Promise.all( [ getLatestNPMVersion(), getLocalNPMVersion() ] )
+ .then( ( [ latest, local ] ) => {
+ if ( latest !== local ) {
+ throw new Error(
+ `The local NPM version does not match the expected latest version. Expected ${ green(
+ latest
+ ) }, found ${ red( local ) }.
+
+It is required that you have the latest version of NPM installed in order to commit a change to the package-lock.json file.
+
+Run ${ yellow(
+ 'npm install --global npm@latest'
+ ) } to install the latest version of NPM. Before retrying your commit, run ${ yellow(
+ 'npm install'
+ ) } once more to ensure the package-lock.json contents are correct. If there are any changes to the file, they should be included in your commit.`
+ );
+ }
+ } )
+ .catch( ( error ) => {
+ // Disable reason: A failure should log to the terminal.
+
+ // eslint-disable-next-line no-console
+ console.error(
+ 'Latest NPM check failed!\n\n' + error.toString() + '\n'
+ );
+ process.exitCode = 1;
+ } );
diff --git a/bin/commander.js b/bin/commander.js
index 788019da2148b8..54b31c7c360f80 100755
--- a/bin/commander.js
+++ b/bin/commander.js
@@ -16,7 +16,7 @@ const SimpleGit = require( 'simple-git/promise' );
const childProcess = require( 'child_process' );
const Octokit = require( '@octokit/rest' );
const os = require( 'os' );
-const uuid = require( 'uuid/v4' );
+const { v4: uuid } = require( 'uuid' );
// Config
const gitRepoOwner = 'WordPress';
diff --git a/bin/packages/lint-staged-typecheck.js b/bin/packages/lint-staged-typecheck.js
new file mode 100644
index 00000000000000..47116c6e99f920
--- /dev/null
+++ b/bin/packages/lint-staged-typecheck.js
@@ -0,0 +1,39 @@
+/**
+ * External dependencies
+ */
+const _ = require( 'lodash' );
+const path = require( 'path' );
+const fs = require( 'fs' );
+const execa = require( 'execa' );
+
+/**
+ * Internal dependencies
+ */
+require( './validate-typescript-version' );
+
+/* eslint-disable no-console */
+
+const repoRoot = path.join( __dirname, '..', '..' );
+const tscPath = path.join( repoRoot, 'node_modules', '.bin', 'tsc' );
+
+// lint-staged passes full paths to staged changes
+const changedFiles = process.argv.slice( 2 );
+
+// Transform changed files to package directories containing tsconfig.json
+const changedPackages = _.uniq(
+ changedFiles.map( ( fullPath ) => {
+ const relativePath = path.relative( repoRoot, fullPath );
+ return path.join( ...relativePath.split( path.sep ).slice( 0, 2 ) );
+ } )
+).filter( ( packageRoot ) =>
+ fs.existsSync( path.join( packageRoot, 'tsconfig.json' ) )
+);
+
+try {
+ execa.sync( tscPath, [ '--build', ...changedPackages ] );
+} catch ( err ) {
+ console.error( err.stdout );
+ process.exitCode = 1;
+}
+
+/* eslint-enable no-console */
diff --git a/bin/packages/validate-typescript-version.js b/bin/packages/validate-typescript-version.js
new file mode 100644
index 00000000000000..1c8af56b14bca7
--- /dev/null
+++ b/bin/packages/validate-typescript-version.js
@@ -0,0 +1,28 @@
+/**
+ * External dependencies
+ */
+const tscDetectedVersion = require( 'typescript' ).version;
+
+/**
+ * Internal dependencies
+ */
+const tscDependencyVersion = require( '../../package.json' ).devDependencies
+ .typescript;
+
+/* eslint-disable no-console */
+
+if ( tscDependencyVersion !== tscDetectedVersion ) {
+ console.error(
+ [
+ 'TypeScript dependency out of date.',
+ '\tDetected: %o',
+ '\tRequired: %o',
+ 'Please ensure dependencies are up to date.',
+ ].join( require( 'os' ).EOL ),
+ tscDetectedVersion,
+ tscDependencyVersion
+ );
+ process.exit( 1 );
+}
+
+/* eslint-enable no-console */
diff --git a/bin/tsconfig.json b/bin/tsconfig.json
new file mode 100644
index 00000000000000..b65a74eeb1bfc1
--- /dev/null
+++ b/bin/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "extends": "../tsconfig.base.json",
+ "compilerOptions": {
+ "module": "commonjs",
+ "esModuleInterop": true,
+ "target": "ES6",
+ "lib": [ "ES6", "ES2020.string" ],
+ "rootDir": ".",
+ "declarationMap": false,
+
+ // We're not interested in the output, but we must generate
+ // something as part of a composite project. Use the
+ // ignored `.cache` file to hide tsbuildinfo and d.ts files.
+ "outDir": ".cache"
+ },
+ "files": [
+ "./api-docs/update-api-docs.js",
+ "./check-latest-npm.js"
+ ]
+}
diff --git a/changelog.txt b/changelog.txt
index 9552802795a92a..dcc7411387f7d0 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,5 +1,477 @@
== Changelog ==
+= 7.9.1 =
+
+### Bug Fixes
+
+ - Make sidebar plugins pinned by default.
+ - Fix the button styles for old content.
+
+
+= 7.9.0 =
+
+### Features
+
+- Add gradients support to Group, Columns and Media & Text blocks. [21375](https://github.com/WordPress/gutenberg/pull/21375)
+- Add line height support to the Paragraph block. [20775](https://github.com/WordPress/gutenberg/pull/20775)
+- Add font size support to the Heading block. [21431](https://github.com/WordPress/gutenberg/pull/21431)
+- Add line height support to the Heading block. [21215](https://github.com/WordPress/gutenberg/pull/21215)
+- Add custom height unit support to the Cover block. [20888](https://github.com/WordPress/gutenberg/pull/20888)
+
+### Enhancements
+
+- New Patterns:
+ - Hero Two Columns [21128](https://github.com/WordPress/gutenberg/pull/21128)
+ - Numbered Features [21131](https://github.com/WordPress/gutenberg/pull/21131)
+ - It's Time [21132](https://github.com/WordPress/gutenberg/pull/21132)
+- Add a new keyboard shortcut to toggle Fullscreen Mode. [21436](https://github.com/WordPress/gutenberg/pull/21436)
+- Insert post title instead of URL, when adding a link to an existing post [21240](https://github.com/WordPress/gutenberg/pull/21240)
+- Social links block:
+ - Update tumblr icon [21329](https://github.com/WordPress/gutenberg/pull/21329)
+ - Update and massage social links colors. [21474](https://github.com/WordPress/gutenberg/pull/21474)
+- Allow reusable block top and bottom paddings to collapse. [21472](https://github.com/WordPress/gutenberg/pull/21472)
+- Update all block previews to use the auto-height behavior. [21014](https://github.com/WordPress/gutenberg/pull/21014)
+- Disable autocomplete for custom class name inputs. [21110](https://github.com/WordPress/gutenberg/pull/21110)
+- Several small tweaks to the new Block UI. [21476](https://github.com/WordPress/gutenberg/pull/21476)
+- Unify the focus styles across the UI. [21141](https://github.com/WordPress/gutenberg/pull/21141)
+- Improve block focus style. [21498](https://github.com/WordPress/gutenberg/pull/21498)
+- Remove the post permalink UI from the post title. [21099](https://github.com/WordPress/gutenberg/pull/21099)
+- Style the default toolbar buttons. [21252](https://github.com/WordPress/gutenberg/pull/21252)
+- Style tweaks to the patterns library sidebar. [21263](https://github.com/WordPress/gutenberg/pull/21263)
+- Smaller space between toolbar and block. [21166](https://github.com/WordPress/gutenberg/pull/21166)
+
+### Performance
+
+- Add block selection performance test. [21230](https://github.com/WordPress/gutenberg/pull/21230)
+- Improve the performance of the block moving animation. [21231](https://github.com/WordPress/gutenberg/pull/21231)
+- Render the patterns list asynchronously. [21322](https://github.com/WordPress/gutenberg/pull/21322)
+
+### Bug Fixes
+
+- Improve WordPress logo rendering for non-retina displays. [21217](https://github.com/WordPress/gutenberg/pull/21217)
+- Fix inserter popover direction. [21556](https://github.com/WordPress/gutenberg/pull/21556)
+- Fix Snackbar notice bottom margin. [18858](https://github.com/WordPress/gutenberg/pull/18858)
+- Fix YouTube Embed block from flickering and crashing on Safari. [21225](https://github.com/WordPress/gutenberg/pull/21225)
+- Fix sibling inserter being unclickable. [21232](https://github.com/WordPress/gutenberg/pull/21232)
+- Fix block duplication using keyboard shortcut [21317](https://github.com/WordPress/gutenberg/pull/21317)
+- Avoid creating an empty paragraph when selecting the parent's group block [21318](https://github.com/WordPress/gutenberg/pull/21318)
+- Fix the Buttons block margins. [21376](https://github.com/WordPress/gutenberg/pull/21376)
+- Prevent typing on a Popover from closing the block toolbar [21421](https://github.com/WordPress/gutenberg/pull/21421)
+- Prevent copy/paste on number inputs from copying the post content. [21457](https://github.com/WordPress/gutenberg/pull/21457)
+- Prevent scroll jumps when focusing long blocks. [21460](https://github.com/WordPress/gutenberg/pull/21460)
+- Fix Separator block RTL styles. [21525](https://github.com/WordPress/gutenberg/pull/21525)
+- Make dateI18n returns be affected by `gmt` parameter. [18982](https://github.com/WordPress/gutenberg/pull/18982)
+- Fixes the read more link added by themes in the Latest Posts block. [20541](https://github.com/WordPress/gutenberg/pull/20541)
+- Fix the Latest Posts block when `imageDimensions` is empty [21070](https://github.com/WordPress/gutenberg/pull/21070)
+- Fix transparent images used as Cover block backgrounds. [20904](https://github.com/WordPress/gutenberg/pull/20904)
+- IE11: fix focus on backspace. [21092](https://github.com/WordPress/gutenberg/pull/21092)
+- Fix IE11 breakage when hitting Enter. [21361](https://github.com/WordPress/gutenberg/pull/21361) [21366](https://github.com/WordPress/gutenberg/pull/21366)
+- Fix block movers on full-wide blocks. [21097](https://github.com/WordPress/gutenberg/pull/21097)
+- Fix Annotations classNames. [21184](https://github.com/WordPress/gutenberg/pull/21184)
+- RangeControl: Fix zero value handling with number input. [21187](https://github.com/WordPress/gutenberg/pull/21187)
+- Fix reusable block horizontal padding regression. [21312](https://github.com/WordPress/gutenberg/pull/21312)
+- Fix fullwide margins regression. [21201](https://github.com/WordPress/gutenberg/pull/21201)
+- Prevent the Cover block from overriding the children blocks colors [21254](https://github.com/WordPress/gutenberg/pull/21254)
+- Fix overly verbose aria-label in Social Link block [21369](https://github.com/WordPress/gutenberg/pull/21369)
+- Fix container block appenders and sibling inserters. [21149](https://github.com/WordPress/gutenberg/pull/21149) [21142](https://github.com/WordPress/gutenberg/pull/21142) [21143](https://github.com/WordPress/gutenberg/pull/21143)
+
+### New APIs
+
+- @wordpress/i18n: Add create-i18n function. [21182](https://github.com/WordPress/gutenberg/pull/21182)
+- @wordpress/interface:
+ - Add screen sidebar extensibility APIs. [20698](https://github.com/WordPress/gutenberg/pull/20698) [21260](https://github.com/WordPress/gutenberg/pull/21260)
+ - Prepare for npm release. [21417](https://github.com/WordPress/gutenberg/pull/21417)
+ - Add Fullscreen mode component. [21334](https://github.com/WordPress/gutenberg/pull/21334)
+ - Add InterfaceSkeleton component. [21335](https://github.com/WordPress/gutenberg/pull/21335)
+- @wordpress/icons: Add new icons: tablet, mobile, desktop, font, share... [21261](https://github.com/WordPress/gutenberg/pull/21261) [21278](https://github.com/WordPress/gutenberg/pull/21278)
+- Support changing the Group block's DOM element. [20218](https://github.com/WordPress/gutenberg/pull/20218)
+- Block API: Add new utility to register block types from metadata in PHP [20794](https://github.com/WordPress/gutenberg/pull/20794)
+- Add radio option to the ButtonGroup component. [20805](https://github.com/WordPress/gutenberg/pull/20805)
+
+### Experiments
+
+- Full site editing and Site Editor screen:
+ - Use the default post comments template for the Post Comments block. [21012](https://github.com/WordPress/gutenberg/pull/21012)
+ - Use slug as template part display label.[21161](https://github.com/WordPress/gutenberg/pull/21161)
+ - Remove duplicate queries fetching template parts [18878](https://github.com/WordPress/gutenberg/pull/18878)
+ - Preload the edited template to avoid the white page effect. [21214](https://github.com/WordPress/gutenberg/pull/21214)
+ - Move the menu item to the top level. [21273](https://github.com/WordPress/gutenberg/pull/21273)
+ - Add block breadcrumb; [21274](https://github.com/WordPress/gutenberg/pull/21274)
+ - Prevent template switcher jumpiness. [21280](https://github.com/WordPress/gutenberg/pull/21280)
+ - Increase the viewport width used for template previews. [21287](https://github.com/WordPress/gutenberg/pull/21287)
+ - Add top level inserter. [21328](https://github.com/WordPress/gutenberg/pull/21328)
+ - Apply the editor styles. [20982](https://github.com/WordPress/gutenberg/pull/20982)
+ - Update the multi-entity saving flow UI. [21159](https://github.com/WordPress/gutenberg/pull/21159)
+ - Small updates to template selector. [21202](https://github.com/WordPress/gutenberg/pull/21202)
+- New navigation screen:
+ - Bootstrap the screen. [21036](https://github.com/WordPress/gutenberg/pull/21036)
+ - Implement the initial styling. [21314](https://github.com/WordPress/gutenberg/pull/21314)
+ - Add save shortcut. [21342](https://github.com/WordPress/gutenberg/pull/21342)
+ - Fix editor shortcuts. [21338](https://github.com/WordPress/gutenberg/pull/21338)
+ - Basic responsive styles. [21414](https://github.com/WordPress/gutenberg/pull/21414)
+- Navigation block:
+ - Make the submenus usable on mobile. [21471](https://github.com/WordPress/gutenberg/pull/21471)
+ - Fix block for contributor users [18669](https://github.com/WordPress/gutenberg/pull/18669)
+ - Fix submenus being overlapped by wrapping top-level nav links. [21140](https://github.com/WordPress/gutenberg/pull/21140)
+ - Add vertical variation. [21296](https://github.com/WordPress/gutenberg/pull/21296)
+ - Show color controls in toolbar only. [20884](https://github.com/WordPress/gutenberg/pull/20884)
+ - Add capture toolbars prop to inner blocks. [21095](https://github.com/WordPress/gutenberg/pull/21095)
+- Block API Support flags:
+ - Introduce a support key for support global style colors in blocks. [21021](https://github.com/WordPress/gutenberg/pull/21021) [21428](https://github.com/WordPress/gutenberg/pull/21428)
+ - Add the possibility to support gradients using the experimental color support flag; [21481](https://github.com/WordPress/gutenberg/pull/21481)
+ - Add a block support flag for font size. [21153](https://github.com/WordPress/gutenberg/pull/21153)
+- Remove experimentalUIParts API. [20979](https://github.com/WordPress/gutenberg/pull/20979)
+- Add experimental Text component. [21088](https://github.com/WordPress/gutenberg/pull/21088)
+
+### Documentation
+
+- Docs: Describe tools used in E2E testing. [21295](https://github.com/WordPress/gutenberg/pull/21295)
+- WP-env: Add reference to docker log command to show error logs in terminal. [21308](https://github.com/WordPress/gutenberg/pull/21308)
+- Docs: Add section in block RFC about register_block_type_from_metadata. [21501](https://github.com/WordPress/gutenberg/pull/21501)
+- Update serverSideRender docs to include how to use from the wp global. [18722](https://github.com/WordPress/gutenberg/pull/18722)
+- Prescribe latest NPM for development environment. [21017](https://github.com/WordPress/gutenberg/pull/21017)
+- Update Documentation on how to update post meta values from a block. [21155](https://github.com/WordPress/gutenberg/pull/21155)
+- Document getAnchorRect prop for Popover component. [17709](https://github.com/WordPress/gutenberg/pull/17709)
+- Typos and tweaks: [21228](https://github.com/WordPress/gutenberg/pull/21228), [21364](https://github.com/WordPress/gutenberg/pull/21364), [21405](https://github.com/WordPress/gutenberg/pull/21405), [20660](https://github.com/WordPress/gutenberg/pull/20660), [21297](https://github.com/WordPress/gutenberg/pull/21297).
+
+### Code Quality
+
+- Add types to WordPress packages:
+ - @wordpress/element [21248](https://github.com/WordPress/gutenberg/pull/21248)
+ - @wordpress/primitives [21482](https://github.com/WordPress/gutenberg/pull/21482)
+ - @wordpress/icons [21487](https://github.com/WordPress/gutenberg/pull/21487)
+ - @wordpress/autop, @wordpress/escape-html and @wordpress/html-entities [20669](https://github.com/WordPress/gutenberg/pull/20669)
+ - @wordpress/i18n [21224](https://github.com/WordPress/gutenberg/pull/21224)
+ - @wordpress/prettier-config [21381](https://github.com/WordPress/gutenberg/pull/21381) [21053](https://github.com/WordPress/gutenberg/pull/21053)
+ - @wordpress/block-editor DOM utils. [21362](https://github.com/WordPress/gutenberg/pull/21362)
+- Update the Buttons block to use the new color support flag. [21266](https://github.com/WordPress/gutenberg/pull/21266)
+- Update the Paragraph block to use the colors support flag. [21037](https://github.com/WordPress/gutenberg/pull/21037)
+- Update the Columns block to use the colors support flag. [21038](https://github.com/WordPress/gutenberg/pull/21038)
+- Update the Heading block to use the colors support flag. [21039](https://github.com/WordPress/gutenberg/pull/21039)
+- Update the Media & Text block to use the colors support flag. [21169](https://github.com/WordPress/gutenberg/pull/21169)
+- Refactor env commands into separate files .[21353](https://github.com/WordPress/gutenberg/pull/21353)
+- Remove the deprecated `request` dependency. [21398](https://github.com/WordPress/gutenberg/pull/21398)
+- Move default styles to editor normalisation stylesheet. [19837](https://github.com/WordPress/gutenberg/pull/19837)
+- Replace lodash.assign with vanilla JS. [21054](https://github.com/WordPress/gutenberg/pull/21054)
+- Remove the old block preview implementation. [21096](https://github.com/WordPress/gutenberg/pull/21096)
+- Make RichText window/document agnostic. [21105](https://github.com/WordPress/gutenberg/pull/21105)
+- Polish a11y package. [21148](https://github.com/WordPress/gutenberg/pull/21148)
+- Fix two typos in lib rest menu controller. [21418](https://github.com/WordPress/gutenberg/pull/21418)
+- Global tips: Add period at the end of sentence. [20601](https://github.com/WordPress/gutenberg/pull/20601)
+- Lighter block DOM:
+ - Verse block [20752](https://github.com/WordPress/gutenberg/pull/20752)
+ - Code block [21079](https://github.com/WordPress/gutenberg/pull/21079)
+ - Preformatted block [21146](https://github.com/WordPress/gutenberg/pull/21146)
+- Update the padding values on the Card component to align with proposed spacing system. [21111](https://github.com/WordPress/gutenberg/pull/21111)
+- Disable scroll in PlainText component. [21115](https://github.com/WordPress/gutenberg/pull/21115)
+- Simplify inserter hasItems check. [21138](https://github.com/WordPress/gutenberg/pull/21138)
+- Avoid string concatenation for the Latest Post block read more link. [21170](https://github.com/WordPress/gutenberg/pull/21170)
+
+### Various
+
+- Plugin: Bump tested up to info to WP 5.4 [21400](https://github.com/WordPress/gutenberg/pull/21400)
+- Output package type declarations. [18942](https://github.com/WordPress/gutenberg/pull/18942)
+- Exclude native files from type checking. [21491](https://github.com/WordPress/gutenberg/pull/21491)
+- docgen: Optimize README update script. [18840](https://github.com/WordPress/gutenberg/pull/18840)
+- Check Latest NPM on npm install. [21521](https://github.com/WordPress/gutenberg/pull/21521)
+- E2E Tests:
+ - Improve stability of image block test [21174](https://github.com/WordPress/gutenberg/pull/21174)
+ - Improve Allowed Inner Blocks test stability [21175](https://github.com/WordPress/gutenberg/pull/21175)
+ - Use waitForSelector to wait for sidebar presence [21180](https://github.com/WordPress/gutenberg/pull/21180)
+- Unit Tests:
+ - Fix @wordpress/env testPortNumberValidation unit test. [21394](https://github.com/WordPress/gutenberg/pull/21394)
+ - Introduce react-testing-library to some existing unit tests. [20428](https://github.com/WordPress/gutenberg/pull/20428)
+ - Components: Add SlotFill test. [21226](https://github.com/WordPress/gutenberg/pull/21226)
+ - Fail E2E when page displays warning notices [13452](https://github.com/WordPress/gutenberg/pull/13452)
+- Project Management: Prompt user to link GitHub account to WordPress.org profile [21221](https://github.com/WordPress/gutenberg/pull/21221) [21384](https://github.com/WordPress/gutenberg/pull/21384)
+- @wordpress/env: Bind "core" files to tests environment [21195](https://github.com/WordPress/gutenberg/pull/21195)
+- ESLint Plugin: Continue considering unused variables after encountering exception [21354](https://github.com/WordPress/gutenberg/pull/21354)
+- Enable prettier for JSX files [21151](https://github.com/WordPress/gutenberg/pull/21151)
+- Increase severity of JSDoc linting to error. [20427](https://github.com/WordPress/gutenberg/pull/20427)
+- Add I18N specific ESLint rules. [20555](https://github.com/WordPress/gutenberg/pull/20555) [20574](https://github.com/WordPress/gutenberg/pull/20574)
+- Update uuid to v7.0.2. [21258](https://github.com/WordPress/gutenberg/pull/21258)
+- Upgrade Reakit to version 1.0.0-rc.0; [21300](https://github.com/WordPress/gutenberg/pull/21300)
+- Framework: Add package-lock precommit check for latest NPM. [21306](https://github.com/WordPress/gutenberg/pull/21306)
+- Babel Preset: Update Babel version to 7.9.x. [21419](https://github.com/WordPress/gutenberg/pull/21419)
+- ESLint Plugin: Update ESLint and related dependencies to 6.8.x. [21424](https://github.com/WordPress/gutenberg/pull/21424)
+- Framework: Configure ESLint JSDoc plugin to target TypeScript mode. [18998](https://github.com/WordPress/gutenberg/pull/18998)
+- Major version upgrade for Jest in all packages. [20766](https://github.com/WordPress/gutenberg/pull/20766)
+- Storybook:
+ - Add TreeSelect component. [20496](https://github.com/WordPress/gutenberg/pull/20496)
+ - Update AnglePickerControl title. [21089](https://github.com/WordPress/gutenberg/pull/21089)
+- Automated Testing: composer non-interactive flag for Travis. [21118](https://github.com/WordPress/gutenberg/pull/21118)
+- REST API error message: Remove unnecessary space. [21178](https://github.com/WordPress/gutenberg/pull/21178)
+- SlotFill: Guard property access to possibly-undefined slot. [21205](https://github.com/WordPress/gutenberg/pull/21205)
+- Build: Add TypeScript version validation [21208](https://github.com/WordPress/gutenberg/pull/21208)
+
+
+
+= 7.8.1 =
+
+
+
+= 7.8.0 =
+
+## Enhancements
+
+- Add visible labels to BlockPatternPicker pattern selection buttons [19789](https://github.com/WordPress/gutenberg/pull/19789)
+- Adds always on display of media URL [19504](https://github.com/WordPress/gutenberg/pull/19504)
+- Adds current menu class to navigation block [20076](https://github.com/WordPress/gutenberg/pull/20076)
+- Block: Outline when interacting with Toolbar Block Type/Movers [20938](https://github.com/WordPress/gutenberg/pull/20938)
+- Create block: Improve how prompts and values provided are handled [20756](https://github.com/WordPress/gutenberg/pull/20756)
+- Expand create block options and add readme.txt template [20694](https://github.com/WordPress/gutenberg/pull/20694)
+- Patterns: Make adding patterns easier [20854](https://github.com/WordPress/gutenberg/pull/20854)
+- Polish a few icons [20980](https://github.com/WordPress/gutenberg/pull/20980)
+- Polish date-picker component [20824](https://github.com/WordPress/gutenberg/pull/20824)
+- Improve permalink editing [12009](https://github.com/WordPress/gutenberg/pull/12009)
+- Nicer block footprint for social links [20978](https://github.com/WordPress/gutenberg/pull/20978)
+- Show inserter only when block selected for nesting contexts [20753](https://github.com/WordPress/gutenberg/pull/20753)
+- URL: Use test data from web-platform-tests for isURL spec conformance [20537](https://github.com/WordPress/gutenberg/pull/20537)
+- Adds multi-select to categories on Latest Posts [20781](https://github.com/WordPress/gutenberg/pull/20781)
+- Add basic nav block example for inserter and styles previews [21011](https://github.com/WordPress/gutenberg/pull/21011)
+
+## Bug Fixes
+
+- Allow media library in gallery mode to be reset [20675](https://github.com/WordPress/gutenberg/pull/20675)
+- Autocomplete: Add support for results with long titles [20962](https://github.com/WordPress/gutenberg/pull/20962)
+- Compat: Conditionally filter editor settings for image dimensions [20939](https://github.com/WordPress/gutenberg/pull/20939)
+- Compat: Use core-js-url-browser for URL polyfill [20225](https://github.com/WordPress/gutenberg/pull/20225)
+- Data: Migrate post editor persistence with fullscreenMode false [21082](https://github.com/WordPress/gutenberg/pull/21082)
+- Edit Post: Make sidebar header focusable for button focus normalization [21031](https://github.com/WordPress/gutenberg/pull/21031)
+- Fix auto-hiding appender regression [20780](https://github.com/WordPress/gutenberg/pull/20780)
+- Fix fullscreen mode device preview [21010](https://github.com/WordPress/gutenberg/pull/21010)
+- Fix link control search results spacing. [21003](https://github.com/WordPress/gutenberg/pull/21003)
+- Fix snackbar container block portion of UI while present [21000](https://github.com/WordPress/gutenberg/pull/21000)
+- Make the inner button block not allowed as a reusable block or editable as HTML [20948](https://github.com/WordPress/gutenberg/pull/20948)
+- URL: Fix getQueryString incorrect handling of hash fragment [20738](https://github.com/WordPress/gutenberg/pull/20738)
+- Update social links block to output a custom class on each individual link [20998](https://github.com/WordPress/gutenberg/pull/20998)
+- Update the inserter's block preview to use the AutoHeightPreview [20817](https://github.com/WordPress/gutenberg/pull/20817)
+- Latest Posts:
+ - Fix link for read more markup [20917](https://github.com/WordPress/gutenberg/pull/20917)
+ - Fixes the categories selector crash when category does not exist [20960](https://github.com/WordPress/gutenberg/pull/20960)
+- Fix input rules [20964](https://github.com/WordPress/gutenberg/pull/20964)
+- Trim input value in navigation search input field [19832](https://github.com/WordPress/gutenberg/pull/19832)
+- Fix mobile header [20946](https://github.com/WordPress/gutenberg/pull/20946)
+- Fix visually hidden classnames [20649](https://github.com/WordPress/gutenberg/pull/20649)
+- Fix/screen reader text [20607](https://github.com/WordPress/gutenberg/pull/20607)
+- Fix SelectControl example code synax highlight [19803](https://github.com/WordPress/gutenberg/pull/19803)
+
+## New APIs
+
+- Add initial API to register patterns from themes and plugins [21074](https://github.com/WordPress/gutenberg/pull/21074)
+- Convert \__experimentalCreateInterpolateElement to a stable API [20699](https://github.com/WordPress/gutenberg/pull/20699)
+
+## Experiments
+
+- Site Editor:
+ - Add Fullscreen mode [20691](https://github.com/WordPress/gutenberg/pull/20691)
+ - Add fullscreen close button [20989](https://github.com/WordPress/gutenberg/pull/20989)
+ - Add more menu and fullscreen toggle [21006](https://github.com/WordPress/gutenberg/pull/21006)
+ - Style resets for top level page [20886](https://github.com/WordPress/gutenberg/pull/20886)
+ - Get current template part correctly for auto drafts [20438](https://github.com/WordPress/gutenberg/pull/20438)
+ - Add template preview to the edit site template switcher [20958](https://github.com/WordPress/gutenberg/pull/20958)
+ - Add things required to load custom blocks to Site Editor page [20549](https://github.com/WordPress/gutenberg/pull/20549)
+ - Avoid page templates overwriting page title [20865](https://github.com/WordPress/gutenberg/pull/20865)
+- Lighter block DOM:
+ - Group [20586](https://github.com/WordPress/gutenberg/pull/20586)
+ - Navigation [20729](https://github.com/WordPress/gutenberg/pull/20729)
+- Navigation Block:
+ - Fix dynamic rendering recursive function name typo [21078](https://github.com/WordPress/gutenberg/pull/21078)
+ - Avoid hiding submenu when adding a link [21035](https://github.com/WordPress/gutenberg/pull/21035)
+ - Fix toolbar overlap on navigation links [21033](https://github.com/WordPress/gutenberg/pull/21033)
+- PlainText v2 [21076](https://github.com/WordPress/gutenberg/pull/21076)
+ - Editable Component [18361](https://github.com/WordPress/gutenberg/pull/18361)
+
+## Documentation
+
+- Add ESNext example for unregisterBlockType [20784](https://github.com/WordPress/gutenberg/pull/20784)
+- Docs/SlotFills: Small update for consistency [20767](https://github.com/WordPress/gutenberg/pull/20767)
+- Correct 2nd param of useViewportMatch() usage [20911](https://github.com/WordPress/gutenberg/pull/20911)
+- Include `npm run dev` guidance in "Getting Started" [21015](https://github.com/WordPress/gutenberg/pull/21015)
+- Document default login credentials and `wp-env run` command [20678](https://github.com/WordPress/gutenberg/pull/20678)
+- Fixes docblock for useViewportMatch [20919](https://github.com/WordPress/gutenberg/pull/20919)
+- Lowercase visual editor and code editor to match block editor and classic editor [20968](https://github.com/WordPress/gutenberg/pull/20968)
+- Update README.md [20913](https://github.com/WordPress/gutenberg/pull/20913)
+- Add Custom Block Editor to TOC and Manifest [20749](https://github.com/WordPress/gutenberg/pull/20749)
+- Add tutorial link to Table of Contents for Custom Block Editor [20750](https://github.com/WordPress/gutenberg/pull/20750)
+
+## Code Quality
+
+- Block Editor: Use useResizeObserver in place of direct react-resize-aware dependency [20889](https://github.com/WordPress/gutenberg/pull/20889)
+- E2E Test Utils: Improve durability of embedding matcher [20811](https://github.com/WordPress/gutenberg/pull/20811)
+- Framework: Migrate/remove temporary compatibility script initialization [19178](https://github.com/WordPress/gutenberg/pull/19178)
+- Framework: Use WHATWG URL in place of legacy url module [19823](https://github.com/WordPress/gutenberg/pull/19823)
+- Nav Block: Remove 'frontend' from style comments [21034](https://github.com/WordPress/gutenberg/pull/21034)
+- Project Management Automation: Add TypeScript type-checking [20850](https://github.com/WordPress/gutenberg/pull/20850)
+- Refactor the inserter menu component and split into multiple smaller components [20880](https://github.com/WordPress/gutenberg/pull/20880)
+- Remove iframe from content elements [20976](https://github.com/WordPress/gutenberg/pull/20976)
+- Update Search/RSS block render method [20977](https://github.com/WordPress/gutenberg/pull/20977)
+
+## Various
+
+- Update glossary [20934](https://github.com/WordPress/gutenberg/pull/20934)
+- Improve performance testing [20802](https://github.com/WordPress/gutenberg/pull/20802)
+- Edit Post: Register block patterns as separate plugin [20871](https://github.com/WordPress/gutenberg/pull/20871)
+- Accessibility: updated headings to reflect semantic relationship between html tag and it's content. [16444](https://github.com/WordPress/gutenberg/pull/16444)
+- Add Prettier shared config package [20026](https://github.com/WordPress/gutenberg/pull/20026)
+- Add default styles to the TabPanel component [20872](https://github.com/WordPress/gutenberg/pull/20872)
+- Add isFileURL method and use it on all native media upload checks. [20985](https://github.com/WordPress/gutenberg/pull/20985)
+- Add menus endpoints. [20292](https://github.com/WordPress/gutenberg/pull/20292)
+- Block Patterns: Update text-two-columns.json [20890](https://github.com/WordPress/gutenberg/pull/20890)
+- Block Styles: Remove the block margin in the style selector [19983](https://github.com/WordPress/gutenberg/pull/19983)
+- Block patterns: improve success notice [21005](https://github.com/WordPress/gutenberg/pull/21005)
+- Blocks: Allow the Default Style selector to be hidden. [20620](https://github.com/WordPress/gutenberg/pull/20620)
+- E2E Tests: Mock Embed response for InnerBlocks locking test [20481](https://github.com/WordPress/gutenberg/pull/20481)
+- ESLint Plugin: Relax `prefer-const` for destructuring assignment [20737](https://github.com/WordPress/gutenberg/pull/20737)
+- Gallery: Update UI of controls [20776](https://github.com/WordPress/gutenberg/pull/20776)
+- Improves RTL style conversion [20503](https://github.com/WordPress/gutenberg/pull/20503)
+- Minor change to switch Help link target to _blank, add rels [20800](https://github.com/WordPress/gutenberg/pull/20800)
+- Mobile: Add accessibility label to Block List Footer [20633](https://github.com/WordPress/gutenberg/pull/20633)
+- Moves category multi select from LatestPosts to QueryControls [20832](https://github.com/WordPress/gutenberg/pull/20832)
+- Paste: replace iframes with url [20983](https://github.com/WordPress/gutenberg/pull/20983)
+- Polish poster image button arrangement. [20754](https://github.com/WordPress/gutenberg/pull/20754)
+- Preview Button: Remove the separator and border, and reduce the size of the icon. [20683](https://github.com/WordPress/gutenberg/pull/20683)
+- RangeControl: Improve disabled rendering and interactions [20723](https://github.com/WordPress/gutenberg/pull/20723)
+- Reduce gap between block library and preview [20777](https://github.com/WordPress/gutenberg/pull/20777)
+- Remove aria-expanded from close button in Publish panel [20993](https://github.com/WordPress/gutenberg/pull/20993)
+- Remove feature flag for mobile page templates [20718](https://github.com/WordPress/gutenberg/pull/20718)
+- Remove inaccurate message from image block [20909](https://github.com/WordPress/gutenberg/pull/20909)
+- Removed the textarea width restriction for the Shortcode block [20624](https://github.com/WordPress/gutenberg/pull/20624)
+- Revert "Framework: Travis: Avoid skipping Puppeteer download" [20828](https://github.com/WordPress/gutenberg/pull/20828)
+- Show errors in the media replace control [19244](https://github.com/WordPress/gutenberg/pull/19244)
+- Styles Panel: Don't force it to be closed by default. [20617](https://github.com/WordPress/gutenberg/pull/20617)
+- Update Navigation Menu Item icon [20763](https://github.com/WordPress/gutenberg/pull/20763)
+- Update page template picker after design review [20883](https://github.com/WordPress/gutenberg/pull/20883)
+- Latest Posts: Testing larger margins [20563](https://github.com/WordPress/gutenberg/pull/20563)
+- Add codeowners for env package [20667](https://github.com/WordPress/gutenberg/pull/20667)
+- Scripts: Update all webpack related dependencies [20916](https://github.com/WordPress/gutenberg/pull/20916)
+- Dependencies webpack plugin: Let the output file be specified when output is combined [20844](https://github.com/WordPress/gutenberg/pull/20844)
+
+= 7.7.1 =
+
+### Bug Fixes
+
+- Fix Drag and Drop into the columns block.
+- Fix the columns block selection.
+- Fix applying colors and backgrounds to the columns block.
+- Fix the RangeControl controlled behavior.
+
+
+= 7.7.0 =
+
+### Features
+
+- Add the initial version of the Patterns UI as a sidebar plugin (This is not the final interface and work is in progress to integrate with the main block inserter). [20354](https://github.com/WordPress/gutenberg/pull/20354), [20715](https://github.com/WordPress/gutenberg/pull/20715).
+ - Add an initial set of patterns [20724](https://github.com/WordPress/gutenberg/pull/20724).
+
+### Enhancements
+
+- Update the Block and editor UI. [19344](https://github.com/WordPress/gutenberg/pull/19344)
+ - New icons. [20464](https://github.com/WordPress/gutenberg/pull/20464)
+ - Avoid empty menu groups. [20495](https://github.com/WordPress/gutenberg/pull/20495)
+ - Block Placeholders. [20441](https://github.com/WordPress/gutenberg/pull/20441), [20676](https://github.com/WordPress/gutenberg/pull/20676).
+ - Various tweaks [20679](https://github.com/WordPress/gutenberg/pull/20679), [20578](https://github.com/WordPress/gutenberg/pull/20578).
+- Improve the Back to WP Admin button in Fullscreen Mode. [20603](https://github.com/WordPress/gutenberg/pull/20603)
+- Make the editor Fullscreen by default. [20611](https://github.com/WordPress/gutenberg/pull/20611)
+- Remove template locking from the columns block [20465](https://github.com/WordPress/gutenberg/pull/20465)
+- Make the inserter full height. [20526](https://github.com/WordPress/gutenberg/pull/20526)
+
+### Bug Fixes
+
+- A11y:
+ - Deselect first/last gallery images on blur. [14930](https://github.com/WordPress/gutenberg/pull/14930)
+ - Revert top toolbar tab order [20571](https://github.com/WordPress/gutenberg/pull/20571)
+- Add an overlay to the html block preview to fix block selection in Firefox. [20425](https://github.com/WordPress/gutenberg/pull/20425)
+- Add missing accessibility attributes in the SVG icons. [20538](https://github.com/WordPress/gutenberg/pull/20538)
+- Fix invalid syntax error on Safari 12. [20507](https://github.com/WordPress/gutenberg/pull/20507)
+- Use a consistent width for the link suggetions. [20448](https://github.com/WordPress/gutenberg/pull/20448)
+- Use full labels for directional block movers. [20664](https://github.com/WordPress/gutenberg/pull/20664)
+- Columns block: Force 50% column width at mid-range viewport. [20597](https://github.com/WordPress/gutenberg/pull/20597)
+- Media & Text block: Fix frontend styles when "Crop image to fill" is selected [20539](https://github.com/WordPress/gutenberg/pull/20539)
+- Latest Post block:
+ - Fix the excerpt length. [20313](https://github.com/WordPress/gutenberg/pull/20313)
+ - Don't trim manual exerptts [20432](https://github.com/WordPress/gutenberg/pull/20432)
+- Fix sidebar scroll issue on small viewports. [20491](https://github.com/WordPress/gutenberg/pull/20491)
+- Social Link block:
+ - Escape generated class name. [20479](https://github.com/WordPress/gutenberg/pull/20479)
+ - Fix label attribute type as string. [20468](https://github.com/WordPress/gutenberg/pull/20468)
+ - i18n: Use placeholder for the default label [20475](https://github.com/WordPress/gutenberg/pull/20475)
+- Simulated Queries (Device previews):
+ - Check for match in stylesheet host and protocol to prevent Chrome breakage. [20673](https://github.com/WordPress/gutenberg/pull/20673)
+ - Fix IE11 editor breakage. [20226](https://github.com/WordPress/gutenberg/pull/20226)
+ - Fix incorrectly displayed preview option for private post types. [20604](https://github.com/WordPress/gutenberg/pull/20604)
+ - Focus preview button after opening preview. [20570](https://github.com/WordPress/gutenberg/pull/20570)
+- Fix isURL regex to take account file urls. [20435](https://github.com/WordPress/gutenberg/pull/20435)
+- Fix error when deleting empty paragraphs in IE11. [20594](https://github.com/WordPress/gutenberg/pull/20594)
+- Fix hidden inserter toggle behind the popover. [20663](https://github.com/WordPress/gutenberg/pull/20663)
+- Fix block registration shared defaults reuse across blocks. [20565](https://github.com/WordPress/gutenberg/pull/20565)
+- Shim meta attributes for early block registrations. [20544](https://github.com/WordPress/gutenberg/pull/20544)
+- Fix bouncing Custom color formatter. [20612](https://github.com/WordPress/gutenberg/pull/20612)
+- Fix Gallery block styles in Edge causing editor breakage. [20690](https://github.com/WordPress/gutenberg/pull/20690)
+
+### New APIs:
+
+- @wordpress/env: Add support for ZIP URL sources. [20426](https://github.com/WordPress/gutenberg/pull/20426)
+
+### Experiments
+
+- Lighter Block DOM: allow block types to render their own wrapper [19701](https://github.com/WordPress/gutenberg/pull/19701)
+ - Lighter InnerBlocks. [19910](https://github.com/WordPress/gutenberg/pull/19910)
+ - Automatically add block class. [20658](https://github.com/WordPress/gutenberg/pull/20658)
+- BlockPreview: Add __experimentalOnReady prop. [17242](https://github.com/WordPress/gutenberg/pull/17242)
+- Edit Site:
+ - Update template navigation to use new link control. [20366](https://github.com/WordPress/gutenberg/pull/20366)
+ - Update the edit site save modal UI. [20608](https://github.com/WordPress/gutenberg/pull/20608)
+- Fix the block toolbar in the Widgets and Site Edit screens. [20458](https://github.com/WordPress/gutenberg/pull/20458)
+- Fix widgets screen inserter [20680](https://github.com/WordPress/gutenberg/pull/20680)
+
+### Documentation
+
+- Add tutorial for creating a custom block editor instance. [20410](https://github.com/WordPress/gutenberg/pull/20410)
+- Create a new "Gutenberg as a Platform" page. [20666](https://github.com/WordPress/gutenberg/pull/20666)
+- Typos and tweaks: [20382](https://github.com/WordPress/gutenberg/pull/20382), [20386](https://github.com/WordPress/gutenberg/pull/20386), [20517](https://github.com/WordPress/gutenberg/pull/20517), [20662](https://github.com/WordPress/gutenberg/pull/20662), [20454](https://github.com/WordPress/gutenberg/pull/20454), [20659](https://github.com/WordPress/gutenberg/pull/20659).
+
+### Code Quality
+
+- Refactoring to existing blocks to use a lighter DOM:
+ - List block. [20498](https://github.com/WordPress/gutenberg/pull/20498)
+ - Image block. [20576](https://github.com/WordPress/gutenberg/pull/20576)
+ - Heading. [20493](https://github.com/WordPress/gutenberg/pull/20493)
+- Consistent block focus behaviour on mount. [20577](https://github.com/WordPress/gutenberg/pull/20577)
+- Cleanup CSS variables. [20529](https://github.com/WordPress/gutenberg/pull/20529)
+- Use the EditorSkeleton component in the widgets and Edit Site pages. [20440](https://github.com/WordPress/gutenberg/pull/20440), [20431](https://github.com/WordPress/gutenberg/pull/20431).
+- Refactor SlotFill components. [19242](https://github.com/WordPress/gutenberg/pull/19242)
+- Remove useless style override for floats. [20501](https://github.com/WordPress/gutenberg/pull/20501)
+- Block popover: remove data-type. [20531](https://github.com/WordPress/gutenberg/pull/20531)
+- Resizable editor improvements. [20259](https://github.com/WordPress/gutenberg/pull/20259)
+
+### Various
+
+- @wordpress/env:
+ - Save the database as a volume. [20648](https://github.com/WordPress/gutenberg/pull/20648)
+ - Fix accidental quotes in Site Title. [20520](https://github.com/WordPress/gutenberg/pull/20520)
+ - Set owner of wp-content to www-data. [20406](https://github.com/WordPress/gutenberg/pull/20406)
+- @wordpress/create-block:
+ - Fix system requirements checks. [20461](https://github.com/WordPress/gutenberg/pull/20461) [20456](https://github.com/WordPress/gutenberg/pull/20456)
+- Fix React warning triggered by the BlockToolbar component. [20546](https://github.com/WordPress/gutenberg/pull/20546)
+- Skip the Type Writer effect component in IE 11. [20485](https://github.com/WordPress/gutenberg/pull/20485)
+- Update browserslist to fix out-of-date caniuse-lite messages [20709](https://github.com/WordPress/gutenberg/pull/20709)
+- Add storybook stories:
+ - TextControl [20467](https://github.com/WordPress/gutenberg/pull/20467)
+ - TextAreaControl [20472](https://github.com/WordPress/gutenberg/pull/20472)
+ - SelectControl [20482](https://github.com/WordPress/gutenberg/pull/20482)
+ - Tooltip [20322](https://github.com/WordPress/gutenberg/pull/20322)
+- E2E Tests:
+ - Add test for the Image block. [20622](https://github.com/WordPress/gutenberg/pull/20622)
+ - More stable embed test. [20668](https://github.com/WordPress/gutenberg/pull/20668)
+ - Fix intermittent RichText e2e test failure. [20457](https://github.com/WordPress/gutenberg/pull/20457)
+- Travis: Avoid skipping Puppeteer download. [20547](https://github.com/WordPress/gutenberg/pull/20547)
+- Plugin: Bump minimum WordPress version to 5.3 [20628](https://github.com/WordPress/gutenberg/pull/20628)
+- @wordrpess/priority-queue: Fix for environments that don't have `window` defined. [20486](https://github.com/WordPress/gutenberg/pull/20486)
+- Update jest configuration to only ignore tests from /wordpress/ as a subdirectory [20420](https://github.com/WordPress/gutenberg/pull/20420)
+
+
+
= 7.6.0 =
## Features
diff --git a/docs/contributors/coding-guidelines.md b/docs/contributors/coding-guidelines.md
index a8f0698fa4a5c2..ba904db9cc9226 100644
--- a/docs/contributors/coding-guidelines.md
+++ b/docs/contributors/coding-guidelines.md
@@ -216,7 +216,7 @@ Custom types should be named as succinctly as possible, while still retaining cl
/**
* A block selection object.
*
- * @typedef {Object} WPBlockSelection
+ * @typedef WPBlockSelection
*
* @property {string} clientId A block client ID.
* @property {string} attributeKey A block attribute key.
@@ -225,6 +225,8 @@ Custom types should be named as succinctly as possible, while still retaining cl
*/
```
+Note that there is no `{Object}` between `@typedef` and the type name. As `@property`s below tells us that it is a type for objects, it is recommend to not use `{Object}` when you want to define types for your objects.
+
Custom types can also be used to describe a set of predefined options. While the [type union](https://jsdoc.app/tags-type.html) can be used with literal values as an inline type, it can be difficult to align tags while still respecting a maximum line length of 80 characters. Using a custom type to define a union type can afford the opportunity to describe the purpose of these options, and helps to avoid these line length issues.
```js
@@ -269,24 +271,26 @@ If you use a [TypeScript integration](https://github.com/Microsoft/TypeScript/wi
For packages which do not distribute their own TypeScript types, you are welcomed to install and use the [DefinitelyTyped](http://definitelytyped.org/) community-maintained types definitions, if one exists.
-### Record Types
+### Generic Types
When documenting a generic type such as `Object`, `Function`, `Promise`, etc., always include details about the expected record types.
```js
-// Incorrect:
+// Bad:
/** @type {Object} */
/** @type {Function} */
/** @type {Promise} */
-// Correct:
+// Good:
-/** @type {Object} */
+/** @type {Record} */ /* or */ /** @type {{[setting:string]:any}} */
/** @type {(key:string)=>boolean} */
/** @type {Promise} */
```
+When an object is used as a dictionary, you can define its type in 2 ways: indexable interface (`{[setting:string]:any}`) or `Record`. When the name of the key for an object provides hints for developers what to do like `setting`, use indexable interface. If not, use `Record`.
+
The function expression here uses TypeScript's syntax for function types, which can be useful in providing more detailed information about the names and types of the expected parameters. For more information, consult the [TypeScript `@type` tag function recommendations](https://www.typescriptlang.org/docs/handbook/type-checking-javascript-files.html#type).
In more advanced cases, you may define your own custom types as a generic type using the [TypeScript `@template` tag](https://www.typescriptlang.org/docs/handbook/type-checking-javascript-files.html#template).
@@ -312,7 +316,7 @@ Similar to the "Custom Types" advice concerning type unions and with literal val
/**
* Hash of breakpoint names with pixel width at which it becomes effective.
*
- * @type {Object}
+ * @type {Record}
*/
const BREAKPOINTS = { huge: 1440 /* , ... */ };
```
@@ -409,7 +413,7 @@ When documenting an example, use the markdown \`\`\` code block to
* select( 'my-shop' ).getPrice( 'hammer' );
* ```
*
- * @return {Object} Object containing the store's
+ * @return {Record} Object containing the store's
* selectors.
*/
````
diff --git a/docs/contributors/getting-started.md b/docs/contributors/getting-started.md
index 1a5656887b3601..a4414814ed3491 100644
--- a/docs/contributors/getting-started.md
+++ b/docs/contributors/getting-started.md
@@ -2,7 +2,7 @@
Gutenberg is a Node.js-based project, built primarily in JavaScript.
-The first step is to install the [latest active LTS release](https://github.com/nodejs/Release#release-schedule) of Node. The easiest way (on macOS, Linux, or Windows 10 with the Linux Subsystem) is by installing and running [nvm]. Once `nvm` is installed, you can install the correct version of Node by running `nvm install` in the Gutenberg directory.
+The first step is to install the [latest active LTS release](https://github.com/nodejs/Release#release-schedule) of Node, along with the latest version of [NPM](https://www.npmjs.com/). The easiest way (on macOS, Linux, or Windows 10 with the Linux Subsystem) is by installing and running [nvm]. Once `nvm` is installed, you can install the correct version of Node by running `nvm install --latest-npm` in the Gutenberg directory.
Once you have Node installed, run these scripts from within your local Gutenberg repository:
@@ -15,6 +15,8 @@ npm run build
This will build Gutenberg, ready to be used as a WordPress plugin!
+`npm run build` is intended for one-off compilations of the project. If you're planning to do continued development in the source files, using `npm run dev` will most often be the better option. This will configure the build to avoid minifying the generated output, rebuild files automatically as they are changed in your working directory, and configure dependencies as running in a development environment so that useful warnings and errors are logged to your browser's developer console.
+
If you don't have a local WordPress environment to load Gutenberg in, we can help get that up and running, too.
## Local Environment
@@ -54,9 +56,13 @@ See the [relevant section in `wp-env` docs](https://github.com/WordPress/gutenbe
## On A Remote Server
-Open a terminal (or if on Windows, a command prompt) and navigate to the repository you cloned. Now type `npm install` to get the dependencies all set up. Once that finishes, you can type `npm run build`. You can now upload the entire repository to your `wp-content/plugins` directory on your web server and activate the plugin from the WordPress admin.
+You can use a remote server in development by building locally and then uploading the built files as a plugin to the remote server.
+
+To build: open a terminal (or if on Windows, a command prompt) and navigate to the repository you cloned. Now type `npm install` to get the dependencies all set up. Once that finishes, you can type `npm run build`.
+
+After building the cloned gutenberg directory contains the complete plugin, you can upload the entire repository to your `wp-content/plugins` directory and activate the plugin from the WordPress admin.
-You can also type `npm run package-plugin` which will run the two commands above and create a zip file automatically for you which you can use to install Gutenberg through the WordPress admin.
+Another way to upload after building is to run `npm run package-plugin` to create a plugin zip file — this requires `bash` and `php` to run. The script creates `gutenberg.zip` that you can use to install Gutenberg through the WordPress admin.
[npm]: https://www.npmjs.com/
[nvm]: https://github.com/creationix/nvm
diff --git a/docs/contributors/readme.md b/docs/contributors/readme.md
index b04de2a382c606..e51702b7248424 100644
--- a/docs/contributors/readme.md
+++ b/docs/contributors/readme.md
@@ -14,7 +14,7 @@ Find the section below based on what you are looking to contribute:
- **Documentation?** See the [documentation section](/docs/contributors/document.md)
-- **Triage Support?** See the [triaging issues section](/docs/contributors/repository-management/#triaging-issues)
+- **Triage Support?** See the [triaging issues section](/docs/contributors/triage.md)
- **Internationalization?** See the [localizing and translating section](/docs/contributors/localizing.md)
diff --git a/docs/contributors/repository-management.md b/docs/contributors/repository-management.md
index cf7dbcee1b25eb..e9149f033204bf 100644
--- a/docs/contributors/repository-management.md
+++ b/docs/contributors/repository-management.md
@@ -23,7 +23,7 @@ Any issues that are irrelevant or not actionable should be closed, because they
### Labels
-All issues should have [one or more labels](https://github.com/WordPress/gutenberg/labels).
+All issues should have [one or more labels](https://github.com/WordPress/gutenberg/labels).
Workflow labels start with “Needs” and may be applied as needed. Ideally, each workflow label will have a group that follows it, such as the Accessibility Team for `Needs Accessibility Feedback`, the Testing Team for `Needs Testing`, etc.
@@ -60,32 +60,7 @@ To keep the issue list healthy, it needs to be triaged regularly. *Triage* is th
Anyone can help triage, although you’ll need contributor permission on the Gutenberg repository to modify an issue’s labels or edit its title.
-To start simply choose from one of these filtered lists of issues:
-
-- [All Gutenberg issues without an assigned label](https://github.com/wordpress/gutenberg/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-asc+no%3Alabel). Triaging by simply adding labels helps people focused on certain aspects of Gutenberg find relevant issues easier and start working on them.
-- [The least recently updated Gutenberg issues](https://github.com/WordPress/gutenberg/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-asc). Triaging issues that are getting old and possibly out of date keeps important work from being overlooked.
-- [All Gutenberg issues with no comments](https://github.com/WordPress/gutenberg/issues?q=is%3Aopen+is%3Aissue+sort%3Acomments-asc) Triaging this list helps make sure all issues are acknowledged, and can help identify issues that may need more information or discussion before they are actionable.
-- [The least commented on issues](https://github.com/WordPress/gutenberg/issues?q=is%3Aopen+is%3Aissue+sort%3Acomments-asc) Triaging this list helps the community figure out things like traction for certain proposals.
-
-You can also create your own custom set of filters on GitHub. If you have a filter you think might be useful for the community, feel free to submit a PR to add it to this list.
-
-When triaging, either one of the lists above or issues in general, here are some steps you can perform:
-
-- First search for duplicates. If the issue is duplicate, close it by commenting with “Duplicate of #” and add any relevant new details to the existing issue.
-- If the issue is missing labels, add some to better categorize it (requires proper permissions).
-- If the title doesn’t communicate the issue, edit it for clarity (requires proper permissions).
-- If it’s a bug report, test to confirm the report or add the `Needs Testing` label. If there is not enough information to confirm the report, add the `[Status] Needs More Info` label and ask for the details needed.
-- Remove the `[Status] Needs More Info` if the author of the issue has responded with enough details.
-- Close the issue with a note if it has a `[Status] Needs More Info` label but the author didn't respond in 2+ weeks.
-- If there was conversation on the issue but no actionable steps identified, follow up with the participants to see what’s actionable.
-- If you feel comfortable triaging the issue further, then you can also:
- - Check that the bug report is valid by debugging it to see if you can track down the technical specifics.
- - Check if the issue is missing some detail and see if you can fill in those details. For instance, if a bug report is missing visual detail, it’s helpful to reproduce the issue locally and upload a screenshot or GIF.
-
-For triaging there are some labels which are very useful:
-- `Needs Technical Feedback` - you can apply them when you see new features or API changes proposed
-- `Needs More Info` - when it’s not clear what the issue is or it would help to provide additional details
-- `Needs Testing` - it’s useful for old bugs where it seems like they are no longer relevant
+See the [Triage Contributors guide](/docs/contributors/triage.md) for details.
## Pull Requests
diff --git a/docs/contributors/testing-overview.md b/docs/contributors/testing-overview.md
index 5d467ddf2f99a9..9c72b8ff33bc87 100644
--- a/docs/contributors/testing-overview.md
+++ b/docs/contributors/testing-overview.md
@@ -344,12 +344,6 @@ test( 'should contain mars if planets is true', () => {
It's tempting to snapshot deep renders, but that makes for huge snapshots. Additionally, deep renders no longer test a single component, but an entire tree. With `shallow`, we snapshot just the components that are directly rendered by the component we want to test.
-### StoryShots
-
-> [StoryShots](https://www.npmjs.com/package/@storybook/addon-storyshots) adds automatic Jest Snapshot Testing for [Storybook](https://storybook.js.org/).
-
-Whenever a new story is added to Storybook, `npm run test-unit` needs to be executed to generate the corresponding snapshots. In the case when the existing story gets updated or removed, please refer to [Working with snapshots](#working-with-snapshots) section.
-
#### Troubleshooting
Sometimes we need to mock refs for some stories which use them. Check the following documents to learn more:
@@ -372,7 +366,9 @@ To locally run the tests in debug mode, follow these steps:
5. Click on the "Play" button to resume execution
6. Enjoy debugging the native mobile unit tests!
-## End to end Testing
+## End-to-end Testing
+
+End-to-end tests use [Puppeteer](https://github.com/puppeteer/puppeteer) as a headless Chromium driver, and are otherwise still run by a [Jest](https://jestjs.io/) test runner.
If you're using the built-in [local environment](/docs/contributors/getting-started.md#local-environment), you can run the e2e tests locally using this command:
diff --git a/docs/contributors/triage.md b/docs/contributors/triage.md
new file mode 100644
index 00000000000000..45e564ebf322d0
--- /dev/null
+++ b/docs/contributors/triage.md
@@ -0,0 +1,78 @@
+## Get involved in triage
+To keep the issue list healthy, it needs to be triaged regularly. Triage is the practice of reviewing existing issues to make sure they’re relevant, actionable, and have all the information they need.
+Anyone can help triage, although you’ll need to be a member of the triage team for the Gutenberg repository to modify an issue’s labels or edit its title.
+
+## Join the triage team
+The triage team is an open group of people with a particular role of making sure triage is done consistently across the Gutenberg repo. There are various types of triage which happen:
+
+* Regular self triage sessions
+* Organised triage sessions
+* Focusing on a specific board, label or feature to triage
+
+If you would like to join this team, you can through asking in #core-editor Slack at any time.
+
+These are the expectations of being a team member:
+
+* As a member of the triage team, you are expected to at least once a week do some triage even if it is self triage.
+* Some people might join this team to focus on a specific label or board, in that case their focus is there.
+* Try and join triage sessions.
+
+## Getting started
+To start simply choose from one of these filtered lists of issues:
+
+* All Gutenberg issues without an assigned label. Triaging by simply adding labels helps people focused on certain aspects of Gutenberg find relevant issues easier and start working on them.
+* The least recently updated Gutenberg issues. Triaging issues that are getting old and possibly out of date keeps important work from being overlooked.
+* All Gutenberg issues with no comments. Triaging this list helps make sure all issues are acknowledged, and can help identify issues that may need more information or discussion before they are actionable.
+* The least commented on issues Triaging this list helps the community figure out things like traction for certain proposals.
+* You can also create your own custom set of filters on GitHub. If you have a filter you think might be useful for the community, feel free to submit a PR to add it to this list.
+
+### Triage itself
+When triaging, either one of the lists above or issues in general, work through issues one-by-one. Here are some steps you can perform for each issue:
+
+* First search for duplicates. If the issue is duplicate, close it by commenting with “Duplicate of #” and add any relevant new details to the existing issue. (Don’t forget to search for duplicates among closed issues as well!)
+* If the issue is missing labels, add some to better categorize it (requires proper permissions).
+ ** A good starting place when adding labels is to apply one of the labels prefixed [Type] (e.g. [Type] Enhancement or [Type] Bug) to indicate what kind of issue it is.
+ ** After that consider adding more descriptive labels. If the issue concerns a particular core block, add one of the labels prefixed [Block]. Or if the issue affects a particular feature there are [Feature] labels.
+ ** Finally, there are labels that affect particular interest areas, like Accessibility and Internationalization
+* Consider adding priority if you can:
+ ** Priority OMGWTFBBQ:
+ *** Major issues that are causing failures and are reported frequently.
+ *** Typically, these are issues that are critical because they break important behaviour or functionality.
+ *** An example might be, “Unable to remove a block after it is added to the editor”. .
+ ** Priority: High:
+ *** Fits one of the current focuses: usually placing in that project board.
+ *** Major broken experience (including flow, visual bugs and blocks).
+ ** Priority: Low:
+ *** Enhancements that aren’t part of focuses.
+ *** Niche bugs.
+ *** Old browsers
+ ** Note that no priority label infers normal.
+* If the title doesn’t communicate the issue, edit it for clarity (requires proper permissions).
+* If it’s a bug report, test to confirm the report or add the Needs Testing label. If there is not enough information to confirm the report, add the [Status] Needs More Info label and ask for the details needed. It’s particularly beneficial when a bug report has steps for reproduction, ask the reporter to add those if they’re missing.
+* Remove the [Status] Needs More Info if the author of the issue has responded with enough details.
+* Close the issue with a note if it has a [Status] Needs More Info label but the author didn't respond in 2+ weeks.
+* If there was a conversation on the issue but no actionable steps identified, follow up with the participants to see what’s actionable.
+* If you feel comfortable triaging the issue further, then you can also:
+ ** Check that the bug report is valid by debugging it to see if you can track down the technical specifics.
+ ** Check if the issue is missing some detail and see if you can fill in those details. For instance, if a bug report is missing visual detail, it’s helpful to reproduce the issue locally and upload a screenshot or GIF.
+ ** Consider adding the Good First Issue label if you believe this is a relatively easy issue for a first-time contributor to try to solve.
+
+For triaging there are some labels which are very useful:
+* Needs Technical Feedback - you can apply them when you see new features or API changes proposed
+* Needs More Info - when it’s not clear what the issue is or it would help to provide additional details
+* Needs Testing - it’s useful for old bugs where it seems like they are no longer relevant
+
+## Design specific triage
+Along with the general triage flows listed previously, there are some specific additions to the flows for more design-centric triage:
+
+* PR testing and reviews: ideally this is your first stop, particularly in daily self triage.
+* Needs design feedback: check this does need design feedback and if possible give it. You can organise this by priority, project boards or by least commented.
+ ** Ask for screenshots to see if unable to.
+ ** Ask for iterations and note need to change before merging.
+ ** Once enough opinions remove the label and either go to needs design.
+ ** If this isn’t in a board, check it doesn’t fit in a specific focus.
+ ** If the issue/pull has not been prioritized yet, consider adding a priority.
+* Needs design:
+ ** Does it really need a design?
+ ** Does this fit a focus?
+ ** If it has a design mark as ‘needs design feedback’.
diff --git a/docs/designers-developers/designers/design-patterns.md b/docs/designers-developers/designers/user-interface.md
similarity index 72%
rename from docs/designers-developers/designers/design-patterns.md
rename to docs/designers-developers/designers/user-interface.md
index bf06df6da5e9df..1d688e27838d64 100644
--- a/docs/designers-developers/designers/design-patterns.md
+++ b/docs/designers-developers/designers/user-interface.md
@@ -1,18 +1,18 @@
-# Patterns
+# User Interface
-## Basic Editor Interface
+## The Block Editor
-The block editor’s general layout uses on a bar at the top, with content below.
+The block editor’s general layout uses a bar at the top, with content below.

-The **Toolbar** contains document-level actions: Editor mode, save status, global actions for undo/redo/insert, the settings toggle, and publish options.
+The **Toolbar** contains document-level actions: Editor/Select modes, save status, global actions for undo/redo/insert, the settings toggle, and publish options.
The **Content Area** contains the document itself.
The **Settings Sidebar** contains additional settings for the document (tags, categories, schedule etc.) and for blocks in the “Block” tab. A cog button in the toolbar hides the Settings Sidebar, allowing the user to enjoy a more immersive writing experience. On small screens, the sidebar is hidden by default.
-## The Block Interface
+## The Block
The block itself is the most basic unit of the editor. Generally speaking, everything is a block. Users build posts and pages using blocks, mimicking the vertical flow of the underlying HTML markup.
@@ -24,11 +24,11 @@ A selected block shows a number of contextual actions:
The block interface has basic actions. The block editor aims for good, common defaults, so users should be able to create a complete document without actually needing the advanced actions in the Settings Sidebar.
-**The Block Toolbar** highlights commonly-used actions. The **Block Chip** lives in the block toolbar, and contains high-level controls for the selected block. It primarily allows users to transform a block into another type of compatible block. Some blocks also use the block chip to users to choose from a set of alternate block styles.
+**The Block Toolbar** highlights commonly-used actions. The **Block Icon** lives in the block toolbar, and contains high-level controls for the selected block. It primarily allows users to transform a block into another type of compatible block. Some blocks also use the block icon for users to choose from a set of alternate block styles.
The **Block Formatting** options let users adjust block-level settings, and the **Inline Formatting** options allow adjustments to elements inside the block. When a block is long, the block toolbar pins itself to the top of the screen as the user scrolls down the page.
-Blocks can be moved up and down via the **Block Mover** icons on the left. Additional block actions are available on the right via an ellipsis menu: deleting and duplicating blocks, as well as **advanced actions** like “Edit as HTML” and “Convert to Reusable Block.”
+Blocks can be moved up and down via the **Block Mover** icons. Additional block actions are available via an ellipsis menu: deleting and duplicating blocks, as well as **advanced actions** like “Edit as HTML” and “Convert to Reusable Block.”
An unselected block does not show the block toolbar or any other contextual controls. In effect, an unselected block is a preview of the content itself:
@@ -47,7 +47,7 @@ The sidebar has two tabs, Document and Block:
Each tab has sets of editable fields (**Sidebar Sections**) that users can toggle open or closed.
-If a block requires advanced configuration, those settings should live in the Settings sidebar (Editor block settings can also be reached directly by clicking the cog icon next to a block). Don’t put anything in the sidebar block tab that is necessary for the basic operation of your block; your user might dismiss the sidebar for an immersive writing experience. Pick good defaults, and make important actions available in the block toolbar.
+If a block requires advanced configuration, those settings should live in the Settings Sidebar. Don’t put anything in the sidebar block tab that is necessary for the basic operation of your block; your user might dismiss the sidebar for an immersive writing experience. Pick good defaults, and make important actions available in the block toolbar.
Actions that could go in the block tab of the sidebar could be:
@@ -60,6 +60,4 @@ Actions that could go in the block tab of the sidebar could be:

-The **Block Library** appears when someone inserts a block, whether via the toolbar, or contextually within the content area. Inside, blocks are organized into expandable sections. The block library’s search bar auto-filters the list of blocks as the user types. Users can choose a block by selecting the **Block Button** or the **Block Name**.
-
-**Parent Blocks** (Blocks that contain children blocks) are represented by a layered block button.
+The **Block Library** appears when someone inserts a block, whether via the toolbar, or contextually within the content area. Inside, blocks are organized into expandable sections. The block library’s search bar auto-filters the list of blocks as the user types. Users can choose a block by selecting the **Block Button** or the **Block Name**.
diff --git a/docs/designers-developers/developers/block-api/block-context.md b/docs/designers-developers/developers/block-api/block-context.md
new file mode 100644
index 00000000000000..56289ef088c3e2
--- /dev/null
+++ b/docs/designers-developers/developers/block-api/block-context.md
@@ -0,0 +1,76 @@
+# Block Context
+
+Block context is a feature which enables ancestor blocks to provide values which can be consumed by descendent blocks within its own hierarchy. Those descendent blocks can inherit these values without resorting to hard-coded values and without an explicit awareness of the block which provides those values.
+
+This is especially useful in full-site editing where, for example, the contents of a block may depend on the context of the post in which it is displayed. A blogroll template may show excerpts of many different posts. Using block context, there can still be one single "Post Excerpt" block which displays the contents of the post based on an inherited post ID.
+
+If you are familiar with [React Context](https://reactjs.org/docs/context.html), block context adopts many of the same ideas. In fact, the client-side block editor implementation of block context is a very simple application of React Context. Block context is also supported in server-side `render_callback` implementations, demonstrated in the examples below.
+
+## Defining Block Context
+
+Block context is defined in the registered settings of a block. A block can provide a context value, or consume a value it seeks to inherit.
+
+### Providing Block Context
+
+A block can provide a context value by assigning a `providesContext` property in its registered settings. This is an object which maps a context name to one of the block's own attribute. The value corresponding to that attribute value is made available to descendent blocks and can be referenced by the same context name. Currently, block context only supports values derived from the block's own attributes. This could be enhanced in the future to support additional sources of context values.
+
+`record/block.json`
+
+```json
+{
+ "name": "my-plugin/record",
+ "attributes": {
+ "recordId": {
+ "type": "number"
+ }
+ },
+ "providesContext": {
+ "my-plugin/recordId": "recordId"
+ }
+}
+```
+
+As seen in the above example, it is recommended that you include a namespace as part of the name of the context key so as to avoid potential conflicts with other plugins or default context values provided by WordPress. The context namespace should be specific to your plugin, and in most cases can be the same as used in the name of the block itself.
+
+### Consuming Block Context
+
+A block can inherit a context value from an ancestor provider by assigning a `context` property in its registered settings. This should be assigned as an array of the context names the block seeks to inherit.
+
+`record-title/block.json`
+
+```json
+{
+ "name": "my-plugin/record-title",
+ "context": [ "my-plugin/recordId" ]
+}
+```
+
+## Using Block Context
+
+Once a block has defined the context it seeks to inherit, this can be accessed in the implementation of `edit` (JavaScript) and `render_callback` (PHP). It is provided as an object (JavaScript) or associative array (PHP) of the context values which have been defined for the block. Note that a context value will only be made available if the block explicitly defines a desire to inherit that value.
+
+### JavaScript
+
+`record-title/index.js`
+
+```js
+registerBlockType( 'my-plugin/record-title', {
+ edit( { context } ) {
+ return 'The current record ID is: ' + context[ 'my-plugin/recordId' ];
+ },
+} );
+```
+
+### PHP
+
+A block's context values are available from the `context` property of the `$block` argument passed to the `render_callback` function.
+
+`record-title/index.php`
+
+```php
+register_block_type( 'my-plugin/record-title', [
+ 'render_callback' => function( $block ) {
+ return 'The current record ID is: ' . $block->context['my-plugin/recordId'];
+ },
+] );
+```
diff --git a/docs/designers-developers/developers/block-api/block-patterns.md b/docs/designers-developers/developers/block-api/block-patterns.md
new file mode 100644
index 00000000000000..951818af01ebcb
--- /dev/null
+++ b/docs/designers-developers/developers/block-api/block-patterns.md
@@ -0,0 +1,37 @@
+# Patterns (Experimental)
+
+Patterns are predefined block layouts, ready to insert and tweak.
+
+**Note** Patterns are still under heavy development and the APIs are subject to change.
+
+#### register_pattern
+
+The editor comes with a list of built-in patterns. Theme and plugin authors can register addition custom patterns using the `register_pattern` function.
+
+The `register_pattern` function receives the name of the pattern as the first argument and an array describing properties of the pattern as the second argument.
+
+The properties of the style array must include `name` and `label`:
+ - `title`: A human-readable title for the pattern.
+ - `content`: Raw HTML content for the pattern.
+
+```php
+register_pattern(
+ 'my-plugin/my-awesome-pattern',
+ array(
+ 'title' => __( 'Two buttons', 'my-plugin' ),
+ 'content' => "\n\n",
+ )
+);
+```
+
+#### unregister_pattern
+
+`unregister_pattern` allows unregistering a pattern previously registered on the server using `register_pattern`.
+
+The function's argument is the registered name of the pattern.
+
+The following code sample unregisters the style named 'my-plugin/my-awesome-pattern':
+
+```php
+unregister_pattern( 'my-plugin/my-awesome-pattern' );
+```
diff --git a/docs/designers-developers/developers/block-api/block-registration.md b/docs/designers-developers/developers/block-api/block-registration.md
index bc07a3bc075285..e2c9f6ff71afcb 100644
--- a/docs/designers-developers/developers/block-api/block-registration.md
+++ b/docs/designers-developers/developers/block-api/block-registration.md
@@ -716,6 +716,14 @@ attributes: {
alignWide: false,
```
+- `defaultStylePicker` (default `true`): When the style picker is shown, a dropdown is displayed so the user can select a default style for this block type. If you prefer not to show the dropdown, set this property to `false`.
+
+```js
+// Remove the Default Style picker.
+defaultStylePicker: false,
+```
+
+
- `anchor` (default `false`): Anchors let you link directly to a specific block on a page. This property adds a field to define an id for the block and a button to copy the direct link.
```js
diff --git a/docs/designers-developers/developers/data/data-core-annotations.md b/docs/designers-developers/developers/data/data-core-annotations.md
index e71aefd27d2129..0b5840c617d1e4 100644
--- a/docs/designers-developers/developers/data/data-core-annotations.md
+++ b/docs/designers-developers/developers/data/data-core-annotations.md
@@ -4,17 +4,17 @@ Namespace: `core/annotations`.
## Selectors
-
+
Nothing to document.
-
-
+
## Actions
-
+
Nothing to document.
-
+
+
diff --git a/docs/designers-developers/developers/data/data-core-block-editor.md b/docs/designers-developers/developers/data/data-core-block-editor.md
index 588b1f27e32499..e19a7cb52c12b1 100644
--- a/docs/designers-developers/developers/data/data-core-block-editor.md
+++ b/docs/designers-developers/developers/data/data-core-block-editor.md
@@ -4,7 +4,7 @@ Namespace: `core/block-editor`.
## Selectors
-
+
# **canInsertBlockType**
@@ -706,6 +706,19 @@ _Returns_
- `boolean`: Whether an ancestor of the block is in multi-selection set.
+# **isBlockHighlighted**
+
+Returns true if the current highlighted block matches the block clientId.
+
+_Parameters_
+
+- _state_ `Object`: Global application state.
+- _clientId_ `string`: The block to check.
+
+_Returns_
+
+- `boolean`: Whether the block is currently highlighted.
+
# **isBlockInsertionPointVisible**
Returns true if we should show the block insertion point.
@@ -894,12 +907,11 @@ _Returns_
- `?boolean`: Whether the template is valid or not.
-
-
+
## Actions
-
+
# **clearSelectedBlock**
@@ -1296,6 +1308,15 @@ _Returns_
- `Object`: Action object.
+# **toggleBlockHighlight**
+
+Returns an action object that toggles the highlighted block state.
+
+_Parameters_
+
+- _clientId_ `string`: The block's clientId.
+- _isHighlighted_ `boolean`: The highlight state.
+
# **toggleBlockMode**
Returns an action object used to toggle the block editing mode between
@@ -1364,6 +1385,15 @@ _Returns_
# **updateSettings**
-Undocumented declaration.
+Returns an action object used in signalling that the block editor settings have been updated.
+
+_Parameters_
+
+- _settings_ `Object`: Updated settings
+
+_Returns_
+
+- `Object`: Action object
+
-
+
diff --git a/docs/designers-developers/developers/data/data-core-blocks.md b/docs/designers-developers/developers/data/data-core-blocks.md
index 933c432cd93260..8d577f4fca040c 100644
--- a/docs/designers-developers/developers/data/data-core-blocks.md
+++ b/docs/designers-developers/developers/data/data-core-blocks.md
@@ -4,7 +4,7 @@ Namespace: `core/blocks`.
## Selectors
-
+
# **getBlockStyles**
@@ -231,12 +231,11 @@ _Returns_
- `Array`: Whether block type matches search term.
-
-
+
## Actions
-
+
# **addBlockCollection**
@@ -417,4 +416,5 @@ _Returns_
- `Object`: Action object.
-
+
+
diff --git a/docs/designers-developers/developers/data/data-core-edit-post.md b/docs/designers-developers/developers/data/data-core-edit-post.md
index 49801a69817be8..05714b83bcda7b 100644
--- a/docs/designers-developers/developers/data/data-core-edit-post.md
+++ b/docs/designers-developers/developers/data/data-core-edit-post.md
@@ -4,7 +4,7 @@ Namespace: `core/edit-post`.
## Selectors
-
+
# **getActiveGeneralSidebarName**
@@ -267,21 +267,16 @@ _Returns_
- `boolean`: Whether the metaboxes are being saved.
-
-
+
## Actions
-
+
# **closeGeneralSidebar**
Returns an action object signalling that the user closed the sidebar.
-_Returns_
-
-- `Object`: Action object.
-
# **closeModal**
Returns an action object signalling that the user closed a modal.
@@ -326,11 +321,7 @@ Returns an action object used in signalling that the user opened an editor sideb
_Parameters_
-- _name_ `string`: Sidebar name to be opened.
-
-_Returns_
-
-- `Object`: Action object.
+- _name_ `?string`: Sidebar name to be opened.
# **openModal**
@@ -472,4 +463,5 @@ _Returns_
- `Object`: Action object.
-
+
+
diff --git a/docs/designers-developers/developers/data/data-core-editor.md b/docs/designers-developers/developers/data/data-core-editor.md
index babe2b12d1c96d..ffba8e67b9aa30 100644
--- a/docs/designers-developers/developers/data/data-core-editor.md
+++ b/docs/designers-developers/developers/data/data-core-editor.md
@@ -4,7 +4,7 @@ Namespace: `core/editor`.
## Selectors
-
+
# **canInsertBlockType**
@@ -333,6 +333,20 @@ _Returns_
- `?string`: Preview Link.
+# **getEditedPostSlug**
+
+Returns the slug for the post being edited, preferring a manually edited
+value if one exists, then a sanitized version of the current post title, and
+finally the post ID.
+
+_Parameters_
+
+- _state_ `Object`: Editor state.
+
+_Returns_
+
+- `string`: The current slug to be displayed in the editor
+
# **getEditedPostVisibility**
Returns the current visibility of the post being edited, preferring the
@@ -1046,12 +1060,11 @@ _Related_
- isValidTemplate in core/block-editor store.
-
-
+
## Actions
-
+
# **autosave**
@@ -1497,4 +1510,5 @@ _Returns_
- `Object`: Action object.
-
+
+
diff --git a/docs/designers-developers/developers/data/data-core-keyboard-shortcuts.md b/docs/designers-developers/developers/data/data-core-keyboard-shortcuts.md
index 9db8ab7ce2d362..fefa8e189e2150 100644
--- a/docs/designers-developers/developers/data/data-core-keyboard-shortcuts.md
+++ b/docs/designers-developers/developers/data/data-core-keyboard-shortcuts.md
@@ -4,7 +4,7 @@ Namespace: `core/keyboard-shortcuts`.
## Selectors
-
+
# **getAllShortcutRawKeyCombinations**
@@ -85,12 +85,11 @@ _Returns_
- `?string`: Shortcut representation.
-
-
+
## Actions
-
+
# **registerShortcut**
@@ -116,4 +115,5 @@ _Returns_
- `Object`: action.
-
+
+
diff --git a/docs/designers-developers/developers/data/data-core-notices.md b/docs/designers-developers/developers/data/data-core-notices.md
index 876977576f69bd..54dfbdd8d84ed8 100644
--- a/docs/designers-developers/developers/data/data-core-notices.md
+++ b/docs/designers-developers/developers/data/data-core-notices.md
@@ -4,7 +4,7 @@ Namespace: `core/notices`.
## Selectors
-
+
# **getNotices**
@@ -20,12 +20,11 @@ _Returns_
- `Array`: Array of notices.
-
-
+
## Actions
-
+
# **createErrorNotice**
@@ -132,4 +131,5 @@ _Returns_
- `Object`: Action object.
-
+
+
diff --git a/docs/designers-developers/developers/data/data-core-nux.md b/docs/designers-developers/developers/data/data-core-nux.md
index 92dcf6be1d0ac2..ad0a93e2bde235 100644
--- a/docs/designers-developers/developers/data/data-core-nux.md
+++ b/docs/designers-developers/developers/data/data-core-nux.md
@@ -4,7 +4,7 @@ Namespace: `core/nux`.
## Selectors
-
+
# **areTipsEnabled**
@@ -47,12 +47,11 @@ _Returns_
- `boolean`: Whether or not the given tip is showing.
-
-
+
## Actions
-
+
# **disableTips**
@@ -97,4 +96,5 @@ _Returns_
- `Object`: Action object.
-
+
+
diff --git a/docs/designers-developers/developers/data/data-core-viewport.md b/docs/designers-developers/developers/data/data-core-viewport.md
index b8f133834ec594..4f776c53efbca7 100644
--- a/docs/designers-developers/developers/data/data-core-viewport.md
+++ b/docs/designers-developers/developers/data/data-core-viewport.md
@@ -4,7 +4,7 @@ Namespace: `core/viewport`.
## Selectors
-
+
# **isViewportMatch**
@@ -26,12 +26,11 @@ _Returns_
- `boolean`: Whether viewport matches query.
-
-
+
## Actions
-
+
# **setIsMatching**
@@ -47,4 +46,5 @@ _Returns_
- `Object`: Action object.
-
+
+
diff --git a/docs/designers-developers/developers/data/data-core.md b/docs/designers-developers/developers/data/data-core.md
index 79f3f41991c08f..142538c6354687 100644
--- a/docs/designers-developers/developers/data/data-core.md
+++ b/docs/designers-developers/developers/data/data-core.md
@@ -4,7 +4,7 @@ Namespace: `core`.
## Selectors
-
+
# **canUser**
@@ -71,6 +71,18 @@ _Returns_
- `?Array`: An array of autosaves for the post, or undefined if there is none.
+# **getCurrentTheme**
+
+Return the current theme.
+
+_Parameters_
+
+- _state_ `Object`: Data state.
+
+_Returns_
+
+- `Object`: The current theme.
+
# **getCurrentUser**
Returns the current user.
@@ -200,7 +212,7 @@ _Parameters_
_Returns_
-- `Array`: Records.
+- `?Array`: Records.
# **getLastEntitySaveError**
@@ -441,12 +453,11 @@ _Returns_
- `boolean`: Whether the entity record is saving or not.
-
-
+
## Actions
-
+
# **addEntities**
@@ -492,6 +503,18 @@ _Returns_
- `Object`: Action object.
+# **receiveCurrentTheme**
+
+Returns an action object used in signalling that the current theme has been received.
+
+_Parameters_
+
+- _currentTheme_ `Object`: The current theme.
+
+_Returns_
+
+- `Object`: Action object.
+
# **receiveCurrentUser**
Returns an action used in signalling that the current user has been received.
@@ -617,4 +640,5 @@ _Parameters_
Action triggered to undo the last edit to
an entity record, if any.
-
+
+
diff --git a/docs/designers-developers/developers/filters/block-filters.md b/docs/designers-developers/developers/filters/block-filters.md
index 7a75fbae9d5ee1..f9a5ec173cd30a 100644
--- a/docs/designers-developers/developers/filters/block-filters.md
+++ b/docs/designers-developers/developers/filters/block-filters.md
@@ -324,12 +324,25 @@ wp.hooks.addFilter( 'editor.BlockListBlock', 'my-plugin/with-client-id-class-nam
Adding blocks is easy enough, removing them is as easy. Plugin or theme authors have the possibility to "unregister" blocks.
+{% codetabs %}
+{% ES5 %}
```js
// my-plugin.js
wp.domReady( function() {
wp.blocks.unregisterBlockType( 'core/verse' );
} );
```
+{% ESNext %}
+```js
+// my-plugin.js
+import { unregisterBlockType } from '@wordpress/blocks';
+import domReady from '@wordpress/dom-ready'
+
+domReady( function() {
+ unregisterBlockType( 'core/verse' );
+} );
+```
+{% end %}
and load this script in the Editor
@@ -347,6 +360,8 @@ function my_plugin_blacklist_blocks() {
add_action( 'enqueue_block_editor_assets', 'my_plugin_blacklist_blocks' );
```
+**Important:** When unregistering a block, there can be a [race condition](https://en.wikipedia.org/wiki/Race_condition) on which code runs first: registering the block, or unregistering the block. You want your unregister code to run last. The way to do that is specify the component that is registering the block as a dependency, in this case `wp-edit-post`. Additionally, using `wp.domReady()` ensures the unregister code runs once the dom is loaded.
+
### Using a whitelist
If you want to disable all blocks except a whitelisted list, you can adapt the script above like so:
diff --git a/docs/designers-developers/developers/filters/editor-filters.md b/docs/designers-developers/developers/filters/editor-filters.md
index 16c30fc3179aae..5ece3004875fe8 100644
--- a/docs/designers-developers/developers/filters/editor-filters.md
+++ b/docs/designers-developers/developers/filters/editor-filters.md
@@ -41,12 +41,12 @@ The filter will send any setting to the initialized Editor, which means any edit
### Available default editor settings
#### `richEditingEnabled`
-If it is `true` the user can edit the content using the Visual Editor.
+If it is `true` the user can edit the content using the visual editor.
-It is set by default to the return value of the [`user_can_richedit`](https://developer.wordpress.org/reference/functions/user_can_richedit/) function. It checks if the user can access the Visual Editor and whether it’s supported by the user’s browser.
+It is set by default to the return value of the [`user_can_richedit`](https://developer.wordpress.org/reference/functions/user_can_richedit/) function. It checks if the user can access the visual editor and whether it’s supported by the user’s browser.
#### `codeEditingEnabled`
-Default `true`. Indicates whether the user can access the Code Editor **in addition** to the Visual Editor.
+Default `true`. Indicates whether the user can access the code editor **in addition** to the visual editor.
-If set to false the user will not be able to switch between Visual and Code editor. The option in the settings menu will not be available and the keyboard shortcut for switching editor types will not fire.
+If set to false the user will not be able to switch between visual and code editor. The option in the settings menu will not be available and the keyboard shortcut for switching editor types will not fire.
diff --git a/docs/designers-developers/developers/platform/README.md b/docs/designers-developers/developers/platform/README.md
index dae0944cb1ef0d..7a070ea9d23f7a 100644
--- a/docs/designers-developers/developers/platform/README.md
+++ b/docs/designers-developers/developers/platform/README.md
@@ -27,6 +27,8 @@ function MyApp() {
}
```
+Many components include CSS to add style, you will need to include for the components to appear correctly. The component stylesheet can be found in `node_modules/@wordpress/components/build-style/style.css`, you can link directly or copy and include it in your project.
+
## Development Scripts
The [wp-scripts package](https://developer.wordpress.org/block-editor/packages/packages-scripts/) is a collection of reusable scripts for JavaScript development — includes scripts for building, linting, and testing — all with no additional configuration files.
diff --git a/docs/designers-developers/developers/slotfills/README.md b/docs/designers-developers/developers/slotfills/README.md
index 1fde71f171f99b..2b241ffb979ca7 100644
--- a/docs/designers-developers/developers/slotfills/README.md
+++ b/docs/designers-developers/developers/slotfills/README.md
@@ -14,21 +14,17 @@ In order to access the SlotFills, we need to do four things:
3. Define a method to render our changes. Our changes/additions will be wrapped in the SlotFill component we imported.
4. Register the plugin.
-
-
Here is an example using the `PluginPostStatusInfo` slotFill:
-```js
-const { registerPlugin } = wp.plugins;
-const { PluginPostStatusInfo } = wp.editPost;
+```js
+import { registerPlugin } from '@wordpress/plugins';
+import { PluginPostStatusInfo } from '@wordpress/edit-post';
-const PluginPostStatusInfoTest = () => {
- return(
-
- Post Status Info SlotFill
-
- )
-}
+const PluginPostStatusInfoTest = () => (
+
+ Post Status Info SlotFill
+
+);
registerPlugin( 'post-status-info-test', { render: PluginPostStatusInfoTest } );
```
@@ -62,7 +58,6 @@ const PluginPostStatusInfo = ( { children, className } ) => (
PluginPostStatusInfo.Slot = Slot;
export default PluginPostStatusInfo;
-
```
This new Slot is then exposed in the editor. The example below is from core and represents the Status & visibility panel.
@@ -73,31 +68,34 @@ Any items that have been added via the SlotFill ( see the example above ), will
See [core code](https://github.com/WordPress/gutenberg/tree/master/packages/edit-post/src/components/sidebar/post-status/index.js#L26).
```js
-function PostStatus( { isOpened, onTogglePanel } ) {
- return (
-
-
- { ( fills ) => (
-
-
-
-
-
-
-
- { fills }
-
-
- ) }
-
-
- );
-}
+const PostStatus = ( { isOpened, onTogglePanel } ) => (
+
+
+ { ( fills ) => (
+
+
+
+
+
+
+
+ { fills }
+
+
+ ) }
+
+
+);
```
## Currently available SlotFills and examples
-There are currently seven available SlotFills in the `edit-post` package. Please refer to the individual items below for usage and example details:
+There are currently eight available SlotFills in the `edit-post` package. Please refer to the individual items below for usage and example details:
* [PluginBlockSettingsMenuItem](/docs/designers-developers/developers/slotfills/plugin-block-settings-menu-item.md)
* [PluginDocumentSettingPanel](/docs/designers-developers/developers/slotfills/plugin-document-setting-panel.md)
@@ -107,7 +105,3 @@ There are currently seven available SlotFills in the `edit-post` package. Please
* [PluginPrePublishPanel](/docs/designers-developers/developers/slotfills/plugin-pre-publish-panel.md)
* [PluginSidebar](/docs/designers-developers/developers/slotfills/plugin-sidebar.md)
* [PluginSidebarMoreMenuItem](/docs/designers-developers/developers/slotfills/plugin-sidebar-more-menu-item.md)
-
-
-
-
diff --git a/docs/designers-developers/developers/slotfills/plugin-block-settings-menu-item.md b/docs/designers-developers/developers/slotfills/plugin-block-settings-menu-item.md
index ce81b96f3e1824..f96df587dc6243 100644
--- a/docs/designers-developers/developers/slotfills/plugin-block-settings-menu-item.md
+++ b/docs/designers-developers/developers/slotfills/plugin-block-settings-menu-item.md
@@ -1,24 +1,28 @@
# PluginBlockSettingsMenuItem
-This slot allows for adding a new item into the More Options area.
+This slot allows for adding a new item into the More Options area.
This will either appear in the controls for each block or at the Top Toolbar depending on the users setting.
-
## Example
```js
-const { registerPlugin } = wp.plugins;
-const { PluginBlockSettingsMenuItem } = wp.editPost;
+import { registerPlugin } from '@wordpress/plugins';
+import { PluginBlockSettingsMenuItem } from '@wordpress/edit-post';
const PluginBlockSettingsMenuGroupTest = () => (
{ alert( 'clicked' )} } />
-)
-
-registerPlugin( 'block-settings-menu-group-test', { render: PluginBlockSettingsMenuGroupTest } );
+ allowedBlocks={ [ 'core/paragraph' ] }
+ icon="smiley"
+ label="Menu item text"
+ onClick={ () => {
+ alert( 'clicked' );
+ } }
+ />
+);
+
+registerPlugin( 'block-settings-menu-group-test', {
+ render: PluginBlockSettingsMenuGroupTest,
+} );
```
## Location
diff --git a/docs/designers-developers/developers/slotfills/plugin-document-setting-panel.md b/docs/designers-developers/developers/slotfills/plugin-document-setting-panel.md
index 75f0a3638f1b4c..25a5ab915cb54b 100644
--- a/docs/designers-developers/developers/slotfills/plugin-document-setting-panel.md
+++ b/docs/designers-developers/developers/slotfills/plugin-document-setting-panel.md
@@ -3,15 +3,17 @@
This SlotFill allows registering a UI to edit Document settings.
## Available Props
+
* __name__ `string`: A string identifying the panel.
* __className__ `string`: An optional class name added to the sidebar body.
* __title__ `string`: Title displayed at the top of the sidebar.
* __icon__ `(string|Element)`: The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element.
## Example
+
```js
-const { registerPlugin } = wp.plugins;
-const { PluginDocumentSettingPanel } = wp.editPost;
+import { registerPlugin } from '@wordpress/plugins';
+import { PluginDocumentSettingPanel } from '@wordpress/edit-post';
const PluginDocumentSettingPanelDemo = () => (
(
Custom Panel Contents
);
-registerPlugin( 'plugin-document-setting-panel-demo', { render: PluginDocumentSettingPanelDemo, icon: 'palmtree' } );
-```
\ No newline at end of file
+
+registerPlugin( 'plugin-document-setting-panel-demo', {
+ render: PluginDocumentSettingPanelDemo,
+ icon: 'palmtree',
+} );
+```
diff --git a/docs/designers-developers/developers/slotfills/plugin-post-publish-panel.md b/docs/designers-developers/developers/slotfills/plugin-post-publish-panel.md
index 50c38098c19496..bbf146b4a8e050 100644
--- a/docs/designers-developers/developers/slotfills/plugin-post-publish-panel.md
+++ b/docs/designers-developers/developers/slotfills/plugin-post-publish-panel.md
@@ -5,19 +5,18 @@ This slot allows for injecting items into the bottom of the post-publish panel t
## Example
```js
-const { registerPlugin } = wp.plugins;
-const { PluginPostPublishPanel } = wp.editPost;
-
-const PluginPostPublishPanelTest = () => {
- return (
-
- Post Publish Panel
-
- )
-}
-
-registerPlugin( 'post-publish-panel-test', { render: PluginPostPublishPanelTest } );
-
+import { registerPlugin } from '@wordpress/plugins';
+import { PluginPostPublishPanel } from '@wordpress/edit-post';
+
+const PluginPostPublishPanelTest = () => (
+
+ Post Publish Panel
+
+);
+
+registerPlugin( 'post-publish-panel-test', {
+ render: PluginPostPublishPanelTest,
+} );
```
## Location
diff --git a/docs/designers-developers/developers/slotfills/plugin-post-status-info.md b/docs/designers-developers/developers/slotfills/plugin-post-status-info.md
index 745fe64c62b9ee..3a8201e5506e98 100644
--- a/docs/designers-developers/developers/slotfills/plugin-post-status-info.md
+++ b/docs/designers-developers/developers/slotfills/plugin-post-status-info.md
@@ -5,17 +5,14 @@ This slots allows for the insertion of items in the Status & visibility panel of
## Example
```js
-const { registerPlugin } = wp.plugins;
-const { PluginPostStatusInfo } = wp.editPost;
-
-
-const PluginPostStatusInfoTest = () => {
- return(
-
- Post Status Info SlotFill
-
- )
-}
+import { registerPlugin } from '@wordpress/plugins';
+import { PluginPostStatusInfo } from '@wordpress/edit-post';
+
+const PluginPostStatusInfoTest = () => (
+
+ Post Status Info SlotFill
+
+);
registerPlugin( 'post-status-info-test', { render: PluginPostStatusInfoTest } );
```
diff --git a/docs/designers-developers/developers/slotfills/plugin-pre-publish-panel.md b/docs/designers-developers/developers/slotfills/plugin-pre-publish-panel.md
index 622a945dd08d87..abaa1cc4d6ae8d 100644
--- a/docs/designers-developers/developers/slotfills/plugin-pre-publish-panel.md
+++ b/docs/designers-developers/developers/slotfills/plugin-pre-publish-panel.md
@@ -1,23 +1,22 @@
# PluginPrePublishPanel
-This slot allows for injecting items into the bottom of the pre-publish panel that appears to confirm publishing after the user clicks "Publish'.
+This slot allows for injecting items into the bottom of the pre-publish panel that appears to confirm publishing after the user clicks "Publish".
## Example
```js
-const { registerPlugin } = wp.plugins;
-const { PluginPrePublishPanel }= wp.editPost;
-
-const PluginPrePublishPanelTest = () => {
- return (
-
- Pre Publish Panel
-
- )
-}
-
-registerPlugin( 'pre-publish-panel-test', { render: PluginPrePublishPanelTest } );
-
+import { registerPlugin } from '@wordpress/plugins';
+import { PluginPrePublishPanel } from '@wordpress/edit-post';
+
+const PluginPrePublishPanelTest = () => (
+
+ Pre Publish Panel
+
+);
+
+registerPlugin( 'pre-publish-panel-test', {
+ render: PluginPrePublishPanelTest,
+} );
```
## Location
diff --git a/docs/designers-developers/developers/slotfills/plugin-sidebar-more-menu-item.md b/docs/designers-developers/developers/slotfills/plugin-sidebar-more-menu-item.md
index 40d1e0e22bab54..687a898c53047a 100644
--- a/docs/designers-developers/developers/slotfills/plugin-sidebar-more-menu-item.md
+++ b/docs/designers-developers/developers/slotfills/plugin-sidebar-more-menu-item.md
@@ -7,33 +7,24 @@ This is done by setting the `target` on `` to match t
```js
import { registerPlugin } from '@wordpress/plugins';
-import {
- PluginSidebar,
- PluginSidebarMoreMenuItem
-} from '@wordpress/edit-post';
+import { PluginSidebar, PluginSidebarMoreMenuItem } from '@wordpress/edit-post';
import { image } from '@wordpress/icons';
-
-const { Fragment } = wp.element;
-const myIcon =
+import { Fragment } from '@wordpress/element';
const PluginSidebarMoreMenuItemTest = () => (
-
+
Expanded Sidebar - More item
-
+
Content of the sidebar
-)
+);
-registerPlugin( 'plugin-sidebar-expanded-test', { render: PluginSidebarMoreMenuItemTest } );
+registerPlugin( 'plugin-sidebar-expanded-test', {
+ render: PluginSidebarMoreMenuItemTest,
+} );
```
## Location
diff --git a/docs/designers-developers/developers/slotfills/plugin-sidebar.md b/docs/designers-developers/developers/slotfills/plugin-sidebar.md
index 8af1641f6ea1fd..b5467f04c4bebd 100644
--- a/docs/designers-developers/developers/slotfills/plugin-sidebar.md
+++ b/docs/designers-developers/developers/slotfills/plugin-sidebar.md
@@ -10,17 +10,12 @@ import { registerPlugin } from '@wordpress/plugins';
import { PluginSidebar } from '@wordpress/edit-post';
import { image } from '@wordpress/icons';
-const PluginSidebarTest = () => {
- return (
-
- Plugin Sidebar
-
- );
-};
+const PluginSidebarTest = () => (
+
+ Plugin Sidebar
+
+);
+
registerPlugin( 'plugin-sidebar-test', { render: PluginSidebarTest } );
```
diff --git a/docs/designers-developers/developers/themes/block-based-themes.md b/docs/designers-developers/developers/themes/block-based-themes.md
index 926c4031d2bd67..177e0c21bf0cb6 100644
--- a/docs/designers-developers/developers/themes/block-based-themes.md
+++ b/docs/designers-developers/developers/themes/block-based-themes.md
@@ -73,7 +73,7 @@ Ultimately, any WordPress user with the correct capabilities (example: `administ
In the current iteration (at the time of writing this doc), you can navigate to the temporary "Templates" admin menu under "Appearance" `wp-admin/edit.php?post_type=wp_template` and use this as a playground to edit your templates.
-When ready, switch to the "Code editor" mode and grab the HTML of the template from there and put it in the right file in your theme directory.
+When ready, switch to the code editor mode and grab the HTML of the template from there and put it in the right file in your theme directory.
## Templates CPT
diff --git a/docs/designers-developers/developers/tutorials/block-tutorial/creating-dynamic-blocks.md b/docs/designers-developers/developers/tutorials/block-tutorial/creating-dynamic-blocks.md
index d481c5e3f0d627..bb4ca12393962f 100644
--- a/docs/designers-developers/developers/tutorials/block-tutorial/creating-dynamic-blocks.md
+++ b/docs/designers-developers/developers/tutorials/block-tutorial/creating-dynamic-blocks.md
@@ -99,7 +99,7 @@ Because it is a dynamic block it doesn't need to override the default `save` imp
* Plugin Name: Gutenberg examples dynamic
*/
-function gutenberg_examples_dynamic_render_callback( $attributes, $content ) {
+function gutenberg_examples_dynamic_render_callback( $block, $content ) {
$recent_posts = wp_get_recent_posts( array(
'numberposts' => 1,
'post_status' => 'publish',
@@ -141,7 +141,15 @@ There are a few things to notice:
* The `edit` function still shows a representation of the block in the editor's context (this could be very different from the rendered version, it's up to the block's author)
* The built-in `save` function just returns `null` because the rendering is performed server-side.
-* The server-side rendering is a function taking the block attributes and the block inner content as arguments, and returning the markup (quite similar to shortcodes)
+* The server-side rendering is a function taking the block and the block inner content as arguments, and returning the markup (quite similar to shortcodes)
+
+Note that for convenience and for backward-compatibility, the first argument of a `render_callback` function can also be referenced as an associative array of the block's attributes:
+
+```php
+function gutenberg_examples_dynamic_render_callback( $block_attributes ) {
+ return 'The record ID is: ' . esc_html( $block_attributes['recordId'] );
+}
+```
## Live rendering in the block editor
diff --git a/docs/designers-developers/developers/tutorials/metabox/meta-block-3-add.md b/docs/designers-developers/developers/tutorials/metabox/meta-block-3-add.md
index 4bf4c70ae646d5..1804a346f052c9 100644
--- a/docs/designers-developers/developers/tutorials/metabox/meta-block-3-add.md
+++ b/docs/designers-developers/developers/tutorials/metabox/meta-block-3-add.md
@@ -4,9 +4,7 @@ With the meta field registered in the previous step, next you will create a new
For this block, you will use the TextControl component, which is similar to an HTML input text field. For additional components, check out the [components](/packages/components/src) and [editor](/packages/editor/src/components) packages repositories.
-Attributes are the information displayed in blocks. As shown in the block tutorial, the source of attributes come from the text or HTML a user writes in the editor. For your meta block, the attribute will come from the post meta field.
-
-By specifying the source of the attributes as `meta`, the block editor automatically handles the loading and storing of the data; no REST API or data functions are needed.
+The hook `useEntityProp` can be used by the blocks to get or change meta values.
Add this code to your JavaScript file (this tutorial will call the file `myguten.js`):
@@ -17,26 +15,42 @@ Add this code to your JavaScript file (this tutorial will call the file `myguten
var el = wp.element.createElement;
var registerBlockType = wp.blocks.registerBlockType;
var TextControl = wp.components.TextControl;
+ var useSelect = wp.data.useSelect;
+ var useEntityProp = wp.coreData.useEntityProp;
registerBlockType( 'myguten/meta-block', {
title: 'Meta Block',
icon: 'smiley',
category: 'common',
- attributes: {
- blockValue: {
- type: 'string',
- source: 'meta',
- meta: 'myguten_meta_block_field',
- },
- },
-
edit: function( props ) {
var className = props.className;
- var setAttributes = props.setAttributes;
- function updateBlockValue( blockValue ) {
- setAttributes( { blockValue } );
+ var postType = useSelect(
+ function( select ) {
+ return select( 'core/editor' ).getCurrentPostType();
+ },
+ []
+ );
+ var entityProp = useEntityProp(
+ 'postType',
+ postType,
+ 'meta'
+ );
+ var meta = entityProp[ 0 ];
+ var setMeta = entityProp[ 1 ];
+
+ var metaFieldValue = meta['myguten_meta_block_field'];
+ function updateMetaValue( newValue ) {
+ setMeta(
+ Object.assign(
+ {},
+ meta,
+ {
+ 'myguten_meta_block_field': newValue,
+ }
+ )
+ );
}
return el(
@@ -44,8 +58,8 @@ Add this code to your JavaScript file (this tutorial will call the file `myguten
{ className: className },
el( TextControl, {
label: 'Meta Block Field',
- value: props.attributes.blockValue,
- onChange: updateBlockValue,
+ value: metaFieldValue,
+ onChange: updateMetaValue,
} )
);
},
@@ -62,38 +76,42 @@ Add this code to your JavaScript file (this tutorial will call the file `myguten
```js
import { registerBlockType } from '@wordpress/blocks';
import { TextControl } from '@wordpress/components';
+import { useSelect } from '@wordpress/data';
+import { useEntityProp } from '@wordpress/core-data';
registerBlockType( 'myguten/meta-block', {
title: 'Meta Block',
icon: 'smiley',
category: 'common',
- attributes: {
- blockValue: {
- type: 'string',
- source: 'meta',
- meta: 'myguten_meta_block_field',
- },
- },
-
edit( { className, setAttributes, attributes } ) {
- function updateBlockValue( blockValue ) {
- setAttributes( { blockValue } );
+ const postType = useSelect(
+ ( select ) => select( 'core/editor' ).getCurrentPostType(),
+ []
+ );
+ const [ meta, setMeta ] = useEntityProp(
+ 'postType',
+ postType,
+ 'meta'
+ );
+ const metaFieldValue = meta['myguten_meta_block_field'];
+ function updateMetaValue( newValue ) {
+ setMeta( { ...meta, 'myguten_meta_block_field': newValue } );
}
return (
);
},
// No information saved to the block
- // Data is saved to post meta via attributes
+ // Data is saved to post meta via the hook
save() {
return null;
},
@@ -101,14 +119,14 @@ registerBlockType( 'myguten/meta-block', {
```
{% end %}
-**Important:** Before you test, you need to enqueue your JavaScript file and its dependencies. Note the WordPress packages used above are `wp.element`, `wp.blocks`, and `wp.components`. Each of these need to be included in the array of dependencies. Update the `myguten-meta-block.php` file adding the enqueue function:
+**Important:** Before you test, you need to enqueue your JavaScript file and its dependencies. Note the WordPress packages used above are `wp.element`, `wp.blocks`, `wp.components`, `wp.data`, and `wp.coreData`. Each of these need to be included in the array of dependencies. Update the `myguten-meta-block.php` file adding the enqueue function:
```php
function myguten_enqueue() {
wp_enqueue_script(
'myguten-script',
plugins_url( 'myguten.js', __FILE__ ),
- array( 'wp-blocks', 'wp-element', 'wp-components' )
+ array( 'wp-blocks', 'wp-element', 'wp-components', 'wp-data', 'wp-core-data' )
);
}
add_action( 'enqueue_block_editor_assets', 'myguten_enqueue' );
@@ -119,4 +137,3 @@ You can now edit a draft post and add a Meta Block to the post. You will see you

You can now use the post meta data in a template, or another block. See next section for [using post meta data](/docs/designers-developers/developers/tutorials/metabox/meta-block-4-use-data.md). You could also confirm the data is saved by checking the database table `wp_postmeta` and confirm the new post id contains the new field data.
-
diff --git a/docs/designers-developers/developers/tutorials/metabox/meta-block-4-use-data.md b/docs/designers-developers/developers/tutorials/metabox/meta-block-4-use-data.md
index 6e7d5b92d4d405..e10049e16c2b90 100644
--- a/docs/designers-developers/developers/tutorials/metabox/meta-block-4-use-data.md
+++ b/docs/designers-developers/developers/tutorials/metabox/meta-block-4-use-data.md
@@ -25,7 +25,7 @@ You can also use the post meta data in other blocks. For this example the data i
In PHP, use the [register_block_type](https://developer.wordpress.org/reference/functions/register_block_type/) function to set a callback when the block is rendered to include the meta value.
```php
-function myguten_render_paragraph( $attributes, $content ) {
+function myguten_render_paragraph( $block, $content ) {
$value = get_post_meta( get_the_ID(), 'myguten_meta_block_field', true );
// check value is set before outputting
if ( $value ) {
diff --git a/docs/designers-developers/faq.md b/docs/designers-developers/faq.md
index 1681b397d6f3ee..40170b55a57b2b 100644
--- a/docs/designers-developers/faq.md
+++ b/docs/designers-developers/faq.md
@@ -116,7 +116,7 @@ This is the canonical list of keyboard shortcuts:
⌥ F10
- Switch between Visual editor and Code editor.
+ Switch between visual editor and code editor.
Ctrl +Shift +Alt +M
⇧ ⌥ ⌘ M
diff --git a/docs/designers-developers/glossary.md b/docs/designers-developers/glossary.md
index 232763016249fd..5a53c51bf2f5fb 100644
--- a/docs/designers-developers/glossary.md
+++ b/docs/designers-developers/glossary.md
@@ -10,15 +10,18 @@
Block
The abstract term used to describe units of markup that, composed together, form the content or layout of a webpage. The idea combines concepts of what in WordPress today we achieve with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience.
-Block Categories
-These are not a WordPress taxonomy, but instead used internally to sort blocks in the Block Inserter.
+Block categories
+These are not a WordPress taxonomy, but instead used internally to sort blocks in the Block Library.
-Block Inserter
+Block ~Inserter~ Library
Primary interface for selecting from the available blocks, triggered by plus icon buttons on Blocks or in the top-left of the editor interface.
Block name
A unique identifier for a block type, consisting of a plugin-specific namespace and a short label describing the block's intent. e.g. core/image
+Patterns
+Patterns are predefined layouts of blocks that can be inserted as starter content that are meant to be changed by the user every time. Once inserted, they exist as a local save and are not global.
+
Block type
In contrast with the blocks composing a particular post, a block type describes the blueprint by which any block of that type should behave. So while there may be many images within a post, each behaves consistent with a unified image block type definition.
@@ -56,6 +59,9 @@
A set of button controls. In the context of a block, usually referring to the toolbar of block controls shown above the selected block.
Template
- A template is a pre-defined arrangement of blocks, possibly with predefined attributes or placeholder content. You can provide a template for a post type, to give users a starting point when creating a new piece of content, or inside a custom block with the InnerBlocks component. See the templates documentation for more information. See templates documentation for more information.
+ A template is a pre-defined arrangement of blocks, possibly with predefined attributes or placeholder content. You can provide a template for a post type, to give users a starting point when creating a new piece of content, or inside a custom block with the InnerBlocks component. See the templates documentation for more information.
+
+Template part
+Template parts are equivalent – in blocks – of theme template parts. They are generally defined by a theme first. They carry some semantic meaning (could be swapped between themes such as a header) and can only be inserted in the site editor context (within “templates”). They are primarily site structure and are never to be mixed with the post content editor.
diff --git a/docs/manifest.json b/docs/manifest.json
index 81369c181351d3..85fd8c28be7279 100644
--- a/docs/manifest.json
+++ b/docs/manifest.json
@@ -71,6 +71,12 @@
"markdown_source": "../docs/designers-developers/developers/block-api/block-attributes.md",
"parent": "block-api"
},
+ {
+ "title": "Block Context",
+ "slug": "block-context",
+ "markdown_source": "../docs/designers-developers/developers/block-api/block-context.md",
+ "parent": "block-api"
+ },
{
"title": "Deprecated Blocks",
"slug": "block-deprecation",
@@ -83,6 +89,12 @@
"markdown_source": "../docs/designers-developers/developers/block-api/block-templates.md",
"parent": "block-api"
},
+ {
+ "title": "Patterns (Experimental)",
+ "slug": "block-patterns",
+ "markdown_source": "../docs/designers-developers/developers/block-api/block-patterns.md",
+ "parent": "block-api"
+ },
{
"title": "Annotations",
"slug": "block-annotations",
@@ -239,6 +251,18 @@
"markdown_source": "../docs/designers-developers/developers/platform/README.md",
"parent": "developers"
},
+ {
+ "title": "Building a custom block editor",
+ "slug": "custom-block-editor",
+ "markdown_source": "../docs/designers-developers/developers/platform/custom-block-editor/README.md",
+ "parent": "platform"
+ },
+ {
+ "title": "Tutorial: building a custom block editor",
+ "slug": "tutorial",
+ "markdown_source": "../docs/designers-developers/developers/platform/custom-block-editor/tutorial.md",
+ "parent": "custom-block-editor"
+ },
{
"title": "Designer Documentation",
"slug": "designers",
@@ -252,9 +276,9 @@
"parent": "designers"
},
{
- "title": "Patterns",
- "slug": "design-patterns",
- "markdown_source": "../docs/designers-developers/designers/design-patterns.md",
+ "title": "User Interface",
+ "slug": "user-interface",
+ "markdown_source": "../docs/designers-developers/designers/user-interface.md",
"parent": "designers"
},
{
@@ -365,6 +389,12 @@
"markdown_source": "../docs/contributors/copy-guide.md",
"parent": "document"
},
+ {
+ "title": "Triage",
+ "slug": "triage",
+ "markdown_source": "../docs/contributors/triage.md",
+ "parent": "contributors"
+ },
{
"title": "Localizing Gutenberg Plugin",
"slug": "localizing",
@@ -875,6 +905,12 @@
"markdown_source": "../packages/components/src/notice/README.md",
"parent": "components"
},
+ {
+ "title": "NumberControl",
+ "slug": "number-control",
+ "markdown_source": "../packages/components/src/number-control/README.md",
+ "parent": "components"
+ },
{
"title": "Panel",
"slug": "panel",
@@ -905,6 +941,12 @@
"markdown_source": "../packages/components/src/radio-control/README.md",
"parent": "components"
},
+ {
+ "title": "RadioGroup",
+ "slug": "radio-group",
+ "markdown_source": "../packages/components/src/radio-group/README.md",
+ "parent": "components"
+ },
{
"title": "RangeControl",
"slug": "range-control",
@@ -1013,6 +1055,12 @@
"markdown_source": "../packages/components/src/tree-select/README.md",
"parent": "components"
},
+ {
+ "title": "UnitControl",
+ "slug": "unit-control",
+ "markdown_source": "../packages/components/src/unit-control/README.md",
+ "parent": "components"
+ },
{
"title": "VisuallyHidden",
"slug": "visually-hidden",
@@ -1271,6 +1319,12 @@
"markdown_source": "../packages/e2e-tests/README.md",
"parent": "packages"
},
+ {
+ "title": "@wordpress/edit-navigation",
+ "slug": "packages-edit-navigation",
+ "markdown_source": "../packages/edit-navigation/README.md",
+ "parent": "packages"
+ },
{
"title": "@wordpress/edit-post",
"slug": "packages-edit-post",
@@ -1349,6 +1403,12 @@
"markdown_source": "../packages/icons/README.md",
"parent": "packages"
},
+ {
+ "title": "@wordpress/interface",
+ "slug": "packages-interface",
+ "markdown_source": "../packages/interface/README.md",
+ "parent": "packages"
+ },
{
"title": "@wordpress/is-shallow-equal",
"slug": "packages-is-shallow-equal",
@@ -1433,6 +1493,12 @@
"markdown_source": "../packages/postcss-themes/README.md",
"parent": "packages"
},
+ {
+ "title": "@wordpress/prettier-config",
+ "slug": "packages-prettier-config",
+ "markdown_source": "../packages/prettier-config/README.md",
+ "parent": "packages"
+ },
{
"title": "@wordpress/primitives",
"slug": "packages-primitives",
diff --git a/docs/rfc/block-registration.md b/docs/rfc/block-registration.md
index c1844e1646a42f..9ae9d5ad4b1de5 100644
--- a/docs/rfc/block-registration.md
+++ b/docs/rfc/block-registration.md
@@ -32,7 +32,7 @@ Initial support for server-defined block attributes was merged as part of [#2529
A demonstration for how block registration could be made filterable in PHP was explored in [#5802](https://github.com/WordPress/gutenberg/pull/5802). The purpose here was to explore how plugins could have better control over the registration.
-Another exploration in [#5652](https://github.com/WordPress/gutenberg/pull/5652) considered using JSON as a file format to share block type definitions between JavaScript and PHP.
+Another exploration in [#5652](https://github.com/WordPress/gutenberg/pull/5652) considered using JSON as a file format to share block type definitions between JavaScript and PHP.
### Conclusions
@@ -77,8 +77,8 @@ To register a new block type, start by creating a `block.json` file. This file:
"selector": ".message"
}
},
- "styleVariations": [
- { "name": "default", "label": "Default", "isDefault": true },
+ "styleVariations": [
+ { "name": "default", "label": "Default", "isDefault": true },
{ "name": "other", "label": "Other" }
],
"editorScript": "build/editor.js",
@@ -222,7 +222,7 @@ The [gettext](https://www.gnu.org/software/gettext/) text domain of the plugin/b
* Property: `attributes`
```json
-{
+{
"attributes": {
"cover": {
"type": "string",
@@ -252,9 +252,9 @@ See the [the attributes documentation](/docs/designers-developers/developers/blo
* Alias: `styleVariations`
```json
-{
- "styleVariations": [
- { "name": "default", "label": "Default", "isDefault": true },
+{
+ "styleVariations": [
+ { "name": "default", "label": "Default", "isDefault": true },
{ "name": "other", "label": "Other" }
]
}
@@ -326,7 +326,7 @@ The following properties are going to be supported for backward compatibility re
- `supports` - see the [block supports](/docs/designers-developers/developers/block-api/block-registration.md#supports-optional) documentation page for more details.
- `merge` - undocumented as of today. Its role is to handle merging multiple blocks into one.
- `getEditWrapperProps` - undocumented as well. Its role is to inject additional props to the block edit's component wrapper.
-
+
**Example**:
```js
wp.blocks.registerBlockType( 'my-block/name', {
@@ -340,7 +340,7 @@ wp.blocks.registerBlockType( 'my-block/name', {
html: false
}
} );
-```
+```
In the case of [dynamic blocks](/docs/designers-developers/developers/tutorials/block-tutorial/creating-dynamic-blocks.md) supported by WordPress, it should be still possible to register `render_callback` property using [`register_block_type`](https://developer.wordpress.org/reference/functions/register_block_type/) function on the server.
@@ -365,31 +365,35 @@ That's why, the `WPDefinedAsset` type has to offer a way to mirror also the shap
It's possible to provide an object which takes the following shape:
- `handle` (`string`) - the name of the script. If omitted, it will be auto-generated.
-- `dependencies` (`string[]`) - an array of registered script handles this script depends on. Default value: `[]`.
+- `dependencies` (`string[]`) - an array of registered script handles this script depends on. Default value: `[]`.
- `version` (`string`|`false`|`null`) - string specifying the script version number, if it has one, which is added to the URL as a query string for cache busting purposes. If the version is set to `false`, a version number is automatically added equal to current installed WordPress version. If set to `null`, no version is added. Default value: `false`.
-The definition is stored inside separate JSON file which ends with `.asset.json` and is located next to the JS/CSS file listed in `block.json`. WordPress will automatically detect this file through pattern matching. This option is the preferred one as it is expected it will become an option to auto-generate those asset files with `@wordpress/scripts` package.
+The definition is stored inside separate PHP file which ends with `.asset.php` and is located next to the JS/CSS file listed in `block.json`. WordPress will automatically detect this file through pattern matching. This option is the preferred one as it is expected it will become an option to auto-generate those asset files with `@wordpress/scripts` package.
**Example:**
```
build/
-├─ editor.js
-└─ editor.asset.json
+├─ index.js
+└─ index.asset.php
```
In `block.json`:
```json
-{ "editorScript": "build/editor.js" }
+{ "editorScript": "build/index.js" }
```
-In `build/editor.asset.json`:
-```json
-{
- "handle": "my-plugin-notice-editor",
- "dependencies": [ "wp-blocks","wp-element", "wp-i18n" ],
- "version": "3.0.0"
-}
+In `build/index.asset.php`:
+```php
+ array(
+ 'wp-blocks',
+ 'wp-element',
+ 'wp-i18n',
+ ),
+ 'version' => '3be55b05081a63d8f9d0ecb466c42cfd',
+);
```
## Internationalization
@@ -432,6 +436,28 @@ $metadata = array(
Implementation should follow the existing [get_plugin_data](https://codex.wordpress.org/Function_Reference/get_plugin_data) function which parses the plugin contents to retrieve the plugin’s metadata, and it applies translations dynamically.
+## Server-side registration
+
+There is also a new API method proposed `register_block_type_from_metadata` that aims to simplify the block type registration on the server from metadata stored in the `block.json` file. This function is going to handle also all necessary work to make internationalization work seamlessly for metadata defined.
+
+This function takes two params:
+- `$path` (`string`) – path to the folder where the `block.json` file is located.
+- `$args` (`array`) – an optional array of block type arguments. Default value: `[]`. Any arguments may be defined. However, the one described below is supported by default:
+ - `$render_callback` (`callable`) – callback used to render blocks of this block type.
+
+It returns the registered block type (`WP_Block_Type`) on success or `false` on failure.
+
+**Example:**
+
+```php
+register_block_type_from_metadata(
+ __DIR__ . '/shortcode',
+ array(
+ 'render_callback' => 'render_block_core_shortcode',
+ )
+);
+```
+
## Backward Compatibility
The existing registration mechanism (both server side and frontend) will continue to work, it will serve as low-level implementation detail for the `block.json` based registration.
diff --git a/docs/toc.json b/docs/toc.json
index ee9edb4ccf0720..3c3269200af2aa 100644
--- a/docs/toc.json
+++ b/docs/toc.json
@@ -13,8 +13,10 @@
{ "docs/designers-developers/developers/block-api/block-registration.md": [] },
{ "docs/designers-developers/developers/block-api/block-edit-save.md": [] },
{ "docs/designers-developers/developers/block-api/block-attributes.md": [] },
- {"docs/designers-developers/developers/block-api/block-deprecation.md": [] },
+ { "docs/designers-developers/developers/block-api/block-context.md": [] },
+ { "docs/designers-developers/developers/block-api/block-deprecation.md": [] },
{ "docs/designers-developers/developers/block-api/block-templates.md": [] },
+ { "docs/designers-developers/developers/block-api/block-patterns.md": [] },
{ "docs/designers-developers/developers/block-api/block-annotations.md": [] }
] },
{ "docs/designers-developers/developers/filters/README.md": [
@@ -45,11 +47,15 @@
{ "docs/designers-developers/developers/backward-compatibility/deprecations.md": [] },
{ "docs/designers-developers/developers/backward-compatibility/meta-box.md": [] }
] },
- { "docs/designers-developers/developers/platform/README.md": [] }
+ { "docs/designers-developers/developers/platform/README.md": [
+ { "docs/designers-developers/developers/platform/custom-block-editor/README.md": [
+ { "docs/designers-developers/developers/platform/custom-block-editor/tutorial.md": [] }
+ ] }
+ ] }
] },
{ "docs/designers-developers/designers/README.md": [
{ "docs/designers-developers/designers/block-design.md": [] },
- { "docs/designers-developers/designers/design-patterns.md": [] },
+ { "docs/designers-developers/designers/user-interface.md": [] },
{ "docs/designers-developers/designers/design-resources.md": [] },
{ "docs/designers-developers/designers/animation.md": [] }
] },
@@ -72,6 +78,7 @@
{ "docs/contributors/document.md": [
{ "docs/contributors/copy-guide.md": [] }
] },
+ { "docs/contributors/triage.md": [] },
{ "docs/contributors/localizing.md": [] },
{ "docs/contributors/repository-management.md": [] }
] },
diff --git a/docs/tool/are-data-files-unstaged.js b/docs/tool/are-data-files-unstaged.js
deleted file mode 100644
index 38f659ec9bb0c7..00000000000000
--- a/docs/tool/are-data-files-unstaged.js
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/env node
-
-/**
- * Node dependencies.
- */
-const chalk = require( 'chalk' );
-const execSync = require( 'child_process' ).execSync;
-
-/**
- * Local dependencies.
- */
-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 )
-);
-
-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'
- )
- );
-}
diff --git a/docs/tool/index.js b/docs/tool/index.js
index f0b1297f987dfb..d7e03d00974b3b 100644
--- a/docs/tool/index.js
+++ b/docs/tool/index.js
@@ -2,8 +2,6 @@
* Node dependencies
*/
const fs = require( 'fs' );
-const { join } = require( 'path' );
-const { execFileSync } = require( 'child_process' );
const path = require( 'path' );
/**
@@ -14,9 +12,6 @@ const { getRootManifest } = require( './manifest' );
const tocFileInput = path.resolve( __dirname, '../toc.json' );
const manifestOutput = path.resolve( __dirname, '../manifest.json' );
-// Update data files from code
-execFileSync( 'node', [ join( __dirname, 'update-data.js' ) ] );
-
// Process TOC file and generate manifest handbook
fs.writeFileSync(
manifestOutput,
diff --git a/docs/tool/packages.js b/docs/tool/packages.js
deleted file mode 100644
index 558a3e62c43c23..00000000000000
--- a/docs/tool/packages.js
+++ /dev/null
@@ -1,39 +0,0 @@
-const packages = [
- [
- 'core',
- {
- 'Autogenerated actions': 'packages/core-data/src/actions.js',
- 'Autogenerated selectors': 'packages/core-data/src/selectors.js',
- },
- ],
- 'core/annotations',
- 'core/blocks',
- 'core/block-editor',
- 'core/editor',
- 'core/edit-post',
- 'core/keyboard-shortcuts',
- 'core/notices',
- 'core/nux',
- 'core/viewport',
-];
-
-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`,
- },
- ];
- }
- return entry;
- } );
-};
diff --git a/docs/tool/update-data.js b/docs/tool/update-data.js
deleted file mode 100644
index 89f0fc614f1c50..00000000000000
--- a/docs/tool/update-data.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Node dependencies.
- */
-const { join } = require( 'path' );
-const spawnSync = require( 'child_process' ).spawnSync;
-
-/**
- * Local dependencies.
- */
-const getPackages = require( './packages' );
-
-getPackages().forEach( ( entry ) => {
- const [ packageName, targetFiles ] = entry;
-
- Object.entries( targetFiles ).forEach( ( [ token, target ] ) => {
- // Note that this needs to be a sync process for each output file that is updated:
- // 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, '\\ ' ),
- [
- target,
- `--output docs/designers-developers/developers/data/data-${ packageName.replace(
- '/',
- '-'
- ) }.md`,
- '--to-token',
- `--use-token "${ token }"`,
- '--ignore "/unstable|experimental/i"',
- ],
- { shell: true }
- );
-
- if ( status !== 0 ) {
- process.stderr.write( `${ packageName } ${ stderr.toString() }\n` );
- process.exit( 1 );
- }
- } );
-} );
diff --git a/gutenberg.php b/gutenberg.php
index bdd7d4ebce6c2d..e8143a9a355f27 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.6.0
+ * Version: 7.9.1
* Author: Gutenberg Team
* Text Domain: gutenberg
*
@@ -54,14 +54,24 @@ function gutenberg_menu() {
'the_gutenberg_widgets'
);
}
- if ( array_key_exists( 'gutenberg-full-site-editing', get_option( 'gutenberg-experiments' ) ) ) {
+ if ( array_key_exists( 'gutenberg-navigation', get_option( 'gutenberg-experiments' ) ) ) {
add_submenu_page(
'gutenberg',
+ __( 'Navigation (beta)', 'gutenberg' ),
+ __( 'Navigation (beta)', 'gutenberg' ),
+ 'edit_theme_options',
+ 'gutenberg-navigation',
+ 'gutenberg_navigation_page'
+ );
+ }
+ if ( array_key_exists( 'gutenberg-full-site-editing', get_option( 'gutenberg-experiments' ) ) ) {
+ add_menu_page(
__( 'Site Editor (beta)', 'gutenberg' ),
__( 'Site Editor (beta)', 'gutenberg' ),
'edit_theme_options',
'gutenberg-edit-site',
- 'gutenberg_edit_site_page'
+ 'gutenberg_edit_site_page',
+ 'dashicons-layout'
);
}
}
diff --git a/lib/blocks.php b/lib/blocks.php
index b7a4d15d4ea515..c7516568815019 100644
--- a/lib/blocks.php
+++ b/lib/blocks.php
@@ -35,6 +35,7 @@ function gutenberg_reregister_core_block_types() {
'post-title.php' => 'core/post-title',
'post-content.php' => 'core/post-content',
'post-author.php' => 'core/post-author',
+ 'post-comments.php' => 'core/post-comments',
'post-comments-count.php' => 'core/post-comments-count',
'post-comments-form.php' => 'core/post-comments-form',
'post-date.php' => 'core/post-date',
diff --git a/lib/class-wp-block.php b/lib/class-wp-block.php
new file mode 100644
index 00000000000000..4e3cf5f17989d0
--- /dev/null
+++ b/lib/class-wp-block.php
@@ -0,0 +1,240 @@
+ testing..." -> "Just testing..."
+ *
+ * @var string
+ */
+ public $inner_html = '';
+
+ /**
+ * List of string fragments and null markers where inner blocks were found
+ *
+ * @example array(
+ * 'inner_html' => 'BeforeInnerAfter',
+ * 'inner_blocks' => array( block, block ),
+ * 'inner_content' => array( 'Before', null, 'Inner', null, 'After' ),
+ * )
+ *
+ * @var array
+ */
+ public $inner_content = array();
+
+ /**
+ * Constructor.
+ *
+ * Populates object properties from the provided block instance argument.
+ *
+ * The given array of context values will not necessarily be available on
+ * the instance itself, but is treated as the full set of values provided by
+ * the block's ancestry. This is assigned to the private `available_context`
+ * property. Only values which are configured to consumed by the block via
+ * its registered type will be assigned to the block's `context` property.
+ *
+ * @param array $block Array of parsed block properties.
+ * @param array $available_context Optional array of ancestry context values.
+ * @param WP_Block_Type_Registry $registry Optional block type registry.
+ */
+ public function __construct( $block, $available_context = array(), $registry = null ) {
+ $this->name = $block['blockName'];
+
+ if ( is_null( $registry ) ) {
+ $registry = WP_Block_Type_Registry::get_instance();
+ }
+
+ $this->block_type = $registry->get_registered( $this->name );
+
+ if ( ! empty( $block['attrs'] ) ) {
+ $this->attributes = $block['attrs'];
+ }
+
+ if ( ! is_null( $this->block_type ) ) {
+ $this->attributes = $this->block_type->prepare_attributes_for_render( $this->attributes );
+ }
+
+ $this->available_context = $available_context;
+
+ if ( ! empty( $this->block_type->context ) ) {
+ foreach ( $this->block_type->context as $context_name ) {
+ if ( array_key_exists( $context_name, $this->available_context ) ) {
+ $this->context[ $context_name ] = $this->available_context[ $context_name ];
+ }
+ }
+ }
+
+ if ( ! empty( $block['innerBlocks'] ) ) {
+ $child_context = $this->available_context;
+
+ /* phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase */
+ if ( ! empty( $this->block_type->providesContext ) ) {
+ foreach ( $this->block_type->providesContext as $context_name => $attribute_name ) {
+ if ( array_key_exists( $attribute_name, $this->attributes ) ) {
+ $child_context[ $context_name ] = $this->attributes[ $attribute_name ];
+ }
+ }
+ }
+ /* phpcs:enable */
+
+ $this->inner_blocks = array_map(
+ function( $inner_block ) use ( $child_context, $registry ) {
+ return new WP_Block( $inner_block, $child_context, $registry );
+ },
+ $block['innerBlocks']
+ );
+ }
+
+ if ( ! empty( $block['innerHTML'] ) ) {
+ $this->inner_html = $block['innerHTML'];
+ }
+
+ if ( ! empty( $block['innerContent'] ) ) {
+ $this->inner_content = $block['innerContent'];
+ }
+ }
+
+ /**
+ * Generates the render output for the block.
+ *
+ * @return string Rendered block output.
+ */
+ public function render() {
+ global $post;
+
+ $is_dynamic = $this->name && null !== $this->block_type && $this->block_type->is_dynamic();
+ $block_content = '';
+
+ $index = 0;
+ foreach ( $this->inner_content as $chunk ) {
+ $block_content .= is_string( $chunk ) ?
+ $chunk :
+ $this->inner_blocks[ $index++ ]->render();
+ }
+
+ if ( $is_dynamic ) {
+ $global_post = $post;
+ $block_content = (string) call_user_func( $this->block_type->render_callback, $this, $block_content );
+ $post = $global_post;
+ }
+
+ return $block_content;
+ }
+
+ /**
+ * Returns true if an attribute exists by the specified attribute name, or
+ * false otherwise.
+ *
+ * @link https://www.php.net/manual/en/arrayaccess.offsetexists.php
+ *
+ * @param string $attribute_name Name of attribute to check.
+ *
+ * @return bool Whether attribute exists.
+ */
+ public function offsetExists( $attribute_name ) {
+ return isset( $this->attributes[ $attribute_name ] );
+ }
+
+ /**
+ * Returns the value by the specified attribute name.
+ *
+ * @link https://www.php.net/manual/en/arrayaccess.offsetget.php
+ *
+ * @param string $attribute_name Name of attribute value to retrieve.
+ *
+ * @return mixed|null Attribute value if exists, or null.
+ */
+ public function offsetGet( $attribute_name ) {
+ // This may cause an "Undefined index" notice if the attribute name does
+ // not exist. This is expected, since the purpose of this implementation
+ // is to align exactly to the expectations of operating on an array.
+ return $this->attributes[ $attribute_name ];
+ }
+
+ /**
+ * Assign an attribute value by the specified attribute name.
+ *
+ * @link https://www.php.net/manual/en/arrayaccess.offsetset.php
+ *
+ * @param string $attribute_name Name of attribute value to set.
+ * @param mixed $value Attribute value.
+ */
+ public function offsetSet( $attribute_name, $value ) {
+ if ( is_null( $attribute_name ) ) {
+ // This is not technically a valid use-case for attributes. Since
+ // this implementation is expected to align to expectations of
+ // operating on an array, it is still supported.
+ $this->attributes[] = $value;
+ } else {
+ $this->attributes[ $attribute_name ] = $value;
+ }
+ }
+
+ /**
+ * Unset an attribute.
+ *
+ * @link https://www.php.net/manual/en/arrayaccess.offsetunset.php
+ *
+ * @param string $attribute_name Name of attribute value to unset.
+ */
+ public function offsetUnset( $attribute_name ) {
+ unset( $this->attributes[ $attribute_name ] );
+ }
+
+}
diff --git a/lib/class-wp-patterns-registry.php b/lib/class-wp-patterns-registry.php
new file mode 100644
index 00000000000000..c83ab704de8537
--- /dev/null
+++ b/lib/class-wp-patterns-registry.php
@@ -0,0 +1,137 @@
+registered_patterns[ $pattern_name ] = $pattern_properties;
+
+ return true;
+ }
+
+ /**
+ * Unregisters a pattern.
+ *
+ * @param string $pattern_name Pattern name including namespace.
+ * @return boolean True if the pattern was unregistered with success and false otherwise.
+ */
+ public function unregister( $pattern_name ) {
+ if ( ! $this->is_registered( $pattern_name ) ) {
+ /* translators: 1: Pattern name. */
+ $message = sprintf( __( 'Pattern "%1$s" not found.', 'gutenberg' ), $pattern_name );
+ _doing_it_wrong( __METHOD__, $message, '7.8.0' );
+ return false;
+ }
+
+ unset( $this->registered_patterns[ $pattern_name ] );
+
+ return true;
+ }
+
+ /**
+ * Retrieves an array containing the properties of a registered pattern.
+ *
+ * @param string $pattern_name Pattern name including namespace.
+ * @return array Registered pattern properties.
+ */
+ public function get_registered( $pattern_name ) {
+ if ( ! $this->is_registered( $pattern_name ) ) {
+ return null;
+ }
+
+ return $this->registered_patterns[ $pattern_name ];
+ }
+
+ /**
+ * Retrieves all registered patterns.
+ *
+ * @return array Array of arrays containing the registered patterns properties,
+ * and per style.
+ */
+ public function get_all_registered() {
+ return array_values( $this->registered_patterns );
+ }
+
+ /**
+ * Checks if a pattern is registered.
+ *
+ * @param string $pattern_name Pattern name including namespace.
+ * @return bool True if the pattern is registered, false otherwise.
+ */
+ public function is_registered( $pattern_name ) {
+ return isset( $this->registered_patterns[ $pattern_name ] );
+ }
+
+ /**
+ * Utility method to retrieve the main instance of the class.
+ *
+ * The instance will be created if it does not exist yet.
+ *
+ * @since 5.3.0
+ *
+ * @return WP_Patterns_Registry The main instance.
+ */
+ public static function get_instance() {
+ if ( null === self::$instance ) {
+ self::$instance = new self();
+ }
+
+ return self::$instance;
+ }
+}
+
+/**
+ * Registers a new pattern.
+ *
+ * @param string $pattern_name Pattern name including namespace.
+ * @param array $pattern_properties Array containing the properties of the pattern.
+ *
+ * @return boolean True if the pattern was registered with success and false otherwise.
+ */
+function register_pattern( $pattern_name, $pattern_properties ) {
+ return WP_Patterns_Registry::get_instance()->register( $pattern_name, $pattern_properties );
+}
+
+/**
+ * Unregisters a pattern.
+ *
+ * @param string $pattern_name Pattern name including namespace.
+ *
+ * @return boolean True if the pattern was unregistered with success and false otherwise.
+ */
+function unregister_pattern( $pattern_name ) {
+ return WP_Patterns_Registry::get_instance()->unregister( $pattern_name );
+}
diff --git a/lib/class-wp-rest-menu-items-controller.php b/lib/class-wp-rest-menu-items-controller.php
new file mode 100644
index 00000000000000..cd592046fe661f
--- /dev/null
+++ b/lib/class-wp-rest-menu-items-controller.php
@@ -0,0 +1,1062 @@
+namespace = '__experimental';
+ }
+
+ /**
+ * Get the post, if the ID is valid.
+ *
+ * @param int $id Supplied ID.
+ *
+ * @return object|WP_Error Post object if ID is valid, WP_Error otherwise.
+ */
+ protected function get_post( $id ) {
+ return $this->get_nav_menu_item( $id );
+ }
+
+ /**
+ * Get the nav menu item, if the ID is valid.
+ *
+ * @param int $id Supplied ID.
+ *
+ * @return object|WP_Error Post object if ID is valid, WP_Error otherwise.
+ */
+ protected function get_nav_menu_item( $id ) {
+ $post = parent::get_post( $id );
+ if ( is_wp_error( $post ) ) {
+ return $post;
+ }
+ $nav_item = wp_setup_nav_menu_item( $post );
+
+ return $nav_item;
+ }
+
+ /**
+ * Checks if a given request has access to read a menu item if they have access to edit them.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return bool|WP_Error True if the request has read access for the item, WP_Error object otherwise.
+ */
+ public function get_item_permissions_check( $request ) {
+ $post = $this->get_post( $request['id'] );
+ if ( is_wp_error( $post ) ) {
+ return $post;
+ }
+ if ( $post && ! $this->check_update_permission( $post ) ) {
+ return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot view this menu item, unless you have access to permission edit it. ', 'gutenberg' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ return parent::get_item_permissions_check( $request );
+ }
+
+ /**
+ * Checks if a given request has access to read menu items if they have access to edit them.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
+ */
+ public function get_items_permissions_check( $request ) {
+ $post_type = get_post_type_object( $this->post_type );
+ if ( ! current_user_can( $post_type->cap->edit_posts ) ) {
+ if ( 'edit' === $request['context'] ) {
+ return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to edit posts in this post type.', 'gutenberg' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot view these menu items, unless you have access to permission edit them. ', 'gutenberg' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return true;
+ }
+
+ /**
+ * Creates a single post.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
+ */
+ public function create_item( $request ) {
+ if ( ! empty( $request['id'] ) ) {
+ return new WP_Error( 'rest_post_exists', __( 'Cannot create existing post.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+
+ $prepared_nav_item = $this->prepare_item_for_database( $request );
+
+ if ( is_wp_error( $prepared_nav_item ) ) {
+ return $prepared_nav_item;
+ }
+ $prepared_nav_item = (array) $prepared_nav_item;
+
+ $nav_menu_item_id = wp_update_nav_menu_item( $prepared_nav_item['menu-id'], $prepared_nav_item['menu-item-db-id'], $prepared_nav_item );
+ if ( is_wp_error( $nav_menu_item_id ) ) {
+ if ( 'db_insert_error' === $nav_menu_item_id->get_error_code() ) {
+ $nav_menu_item_id->add_data( array( 'status' => 500 ) );
+ } else {
+ $nav_menu_item_id->add_data( array( 'status' => 400 ) );
+ }
+
+ return $nav_menu_item_id;
+ }
+
+ $nav_menu_item = $this->get_nav_menu_item( $nav_menu_item_id );
+ if ( is_wp_error( $nav_menu_item ) ) {
+ $nav_menu_item->add_data( array( 'status' => 404 ) );
+
+ return $nav_menu_item;
+ }
+
+ /**
+ * Fires after a single nav menu item is created or updated via the REST API.
+ *
+ * The dynamic portion of the hook name, `$this->post_type`, refers to the post type slug.
+ *
+ * @param object $nav_menu_item Inserted or updated nav item object.
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating True when creating a post, false when updating.
+ * SA
+ */
+ do_action( "rest_insert_{$this->post_type}", $nav_menu_item, $request, true );
+
+ $schema = $this->get_item_schema();
+
+ if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
+ $meta_update = $this->meta->update_value( $request['meta'], $nav_menu_item_id );
+
+ if ( is_wp_error( $meta_update ) ) {
+ return $meta_update;
+ }
+ }
+
+ $nav_menu_item = $this->get_nav_menu_item( $nav_menu_item_id );
+ $fields_update = $this->update_additional_fields_for_object( $nav_menu_item, $request );
+
+ if ( is_wp_error( $fields_update ) ) {
+ return $fields_update;
+ }
+
+ $request->set_param( 'context', 'edit' );
+
+ /**
+ * Fires after a single nav menu item is completely created or updated via the REST API.
+ *
+ * The dynamic portion of the hook name, `$this->post_type`, refers to the post type slug.
+ *
+ * @param object $nav_menu_item Inserted or updated nav item object.
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating True when creating a post, false when updating.
+ */
+ do_action( "rest_after_insert_{$this->post_type}", $nav_menu_item, $request, true );
+
+ $response = $this->prepare_item_for_response( $nav_menu_item, $request );
+ $response = rest_ensure_response( $response );
+
+ $response->set_status( 201 );
+ $response->header( 'Location', rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $nav_menu_item_id ) ) );
+
+ return $response;
+ }
+
+ /**
+ * Updates a single nav menu item.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
+ */
+ public function update_item( $request ) {
+ $valid_check = $this->get_nav_menu_item( $request['id'] );
+ if ( is_wp_error( $valid_check ) ) {
+ return $valid_check;
+ }
+
+ $prepared_nav_item = $this->prepare_item_for_database( $request );
+
+ if ( is_wp_error( $prepared_nav_item ) ) {
+ return $prepared_nav_item;
+ }
+
+ $prepared_nav_item = (array) $prepared_nav_item;
+
+ $nav_menu_item_id = wp_update_nav_menu_item( $prepared_nav_item['menu-id'], $prepared_nav_item['menu-item-db-id'], $prepared_nav_item );
+
+ if ( is_wp_error( $nav_menu_item_id ) ) {
+ if ( 'db_update_error' === $nav_menu_item_id->get_error_code() ) {
+ $nav_menu_item_id->add_data( array( 'status' => 500 ) );
+ } else {
+ $nav_menu_item_id->add_data( array( 'status' => 400 ) );
+ }
+
+ return $nav_menu_item_id;
+ }
+
+ $nav_menu_item = $this->get_nav_menu_item( $nav_menu_item_id );
+ if ( is_wp_error( $nav_menu_item ) ) {
+ $nav_menu_item->add_data( array( 'status' => 404 ) );
+
+ return $nav_menu_item;
+ }
+
+ /** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */
+ do_action( "rest_insert_{$this->post_type}", $nav_menu_item, $request, false );
+
+ $schema = $this->get_item_schema();
+
+ if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
+ $meta_update = $this->meta->update_value( $request['meta'], $nav_menu_item->ID );
+
+ if ( is_wp_error( $meta_update ) ) {
+ return $meta_update;
+ }
+ }
+
+ $nav_menu_item = $this->get_nav_menu_item( $nav_menu_item_id );
+ $fields_update = $this->update_additional_fields_for_object( $nav_menu_item, $request );
+
+ if ( is_wp_error( $fields_update ) ) {
+ return $fields_update;
+ }
+
+ $request->set_param( 'context', 'edit' );
+
+ /** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */
+ do_action( "rest_after_insert_{$this->post_type}", $nav_menu_item, $request, false );
+
+ $response = $this->prepare_item_for_response( $nav_menu_item, $request );
+
+ return rest_ensure_response( $response );
+ }
+
+ /**
+ * Deletes a single menu item.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return true|WP_Error True on success, or WP_Error object on failure.
+ */
+ public function delete_item( $request ) {
+ $menu_item = $this->get_nav_menu_item( $request['id'] );
+ if ( is_wp_error( $menu_item ) ) {
+ return $menu_item;
+ }
+
+ $force = isset( $request['force'] ) ? (bool) $request['force'] : false;
+
+ // We don't support trashing for menu items.
+ if ( ! $force ) {
+ /* translators: %s: force=true */
+ return new WP_Error( 'rest_trash_not_supported', sprintf( __( "Menu items do not support trashing. Set '%s' to delete.", 'gutenberg' ), 'force=true' ), array( 'status' => 501 ) );
+ }
+
+ $previous = $this->prepare_item_for_response( $menu_item, $request );
+
+ $result = wp_delete_post( $request['id'], true );
+
+ if ( ! $result ) {
+ return new WP_Error( 'rest_cannot_delete', __( 'The post cannot be deleted.', 'gutenberg' ), array( 'status' => 500 ) );
+ }
+
+ $response = new WP_REST_Response();
+ $response->set_data(
+ array(
+ 'deleted' => true,
+ 'previous' => $previous->get_data(),
+ )
+ );
+
+ /**
+ * Fires immediately after a single menu item is deleted or trashed via the REST API.
+ *
+ * They dynamic portion of the hook name, `$this->post_type`, refers to the post type slug.
+ *
+ * @param Object $menu_item The deleted or trashed menu item.
+ * @param WP_REST_Response $response The response data.
+ * @param WP_REST_Request $request The request sent to the API.
+ */
+ do_action( "rest_delete_{$this->post_type}", $menu_item, $response, $request );
+
+ return $response;
+ }
+
+ /**
+ * Prepares a single post for create or update.
+ *
+ * @param WP_REST_Request $request Request object.
+ *
+ * @return stdClass|WP_Error
+ */
+ protected function prepare_item_for_database( $request ) {
+ $menu_item_db_id = $request['id'];
+ $menu_item_obj = $this->get_nav_menu_item( $menu_item_db_id );
+ // Need to persist the menu item data. See https://core.trac.wordpress.org/ticket/28138 .
+ if ( ! is_wp_error( $menu_item_obj ) ) {
+ // Correct the menu position if this was the first item. See https://core.trac.wordpress.org/ticket/28140 .
+ $position = ( 0 === $menu_item_obj->menu_order ) ? 1 : $menu_item_obj->menu_order;
+
+ $prepared_nav_item = array(
+ 'menu-item-db-id' => $menu_item_db_id,
+ 'menu-item-object-id' => $menu_item_obj->object_id,
+ 'menu-item-object' => $menu_item_obj->object,
+ 'menu-item-parent-id' => $menu_item_obj->menu_item_parent,
+ 'menu-item-position' => $position,
+ 'menu-item-title' => $menu_item_obj->title,
+ 'menu-item-url' => $menu_item_obj->url,
+ 'menu-item-description' => $menu_item_obj->description,
+ 'menu-item-attr-title' => $menu_item_obj->attr_title,
+ 'menu-item-target' => $menu_item_obj->target,
+ // Stored in the database as a string.
+ 'menu-item-classes' => implode( ' ', $menu_item_obj->classes ),
+ 'menu-item-xfn' => $menu_item_obj->xfn,
+ 'menu-item-status' => $menu_item_obj->post_status,
+ 'menu-id' => $this->get_menu_id( $menu_item_db_id ),
+ );
+ } else {
+ $prepared_nav_item = array(
+ 'menu-id' => 0,
+ 'menu-item-db-id' => 0,
+ 'menu-item-object-id' => 0,
+ 'menu-item-object' => '',
+ 'menu-item-parent-id' => 0,
+ 'menu-item-position' => 0,
+ 'menu-item-type' => 'custom',
+ 'menu-item-title' => '',
+ 'menu-item-url' => '',
+ 'menu-item-description' => '',
+ 'menu-item-attr-title' => '',
+ 'menu-item-target' => '',
+ 'menu-item-classes' => '',
+ 'menu-item-xfn' => '',
+ 'menu-item-status' => 'publish',
+ );
+ }
+
+ $mapping = array(
+ 'menu-item-db-id' => 'id',
+ 'menu-item-object-id' => 'object_id',
+ 'menu-item-object' => 'object',
+ 'menu-item-parent-id' => 'parent',
+ 'menu-item-position' => 'menu_order',
+ 'menu-item-type' => 'type',
+ 'menu-item-url' => 'url',
+ 'menu-item-description' => 'description',
+ 'menu-item-attr-title' => 'attr_title',
+ 'menu-item-target' => 'target',
+ 'menu-item-classes' => 'classes',
+ 'menu-item-xfn' => 'xfn',
+ 'menu-item-status' => 'status',
+ );
+
+ $schema = $this->get_item_schema();
+
+ foreach ( $mapping as $original => $api_request ) {
+ if ( ! empty( $schema['properties'][ $api_request ] ) && isset( $request[ $api_request ] ) ) {
+ $check = rest_validate_value_from_schema( $request[ $api_request ], $schema['properties'][ $api_request ] );
+ if ( is_wp_error( $check ) ) {
+ $check->add_data( array( 'status' => 400 ) );
+ return $check;
+ }
+ $prepared_nav_item[ $original ] = rest_sanitize_value_from_schema( $request[ $api_request ], $schema['properties'][ $api_request ] );
+ }
+ }
+
+ $taxonomy = get_taxonomy( 'nav_menu' );
+ $base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
+ // If menus submitted, cast to int.
+ if ( isset( $request[ $base ] ) && ! empty( $request[ $base ] ) ) {
+ $prepared_nav_item['menu-id'] = absint( $request[ $base ] );
+ }
+
+ // Nav menu title.
+ if ( ! empty( $schema['properties']['title'] ) && isset( $request['title'] ) ) {
+ if ( is_string( $request['title'] ) ) {
+ $prepared_nav_item['menu-item-title'] = $request['title'];
+ } elseif ( ! empty( $request['title']['raw'] ) ) {
+ $prepared_nav_item['menu-item-title'] = $request['title']['raw'];
+ }
+ }
+
+ // Check if object id exists before saving.
+ if ( ! $prepared_nav_item['menu-item-object'] ) {
+ // If taxonony, check if term exists.
+ if ( 'taxonomy' === $prepared_nav_item['menu-item-type'] ) {
+ $original = get_term( absint( $prepared_nav_item['menu-item-object-id'] ) );
+ if ( empty( $original ) || is_wp_error( $original ) ) {
+ return new WP_Error( 'rest_term_invalid_id', __( 'Invalid term ID.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+ $prepared_nav_item['menu-item-object'] = get_term_field( 'taxonomy', $original );
+
+ // If post, check if post object exists.
+ } elseif ( 'post_type' === $prepared_nav_item['menu-item-type'] ) {
+ $original = get_post( absint( $prepared_nav_item['menu-item-object-id'] ) );
+ if ( empty( $original ) ) {
+ return new WP_Error( 'rest_post_invalid_id', __( 'Invalid post ID.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+ $prepared_nav_item['menu-item-object'] = get_post_type( $original );
+ }
+ }
+
+ // If post type archive, check if post type exists.
+ if ( 'post_type_archive' === $prepared_nav_item['menu-item-type'] ) {
+ $post_type = ( $prepared_nav_item['menu-item-object'] ) ? $prepared_nav_item['menu-item-object'] : false;
+ $original = get_post_type_object( $post_type );
+ if ( empty( $original ) ) {
+ return new WP_Error( 'rest_post_invalid_type', __( 'Invalid post type.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+ }
+
+ // Check if menu item is type custom, then title and url are required.
+ if ( 'custom' === $prepared_nav_item['menu-item-type'] ) {
+ if ( '' === $prepared_nav_item['menu-item-title'] ) {
+ return new WP_Error( 'rest_title_required', __( 'Title required if menu item of type custom.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+ if ( empty( $prepared_nav_item['menu-item-url'] ) ) {
+ return new WP_Error( 'rest_url_required', __( 'URL required if menu item of type custom.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+ }
+
+ // If menu id is set, valid the value of menu item position and parent id.
+ if ( ! empty( $prepared_nav_item['menu-id'] ) ) {
+ // Check if nav menu is valid.
+ if ( ! is_nav_menu( $prepared_nav_item['menu-id'] ) ) {
+ return new WP_Error( 'invalid_menu_id', __( 'Invalid menu ID.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+
+ // If menu item position is set to 0, insert as the last item in the existing menu.
+ $menu_items = wp_get_nav_menu_items( $prepared_nav_item['menu-id'], array( 'post_status' => 'publish,draft' ) );
+ if ( 0 === (int) $prepared_nav_item['menu-item-position'] ) {
+ if ( $menu_items ) {
+ $last_item = array_pop( $menu_items );
+ if ( $last_item && isset( $last_item->menu_order ) ) {
+ $prepared_nav_item['menu-item-position'] = $last_item->menu_order + 1;
+ } else {
+ $prepared_nav_item['menu-item-position'] = count( $menu_items );
+ }
+ } else {
+ $prepared_nav_item['menu-item-position'] = 1;
+ }
+ }
+
+ // Check if existing menu position is already in use by another menu item.
+ $menu_item_ids = array();
+ foreach ( $menu_items as $menu_item ) {
+ $menu_item_ids[] = $menu_item->ID;
+ if ( $menu_item->ID !== (int) $menu_item_db_id ) {
+ if ( (int) $prepared_nav_item['menu-item-position'] === (int) $menu_item->menu_order ) {
+ return new WP_Error( 'invalid_menu_order', __( 'Invalid menu position.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+ }
+ }
+
+ // Check if valid parent id is valid nav menu item in menu.
+ if ( $prepared_nav_item['menu-item-parent-id'] ) {
+ if ( ! is_nav_menu_item( $prepared_nav_item['menu-item-parent-id'] ) ) {
+ return new WP_Error( 'invalid_menu_item_parent', __( 'Invalid menu item parent.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+ if ( ! $menu_item_ids || ! in_array( $prepared_nav_item['menu-item-parent-id'], $menu_item_ids, true ) ) {
+ return new WP_Error( 'invalid_item_parent', __( 'Invalid menu item parent.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+ }
+ }
+
+ foreach ( array( 'menu-item-object-id', 'menu-item-parent-id' ) as $key ) {
+ // Note we need to allow negative-integer IDs for previewed objects not inserted yet.
+ $prepared_nav_item[ $key ] = intval( $prepared_nav_item[ $key ] );
+ }
+
+ foreach ( array( 'menu-item-type', 'menu-item-object', 'menu-item-target' ) as $key ) {
+ $prepared_nav_item[ $key ] = sanitize_key( $prepared_nav_item[ $key ] );
+ }
+
+ // Valid xfn and classes are an array.
+ foreach ( array( 'menu-item-xfn', 'menu-item-classes' ) as $key ) {
+ $value = $prepared_nav_item[ $key ];
+ if ( ! is_array( $value ) ) {
+ $value = wp_parse_list( $value );
+ }
+ $prepared_nav_item[ $key ] = implode( ' ', array_map( 'sanitize_html_class', $value ) );
+ }
+
+ // Apply the same filters as when calling wp_insert_post().
+
+ /** This filter is documented in wp-includes/post.php */
+ $prepared_nav_item['menu-item-title'] = wp_unslash( apply_filters( 'title_save_pre', wp_slash( $prepared_nav_item['menu-item-title'] ) ) );
+
+ /** This filter is documented in wp-includes/post.php */
+ $prepared_nav_item['menu-item-attr-title'] = wp_unslash( apply_filters( 'excerpt_save_pre', wp_slash( $prepared_nav_item['menu-item-attr-title'] ) ) );
+
+ /** This filter is documented in wp-includes/post.php */
+ $prepared_nav_item['menu-item-description'] = wp_unslash( apply_filters( 'content_save_pre', wp_slash( $prepared_nav_item['menu-item-description'] ) ) );
+
+ // Valid url.
+ if ( '' !== $prepared_nav_item['menu-item-url'] ) {
+ $prepared_nav_item['menu-item-url'] = esc_url_raw( $prepared_nav_item['menu-item-url'] );
+ if ( '' === $prepared_nav_item['menu-item-url'] ) {
+ // Fail sanitization if URL is invalid.
+ return new WP_Error( 'invalid_url', __( 'Invalid URL.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+ }
+ // Only draft / publish are valid post status for menu items.
+ if ( 'publish' !== $prepared_nav_item['menu-item-status'] ) {
+ $prepared_nav_item['menu-item-status'] = 'draft';
+ }
+
+ $prepared_nav_item = (object) $prepared_nav_item;
+
+ /**
+ * Filters a post before it is inserted via the REST API.
+ *
+ * The dynamic portion of the hook name, `$this->post_type`, refers to the post type slug.
+ *
+ * @param stdClass $prepared_post An object representing a single post prepared
+ * for inserting or updating the database.
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( "rest_pre_insert_{$this->post_type}", $prepared_nav_item, $request );
+ }
+
+ /**
+ * Prepares a single post output for response.
+ *
+ * @param object $post Post object.
+ * @param WP_REST_Request $request Request object.
+ *
+ * @return WP_REST_Response Response object.
+ */
+ public function prepare_item_for_response( $post, $request ) {
+ $fields = $this->get_fields_for_response( $request );
+
+ // Base fields for every post.
+ $menu_item = wp_setup_nav_menu_item( $post );
+ $data = array();
+ if ( in_array( 'id', $fields, true ) ) {
+ $data['id'] = $menu_item->ID;
+ }
+
+ if ( in_array( 'title', $fields, true ) ) {
+ add_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
+
+ $data['title'] = array(
+ 'raw' => $menu_item->post_title,
+ 'rendered' => $menu_item->title,
+ );
+
+ remove_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
+ }
+
+ if ( in_array( 'status', $fields, true ) ) {
+ $data['status'] = $menu_item->post_status;
+ }
+
+ if ( in_array( 'url', $fields, true ) ) {
+ $data['url'] = $menu_item->url;
+ }
+
+ if ( in_array( 'attr_title', $fields, true ) ) {
+ // Same as post_excerpt.
+ $data['attr_title'] = $menu_item->attr_title;
+ }
+
+ if ( in_array( 'description', $fields, true ) ) {
+ // Same as post_content.
+ $data['description'] = $menu_item->description;
+ }
+
+ if ( in_array( 'type', $fields, true ) ) {
+ // Using 'item_type' since 'type' already exists.
+ $data['type'] = $menu_item->type;
+ }
+
+ if ( in_array( 'type_label', $fields, true ) ) {
+ // Using 'item_type_label' to match up with 'item_type' - IS READ ONLY!
+ $data['type_label'] = $menu_item->type_label;
+ }
+
+ if ( in_array( 'object', $fields, true ) ) {
+ $data['object'] = $menu_item->object;
+ }
+
+ if ( in_array( 'object_id', $fields, true ) ) {
+ // Usually is a string, but lets expose as an integer.
+ $data['object_id'] = absint( $menu_item->object_id );
+ }
+
+ if ( in_array( 'parent', $fields, true ) ) {
+ // Same as post_parent, expose as integer.
+ $data['parent'] = absint( $menu_item->menu_item_parent );
+ }
+
+ if ( in_array( 'menu_order', $fields, true ) ) {
+ // Same as post_parent, expose as integer.
+ $data['menu_order'] = absint( $menu_item->menu_order );
+ }
+
+ if ( in_array( 'menu_id', $fields, true ) ) {
+ $data['menu_id'] = $this->get_menu_id( $menu_item->ID );
+ }
+
+ if ( in_array( 'target', $fields, true ) ) {
+ $data['target'] = $menu_item->target;
+ }
+
+ if ( in_array( 'classes', $fields, true ) ) {
+ $data['classes'] = (array) $menu_item->classes;
+ }
+
+ if ( in_array( 'xfn', $fields, true ) ) {
+ $data['xfn'] = array_map( 'sanitize_html_class', explode( ' ', $menu_item->xfn ) );
+ }
+
+ if ( in_array( 'meta', $fields, true ) ) {
+ $data['meta'] = $this->meta->get_value( $menu_item->ID, $request );
+ }
+
+ $taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );
+
+ foreach ( $taxonomies as $taxonomy ) {
+ $base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
+
+ if ( in_array( $base, $fields, true ) ) {
+ $terms = get_the_terms( $post, $taxonomy->name );
+ $data[ $base ] = $terms ? array_values( wp_list_pluck( $terms, 'term_id' ) ) : array();
+ }
+ }
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ $links = $this->prepare_links( $menu_item );
+ $response->add_links( $links );
+
+ if ( ! empty( $links['self']['href'] ) ) {
+ $actions = $this->get_available_actions( $menu_item, $request );
+
+ $self = $links['self']['href'];
+
+ foreach ( $actions as $rel ) {
+ $response->add_link( $rel, $self );
+ }
+ }
+
+ /**
+ * Filters the post data for a response.
+ *
+ * The dynamic portion of the hook name, `$this->post_type`, refers to the post type slug.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param object $post Post object.
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( "rest_prepare_{$this->post_type}", $response, $post, $request );
+ }
+
+ /**
+ * Prepares links for the request.
+ *
+ * @param object $menu_item Menu object.
+ *
+ * @return array Links for the given post.
+ */
+ protected function prepare_links( $menu_item ) {
+ $links = parent::prepare_links( $menu_item );
+
+ if ( 'post_type' === $menu_item->type && ! empty( $menu_item->object_id ) ) {
+ $post_type_object = get_post_type_object( $menu_item->object );
+ if ( $post_type_object->show_in_rest ) {
+ $rest_base = ! empty( $post_type_object->rest_base ) ? $post_type_object->rest_base : $post_type_object->name;
+ $url = rest_url( sprintf( 'wp/v2/%s/%d', $rest_base, $menu_item->object_id ) );
+ $links['https://api.w.org/object'][] = array(
+ 'href' => $url,
+ 'post_type' => $menu_item->type,
+ 'embeddable' => true,
+ );
+ }
+ } elseif ( 'taxonomy' === $menu_item->type && ! empty( $menu_item->object_id ) ) {
+ $taxonomy_object = get_taxonomy( $menu_item->object );
+ if ( $taxonomy_object->show_in_rest ) {
+ $rest_base = ! empty( $taxonomy_object->rest_base ) ? $taxonomy_object->rest_base : $taxonomy_object->name;
+ $url = rest_url( sprintf( 'wp/v2/%s/%d', $rest_base, $menu_item->object_id ) );
+ $links['https://api.w.org/object'][] = array(
+ 'href' => $url,
+ 'taxonomy' => $menu_item->type,
+ 'embeddable' => true,
+ );
+ }
+ }
+
+ return $links;
+ }
+
+ /**
+ * Retrieve Link Description Objects that should be added to the Schema for the posts collection.
+ *
+ * @return array
+ */
+ protected function get_schema_links() {
+ $links = parent::get_schema_links();
+ $href = rest_url( "{$this->namespace}/{$this->rest_base}/{id}" );
+ $links[] = array(
+ 'rel' => 'https://api.w.org/object',
+ 'title' => __( 'Get linked object.', 'gutenberg' ),
+ 'href' => $href,
+ 'targetSchema' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'object' => array(
+ 'type' => 'integer',
+ ),
+ ),
+ ),
+ );
+
+ return $links;
+ }
+
+ /**
+ * Retrieves the term's schema, conforming to JSON Schema.
+ *
+ * @return array Item schema data.
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => $this->post_type,
+ 'type' => 'object',
+ );
+
+ $schema['properties']['title'] = array(
+ 'description' => __( 'The title for the object.', 'gutenberg' ),
+ 'type' => 'object',
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'arg_options' => array(
+ // Note: sanitization implemented in self::prepare_item_for_database().
+ 'sanitize_callback' => null,
+ // Note: validation implemented in self::prepare_item_for_database().
+ 'validate_callback' => null,
+ ),
+ 'properties' => array(
+ 'raw' => array(
+ 'description' => __( 'Title for the object, as it exists in the database.', 'gutenberg' ),
+ 'type' => 'string',
+ 'context' => array( 'edit' ),
+ ),
+ 'rendered' => array(
+ 'description' => __( 'HTML title for the object, transformed for display.', 'gutenberg' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ $schema['properties']['id'] = array(
+ 'description' => __( 'Unique identifier for the object.', 'gutenberg' ),
+ 'type' => 'integer',
+ 'default' => 0,
+ 'minimum' => 0,
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'readonly' => true,
+ );
+
+ $schema['properties']['type_label'] = array(
+ 'description' => __( 'Name of type.', 'gutenberg' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'readonly' => true,
+ );
+
+ $schema['properties']['type'] = array(
+ 'description' => __( 'The family of objects originally represented, such as "post_type" or "taxonomy".', 'gutenberg' ),
+ 'type' => 'string',
+ 'enum' => array( 'taxonomy', 'post_type', 'post_type_archive', 'custom' ),
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'default' => 'custom',
+ );
+
+ $schema['properties']['status'] = array(
+ 'description' => __( 'A named status for the object.', 'gutenberg' ),
+ 'type' => 'string',
+ 'enum' => array_keys( get_post_stati( array( 'internal' => false ) ) ),
+ 'default' => 'publish',
+ 'context' => array( 'view', 'edit', 'embed' ),
+ );
+
+ $schema['properties']['parent'] = array(
+ 'description' => __( 'The ID for the parent of the object.', 'gutenberg' ),
+ 'type' => 'integer',
+ 'minimum' => 0,
+ 'default' => 0,
+ 'context' => array( 'view', 'edit', 'embed' ),
+ );
+
+ $schema['properties']['attr_title'] = array(
+ 'description' => __( 'Text for the title attribute of the link element for this menu item.', 'gutenberg' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ );
+
+ $schema['properties']['classes'] = array(
+ 'description' => __( 'Class names for the link element of this menu item.', 'gutenberg' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'string',
+ ),
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => function ( $value ) {
+ return array_map( 'sanitize_html_class', wp_parse_list( $value ) );
+ },
+ ),
+ );
+
+ $schema['properties']['description'] = array(
+ 'description' => __( 'The description of this menu item.', 'gutenberg' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ );
+
+ $schema['properties']['menu_order'] = array(
+ 'description' => __( 'The DB ID of the nav_menu_item that is this item\'s menu parent, if any, otherwise 0.', 'gutenberg' ),
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'type' => 'integer',
+ 'minimum' => 0,
+ 'default' => 0,
+ );
+ $schema['properties']['object'] = array(
+ 'description' => __( 'The type of object originally represented, such as "category," "post", or "attachment."', 'gutenberg' ),
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'type' => 'string',
+ );
+
+ $schema['properties']['object_id'] = array(
+ 'description' => __( 'The DB ID of the original object this menu item represents, e . g . ID for posts and term_id for categories.', 'gutenberg' ),
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'type' => 'integer',
+ 'minimum' => 0,
+ 'default' => 0,
+ );
+
+ $schema['properties']['target'] = array(
+ 'description' => __( 'The target attribute of the link element for this menu item.', 'gutenberg' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'enum' => array(
+ '_blank',
+ '',
+ ),
+ );
+
+ $schema['properties']['type_label'] = array(
+ 'description' => __( 'The singular label used to describe this type of menu item.', 'gutenberg' ),
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'type' => 'string',
+ 'readonly' => true,
+ );
+
+ $schema['properties']['url'] = array(
+ 'description' => __( 'The URL to which this menu item points.', 'gutenberg' ),
+ 'type' => 'string',
+ 'format' => 'uri',
+ 'context' => array( 'view', 'edit', 'embed' ),
+ );
+
+ $schema['properties']['xfn'] = array(
+ 'description' => __( 'The XFN relationship expressed in the link of this menu item.', 'gutenberg' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'string',
+ ),
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => function ( $value ) {
+ return array_map( 'sanitize_html_class', wp_parse_list( $value ) );
+ },
+ ),
+ );
+
+ $schema['properties']['_invalid'] = array(
+ 'description' => __( 'Whether the menu item represents an object that no longer exists.', 'gutenberg' ),
+ 'context' => array( 'view', 'edit', 'embed' ),
+ 'type' => 'boolean',
+ 'readonly' => true,
+ );
+
+ $taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );
+
+ foreach ( $taxonomies as $taxonomy ) {
+ $base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
+ $schema['properties'][ $base ] = array(
+ /* translators: %s: taxonomy name */
+ 'description' => sprintf( __( 'The terms assigned to the object in the %s taxonomy.', 'gutenberg' ), $taxonomy->name ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ );
+
+ if ( 'nav_menu' === $taxonomy->name ) {
+ $schema['properties'][ $base ]['type'] = 'integer';
+ unset( $schema['properties'][ $base ]['items'] );
+ }
+ }
+
+ $schema['properties']['meta'] = $this->meta->get_field_schema();
+
+ $schema_links = $this->get_schema_links();
+
+ if ( $schema_links ) {
+ $schema['links'] = $schema_links;
+ }
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+
+ /**
+ * Retrieves the query params for the posts collection.
+ *
+ * @return array Collection parameters.
+ */
+ public function get_collection_params() {
+ $query_params = parent::get_collection_params();
+
+ $query_params['menu_order'] = array(
+ 'description' => __( 'Limit result set to posts with a specific menu_order value.', 'gutenberg' ),
+ 'type' => 'integer',
+ );
+
+ $query_params['order'] = array(
+ 'description' => __( 'Order sort attribute ascending or descending.', 'gutenberg' ),
+ 'type' => 'string',
+ 'default' => 'asc',
+ 'enum' => array( 'asc', 'desc' ),
+ );
+
+ $query_params['orderby'] = array(
+ 'description' => __( 'Sort collection by object attribute.', 'gutenberg' ),
+ 'type' => 'string',
+ 'default' => 'menu_order',
+ 'enum' => array(
+ 'author',
+ 'date',
+ 'id',
+ 'include',
+ 'modified',
+ 'parent',
+ 'relevance',
+ 'slug',
+ 'include_slugs',
+ 'title',
+ 'menu_order',
+ ),
+ );
+
+ return $query_params;
+ }
+
+ /**
+ * Determines the allowed query_vars for a get_items() response and prepares
+ * them for WP_Query.
+ *
+ * @param array $prepared_args Optional. Prepared WP_Query arguments. Default empty array.
+ * @param WP_REST_Request $request Optional. Full details about the request.
+ *
+ * @return array Items query arguments.
+ */
+ protected function prepare_items_query( $prepared_args = array(), $request = null ) {
+ $query_args = parent::prepare_items_query( $prepared_args, $request );
+
+ // Map to proper WP_Query orderby param.
+ if ( isset( $query_args['orderby'] ) && isset( $request['orderby'] ) ) {
+ $orderby_mappings = array(
+ 'id' => 'ID',
+ 'include' => 'post__in',
+ 'slug' => 'post_name',
+ 'include_slugs' => 'post_name__in',
+ 'menu_order' => 'menu_order',
+ );
+
+ if ( isset( $orderby_mappings[ $request['orderby'] ] ) ) {
+ $query_args['orderby'] = $orderby_mappings[ $request['orderby'] ];
+ }
+ }
+
+ return $query_args;
+ }
+
+ /**
+ * Checks whether current user can assign all terms sent with the current request.
+ *
+ * @param WP_REST_Request $request The request object with post and terms data.
+ *
+ * @return bool Whether the current user can assign the provided terms.
+ */
+ protected function check_assign_terms_permission( $request ) {
+ $taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );
+ foreach ( $taxonomies as $taxonomy ) {
+ $base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
+
+ if ( ! isset( $request[ $base ] ) ) {
+ continue;
+ }
+
+ foreach ( (array) $request[ $base ] as $term_id ) {
+ if ( ! $term_id ) {
+ continue;
+ }
+
+ // Invalid terms will be rejected later.
+ if ( ! get_term( $term_id, $taxonomy->name ) ) {
+ continue;
+ };
+
+ if ( ! current_user_can( 'assign_term', (int) $term_id ) ) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Get menu id of current menu item.
+ *
+ * @param int $menu_item_id Menu item id.
+ *
+ * @return int
+ */
+ protected function get_menu_id( $menu_item_id ) {
+ $menu_ids = wp_get_post_terms( $menu_item_id, 'nav_menu', array( 'fields' => 'ids' ) );
+ $menu_id = 0;
+ if ( $menu_ids && ! is_wp_error( $menu_ids ) ) {
+ $menu_id = array_shift( $menu_ids );
+ }
+
+ return $menu_id;
+ }
+}
diff --git a/lib/class-wp-rest-menu-locations-controller.php b/lib/class-wp-rest-menu-locations-controller.php
new file mode 100644
index 00000000000000..d5df276c03c6ae
--- /dev/null
+++ b/lib/class-wp-rest-menu-locations-controller.php
@@ -0,0 +1,264 @@
+namespace = '__experimental';
+ $this->rest_base = 'menu-locations';
+ }
+
+ /**
+ * Registers the routes for the objects of the controller.
+ *
+ * @see register_rest_route()
+ */
+ public function register_routes() {
+ register_rest_route(
+ $this->namespace,
+ '/' . $this->rest_base,
+ array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ 'args' => $this->get_collection_params(),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+
+ register_rest_route(
+ $this->namespace,
+ '/' . $this->rest_base . '/(?P[\w-]+)',
+ array(
+ 'args' => array(
+ 'location' => array(
+ 'description' => __( 'An alphanumeric identifier for the menu location.', 'gutenberg' ),
+ 'type' => 'string',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_item_permissions_check' ),
+ 'args' => array(
+ 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Checks whether a given request has permission to read menu locations.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return WP_Error|bool True if the request has read access, WP_Error object otherwise.
+ */
+ public function get_items_permissions_check( $request ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
+ if ( ! current_user_can( 'edit_theme_options' ) ) {
+ return new WP_Error( 'rest_cannot_view', __( 'Sorry, you are not allowed to view menu locations.', 'gutenberg' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ return true;
+ }
+
+ /**
+ * Retrieves all menu locations, depending on user context.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure.
+ */
+ public function get_items( $request ) {
+ $data = array();
+
+ foreach ( get_registered_nav_menus() as $name => $description ) {
+ $location = new stdClass();
+ $location->name = $name;
+ $location->description = $description;
+
+ $location = $this->prepare_item_for_response( $location, $request );
+ $data[ $name ] = $this->prepare_response_for_collection( $location );
+ }
+
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Checks if a given request has access to read a menu location.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return WP_Error|bool True if the request has read access for the item, WP_Error object otherwise.
+ */
+ public function get_item_permissions_check( $request ) {
+ if ( ! current_user_can( 'edit_theme_options' ) ) {
+ return new WP_Error( 'rest_cannot_view', __( 'Sorry, you are not allowed to view menu locations.', 'gutenberg' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ if ( ! array_key_exists( $request['location'], get_registered_nav_menus() ) ) {
+ return new WP_Error( 'rest_menu_location_invalid', __( 'Invalid menu location.', 'gutenberg' ), array( 'status' => 404 ) );
+ }
+
+ return true;
+ }
+
+ /**
+ * Retrieves a specific menu location.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure.
+ */
+ public function get_item( $request ) {
+ $registered_menus = get_registered_nav_menus();
+ if ( ! array_key_exists( $request['location'], $registered_menus ) ) {
+ return new WP_Error( 'rest_menu_location_invalid', __( 'Invalid menu location.', 'gutenberg' ), array( 'status' => 404 ) );
+ }
+
+ $location = new stdClass();
+ $location->name = $request['location'];
+ $location->description = $registered_menus[ $location->name ];
+
+ $data = $this->prepare_item_for_response( $location, $request );
+
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Prepares a menu location object for serialization.
+ *
+ * @param stdClass $location Post status data.
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return WP_REST_Response Post status data.
+ */
+ public function prepare_item_for_response( $location, $request ) {
+ $locations = get_nav_menu_locations();
+ $menu = ( isset( $locations[ $location->name ] ) ) ? $locations[ $location->name ] : 0;
+ $data = array(
+ 'name' => $location->name,
+ 'description' => $location->description,
+ 'menu' => $menu,
+ );
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $location ) );
+
+ /**
+ * Filters a menu location returned from the REST API.
+ *
+ * Allows modification of the menu location data right before it is
+ * returned.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param object $location The original status object.
+ * @param WP_REST_Request $request Request used to generate the response.
+ */
+ return apply_filters( 'rest_prepare_menu_location', $response, $location, $request );
+ }
+
+ /**
+ * Retrieves the menu location's schema, conforming to JSON Schema.
+ *
+ * @return array Item schema data.
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'menu-location',
+ 'type' => 'object',
+ 'properties' => array(
+ 'name' => array(
+ 'description' => __( 'The name of the menu location.', 'gutenberg' ),
+ 'type' => 'string',
+ 'context' => array( 'embed', 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'description' => array(
+ 'description' => __( 'The description of the menu location.', 'gutenberg' ),
+ 'type' => 'string',
+ 'context' => array( 'embed', 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'menu' => array(
+ 'description' => __( 'The ID of the assigned menu.', 'gutenberg' ),
+ 'type' => 'integer',
+ 'context' => array( 'embed', 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+
+ /**
+ * Retrieves the query params for collections.
+ *
+ * @return array Collection parameters.
+ */
+ public function get_collection_params() {
+ return array(
+ 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
+ );
+ }
+
+ /**
+ * Prepares links for the request.
+ *
+ * @param stdClass $location Menu location.
+ *
+ * @return array Links for the given menu location.
+ */
+ protected function prepare_links( $location ) {
+ $base = sprintf( '%s/%s', $this->namespace, $this->rest_base );
+
+ // Entity meta.
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( trailingslashit( $base ) . $location->name ),
+ ),
+ 'collection' => array(
+ 'href' => rest_url( $base ),
+ ),
+ );
+
+ $locations = get_nav_menu_locations();
+ $menu = ( isset( $locations[ $location->name ] ) ) ? $locations[ $location->name ] : 0;
+ if ( $menu ) {
+ $taxonomy_object = get_taxonomy( 'nav_menu' );
+ if ( $taxonomy_object->show_in_rest ) {
+ $rest_base = ! empty( $taxonomy_object->rest_base ) ? $taxonomy_object->rest_base : $taxonomy_object->name;
+ $url = rest_url( sprintf( '__experimental/%s/%d', $rest_base, $menu ) );
+ $links['https://api.w.org/menu'][] = array(
+ 'href' => $url,
+ 'embeddable' => true,
+ );
+ }
+ }
+
+ return $links;
+ }
+}
diff --git a/lib/class-wp-rest-menus-controller.php b/lib/class-wp-rest-menus-controller.php
new file mode 100644
index 00000000000000..2c0a782f8ed212
--- /dev/null
+++ b/lib/class-wp-rest-menus-controller.php
@@ -0,0 +1,490 @@
+namespace = '__experimental';
+ }
+
+ /**
+ * Checks if a request has access to read terms in the specified taxonomy.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return bool|WP_Error True if the request has read access, otherwise false or WP_Error object.
+ */
+ public function get_items_permissions_check( $request ) {
+ $tax_obj = get_taxonomy( $this->taxonomy );
+ if ( ! $tax_obj || ! $this->check_is_taxonomy_allowed( $this->taxonomy ) ) {
+ return false;
+ }
+ if ( ! current_user_can( $tax_obj->cap->edit_terms ) ) {
+ if ( 'edit' === $request['context'] ) {
+ return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to edit terms in this taxonomy.', 'gutenberg' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot view these menus, unless you have access to permission edit them. ', 'gutenberg' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return true;
+ }
+
+ /**
+ * Checks if a request has access to read or edit the specified menu.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return bool|WP_Error True if the request has read access for the item, otherwise false or WP_Error object.
+ */
+ public function get_item_permissions_check( $request ) {
+ $term = $this->get_term( $request['id'] );
+ if ( is_wp_error( $term ) ) {
+ return $term;
+ }
+ if ( ! current_user_can( 'edit_term', $term->term_id ) ) {
+ if ( 'edit' === $request['context'] ) {
+ return new WP_Error( 'rest_forbidden_context', __( 'Sorry, you are not allowed to edit this term.', 'gutenberg' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return new WP_Error( 'rest_cannot_view', __( 'Sorry, you cannot view this menu, unless you have access to permission edit it. ', 'gutenberg' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return true;
+ }
+
+ /**
+ * Get the term, if the ID is valid.
+ *
+ * @param int $id Supplied ID.
+ *
+ * @return WP_Term|WP_Error Term object if ID is valid, WP_Error otherwise.
+ */
+ protected function get_term( $id ) {
+ $term = parent::get_term( $id );
+
+ if ( is_wp_error( $term ) ) {
+ return $term;
+ }
+
+ $nav_term = wp_get_nav_menu_object( $term );
+
+ return $nav_term;
+ }
+
+ /**
+ * Checks if a request has access to create a term.
+ * Also check if request can assign menu locations.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return bool|WP_Error True if the request has access to create items, false or WP_Error object otherwise.
+ */
+ public function create_item_permissions_check( $request ) {
+ $check = $this->check_assign_locations_permission( $request );
+ if ( is_wp_error( $check ) ) {
+ return $check;
+ }
+
+ return parent::create_item_permissions_check( $request );
+ }
+
+ /**
+ * Checks if a request has access to update the specified term.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return bool|WP_Error True if the request has access to update the item, false or WP_Error object otherwise.
+ */
+ public function update_item_permissions_check( $request ) {
+ $check = $this->check_assign_locations_permission( $request );
+ if ( is_wp_error( $check ) ) {
+ return $check;
+ }
+
+ return parent::update_item_permissions_check( $request );
+ }
+
+ /**
+ * Checks whether current user can assign all locations sent with the current request.
+ *
+ * @param WP_REST_Request $request The request object with post and locations data.
+ *
+ * @return bool Whether the current user can assign the provided terms.
+ */
+ protected function check_assign_locations_permission( $request ) {
+ if ( ! isset( $request['locations'] ) ) {
+ return true;
+ }
+
+ if ( ! current_user_can( 'edit_theme_options' ) ) {
+ return new WP_Error( 'rest_cannot_assign_location', __( 'Sorry, you are not allowed to assign the provided locations.', 'gutenberg' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ foreach ( $request['locations'] as $location ) {
+ if ( ! array_key_exists( $location, get_registered_nav_menus() ) ) {
+ return new WP_Error(
+ 'rest_menu_location_invalid',
+ __( 'Invalid menu location.', 'gutenberg' ),
+ array(
+ 'status' => 400,
+ 'location' => $location,
+ )
+ );
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Prepares a single term output for response.
+ *
+ * @param obj $term Term object.
+ * @param WP_REST_Request $request Request object.
+ *
+ * @return WP_REST_Response $response Response object.
+ */
+ public function prepare_item_for_response( $term, $request ) {
+ $nav_menu = wp_get_nav_menu_object( $term );
+
+ return parent::prepare_item_for_response( $nav_menu, $request );
+ }
+
+ /**
+ * Prepares links for the request.
+ *
+ * @param object $term Term object.
+ *
+ * @return array Links for the given term.
+ */
+ protected function prepare_links( $term ) {
+ $links = parent::prepare_links( $term );
+
+ $locations = get_nav_menu_locations();
+ $rest_base = 'menu-locations';
+ foreach ( $locations as $menu_name => $menu_id ) {
+ if ( $term->term_id === $menu_id ) {
+ $url = rest_url( sprintf( '__experimental/%s/%s', $rest_base, $menu_name ) );
+ $links['https://api.w.org/menu-location'][] = array(
+ 'href' => $url,
+ 'embeddable' => true,
+ );
+ }
+ }
+
+ return $links;
+ }
+
+ /**
+ * Prepares a single term for create or update.
+ *
+ * @param WP_REST_Request $request Request object.
+ *
+ * @return array $prepared_term Term object.
+ */
+ public function prepare_item_for_database( $request ) {
+ $prepared_term = parent::prepare_item_for_database( $request );
+
+ $prepared_term = (array) $prepared_term;
+ $schema = $this->get_item_schema();
+ if ( isset( $request['name'] ) && ! empty( $schema['properties']['name'] ) ) {
+ $prepared_term['menu-name'] = $request['name'];
+ }
+
+ return $prepared_term;
+ }
+
+ /**
+ * Creates a single term in a taxonomy.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
+ */
+ public function create_item( $request ) {
+ if ( isset( $request['parent'] ) ) {
+ if ( ! is_taxonomy_hierarchical( $this->taxonomy ) ) {
+ return new WP_Error( 'rest_taxonomy_not_hierarchical', __( 'Cannot set parent term, taxonomy is not hierarchical.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+
+ $parent = wp_get_nav_menu_object( (int) $request['parent'] );
+
+ if ( ! $parent ) {
+ return new WP_Error( 'rest_term_invalid', __( 'Parent term does not exist.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+ }
+
+ $prepared_term = $this->prepare_item_for_database( $request );
+
+ $term = wp_update_nav_menu_object( 0, wp_slash( (array) $prepared_term ) );
+
+ if ( is_wp_error( $term ) ) {
+ /*
+ * If we're going to inform the client that the term already exists,
+ * give them the identifier for future use.
+ */
+ $term_id = $term->get_error_data( 'term_exists' );
+ if ( $term_id ) {
+ $existing_term = get_term( $term_id, $this->taxonomy );
+ $term->add_data( $existing_term->term_id, 'term_exists' );
+ $term->add_data(
+ array(
+ 'status' => 400,
+ 'term_id' => $term_id,
+ )
+ );
+ }
+
+ return $term;
+ }
+
+ $term = $this->get_term( $term );
+
+ /**
+ * Fires after a single term is created or updated via the REST API.
+ *
+ * The dynamic portion of the hook name, `$this->taxonomy`, refers to the taxonomy slug.
+ *
+ * @param WP_Term $term Inserted or updated term object.
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating True when creating a term, false when updating.
+ */
+ do_action( "rest_insert_{$this->taxonomy}", $term, $request, true );
+
+ $schema = $this->get_item_schema();
+ if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
+ $meta_update = $this->meta->update_value( $request['meta'], $term->term_id );
+
+ if ( is_wp_error( $meta_update ) ) {
+ return $meta_update;
+ }
+ }
+
+ $locations_update = $this->handle_locations( $term->term_id, $request );
+
+ if ( is_wp_error( $locations_update ) ) {
+ return $locations_update;
+ }
+
+ $fields_update = $this->update_additional_fields_for_object( $term, $request );
+
+ if ( is_wp_error( $fields_update ) ) {
+ return $fields_update;
+ }
+
+ $request->set_param( 'context', 'view' );
+
+ /**
+ * Fires after a single term is completely created or updated via the REST API.
+ *
+ * The dynamic portion of the hook name, `$this->taxonomy`, refers to the taxonomy slug.
+ *
+ * @param WP_Term $term Inserted or updated term object.
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating True when creating a term, false when updating.
+ *
+ * @since 5.0.0
+ */
+ do_action( "rest_after_insert_{$this->taxonomy}", $term, $request, true );
+
+ $response = $this->prepare_item_for_response( $term, $request );
+ $response = rest_ensure_response( $response );
+
+ $response->set_status( 201 );
+ $response->header( 'Location', rest_url( $this->namespace . '/' . $this->rest_base . '/' . $term->term_id ) );
+
+ return $response;
+ }
+
+ /**
+ * Updates a single term from a taxonomy.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
+ */
+ public function update_item( $request ) {
+ $term = $this->get_term( $request['id'] );
+ if ( is_wp_error( $term ) ) {
+ return $term;
+ }
+
+ if ( isset( $request['parent'] ) ) {
+ if ( ! is_taxonomy_hierarchical( $this->taxonomy ) ) {
+ return new WP_Error( 'rest_taxonomy_not_hierarchical', __( 'Cannot set parent term, taxonomy is not hierarchical.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+
+ $parent = get_term( (int) $request['parent'], $this->taxonomy );
+
+ if ( ! $parent ) {
+ return new WP_Error( 'rest_term_invalid', __( 'Parent term does not exist.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+ }
+
+ $prepared_term = $this->prepare_item_for_database( $request );
+
+ // Only update the term if we haz something to update.
+ if ( ! empty( $prepared_term ) ) {
+ $update = wp_update_nav_menu_object( $term->term_id, wp_slash( (array) $prepared_term ) );
+
+ if ( is_wp_error( $update ) ) {
+ return $update;
+ }
+ }
+
+ $term = get_term( $term->term_id, $this->taxonomy );
+
+ /** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
+ do_action( "rest_insert_{$this->taxonomy}", $term, $request, false );
+
+ $schema = $this->get_item_schema();
+ if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
+ $meta_update = $this->meta->update_value( $request['meta'], $term->term_id );
+
+ if ( is_wp_error( $meta_update ) ) {
+ return $meta_update;
+ }
+ }
+
+ $locations_update = $this->handle_locations( $term->term_id, $request );
+
+ if ( is_wp_error( $locations_update ) ) {
+ return $locations_update;
+ }
+
+ $fields_update = $this->update_additional_fields_for_object( $term, $request );
+
+ if ( is_wp_error( $fields_update ) ) {
+ return $fields_update;
+ }
+
+ $request->set_param( 'context', 'view' );
+
+ /** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
+ do_action( "rest_after_insert_{$this->taxonomy}", $term, $request, false );
+
+ $response = $this->prepare_item_for_response( $term, $request );
+
+ return rest_ensure_response( $response );
+ }
+
+ /**
+ * Deletes a single term from a taxonomy.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
+ */
+ public function delete_item( $request ) {
+ $term = $this->get_term( $request['id'] );
+ if ( is_wp_error( $term ) ) {
+ return $term;
+ }
+
+ $force = isset( $request['force'] ) ? (bool) $request['force'] : false;
+
+ // We don't support trashing for terms.
+ if ( ! $force ) {
+ /* translators: %s: force=true */
+ return new WP_Error( 'rest_trash_not_supported', sprintf( __( "Terms do not support trashing. Set '%s' to delete.", 'gutenberg' ), 'force=true' ), array( 'status' => 501 ) );
+ }
+
+ $request->set_param( 'context', 'view' );
+
+ $previous = $this->prepare_item_for_response( $term, $request );
+
+ $retval = wp_delete_nav_menu( $term );
+
+ if ( ! $retval ) {
+ return new WP_Error( 'rest_cannot_delete', __( 'The term cannot be deleted.', 'gutenberg' ), array( 'status' => 500 ) );
+ }
+
+ $response = new WP_REST_Response();
+ $response->set_data(
+ array(
+ 'deleted' => true,
+ 'previous' => $previous->get_data(),
+ )
+ );
+
+ /**
+ * Fires after a single term is deleted via the REST API.
+ *
+ * The dynamic portion of the hook name, `$this->taxonomy`, refers to the taxonomy slug.
+ *
+ * @param WP_Term $term The deleted term.
+ * @param WP_REST_Response $response The response data.
+ * @param WP_REST_Request $request The request sent to the API.
+ */
+ do_action( "rest_delete_{$this->taxonomy}", $term, $response, $request );
+
+ return $response;
+ }
+
+ /**
+ * Updates the menu's locations from a REST request.
+ *
+ * @param int $menu_id The menu id to update the location form.
+ * @param WP_REST_Request $request The request object with menu and locations data.
+ *
+ * @return true|WP_Error WP_Error on an error assigning any of the locations, otherwise null.
+ */
+ protected function handle_locations( $menu_id, $request ) {
+ if ( ! isset( $request['locations'] ) ) {
+ return true;
+ }
+
+ $menu_locations = get_registered_nav_menus();
+ $menu_locations = array_keys( $menu_locations );
+ $new_locations = array();
+ foreach ( $request['locations'] as $location ) {
+ if ( ! in_array( $location, $menu_locations, true ) ) {
+ return new WP_Error( 'invalid_menu_location', __( 'Menu location does not exist.', 'gutenberg' ), array( 'status' => 400 ) );
+ }
+ $new_locations[ $location ] = $menu_id;
+ }
+ $assigned_menu = get_nav_menu_locations();
+ foreach ( $assigned_menu as $location => $term_id ) {
+ if ( $term_id === $menu_id ) {
+ unset( $assigned_menu[ $location ] );
+ }
+ }
+ $new_assignments = array_merge( $assigned_menu, $new_locations );
+ set_theme_mod( 'nav_menu_locations', $new_assignments );
+
+ return true;
+ }
+
+ /**
+ * Retrieves the term's schema, conforming to JSON Schema.
+ *
+ * @return array Item schema data.
+ */
+ public function get_item_schema() {
+ $schema = parent::get_item_schema();
+ unset( $schema['properties']['count'] );
+ unset( $schema['properties']['link'] );
+ unset( $schema['properties']['taxonomy'] );
+
+ $schema['properties']['locations'] = array(
+ 'description' => __( 'The locations assigned to the menu.', 'gutenberg' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'string',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ );
+
+ return $schema;
+ }
+}
diff --git a/lib/client-assets.php b/lib/client-assets.php
index e143ef1c6caa69..32b92c7bdbde68 100644
--- a/lib/client-assets.php
+++ b/lib/client-assets.php
@@ -205,17 +205,36 @@ function gutenberg_override_style( &$styles, $handle, $src, $deps = array(), $ve
*
* @param WP_Scripts $scripts WP_Scripts instance (passed by reference).
*/
-function gutenberg_register_vendor_scripts( &$scripts ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
- // This function is intentionally left empty.
- //
- // Scripts such as react and react-dom are expected to be overridden soon,
- // and it is preferred to keep this function in place so as not to disturb
- // tooling related to the plugin build process.
- //
- // TODO: Remove phpcs exception in function signature once this function
- // regains its use.
- //
- // See https://github.com/WordPress/gutenberg/pull/20628.
+function gutenberg_register_vendor_scripts( &$scripts ) {
+ $suffix = SCRIPT_DEBUG ? '' : '.min';
+
+ /*
+ * This script registration and the corresponding function should be removed
+ * once the plugin is updated to support WordPress 5.4.0 and newer.
+ *
+ * See: `gutenberg_add_url_polyfill`
+ */
+ gutenberg_register_vendor_script(
+ $scripts,
+ 'wp-polyfill-url',
+ 'https://unpkg.com/core-js-url-browser@3.6.4/url' . $suffix . '.js',
+ array(),
+ '3.6.4'
+ );
+
+ /*
+ * This script registration and the corresponding function should be removed
+ * removed once the plugin is updated to support WordPress 5.4.0 and newer.
+ *
+ * See: `gutenberg_add_dom_rect_polyfill`
+ */
+ gutenberg_register_vendor_script(
+ $scripts,
+ 'wp-polyfill-dom-rect',
+ 'https://unpkg.com/polyfill-library@3.42.0/polyfills/DOMRect/polyfill.js',
+ array(),
+ '3.42.0'
+ );
}
add_action( 'wp_default_scripts', 'gutenberg_register_vendor_scripts' );
@@ -377,6 +396,15 @@ function gutenberg_register_packages_styles( &$styles ) {
);
$styles->add_data( 'wp-list-reusable-block', 'rtl', 'replace' );
+ gutenberg_override_style(
+ $styles,
+ 'wp-edit-navigation',
+ gutenberg_url( 'build/edit-navigation/style.css' ),
+ array( 'wp-components', 'wp-block-editor', 'wp-edit-blocks' ),
+ filemtime( gutenberg_dir_path() . 'build/edit-navigation/style.css' )
+ );
+ $styles->add_data( 'wp-edit-navigation', 'rtl', 'replace' );
+
gutenberg_override_style(
$styles,
'wp-edit-site',
@@ -413,19 +441,6 @@ function gutenberg_register_packages_styles( &$styles ) {
* @since 0.1.0
*/
function gutenberg_enqueue_block_editor_assets() {
- wp_add_inline_script(
- 'wp-api-fetch',
- sprintf(
- 'wp.apiFetch.nonceMiddleware = wp.apiFetch.createNonceMiddleware( "%s" );' .
- 'wp.apiFetch.use( wp.apiFetch.nonceMiddleware );' .
- 'wp.apiFetch.nonceEndpoint = "%s";' .
- 'wp.apiFetch.use( wp.apiFetch.mediaUploadMiddleware );',
- ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' ),
- admin_url( 'admin-ajax.php?action=gutenberg_rest_nonce' )
- ),
- 'after'
- );
-
if ( defined( 'GUTENBERG_LIVE_RELOAD' ) && GUTENBERG_LIVE_RELOAD ) {
$live_reload_url = ( GUTENBERG_LIVE_RELOAD === true ) ? 'http://localhost:35729/livereload.js' : GUTENBERG_LIVE_RELOAD;
@@ -607,54 +622,76 @@ function gutenberg_extend_block_editor_styles( $settings ) {
add_filter( 'block_editor_settings', 'gutenberg_extend_block_editor_styles' );
/**
- * Extends block editor settings to include a list of image dimensions per size.
+ * Load a block pattern by name.
+ *
+ * @param string $name Block Pattern File name.
+ *
+ * @return array Block Pattern Array.
+ */
+function gutenberg_load_block_pattern( $name ) {
+ return json_decode(
+ file_get_contents( __DIR__ . '/patterns/' . $name . '.json' ),
+ true
+ );
+}
+
+/**
+ * Extends block editor settings to include a list of default patterns.
*
* @param array $settings Default editor settings.
*
* @return array Filtered editor settings.
*/
-function gutenberg_extend_settings_image_dimensions( $settings ) {
- $image_dimensions = array();
- $all_sizes = wp_get_registered_image_subsizes();
- foreach ( $settings['imageSizes'] as $size ) {
- $key = $size['slug'];
- if ( isset( $all_sizes[ $key ] ) ) {
- $image_dimensions[ $key ] = $all_sizes[ $key ];
- }
+function gutenberg_extend_settings_block_patterns( $settings ) {
+ if ( empty( $settings['__experimentalBlockPatterns'] ) ) {
+ $settings['__experimentalBlockPatterns'] = [];
}
- $settings['imageDimensions'] = $image_dimensions;
+
+ $settings['__experimentalBlockPatterns'] = array_merge(
+ WP_Patterns_Registry::get_instance()->get_all_registered(),
+ $settings['__experimentalBlockPatterns']
+ );
+
return $settings;
}
-add_filter( 'block_editor_settings', 'gutenberg_extend_settings_image_dimensions' );
+add_filter( 'block_editor_settings', 'gutenberg_extend_settings_block_patterns', 0 );
/**
- * Load a block pattern by name.
+ * Extends block editor settings to determine whether to use custom line height controls.
*
- * @param string $name Block Pattern File name.
+ * @param array $settings Default editor settings.
*
- * @return array Block Pattern Array.
+ * @return array Filtered editor settings.
*/
-function gutenberg_load_block_pattern( $name ) {
- return json_decode(
- file_get_contents( __DIR__ . '/patterns/' . $name . '.json' ),
- true
- );
+function gutenberg_extend_settings_custom_line_height( $settings ) {
+ $settings['__experimentalDisableCustomLineHeight'] = get_theme_support( 'disable-custom-line-height' );
+ return $settings;
}
+add_filter( 'block_editor_settings', 'gutenberg_extend_settings_custom_line_height' );
/**
- * Extends block editor settings to include a list of default block patterns.
+ * Extends block editor settings to determine whether to use custom unit controls.
+ * Currently experimental.
*
* @param array $settings Default editor settings.
*
* @return array Filtered editor settings.
*/
-function gutenberg_extend_settings_block_patterns( $settings ) {
- $block_patterns = [
- gutenberg_load_block_pattern( 'text-two-columns' ),
- gutenberg_load_block_pattern( 'two-buttons' ),
- gutenberg_load_block_pattern( 'cover-abc' ),
- ];
- $settings['__experimentalBlockPatterns'] = $block_patterns;
+function gutenberg_extend_settings_custom_units( $settings ) {
+ $settings['__experimentalDisableCustomUnits'] = get_theme_support( 'experimental-custom-units' );
return $settings;
}
-add_filter( 'block_editor_settings', 'gutenberg_extend_settings_block_patterns' );
+add_filter( 'block_editor_settings', 'gutenberg_extend_settings_custom_units' );
+
+/*
+ * Register default patterns if not registered in Core already.
+ */
+if ( class_exists( 'WP_Patterns_Registry' ) && ! WP_Patterns_Registry::get_instance()->is_registered( 'text-two-columns' ) ) {
+ register_pattern( 'core/text-two-columns', gutenberg_load_block_pattern( 'text-two-columns' ) );
+ register_pattern( 'core/two-buttons', gutenberg_load_block_pattern( 'two-buttons' ) );
+ register_pattern( 'core/cover-abc', gutenberg_load_block_pattern( 'cover-abc' ) );
+ register_pattern( 'core/two-images', gutenberg_load_block_pattern( 'two-images' ) );
+ register_pattern( 'core/hero-two-columns', gutenberg_load_block_pattern( 'hero-two-columns' ) );
+ register_pattern( 'core/numbered-features', gutenberg_load_block_pattern( 'numbered-features' ) );
+ register_pattern( 'core/its-time', gutenberg_load_block_pattern( 'its-time' ) );
+}
diff --git a/lib/compat.php b/lib/compat.php
index 9fc297fbf73776..96c07375dda41e 100644
--- a/lib/compat.php
+++ b/lib/compat.php
@@ -8,6 +8,78 @@
* @package gutenberg
*/
+if ( ! function_exists( 'register_block_type_from_metadata' ) ) {
+ /**
+ * Registers a block type from metadata stored in the `block.json` file.
+ *
+ * @since 7.9.0
+ *
+ * @param string $path Path to the folder where the `block.json` file is located.
+ * @param array $args {
+ * Optional. Array of block type arguments. Any arguments may be defined, however the
+ * ones described below are supported by default. Default empty array.
+ *
+ * @type callable $render_callback Callback used to render blocks of this block type.
+ * }
+ * @return WP_Block_Type|false The registered block type on success, or false on failure.
+ */
+ function register_block_type_from_metadata( $path, $args = array() ) {
+ $file = trailingslashit( $path ) . 'block.json';
+ if ( ! file_exists( $file ) ) {
+ return false;
+ }
+
+ $metadata = json_decode( file_get_contents( $file ), true );
+ if ( ! is_array( $metadata ) ) {
+ return false;
+ }
+
+ return register_block_type(
+ $metadata['name'],
+ array_merge(
+ $metadata,
+ $args
+ )
+ );
+ }
+}
+
+/**
+ * Extends block editor settings to include a list of image dimensions per size.
+ *
+ * This can be removed when plugin support requires WordPress 5.4.0+.
+ *
+ * @see https://core.trac.wordpress.org/ticket/49389
+ * @see https://core.trac.wordpress.org/changeset/47240
+ *
+ * @param array $settings Default editor settings.
+ *
+ * @return array Filtered editor settings.
+ */
+function gutenberg_extend_settings_image_dimensions( $settings ) {
+ /*
+ * Only filter settings if:
+ * 1. `imageDimensions` is not already assigned, in which case it can be
+ * assumed to have been set from WordPress 5.4.0+ default settings.
+ * 2. `imageSizes` is an array. Plugins may run `block_editor_settings`
+ * directly and not provide all properties of the settings array.
+ */
+ if ( ! isset( $settings['imageDimensions'] ) && ! empty( $settings['imageSizes'] ) ) {
+ $image_dimensions = array();
+ $all_sizes = wp_get_registered_image_subsizes();
+ foreach ( $settings['imageSizes'] as $size ) {
+ $key = $size['slug'];
+ if ( isset( $all_sizes[ $key ] ) ) {
+ $image_dimensions[ $key ] = $all_sizes[ $key ];
+ }
+ }
+ $settings['imageDimensions'] = $image_dimensions;
+ }
+
+ return $settings;
+}
+add_filter( 'block_editor_settings', 'gutenberg_extend_settings_image_dimensions' );
+
/**
* Adds a polyfill for the WHATWG URL in environments which do not support it.
* The intention in how this action is handled is under the assumption that this
@@ -16,6 +88,10 @@
*
* This can be removed when plugin support requires WordPress 5.4.0+.
*
+ * The script registration occurs in `gutenberg_register_vendor_scripts`, which
+ * should be removed in coordination with this function.
+ *
+ * @see gutenberg_register_vendor_scripts
* @see https://core.trac.wordpress.org/ticket/49360
* @see https://developer.mozilla.org/en-US/docs/Web/API/URL/URL
* @see https://developer.wordpress.org/reference/functions/wp_default_packages_vendor/
@@ -25,28 +101,12 @@
* @param WP_Scripts $scripts WP_Scripts object.
*/
function gutenberg_add_url_polyfill( $scripts ) {
- // Only register polyfill if not already registered. This prevents handling
- // in an environment where core has updated to manage the polyfill. This
- // depends on the action being handled after default script registration.
- $is_polyfill_script_registered = (bool) $scripts->query( 'wp-polyfill-url', 'registered' );
- if ( $is_polyfill_script_registered ) {
- return;
- }
-
- gutenberg_register_vendor_script(
- $scripts,
- 'wp-polyfill-url',
- 'https://unpkg.com/polyfill-library@3.42.0/polyfills/URL/polyfill.js',
- array(),
- '3.42.0'
- );
-
did_action( 'init' ) && $scripts->add_inline_script(
'wp-polyfill',
wp_get_script_polyfill(
$scripts,
array(
- '\'URL\' in window' => 'wp-polyfill-url',
+ 'window.URL && window.URL.prototype && window.URLSearchParams' => 'wp-polyfill-url',
)
)
);
@@ -58,6 +118,10 @@ function gutenberg_add_url_polyfill( $scripts ) {
*
* This can be removed when plugin support requires WordPress 5.4.0+.
*
+ * The script registration occurs in `gutenberg_register_vendor_scripts`, which
+ * should be removed in coordination with this function.
+ *
+ * @see gutenberg_register_vendor_scripts
* @see gutenberg_add_url_polyfill
* @see https://core.trac.wordpress.org/ticket/49360
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMRect
@@ -68,22 +132,6 @@ function gutenberg_add_url_polyfill( $scripts ) {
* @param WP_Scripts $scripts WP_Scripts object.
*/
function gutenberg_add_dom_rect_polyfill( $scripts ) {
- // Only register polyfill if not already registered. This prevents handling
- // in an environment where core has updated to manage the polyfill. This
- // depends on the action being handled after default script registration.
- $is_polyfill_script_registered = (bool) $scripts->query( 'wp-polyfill-dom-rect', 'registered' );
- if ( $is_polyfill_script_registered ) {
- return;
- }
-
- gutenberg_register_vendor_script(
- $scripts,
- 'wp-polyfill-dom-rect',
- 'https://unpkg.com/polyfill-library@3.42.0/polyfills/DOMRect/polyfill.js',
- array(),
- '3.42.0'
- );
-
did_action( 'init' ) && $scripts->add_inline_script(
'wp-polyfill',
wp_get_script_polyfill(
@@ -113,3 +161,37 @@ function gutenberg_get_post_from_context() {
}
return get_post();
}
+
+/**
+ * Shim that hooks into `pre_render_block` so as to override `render_block` with
+ * a function that assigns block context.
+ *
+ * This can be removed when plugin support requires WordPress 5.5.0+.
+ *
+ * @see (TBD Trac Link)
+ *
+ * @param string|null $pre_render The pre-rendered content. Defaults to null.
+ * @param array $parsed_block The parsed block being rendered.
+ *
+ * @return string String of rendered HTML.
+ */
+function gutenberg_render_block_with_assigned_block_context( $pre_render, $parsed_block ) {
+ global $post;
+
+ // If a non-null value is provided, a filter has run at an earlier priority
+ // and has already handled custom rendering and should take precedence.
+ if ( null !== $pre_render ) {
+ return $pre_render;
+ }
+
+ $source_block = $parsed_block;
+
+ /** This filter is documented in src/wp-includes/blocks.php */
+ $parsed_block = apply_filters( 'render_block_data', $parsed_block, $source_block );
+ $context = array( 'postId' => $post->ID );
+ $block = new WP_Block( $parsed_block, $context );
+
+ /** This filter is documented in src/wp-includes/blocks.php */
+ return apply_filters( 'render_block', $block->render(), $parsed_block );
+}
+add_filter( 'pre_render_block', 'gutenberg_render_block_with_assigned_block_context', 9, 2 );
diff --git a/lib/edit-site-page.php b/lib/edit-site-page.php
index 2dfa377d4a432f..c9cad42f3360cd 100644
--- a/lib/edit-site-page.php
+++ b/lib/edit-site-page.php
@@ -20,6 +20,66 @@ class="edit-site"
file_get_contents(
+ ABSPATH . WPINC . '/css/dist/editor/editor-styles.css'
+ ),
+ ),
+ );
+
+ /* translators: Use this to specify the CSS font family for the default font. */
+ $locale_font_family = esc_html_x( 'Noto Serif', 'CSS Font Family for Editor Font', 'gutenberg' );
+ $styles[] = array(
+ 'css' => "body { font-family: '$locale_font_family' }",
+ );
+
+ if ( $editor_styles && current_theme_supports( 'editor-styles' ) ) {
+ foreach ( $editor_styles as $style ) {
+ if ( preg_match( '~^(https?:)?//~', $style ) ) {
+ $response = wp_remote_get( $style );
+ if ( ! is_wp_error( $response ) ) {
+ $styles[] = array(
+ 'css' => wp_remote_retrieve_body( $response ),
+ );
+ }
+ } else {
+ $file = get_theme_file_path( $style );
+ if ( is_file( $file ) ) {
+ $styles[] = array(
+ 'css' => file_get_contents( $file ),
+ 'baseURL' => get_theme_file_uri( $style ),
+ );
+ }
+ }
+ }
+ }
+
+ return $styles;
+}
+
/**
* Initialize the Gutenberg Edit Site Page.
*
@@ -33,15 +93,21 @@ function gutenberg_edit_site_init( $hook ) {
$_wp_current_template_name,
$_wp_current_template_content,
$_wp_current_template_hierarchy,
- $_wp_current_template_part_ids;
-
- $allowed_hooks = array( 'gutenberg_page_gutenberg-edit-site' );
- $allowed_hooks = apply_filters( 'site_editor_allowed_hooks', $allowed_hooks );
+ $_wp_current_template_part_ids,
+ $current_screen;
- if ( ! in_array( $hook, $allowed_hooks, true ) ) {
+ if ( ! gutenberg_is_edit_site_page( $hook ) ) {
return;
}
+ /**
+ * Make the WP Screen object aware that this is a block editor page.
+ * Since custom blocks check whether the screen is_block_editor,
+ * this is required for custom blocks to be loaded.
+ * See wp_enqueue_registered_block_scripts_and_styles in wp-includes/script-loader.php
+ */
+ $current_screen->is_block_editor( true );
+
// Get editor settings.
$max_upload_size = wp_max_upload_size();
if ( ! $max_upload_size ) {
@@ -130,12 +196,34 @@ function gutenberg_edit_site_init( $hook ) {
$settings['templateType'] = 'wp_template';
$settings['templateIds'] = array_values( $template_ids );
$settings['templatePartIds'] = array_values( $template_part_ids );
+ $settings['styles'] = gutenberg_get_editor_styles();
// This is so other parts of the code can hook their own settings.
// Example: Global Styles.
global $post;
$settings = apply_filters( 'block_editor_settings', $settings, $post );
+ // Preload block editor paths.
+ // most of these are copied from edit-forms-blocks.php.
+ $preload_paths = array(
+ '/',
+ '/wp/v2/types?context=edit',
+ '/wp/v2/taxonomies?per_page=-1&context=edit',
+ '/wp/v2/themes?status=active',
+ sprintf( '/wp/v2/templates/%s?context=edit', $_wp_current_template_id ),
+ array( '/wp/v2/media', 'OPTIONS' ),
+ );
+ $preload_data = array_reduce(
+ $preload_paths,
+ 'rest_preload_api_request',
+ array()
+ );
+ wp_add_inline_script(
+ 'wp-api-fetch',
+ sprintf( 'wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );', wp_json_encode( $preload_data ) ),
+ 'after'
+ );
+
// Initialize editor.
wp_add_inline_script(
'wp-edit-site',
@@ -147,12 +235,31 @@ function gutenberg_edit_site_init( $hook ) {
)
);
- // Preload server-registered block schemas.
wp_add_inline_script(
'wp-blocks',
- 'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');'
+ sprintf( 'wp.blocks.unstable__bootstrapServerSideBlockDefinitions( %s );', wp_json_encode( get_block_editor_server_block_settings() ) ),
+ 'after'
+ );
+
+ wp_add_inline_script(
+ 'wp-blocks',
+ sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $post ) ) ),
+ 'after'
);
+ /**
+ * Fires after block assets have been enqueued for the editing interface.
+ *
+ * Call `add_action` on any hook before 'admin_enqueue_scripts'.
+ *
+ * In the function call you supply, simply use `wp_enqueue_script` and
+ * `wp_enqueue_style` to add your functionality to the block editor.
+ *
+ * @since 5.0.0
+ */
+
+ do_action( 'enqueue_block_editor_assets' );
+
wp_enqueue_script( 'wp-edit-site' );
wp_enqueue_script( 'wp-format-library' );
wp_enqueue_style( 'wp-edit-site' );
diff --git a/lib/experiments-page.php b/lib/experiments-page.php
index 2d8ac36a2c2569..07a7f2a200a7b3 100644
--- a/lib/experiments-page.php
+++ b/lib/experiments-page.php
@@ -51,6 +51,17 @@ function gutenberg_initialize_experiments_settings() {
'id' => 'gutenberg-widget-experiments',
)
);
+ add_settings_field(
+ 'gutenberg-navigation',
+ __( 'Navigation', 'gutenberg' ),
+ 'gutenberg_display_experiment_field',
+ 'gutenberg-experiments',
+ 'gutenberg_experiments_section',
+ array(
+ 'label' => __( 'Enable Navigation screen', 'gutenberg' ),
+ 'id' => 'gutenberg-navigation',
+ )
+ );
add_settings_field(
'gutenberg-block-directory',
__( 'Block Directory', 'gutenberg' ),
diff --git a/lib/global-styles.php b/lib/global-styles.php
index 71deabe3e2288f..6c98d272202976 100644
--- a/lib/global-styles.php
+++ b/lib/global-styles.php
@@ -266,8 +266,7 @@ function gutenberg_experimental_global_styles_is_site_editor() {
}
$screen = get_current_screen();
- return ! empty( $screen ) &&
- ( 'gutenberg_page_gutenberg-edit-site' === $screen->id );
+ return ! empty( $screen ) && gutenberg_is_edit_site_page( $screen->id );
}
/**
diff --git a/lib/load.php b/lib/load.php
index 5b641a13278d1e..1dca8b64972c56 100644
--- a/lib/load.php
+++ b/lib/load.php
@@ -39,6 +39,15 @@ function gutenberg_is_experiment_enabled( $name ) {
if ( ! class_exists( 'WP_REST_Block_Directory_Controller' ) ) {
require dirname( __FILE__ ) . '/class-wp-rest-block-directory-controller.php';
}
+ if ( ! class_exists( 'WP_REST_Menus_Controller' ) ) {
+ require_once dirname( __FILE__ ) . '/class-wp-rest-menus-controller.php';
+ }
+ if ( ! class_exists( 'WP_REST_Menu_Items_Controller' ) ) {
+ require_once dirname( __FILE__ ) . '/class-wp-rest-menu-items-controller.php';
+ }
+ if ( ! class_exists( 'WP_REST_Menu_Locations_Controller' ) ) {
+ require_once dirname( __FILE__ ) . '/class-wp-rest-menu-locations-controller.php';
+ }
/**
* End: Include for phase 2
*/
@@ -50,6 +59,14 @@ function gutenberg_is_experiment_enabled( $name ) {
require dirname( __FILE__ ) . '/class-wp-block-styles-registry.php';
}
+if ( ! class_exists( 'WP_Patterns_Registry' ) ) {
+ require dirname( __FILE__ ) . '/class-wp-patterns-registry.php';
+}
+
+if ( ! class_exists( 'WP_Block' ) ) {
+ require dirname( __FILE__ ) . '/class-wp-block.php';
+}
+
require dirname( __FILE__ ) . '/compat.php';
require dirname( __FILE__ ) . '/blocks.php';
@@ -61,6 +78,7 @@ function gutenberg_is_experiment_enabled( $name ) {
require dirname( __FILE__ ) . '/demo.php';
require dirname( __FILE__ ) . '/widgets.php';
require dirname( __FILE__ ) . '/widgets-page.php';
+require dirname( __FILE__ ) . '/navigation-page.php';
require dirname( __FILE__ ) . '/experiments-page.php';
require dirname( __FILE__ ) . '/customizer.php';
require dirname( __FILE__ ) . '/edit-site-page.php';
diff --git a/lib/navigation-page.php b/lib/navigation-page.php
new file mode 100644
index 00000000000000..74227fcfbd1cd9
--- /dev/null
+++ b/lib/navigation-page.php
@@ -0,0 +1,101 @@
+
+
+
+ __( 'Thumbnail', 'gutenberg' ),
+ 'medium' => __( 'Medium', 'gutenberg' ),
+ 'large' => __( 'Large', 'gutenberg' ),
+ 'full' => __( 'Full Size', 'gutenberg' ),
+ )
+ );
+
+ $available_image_sizes = array();
+ foreach ( $image_size_names as $image_size_slug => $image_size_name ) {
+ $available_image_sizes[] = array(
+ 'slug' => $image_size_slug,
+ 'name' => $image_size_name,
+ );
+ }
+
+ $settings = array(
+ 'disableCustomColors' => get_theme_support( 'disable-custom-colors' ),
+ 'disableCustomFontSizes' => get_theme_support( 'disable-custom-font-sizes' ),
+ 'imageSizes' => $available_image_sizes,
+ 'isRTL' => is_rtl(),
+ 'maxUploadFileSize' => $max_upload_size,
+ );
+
+ list( $color_palette, ) = (array) get_theme_support( 'editor-color-palette' );
+ list( $font_sizes, ) = (array) get_theme_support( 'editor-font-sizes' );
+
+ if ( false !== $color_palette ) {
+ $settings['colors'] = $color_palette;
+ }
+
+ if ( false !== $font_sizes ) {
+ $settings['fontSizes'] = $font_sizes;
+ }
+
+ wp_add_inline_script(
+ 'wp-edit-navigation',
+ sprintf(
+ 'wp.domReady( function() {
+ wp.editNavigation.initialize( "navigation-editor", %s );
+ } );',
+ wp_json_encode( gutenberg_experiments_editor_settings( $settings ) )
+ )
+ );
+
+ // Preload server-registered block schemas.
+ wp_add_inline_script(
+ 'wp-blocks',
+ 'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');'
+ );
+
+ wp_enqueue_script( 'wp-edit-navigation' );
+ wp_enqueue_style( 'wp-edit-navigation' );
+ wp_enqueue_style( 'wp-block-library' );
+ wp_enqueue_script( 'wp-format-library' );
+ wp_enqueue_style( 'wp-format-library' );
+}
+add_action( 'admin_enqueue_scripts', 'gutenberg_navigation_init' );
diff --git a/lib/patterns/hero-two-columns.json b/lib/patterns/hero-two-columns.json
new file mode 100644
index 00000000000000..eb1805c3dff0e3
--- /dev/null
+++ b/lib/patterns/hero-two-columns.json
@@ -0,0 +1,5 @@
+{
+ "__file": "wp_block",
+ "title": "Hero Two Columns",
+ "content": "\n\n
Enjoy a wide variety of
\n\n\n\n
Custom Designs
\n\n\n\n
\n
\n
Extend it with over 54,000 plugins to help your website meet your needs. Add an online store, galleries, mailing lists, forums, analytics, and much more. Hundreds of thousands of developers and site owners trust it worldwide.
\n
\n\n\n\n
\n
Hundreds of thousands of developers and site owners trust it worldwide. Extend it with over 54,000 plugins to help your website meet your needs. Add an online store, galleries, mailing lists, forums, analytics, and much more.
\n
\n
\n
\n"
+ }
diff --git a/lib/patterns/its-time.json b/lib/patterns/its-time.json
new file mode 100644
index 00000000000000..0e048a908ba568
--- /dev/null
+++ b/lib/patterns/its-time.json
@@ -0,0 +1,5 @@
+{
+ "__file": "wp_block",
+ "title": "It's time",
+ "content": "\n\n
\n
\n
NEW
\n\n\n\n
John Lenwood \"Jackie\" McLean was an American jazz alto saxophonist, composer, bandleader, and educator, and is one of the few musicians to be elected to the DownBeat Hall of Fame in the year of their death.
\n
\n\n\n\n
\n
space
\n\n\n\n
Derek Ansell's full-length biography of McLean, Sugar Free Saxophone (London: Northway Books, 2012), details the story of his career and provides a full analysis of his music on record.
\n
\n
\n\n\n\n
\n
\n"
+ }
diff --git a/lib/patterns/numbered-features.json b/lib/patterns/numbered-features.json
new file mode 100644
index 00000000000000..010a0f52e09ed4
--- /dev/null
+++ b/lib/patterns/numbered-features.json
@@ -0,0 +1,5 @@
+{
+ "__file": "wp_block",
+ "title": "Numbered Features",
+ "content": "\n\n
\n
\n
\n\n\n\n
\n
Custom Designs
\n\n\n\n
Extend it with over 54,000 plugins to help your website meet your needs.
\n\n\n\n
\n
\n
\n
\n\n\n\n
\n
\n
\n\n\n\n
\n
High Performance
\n\n\n\n
Add an online store, galleries, mailing lists, forums, analytics, and much more.
\n\n\n\n
\n
\n
\n
\n\n\n\n
\n
\n
\n\n\n\n
\n
Easy and Accessible
\n\n\n\n
Hundreds of thousands of developers and site owners trust it worldwide.
\n
\n
\n
\n
\n"
+ }
diff --git a/lib/patterns/text-two-columns.json b/lib/patterns/text-two-columns.json
index 1f6f33a865d51b..6dd4ff98351ee1 100644
--- a/lib/patterns/text-two-columns.json
+++ b/lib/patterns/text-two-columns.json
@@ -1,5 +1,5 @@
{
"__file": "wp_block",
"title": "Two Columns of Text",
- "content": "\n\n
\n
CHAPTER 1. Loomings
\n\n\n\n
Call me Ishmael. Some years ago—never mind how long precisely—having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world. It is a way I have of driving off the spleen and regulating the circulation.
\n
\n\n\n\n
\n
Whenever I find myself growing grim about the mouth; whenever it is a damp, drizzly November in my soul; whenever I find myself involuntarily pausing before coffin warehouses, and bringing up the rear of every funeral I meet; and especially whenever my hypos get such an upper hand of me, that it requires a strong moral principle to prevent me from deliberately stepping into the street, and methodically knocking people’s hats off—then, I account it high time tozz get to sea as soon as I can.
\n
\n
\n"
+ "content": "\n\n
\n
CHAPTER 1. Loomings
\n\n\n\n
Call me Ishmael. Some years ago—never mind how long precisely—having little or no money in my purse, and nothing particular to interest me on shore, I thought I would sail about a little and see the watery part of the world. It is a way I have of driving off the spleen and regulating the circulation.
\n
\n\n\n\n
\n
Whenever I find myself growing grim about the mouth; whenever it is a damp, drizzly November in my soul; whenever I find myself involuntarily pausing before coffin warehouses, and bringing up the rear of every funeral I meet; and especially whenever my hypos get such an upper hand of me, that it requires a strong moral principle to prevent me from deliberately stepping into the street, and methodically knocking people’s hats off—then, I account it high time to get to sea as soon as I can.
\n
\n
\n"
}
diff --git a/lib/patterns/two-images.json b/lib/patterns/two-images.json
new file mode 100644
index 00000000000000..d3303be5d5c6c1
--- /dev/null
+++ b/lib/patterns/two-images.json
@@ -0,0 +1,5 @@
+{
+ "__file": "wp_block",
+ "title": "Two images side by side",
+ "content": "\n \n"
+}
diff --git a/lib/rest-api.php b/lib/rest-api.php
index e0b6e7be592e7b..6ca1e10cd00a42 100644
--- a/lib/rest-api.php
+++ b/lib/rest-api.php
@@ -52,7 +52,41 @@ function gutenberg_filter_oembed_result( $response, $handler, $request ) {
}
add_filter( 'rest_request_after_callbacks', 'gutenberg_filter_oembed_result', 10, 3 );
+/**
+ * Add fields required for site editing to the /themes endpoint.
+ *
+ * @todo Remove once https://core.trac.wordpress.org/ticket/49906 is fixed.
+ * @see https://github.com/WordPress/wordpress-develop/pull/222
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param WP_Theme $theme Theme object used to create response.
+ * @param WP_REST_Request $request Request object.
+ */
+function gutenberg_filter_rest_prepare_theme( $response, $theme, $request ) {
+ $data = $response->get_data();
+ $field_mappings = array(
+ 'author' => 'Author',
+ 'author_name' => 'Author Name',
+ 'author_uri' => 'Author URI',
+ 'description' => 'Description',
+ 'name' => 'Name',
+ 'stylesheet' => 'Stylesheet',
+ 'template' => 'Template',
+ 'theme_uri' => 'Theme URI',
+ 'version' => 'Version',
+ );
+
+ foreach ( $field_mappings as $field => $theme_field ) {
+ $data[ $field ] = $theme[ $theme_field ];
+ }
+ // Using $theme->get_screenshot() with no args to get absolute URL.
+ $data['screenshot'] = $theme->get_screenshot();
+
+ $response->set_data( $data );
+ return $response;
+}
+add_filter( 'rest_prepare_theme', 'gutenberg_filter_rest_prepare_theme', 10, 3 );
/**
* Start: Include for phase 2
@@ -93,3 +127,122 @@ function gutenberg_register_rest_block_directory() {
$block_directory_controller->register_routes();
}
add_filter( 'rest_api_init', 'gutenberg_register_rest_block_directory' );
+
+/**
+ * Registers the menu locations area REST API routes.
+ */
+function gutenberg_register_rest_menu_location() {
+ $nav_menu_location = new WP_REST_Menu_Locations_Controller();
+ $nav_menu_location->register_routes();
+}
+add_action( 'rest_api_init', 'gutenberg_register_rest_menu_location' );
+/**
+ * Hook in to the nav menu item post type and enable a post type rest endpoint.
+ *
+ * @param array $args Current registered post type args.
+ * @param string $post_type Name of post type.
+ *
+ * @return array
+ */
+function wp_api_nav_menus_post_type_args( $args, $post_type ) {
+ if ( 'nav_menu_item' === $post_type ) {
+ $args['show_in_rest'] = true;
+ $args['rest_base'] = 'menu-items';
+ $args['rest_controller_class'] = 'WP_REST_Menu_Items_Controller';
+ }
+
+ return $args;
+}
+add_filter( 'register_post_type_args', 'wp_api_nav_menus_post_type_args', 10, 2 );
+
+/**
+ * Hook in to the nav_menu taxonomy and enable a taxonomy rest endpoint.
+ *
+ * @param array $args Current registered taxonomy args.
+ * @param string $taxonomy Name of taxonomy.
+ *
+ * @return array
+ */
+function wp_api_nav_menus_taxonomy_args( $args, $taxonomy ) {
+ if ( 'nav_menu' === $taxonomy ) {
+ $args['show_in_rest'] = true;
+ $args['rest_base'] = 'menus';
+ $args['rest_controller_class'] = 'WP_REST_Menus_Controller';
+ }
+
+ return $args;
+}
+add_filter( 'register_taxonomy_args', 'wp_api_nav_menus_taxonomy_args', 10, 2 );
+
+/**
+ * Shim for get_sample_permalink() to add support for auto-draft status.
+ *
+ * This function filters the return from get_sample_permalink() and essentially
+ * re-runs the same logic minus the filters, but pretends a status of auto-save
+ * is actually publish in order to return the future permalink format.
+ *
+ * This is a temporary fix until we can patch get_sample_permalink()
+ *
+ * @see https://core.trac.wordpress.org/ticket/46266
+ *
+ * @param array $permalink Array containing the sample permalink with placeholder for the post name, and the post name.
+ * @param int $id ID of the post.
+ * @param string $title Title of the post.
+ * @param string $name Slug of the post.
+ * @param object $post WP_Post object.
+ *
+ * @return array Array containing the sample permalink with placeholder for the post name, and the post name.
+ */
+function gutenberg_auto_draft_get_sample_permalink( $permalink, $id, $title, $name, $post ) {
+ if ( 'auto-draft' !== $post->post_status ) {
+ return $permalink;
+ }
+ $ptype = get_post_type_object( $post->post_type );
+
+ $original_status = $post->post_status;
+ $original_date = $post->post_date;
+ $original_name = $post->post_name;
+
+ // Hack: get_permalink() would return ugly permalink for drafts, so we will fake that our post is published.
+ $post->post_status = 'publish';
+ $post->post_name = sanitize_title( $post->post_name ? $post->post_name : $post->post_title, $post->ID );
+
+ // If the user wants to set a new name -- override the current one.
+ // Note: if empty name is supplied -- use the title instead, see #6072.
+ if ( ! is_null( $name ) ) {
+ $post->post_name = sanitize_title( $name ? $name : $title, $post->ID );
+ }
+
+ $post->post_name = wp_unique_post_slug( $post->post_name, $post->ID, $post->post_status, $post->post_type, $post->post_parent );
+
+ $post->filter = 'sample';
+
+ $permalink = get_permalink( $post, true );
+
+ // Replace custom post_type Token with generic pagename token for ease of use.
+ $permalink = str_replace( "%$post->post_type%", '%pagename%', $permalink );
+
+ // Handle page hierarchy.
+ if ( $ptype->hierarchical ) {
+ $uri = get_page_uri( $post );
+ if ( $uri ) {
+ $uri = untrailingslashit( $uri );
+ $uri = strrev( stristr( strrev( $uri ), '/' ) );
+ $uri = untrailingslashit( $uri );
+ }
+
+ if ( ! empty( $uri ) ) {
+ $uri .= '/';
+ }
+ $permalink = str_replace( '%pagename%', "{$uri}%pagename%", $permalink );
+ }
+
+ $permalink = array( $permalink, $post->post_name );
+ $post->post_status = $original_status;
+ $post->post_date = $original_date;
+ $post->post_name = $original_name;
+ unset( $post->filter );
+
+ return $permalink;
+}
+add_filter( 'get_sample_permalink', 'gutenberg_auto_draft_get_sample_permalink', 10, 5 );
diff --git a/lib/template-loader.php b/lib/template-loader.php
index 174a093b6f6a80..183480ce821561 100644
--- a/lib/template-loader.php
+++ b/lib/template-loader.php
@@ -155,11 +155,11 @@ function gutenberg_find_template( $template_file ) {
'post_name__in' => $slugs,
'orderby' => 'post_name__in',
'posts_per_page' => 1,
+ 'no_found_rows' => true,
)
);
- $template_posts = $template_query->get_posts();
- $current_template_post = array_shift( $template_posts );
+ $current_template_post = $template_query->have_posts() ? $template_query->next_post() : null;
// Build map of template slugs to their priority in the current hierarchy.
$slug_priorities = array_flip( $slugs );
@@ -304,12 +304,17 @@ function gutenberg_strip_php_suffix( $template_file ) {
* @return array Filtered editor settings.
*/
function gutenberg_template_loader_filter_block_editor_settings( $settings ) {
- if ( ! post_type_exists( 'wp_template' ) || ! post_type_exists( 'wp_template_part' ) ) {
+ global $post, $_wp_current_template_id;
+
+ if ( ! $post || ! post_type_exists( 'wp_template' ) || ! post_type_exists( 'wp_template_part' ) ) {
return $settings;
}
// Create template part auto-drafts for the edited post.
- foreach ( parse_blocks( get_post()->post_content ) as $block ) {
+ $post = isset( $_wp_current_template_id )
+ ? get_post( $_wp_current_template_id ) // It's a template.
+ : get_post(); // It's a post.
+ foreach ( parse_blocks( $post->post_content ) as $block ) {
create_auto_draft_for_template_part_block( $block );
}
diff --git a/lib/widgets.php b/lib/widgets.php
index d5f11f602bd3b9..ba8bc86eb1cfa4 100644
--- a/lib/widgets.php
+++ b/lib/widgets.php
@@ -21,7 +21,7 @@ function gutenberg_is_block_editor() {
(
$screen->is_block_editor() ||
'gutenberg_page_gutenberg-widgets' === $screen->id ||
- 'gutenberg_page_gutenberg-edit-site' === $screen->id
+ gutenberg_is_edit_site_page( $screen->id )
);
}
diff --git a/package-lock.json b/package-lock.json
index aa8dab35dbfc85..65e8dc1ce113c6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "gutenberg",
- "version": "7.6.0",
+ "version": "7.9.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -29,56 +29,16 @@
}
},
"@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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz",
+ "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==",
"dev": true,
"requires": {
- "browserslist": "^4.8.2",
+ "browserslist": "^4.9.1",
"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",
@@ -88,22 +48,23 @@
}
},
"@babel/core": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz",
- "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
+ "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.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",
+ "@babel/generator": "^7.9.0",
+ "@babel/helper-module-transforms": "^7.9.0",
+ "@babel/helpers": "^7.9.0",
+ "@babel/parser": "^7.9.0",
+ "@babel/template": "^7.8.6",
+ "@babel/traverse": "^7.9.0",
+ "@babel/types": "^7.9.0",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.1",
- "json5": "^2.1.0",
+ "json5": "^2.1.2",
"lodash": "^4.17.13",
"resolve": "^1.3.2",
"semver": "^5.4.1",
@@ -129,14 +90,20 @@
}
},
"json5": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz",
- "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+ "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
"dev": true,
"requires": {
- "minimist": "^1.2.0"
+ "minimist": "^1.2.5"
}
},
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -152,12 +119,12 @@
}
},
"@babel/generator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz",
- "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==",
+ "version": "7.9.4",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz",
+ "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3",
+ "@babel/types": "^7.9.0",
"jsesc": "^2.5.1",
"lodash": "^4.17.13",
"source-map": "^0.5.0"
@@ -183,77 +150,52 @@
}
},
"@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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz",
+ "integrity": "sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3",
- "esutils": "^2.0.0"
+ "@babel/helper-annotate-as-pure": "^7.8.3",
+ "@babel/types": "^7.9.0"
}
},
- "@babel/helper-call-delegate": {
- "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==",
+ "@babel/helper-builder-react-jsx-experimental": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz",
+ "integrity": "sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ==",
"dev": true,
"requires": {
- "@babel/helper-hoist-variables": "^7.8.3",
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
+ "@babel/helper-annotate-as-pure": "^7.8.3",
+ "@babel/helper-module-imports": "^7.8.3",
+ "@babel/types": "^7.9.0"
}
},
"@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==",
+ "version": "7.8.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz",
+ "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.8.1",
- "browserslist": "^4.8.2",
+ "@babel/compat-data": "^7.8.6",
+ "browserslist": "^4.9.1",
"invariant": "^2.2.4",
- "levenary": "^1.1.0",
+ "levenary": "^1.1.1",
"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==",
+ "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
},
- "node-releases": {
- "version": "1.1.47",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz",
- "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==",
+ "levenary": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz",
+ "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==",
"dev": true,
"requires": {
- "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
- }
+ "leven": "^3.1.0"
}
},
"semver": {
@@ -265,52 +207,28 @@
}
},
"@babel/helper-create-class-features-plugin": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz",
- "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==",
+ "version": "7.8.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz",
+ "integrity": "sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg==",
"dev": true,
"requires": {
"@babel/helper-function-name": "^7.8.3",
"@babel/helper-member-expression-to-functions": "^7.8.3",
"@babel/helper-optimise-call-expression": "^7.8.3",
"@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-replace-supers": "^7.8.3",
+ "@babel/helper-replace-supers": "^7.8.6",
"@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==",
+ "version": "7.8.8",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz",
+ "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==",
"dev": true,
"requires": {
+ "@babel/helper-annotate-as-pure": "^7.8.3",
"@babel/helper-regex": "^7.8.3",
- "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"
- }
- }
+ "regexpu-core": "^4.7.0"
}
},
"@babel/helper-define-map": {
@@ -381,16 +299,17 @@
}
},
"@babel/helper-module-transforms": {
- "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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz",
+ "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==",
"dev": true,
"requires": {
"@babel/helper-module-imports": "^7.8.3",
+ "@babel/helper-replace-supers": "^7.8.6",
"@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",
+ "@babel/template": "^7.8.6",
+ "@babel/types": "^7.9.0",
"lodash": "^4.17.13"
}
},
@@ -432,15 +351,15 @@
}
},
"@babel/helper-replace-supers": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz",
- "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==",
+ "version": "7.8.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
+ "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
"dev": true,
"requires": {
"@babel/helper-member-expression-to-functions": "^7.8.3",
"@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
+ "@babel/traverse": "^7.8.6",
+ "@babel/types": "^7.8.6"
}
},
"@babel/helper-simple-access": {
@@ -462,6 +381,11 @@
"@babel/types": "^7.8.3"
}
},
+ "@babel/helper-validator-identifier": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz",
+ "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw=="
+ },
"@babel/helper-wrap-function": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz",
@@ -475,30 +399,42 @@
}
},
"@babel/helpers": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.3.tgz",
- "integrity": "sha512-LmU3q9Pah/XyZU89QvBgGt+BCsTPoQa+73RxAQh8fb8qkDyIfeQnmgs+hvzhTCKTzqOyk7JTkS3MS1S8Mq5yrQ==",
+ "version": "7.9.2",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz",
+ "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==",
"dev": true,
"requires": {
"@babel/template": "^7.8.3",
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
+ "@babel/traverse": "^7.9.0",
+ "@babel/types": "^7.9.0"
}
},
"@babel/highlight": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
- "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
+ "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
"requires": {
+ "@babel/helper-validator-identifier": "^7.9.0",
"chalk": "^2.0.0",
- "esutils": "^2.0.2",
"js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
}
},
"@babel/parser": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz",
- "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==",
+ "version": "7.9.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
+ "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
"dev": true
},
"@babel/plugin-external-helpers": {
@@ -571,10 +507,20 @@
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
}
},
- "@babel/plugin-proposal-object-rest-spread": {
+ "@babel/plugin-proposal-numeric-separator": {
"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==",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz",
+ "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.8.3"
+ }
+ },
+ "@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz",
+ "integrity": "sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.3",
@@ -592,9 +538,9 @@
}
},
"@babel/plugin-proposal-optional-chaining": {
- "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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz",
+ "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.3",
@@ -602,12 +548,12 @@
}
},
"@babel/plugin-proposal-unicode-property-regex": {
- "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==",
+ "version": "7.8.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz",
+ "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==",
"dev": true,
"requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.8.3",
+ "@babel/helper-create-regexp-features-plugin": "^7.8.8",
"@babel/helper-plugin-utils": "^7.8.3"
}
},
@@ -620,6 +566,15 @@
"@babel/helper-plugin-utils": "^7.8.0"
}
},
+ "@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
"@babel/plugin-syntax-class-properties": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz",
@@ -674,6 +629,15 @@
"@babel/helper-plugin-utils": "^7.8.3"
}
},
+ "@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz",
+ "integrity": "sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ }
+ },
"@babel/plugin-syntax-nullish-coalescing-operator": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
@@ -683,6 +647,15 @@
"@babel/helper-plugin-utils": "^7.8.0"
}
},
+ "@babel/plugin-syntax-numeric-separator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz",
+ "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ }
+ },
"@babel/plugin-syntax-object-rest-spread": {
"version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
@@ -768,9 +741,9 @@
}
},
"@babel/plugin-transform-classes": {
- "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==",
+ "version": "7.9.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz",
+ "integrity": "sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==",
"dev": true,
"requires": {
"@babel/helper-annotate-as-pure": "^7.8.3",
@@ -778,7 +751,7 @@
"@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-replace-supers": "^7.8.6",
"@babel/helper-split-export-declaration": "^7.8.3",
"globals": "^11.1.0"
},
@@ -801,9 +774,9 @@
}
},
"@babel/plugin-transform-destructuring": {
- "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==",
+ "version": "7.8.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz",
+ "integrity": "sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.3"
@@ -839,9 +812,9 @@
}
},
"@babel/plugin-transform-flow-strip-types": {
- "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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz",
+ "integrity": "sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.3",
@@ -849,9 +822,9 @@
}
},
"@babel/plugin-transform-for-of": {
- "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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz",
+ "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.3"
@@ -886,47 +859,47 @@
}
},
"@babel/plugin-transform-modules-amd": {
- "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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz",
+ "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.8.3",
+ "@babel/helper-module-transforms": "^7.9.0",
"@babel/helper-plugin-utils": "^7.8.3",
"babel-plugin-dynamic-import-node": "^2.3.0"
}
},
"@babel/plugin-transform-modules-commonjs": {
- "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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz",
+ "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.8.3",
+ "@babel/helper-module-transforms": "^7.9.0",
"@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.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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz",
+ "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==",
"dev": true,
"requires": {
"@babel/helper-hoist-variables": "^7.8.3",
- "@babel/helper-module-transforms": "^7.8.3",
+ "@babel/helper-module-transforms": "^7.9.0",
"@babel/helper-plugin-utils": "^7.8.3",
"babel-plugin-dynamic-import-node": "^2.3.0"
}
},
"@babel/plugin-transform-modules-umd": {
- "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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz",
+ "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.8.3",
+ "@babel/helper-module-transforms": "^7.9.0",
"@babel/helper-plugin-utils": "^7.8.3"
}
},
@@ -968,12 +941,11 @@
}
},
"@babel/plugin-transform-parameters": {
- "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==",
+ "version": "7.9.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz",
+ "integrity": "sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==",
"dev": true,
"requires": {
- "@babel/helper-call-delegate": "^7.8.3",
"@babel/helper-get-function-arity": "^7.8.3",
"@babel/helper-plugin-utils": "^7.8.3"
}
@@ -988,41 +960,12 @@
}
},
"@babel/plugin-transform-react-constant-elements": {
- "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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz",
+ "integrity": "sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw==",
"dev": true,
"requires": {
- "@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": {
@@ -1035,47 +978,42 @@
}
},
"@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==",
+ "version": "7.9.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz",
+ "integrity": "sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==",
"dev": true,
"requires": {
- "@babel/helper-builder-react-jsx": "^7.8.3",
+ "@babel/helper-builder-react-jsx": "^7.9.0",
+ "@babel/helper-builder-react-jsx-experimental": "^7.9.0",
+ "@babel/helper-plugin-utils": "^7.8.3",
+ "@babel/plugin-syntax-jsx": "^7.8.3"
+ }
+ },
+ "@babel/plugin-transform-react-jsx-development": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz",
+ "integrity": "sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-builder-react-jsx-experimental": "^7.9.0",
"@babel/helper-plugin-utils": "^7.8.3",
"@babel/plugin-syntax-jsx": "^7.8.3"
}
},
"@babel/plugin-transform-react-jsx-self": {
- "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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz",
+ "integrity": "sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ==",
"dev": true,
"requires": {
"@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.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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz",
+ "integrity": "sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.3",
@@ -1083,23 +1021,12 @@
}
},
"@babel/plugin-transform-regenerator": {
- "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==",
+ "version": "7.8.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz",
+ "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==",
"dev": true,
"requires": {
- "regenerator-transform": "^0.14.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"
- }
- }
+ "regenerator-transform": "^0.14.2"
}
},
"@babel/plugin-transform-reserved-words": {
@@ -1112,9 +1039,9 @@
}
},
"@babel/plugin-transform-runtime": {
- "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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz",
+ "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==",
"dev": true,
"requires": {
"@babel/helper-module-imports": "^7.8.3",
@@ -1170,18 +1097,18 @@
}
},
"@babel/plugin-transform-typeof-symbol": {
- "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==",
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz",
+ "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.3"
}
},
"@babel/plugin-transform-typescript": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz",
- "integrity": "sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==",
+ "version": "7.9.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz",
+ "integrity": "sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w==",
"dev": true,
"requires": {
"@babel/helper-create-class-features-plugin": "^7.8.3",
@@ -1200,27 +1127,29 @@
}
},
"@babel/preset-env": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.3.tgz",
- "integrity": "sha512-Rs4RPL2KjSLSE2mWAx5/iCH+GC1ikKdxPrhnRS6PfFVaiZeom22VFKN4X8ZthyN61kAaR05tfXTbCvatl9WIQg==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz",
+ "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.8.0",
- "@babel/helper-compilation-targets": "^7.8.3",
+ "@babel/compat-data": "^7.9.0",
+ "@babel/helper-compilation-targets": "^7.8.7",
"@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-numeric-separator": "^7.8.3",
+ "@babel/plugin-proposal-object-rest-spread": "^7.9.0",
"@babel/plugin-proposal-optional-catch-binding": "^7.8.3",
- "@babel/plugin-proposal-optional-chaining": "^7.8.3",
+ "@babel/plugin-proposal-optional-chaining": "^7.9.0",
"@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-numeric-separator": "^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",
@@ -1229,97 +1158,55 @@
"@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-classes": "^7.9.0",
"@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-for-of": "^7.9.0",
"@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-modules-amd": "^7.9.0",
+ "@babel/plugin-transform-modules-commonjs": "^7.9.0",
+ "@babel/plugin-transform-modules-systemjs": "^7.9.0",
+ "@babel/plugin-transform-modules-umd": "^7.9.0",
"@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-parameters": "^7.8.7",
"@babel/plugin-transform-property-literals": "^7.8.3",
- "@babel/plugin-transform-regenerator": "^7.8.3",
+ "@babel/plugin-transform-regenerator": "^7.8.7",
"@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-typeof-symbol": "^7.8.4",
"@babel/plugin-transform-unicode-regex": "^7.8.3",
- "@babel/types": "^7.8.3",
- "browserslist": "^4.8.2",
+ "@babel/preset-modules": "^0.1.3",
+ "@babel/types": "^7.9.0",
+ "browserslist": "^4.9.1",
"core-js-compat": "^3.6.2",
"invariant": "^2.2.2",
- "levenary": "^1.1.0",
+ "levenary": "^1.1.1",
"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
- },
- "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": {
- "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
- }
- }
- },
- "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==",
+ "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
},
- "node-releases": {
- "version": "1.1.47",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz",
- "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==",
+ "levenary": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz",
+ "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==",
"dev": true,
"requires": {
- "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
- }
+ "leven": "^3.1.0"
}
},
"semver": {
@@ -1331,489 +1218,224 @@
}
},
"@babel/preset-flow": {
- "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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.9.0.tgz",
+ "integrity": "sha512-88uSmlshIrlmPkNkEcx3UpSZ6b8n0UGBq0/0ZMZCF/uxAW0XIAUuDHBhIOAh0pvweafH4RxOwi/H3rWhtqOYPA==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-transform-flow-strip-types": "^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-flow": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz",
- "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-flow-strip-types": {
- "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.3",
- "@babel/plugin-syntax-flow": "^7.8.3"
- }
- }
+ "@babel/plugin-transform-flow-strip-types": "^7.9.0"
+ }
+ },
+ "@babel/preset-modules": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz",
+ "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
}
},
"@babel/preset-react": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz",
- "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==",
+ "version": "7.9.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.9.4.tgz",
+ "integrity": "sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ==",
"dev": true,
"requires": {
"@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/plugin-transform-react-jsx": "^7.9.4",
+ "@babel/plugin-transform-react-jsx-development": "^7.9.0",
+ "@babel/plugin-transform-react-jsx-self": "^7.9.0",
+ "@babel/plugin-transform-react-jsx-source": "^7.9.0"
}
},
"@babel/preset-typescript": {
- "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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz",
+ "integrity": "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-transform-typescript": "^7.8.3"
+ "@babel/plugin-transform-typescript": "^7.9.0"
+ }
+ },
+ "@babel/register": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.9.0.tgz",
+ "integrity": "sha512-Tv8Zyi2J2VRR8g7pC5gTeIN8Ihultbmk0ocyNz8H2nEZbmhp1N6q0A1UGsQbDvGP/sNinQKUHf3SqXwqjtFv4Q==",
+ "dev": true,
+ "requires": {
+ "find-cache-dir": "^2.0.0",
+ "lodash": "^4.17.13",
+ "make-dir": "^2.1.0",
+ "pirates": "^4.0.0",
+ "source-map-support": "^0.5.16"
},
"dependencies": {
- "@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.8.3"
- }
- },
- "@babel/generator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.3.tgz",
- "integrity": "sha512-WjoPk8hRpDRqqzRpvaR8/gDUPkrnOOeuT2m8cNICJtZH6mwaCo3v0OKMI7Y6SM1pBtyijnLtAL0HDi41pf41ug==",
+ "find-cache-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3",
- "jsesc": "^2.5.1",
- "lodash": "^4.17.13",
- "source-map": "^0.5.0"
+ "commondir": "^1.0.1",
+ "make-dir": "^2.0.0",
+ "pkg-dir": "^3.0.0"
}
},
- "@babel/helper-create-class-features-plugin": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz",
- "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==",
+ "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": {
- "@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"
+ "locate-path": "^3.0.0"
}
},
- "@babel/helper-function-name": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
- "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
+ "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": {
- "@babel/helper-get-function-arity": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.8.3"
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
}
},
- "@babel/helper-get-function-arity": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
- "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
+ "make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
}
},
- "@babel/helper-member-expression-to-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
- "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
- "@babel/types": "^7.8.3"
+ "p-try": "^2.0.0"
}
},
- "@babel/helper-optimise-call-expression": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
- "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
+ "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": {
- "@babel/types": "^7.8.3"
+ "p-limit": "^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==",
+ "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
},
- "@babel/helper-replace-supers": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz",
- "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==",
- "dev": true,
- "requires": {
- "@babel/helper-member-expression-to-functions": "^7.8.3",
- "@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-split-export-declaration": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
- "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.8.3"
- }
+ "pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true
},
- "@babel/highlight": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
- "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
+ "pkg-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
"dev": true,
"requires": {
- "chalk": "^2.0.0",
- "esutils": "^2.0.2",
- "js-tokens": "^4.0.0"
+ "find-up": "^3.0.0"
}
},
- "@babel/parser": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.3.tgz",
- "integrity": "sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ==",
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
},
- "@babel/plugin-syntax-typescript": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz",
- "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==",
- "dev": true,
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
+ "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
},
- "@babel/plugin-transform-typescript": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.3.tgz",
- "integrity": "sha512-Ebj230AxcrKGZPKIp4g4TdQLrqX95TobLUWKd/CwG7X1XHUH1ZpkpFvXuXqWbtGRWb7uuEWNlrl681wsOArAdQ==",
+ "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": {
- "@babel/helper-create-class-features-plugin": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-typescript": "^7.8.3"
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
}
- },
- "@babel/template": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz",
- "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/parser": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/traverse": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz",
- "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.8.3",
- "@babel/helper-function-name": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/parser": "^7.8.3",
- "@babel/types": "^7.8.3",
- "debug": "^4.1.0",
- "globals": "^11.1.0",
- "lodash": "^4.17.13"
- }
- },
- "@babel/types": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz",
- "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2",
- "lodash": "^4.17.13",
- "to-fast-properties": "^2.0.0"
- }
- },
- "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/register": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.8.3.tgz",
- "integrity": "sha512-t7UqebaWwo9nXWClIPLPloa5pN33A2leVs8Hf0e9g9YwUP8/H9NeR7DJU+4CXo23QtjChQv5a3DjEtT83ih1rg==",
- "dev": true,
+ "@babel/runtime": {
+ "version": "7.9.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
+ "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
"requires": {
- "find-cache-dir": "^2.0.0",
- "lodash": "^4.17.13",
- "make-dir": "^2.1.0",
- "pirates": "^4.0.0",
- "source-map-support": "^0.5.16"
+ "regenerator-runtime": "^0.13.4"
},
"dependencies": {
- "find-cache-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
- "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
- "dev": true,
- "requires": {
- "commondir": "^1.0.1",
- "make-dir": "^2.0.0",
- "pkg-dir": "^3.0.0"
- }
- },
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "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": "2.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
- "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
- "dev": true,
- "requires": {
- "pify": "^4.0.1",
- "semver": "^5.6.0"
- }
- },
- "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": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- },
- "pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
- "dev": true
- },
- "pkg-dir": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
- "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
- "dev": true,
- "requires": {
- "find-up": "^3.0.0"
- }
- },
- "semver": {
- "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"
- }
+ "regenerator-runtime": {
+ "version": "0.13.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
+ "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
}
}
},
- "@babel/runtime": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz",
- "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==",
- "requires": {
- "regenerator-runtime": "^0.13.2"
- }
- },
"@babel/runtime-corejs3": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.8.3.tgz",
- "integrity": "sha512-lrIU4aVbmlM/wQPzhEvzvNJskKyYptuXb0fGC0lTQTupTOYtR2Vqbu6/jf8vTr4M8Wt1nIzxVrSvPI5qESa/xA==",
+ "version": "7.9.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz",
+ "integrity": "sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA==",
"dev": true,
"requires": {
"core-js-pure": "^3.0.0",
- "regenerator-runtime": "^0.13.2"
+ "regenerator-runtime": "^0.13.4"
+ },
+ "dependencies": {
+ "regenerator-runtime": {
+ "version": "0.13.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
+ "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==",
+ "dev": true
+ }
}
},
"@babel/template": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz",
- "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==",
+ "version": "7.8.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
+ "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.8.3",
- "@babel/parser": "^7.8.3",
- "@babel/types": "^7.8.3"
+ "@babel/parser": "^7.8.6",
+ "@babel/types": "^7.8.6"
}
},
"@babel/traverse": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.3.tgz",
- "integrity": "sha512-we+a2lti+eEImHmEXp7bM9cTxGzxPmBiVJlLVD+FuuQMeeO7RaDbutbgeheDkw+Xe3mCfJHnGOWLswT74m2IPg==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz",
+ "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.8.3",
+ "@babel/generator": "^7.9.0",
"@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",
+ "@babel/parser": "^7.9.0",
+ "@babel/types": "^7.9.0",
"debug": "^4.1.0",
"globals": "^11.1.0",
"lodash": "^4.17.13"
@@ -1843,11 +1465,11 @@
}
},
"@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==",
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz",
+ "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==",
"requires": {
- "esutils": "^2.0.2",
+ "@babel/helper-validator-identifier": "^7.9.0",
"lodash": "^4.17.13",
"to-fast-properties": "^2.0.0"
}
@@ -1858,6 +1480,12 @@
"integrity": "sha512-4Th98KlMHr5+JkxfcoDT//6vY8vM+iSPrLNpHhRyLx2CFYi8e2RfqPLdpbnpo0Q5lQC5hNB79yes07zb02fvCw==",
"dev": true
},
+ "@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true
+ },
"@cnakazawa/watch": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz",
@@ -1878,6 +1506,7 @@
"version": "10.0.19",
"resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.19.tgz",
"integrity": "sha512-BoiLlk4vEsGBg2dAqGSJu0vJl/PgVtCYLBFJaEO8RmQzPugXewQCXZJNXTDFaRlfCs0W+quesayav4fvaif5WQ==",
+ "dev": true,
"requires": {
"@emotion/sheet": "0.9.3",
"@emotion/stylis": "0.8.4",
@@ -1886,47 +1515,48 @@
}
},
"@emotion/core": {
- "version": "10.0.22",
- "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.22.tgz",
- "integrity": "sha512-7eoP6KQVUyOjAkE6y4fdlxbZRA4ILs7dqkkm6oZUJmihtHv0UBq98VgPirq9T8F9K2gKu0J/au/TpKryKMinaA==",
+ "version": "10.0.28",
+ "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.28.tgz",
+ "integrity": "sha512-pH8UueKYO5jgg0Iq+AmCLxBsvuGtvlmiDCOuv8fGNYn3cowFpLN98L8zO56U0H1PjDIyAlXymgL3Wu7u7v6hbA==",
"requires": {
"@babel/runtime": "^7.5.5",
- "@emotion/cache": "^10.0.17",
- "@emotion/css": "^10.0.22",
- "@emotion/serialize": "^0.11.12",
- "@emotion/sheet": "0.9.3",
- "@emotion/utils": "0.11.2"
+ "@emotion/cache": "^10.0.27",
+ "@emotion/css": "^10.0.27",
+ "@emotion/serialize": "^0.11.15",
+ "@emotion/sheet": "0.9.4",
+ "@emotion/utils": "0.11.3"
},
"dependencies": {
- "@babel/runtime": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.2.tgz",
- "integrity": "sha512-JONRbXbTXc9WQE2mAZd1p0Z3DZ/6vaQIkgYMSTP3KjRCyd7rCZCcfhCyX+YjwcKxcZ82UrxbRD358bpExNgrjw==",
+ "@emotion/cache": {
+ "version": "10.0.29",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz",
+ "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==",
"requires": {
- "regenerator-runtime": "^0.13.2"
+ "@emotion/sheet": "0.9.4",
+ "@emotion/stylis": "0.8.5",
+ "@emotion/utils": "0.11.3",
+ "@emotion/weak-memoize": "0.2.5"
}
},
- "@emotion/css": {
- "version": "10.0.22",
- "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.22.tgz",
- "integrity": "sha512-8phfa5mC/OadBTmGpMpwykIVH0gFCbUoO684LUkyixPq4F1Wwri7fK5Xlm8lURNBrd2TuvTbPUGxFsGxF9UacA==",
- "requires": {
- "@emotion/serialize": "^0.11.12",
- "@emotion/utils": "0.11.2",
- "babel-plugin-emotion": "^10.0.22"
- }
+ "@emotion/sheet": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz",
+ "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA=="
},
- "@emotion/serialize": {
- "version": "0.11.14",
- "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.14.tgz",
- "integrity": "sha512-6hTsySIuQTbDbv00AnUO6O6Xafdwo5GswRlMZ5hHqiFx+4pZ7uGWXUQFW46Kc2taGhP89uXMXn/lWQkdyTosPA==",
- "requires": {
- "@emotion/hash": "0.7.3",
- "@emotion/memoize": "0.7.3",
- "@emotion/unitless": "0.7.4",
- "@emotion/utils": "0.11.2",
- "csstype": "^2.5.7"
- }
+ "@emotion/stylis": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz",
+ "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ=="
+ },
+ "@emotion/utils": {
+ "version": "0.11.3",
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz",
+ "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw=="
+ },
+ "@emotion/weak-memoize": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz",
+ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA=="
}
}
},
@@ -2045,7 +1675,8 @@
"@emotion/sheet": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.3.tgz",
- "integrity": "sha512-c3Q6V7Df7jfwSq5AzQWbXHa5soeE4F5cbqi40xn0CzXxWW9/6Mxq48WJEtqfWzbZtW9odZdnRAkwCQwN12ob4A=="
+ "integrity": "sha512-c3Q6V7Df7jfwSq5AzQWbXHa5soeE4F5cbqi40xn0CzXxWW9/6Mxq48WJEtqfWzbZtW9odZdnRAkwCQwN12ob4A==",
+ "dev": true
},
"@emotion/styled": {
"version": "10.0.23",
@@ -2092,7 +1723,8 @@
"@emotion/stylis": {
"version": "0.8.4",
"resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.4.tgz",
- "integrity": "sha512-TLmkCVm8f8gH0oLv+HWKiu7e8xmBIaokhxcEKPh1m8pXiV/akCiq50FvYgOwY42rjejck8nsdQxZlXZ7pmyBUQ=="
+ "integrity": "sha512-TLmkCVm8f8gH0oLv+HWKiu7e8xmBIaokhxcEKPh1m8pXiV/akCiq50FvYgOwY42rjejck8nsdQxZlXZ7pmyBUQ==",
+ "dev": true
},
"@emotion/unitless": {
"version": "0.7.4",
@@ -2107,7 +1739,8 @@
"@emotion/weak-memoize": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.4.tgz",
- "integrity": "sha512-6PYY5DVdAY1ifaQW6XYTnOMihmBVT27elqSjEoodchsGjzYlEsTQMcEhSud99kVawatyTZRTiVkJ/c6lwbQ7nA=="
+ "integrity": "sha512-6PYY5DVdAY1ifaQW6XYTnOMihmBVT27elqSjEoodchsGjzYlEsTQMcEhSud99kVawatyTZRTiVkJ/c6lwbQ7nA==",
+ "dev": true
},
"@evocateur/libnpmaccess": {
"version": "3.1.2",
@@ -2538,17 +2171,109 @@
"integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==",
"dev": true
},
+ "@istanbuljs/load-nyc-config": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz",
+ "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.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
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
+ "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
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ }
+ }
+ },
+ "@istanbuljs/schema": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz",
+ "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==",
+ "dev": true
+ },
"@jest/console": {
- "version": "24.7.1",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz",
- "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==",
+ "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.3.0",
+ "@jest/source-map": "^24.9.0",
"chalk": "^2.0.1",
"slash": "^2.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"
+ }
+ },
"slash": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
@@ -2557,746 +2282,475 @@
}
}
},
- "@jest/core": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz",
- "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==",
+ "@jest/environment": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.3.0.tgz",
+ "integrity": "sha512-vgooqwJTHLLak4fE+TaCGeYP7Tz1Y3CKOsNxR1sE0V3nx3KRUHn3NUnt+wbcfd5yQWKZQKAfW6wqbuwQLrXo3g==",
"dev": true,
"requires": {
- "@jest/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",
- "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-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",
- "strip-ansi": "^5.0.0"
+ "@jest/fake-timers": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "jest-mock": "^25.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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.3.0.tgz",
+ "integrity": "sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0"
+ "@jest/types": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-mock": "^25.3.0",
+ "jest-util": "^25.3.0",
+ "lolex": "^5.0.0"
}
},
- "@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==",
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
- "callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
- "source-map": "^0.6.0"
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
}
},
- "@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==",
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
- "@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"
- }
- }
+ "fill-range": "^7.0.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==",
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
}
},
- "@types/yargs": {
- "version": "13.0.5",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.5.tgz",
- "integrity": "sha512-CF/+sxTO7FOwbIRL4wMv0ZYLCRfMid2HQpzDRyViH7kSpfoAFiMdGqKIxb1PxWfjtQXQhnQuD33lvRHNwr809Q==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "color-name": "~1.1.4"
}
},
- "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
- },
- "diff-sequences": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz",
- "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
- "expect": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz",
- "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==",
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"requires": {
- "@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
- }
+ "to-regex-range": "^5.0.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==",
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
- "jest-config": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz",
- "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==",
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "jest-message-util": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz",
+ "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==",
"dev": true,
"requires": {
- "@babel/core": "^7.1.0",
- "@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.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.9.0",
- "jest-util": "^24.9.0",
- "jest-validate": "^24.9.0",
- "micromatch": "^3.1.10",
- "pretty-format": "^24.9.0",
- "realpath-native": "^1.1.0"
+ "@babel/code-frame": "^7.0.0",
+ "@jest/types": "^25.3.0",
+ "@types/stack-utils": "^1.0.1",
+ "chalk": "^3.0.0",
+ "micromatch": "^4.0.2",
+ "slash": "^3.0.0",
+ "stack-utils": "^1.0.1"
}
},
- "jest-diff": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz",
- "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==",
+ "jest-mock": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.3.0.tgz",
+ "integrity": "sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ==",
"dev": true,
"requires": {
- "chalk": "^2.0.1",
- "diff-sequences": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "pretty-format": "^24.9.0"
+ "@jest/types": "^25.3.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==",
+ "jest-util": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz",
+ "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==",
"dev": true,
"requires": {
- "@jest/types": "^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/types": "^25.3.0",
+ "chalk": "^3.0.0",
+ "is-ci": "^2.0.0",
+ "make-dir": "^3.0.0"
}
},
- "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==",
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
"dev": true,
"requires": {
- "chalk": "^2.0.1",
- "jest-diff": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "pretty-format": "^24.9.0"
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
}
},
- "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==",
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
"dev": true,
"requires": {
- "@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"
+ "has-flag": "^4.0.0"
}
},
- "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==",
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0"
+ "is-number": "^7.0.0"
}
- },
- "jest-resolve": {
+ }
+ }
+ },
+ "@jest/fake-timers": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz",
+ "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^24.9.0",
+ "jest-message-util": "^24.9.0",
+ "jest-mock": "^24.9.0"
+ },
+ "dependencies": {
+ "@jest/types": {
"version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
- "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
+ "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
"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"
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^1.1.1",
+ "@types/yargs": "^13.0.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-snapshot": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz",
- "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==",
+ "@types/yargs": {
+ "version": "13.0.8",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz",
+ "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==",
"dev": true,
"requires": {
- "@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"
- },
- "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": {
- "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"
- }
- },
- "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
- },
- "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
- },
- "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
- },
- "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": "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"
+ "@types/yargs-parser": "*"
}
}
}
},
- "@jest/environment": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz",
- "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==",
+ "@jest/reporters": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.3.0.tgz",
+ "integrity": "sha512-1u0ZBygs0C9DhdYgLCrRfZfNKQa+9+J7Uo+Z9z0RWLHzgsxhoG32lrmMOtUw48yR6bLNELdvzormwUqSk4H4Vg==",
"dev": true,
"requires": {
- "@jest/fake-timers": "^24.9.0",
- "@jest/transform": "^24.9.0",
- "@jest/types": "^24.9.0",
- "jest-mock": "^24.9.0"
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^25.3.0",
+ "@jest/test-result": "^25.3.0",
+ "@jest/transform": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^4.0.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.0.2",
+ "jest-haste-map": "^25.3.0",
+ "jest-resolve": "^25.3.0",
+ "jest-util": "^25.3.0",
+ "jest-worker": "^25.2.6",
+ "node-notifier": "^6.0.0",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.0",
+ "string-length": "^3.1.0",
+ "terminal-link": "^2.0.0",
+ "v8-to-istanbul": "^4.0.1"
},
"dependencies": {
"@jest/console": {
- "version": "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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz",
+ "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0"
+ "@jest/source-map": "^25.2.6",
+ "chalk": "^3.0.0",
+ "jest-util": "^25.3.0",
+ "slash": "^3.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==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz",
+ "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==",
"dev": true,
"requires": {
"callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
+ "graceful-fs": "^4.2.3",
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz",
+ "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==",
"dev": true,
"requires": {
+ "@jest/console": "^25.3.0",
+ "@jest/types": "^25.3.0",
"@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "collect-v8-coverage": "^1.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==",
+ "@jest/transform": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.3.0.tgz",
+ "integrity": "sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "@babel/core": "^7.1.0",
+ "@jest/types": "^25.3.0",
+ "babel-plugin-istanbul": "^6.0.0",
+ "chalk": "^3.0.0",
+ "convert-source-map": "^1.4.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "graceful-fs": "^4.2.3",
+ "jest-haste-map": "^25.3.0",
+ "jest-regex-util": "^25.2.6",
+ "jest-util": "^25.3.0",
+ "micromatch": "^4.0.2",
+ "pirates": "^4.0.1",
+ "realpath-native": "^2.0.0",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.1",
+ "write-file-atomic": "^3.0.0"
}
},
- "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==",
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
- "@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"
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.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==",
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0"
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.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
- }
- }
- },
- "@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==",
- "dev": true,
- "requires": {
- "@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",
- "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.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==",
+ "babel-plugin-istanbul": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
+ "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==",
"dev": true,
"requires": {
- "@jest/source-map": "^24.9.0",
- "chalk": "^2.0.1",
- "slash": "^2.0.0"
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^4.0.0",
+ "test-exclude": "^6.0.0"
}
},
- "@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==",
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0"
+ "fill-range": "^7.0.1"
}
},
- "@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==",
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"dev": true,
"requires": {
- "callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
- "source-map": "^0.6.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "@jest/console": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/istanbul-lib-coverage": "^2.0.0"
+ "color-name": "~1.1.4"
}
},
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "to-regex-range": "^5.0.1"
}
},
- "@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==",
+ "fsevents": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
+ "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
"dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
+ "optional": true
},
"graceful-fs": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
- "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
+ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "is-wsl": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz",
+ "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==",
+ "dev": true,
+ "optional": 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==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
+ "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
"dev": true,
"requires": {
- "handlebars": "^4.1.2"
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
}
},
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz",
+ "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "anymatch": "^2.0.0",
+ "@jest/types": "^25.3.0",
+ "anymatch": "^3.0.3",
"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",
+ "fsevents": "^2.1.2",
+ "graceful-fs": "^4.2.3",
+ "jest-serializer": "^25.2.6",
+ "jest-util": "^25.3.0",
+ "jest-worker": "^25.2.6",
+ "micromatch": "^4.0.2",
"sane": "^4.0.3",
- "walker": "^1.0.7"
- },
- "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"
+ "walker": "^1.0.7",
+ "which": "^2.0.2"
}
},
- "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": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz",
+ "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==",
+ "dev": true
},
"jest-resolve": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
- "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz",
+ "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
+ "@jest/types": "^25.3.0",
"browser-resolve": "^1.11.3",
- "chalk": "^2.0.1",
+ "chalk": "^3.0.0",
"jest-pnp-resolver": "^1.2.1",
- "realpath-native": "^1.1.0"
+ "realpath-native": "^2.0.0",
+ "resolve": "^1.15.1"
}
},
"jest-serializer": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz",
- "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz",
+ "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==",
"dev": true
},
"jest-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz",
- "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz",
+ "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==",
"dev": true,
"requires": {
- "@jest/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",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
"is-ci": "^2.0.0",
- "mkdirp": "^0.5.1",
- "slash": "^2.0.0",
- "source-map": "^0.6.0"
+ "make-dir": "^3.0.0"
+ }
+ },
+ "jest-worker": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz",
+ "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==",
+ "dev": true,
+ "requires": {
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
}
},
"merge-stream": {
@@ -3305,29 +2759,80 @@
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ }
+ },
"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==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz",
+ "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==",
"dev": true,
+ "optional": true,
"requires": {
"growly": "^1.3.0",
- "is-wsl": "^1.1.0",
- "semver": "^5.5.0",
+ "is-wsl": "^2.1.1",
+ "semver": "^6.3.0",
"shellwords": "^0.1.1",
- "which": "^1.3.0"
+ "which": "^1.3.1"
+ },
+ "dependencies": {
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
}
},
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true
},
- "slash": {
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "realpath-native": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz",
+ "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "optional": true
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
"source-map": {
@@ -3337,30 +2842,77 @@
"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==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
"dev": true,
"requires": {
- "has-flag": "^3.0.0"
+ "has-flag": "^4.0.0"
+ }
+ },
+ "test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "requires": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "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"
}
},
"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==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
"requires": {
- "graceful-fs": "^4.1.11",
"imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.2"
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
}
}
}
},
"@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==",
+ "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",
@@ -3369,9 +2921,9 @@
},
"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==",
+ "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
},
"source-map": {
@@ -3383,177 +2935,219 @@
}
},
"@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==",
+ "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.7.0",
+ "@jest/console": "^24.9.0",
+ "@jest/types": "^24.9.0",
"@types/istanbul-lib-coverage": "^2.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.8",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz",
+ "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ }
}
},
"@jest/test-sequencer": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz",
- "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.3.0.tgz",
+ "integrity": "sha512-Xvns3xbji7JCvVcDGvqJ/pf4IpmohPODumoPEZJ0/VgC5gI4XaNVIBET2Dq5Czu6Gk3xFcmhtthh/MBOTljdNg==",
"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/test-result": "^25.3.0",
+ "jest-haste-map": "^25.3.0",
+ "jest-runner": "^25.3.0",
+ "jest-runtime": "^25.3.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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz",
+ "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0"
+ "@jest/source-map": "^25.2.6",
+ "chalk": "^3.0.0",
+ "jest-util": "^25.3.0",
+ "slash": "^3.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==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz",
+ "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==",
"dev": true,
"requires": {
"callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
+ "graceful-fs": "^4.2.3",
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz",
+ "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==",
"dev": true,
"requires": {
- "@jest/console": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/istanbul-lib-coverage": "^2.0.0"
+ "@jest/console": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.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==",
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
}
},
- "@types/yargs": {
- "version": "13.0.4",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz",
- "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==",
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
}
},
- "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==",
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
- "@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"
+ "fill-range": "^7.0.1"
}
},
- "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==",
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"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"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
}
},
- "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==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "fsevents": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
+ "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
+ "dev": true,
+ "optional": true
+ },
+ "graceful-fs": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "jest-haste-map": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz",
+ "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0"
+ "@jest/types": "^25.3.0",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "fsevents": "^2.1.2",
+ "graceful-fs": "^4.2.3",
+ "jest-serializer": "^25.2.6",
+ "jest-util": "^25.3.0",
+ "jest-worker": "^25.2.6",
+ "micromatch": "^4.0.2",
+ "sane": "^4.0.3",
+ "walker": "^1.0.7",
+ "which": "^2.0.2"
}
},
"jest-serializer": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz",
- "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz",
+ "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==",
"dev": true
},
"jest-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz",
- "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz",
+ "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==",
"dev": true,
"requires": {
- "@jest/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",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
"is-ci": "^2.0.0",
- "mkdirp": "^0.5.1",
- "slash": "^2.0.0",
- "source-map": "^0.6.0"
+ "make-dir": "^3.0.0"
}
},
"jest-worker": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz",
- "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz",
+ "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==",
"dev": true,
"requires": {
"merge-stream": "^2.0.0",
- "supports-color": "^6.1.0"
+ "supports-color": "^7.0.0"
}
},
"merge-stream": {
@@ -3562,10 +3156,26 @@
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
"slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
"source-map": {
@@ -3575,12 +3185,30 @@
"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==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
"dev": true,
"requires": {
- "has-flag": "^3.0.0"
+ "has-flag": "^4.0.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "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"
}
}
}
@@ -3609,50 +3237,6 @@
"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/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",
@@ -3665,111 +3249,29 @@
}
},
"@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.8",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz",
+ "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==",
"dev": true,
"requires": {
"@types/yargs-parser": "*"
}
},
- "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==",
+ "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": {
- "merge-stream": "^2.0.0",
- "supports-color": "^6.1.0"
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.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==",
+ "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
},
"slash": {
@@ -3784,15 +3286,6 @@
"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",
@@ -3807,13 +3300,67 @@
}
},
"@jest/types": {
- "version": "24.7.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.7.0.tgz",
- "integrity": "sha512-ipJUa2rFWiKoBqMKP63Myb6h9+iT3FHRTF2M8OR6irxWzItisa8i4dcSg14IbvmXUnBlHBlUQPYUHWyX3UPpYA==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.3.0.tgz",
+ "integrity": "sha512-UkaDNewdqXAmCDbN2GlUM6amDKS78eCqiw/UmF5nE0mmLTd6moJkiZJML/X52Ke3LH7Swhw883IRXq8o9nWjVw==",
"dev": true,
"requires": {
"@types/istanbul-lib-coverage": "^2.0.0",
- "@types/yargs": "^12.0.9"
+ "@types/istanbul-reports": "^1.1.1",
+ "@types/yargs": "^15.0.0",
+ "chalk": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"@lerna/add": {
@@ -3934,6 +3481,17 @@
"strong-log-transformer": "^2.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"
+ }
+ },
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -4216,6 +3774,19 @@
"chalk": "^2.3.1",
"figgy-pudding": "^3.5.1",
"npmlog": "^4.1.2"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
}
},
"@lerna/collect-updates": {
@@ -4982,6 +4553,19 @@
"@lerna/query-graph": "3.18.0",
"chalk": "^2.3.1",
"columnify": "^1.5.4"
+ },
+ "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"
+ }
+ }
}
},
"@lerna/log-packed": {
@@ -5532,6 +5116,19 @@
"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"
+ }
+ }
}
},
"strip-ansi": {
@@ -5673,6 +5270,31 @@
"npmlog": "^4.1.2",
"path-exists": "^3.0.0",
"rimraf": "^2.6.2"
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ }
}
},
"@lerna/run": {
@@ -5848,6 +5470,17 @@
"write-json-file": "^3.2.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"
+ }
+ },
"graceful-fs": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz",
@@ -6083,6 +5716,19 @@
"chalk": "^2.0.0",
"esutils": "^2.0.2",
"js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
}
},
"@babel/parser": {
@@ -6537,14 +6183,45 @@
}
},
"@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==",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.5.0.tgz",
+ "integrity": "sha512-KEnLwOfdXzxPNL34fj508bhi9Z9cStyN7qY1kOfVahmqtAfrWw6Oq3P4R+dtsg0lYtZdWBpUrS/Ixmd5YILSww==",
"dev": true,
"requires": {
"@types/node": ">= 8"
}
},
+ "@octokit/webhooks": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-7.1.0.tgz",
+ "integrity": "sha512-kHyYkJkqY/wiP/hp0IT9FhkY5PhnV01co16V2YMRP/Zgnk3Vsy3U5iLAaP6U/0eRIlz5T4LSvkrcfNlfSb3cVQ==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.0.0"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "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
+ }
+ }
+ },
+ "@popperjs/core": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.1.1.tgz",
+ "integrity": "sha512-sLqWxCzC5/QHLhziXSCAksBxHfOnQlhPRVgPK0egEw+ktWvG75T2k+aYWVjVh9+WKeT3tlG3ZNbZQvZLmfuOIw=="
+ },
"@reach/router": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@reach/router/-/router-1.2.1.tgz",
@@ -6582,6 +6259,17 @@
"xmldoc": "^1.1.2"
},
"dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -6653,6 +6341,19 @@
"chalk": "^2.4.2",
"js-yaml": "^3.13.1",
"xcode": "^2.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"
+ }
+ }
}
},
"@react-native-community/cli-tools": {
@@ -6667,6 +6368,17 @@
"node-fetch": "^2.5.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"
+ }
+ },
"node-fetch": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
@@ -6690,6 +6402,21 @@
"any-observable": "^0.3.0"
}
},
+ "@sindresorhus/is": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.0.tgz",
+ "integrity": "sha512-lXKXfypKo644k4Da4yXkPCrwcvn6SlUW2X2zFbuflKHNjf0w9htru01bo26uMhleMXsDmnZ12eJLdrAZa9MANg==",
+ "dev": true
+ },
+ "@sinonjs/commons": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz",
+ "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ },
"@storybook/addon-a11y": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-5.3.2.tgz",
@@ -6863,182 +6590,6 @@
}
}
},
- "@storybook/addon-storyshots": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/@storybook/addon-storyshots/-/addon-storyshots-5.3.2.tgz",
- "integrity": "sha512-83imS+T5UVthV246FCD468lYWJjqDXPjAafDegJ5a2BDFkQvsNpIYU3E4qpLM9c6I8tVPAf/o7KMwkXC2ciXqA==",
- "dev": true,
- "requires": {
- "@jest/transform": "^24.9.0",
- "@storybook/addons": "5.3.2",
- "@storybook/client-api": "5.3.2",
- "@storybook/core": "5.3.2",
- "@types/glob": "^7.1.1",
- "@types/jest": "^24.0.16",
- "@types/jest-specific-snapshot": "^0.5.3",
- "babel-plugin-require-context-hook": "^1.0.0",
- "core-js": "^3.0.1",
- "glob": "^7.1.3",
- "global": "^4.3.2",
- "jest-specific-snapshot": "^2.0.0",
- "read-pkg-up": "^7.0.0",
- "regenerator-runtime": "^0.13.3",
- "ts-dedent": "^1.1.0"
- },
- "dependencies": {
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "p-limit": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
- "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- },
- "parse-json": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
- "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1",
- "lines-and-columns": "^1.1.6"
- }
- },
- "path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
- "dev": true
- },
- "read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
- "dev": true,
- "requires": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "dependencies": {
- "type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
- "dev": true
- }
- }
- },
- "read-pkg-up": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
- "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
- "dev": true,
- "requires": {
- "find-up": "^4.1.0",
- "read-pkg": "^5.2.0",
- "type-fest": "^0.8.1"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.3",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
- "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
- "dev": true
- },
- "resolve": {
- "version": "1.15.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"
- }
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- },
- "type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true
- }
- }
- },
"@storybook/addon-storysource": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/@storybook/addon-storysource/-/addon-storysource-5.3.2.tgz",
@@ -8860,11 +8411,421 @@
"webpack": "^4.33.0"
},
"dependencies": {
+ "@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz",
+ "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==",
+ "dev": true
+ },
+ "@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz",
+ "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==",
+ "dev": true
+ },
+ "@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz",
+ "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==",
+ "dev": true
+ },
+ "@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz",
+ "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==",
+ "dev": true
+ },
+ "@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz",
+ "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==",
+ "dev": true
+ },
+ "@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz",
+ "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==",
+ "dev": true
+ },
+ "@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz",
+ "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==",
+ "dev": true
+ },
+ "@svgr/babel-plugin-transform-svg-component": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz",
+ "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==",
+ "dev": true
+ },
+ "@svgr/babel-preset": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz",
+ "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==",
+ "dev": true,
+ "requires": {
+ "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0",
+ "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3",
+ "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0",
+ "@svgr/babel-plugin-transform-svg-component": "^4.2.0"
+ }
+ },
+ "@svgr/core": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz",
+ "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==",
+ "dev": true,
+ "requires": {
+ "@svgr/plugin-jsx": "^4.3.3",
+ "camelcase": "^5.3.1",
+ "cosmiconfig": "^5.2.1"
+ }
+ },
+ "@svgr/hast-util-to-babel-ast": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz",
+ "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.4.4"
+ }
+ },
+ "@svgr/plugin-jsx": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz",
+ "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.4.5",
+ "@svgr/babel-preset": "^4.3.3",
+ "@svgr/hast-util-to-babel-ast": "^4.3.2",
+ "svg-parser": "^2.0.0"
+ }
+ },
+ "@svgr/plugin-svgo": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz",
+ "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==",
+ "dev": true,
+ "requires": {
+ "cosmiconfig": "^5.2.1",
+ "merge-deep": "^3.0.2",
+ "svgo": "^1.2.2"
+ }
+ },
+ "@svgr/webpack": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz",
+ "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.4.5",
+ "@babel/plugin-transform-react-constant-elements": "^7.0.0",
+ "@babel/preset-env": "^7.4.5",
+ "@babel/preset-react": "^7.0.0",
+ "@svgr/core": "^4.3.3",
+ "@svgr/plugin-jsx": "^4.3.3",
+ "@svgr/plugin-svgo": "^4.3.1",
+ "loader-utils": "^1.2.3"
+ }
+ },
+ "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
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "cosmiconfig": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+ "dev": true,
+ "requires": {
+ "import-fresh": "^2.0.0",
+ "is-directory": "^0.3.1",
+ "js-yaml": "^3.13.1",
+ "parse-json": "^4.0.0"
+ }
+ },
+ "css-select": {
+ "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": "^3.2.1",
+ "domutils": "^1.7.0",
+ "nth-check": "^1.0.2"
+ }
+ },
+ "css-tree": {
+ "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.6.1"
+ }
+ },
+ "css-what": {
+ "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",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true
+ },
+ "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",
+ "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
+ "dev": true,
+ "requires": {
+ "caller-path": "^2.0.0",
+ "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"
+ }
+ },
+ "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.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
+ "mdn-data": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
+ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+ "dev": true
+ },
+ "nth-check": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "dev": true,
+ "requires": {
+ "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.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.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ },
"regenerator-runtime": {
"version": "0.13.3",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
"integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
"dev": true
+ },
+ "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.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.37",
+ "csso": "^4.0.2",
+ "js-yaml": "^3.13.1",
+ "mkdirp": "~0.5.1",
+ "object.values": "^1.1.0",
+ "sax": "~1.2.4",
+ "stable": "^0.1.8",
+ "unquote": "~1.1.1",
+ "util.promisify": "~1.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"
+ }
+ }
+ }
}
}
},
@@ -9030,78 +8991,78 @@
}
},
"@svgr/babel-plugin-add-jsx-attribute": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz",
- "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.0.1.tgz",
+ "integrity": "sha512-av76JbSudaN2CUOGuKQp5BVqLFidtojg4ApRTg1PBOVsskXK2ORwKnBYhIu0JLA6ynmuNDprlHNCD6IwLiYidw==",
"dev": true
},
"@svgr/babel-plugin-remove-jsx-attribute": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz",
- "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.0.1.tgz",
+ "integrity": "sha512-oXyByaDQEK4Ut/eC75698MDKnaadbWmp/LS2w22cZAaoObCkkiwYYgZTZ+bvb3moo//AxvKkBtNrlz6+xBb9ZQ==",
"dev": true
},
"@svgr/babel-plugin-remove-jsx-empty-expression": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz",
- "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
+ "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==",
"dev": true
},
"@svgr/babel-plugin-replace-jsx-attribute-value": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz",
- "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
+ "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==",
"dev": true
},
"@svgr/babel-plugin-svg-dynamic-title": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz",
- "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.0.1.tgz",
+ "integrity": "sha512-IbFiDBvq5WpANPndjEom1Y9k1pHCNfJs87jCN1Lt8NEA7yrNVPSoAjBVmmfi0aVBERfp8IT/lgjn2a/S85lXGg==",
"dev": true
},
"@svgr/babel-plugin-svg-em-dimensions": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz",
- "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.0.1.tgz",
+ "integrity": "sha512-7kL9LtqCm1ca+zAbBsrD4ME3EQeVcRxkdrf2GsbKPgkzWJ+399vS4VqCP462+WvFRbG13jSwpNCrvhekdyvXsA==",
"dev": true
},
"@svgr/babel-plugin-transform-react-native-svg": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz",
- "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.0.1.tgz",
+ "integrity": "sha512-ITG1jJ0zHQ4yft6ISQqlMW4fHIzsrSB/FmrMxAcJtkTjh9M2/9M8wfKxQya9NnTfZ5WMSlQjXMQNZmGQsuxRrw==",
"dev": true
},
"@svgr/babel-plugin-transform-svg-component": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz",
- "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.2.0.tgz",
+ "integrity": "sha512-t4dq0cNr7c8cuUu1Cwehai/0iXO3dV5876r2QRaLdgQF3C6XOK2vdTvNOwcJ3uRa92revSC3kGL8v8WgJrecRg==",
"dev": true
},
"@svgr/babel-preset": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz",
- "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.2.0.tgz",
+ "integrity": "sha512-sr7486h+SddMU1VgFrajXx/Ws0a1QPzX4wUBM1LgG2PHeZpnm+fQs2MXQNdnfoXRwo7C5mH2I4QDiRVR/49BEg==",
"dev": true,
"requires": {
- "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0",
- "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0",
- "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0",
- "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0",
- "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3",
- "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0",
- "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0",
- "@svgr/babel-plugin-transform-svg-component": "^4.2.0"
+ "@svgr/babel-plugin-add-jsx-attribute": "^5.0.1",
+ "@svgr/babel-plugin-remove-jsx-attribute": "^5.0.1",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
+ "@svgr/babel-plugin-svg-dynamic-title": "^5.0.1",
+ "@svgr/babel-plugin-svg-em-dimensions": "^5.0.1",
+ "@svgr/babel-plugin-transform-react-native-svg": "^5.0.1",
+ "@svgr/babel-plugin-transform-svg-component": "^5.2.0"
}
},
"@svgr/core": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz",
- "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.2.0.tgz",
+ "integrity": "sha512-vuODnJ0owj/oFi2bzskuSEk6TGuYoMV9hmvBhGuE1QktzMAAjOr0LnvUN5u2eGB6ilGdI7yqUKrZtQ0Tw44mrA==",
"dev": true,
"requires": {
- "@svgr/plugin-jsx": "^4.3.3",
+ "@svgr/plugin-jsx": "^5.2.0",
"camelcase": "^5.3.1",
- "cosmiconfig": "^5.2.1"
+ "cosmiconfig": "^6.0.0"
},
"dependencies": {
"camelcase": {
@@ -9111,81 +9072,81 @@
"dev": true
},
"cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
- "dev": true,
- "requires": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "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==",
"dev": true,
"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==",
"dev": true,
"requires": {
+ "@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
+ "json-parse-better-errors": "^1.0.1",
+ "lines-and-columns": "^1.1.6"
}
+ },
+ "path-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
}
}
},
"@svgr/hast-util-to-babel-ast": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz",
- "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.0.1.tgz",
+ "integrity": "sha512-G7UHNPNhLyDK5p6RJvSh4TRpHszTxG8jPp5lAxC6Ez6O6rj1plEAjrCDdYj50mvilUuT9IKjqn87F8+agpKaSw==",
"dev": true,
"requires": {
"@babel/types": "^7.4.4"
}
},
"@svgr/plugin-jsx": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz",
- "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.2.0.tgz",
+ "integrity": "sha512-z1HWitE5sCNgaXqBGrmCnnnvR/BRTq9B/lsgZ+T8OWABzZHhezqjjDUvkyyyBb3Y+0xExWg5aTh2jxqk7GR9tg==",
"dev": true,
"requires": {
- "@babel/core": "^7.4.5",
- "@svgr/babel-preset": "^4.3.3",
- "@svgr/hast-util-to-babel-ast": "^4.3.2",
- "svg-parser": "^2.0.0"
+ "@babel/core": "^7.7.5",
+ "@svgr/babel-preset": "^5.2.0",
+ "@svgr/hast-util-to-babel-ast": "^5.0.1",
+ "svg-parser": "^2.0.2"
}
},
"@svgr/plugin-svgo": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz",
- "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.2.0.tgz",
+ "integrity": "sha512-cyqWx026uO3heGG/55j5zfJLtS5sl0dWYawN1JotOqpJDyyR7rraTsnydpwwsOoz0YpESjVjAkXOAfd41lBY9Q==",
"dev": true,
"requires": {
- "cosmiconfig": "^5.2.1",
+ "cosmiconfig": "^6.0.0",
"merge-deep": "^3.0.2",
"svgo": "^1.2.2"
},
"dependencies": {
"cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
"dev": true,
"requires": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
}
},
"css-select": {
@@ -9288,16 +9249,6 @@
"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",
- "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
- "dev": true,
- "requires": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
- }
- },
"is-callable": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
@@ -9356,15 +9307,23 @@
}
},
"parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
+ "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
"dev": true,
"requires": {
+ "@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
+ "json-parse-better-errors": "^1.0.1",
+ "lines-and-columns": "^1.1.6"
}
},
+ "path-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
+ },
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -9410,23 +9369,36 @@
"stable": "^0.1.8",
"unquote": "~1.1.1",
"util.promisify": "~1.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"
+ }
+ }
}
}
}
},
"@svgr/webpack": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz",
- "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.2.0.tgz",
+ "integrity": "sha512-y9tMjTtqrvC998aCOgsEP8pb+bdg2RR1v8i+sjT31m4Xb8HGd905K7/GdSwEMM2nlTFbxSUQPZRRvfaJwAvghA==",
"dev": true,
"requires": {
"@babel/core": "^7.4.5",
"@babel/plugin-transform-react-constant-elements": "^7.0.0",
"@babel/preset-env": "^7.4.5",
"@babel/preset-react": "^7.0.0",
- "@svgr/core": "^4.3.3",
- "@svgr/plugin-jsx": "^4.3.3",
- "@svgr/plugin-svgo": "^4.3.1",
+ "@svgr/core": "^5.2.0",
+ "@svgr/plugin-jsx": "^5.2.0",
+ "@svgr/plugin-svgo": "^5.2.0",
"loader-utils": "^1.2.3"
},
"dependencies": {
@@ -9436,6 +9408,12 @@
"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
"dev": true
},
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true
+ },
"json5": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
@@ -9446,101 +9424,245 @@
}
},
"loader-utils": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
- "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
- "emojis-list": "^2.0.0",
+ "emojis-list": "^3.0.0",
"json5": "^1.0.1"
}
}
}
},
+ "@szmarczak/http-timer": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz",
+ "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==",
+ "dev": true,
+ "requires": {
+ "defer-to-connect": "^2.0.0"
+ }
+ },
"@tannin/compile": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.0.3.tgz",
- "integrity": "sha512-OkPHvaM/hIHdSco3+ZO1hzkOtfEddn5a0veWft2aDLvKnbdj9VusiLKNdEE9by3hCZIIcb9aWF+iBorhfrQOfw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz",
+ "integrity": "sha512-n8m9eNDfoNZoxdvWiTfW/hSPhehzLJ3zW7f8E7oT6mCROoMNWCB4TYtv041+2FMAxweiE0j7i1jubQU4MEC/Gg==",
"requires": {
- "@tannin/evaluate": "^1.1.1",
- "@tannin/postfix": "^1.0.2"
+ "@tannin/evaluate": "^1.2.0",
+ "@tannin/postfix": "^1.1.0"
}
},
"@tannin/evaluate": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@tannin/evaluate/-/evaluate-1.1.1.tgz",
- "integrity": "sha512-ALuSZHjrLHGnw0WxsHDHde74FJ2WW0Ck4rg3QBxFBCmxd6Wsac+e0HXfJ++Qion15LIOCmFhyVpWzawMgeBA8Q=="
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@tannin/evaluate/-/evaluate-1.2.0.tgz",
+ "integrity": "sha512-3ioXvNowbO/wSrxsDG5DKIMxC81P0QrQTYai8zFNY+umuoHWRPbQ/TuuDEOju9E+jQDXmj6yI5GyejNuh8I+eg=="
},
"@tannin/plural-forms": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@tannin/plural-forms/-/plural-forms-1.0.3.tgz",
- "integrity": "sha512-IUr9+FiCnzCiB9aRio3FVNR8TNL9SmX2zkV6tmfWWwSclX4uTCykoGsDhTGKK+sZnMrdPCTmb/OxbtGNdVyV4g==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@tannin/plural-forms/-/plural-forms-1.1.0.tgz",
+ "integrity": "sha512-xl9R2mDZO/qiHam1AgMnAES6IKIg7OBhcXqy6eDsRCdXuxAFPcjrej9HMjyCLE0DJ/8cHf0i5OQTstuBRhpbHw==",
"requires": {
- "@tannin/compile": "^1.0.3"
+ "@tannin/compile": "^1.1.0"
}
},
"@tannin/postfix": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@tannin/postfix/-/postfix-1.0.2.tgz",
- "integrity": "sha512-Nggtk7/ljfNPpAX8CjxxLkMKuO6u2gH1ozmTvGclWF2pNcxTf6YGghYNYNWZRKrimXGhQ8yZqvAHep7h80K04g=="
- },
- "@types/babel-types": {
- "version": "7.0.7",
- "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz",
- "integrity": "sha512-dBtBbrc+qTHy1WdfHYjBwRln4+LWqASWakLHsWHR2NWHIFkv4W3O070IGoGLEBrJBvct3r0L1BUPuvURi7kYUQ==",
- "dev": true
- },
- "@types/babel__core": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.3.tgz",
- "integrity": "sha512-8fBo0UR2CcwWxeX7WIIgJ7lXjasFxoYgRnFHUj+hRvKkpiBJbxhdAPTCY6/ZKM0uxANFVzt4yObSLuTiTnazDA==",
- "dev": true,
- "requires": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0",
- "@types/babel__generator": "*",
- "@types/babel__template": "*",
- "@types/babel__traverse": "*"
- }
- },
- "@types/babel__generator": {
- "version": "7.6.0",
- "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.0.tgz",
- "integrity": "sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw==",
- "dev": true,
- "requires": {
- "@babel/types": "^7.0.0"
- }
- },
- "@types/babel__template": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz",
- "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==",
- "dev": true,
- "requires": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0"
- }
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@tannin/postfix/-/postfix-1.1.0.tgz",
+ "integrity": "sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw=="
},
- "@types/babel__traverse": {
- "version": "7.0.7",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz",
- "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==",
+ "@testing-library/dom": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.2.1.tgz",
+ "integrity": "sha512-xIGoHlQ2ZiEL1dJIFKNmLDypzYF+4OJTTASRctl/aoIDaS5y/pRVHRigoqvPUV11mdJoR71IIgi/6UviMgyz4g==",
"dev": true,
"requires": {
- "@babel/types": "^7.3.0"
- }
- },
- "@types/babylon": {
- "version": "6.16.5",
- "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz",
- "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==",
- "dev": true,
+ "@babel/runtime": "^7.9.2",
+ "@types/testing-library__dom": "^7.0.0",
+ "aria-query": "^4.0.2",
+ "dom-accessibility-api": "^0.4.2",
+ "pretty-format": "^25.1.0"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.9.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
+ "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
+ "dev": true,
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "aria-query": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.0.2.tgz",
+ "integrity": "sha512-S1G1V790fTaigUSM/Gd0NngzEfiMy9uTUfMyHhKhVyy4cH5O/eTuR01ydhGL0z4Za1PXFTRGH3qL8VhUQuEO5w==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.7.4",
+ "@babel/runtime-corejs3": "^7.7.4"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz",
+ "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^25.3.0",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^16.12.0"
+ }
+ },
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.13.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
+ "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==",
+ "dev": true
+ }
+ }
+ },
+ "@testing-library/react": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-10.0.2.tgz",
+ "integrity": "sha512-YT6Mw0oJz7R6vlEkmo1FlUD+K15FeXApOB5Ffm9zooFVnrwkt00w18dUJFMOh1yRp9wTdVRonbor7o4PIpFCmA==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.9.2",
+ "@testing-library/dom": "^7.1.0",
+ "@types/testing-library__react": "^10.0.0"
+ },
+ "dependencies": {
+ "@babel/runtime": {
+ "version": "7.9.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
+ "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
+ "dev": true,
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
+ "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==",
+ "dev": true
+ }
+ }
+ },
+ "@types/babel-types": {
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.7.tgz",
+ "integrity": "sha512-dBtBbrc+qTHy1WdfHYjBwRln4+LWqASWakLHsWHR2NWHIFkv4W3O070IGoGLEBrJBvct3r0L1BUPuvURi7kYUQ==",
+ "dev": true
+ },
+ "@types/babel__core": {
+ "version": "7.1.7",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz",
+ "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==",
+ "dev": true,
+ "requires": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "@types/babel__generator": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.0.tgz",
+ "integrity": "sha512-c1mZUu4up5cp9KROs/QAw0gTeHrw/x7m52LcnvMxxOZ03DmLwPV0MlGmlgzV3cnSdjhJOZsj7E7FHeioai+egw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@types/babel__template": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz",
+ "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==",
+ "dev": true,
+ "requires": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@types/babel__traverse": {
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz",
+ "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.3.0"
+ }
+ },
+ "@types/babylon": {
+ "version": "6.16.5",
+ "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz",
+ "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==",
+ "dev": true,
"requires": {
"@types/babel-types": "*"
}
},
+ "@types/cacheable-request": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz",
+ "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==",
+ "dev": true,
+ "requires": {
+ "@types/http-cache-semantics": "*",
+ "@types/keyv": "*",
+ "@types/node": "*",
+ "@types/responselike": "*"
+ }
+ },
+ "@types/classnames": {
+ "version": "2.2.10",
+ "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.10.tgz",
+ "integrity": "sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ==",
+ "dev": true
+ },
"@types/color-name": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
@@ -9570,6 +9692,12 @@
"integrity": "sha512-+o2igcuZA3xtOoFH56s+MCZVidwlJNcJID57DSCyawS2i910yG9vkwehCjJNZ6ImhCR5S9DbvIJKyYHcMyOfMw==",
"dev": true
},
+ "@types/http-cache-semantics": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz",
+ "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==",
+ "dev": true
+ },
"@types/is-function": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.0.tgz",
@@ -9601,28 +9729,25 @@
"@types/istanbul-lib-report": "*"
}
},
- "@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/json-schema": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz",
+ "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==",
+ "dev": true
},
- "@types/jest-specific-snapshot": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/@types/jest-specific-snapshot/-/jest-specific-snapshot-0.5.4.tgz",
- "integrity": "sha512-1qISn4fH8wkOOPFEx+uWRRjw6m/pP/It3OHLm8Ee1KQpO7Z9ZGYDtWPU5AgK05UXsNTAgOK+dPQvJKGdy9E/1g==",
+ "@types/keyv": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz",
+ "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==",
"dev": true,
"requires": {
- "@types/jest": "*"
+ "@types/node": "*"
}
},
- "@types/json-schema": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.3.tgz",
- "integrity": "sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A==",
+ "@types/lodash": {
+ "version": "4.14.149",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz",
+ "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==",
"dev": true
},
"@types/minimatch": {
@@ -9631,6 +9756,12 @@
"integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
"dev": true
},
+ "@types/minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=",
+ "dev": true
+ },
"@types/node": {
"version": "12.7.11",
"resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.11.tgz",
@@ -9648,6 +9779,12 @@
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
},
+ "@types/prettier": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.0.tgz",
+ "integrity": "sha512-gDE8JJEygpay7IjA/u3JiIURvwZW08f0cZSZLAzFoX/ZmeqvS0Sqv+97aKuHpNsalAMMhwPe+iAS6fQbfmbt7A==",
+ "dev": true
+ },
"@types/prop-types": {
"version": "15.7.3",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz",
@@ -9660,6 +9797,12 @@
"integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==",
"dev": true
},
+ "@types/qs": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.1.tgz",
+ "integrity": "sha512-lhbQXx9HKZAPgBkISrBcmAcMpZsmpe/Cd/hY7LGZS5OfkySUBItnPZHgQPssWYUET8elF+yCFBbP1Q0RZPTdaw==",
+ "dev": true
+ },
"@types/reach__router": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.2.6.tgz",
@@ -9689,6 +9832,15 @@
"@types/react": "*"
}
},
+ "@types/react-dom": {
+ "version": "16.9.5",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.5.tgz",
+ "integrity": "sha512-BX6RQ8s9D+2/gDhxrj8OW+YD4R+8hj7FEM/OJHGNR0KipE1h1mSsf39YeyC81qafkq+N3rU3h3RFbLSwE5VqUg==",
+ "dev": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
"@types/react-syntax-highlighter": {
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.2.tgz",
@@ -9713,12 +9865,149 @@
"integrity": "sha512-BnnRkgWYijCIndUn+LgoqKHX/hNpJC5G03B9y7mZya/C2gUQTSn75fEj3ZP1/Rl2E6EYeXh2/7/8UNEZ4X7HuQ==",
"dev": true
},
+ "@types/responselike": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
+ "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/sprintf-js": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@types/sprintf-js/-/sprintf-js-1.1.2.tgz",
+ "integrity": "sha512-hkgzYF+qnIl8uTO8rmUSVSfQ8BIfMXC4yJAF4n8BE758YsKBZvFC4NumnAegj7KmylP0liEZNpb9RRGFMbFejA==",
+ "dev": true
+ },
"@types/stack-utils": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
"integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==",
"dev": true
},
+ "@types/testing-library__dom": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-7.0.1.tgz",
+ "integrity": "sha512-WokGRksRJb3Dla6h02/0/NNHTkjsj4S8aJZiwMj/5/UL8VZ1iCe3H8SHzfpmBeH8Vp4SPRT8iC2o9kYULFhDIw==",
+ "dev": true,
+ "requires": {
+ "pretty-format": "^25.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz",
+ "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^25.3.0",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^16.12.0"
+ }
+ },
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
+ }
+ }
+ },
+ "@types/testing-library__react": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-10.0.1.tgz",
+ "integrity": "sha512-RbDwmActAckbujLZeVO/daSfdL1pnjVqas25UueOkAY5r7vriavWf0Zqg7ghXMHa8ycD/kLkv8QOj31LmSYwww==",
+ "dev": true,
+ "requires": {
+ "@types/react-dom": "*",
+ "@types/testing-library__dom": "*",
+ "pretty-format": "^25.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz",
+ "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^25.3.0",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^16.12.0"
+ }
+ },
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
+ }
+ }
+ },
"@types/unist": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz",
@@ -9753,10 +10042,13 @@
"dev": true
},
"@types/yargs": {
- "version": "12.0.13",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.13.tgz",
- "integrity": "sha512-CXlavd8Q7ZQkB7sMpx9QKC/B7gUsjtftxMHNr7qGJaDiZZ+Qmhwe4Zt3aS9aXF7cn6BYQuFlKU1UlrebyKsh9g==",
- "dev": true
+ "version": "15.0.4",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz",
+ "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
},
"@types/yargs-parser": {
"version": "13.1.0",
@@ -9765,30 +10057,92 @@
"dev": true
},
"@typescript-eslint/experimental-utils": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz",
- "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==",
+ "version": "2.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz",
+ "integrity": "sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ==",
"dev": true,
"requires": {
"@types/json-schema": "^7.0.3",
- "@typescript-eslint/typescript-estree": "1.13.0",
- "eslint-scope": "^4.0.0"
+ "@typescript-eslint/typescript-estree": "2.26.0",
+ "eslint-scope": "^5.0.0",
+ "eslint-utils": "^2.0.0"
+ },
+ "dependencies": {
+ "eslint-scope": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
+ "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ }
}
},
"@typescript-eslint/typescript-estree": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz",
- "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==",
+ "version": "2.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz",
+ "integrity": "sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg==",
"dev": true,
"requires": {
- "lodash.unescape": "4.0.1",
- "semver": "5.5.0"
+ "debug": "^4.1.1",
+ "eslint-visitor-keys": "^1.1.0",
+ "glob": "^7.1.6",
+ "is-glob": "^4.0.1",
+ "lodash": "^4.17.15",
+ "semver": "^6.3.0",
+ "tsutils": "^3.17.1"
},
"dependencies": {
+ "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"
+ }
+ },
+ "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
+ },
+ "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-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "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
+ },
"semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
}
}
@@ -9972,27 +10326,28 @@
"@wordpress/a11y": {
"version": "file:packages/a11y",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/dom-ready": "file:packages/dom-ready"
}
},
"@wordpress/annotations": {
"version": "file:packages/annotations",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/data": "file:packages/data",
"@wordpress/hooks": "file:packages/hooks",
"@wordpress/i18n": "file:packages/i18n",
"@wordpress/rich-text": "file:packages/rich-text",
"lodash": "^4.17.15",
"rememo": "^3.0.0",
- "uuid": "^3.3.2"
+ "uuid": "^7.0.2"
}
},
"@wordpress/api-fetch": {
"version": "file:packages/api-fetch",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
+ "@wordpress/element": "file:packages/element",
"@wordpress/i18n": "file:packages/i18n",
"@wordpress/url": "file:packages/url"
}
@@ -10000,7 +10355,7 @@
"@wordpress/autop": {
"version": "file:packages/autop",
"requires": {
- "@babel/runtime": "^7.8.3"
+ "@babel/runtime": "^7.9.2"
}
},
"@wordpress/babel-plugin-import-jsx-pragma": {
@@ -10011,7 +10366,7 @@
"version": "file:packages/babel-plugin-makepot",
"dev": true,
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"gettext-parser": "^1.3.1",
"lodash": "^4.17.15"
}
@@ -10020,18 +10375,16 @@
"version": "file:packages/babel-preset-default",
"dev": true,
"requires": {
- "@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",
+ "@babel/core": "^7.9.0",
+ "@babel/plugin-transform-react-jsx": "^7.9.4",
+ "@babel/plugin-transform-runtime": "^7.9.0",
+ "@babel/preset-env": "^7.9.0",
+ "@babel/runtime": "^7.9.2",
"@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",
"@wordpress/warning": "file:packages/warning",
- "core-js": "^3.1.4"
+ "core-js": "^3.6.4"
}
},
"@wordpress/base-styles": {
@@ -10041,7 +10394,7 @@
"@wordpress/blob": {
"version": "file:packages/blob",
"requires": {
- "@babel/runtime": "^7.8.3"
+ "@babel/runtime": "^7.9.2"
}
},
"@wordpress/block-directory": {
@@ -10063,7 +10416,7 @@
"@wordpress/block-editor": {
"version": "file:packages/block-editor",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/a11y": "file:packages/a11y",
"@wordpress/blob": "file:packages/blob",
"@wordpress/blocks": "file:packages/blocks",
@@ -10080,6 +10433,7 @@
"@wordpress/is-shallow-equal": "file:packages/is-shallow-equal",
"@wordpress/keyboard-shortcuts": "file:packages/keyboard-shortcuts",
"@wordpress/keycodes": "file:packages/keycodes",
+ "@wordpress/priority-queue": "file:packages/priority-queue",
"@wordpress/rich-text": "file:packages/rich-text",
"@wordpress/token-list": "file:packages/token-list",
"@wordpress/url": "file:packages/url",
@@ -10091,9 +10445,8 @@
"dom-scroll-into-view": "^1.2.1",
"inherits": "^2.0.3",
"lodash": "^4.17.15",
- "memize": "^1.0.5",
+ "memize": "^1.1.0",
"react-autosize-textarea": "^3.0.2",
- "react-resize-aware": "^3.0.0",
"react-spring": "^8.0.19",
"redux-multi": "^0.1.12",
"refx": "^3.0.0",
@@ -10105,7 +10458,7 @@
"@wordpress/block-library": {
"version": "file:packages/block-library",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/a11y": "file:packages/a11y",
"@wordpress/api-fetch": "file:packages/api-fetch",
"@wordpress/autop": "file:packages/autop",
@@ -10134,16 +10487,15 @@
"classnames": "^2.2.5",
"fast-average-color": "4.3.0",
"lodash": "^4.17.15",
- "memize": "^1.0.5",
+ "memize": "^1.1.0",
"moment": "^2.22.1",
- "tinycolor2": "^1.4.1",
- "url": "^0.11.0"
+ "tinycolor2": "^1.4.1"
}
},
"@wordpress/block-serialization-default-parser": {
"version": "file:packages/block-serialization-default-parser",
"requires": {
- "@babel/runtime": "^7.8.3"
+ "@babel/runtime": "^7.9.2"
}
},
"@wordpress/block-serialization-spec-parser": {
@@ -10156,7 +10508,7 @@
"@wordpress/blocks": {
"version": "file:packages/blocks",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/autop": "file:packages/autop",
"@wordpress/blob": "file:packages/blob",
"@wordpress/block-serialization-default-parser": "file:packages/block-serialization-default-parser",
@@ -10176,7 +10528,7 @@
"showdown": "^1.8.6",
"simple-html-tokenizer": "^0.5.7",
"tinycolor2": "^1.4.1",
- "uuid": "^3.3.2"
+ "uuid": "^7.0.2"
}
},
"@wordpress/browserslist-config": {
@@ -10186,7 +10538,7 @@
"@wordpress/components": {
"version": "file:packages/components",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@emotion/core": "^10.0.22",
"@emotion/css": "^10.0.22",
"@emotion/native": "^10.0.22",
@@ -10210,35 +10562,36 @@
"downshift": "^4.0.5",
"gradient-parser": "^0.1.5",
"lodash": "^4.17.15",
- "memize": "^1.0.5",
+ "memize": "^1.1.0",
"moment": "^2.22.1",
"re-resizable": "^6.0.0",
"react-dates": "^17.1.1",
- "react-resize-aware": "^3.0.0",
"react-spring": "^8.0.20",
- "reakit": "^1.0.0-beta.12",
+ "reakit": "^1.0.0-rc.0",
"rememo": "^3.0.0",
"tinycolor2": "^1.4.1",
- "uuid": "^3.3.2"
+ "uuid": "^7.0.2"
}
},
"@wordpress/compose": {
"version": "file:packages/compose",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/element": "file:packages/element",
"@wordpress/is-shallow-equal": "file:packages/is-shallow-equal",
"lodash": "^4.17.15",
- "mousetrap": "^1.6.2"
+ "mousetrap": "^1.6.2",
+ "react-resize-aware": "^3.0.0"
}
},
"@wordpress/core-data": {
"version": "file:packages/core-data",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/api-fetch": "file:packages/api-fetch",
"@wordpress/blocks": "file:packages/blocks",
"@wordpress/data": "file:packages/data",
+ "@wordpress/data-controls": "file:packages/data-controls",
"@wordpress/deprecated": "file:packages/deprecated",
"@wordpress/element": "file:packages/element",
"@wordpress/i18n": "file:packages/i18n",
@@ -10253,11 +10606,11 @@
"version": "file:packages/create-block",
"dev": true,
"requires": {
- "chalk": "^2.4.2",
+ "chalk": "^4.0.0",
"check-node-version": "^3.1.1",
"commander": "^4.1.0",
"execa": "^4.0.0",
- "inquirer": "^7.0.3",
+ "inquirer": "^7.1.0",
"lodash": "^4.17.15",
"make-dir": "^3.0.0",
"mustache": "^4.0.0",
@@ -10274,7 +10627,7 @@
"@wordpress/data": {
"version": "file:packages/data",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/compose": "file:packages/compose",
"@wordpress/deprecated": "file:packages/deprecated",
"@wordpress/element": "file:packages/element",
@@ -10284,7 +10637,7 @@
"equivalent-key-map": "^0.2.2",
"is-promise": "^2.1.0",
"lodash": "^4.17.15",
- "memize": "^1.0.5",
+ "memize": "^1.1.0",
"redux": "^4.0.0",
"turbo-combine-reducers": "^1.0.2",
"use-memo-one": "^1.1.1"
@@ -10300,7 +10653,7 @@
"@wordpress/date": {
"version": "file:packages/date",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"moment": "^2.22.1",
"moment-timezone": "^0.5.16"
}
@@ -10317,7 +10670,7 @@
"@wordpress/deprecated": {
"version": "file:packages/deprecated",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/hooks": "file:packages/hooks"
}
},
@@ -10338,21 +10691,21 @@
"@wordpress/dom": {
"version": "file:packages/dom",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"lodash": "^4.17.15"
}
},
"@wordpress/dom-ready": {
"version": "file:packages/dom-ready",
"requires": {
- "@babel/runtime": "^7.8.3"
+ "@babel/runtime": "^7.9.2"
}
},
"@wordpress/e2e-test-utils": {
"version": "file:packages/e2e-test-utils",
"dev": true,
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/keycodes": "file:packages/keycodes",
"@wordpress/url": "file:packages/url",
"lodash": "^4.17.15",
@@ -10368,15 +10721,39 @@
"@wordpress/jest-puppeteer-axe": "file:packages/jest-puppeteer-axe",
"@wordpress/scripts": "file:packages/scripts",
"@wordpress/url": "file:packages/url",
- "expect-puppeteer": "^4.3.0",
+ "chalk": "^4.0.0",
+ "expect-puppeteer": "^4.4.0",
"lodash": "^4.17.15",
- "uuid": "^3.3.2"
+ "uuid": "^7.0.2"
+ }
+ },
+ "@wordpress/edit-navigation": {
+ "version": "file:packages/edit-navigation",
+ "requires": {
+ "@babel/runtime": "^7.9.2",
+ "@wordpress/block-editor": "file:packages/block-editor",
+ "@wordpress/block-library": "file:packages/block-library",
+ "@wordpress/blocks": "file:packages/blocks",
+ "@wordpress/components": "file:packages/components",
+ "@wordpress/compose": "file:packages/compose",
+ "@wordpress/data": "file:packages/data",
+ "@wordpress/data-controls": "file:packages/data-controls",
+ "@wordpress/dom-ready": "file:packages/dom-ready",
+ "@wordpress/element": "file:packages/element",
+ "@wordpress/hooks": "file:packages/hooks",
+ "@wordpress/i18n": "file:packages/i18n",
+ "@wordpress/keyboard-shortcuts": "file:packages/keyboard-shortcuts",
+ "@wordpress/media-utils": "file:packages/media-utils",
+ "@wordpress/notices": "file:packages/notices",
+ "classnames": "^2.2.5",
+ "lodash": "^4.17.15",
+ "rememo": "^3.0.0"
}
},
"@wordpress/edit-post": {
"version": "file:packages/edit-post",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/a11y": "file:packages/a11y",
"@wordpress/api-fetch": "file:packages/api-fetch",
"@wordpress/block-editor": "file:packages/block-editor",
@@ -10386,11 +10763,13 @@
"@wordpress/compose": "file:packages/compose",
"@wordpress/core-data": "file:packages/core-data",
"@wordpress/data": "file:packages/data",
+ "@wordpress/data-controls": "file:packages/data-controls",
"@wordpress/editor": "file:packages/editor",
"@wordpress/element": "file:packages/element",
"@wordpress/hooks": "file:packages/hooks",
"@wordpress/i18n": "file:packages/i18n",
"@wordpress/icons": "file:packages/icons",
+ "@wordpress/interface": "file:packages/interface",
"@wordpress/keyboard-shortcuts": "file:packages/keyboard-shortcuts",
"@wordpress/keycodes": "file:packages/keycodes",
"@wordpress/media-utils": "file:packages/media-utils",
@@ -10401,7 +10780,7 @@
"@wordpress/viewport": "file:packages/viewport",
"classnames": "^2.2.5",
"lodash": "^4.17.15",
- "memize": "^1.0.5",
+ "memize": "^1.1.0",
"refx": "^3.0.0",
"rememo": "^3.0.0"
}
@@ -10409,7 +10788,7 @@
"@wordpress/edit-site": {
"version": "file:packages/edit-site",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/block-editor": "file:packages/block-editor",
"@wordpress/block-library": "file:packages/block-library",
"@wordpress/blocks": "file:packages/blocks",
@@ -10421,8 +10800,12 @@
"@wordpress/element": "file:packages/element",
"@wordpress/hooks": "file:packages/hooks",
"@wordpress/i18n": "file:packages/i18n",
+ "@wordpress/icons": "file:packages/icons",
+ "@wordpress/interface": "file:packages/interface",
"@wordpress/media-utils": "file:packages/media-utils",
"@wordpress/notices": "file:packages/notices",
+ "@wordpress/plugins": "file:packages/plugins",
+ "@wordpress/primitives": "file:packages/primitives",
"@wordpress/url": "file:packages/url",
"file-saver": "^2.0.2",
"jszip": "^3.2.2",
@@ -10432,7 +10815,7 @@
"@wordpress/edit-widgets": {
"version": "file:packages/edit-widgets",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/block-editor": "file:packages/block-editor",
"@wordpress/block-library": "file:packages/block-library",
"@wordpress/blocks": "file:packages/blocks",
@@ -10443,6 +10826,7 @@
"@wordpress/element": "file:packages/element",
"@wordpress/hooks": "file:packages/hooks",
"@wordpress/i18n": "file:packages/i18n",
+ "@wordpress/interface": "file:packages/interface",
"@wordpress/media-utils": "file:packages/media-utils",
"@wordpress/notices": "file:packages/notices",
"lodash": "^4.17.15",
@@ -10452,7 +10836,7 @@
"@wordpress/editor": {
"version": "file:packages/editor",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/api-fetch": "file:packages/api-fetch",
"@wordpress/autop": "file:packages/autop",
"@wordpress/blob": "file:packages/blob",
@@ -10483,7 +10867,7 @@
"@wordpress/wordcount": "file:packages/wordcount",
"classnames": "^2.2.5",
"lodash": "^4.17.15",
- "memize": "^1.0.5",
+ "memize": "^1.1.0",
"react-autosize-textarea": "^3.0.2",
"redux-optimist": "^1.0.0",
"refx": "^3.0.0",
@@ -10493,7 +10877,7 @@
"@wordpress/element": {
"version": "file:packages/element",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/escape-html": "file:packages/escape-html",
"lodash": "^4.17.15",
"react": "^16.9.0",
@@ -10504,268 +10888,39 @@
"version": "file:packages/env",
"dev": true,
"requires": {
- "chalk": "^2.4.2",
+ "chalk": "^4.0.0",
"copy-dir": "^1.2.0",
"docker-compose": "^0.22.2",
"extract-zip": "^1.6.7",
- "inquirer": "^7.0.4",
+ "got": "^10.7.0",
+ "inquirer": "^7.1.0",
"js-yaml": "^3.13.1",
"nodegit": "^0.26.2",
"ora": "^4.0.2",
- "request": "^2.88.2",
- "request-progress": "^3.0.0",
"rimraf": "^3.0.2",
"terminal-link": "^2.0.0",
"yargs": "^14.0.0"
- },
- "dependencies": {
- "ansi-escapes": {
- "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": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "dev": true
- },
- "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": {
- "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.2.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
- "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^1.0.5"
- }
- },
- "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"
- }
- },
- "inquirer": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz",
- "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==",
- "dev": true,
- "requires": {
- "ansi-escapes": "^4.2.1",
- "chalk": "^2.4.2",
- "cli-cursor": "^3.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^3.0.3",
- "figures": "^3.0.0",
- "lodash": "^4.17.15",
- "mute-stream": "0.0.8",
- "run-async": "^2.2.0",
- "rxjs": "^6.5.3",
- "string-width": "^4.1.0",
- "strip-ansi": "^5.1.0",
- "through": "^2.3.6"
- }
- },
- "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
- },
- "mime-db": {
- "version": "1.43.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
- "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
- "dev": true
- },
- "mime-types": {
- "version": "2.1.26",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
- "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
- "dev": true,
- "requires": {
- "mime-db": "1.43.0"
- }
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true
- },
- "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"
- }
- },
- "request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "dev": true,
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- }
- },
- "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"
- }
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "rxjs": {
- "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",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "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
- }
- }
- },
- "tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "dev": true,
- "requires": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- }
- },
- "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
- }
}
},
"@wordpress/escape-html": {
"version": "file:packages/escape-html",
"requires": {
- "@babel/runtime": "^7.8.3"
+ "@babel/runtime": "^7.9.2"
}
},
"@wordpress/eslint-plugin": {
"version": "file:packages/eslint-plugin",
"dev": true,
"requires": {
- "babel-eslint": "^10.0.3",
- "eslint-config-prettier": "^6.10.0",
- "eslint-plugin-jest": "^22.15.1",
- "eslint-plugin-jsdoc": "^15.8.0",
+ "@wordpress/prettier-config": "file:packages/prettier-config",
+ "babel-eslint": "^10.1.0",
+ "eslint-config-prettier": "^6.10.1",
+ "eslint-plugin-jest": "^23.8.2",
+ "eslint-plugin-jsdoc": "^22.1.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",
+ "eslint-plugin-react": "^7.19.0",
+ "eslint-plugin-react-hooks": "^3.0.0",
"globals": "^12.0.0",
"prettier": "npm:wp-prettier@1.19.1",
"requireindex": "^1.2.0"
@@ -10774,7 +10929,7 @@
"@wordpress/format-library": {
"version": "file:packages/format-library",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/block-editor": "file:packages/block-editor",
"@wordpress/components": "file:packages/components",
"@wordpress/data": "file:packages/data",
@@ -10792,46 +10947,60 @@
"@wordpress/hooks": {
"version": "file:packages/hooks",
"requires": {
- "@babel/runtime": "^7.8.3"
+ "@babel/runtime": "^7.9.2"
}
},
"@wordpress/html-entities": {
"version": "file:packages/html-entities",
"requires": {
- "@babel/runtime": "^7.8.3"
+ "@babel/runtime": "^7.9.2"
}
},
"@wordpress/i18n": {
"version": "file:packages/i18n",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"gettext-parser": "^1.3.1",
"lodash": "^4.17.15",
- "memize": "^1.0.5",
+ "memize": "^1.1.0",
"sprintf-js": "^1.1.1",
- "tannin": "^1.1.0"
+ "tannin": "^1.2.0"
}
},
"@wordpress/icons": {
"version": "file:packages/icons",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/element": "file:packages/element",
"@wordpress/primitives": "file:packages/primitives"
}
},
+ "@wordpress/interface": {
+ "version": "file:packages/interface",
+ "requires": {
+ "@babel/runtime": "^7.9.2",
+ "@wordpress/components": "file:packages/components",
+ "@wordpress/data": "file:packages/data",
+ "@wordpress/element": "file:packages/element",
+ "@wordpress/i18n": "file:packages/i18n",
+ "@wordpress/icons": "file:packages/icons",
+ "@wordpress/plugins": "file:packages/plugins",
+ "classnames": "^2.2.5",
+ "lodash": "^4.17.15"
+ }
+ },
"@wordpress/is-shallow-equal": {
"version": "file:packages/is-shallow-equal",
"requires": {
- "@babel/runtime": "^7.8.3"
+ "@babel/runtime": "^7.9.2"
}
},
"@wordpress/jest-console": {
"version": "file:packages/jest-console",
"dev": true,
"requires": {
- "@babel/runtime": "^7.8.3",
- "jest-matcher-utils": "^24.7.0",
+ "@babel/runtime": "^7.9.2",
+ "jest-matcher-utils": "^25.3.0",
"lodash": "^4.17.15"
}
},
@@ -10839,26 +11008,26 @@
"version": "file:packages/jest-preset-default",
"dev": true,
"requires": {
- "@jest/reporters": "^24.8.0",
+ "@jest/reporters": "^25.3.0",
"@wordpress/jest-console": "file:packages/jest-console",
- "babel-jest": "^24.9.0",
- "enzyme": "^3.9.0",
- "enzyme-adapter-react-16": "^1.10.0",
- "enzyme-to-json": "^3.3.5"
+ "babel-jest": "^25.3.0",
+ "enzyme": "^3.11.0",
+ "enzyme-adapter-react-16": "^1.15.2",
+ "enzyme-to-json": "^3.4.4"
}
},
"@wordpress/jest-puppeteer-axe": {
"version": "file:packages/jest-puppeteer-axe",
"dev": true,
"requires": {
- "@babel/runtime": "^7.8.3",
- "axe-puppeteer": "^1.0.0"
+ "@babel/runtime": "^7.9.2",
+ "axe-puppeteer": "^1.1.0"
}
},
"@wordpress/keyboard-shortcuts": {
"version": "file:packages/keyboard-shortcuts",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/compose": "file:packages/compose",
"@wordpress/data": "file:packages/data",
"@wordpress/element": "file:packages/element",
@@ -10870,7 +11039,7 @@
"@wordpress/keycodes": {
"version": "file:packages/keycodes",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/i18n": "file:packages/i18n",
"lodash": "^4.17.15"
}
@@ -10886,7 +11055,7 @@
"@wordpress/list-reusable-blocks": {
"version": "file:packages/list-reusable-blocks",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/api-fetch": "file:packages/api-fetch",
"@wordpress/components": "file:packages/components",
"@wordpress/compose": "file:packages/compose",
@@ -10898,7 +11067,7 @@
"@wordpress/media-utils": {
"version": "file:packages/media-utils",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/api-fetch": "file:packages/api-fetch",
"@wordpress/blob": "file:packages/blob",
"@wordpress/element": "file:packages/element",
@@ -10909,7 +11078,7 @@
"@wordpress/notices": {
"version": "file:packages/notices",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/a11y": "file:packages/a11y",
"@wordpress/data": "file:packages/data",
"lodash": "^4.17.15"
@@ -10922,7 +11091,7 @@
"@wordpress/nux": {
"version": "file:packages/nux",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/components": "file:packages/components",
"@wordpress/compose": "file:packages/compose",
"@wordpress/data": "file:packages/data",
@@ -10937,7 +11106,7 @@
"@wordpress/plugins": {
"version": "file:packages/plugins",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/compose": "file:packages/compose",
"@wordpress/element": "file:packages/element",
"@wordpress/hooks": "file:packages/hooks",
@@ -10954,10 +11123,14 @@
"postcss-color-function": "^4.0.1"
}
},
+ "@wordpress/prettier-config": {
+ "version": "file:packages/prettier-config",
+ "dev": true
+ },
"@wordpress/primitives": {
"version": "file:packages/primitives",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/element": "file:packages/element",
"classnames": "^2.2.5"
}
@@ -10965,13 +11138,22 @@
"@wordpress/priority-queue": {
"version": "file:packages/priority-queue",
"requires": {
- "@babel/runtime": "^7.8.3"
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "@wordpress/project-management-automation": {
+ "version": "file:packages/project-management-automation",
+ "dev": true,
+ "requires": {
+ "@actions/core": "^1.0.0",
+ "@actions/github": "^1.0.0",
+ "@babel/runtime": "^7.9.2"
}
},
"@wordpress/redux-routine": {
"version": "file:packages/redux-routine",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"is-promise": "^2.1.0",
"lodash": "^4.17.15",
"rungen": "^0.3.2"
@@ -10980,7 +11162,7 @@
"@wordpress/rich-text": {
"version": "file:packages/rich-text",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/compose": "file:packages/compose",
"@wordpress/data": "file:packages/data",
"@wordpress/deprecated": "file:packages/deprecated",
@@ -10990,7 +11172,7 @@
"@wordpress/keycodes": "file:packages/keycodes",
"classnames": "^2.2.5",
"lodash": "^4.17.15",
- "memize": "^1.0.5",
+ "memize": "^1.1.0",
"rememo": "^3.0.0"
}
},
@@ -10998,51 +11180,52 @@
"version": "file:packages/scripts",
"dev": true,
"requires": {
- "@svgr/webpack": "^4.3.3",
+ "@svgr/webpack": "^5.2.0",
"@wordpress/babel-preset-default": "file:packages/babel-preset-default",
"@wordpress/dependency-extraction-webpack-plugin": "file:packages/dependency-extraction-webpack-plugin",
"@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.9.0",
- "babel-loader": "^8.0.6",
- "chalk": "^2.4.2",
+ "@wordpress/prettier-config": "file:packages/prettier-config",
+ "babel-jest": "^25.3.0",
+ "babel-loader": "^8.1.0",
+ "chalk": "^4.0.0",
"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.9.0",
- "jest-puppeteer": "^4.3.0",
+ "eslint": "^6.8.0",
+ "eslint-plugin-markdown": "^1.0.2",
+ "got": "^10.7.0",
+ "jest": "^25.3.0",
+ "jest-puppeteer": "^4.4.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",
+ "npm-package-json-lint": "^5.0.0",
"prettier": "npm:wp-prettier@1.19.1",
"puppeteer": "^2.0.0",
"read-pkg-up": "^1.0.1",
- "request": "^2.88.0",
"resolve-bin": "^0.4.0",
"source-map-loader": "^0.2.4",
"sprintf-js": "^1.1.1",
"stylelint": "^9.10.1",
"stylelint-config-wordpress": "^13.1.0",
- "thread-loader": "^2.1.2",
+ "thread-loader": "^2.1.3",
"url-loader": "^3.0.0",
- "webpack": "^4.41.0",
- "webpack-bundle-analyzer": "^3.3.2",
- "webpack-cli": "^3.1.2",
- "webpack-livereload-plugin": "^2.2.0"
+ "webpack": "^4.42.0",
+ "webpack-bundle-analyzer": "^3.6.1",
+ "webpack-cli": "^3.3.11",
+ "webpack-livereload-plugin": "^2.3.0"
}
},
"@wordpress/server-side-render": {
"version": "file:packages/server-side-render",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/api-fetch": "file:packages/api-fetch",
"@wordpress/components": "file:packages/components",
"@wordpress/data": "file:packages/data",
@@ -11056,30 +11239,31 @@
"@wordpress/shortcode": {
"version": "file:packages/shortcode",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"lodash": "^4.17.15",
- "memize": "^1.0.5"
+ "memize": "^1.1.0"
}
},
"@wordpress/token-list": {
"version": "file:packages/token-list",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"lodash": "^4.17.15"
}
},
"@wordpress/url": {
"version": "file:packages/url",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"lodash": "^4.17.15",
- "qs": "^6.5.2"
+ "qs": "^6.5.2",
+ "react-native-url-polyfill": "^1.1.2"
}
},
"@wordpress/viewport": {
"version": "file:packages/viewport",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/compose": "file:packages/compose",
"@wordpress/data": "file:packages/data",
"lodash": "^4.17.15"
@@ -11091,7 +11275,7 @@
"@wordpress/wordcount": {
"version": "file:packages/wordcount",
"requires": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"lodash": "^4.17.15"
}
},
@@ -11128,12 +11312,6 @@
"through": ">=2.2.7 <3"
}
},
- "abab": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
- "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=",
- "dev": true
- },
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -11171,15 +11349,6 @@
"integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==",
"dev": true
},
- "acorn-globals": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz",
- "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==",
- "dev": true,
- "requires": {
- "acorn": "^5.0.0"
- }
- },
"acorn-jsx": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz",
@@ -11190,9 +11359,9 @@
}
},
"acorn-walk": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz",
- "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz",
+ "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==",
"dev": true
},
"address": {
@@ -12144,11 +12313,12 @@
}
},
"assert": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
- "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+ "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
"dev": true,
"requires": {
+ "object-assign": "^4.1.1",
"util": "0.10.3"
},
"dependencies": {
@@ -12259,6 +12429,28 @@
"postcss-value-parser": "^4.0.0"
},
"dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
"postcss": {
"version": "7.0.26",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz",
@@ -12311,18 +12503,18 @@
"dev": true
},
"axe-core": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.4.0.tgz",
- "integrity": "sha512-5C0OdgxPv/DrQguO6Taj5F1dY5OlkWg4SVmZIVABFYKWlnAc5WTLPzG+xJSgIwf2fmY+NiNGiZXhXx2qT0u/9Q==",
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-3.5.3.tgz",
+ "integrity": "sha512-HZpLE7xu05+8AbpqXITGdxp1Xwk8ysAXrg7MiKRY27py3DAyEJpoJQo1727pWF3F+O79V3r+cTWhOzfB49P89w==",
"dev": true
},
"axe-puppeteer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/axe-puppeteer/-/axe-puppeteer-1.0.0.tgz",
- "integrity": "sha512-hTF3u4mtatgTN7fsLVyVgbRdNc15ngjDcTEuqhn9A7ugqLhLCryJWp9fzqZkNlrW8awPcxugyTwLPR7mRdPZmA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/axe-puppeteer/-/axe-puppeteer-1.1.0.tgz",
+ "integrity": "sha512-VS17Y1rDQe6A0PdeTPxwOSBfmOdj6efgxyre9cN1du1snnVilczSDtQsgifBKBlzoL/3DKfGpgIi+N+zrzODOg==",
"dev": true,
"requires": {
- "axe-core": "^3.1.2"
+ "axe-core": "^3.5.3"
}
},
"axobject-query": {
@@ -12400,15 +12592,15 @@
"dev": true
},
"babel-eslint": {
- "version": "10.0.3",
- "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz",
- "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==",
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
+ "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@babel/parser": "^7.0.0",
- "@babel/traverse": "^7.0.0",
- "@babel/types": "^7.0.0",
+ "@babel/parser": "^7.7.0",
+ "@babel/traverse": "^7.7.0",
+ "@babel/types": "^7.7.0",
"eslint-visitor-keys": "^1.0.0",
"resolve": "^1.12.0"
},
@@ -12420,9 +12612,9 @@
"dev": true
},
"resolve": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz",
- "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==",
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
"dev": true,
"requires": {
"path-parse": "^1.0.6"
@@ -12473,199 +12665,197 @@
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.3.0.tgz",
+ "integrity": "sha512-qiXeX1Cmw4JZ5yQ4H57WpkO0MZ61Qj+YnsVUwAMnDV5ls+yHon11XjarDdgP7H8lTmiEi6biiZA8y3Tmvx6pCg==",
"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"
+ "@jest/transform": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "@types/babel__core": "^7.1.7",
+ "babel-plugin-istanbul": "^6.0.0",
+ "babel-preset-jest": "^25.3.0",
+ "chalk": "^3.0.0",
+ "slash": "^3.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==",
+ "@jest/transform": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.3.0.tgz",
+ "integrity": "sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg==",
"dev": true,
"requires": {
- "@jest/source-map": "^24.9.0",
- "chalk": "^2.0.1",
- "slash": "^2.0.0"
+ "@babel/core": "^7.1.0",
+ "@jest/types": "^25.3.0",
+ "babel-plugin-istanbul": "^6.0.0",
+ "chalk": "^3.0.0",
+ "convert-source-map": "^1.4.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "graceful-fs": "^4.2.3",
+ "jest-haste-map": "^25.3.0",
+ "jest-regex-util": "^25.2.6",
+ "jest-util": "^25.3.0",
+ "micromatch": "^4.0.2",
+ "pirates": "^4.0.1",
+ "realpath-native": "^2.0.0",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.1",
+ "write-file-atomic": "^3.0.0"
}
},
- "@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==",
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0"
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
}
},
- "@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==",
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
"dev": true,
"requires": {
- "callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
- "source-map": "^0.6.0"
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
}
},
- "@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==",
+ "babel-plugin-istanbul": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
+ "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==",
"dev": true,
"requires": {
- "@jest/console": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/istanbul-lib-coverage": "^2.0.0"
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^4.0.0",
+ "test-exclude": "^6.0.0"
}
},
- "@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==",
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
- "@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"
+ "fill-range": "^7.0.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==",
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
}
},
- "@types/yargs": {
- "version": "13.0.5",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.5.tgz",
- "integrity": "sha512-CF/+sxTO7FOwbIRL4wMv0ZYLCRfMid2HQpzDRyViH7kSpfoAFiMdGqKIxb1PxWfjtQXQhnQuD33lvRHNwr809Q==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "color-name": "~1.1.4"
}
},
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "fsevents": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
+ "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
+ "dev": true,
+ "optional": true
+ },
"graceful-fs": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
"dev": true
},
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
"jest-haste-map": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz",
- "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz",
+ "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "anymatch": "^2.0.0",
+ "@jest/types": "^25.3.0",
+ "anymatch": "^3.0.3",
"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",
+ "fsevents": "^2.1.2",
+ "graceful-fs": "^4.2.3",
+ "jest-serializer": "^25.2.6",
+ "jest-util": "^25.3.0",
+ "jest-worker": "^25.2.6",
+ "micromatch": "^4.0.2",
"sane": "^4.0.3",
- "walker": "^1.0.7"
- }
- },
- "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"
+ "walker": "^1.0.7",
+ "which": "^2.0.2"
}
},
"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==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz",
+ "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==",
"dev": true
},
"jest-serializer": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz",
- "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz",
+ "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==",
"dev": true
},
"jest-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz",
- "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz",
+ "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==",
"dev": true,
"requires": {
- "@jest/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",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
"is-ci": "^2.0.0",
- "mkdirp": "^0.5.1",
- "slash": "^2.0.0",
- "source-map": "^0.6.0"
+ "make-dir": "^3.0.0"
}
},
"jest-worker": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz",
- "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz",
+ "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==",
"dev": true,
"requires": {
"merge-stream": "^2.0.0",
- "supports-color": "^6.1.0"
+ "supports-color": "^7.0.0"
}
},
"merge-stream": {
@@ -12674,10 +12864,32 @@
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
- "slash": {
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "realpath-native": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz",
+ "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==",
+ "dev": true
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
"source-map": {
@@ -12687,39 +12899,89 @@
"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==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
"dev": true,
"requires": {
- "has-flag": "^3.0.0"
+ "has-flag": "^4.0.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
}
},
"write-file-atomic": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz",
- "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
"dev": true,
"requires": {
- "graceful-fs": "^4.1.11",
"imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.2"
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
}
}
}
},
"babel-loader": {
- "version": "8.0.6",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz",
- "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==",
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
+ "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==",
"dev": true,
"requires": {
- "find-cache-dir": "^2.0.0",
- "loader-utils": "^1.0.2",
- "mkdirp": "^0.5.1",
- "pify": "^4.0.1"
+ "find-cache-dir": "^2.1.0",
+ "loader-utils": "^1.4.0",
+ "mkdirp": "^0.5.3",
+ "pify": "^4.0.1",
+ "schema-utils": "^2.6.5"
},
"dependencies": {
+ "ajv": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
+ "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "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
+ },
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
+ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
+ "dev": true
+ },
"find-cache-dir": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
@@ -12740,6 +13002,26 @@
"locate-path": "^3.0.0"
}
},
+ "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.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ },
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
@@ -12760,10 +13042,27 @@
"semver": "^5.6.0"
}
},
+ "mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ }
+ }
+ },
"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.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
@@ -12799,6 +13098,16 @@
"find-up": "^3.0.0"
}
},
+ "schema-utils": {
+ "version": "2.6.5",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz",
+ "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.0",
+ "ajv-keywords": "^3.4.1"
+ }
+ },
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -12814,19 +13123,19 @@
"dev": true
},
"babel-plugin-apply-mdx-type-prop": {
- "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==",
+ "version": "1.5.8",
+ "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.5.8.tgz",
+ "integrity": "sha512-xYp5F9mAnZdDRFSd1vF3XQ0GQUbIulCpnuht2jCmK30GAHL8szVL7TgzwhEGamQ6yJmP/gEyYNM9OR5D2n26eA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "7.8.0",
- "@mdx-js/util": "^1.5.5"
+ "@babel/helper-plugin-utils": "7.8.3",
+ "@mdx-js/util": "^1.5.8"
},
"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==",
+ "@mdx-js/util": {
+ "version": "1.5.8",
+ "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.5.8.tgz",
+ "integrity": "sha512-a7Gjjw8bfBSertA/pTWBA/9WKEhgaSxvQE2NTSUzaknrzGFOhs4alZSHh3RHmSFdSWv5pUuzAgsWseMLhWEVkQ==",
"dev": true
}
}
@@ -12841,14 +13150,14 @@
}
},
"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==",
+ "version": "10.0.33",
+ "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz",
+ "integrity": "sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ==",
"requires": {
"@babel/helper-module-imports": "^7.0.0",
- "@emotion/hash": "0.7.4",
+ "@emotion/hash": "0.8.0",
"@emotion/memoize": "0.7.4",
- "@emotion/serialize": "^0.11.15",
+ "@emotion/serialize": "^0.11.16",
"babel-plugin-macros": "^2.0.0",
"babel-plugin-syntax-jsx": "^6.18.0",
"convert-source-map": "^1.5.0",
@@ -12858,9 +13167,9 @@
},
"dependencies": {
"@emotion/hash": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.7.4.tgz",
- "integrity": "sha512-fxfMSBMX3tlIbKUdtGKxqB1fyrH6gVrX39Gsv3y8lRYKUqlgDt3UMqQyGnR1bQMa2B8aGnhLZokZgg8vT0Le+A=="
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
+ "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
},
"@emotion/memoize": {
"version": "0.7.4",
@@ -12868,11 +13177,11 @@
"integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
},
"@emotion/serialize": {
- "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==",
+ "version": "0.11.16",
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz",
+ "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==",
"requires": {
- "@emotion/hash": "0.7.4",
+ "@emotion/hash": "0.8.0",
"@emotion/memoize": "0.7.4",
"@emotion/unitless": "0.7.5",
"@emotion/utils": "0.11.3",
@@ -12892,20 +13201,12 @@
}
},
"babel-plugin-extract-import-names": {
- "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==",
+ "version": "1.5.8",
+ "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.5.8.tgz",
+ "integrity": "sha512-LcLfP8ZRBZMdMAXHLugyvvd5PY0gMmLMWFogWAUsG32X6TYW2Eavx+il2bw73KDbW+UdCC1bAJ3NuU25T1MI3g==",
"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/helper-plugin-utils": "7.8.3"
}
},
"babel-plugin-inline-json-import": {
@@ -12918,14 +13219,15 @@
}
},
"babel-plugin-istanbul": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.3.tgz",
- "integrity": "sha512-IFyehbvRRwdBlI1lDp+FaMsWNnEndEk7065IB8NhzBX+ZKLPwPodgk4I5Gobw/8SNUUzso2Dv3hbqRh88eiSCQ==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz",
+ "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==",
"dev": true,
"requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
"find-up": "^3.0.0",
- "istanbul-lib-instrument": "^3.2.0",
- "test-exclude": "^5.2.2"
+ "istanbul-lib-instrument": "^3.3.0",
+ "test-exclude": "^5.2.3"
},
"dependencies": {
"find-up": {
@@ -12937,27 +13239,53 @@
"locate-path": "^3.0.0"
}
},
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
"istanbul-lib-coverage": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
- "integrity": "sha512-LXTBICkMARVgo579kWDm8SqfB6nvSDKNqIOBEjmJRnL04JvoMHCYGWaMddQnseJYtkEuEvO/sIcOxPLk9gERug==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
+ "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
"dev": true
},
"istanbul-lib-instrument": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.2.0.tgz",
- "integrity": "sha512-06IM3xShbNW4NgZv5AP4QH0oHqf1/ivFo8eFys0ZjPXHGldHJQWb3riYOKXqmOqfxXBfxu4B+g/iuhOPZH0RJg==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
+ "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
"dev": true,
"requires": {
- "@babel/generator": "^7.0.0",
- "@babel/parser": "^7.0.0",
- "@babel/template": "^7.0.0",
- "@babel/traverse": "^7.0.0",
- "@babel/types": "^7.0.0",
- "istanbul-lib-coverage": "^2.0.4",
+ "@babel/generator": "^7.4.0",
+ "@babel/parser": "^7.4.3",
+ "@babel/template": "^7.4.0",
+ "@babel/traverse": "^7.4.3",
+ "@babel/types": "^7.4.0",
+ "istanbul-lib-coverage": "^2.0.5",
"semver": "^6.0.0"
}
},
+ "load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
+ }
+ },
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
@@ -12969,9 +13297,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.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
@@ -12992,18 +13320,73 @@
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
- "semver": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz",
- "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==",
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
"dev": true
+ },
+ "read-pkg": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^4.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^3.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
+ "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
+ "dev": true,
+ "requires": {
+ "find-up": "^3.0.0",
+ "read-pkg": "^3.0.0"
+ }
+ },
+ "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
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ },
+ "test-exclude": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz",
+ "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3",
+ "minimatch": "^3.0.4",
+ "read-pkg-up": "^4.0.0",
+ "require-main-filename": "^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==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz",
+ "integrity": "sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw==",
"dev": true,
"requires": {
"@types/babel__traverse": "^7.0.6"
@@ -13053,9 +13436,9 @@
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
},
"resolve": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz",
- "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==",
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
"requires": {
"path-parse": "^1.0.6"
}
@@ -13157,9 +13540,9 @@
}
},
"babel-plugin-named-asset-import": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.5.tgz",
- "integrity": "sha512-sGhfINU+AuMw9oFAdIn/nD5sem3pn/WgxAfDZ//Q3CnF+5uaho7C7shh2rKLk6sKE/XkfmyibghocwKdVjLIKg==",
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz",
+ "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==",
"dev": true
},
"babel-plugin-react-docgen": {
@@ -13309,10 +13692,28 @@
"integrity": "sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA=",
"dev": true
},
+ "babel-preset-current-node-syntax": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.2.tgz",
+ "integrity": "sha512-u/8cS+dEiK1SFILbOC8/rUI3ml9lboKuuMvZ/4aQnQmhecQAgPw5ew066C1ObnEAUmlx7dv/s2z52psWEtLNiw==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.8.3",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+ }
+ },
"babel-preset-fbjs": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.2.0.tgz",
- "integrity": "sha512-5Jo+JeWiVz2wHUUyAlvb/sSYnXNig9r+HqGAOSfh5Fzxp7SnAaR/tEGRJ1ZX7C77kfk82658w6R5Z+uPATTD9g==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz",
+ "integrity": "sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw==",
"dev": true,
"requires": {
"@babel/plugin-proposal-class-properties": "^7.0.0",
@@ -13345,13 +13746,13 @@
}
},
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.3.0.tgz",
+ "integrity": "sha512-tjdvLKNMwDI9r+QWz9sZUQGTq1dpoxjUqFUpEasAc7MOtHg9XuLT2fx0udFG+k1nvMV0WvHHVAN7VmCZ+1Zxbw==",
"dev": true,
"requires": {
- "@babel/plugin-syntax-object-rest-spread": "^7.0.0",
- "babel-plugin-jest-hoist": "^24.9.0"
+ "babel-plugin-jest-hoist": "^25.2.6",
+ "babel-preset-current-node-syntax": "^0.1.2"
}
},
"babel-preset-minify": {
@@ -13504,8 +13905,7 @@
"base64-js": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
- "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
- "dev": true
+ "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw=="
},
"basic-auth": {
"version": "2.0.1",
@@ -13549,15 +13949,23 @@
}
},
"bfj": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz",
- "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==",
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz",
+ "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==",
"dev": true,
"requires": {
- "bluebird": "^3.5.1",
- "check-types": "^7.3.0",
- "hoopy": "^0.1.2",
- "tryer": "^1.0.0"
+ "bluebird": "^3.5.5",
+ "check-types": "^8.0.3",
+ "hoopy": "^0.1.4",
+ "tryer": "^1.0.1"
+ },
+ "dependencies": {
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ }
}
},
"big-integer": {
@@ -13629,32 +14037,50 @@
"error": "^7.0.0",
"raw-body": "~1.1.0",
"safe-json-parse": "~1.0.1"
+ },
+ "dependencies": {
+ "bytes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
+ "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz",
+ "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=",
+ "dev": true,
+ "requires": {
+ "bytes": "1",
+ "string_decoder": "0.10"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
}
},
"body-parser": {
- "version": "1.18.2",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
- "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
"dev": true,
"requires": {
- "bytes": "3.0.0",
+ "bytes": "3.1.0",
"content-type": "~1.0.4",
"debug": "2.6.9",
- "depd": "~1.1.1",
- "http-errors": "~1.6.2",
- "iconv-lite": "0.4.19",
+ "depd": "~1.1.2",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
- "qs": "6.5.1",
- "raw-body": "2.3.2",
- "type-is": "~1.6.15"
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
},
"dependencies": {
- "bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
- "dev": true
- },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -13664,62 +14090,52 @@
"ms": "2.0.0"
}
},
- "iconv-lite": {
- "version": "0.4.19",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
- "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
- "dev": true
- },
- "qs": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
- "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
- "dev": true
+ "http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "dev": true,
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ }
},
- "raw-body": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
- "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dev": true,
"requires": {
- "bytes": "3.0.0",
- "http-errors": "1.6.2",
- "iconv-lite": "0.4.19",
- "unpipe": "1.0.0"
- },
- "dependencies": {
- "depd": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
- "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
- "dev": true
- },
- "http-errors": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
- "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
- "dev": true,
- "requires": {
- "depd": "1.1.1",
- "inherits": "2.0.3",
- "setprototypeof": "1.0.3",
- "statuses": ">= 1.3.1 < 2"
- }
- }
+ "safer-buffer": ">= 2.1.2 < 3"
}
},
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+ "dev": true
+ },
"setprototypeof": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
- "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
"dev": true
}
}
},
"body-scroll-lock": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-2.6.4.tgz",
- "integrity": "sha512-NP08WsovlmxEoZP9pdlqrE+AhNaivlTrz9a0FF37BQsnOrpN48eNqivKkE7SYpM9N+YIPjsdVzfLAUQDBm6OQw=="
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-2.7.1.tgz",
+ "integrity": "sha512-hS53SQ8RhM0e4DsQ3PKz6Gr2O7Kpdh59TWU98GHjaQznL7y4dFycEPk7pFQAikqBaUSCArkc5E3pe7CWIt2fZA=="
},
"boolbase": {
"version": "1.0.0",
@@ -13837,6 +14253,12 @@
"has-flag": "^4.0.0"
}
},
+ "term-size": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
+ "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==",
+ "dev": true
+ },
"type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
@@ -14056,9 +14478,9 @@
"dev": true
},
"buffer": {
- "version": "4.9.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
- "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+ "version": "4.9.2",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
+ "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
"dev": true,
"requires": {
"base64-js": "^1.0.2",
@@ -14143,9 +14565,9 @@
"dev": true
},
"bytes": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
- "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
"dev": true
},
"cacache": {
@@ -14169,6 +14591,31 @@
"y18n": "^4.0.0"
},
"dependencies": {
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ },
+ "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"
+ }
+ }
+ }
+ },
"y18n": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
@@ -14194,6 +14641,64 @@
"unset-value": "^1.0.0"
}
},
+ "cacheable-lookup": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz",
+ "integrity": "sha512-EMMbsiOTcdngM/K6gV/OxF2x0t07+vMOWxZNSCRQMjO2MY2nhZQ6OYhOOpyQrbhqsgtvKGI7hcq6xjnA92USjg==",
+ "dev": true,
+ "requires": {
+ "@types/keyv": "^3.1.1",
+ "keyv": "^4.0.0"
+ }
+ },
+ "cacheable-request": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz",
+ "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==",
+ "dev": true,
+ "requires": {
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^4.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^4.1.0",
+ "responselike": "^2.0.0"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "http-cache-semantics": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
+ "dev": true
+ },
+ "normalize-url": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
+ "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
+ "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"
+ }
+ }
+ }
+ },
"call-me-maybe": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
@@ -14353,13 +14858,55 @@
}
},
"chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz",
+ "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==",
+ "dev": true,
"requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"character-entities": {
@@ -14416,6 +14963,17 @@
"semver": "^5.0.3"
},
"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"
+ }
+ },
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -14425,25 +14983,11 @@
}
},
"check-types": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz",
- "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==",
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz",
+ "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==",
"dev": true
},
- "cheerio": {
- "version": "1.0.0-rc.2",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz",
- "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=",
- "dev": true,
- "requires": {
- "css-select": "~1.2.0",
- "dom-serializer": "~0.1.0",
- "entities": "~1.1.1",
- "htmlparser2": "^3.9.1",
- "lodash": "^4.15.0",
- "parse5": "^3.0.1"
- }
- },
"chokidar": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
@@ -14713,6 +15257,23 @@
"is-supported-regexp-flag": "^1.0.0"
}
},
+ "clone-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+ "dev": true,
+ "requires": {
+ "mimic-response": "^1.0.0"
+ },
+ "dependencies": {
+ "mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+ "dev": true
+ }
+ }
+ },
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -14728,6 +15289,19 @@
"@types/q": "^1.5.1",
"chalk": "^2.4.1",
"q": "^1.1.2"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
}
},
"code-point-at": {
@@ -14741,6 +15315,12 @@
"integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==",
"dev": true
},
+ "collect-v8-coverage": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz",
+ "integrity": "sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ==",
+ "dev": true
+ },
"collection-visit": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -14857,9 +15437,9 @@
"dev": true
},
"comment-parser": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.6.1.tgz",
- "integrity": "sha512-Putzd7Ilyvknmb1KxGf5el9uw0sPx9gEVnDrm8tlvXGN1i8Uaa2VBxB32hUhfzTlrEhhxNQ+pKq4ZNe8wNxjmw==",
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.2.tgz",
+ "integrity": "sha512-4Rjb1FnxtOcv9qsfuaNuVsmmVn4ooVoBHzYfyKteiXwIU84PClyGA5jASoFMwPV93+FPh9spwueXauxFJZkGAg==",
"dev": true
},
"commondir": {
@@ -15122,13 +15702,10 @@
}
},
"console-browserify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
- "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
- "dev": true,
- "requires": {
- "date-now": "^0.1.4"
- }
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+ "dev": true
},
"console-control-strings": {
"version": "1.1.0",
@@ -15166,10 +15743,13 @@
"dev": true
},
"content-disposition": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
- "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
- "dev": true
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
},
"content-type": {
"version": "1.0.4",
@@ -15614,9 +16194,9 @@
"integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU="
},
"cookie": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
- "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
"dev": true
},
"cookie-signature": {
@@ -15637,6 +16217,31 @@
"mkdirp": "^0.5.1",
"rimraf": "^2.5.4",
"run-queue": "^1.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "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"
+ }
+ }
}
},
"copy-descriptor": {
@@ -15725,11 +16330,29 @@
}
},
"core-js": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.4.tgz",
- "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==",
+ "version": "3.6.4",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz",
+ "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==",
"dev": true
},
+ "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": {
+ "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
+ }
+ }
+ },
"core-js-pure": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.2.1.tgz",
@@ -16024,6 +16647,30 @@
"chalk": "^2.4.2",
"source-map": "^0.6.1",
"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"
+ }
+ }
+ }
+ }
}
},
"postcss-modules-extract-imports": {
@@ -16265,11 +16912,22 @@
}
}
},
- "cssom": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz",
- "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==",
- "dev": true
+ "cssstyle": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz",
+ "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==",
+ "dev": true,
+ "requires": {
+ "cssom": "~0.3.6"
+ },
+ "dependencies": {
+ "cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "dev": true
+ }
+ }
},
"csstype": {
"version": "2.6.7",
@@ -16325,29 +16983,12 @@
"assert-plus": "^1.0.0"
}
},
- "data-urls": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.0.tgz",
- "integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==",
- "dev": true,
- "requires": {
- "abab": "^1.0.4",
- "whatwg-mimetype": "^2.0.0",
- "whatwg-url": "^6.4.0"
- }
- },
"date-fns": {
"version": "1.29.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz",
"integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==",
"dev": true
},
- "date-now": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
- "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
- "dev": true
- },
"dateformat": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
@@ -16419,6 +17060,15 @@
"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
"dev": true
},
+ "decompress-response": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-5.0.0.tgz",
+ "integrity": "sha512-TLZWWybuxWgoW7Lykv+gq9xvzOsUjQ9tF09Tj6NSTYGMTCHNXzrPnD6Hi+TgZq19PyTAGH4Ll/NIM/eTGglnMw==",
+ "dev": true,
+ "requires": {
+ "mimic-response": "^2.0.0"
+ }
+ },
"decompress-zip": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.2.2.tgz",
@@ -16526,6 +17176,12 @@
"clone": "^1.0.2"
}
},
+ "defer-to-connect": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz",
+ "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==",
+ "dev": true
+ },
"define-properties": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
@@ -16795,9 +17451,9 @@
"dev": true
},
"des.js": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
- "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+ "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
"dev": true,
"requires": {
"inherits": "^2.0.1",
@@ -16819,6 +17475,12 @@
"repeat-string": "^1.5.4"
}
},
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true
+ },
"detect-indent": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz",
@@ -16831,9 +17493,9 @@
"dev": true
},
"detect-newline": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
- "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
"dev": true
},
"detect-node": {
@@ -16878,12 +17540,6 @@
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
},
- "diff-sequences": {
- "version": "24.3.0",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz",
- "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==",
- "dev": true
- },
"diffie-hellman": {
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
@@ -16944,6 +17600,12 @@
"integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=",
"dev": true
},
+ "dom-accessibility-api": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.4.3.tgz",
+ "integrity": "sha512-JZ8iPuEHDQzq6q0k7PKMGbrIdsgBB7TRrtVOUm4nSMCExlg5qQG4KXWTH2k90yggjM4tTumRGwTKJSldMzKyLA==",
+ "dev": true
+ },
"dom-converter": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
@@ -17094,6 +17756,12 @@
"integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
"dev": true
},
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+ "dev": true
+ },
"duplexify": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz",
@@ -17123,9 +17791,9 @@
"dev": true
},
"ejs": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
- "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==",
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz",
+ "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==",
"dev": true
},
"electron-to-chromium": {
@@ -17150,9 +17818,9 @@
}
},
"elliptic": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
- "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==",
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz",
+ "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==",
"dev": true,
"requires": {
"bn.js": "^4.4.0",
@@ -17237,14 +17905,26 @@
}
},
"enhanced-resolve": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
- "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz",
+ "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
- "memory-fs": "^0.4.0",
+ "memory-fs": "^0.5.0",
"tapable": "^1.0.0"
+ },
+ "dependencies": {
+ "memory-fs": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+ "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+ "dev": true,
+ "requires": {
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
+ }
+ }
}
},
"entities": {
@@ -17266,275 +17946,86 @@
"dev": true
},
"enzyme": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.9.0.tgz",
- "integrity": "sha512-JqxI2BRFHbmiP7/UFqvsjxTirWoM1HfeaJrmVSZ9a1EADKkZgdPcAuISPMpoUiHlac9J4dYt81MC5BBIrbJGMg==",
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz",
+ "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==",
"dev": true,
"requires": {
- "array.prototype.flat": "^1.2.1",
- "cheerio": "^1.0.0-rc.2",
- "function.prototype.name": "^1.1.0",
+ "array.prototype.flat": "^1.2.3",
+ "cheerio": "^1.0.0-rc.3",
+ "enzyme-shallow-equal": "^1.0.1",
+ "function.prototype.name": "^1.1.2",
"has": "^1.0.3",
- "html-element-map": "^1.0.0",
- "is-boolean-object": "^1.0.0",
- "is-callable": "^1.1.4",
- "is-number-object": "^1.0.3",
- "is-regex": "^1.0.4",
- "is-string": "^1.0.4",
+ "html-element-map": "^1.2.0",
+ "is-boolean-object": "^1.0.1",
+ "is-callable": "^1.1.5",
+ "is-number-object": "^1.0.4",
+ "is-regex": "^1.0.5",
+ "is-string": "^1.0.5",
"is-subset": "^0.1.1",
"lodash.escape": "^4.0.1",
"lodash.isequal": "^4.5.0",
- "object-inspect": "^1.6.0",
- "object-is": "^1.0.1",
+ "object-inspect": "^1.7.0",
+ "object-is": "^1.0.2",
"object.assign": "^4.1.0",
- "object.entries": "^1.0.4",
- "object.values": "^1.0.4",
- "raf": "^3.4.0",
+ "object.entries": "^1.1.1",
+ "object.values": "^1.1.1",
+ "raf": "^3.4.1",
"rst-selector-parser": "^2.2.3",
- "string.prototype.trim": "^1.1.2"
- }
- },
- "enzyme-adapter-react-16": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.14.0.tgz",
- "integrity": "sha512-7PcOF7pb4hJUvjY7oAuPGpq3BmlCig3kxXGi2kFx0YzJHppqX1K8IIV9skT1IirxXlu8W7bneKi+oQ10QRnhcA==",
- "dev": true,
- "requires": {
- "enzyme-adapter-utils": "^1.12.0",
- "has": "^1.0.3",
- "object.assign": "^4.1.0",
- "object.values": "^1.1.0",
- "prop-types": "^15.7.2",
- "react-is": "^16.8.6",
- "react-test-renderer": "^16.0.0-0",
- "semver": "^5.7.0"
- },
- "dependencies": {
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dev": true,
- "requires": {
- "object-keys": "^1.0.12"
- }
- },
- "object.values": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz",
- "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.12.0",
- "function-bind": "^1.1.1",
- "has": "^1.0.3"
- }
- },
- "react-is": {
- "version": "16.8.6",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz",
- "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==",
- "dev": true
- },
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
- "dev": true
- }
- }
- },
- "enzyme-adapter-utils": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.0.tgz",
- "integrity": "sha512-wkZvE0VxcFx/8ZsBw0iAbk3gR1d9hK447ebnSYBf95+r32ezBq+XDSAvRErkc4LZosgH8J7et7H7/7CtUuQfBA==",
- "dev": true,
- "requires": {
- "airbnb-prop-types": "^2.13.2",
- "function.prototype.name": "^1.1.0",
- "object.assign": "^4.1.0",
- "object.fromentries": "^2.0.0",
- "prop-types": "^15.7.2",
- "semver": "^5.6.0"
+ "string.prototype.trim": "^1.2.1"
},
"dependencies": {
- "airbnb-prop-types": {
- "version": "2.13.2",
- "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.13.2.tgz",
- "integrity": "sha512-2FN6DlHr6JCSxPPi25EnqGaXC4OC3/B3k1lCd6MMYrZ51/Gf/1qDfaR+JElzWa+Tl7cY2aYOlsYJGFeQyVHIeQ==",
- "dev": true,
- "requires": {
- "array.prototype.find": "^2.0.4",
- "function.prototype.name": "^1.1.0",
- "has": "^1.0.3",
- "is-regex": "^1.0.4",
- "object-is": "^1.0.1",
- "object.assign": "^4.1.0",
- "object.entries": "^1.1.0",
- "prop-types": "^15.7.2",
- "prop-types-exact": "^1.2.0",
- "react-is": "^16.8.6"
- }
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dev": true,
- "requires": {
- "object-keys": "^1.0.12"
- }
- },
- "object.entries": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz",
- "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==",
+ "array.prototype.flat": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
+ "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
"dev": true,
"requires": {
"define-properties": "^1.1.3",
- "es-abstract": "^1.12.0",
- "function-bind": "^1.1.1",
- "has": "^1.0.3"
- }
- },
- "react-is": {
- "version": "16.8.6",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz",
- "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==",
- "dev": true
- },
- "semver": {
- "version": "5.7.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
- "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
- "dev": true
- }
- }
- },
- "enzyme-to-json": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.3.5.tgz",
- "integrity": "sha512-DmH1wJ68HyPqKSYXdQqB33ZotwfUhwQZW3IGXaNXgR69Iodaoj8TF/D9RjLdz4pEhGq2Tx2zwNUIjBuqoZeTgA==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.4"
- }
- },
- "equivalent-key-map": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/equivalent-key-map/-/equivalent-key-map-0.2.2.tgz",
- "integrity": "sha512-xvHeyCDbZzkpN4VHQj/n+j2lOwL0VWszG30X4cOrc9Y7Tuo2qCdZK/0AMod23Z5dCtNUbaju6p0rwOhHUk05ew=="
- },
- "err-code": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz",
- "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=",
- "dev": true
- },
- "errno": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
- "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
- "dev": true,
- "requires": {
- "prr": "~1.0.1"
- }
- },
- "error": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz",
- "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=",
- "dev": true,
- "requires": {
- "string-template": "~0.2.1",
- "xtend": "~4.0.0"
- }
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "errorhandler": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz",
- "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==",
- "dev": true,
- "requires": {
- "accepts": "~1.3.7",
- "escape-html": "~1.0.3"
- },
- "dependencies": {
- "accepts": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
- "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
- "dev": true,
- "requires": {
- "mime-types": "~2.1.24",
- "negotiator": "0.6.2"
+ "es-abstract": "^1.17.0-next.1"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
+ "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+ "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"
+ }
+ },
+ "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
+ }
}
},
- "mime-db": {
- "version": "1.42.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz",
- "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==",
- "dev": true
- },
- "mime-types": {
- "version": "2.1.25",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz",
- "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==",
+ "cheerio": {
+ "version": "1.0.0-rc.3",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz",
+ "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==",
"dev": true,
"requires": {
- "mime-db": "1.42.0"
+ "css-select": "~1.2.0",
+ "dom-serializer": "~0.1.1",
+ "entities": "~1.1.1",
+ "htmlparser2": "^3.9.1",
+ "lodash": "^4.15.0",
+ "parse5": "^3.0.1"
}
},
- "negotiator": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
- "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
- "dev": true
- }
- }
- },
- "es-abstract": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
- "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
- "requires": {
- "es-to-primitive": "^1.1.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.1",
- "is-callable": "^1.1.3",
- "is-regex": "^1.0.4"
- }
- },
- "es-array-method-boxes-properly": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
- "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
- "dev": true
- },
- "es-get-iterator": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.0.2.tgz",
- "integrity": "sha512-ZHb4fuNK3HKHEOvDGyHPKf5cSWh/OvAMskeM/+21NMnTuvqFvz8uHatolu+7Kf6b6oK9C+3Uo1T37pSGPWv0MA==",
- "dev": true,
- "requires": {
- "es-abstract": "^1.17.0-next.1",
- "has-symbols": "^1.0.1",
- "is-arguments": "^1.0.4",
- "is-map": "^2.0.0",
- "is-set": "^2.0.0",
- "is-string": "^1.0.4",
- "isarray": "^2.0.5"
- },
- "dependencies": {
"define-properties": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -17544,23 +18035,785 @@
"object-keys": "^1.0.12"
}
},
- "es-abstract": {
- "version": "1.17.4",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
- "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
+ "dom-serializer": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
+ "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
"dev": true,
"requires": {
- "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"
+ "domelementtype": "^1.3.0",
+ "entities": "^1.1.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "function.prototype.name": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.2.tgz",
+ "integrity": "sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "functions-have-names": "^1.2.0"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
+ "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+ "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"
+ }
+ },
+ "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
+ }
+ }
+ },
+ "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-string": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+ "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "object-inspect": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
+ "dev": true
+ },
+ "object-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz",
+ "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==",
+ "dev": true
+ },
+ "object.entries": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz",
+ "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
+ "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+ "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"
+ }
+ },
+ "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
+ }
+ }
+ },
+ "object.values": {
+ "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.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
+ "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+ "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"
+ }
+ },
+ "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
+ }
+ }
+ },
+ "react-is": {
+ "version": "16.8.6",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz",
+ "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA=="
+ },
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
+ },
+ "string.prototype.trimleft": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
+ "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5",
+ "string.prototype.trimstart": "^1.0.0"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
+ "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+ "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"
+ }
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ }
+ }
+ },
+ "string.prototype.trimright": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
+ "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5",
+ "string.prototype.trimend": "^1.0.0"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
+ "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+ "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"
+ }
+ },
+ "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
+ }
+ }
+ }
+ }
+ },
+ "enzyme-adapter-react-16": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.2.tgz",
+ "integrity": "sha512-SkvDrb8xU3lSxID8Qic9rB8pvevDbLybxPK6D/vW7PrT0s2Cl/zJYuXvsd1EBTz0q4o3iqG3FJhpYz3nUNpM2Q==",
+ "dev": true,
+ "requires": {
+ "enzyme-adapter-utils": "^1.13.0",
+ "enzyme-shallow-equal": "^1.0.1",
+ "has": "^1.0.3",
+ "object.assign": "^4.1.0",
+ "object.values": "^1.1.1",
+ "prop-types": "^15.7.2",
+ "react-is": "^16.12.0",
+ "react-test-renderer": "^16.0.0-0",
+ "semver": "^5.7.0"
+ },
+ "dependencies": {
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "es-abstract": {
+ "version": "1.17.4",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
+ "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.1.5",
+ "is-regex": "^1.0.5",
+ "object-inspect": "^1.7.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimleft": "^2.1.1",
+ "string.prototype.trimright": "^2.1.1"
+ },
+ "dependencies": {
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ }
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
+ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+ "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "object-inspect": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
+ "dev": true
+ },
+ "object.values": {
+ "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.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
+ "react-is": {
+ "version": "16.13.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz",
+ "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "string.prototype.trimleft": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
+ "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ }
+ },
+ "string.prototype.trimright": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
+ "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ }
+ }
+ }
+ },
+ "enzyme-adapter-utils": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.13.0.tgz",
+ "integrity": "sha512-YuEtfQp76Lj5TG1NvtP2eGJnFKogk/zT70fyYHXK2j3v6CtuHqc8YmgH/vaiBfL8K1SgVVbQXtTcgQZFwzTVyQ==",
+ "dev": true,
+ "requires": {
+ "airbnb-prop-types": "^2.15.0",
+ "function.prototype.name": "^1.1.2",
+ "object.assign": "^4.1.0",
+ "object.fromentries": "^2.0.2",
+ "prop-types": "^15.7.2",
+ "semver": "^5.7.1"
+ },
+ "dependencies": {
+ "airbnb-prop-types": {
+ "version": "2.15.0",
+ "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz",
+ "integrity": "sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA==",
+ "dev": true,
+ "requires": {
+ "array.prototype.find": "^2.1.0",
+ "function.prototype.name": "^1.1.1",
+ "has": "^1.0.3",
+ "is-regex": "^1.0.4",
+ "object-is": "^1.0.1",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.0",
+ "prop-types": "^15.7.2",
+ "prop-types-exact": "^1.2.0",
+ "react-is": "^16.9.0"
+ }
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "es-abstract": {
+ "version": "1.17.4",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
+ "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.1.5",
+ "is-regex": "^1.0.5",
+ "object-inspect": "^1.7.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimleft": "^2.1.1",
+ "string.prototype.trimright": "^2.1.1"
+ },
+ "dependencies": {
+ "is-regex": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+ "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ }
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "function.prototype.name": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.2.tgz",
+ "integrity": "sha512-C8A+LlHBJjB2AdcRPorc5JvJ5VUoWlXdEHLOJdCI7kjHEtGTpHQUiqMvCIKUwIsGwZX2jZJy761AXsn356bJQg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "functions-have-names": "^1.2.0"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
+ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "object-inspect": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
+ "dev": true
+ },
+ "object.entries": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz",
+ "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
+ "object.fromentries": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz",
+ "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
+ "react-is": {
+ "version": "16.13.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz",
+ "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ },
+ "string.prototype.trimleft": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
+ "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ }
+ },
+ "string.prototype.trimright": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
+ "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ }
+ }
+ }
+ },
+ "enzyme-shallow-equal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.1.tgz",
+ "integrity": "sha512-hGA3i1so8OrYOZSM9whlkNmVHOicJpsjgTzC+wn2JMJXhq1oO4kA4bJ5MsfzSIcC71aLDKzJ6gZpIxrqt3QTAQ==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3",
+ "object-is": "^1.0.2"
+ },
+ "dependencies": {
+ "object-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz",
+ "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==",
+ "dev": true
+ }
+ }
+ },
+ "enzyme-to-json": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.4.4.tgz",
+ "integrity": "sha512-50LELP/SCPJJGic5rAARvU7pgE3m1YaNj7JLM+Qkhl5t7PAs6fiyc8xzc50RnkKPFQCv0EeFVjEWdIFRGPWMsA==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.15",
+ "react-is": "^16.12.0"
+ },
+ "dependencies": {
+ "react-is": {
+ "version": "16.13.0",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz",
+ "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==",
+ "dev": true
+ }
+ }
+ },
+ "equivalent-key-map": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/equivalent-key-map/-/equivalent-key-map-0.2.2.tgz",
+ "integrity": "sha512-xvHeyCDbZzkpN4VHQj/n+j2lOwL0VWszG30X4cOrc9Y7Tuo2qCdZK/0AMod23Z5dCtNUbaju6p0rwOhHUk05ew=="
+ },
+ "err-code": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz",
+ "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=",
+ "dev": true
+ },
+ "errno": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+ "dev": true,
+ "requires": {
+ "prr": "~1.0.1"
+ }
+ },
+ "error": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz",
+ "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=",
+ "dev": true,
+ "requires": {
+ "string-template": "~0.2.1",
+ "xtend": "~4.0.0"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "errorhandler": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz",
+ "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==",
+ "dev": true,
+ "requires": {
+ "accepts": "~1.3.7",
+ "escape-html": "~1.0.3"
+ },
+ "dependencies": {
+ "accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "dev": true,
+ "requires": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ }
+ },
+ "mime-db": {
+ "version": "1.42.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz",
+ "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.25",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz",
+ "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.42.0"
+ }
+ },
+ "negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+ "dev": true
+ }
+ }
+ },
+ "es-abstract": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
+ "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
+ "requires": {
+ "es-to-primitive": "^1.1.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.1",
+ "is-callable": "^1.1.3",
+ "is-regex": "^1.0.4"
+ }
+ },
+ "es-array-method-boxes-properly": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
+ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
+ "dev": true
+ },
+ "es-get-iterator": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.0.2.tgz",
+ "integrity": "sha512-ZHb4fuNK3HKHEOvDGyHPKf5cSWh/OvAMskeM/+21NMnTuvqFvz8uHatolu+7Kf6b6oK9C+3Uo1T37pSGPWv0MA==",
+ "dev": true,
+ "requires": {
+ "es-abstract": "^1.17.0-next.1",
+ "has-symbols": "^1.0.1",
+ "is-arguments": "^1.0.4",
+ "is-map": "^2.0.0",
+ "is-set": "^2.0.0",
+ "is-string": "^1.0.4",
+ "isarray": "^2.0.5"
+ },
+ "dependencies": {
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "es-abstract": {
+ "version": "1.17.4",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
+ "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.1.5",
+ "is-regex": "^1.0.5",
+ "object-inspect": "^1.7.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimleft": "^2.1.1",
+ "string.prototype.trimright": "^2.1.1"
}
},
"es-to-primitive": {
@@ -17692,32 +18945,10 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
- "escodegen": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.10.0.tgz",
- "integrity": "sha512-fjUOf8johsv23WuIKdNQU4P9t9jhQ4Qzx6pC2uW890OloK3Zs1ZAoCNpg/2larNF501jLl3UNy0kIRcF6VI22g==",
- "dev": true,
- "requires": {
- "esprima": "^3.1.3",
- "estraverse": "^4.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1",
- "source-map": "~0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "optional": true
- }
- }
- },
"eslint": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.1.0.tgz",
- "integrity": "sha512-QhrbdRD7ofuV09IuE2ySWBz0FyXCq0rriLTZXZqaWSI79CVtHVRdkFuFTViiqzZhkCgfOh9USpriuGN2gIpZDQ==",
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
+ "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
@@ -17727,19 +18958,19 @@
"debug": "^4.0.1",
"doctrine": "^3.0.0",
"eslint-scope": "^5.0.0",
- "eslint-utils": "^1.3.1",
- "eslint-visitor-keys": "^1.0.0",
- "espree": "^6.0.0",
+ "eslint-utils": "^1.4.3",
+ "eslint-visitor-keys": "^1.1.0",
+ "espree": "^6.1.2",
"esquery": "^1.0.1",
"esutils": "^2.0.2",
"file-entry-cache": "^5.0.1",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^5.0.0",
- "globals": "^11.7.0",
+ "globals": "^12.1.0",
"ignore": "^4.0.6",
"import-fresh": "^3.0.0",
"imurmurhash": "^0.1.4",
- "inquirer": "^6.4.1",
+ "inquirer": "^7.0.0",
"is-glob": "^4.0.0",
"js-yaml": "^3.13.1",
"json-stable-stringify-without-jsonify": "^1.0.1",
@@ -17748,7 +18979,7 @@
"minimatch": "^3.0.4",
"mkdirp": "^0.5.1",
"natural-compare": "^1.4.0",
- "optionator": "^0.8.2",
+ "optionator": "^0.8.3",
"progress": "^2.0.0",
"regexpp": "^2.0.1",
"semver": "^6.1.2",
@@ -17760,21 +18991,15 @@
},
"dependencies": {
"acorn": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
- "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz",
+ "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==",
"dev": true
},
"acorn-jsx": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz",
- "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==",
- "dev": true
- },
- "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==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
+ "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
"dev": true
},
"ansi-regex": {
@@ -17783,6 +19008,17 @@
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
},
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -17832,29 +19068,36 @@
"estraverse": "^4.1.1"
}
},
+ "eslint-utils": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
+ "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "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
+ },
"espree": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz",
- "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==",
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
+ "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
"dev": true,
"requires": {
- "acorn": "^7.1.0",
- "acorn-jsx": "^5.1.0",
+ "acorn": "^7.1.1",
+ "acorn-jsx": "^5.2.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
- }
}
},
"glob-parent": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
- "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+ "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
@@ -17872,10 +19115,13 @@
}
},
"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
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
},
"ignore": {
"version": "4.0.6",
@@ -17883,33 +19129,26 @@
"integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
"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"
- }
- },
"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
},
+ "optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ }
+ },
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -17927,6 +19166,17 @@
"is-fullwidth-code-point": "^2.0.0"
}
},
+ "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",
@@ -17937,9 +19187,9 @@
}
},
"strip-json-comments": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
- "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz",
+ "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==",
"dev": true
},
"table": {
@@ -17952,27 +19202,20 @@
"lodash": "^4.17.14",
"slice-ansi": "^2.1.0",
"string-width": "^3.0.0"
- },
- "dependencies": {
- "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"
- }
- }
}
+ },
+ "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
}
}
},
"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==",
+ "version": "6.10.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz",
+ "integrity": "sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ==",
"dev": true,
"requires": {
"get-stdin": "^6.0.0"
@@ -17987,13 +19230,13 @@
}
},
"eslint-import-resolver-node": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
- "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz",
+ "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==",
"dev": true,
"requires": {
"debug": "^2.6.9",
- "resolve": "^1.5.0"
+ "resolve": "^1.13.1"
},
"dependencies": {
"debug": {
@@ -18004,16 +19247,31 @@
"requires": {
"ms": "2.0.0"
}
+ },
+ "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.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
}
}
},
"eslint-module-utils": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz",
- "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==",
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
+ "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
"dev": true,
"requires": {
- "debug": "^2.6.8",
+ "debug": "^2.6.9",
"pkg-dir": "^2.0.0"
},
"dependencies": {
@@ -18047,22 +19305,23 @@
}
},
"eslint-plugin-import": {
- "version": "2.18.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz",
- "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==",
+ "version": "2.20.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz",
+ "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==",
"dev": true,
"requires": {
"array-includes": "^3.0.3",
+ "array.prototype.flat": "^1.2.1",
"contains-path": "^0.1.0",
"debug": "^2.6.9",
"doctrine": "1.5.0",
"eslint-import-resolver-node": "^0.3.2",
- "eslint-module-utils": "^2.4.0",
+ "eslint-module-utils": "^2.4.1",
"has": "^1.0.3",
"minimatch": "^3.0.4",
"object.values": "^1.1.0",
"read-pkg-up": "^2.0.0",
- "resolve": "^1.11.0"
+ "resolve": "^1.12.0"
},
"dependencies": {
"debug": {
@@ -18093,6 +19352,74 @@
"isarray": "^1.0.0"
}
},
+ "es-abstract": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
+ "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+ "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"
+ }
+ },
"load-json-file": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
@@ -18105,14 +19432,20 @@
"strip-bom": "^3.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"
}
@@ -18154,14 +19487,36 @@
}
},
"resolve": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
- "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
"dev": true,
"requires": {
"path-parse": "^1.0.6"
}
},
+ "string.prototype.trimleft": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
+ "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5",
+ "string.prototype.trimstart": "^1.0.0"
+ }
+ },
+ "string.prototype.trimright": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
+ "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5",
+ "string.prototype.trimend": "^1.0.0"
+ }
+ },
"strip-bom": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
@@ -18171,27 +19526,27 @@
}
},
"eslint-plugin-jest": {
- "version": "22.15.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-22.15.1.tgz",
- "integrity": "sha512-CWq/RR/3tLaKFB+FZcCJwU9hH5q/bKeO3rFP8G07+q7hcDCFNqpvdphVbEbGE6o6qo1UbciEev4ejUWv7brUhw==",
+ "version": "23.8.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-23.8.2.tgz",
+ "integrity": "sha512-xwbnvOsotSV27MtAe7s8uGWOori0nUsrXh2f1EnpmXua8sDfY6VZhHAhHg2sqK7HBNycRQExF074XSZ7DvfoFg==",
"dev": true,
"requires": {
- "@typescript-eslint/experimental-utils": "^1.13.0"
+ "@typescript-eslint/experimental-utils": "^2.5.0"
}
},
"eslint-plugin-jsdoc": {
- "version": "15.8.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-15.8.0.tgz",
- "integrity": "sha512-J6ozWkaAgBh1eLdQE+C2wcXhoEgDmGJOSB6zMF5ktEtMBnU62xT3wfHcUacuTnv6rt+ollC0uZThaEpGA+sTNg==",
+ "version": "22.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-22.1.0.tgz",
+ "integrity": "sha512-54NdbICM7KrxsGUqQsev9aIMqPXyvyBx2218Qcm0TQ16P9CtBI+YY4hayJR6adrxlq4Ej0JLpgfUXWaQVFqmQg==",
"dev": true,
"requires": {
- "comment-parser": "^0.6.1",
+ "comment-parser": "^0.7.2",
"debug": "^4.1.1",
- "flat-map-polyfill": "^0.3.8",
- "jsdoctypeparser": "5.0.1",
+ "jsdoctypeparser": "^6.1.0",
"lodash": "^4.17.15",
- "object.entries-ponyfill": "^1.0.1",
- "regextras": "^0.6.1"
+ "regextras": "^0.7.0",
+ "semver": "^6.3.0",
+ "spdx-expression-parse": "^3.0.0"
},
"dependencies": {
"debug": {
@@ -18208,6 +19563,12 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
}
}
},
@@ -18229,9 +19590,9 @@
}
},
"eslint-plugin-markdown": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-1.0.1.tgz",
- "integrity": "sha512-nAUURNHJGPooBMZMP23FmTbh3LTdgoSqeFBv9FA3fYrJ+vDUJxrp6nKiQF4iDNAmnWQnmnrDvV61BmIF4X9QAQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-1.0.2.tgz",
+ "integrity": "sha512-BfvXKsO0K+zvdarNc801jsE/NTLmig4oKhZ1U3aSUgTf2dB/US5+CrfGxMsCK2Ki1vS1R3HPok+uYpufFndhzw==",
"dev": true,
"requires": {
"object-assign": "^4.0.1",
@@ -18300,22 +19661,36 @@
}
},
"eslint-plugin-react": {
- "version": "7.14.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz",
- "integrity": "sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==",
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz",
+ "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==",
"dev": true,
"requires": {
- "array-includes": "^3.0.3",
+ "array-includes": "^3.1.1",
"doctrine": "^2.1.0",
"has": "^1.0.3",
- "jsx-ast-utils": "^2.1.0",
- "object.entries": "^1.1.0",
- "object.fromentries": "^2.0.0",
- "object.values": "^1.1.0",
+ "jsx-ast-utils": "^2.2.3",
+ "object.entries": "^1.1.1",
+ "object.fromentries": "^2.0.2",
+ "object.values": "^1.1.1",
"prop-types": "^15.7.2",
- "resolve": "^1.10.1"
+ "resolve": "^1.15.1",
+ "semver": "^6.3.0",
+ "string.prototype.matchall": "^4.0.2",
+ "xregexp": "^4.3.0"
},
"dependencies": {
+ "array-includes": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
+ "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0",
+ "is-string": "^1.0.5"
+ }
+ },
"define-properties": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -18325,26 +19700,128 @@
"object-keys": "^1.0.12"
}
},
+ "es-abstract": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
+ "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+ "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-string": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
+ "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "jsx-ast-utils": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz",
+ "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.0.3",
+ "object.assign": "^4.1.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.entries": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz",
- "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz",
+ "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==",
"dev": true,
"requires": {
"define-properties": "^1.1.3",
- "es-abstract": "^1.12.0",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3"
+ }
+ },
+ "object.fromentries": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz",
+ "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
"function-bind": "^1.1.1",
"has": "^1.0.3"
}
},
"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"
}
@@ -18356,20 +19833,48 @@
"dev": true
},
"resolve": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
- "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
"dev": true,
"requires": {
"path-parse": "^1.0.6"
}
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ },
+ "string.prototype.trimleft": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
+ "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5",
+ "string.prototype.trimstart": "^1.0.0"
+ }
+ },
+ "string.prototype.trimright": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
+ "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5",
+ "string.prototype.trimend": "^1.0.0"
+ }
}
}
},
"eslint-plugin-react-hooks": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.1.tgz",
- "integrity": "sha512-wHhmGJyVuijnYIJXZJHDUF2WM+rJYTjulUTqF9k61d3BTk8etydz+M4dXUVH7M76ZRS85rqBTCx0Es/lLsrjnA==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-3.0.0.tgz",
+ "integrity": "sha512-EjxTHxjLKIBWFgDJdhKKzLh5q+vjTFrqNZX36uIxWS4OfyXe5DawqPj3U5qeJ1ngLwatjzQnmR0Lz0J0YH3kxw==",
"dev": true
},
"eslint-scope": {
@@ -18383,12 +19888,20 @@
}
},
"eslint-utils": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz",
- "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz",
+ "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==",
"dev": true,
"requires": {
- "eslint-visitor-keys": "^1.0.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
+ }
}
},
"eslint-visitor-keys": {
@@ -18407,19 +19920,21 @@
"acorn-jsx": "^4.1.1"
}
},
- "esprima": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
- "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
- "dev": true
- },
"esquery": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
- "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz",
+ "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==",
"dev": true,
"requires": {
- "estraverse": "^4.0.0"
+ "estraverse": "^5.0.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz",
+ "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==",
+ "dev": true
+ }
}
},
"esrecurse": {
@@ -18440,7 +19955,8 @@
"esutils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
},
"etag": {
"version": "1.8.1",
@@ -18461,9 +19977,9 @@
"dev": true
},
"events": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz",
- "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz",
+ "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==",
"dev": true
},
"eventsource": {
@@ -18509,9 +20025,9 @@
},
"dependencies": {
"cross-spawn": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
- "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz",
+ "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==",
"dev": true,
"requires": {
"path-key": "^3.1.0",
@@ -18674,232 +20190,184 @@
"os-homedir": "^1.0.1"
}
},
- "expect": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz",
- "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==",
+ "expect-puppeteer": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-4.4.0.tgz",
+ "integrity": "sha512-6Ey4Xy2xvmuQu7z7YQtMsaMV0EHJRpVxIDOd5GRrm04/I3nkTKIutELfECsLp6le+b3SSa3cXhPiw6PgqzxYWA==",
+ "dev": true
+ },
+ "express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
"dev": true,
"requires": {
- "@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"
+ "accepts": "~1.3.7",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
+ "content-type": "~1.0.4",
+ "cookie": "0.4.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.1.2",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.1.2",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
},
"dependencies": {
- "@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==",
+ "accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
"dev": true,
"requires": {
- "@jest/console": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/istanbul-lib-coverage": "^2.0.0"
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
}
},
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "ms": "2.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==",
+ "http-errors": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
+ "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "depd": "~1.1.2",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
}
},
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"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==",
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"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==",
+ "mime-db": {
+ "version": "1.43.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
+ "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
"dev": true
},
- "jest-diff": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz",
- "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==",
+ "mime-types": {
+ "version": "2.1.26",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
+ "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
"dev": true,
"requires": {
- "chalk": "^2.0.1",
- "diff-sequences": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "pretty-format": "^24.9.0"
+ "mime-db": "1.43.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==",
+ "negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
"dev": true
},
- "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"
- }
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "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"
- }
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+ "dev": true
},
- "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==",
+ "range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"dev": true
},
- "pretty-format": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
- "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
+ "send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ }
}
},
- "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": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-4.3.0.tgz",
- "integrity": "sha512-p8N/KSVPG9PAOJlftK5f1n3JrULJ6Qq1EQ8r/n9xzkX2NmXbK8PcnJnkSAEzEHrMycELKGnlJV7M5nkgm+wEWA==",
- "dev": true
- },
- "express": {
- "version": "4.16.3",
- "resolved": "http://registry.npmjs.org/express/-/express-4.16.3.tgz",
- "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
- "dev": true,
- "requires": {
- "accepts": "~1.3.5",
- "array-flatten": "1.1.1",
- "body-parser": "1.18.2",
- "content-disposition": "0.5.2",
- "content-type": "~1.0.4",
- "cookie": "0.3.1",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.1.1",
- "fresh": "0.5.2",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.2",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.3",
- "qs": "6.5.1",
- "range-parser": "~1.2.0",
- "safe-buffer": "5.1.1",
- "send": "0.16.2",
- "serve-static": "1.13.2",
- "setprototypeof": "1.1.0",
- "statuses": "~1.4.0",
- "type-is": "~1.6.16",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "serve-static": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
"dev": true,
"requires": {
- "ms": "2.0.0"
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
}
},
- "qs": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
- "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+ "setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
"dev": true
},
- "safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
"dev": true
}
}
@@ -19310,12 +20778,24 @@
"klaw": "^1.0.0",
"path-is-absolute": "^1.0.0",
"rimraf": "^2.2.8"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
}
},
"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",
@@ -19372,17 +20852,17 @@
}
},
"finalhandler": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
- "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"dev": true,
"requires": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "~2.3.0",
- "parseurl": "~1.3.2",
- "statuses": "~1.4.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
"unpipe": "~1.0.0"
},
"dependencies": {
@@ -19394,6 +20874,18 @@
"requires": {
"ms": "2.0.0"
}
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+ "dev": true
}
}
},
@@ -19451,9 +20943,9 @@
}
},
"find-process": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.2.tgz",
- "integrity": "sha512-O83EVJr4dWvHJ7QpUzANNAMeQVKukRzRqRx4AIzdLYRrQorRdbqDwLPigkd9PYPhJRhmNPAoVjOm9bcwSmcZaw==",
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.3.tgz",
+ "integrity": "sha512-+IA+AUsQCf3uucawyTwMWcY+2M3FXq3BRvw3S+j5Jvydjk31f/+NPWpYZOJs+JUs2GvxH4Yfr6Wham0ZtRLlPA==",
"dev": true,
"requires": {
"chalk": "^2.0.1",
@@ -19461,6 +20953,17 @@
"debug": "^2.6.8"
},
"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"
+ }
+ },
"commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
@@ -19515,6 +21018,63 @@
}
}
},
+ "findup-sync": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
+ "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
+ "dev": true,
+ "requires": {
+ "detect-file": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "micromatch": "^3.0.4",
+ "resolve-dir": "^1.0.1"
+ },
+ "dependencies": {
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "^1.0.1"
+ }
+ },
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "^1.0.1",
+ "is-windows": "^1.0.1",
+ "resolve-dir": "^1.0.0"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "^2.0.2",
+ "homedir-polyfill": "^1.0.1",
+ "ini": "^1.3.4",
+ "is-windows": "^1.0.1",
+ "which": "^1.2.14"
+ }
+ },
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "^2.0.0",
+ "global-modules": "^1.0.0"
+ }
+ }
+ }
+ },
"flat-cache": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
@@ -19551,12 +21111,6 @@
}
}
},
- "flat-map-polyfill": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/flat-map-polyfill/-/flat-map-polyfill-0.3.8.tgz",
- "integrity": "sha512-ZfmD5MnU7GglUEhiky9C7yEPaNq1/wh36RDohe+Xr3nJVdccwHbdTkFIYvetcdsoAckUKT51fuf44g7Ni5Doyg==",
- "dev": true
- },
"flatted": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz",
@@ -19627,6 +21181,17 @@
"worker-rpc": "^0.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"
+ }
+ },
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -19758,6 +21323,21 @@
"dev": true,
"optional": true
},
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
"minipass": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
@@ -19786,6 +21366,18 @@
"rimraf": "^2.6.1",
"semver": "^5.3.0",
"tar": "^4"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
}
},
"nopt": {
@@ -19847,6 +21439,7 @@
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -19855,6 +21448,15 @@
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
+ },
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
}
}
},
@@ -19879,6 +21481,12 @@
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"dev": true
},
+ "functions-have-names": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.1.tgz",
+ "integrity": "sha512-j48B/ZI7VKs3sgeI2cZp7WXWmZXu7Iq5pl5/vptV5N2mq+DGFuS/ulaDjtaoLpYzuD6u8UgrUKHfgo7fDTSiBA==",
+ "dev": true
+ },
"fuse.js": {
"version": "3.4.6",
"resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.4.6.tgz",
@@ -20425,12 +22033,6 @@
"global-prefix": "^3.0.0"
}
},
- "global-modules-path": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz",
- "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==",
- "dev": true
- },
"global-prefix": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
@@ -20580,6 +22182,56 @@
"delegate": "^3.1.2"
}
},
+ "got": {
+ "version": "10.7.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-10.7.0.tgz",
+ "integrity": "sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==",
+ "dev": true,
+ "requires": {
+ "@sindresorhus/is": "^2.0.0",
+ "@szmarczak/http-timer": "^4.0.0",
+ "@types/cacheable-request": "^6.0.1",
+ "cacheable-lookup": "^2.0.0",
+ "cacheable-request": "^7.0.1",
+ "decompress-response": "^5.0.0",
+ "duplexer3": "^0.1.4",
+ "get-stream": "^5.0.0",
+ "lowercase-keys": "^2.0.0",
+ "mimic-response": "^2.1.0",
+ "p-cancelable": "^2.0.0",
+ "p-event": "^4.0.0",
+ "responselike": "^2.0.0",
+ "to-readable-stream": "^2.0.0",
+ "type-fest": "^0.10.0"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "type-fest": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz",
+ "integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==",
+ "dev": true
+ }
+ }
+ },
"graceful-fs": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
@@ -20609,19 +22261,19 @@
"dev": true
},
"gzip-size": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz",
- "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz",
+ "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==",
"dev": true,
"requires": {
"duplexer": "^0.1.1",
- "pify": "^3.0.0"
+ "pify": "^4.0.1"
},
"dependencies": {
"pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
"dev": true
}
}
@@ -20668,6 +22320,12 @@
"har-schema": "^2.0.0"
}
},
+ "hard-rejection": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+ "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+ "dev": true
+ },
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -20951,9 +22609,9 @@
"dev": true
},
"html-element-map": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.0.0.tgz",
- "integrity": "sha512-/SP6aOiM5Ai9zALvCxDubIeez0LvG3qP7R9GcRDnJEP/HBmv0A8A9K0o8+HFudcFt46+i921ANjzKsjPjb7Enw==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.2.0.tgz",
+ "integrity": "sha512-0uXq8HsuG1v2TmQ8QkIhzbrqeskE4kn52Q18QJ9iAA/SnHoEKXWiUxHQtclRsCFWEUD2So34X+0+pZZu862nnw==",
"dev": true,
"requires": {
"array-filter": "^1.0.0"
@@ -20974,6 +22632,12 @@
"integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=",
"dev": true
},
+ "html-escaper": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz",
+ "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==",
+ "dev": true
+ },
"html-minifier-terser": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.0.2.tgz",
@@ -21166,6 +22830,17 @@
"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",
@@ -21408,6 +23083,30 @@
"chalk": "^2.4.2",
"source-map": "^0.6.1",
"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": {
@@ -21430,8 +23129,7 @@
"ieee754": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
- "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==",
- "dev": true
+ "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA=="
},
"iferr": {
"version": "0.1.5",
@@ -21655,33 +23353,33 @@
"dev": true
},
"inquirer": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.3.tgz",
- "integrity": "sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz",
+ "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==",
"dev": true,
"requires": {
"ansi-escapes": "^4.2.1",
- "chalk": "^2.4.2",
+ "chalk": "^3.0.0",
"cli-cursor": "^3.1.0",
"cli-width": "^2.0.0",
"external-editor": "^3.0.3",
"figures": "^3.0.0",
"lodash": "^4.17.15",
"mute-stream": "0.0.8",
- "run-async": "^2.2.0",
+ "run-async": "^2.4.0",
"rxjs": "^6.5.3",
"string-width": "^4.1.0",
- "strip-ansi": "^5.1.0",
+ "strip-ansi": "^6.0.0",
"through": "^2.3.6"
},
"dependencies": {
"ansi-escapes": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz",
- "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+ "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
"dev": true,
"requires": {
- "type-fest": "^0.8.1"
+ "type-fest": "^0.11.0"
}
},
"ansi-regex": {
@@ -21690,6 +23388,26 @@
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"dev": true
},
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
"cli-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
@@ -21699,6 +23417,21 @@
"restore-cursor": "^3.1.0"
}
},
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -21706,14 +23439,20 @@
"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==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
"dev": true,
"requires": {
"escape-string-regexp": "^1.0.5"
}
},
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -21751,10 +23490,19 @@
"signal-exit": "^3.0.2"
}
},
+ "run-async": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz",
+ "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==",
+ "dev": true,
+ "requires": {
+ "is-promise": "^2.1.0"
+ }
+ },
"rxjs": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
- "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
+ "version": "6.5.5",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
+ "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
"dev": true,
"requires": {
"tslib": "^1.9.0"
@@ -21769,40 +23517,30 @@
"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",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "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": "^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
- }
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
}
},
"type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+ "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
"dev": true
}
}
@@ -21947,16 +23685,16 @@
"integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
"dev": true
},
- "ipaddr.js": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
- "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=",
+ "ip-regex": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
"dev": true
},
- "irregular-plurals": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-2.0.0.tgz",
- "integrity": "sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==",
+ "ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
"dev": true
},
"is-absolute-url": {
@@ -22028,9 +23766,9 @@
}
},
"is-boolean-object": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz",
- "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz",
+ "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==",
"dev": true
},
"is-buffer": {
@@ -22192,9 +23930,9 @@
"dev": true
},
"is-generator-fn": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.0.0.tgz",
- "integrity": "sha512-elzyIdM7iKoFHzcrndIqjYomImhxrFRnGP3galODoII4TB9gI7mZ+FnlLQmmjf27SxHS2gKEeyhX5/+YRS6H9g==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
"dev": true
},
"is-glob": {
@@ -22245,9 +23983,9 @@
}
},
"is-number-object": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz",
- "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz",
+ "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==",
"dev": true
},
"is-obj": {
@@ -22401,9 +24139,9 @@
"dev": true
},
"is-whitespace-character": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz",
- "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
+ "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
"dev": true
},
"is-windows": {
@@ -22413,9 +24151,9 @@
"dev": true
},
"is-word-character": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz",
- "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
+ "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==",
"dev": true
},
"is-wsl": {
@@ -22456,81 +24194,70 @@
"dev": true
},
"istanbul-lib-coverage": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
- "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
+ "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
"dev": true
},
"istanbul-lib-instrument": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz",
- "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz",
+ "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==",
"dev": true,
"requires": {
- "@babel/generator": "^7.0.0",
- "@babel/parser": "^7.0.0",
- "@babel/template": "^7.0.0",
- "@babel/traverse": "^7.0.0",
- "@babel/types": "^7.0.0",
- "istanbul-lib-coverage": "^2.0.3",
- "semver": "^5.5.0"
+ "@babel/core": "^7.7.5",
+ "@babel/parser": "^7.7.5",
+ "@babel/template": "^7.7.4",
+ "@babel/traverse": "^7.7.4",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
},
"dependencies": {
"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
}
}
},
"istanbul-lib-report": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz",
- "integrity": "sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
"dev": true,
"requires": {
- "istanbul-lib-coverage": "^2.0.3",
- "make-dir": "^1.3.0",
- "supports-color": "^6.0.0"
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^3.0.0",
+ "supports-color": "^7.1.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=",
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"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==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
"dev": true,
"requires": {
- "has-flag": "^3.0.0"
+ "has-flag": "^4.0.0"
}
}
}
},
"istanbul-lib-source-maps": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz",
- "integrity": "sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
+ "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
"dev": true,
"requires": {
"debug": "^4.1.1",
- "istanbul-lib-coverage": "^2.0.3",
- "make-dir": "^1.3.0",
- "rimraf": "^2.6.2",
+ "istanbul-lib-coverage": "^3.0.0",
"source-map": "^0.6.1"
},
"dependencies": {
@@ -22543,27 +24270,12 @@
"ms": "^2.1.1"
}
},
- "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"
- }
- },
"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
},
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true
- },
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -22589,241 +24301,592 @@
}
},
"jest": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz",
- "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-25.3.0.tgz",
+ "integrity": "sha512-iKd5ShQSHzFT5IL/6h5RZJhApgqXSoPxhp5HEi94v6OAw9QkF8T7X+liEU2eEHJ1eMFYTHmeWLrpBWulsDpaUg==",
"dev": true,
"requires": {
- "import-local": "^2.0.0",
- "jest-cli": "^24.9.0"
+ "@jest/core": "^25.3.0",
+ "import-local": "^3.0.2",
+ "jest-cli": "^25.3.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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz",
+ "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==",
+ "dev": true,
+ "requires": {
+ "@jest/source-map": "^25.2.6",
+ "chalk": "^3.0.0",
+ "jest-util": "^25.3.0",
+ "slash": "^3.0.0"
+ }
+ },
+ "@jest/core": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.3.0.tgz",
+ "integrity": "sha512-+D5a/tFf6pA/Gqft2DLBp/yeSRgXhlJ+Wpst0X/ZkfTRP54qDR3C61VfHwaex+GzZBiTcE9vQeoZ2v5T10+Mqw==",
+ "dev": true,
+ "requires": {
+ "@jest/console": "^25.3.0",
+ "@jest/reporters": "^25.3.0",
+ "@jest/test-result": "^25.3.0",
+ "@jest/transform": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^3.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.3",
+ "jest-changed-files": "^25.3.0",
+ "jest-config": "^25.3.0",
+ "jest-haste-map": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-regex-util": "^25.2.6",
+ "jest-resolve": "^25.3.0",
+ "jest-resolve-dependencies": "^25.3.0",
+ "jest-runner": "^25.3.0",
+ "jest-runtime": "^25.3.0",
+ "jest-snapshot": "^25.3.0",
+ "jest-util": "^25.3.0",
+ "jest-validate": "^25.3.0",
+ "jest-watcher": "^25.3.0",
+ "micromatch": "^4.0.2",
+ "p-each-series": "^2.1.0",
+ "realpath-native": "^2.0.0",
+ "rimraf": "^3.0.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "@jest/source-map": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz",
+ "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.3",
+ "source-map": "^0.6.0"
+ }
+ },
+ "@jest/test-result": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz",
+ "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==",
+ "dev": true,
+ "requires": {
+ "@jest/console": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ }
+ },
+ "@jest/transform": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.3.0.tgz",
+ "integrity": "sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.1.0",
+ "@jest/types": "^25.3.0",
+ "babel-plugin-istanbul": "^6.0.0",
+ "chalk": "^3.0.0",
+ "convert-source-map": "^1.4.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "graceful-fs": "^4.2.3",
+ "jest-haste-map": "^25.3.0",
+ "jest-regex-util": "^25.2.6",
+ "jest-util": "^25.3.0",
+ "micromatch": "^4.0.2",
+ "pirates": "^4.0.1",
+ "realpath-native": "^2.0.0",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.1",
+ "write-file-atomic": "^3.0.0"
+ }
+ },
+ "ansi-escapes": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+ "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.11.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
"dev": true,
"requires": {
- "@jest/source-map": "^24.9.0",
- "chalk": "^2.0.1",
- "slash": "^2.0.0"
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
}
},
- "@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==",
+ "babel-plugin-istanbul": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
+ "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0"
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^4.0.0",
+ "test-exclude": "^6.0.0"
}
},
- "@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==",
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
- "callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
- "source-map": "^0.6.0"
+ "fill-range": "^7.0.1"
}
},
- "@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==",
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"dev": true,
"requires": {
- "@jest/console": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/istanbul-lib-coverage": "^2.0.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.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==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "color-name": "~1.1.4"
}
},
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "cross-spawn": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz",
+ "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "diff-sequences": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz",
+ "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==",
"dev": true
},
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "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
+ },
+ "execa": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz",
+ "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==",
"dev": true,
"requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.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",
+ "p-finally": "^2.0.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "expect": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-25.3.0.tgz",
+ "integrity": "sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^25.3.0",
+ "ansi-styles": "^4.0.0",
+ "jest-get-type": "^25.2.6",
+ "jest-matcher-utils": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-regex-util": "^25.2.6"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
}
},
"find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"requires": {
- "locate-path": "^3.0.0"
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
}
},
+ "fsevents": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
+ "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
+ "dev": true,
+ "optional": true
+ },
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true
},
+ "get-stream": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
+ "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
+ "dev": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
"graceful-fs": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
"dev": true
},
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "import-local": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
+ "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
+ "dev": true,
+ "requires": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ }
+ },
+ "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
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+ "dev": true
+ },
+ "jest-changed-files": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.3.0.tgz",
+ "integrity": "sha512-eqd5hyLbUjIVvLlJ3vQ/MoPxsxfESVXG9gvU19XXjKzxr+dXmZIqCXiY0OiYaibwlHZBJl2Vebkc0ADEMzCXew==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^25.3.0",
+ "execa": "^3.2.0",
+ "throat": "^5.0.0"
+ }
+ },
"jest-cli": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz",
- "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.3.0.tgz",
+ "integrity": "sha512-XpNQPlW1tzpP7RGG8dxpkRegYDuLjzSiENu92+CYM87nEbmEPb3b4+yo8xcsHOnj0AG7DUt9b3uG8LuHI3MDzw==",
"dev": true,
"requires": {
- "@jest/core": "^24.9.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
- "chalk": "^2.0.1",
+ "@jest/core": "^25.3.0",
+ "@jest/test-result": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
"exit": "^0.1.2",
- "import-local": "^2.0.0",
+ "import-local": "^3.0.2",
"is-ci": "^2.0.0",
- "jest-config": "^24.9.0",
- "jest-util": "^24.9.0",
- "jest-validate": "^24.9.0",
+ "jest-config": "^25.3.0",
+ "jest-util": "^25.3.0",
+ "jest-validate": "^25.3.0",
"prompts": "^2.0.1",
- "realpath-native": "^1.1.0",
- "yargs": "^13.3.0"
+ "realpath-native": "^2.0.0",
+ "yargs": "^15.3.1"
+ }
+ },
+ "jest-diff": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz",
+ "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==",
+ "dev": true,
+ "requires": {
+ "chalk": "^3.0.0",
+ "diff-sequences": "^25.2.6",
+ "jest-get-type": "^25.2.6",
+ "pretty-format": "^25.3.0"
}
},
"jest-get-type": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz",
- "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
+ "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
"dev": true
},
+ "jest-haste-map": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz",
+ "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^25.3.0",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "fsevents": "^2.1.2",
+ "graceful-fs": "^4.2.3",
+ "jest-serializer": "^25.2.6",
+ "jest-util": "^25.3.0",
+ "jest-worker": "^25.2.6",
+ "micromatch": "^4.0.2",
+ "sane": "^4.0.3",
+ "walker": "^1.0.7",
+ "which": "^2.0.2"
+ }
+ },
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz",
+ "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
+ "@jest/types": "^25.3.0",
"@types/stack-utils": "^1.0.1",
- "chalk": "^2.0.1",
- "micromatch": "^3.1.10",
- "slash": "^2.0.0",
+ "chalk": "^3.0.0",
+ "micromatch": "^4.0.2",
+ "slash": "^3.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==",
+ "jest-regex-util": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz",
+ "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==",
+ "dev": true
+ },
+ "jest-resolve": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz",
+ "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^25.3.0",
+ "browser-resolve": "^1.11.3",
+ "chalk": "^3.0.0",
+ "jest-pnp-resolver": "^1.2.1",
+ "realpath-native": "^2.0.0",
+ "resolve": "^1.15.1"
+ }
+ },
+ "jest-serializer": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz",
+ "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==",
+ "dev": true
+ },
+ "jest-snapshot": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.3.0.tgz",
+ "integrity": "sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0"
+ "@babel/types": "^7.0.0",
+ "@jest/types": "^25.3.0",
+ "@types/prettier": "^1.19.0",
+ "chalk": "^3.0.0",
+ "expect": "^25.3.0",
+ "jest-diff": "^25.3.0",
+ "jest-get-type": "^25.2.6",
+ "jest-matcher-utils": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-resolve": "^25.3.0",
+ "make-dir": "^3.0.0",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^25.3.0",
+ "semver": "^6.3.0"
}
},
"jest-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz",
- "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz",
+ "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==",
"dev": true,
"requires": {
- "@jest/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",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
"is-ci": "^2.0.0",
- "mkdirp": "^0.5.1",
- "slash": "^2.0.0",
- "source-map": "^0.6.0"
+ "make-dir": "^3.0.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==",
+ "jest-worker": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz",
+ "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==",
"dev": true,
"requires": {
- "@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"
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
}
},
- "leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
- "locate-path": {
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "normalize-path": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "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": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
+ "path-key": "^3.0.0"
+ }
+ },
+ "onetime": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
+ "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
}
},
+ "p-finally": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
+ "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==",
+ "dev": true
+ },
"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.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
- "p-limit": "^2.0.0"
+ "p-limit": "^2.2.0"
}
},
"p-try": {
@@ -22832,28 +24895,122 @@
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.0.0"
+ }
+ },
"pretty-format": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
- "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz",
+ "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
+ "@jest/types": "^25.3.0",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^16.12.0"
+ }
+ },
+ "pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
}
},
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
+ },
+ "realpath-native": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz",
+ "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==",
+ "dev": true
+ },
"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": {
+ "resolve": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "requires": {
+ "resolve-from": "^5.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ },
+ "shebang-command": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "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
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
"source-map": {
@@ -22863,402 +25020,410 @@
"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==",
+ "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": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.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==",
+ "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": "^4.1.0"
+ "ansi-regex": "^5.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==",
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
+ "has-flag": "^4.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": "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": "^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"
- }
- }
- }
- },
- "jest-changed-files": {
- "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.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==",
+ "test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
}
},
- "@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": "*"
- }
+ "throat": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
+ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
+ "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==",
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
+ "is-number": "^7.0.0"
}
},
- "execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+ "type-fest": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+ "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+ "dev": true
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
- "requires": {
- "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"
+ "requires": {
+ "isexe": "^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==",
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
"requires": {
- "pump": "^3.0.0"
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.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==",
+ "write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
"dev": true,
"requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
}
},
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "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": "15.3.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
+ "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
+ "dev": true,
+ "requires": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.1"
+ }
+ },
+ "yargs-parser": {
+ "version": "18.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz",
+ "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
}
}
},
"jest-config": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz",
- "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.3.0.tgz",
+ "integrity": "sha512-CmF1JnNWFmoCSPC4tnU52wnVBpuxHjilA40qH/03IHxIevkjUInSMwaDeE6ACfxMPTLidBGBCO3EbxvzPbo8wA==",
"dev": true,
"requires": {
"@babel/core": "^7.1.0",
- "@jest/test-sequencer": "^24.9.0",
- "@jest/types": "^24.9.0",
- "babel-jest": "^24.9.0",
- "chalk": "^2.0.1",
+ "@jest/test-sequencer": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "babel-jest": "^25.3.0",
+ "chalk": "^3.0.0",
+ "deepmerge": "^4.2.2",
"glob": "^7.1.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.9.0",
- "jest-util": "^24.9.0",
- "jest-validate": "^24.9.0",
- "micromatch": "^3.1.10",
- "pretty-format": "^24.9.0",
- "realpath-native": "^1.1.0"
+ "jest-environment-jsdom": "^25.3.0",
+ "jest-environment-node": "^25.3.0",
+ "jest-get-type": "^25.2.6",
+ "jest-jasmine2": "^25.3.0",
+ "jest-regex-util": "^25.2.6",
+ "jest-resolve": "^25.3.0",
+ "jest-util": "^25.3.0",
+ "jest-validate": "^25.3.0",
+ "micromatch": "^4.0.2",
+ "pretty-format": "^25.3.0",
+ "realpath-native": "^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"
- }
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
},
- "@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==",
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0"
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
}
},
- "@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==",
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
- "callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
- "source-map": "^0.6.0"
+ "fill-range": "^7.0.1"
}
},
- "@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==",
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"dev": true,
"requires": {
- "@jest/console": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/istanbul-lib-coverage": "^2.0.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "color-name": "~1.1.4"
}
},
- "@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==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "to-regex-range": "^5.0.1"
}
},
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
- "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==",
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
"jest-get-type": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz",
- "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
+ "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
"dev": true
},
- "jest-message-util": {
- "version": "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": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz",
+ "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==",
+ "dev": true
},
"jest-resolve": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
- "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz",
+ "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
+ "@jest/types": "^25.3.0",
"browser-resolve": "^1.11.3",
- "chalk": "^2.0.1",
+ "chalk": "^3.0.0",
"jest-pnp-resolver": "^1.2.1",
- "realpath-native": "^1.1.0"
+ "realpath-native": "^2.0.0",
+ "resolve": "^1.15.1"
}
},
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz",
+ "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==",
"dev": true,
"requires": {
- "@jest/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",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
"is-ci": "^2.0.0",
- "mkdirp": "^0.5.1",
- "slash": "^2.0.0",
- "source-map": "^0.6.0"
+ "make-dir": "^3.0.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==",
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "camelcase": "^5.3.1",
- "chalk": "^2.0.1",
- "jest-get-type": "^24.9.0",
- "leven": "^3.1.0",
- "pretty-format": "^24.9.0"
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
}
},
- "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==",
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
"dev": true
},
"pretty-format": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
- "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz",
+ "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
+ "@jest/types": "^25.3.0",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^16.12.0"
}
},
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"dev": true
},
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "realpath-native": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz",
+ "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==",
"dev": true
+ },
+ "resolve": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
}
}
},
"jest-dev-server": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-4.3.0.tgz",
- "integrity": "sha512-bC9flKY2G1honQ/UI0gEhb0wFnDhpFr7xidC8Nk+evi7TgnNtfsGIzzF2dcIhF1G9BGF0n/M7CJrMAzwQhyTPA==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-4.4.0.tgz",
+ "integrity": "sha512-STEHJ3iPSC8HbrQ3TME0ozGX2KT28lbT4XopPxUm2WimsX3fcB3YOptRh12YphQisMhfqNSNTZUmWyT3HEXS2A==",
"dev": true,
"requires": {
- "chalk": "^2.4.2",
+ "chalk": "^3.0.0",
"cwd": "^0.10.0",
- "find-process": "^1.4.2",
- "prompts": "^2.1.0",
- "spawnd": "^4.0.0",
- "tree-kill": "^1.2.1",
+ "find-process": "^1.4.3",
+ "prompts": "^2.3.0",
+ "spawnd": "^4.4.0",
+ "tree-kill": "^1.2.2",
"wait-on": "^3.3.0"
},
"dependencies": {
- "kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
- "dev": true
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
},
- "prompts": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz",
- "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==",
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "kleur": "^3.0.3",
- "sisteransi": "^1.0.3"
+ "color-name": "~1.1.4"
}
},
- "sisteransi": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz",
- "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
"tree-kill": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
@@ -23267,197 +25432,126 @@
}
}
},
- "jest-diff": {
- "version": "24.7.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.7.0.tgz",
- "integrity": "sha512-ULQZ5B1lWpH70O4xsANC4tf4Ko6RrpwhE3PtG6ERjMg1TiYTC2Wp4IntJVGro6a8HG9luYHhhmF4grF0Pltckg==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1",
- "diff-sequences": "^24.3.0",
- "jest-get-type": "^24.3.0",
- "pretty-format": "^24.7.0"
- }
- },
"jest-docblock": {
- "version": "24.3.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz",
- "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.3.0.tgz",
+ "integrity": "sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==",
"dev": true,
"requires": {
- "detect-newline": "^2.1.0"
+ "detect-newline": "^3.0.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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.3.0.tgz",
+ "integrity": "sha512-aBfS4VOf/Qs95yUlX6d6WBv0szvOcTkTTyCIaLuQGj4bSHsT+Wd9dDngVHrCe5uytxpN8VM+NAloI6nbPjXfXw==",
"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/types": "^25.3.0",
+ "chalk": "^3.0.0",
+ "jest-get-type": "^25.2.6",
+ "jest-util": "^25.3.0",
+ "pretty-format": "^25.3.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"
- }
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
},
- "@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==",
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
- "@jest/console": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/istanbul-lib-coverage": "^2.0.0"
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.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==",
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "color-name": "~1.1.4"
}
},
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
- "graceful-fs": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
- "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
"jest-get-type": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz",
- "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
+ "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
"dev": true
},
- "jest-message-util": {
- "version": "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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz",
+ "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==",
"dev": true,
"requires": {
- "@jest/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",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
"is-ci": "^2.0.0",
- "mkdirp": "^0.5.1",
- "slash": "^2.0.0",
- "source-map": "^0.6.0"
+ "make-dir": "^3.0.0"
}
},
"pretty-format": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
- "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz",
+ "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
+ "@jest/types": "^25.3.0",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^16.12.0"
}
},
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"dev": true
},
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
}
}
},
"jest-emotion": {
- "version": "10.0.17",
- "resolved": "https://registry.npmjs.org/jest-emotion/-/jest-emotion-10.0.17.tgz",
- "integrity": "sha512-Z0SqaeXGr9dshhY5z9ctfPiw2qTw5BRbCsbBWziTtSdiLnqFprj2NuF38lMrpSMFKjNY+q+rioRI5gVyQZrrxA==",
+ "version": "10.0.32",
+ "resolved": "https://registry.npmjs.org/jest-emotion/-/jest-emotion-10.0.32.tgz",
+ "integrity": "sha512-hW3IwWc47qRuxnGsWFGY6uIMX8F4YBzq+Qci3LAYUCUqUBNP+1DU1L5Nudo9Ry0NHVFOqDnDeip1p2UR0kVMwA==",
"dev": true,
"requires": {
"@babel/runtime": "^7.5.5",
@@ -23466,466 +25560,614 @@
"css": "^2.2.1"
},
"dependencies": {
- "@babel/runtime": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.3.tgz",
- "integrity": "sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w==",
- "dev": true,
- "requires": {
- "regenerator-runtime": "^0.13.2"
- }
- },
"@types/jest": {
"version": "23.3.14",
"resolved": "https://registry.npmjs.org/@types/jest/-/jest-23.3.14.tgz",
"integrity": "sha512-Q5hTcfdudEL2yOmluA1zaSyPbzWPmJ3XfSWeP3RyoYvS9hnje1ZyagrZOuQ6+1nQC1Gw+7gap3pLNL3xL6UBug==",
"dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
}
}
},
"jest-environment-jsdom": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz",
- "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.3.0.tgz",
+ "integrity": "sha512-jdE4bQN+k2QEZ9sWOxsqDJvMzbdFSCN/4tw8X0TQaCqyzKz58PyEf41oIr4WO7ERdp7WaJGBSUKF7imR3UW1lg==",
"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": "^25.3.0",
+ "@jest/fake-timers": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "jest-mock": "^25.3.0",
+ "jest-util": "^25.3.0",
+ "jsdom": "^15.2.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==",
+ "@jest/fake-timers": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.3.0.tgz",
+ "integrity": "sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ==",
"dev": true,
"requires": {
- "@jest/source-map": "^24.9.0",
- "chalk": "^2.0.1",
- "slash": "^2.0.0"
+ "@jest/types": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-mock": "^25.3.0",
+ "jest-util": "^25.3.0",
+ "lolex": "^5.0.0"
}
},
- "@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==",
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0"
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
}
},
- "@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==",
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
- "callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
- "source-map": "^0.6.0"
+ "fill-range": "^7.0.1"
}
},
- "@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==",
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"dev": true,
"requires": {
- "@jest/console": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/istanbul-lib-coverage": "^2.0.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "color-name": "~1.1.4"
}
},
- "@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==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "to-regex-range": "^5.0.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==",
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
"jest-message-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
- "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz",
+ "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
+ "@jest/types": "^25.3.0",
"@types/stack-utils": "^1.0.1",
- "chalk": "^2.0.1",
- "micromatch": "^3.1.10",
- "slash": "^2.0.0",
+ "chalk": "^3.0.0",
+ "micromatch": "^4.0.2",
+ "slash": "^3.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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.3.0.tgz",
+ "integrity": "sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0"
+ "@jest/types": "^25.3.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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz",
+ "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==",
"dev": true,
"requires": {
- "@jest/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",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
"is-ci": "^2.0.0",
- "mkdirp": "^0.5.1",
- "slash": "^2.0.0",
- "source-map": "^0.6.0"
+ "make-dir": "^3.0.0"
+ }
+ },
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
}
},
"slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
}
}
},
"jest-environment-node": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz",
- "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.3.0.tgz",
+ "integrity": "sha512-XO09S29Nx1NU7TiMPHMoDIkxoGBuKSTbE+sHp0gXbeLDXhIdhysUI25kOqFFSD9AuDgvPvxWCXrvNqiFsOH33g==",
"dev": true,
"requires": {
- "@jest/environment": "^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/environment": "^25.3.0",
+ "@jest/fake-timers": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "jest-mock": "^25.3.0",
+ "jest-util": "^25.3.0",
+ "semver": "^6.3.0"
},
"dependencies": {
- "@jest/console": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz",
- "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==",
+ "@jest/fake-timers": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.3.0.tgz",
+ "integrity": "sha512-NHAj7WbsyR3qBJPpBwSwqaq2WluIvUQsyzpJTN7XDVk7VnlC/y1BAnaYZL3vbPIP8Nhm0Ae5DJe0KExr/SdMJQ==",
"dev": true,
"requires": {
- "@jest/source-map": "^24.9.0",
- "chalk": "^2.0.1",
- "slash": "^2.0.0"
+ "@jest/types": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-mock": "^25.3.0",
+ "jest-util": "^25.3.0",
+ "lolex": "^5.0.0"
}
},
- "@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==",
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0"
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
}
},
- "@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==",
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
- "callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
- "source-map": "^0.6.0"
+ "fill-range": "^7.0.1"
}
},
- "@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==",
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"dev": true,
"requires": {
- "@jest/console": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/istanbul-lib-coverage": "^2.0.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "color-name": "~1.1.4"
}
},
- "@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==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "to-regex-range": "^5.0.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==",
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
"jest-message-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
- "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz",
+ "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
+ "@jest/types": "^25.3.0",
"@types/stack-utils": "^1.0.1",
- "chalk": "^2.0.1",
- "micromatch": "^3.1.10",
- "slash": "^2.0.0",
+ "chalk": "^3.0.0",
+ "micromatch": "^4.0.2",
+ "slash": "^3.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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.3.0.tgz",
+ "integrity": "sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0"
+ "@jest/types": "^25.3.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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz",
+ "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==",
"dev": true,
"requires": {
- "@jest/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",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
"is-ci": "^2.0.0",
- "mkdirp": "^0.5.1",
- "slash": "^2.0.0",
- "source-map": "^0.6.0"
+ "make-dir": "^3.0.0"
}
},
- "slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"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==",
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
}
}
},
"jest-environment-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==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-4.4.0.tgz",
+ "integrity": "sha512-iV8S8+6qkdTM6OBR/M9gKywEk8GDSOe05hspCs5D8qKSwtmlUfdtHfB4cakdc68lC6YfK3AUsLirpfgodCHjzQ==",
"dev": true,
"requires": {
- "chalk": "^2.4.2",
+ "chalk": "^3.0.0",
"cwd": "^0.10.0",
- "jest-dev-server": "^4.3.0",
+ "jest-dev-server": "^4.4.0",
"merge-deep": "^3.0.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"jest-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-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==",
+ "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.7.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.7.1",
- "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"
},
"dependencies": {
+ "@jest/types": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
+ "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^1.1.1",
+ "@types/yargs": "^13.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "13.0.8",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz",
+ "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
"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-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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.3.0.tgz",
+ "integrity": "sha512-NCYOGE6+HNzYFSui52SefgpsnIzvxjn6KAgqw66BdRp37xpMD/4kujDHLNW5bS5i53os5TcMn6jYrzQRO8VPrQ==",
"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",
+ "@jest/environment": "^25.3.0",
+ "@jest/source-map": "^25.2.6",
+ "@jest/test-result": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
"co": "^4.6.0",
- "expect": "^24.9.0",
+ "expect": "^25.3.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-each": "^25.3.0",
+ "jest-matcher-utils": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-runtime": "^25.3.0",
+ "jest-snapshot": "^25.3.0",
+ "jest-util": "^25.3.0",
+ "pretty-format": "^25.3.0",
+ "throat": "^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/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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz",
+ "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0"
+ "@jest/source-map": "^25.2.6",
+ "chalk": "^3.0.0",
+ "jest-util": "^25.3.0",
+ "slash": "^3.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==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz",
+ "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==",
"dev": true,
"requires": {
"callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
+ "graceful-fs": "^4.2.3",
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz",
+ "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==",
"dev": true,
"requires": {
- "@jest/console": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/istanbul-lib-coverage": "^2.0.0"
+ "@jest/console": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.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==",
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
}
},
- "@types/yargs": {
- "version": "13.0.4",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz",
- "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==",
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "fill-range": "^7.0.1"
}
},
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"diff-sequences": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz",
- "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz",
+ "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==",
"dev": true
},
"expect": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz",
- "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-25.3.0.tgz",
+ "integrity": "sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "ansi-styles": "^3.2.0",
- "jest-get-type": "^24.9.0",
- "jest-matcher-utils": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-regex-util": "^24.9.0"
+ "@jest/types": "^25.3.0",
+ "ansi-styles": "^4.0.0",
+ "jest-get-type": "^25.2.6",
+ "jest-matcher-utils": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-regex-util": "^25.2.6"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
}
},
"graceful-fs": {
@@ -23934,120 +26176,273 @@
"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
"dev": true
},
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
"jest-diff": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz",
- "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz",
+ "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==",
"dev": true,
"requires": {
- "chalk": "^2.0.1",
- "diff-sequences": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "pretty-format": "^24.9.0"
+ "chalk": "^3.0.0",
+ "diff-sequences": "^25.2.6",
+ "jest-get-type": "^25.2.6",
+ "pretty-format": "^25.3.0"
}
},
"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==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
+ "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
"dev": true
},
- "jest-matcher-utils": {
- "version": "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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz",
+ "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
+ "@jest/types": "^25.3.0",
"@types/stack-utils": "^1.0.1",
- "chalk": "^2.0.1",
- "micromatch": "^3.1.10",
- "slash": "^2.0.0",
+ "chalk": "^3.0.0",
+ "micromatch": "^4.0.2",
+ "slash": "^3.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==",
+ "jest-regex-util": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz",
+ "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==",
+ "dev": true
+ },
+ "jest-resolve": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz",
+ "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0"
+ "@jest/types": "^25.3.0",
+ "browser-resolve": "^1.11.3",
+ "chalk": "^3.0.0",
+ "jest-pnp-resolver": "^1.2.1",
+ "realpath-native": "^2.0.0",
+ "resolve": "^1.15.1"
}
},
- "jest-regex-util": {
+ "jest-snapshot": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.3.0.tgz",
+ "integrity": "sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0",
+ "@jest/types": "^25.3.0",
+ "@types/prettier": "^1.19.0",
+ "chalk": "^3.0.0",
+ "expect": "^25.3.0",
+ "jest-diff": "^25.3.0",
+ "jest-get-type": "^25.2.6",
+ "jest-matcher-utils": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-resolve": "^25.3.0",
+ "make-dir": "^3.0.0",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^25.3.0",
+ "semver": "^6.3.0"
+ }
+ },
+ "jest-util": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz",
+ "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
+ "is-ci": "^2.0.0",
+ "make-dir": "^3.0.0"
+ }
+ },
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ }
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz",
+ "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^25.3.0",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^16.12.0"
+ }
+ },
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
+ },
+ "realpath-native": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz",
+ "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "throat": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
+ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ }
+ }
+ },
+ "jest-junit": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-10.0.0.tgz",
+ "integrity": "sha512-dbOVRyxHprdSpwSAR9/YshLwmnwf+RSl5hf0kCGlhAcEeZY9aRqo4oNmaT0tLC16Zy9D0zekDjWkjHGjXlglaQ==",
+ "dev": true,
+ "requires": {
+ "jest-validate": "^24.9.0",
+ "mkdirp": "^0.5.1",
+ "strip-ansi": "^5.2.0",
+ "uuid": "^3.3.3",
+ "xml": "^1.0.1"
+ },
+ "dependencies": {
+ "@jest/types": {
"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==",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
+ "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^1.1.1",
+ "@types/yargs": "^13.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "13.0.8",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz",
+ "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
- "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==",
+ "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": {
- "@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"
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
}
},
- "jest-snapshot": {
+ "jest-validate": {
"version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz",
- "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz",
+ "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==",
"dev": true,
"requires": {
- "@babel/types": "^7.0.0",
"@jest/types": "^24.9.0",
+ "camelcase": "^5.3.1",
"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"
+ "leven": "^3.1.0",
+ "pretty-format": "^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"
- }
+ "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",
@@ -24061,115 +26456,211 @@
"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
+ "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"
+ }
},
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.3.0.tgz",
+ "integrity": "sha512-jk7k24dMIfk8LUSQQGN8PyOy9+J0NAfHZWiDmUDYVMctY8FLJQ1eQ8+PjMoN8PgwhLIggUqgYJnyRFvUz3jLRw==",
"dev": true,
"requires": {
- "jest-get-type": "^24.9.0",
- "pretty-format": "^24.9.0"
+ "jest-get-type": "^25.2.6",
+ "pretty-format": "^25.3.0"
},
"dependencies": {
- "@jest/types": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
- "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
}
},
- "@types/yargs": {
- "version": "13.0.4",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.4.tgz",
- "integrity": "sha512-Ke1WmBbIkVM8bpvsNEcGgQM70XcEh/nbpxQhW7FhrsbCsXSY9BmLB1+LHtD7r9zrsOcFlLiF+a/UeJsdfw3C5A==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "color-name": "~1.1.4"
}
},
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"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==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
+ "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
"dev": true
},
"pretty-format": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
- "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz",
+ "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
+ "@jest/types": "^25.3.0",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^16.12.0"
}
+ },
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
}
}
},
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.3.0.tgz",
+ "integrity": "sha512-ZBUJ2fchNIZt+fyzkuCFBb8SKaU//Rln45augfUtbHaGyVxCO++ANARdBK9oPGXU3hEDgyy7UHnOP/qNOJXFUg==",
"dev": true,
"requires": {
- "chalk": "^2.0.1",
- "jest-diff": "^24.7.0",
- "jest-get-type": "^24.3.0",
- "pretty-format": "^24.7.0"
+ "chalk": "^3.0.0",
+ "jest-diff": "^25.3.0",
+ "jest-get-type": "^25.2.6",
+ "pretty-format": "^25.3.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "diff-sequences": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz",
+ "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "jest-diff": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz",
+ "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==",
+ "dev": true,
+ "requires": {
+ "chalk": "^3.0.0",
+ "diff-sequences": "^25.2.6",
+ "jest-get-type": "^25.2.6",
+ "pretty-format": "^25.3.0"
+ }
+ },
+ "jest-get-type": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
+ "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz",
+ "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^25.3.0",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^16.12.0"
+ }
+ },
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
}
},
"jest-message-util": {
- "version": "24.7.1",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.7.1.tgz",
- "integrity": "sha512-dk0gqVtyqezCHbcbk60CdIf+8UHgD+lmRHifeH3JRcnAqh4nEyPytSc9/L1+cQyxC+ceaeP696N4ATe7L+omcg==",
+ "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.7.1",
- "@jest/types": "^24.7.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",
@@ -24177,6 +26668,37 @@
"stack-utils": "^1.0.1"
},
"dependencies": {
+ "@jest/types": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
+ "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^1.1.1",
+ "@types/yargs": "^13.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "13.0.8",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz",
+ "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "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"
+ }
+ },
"slash": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
@@ -24186,47 +26708,12 @@
}
},
"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==",
+ "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",
- "browser-resolve": "^1.11.3",
- "chalk": "^2.0.1",
- "jest-pnp-resolver": "^1.2.1",
- "realpath-native": "^1.1.0"
+ "@jest/types": "^24.9.0"
},
"dependencies": {
"@jest/types": {
@@ -24241,9 +26728,9 @@
}
},
"@types/yargs": {
- "version": "13.0.6",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.6.tgz",
- "integrity": "sha512-IkltIncDQWv6fcAvnHtJ6KtkmY/vtR3bViOaCzpj/A3yNhlfZAgxNe6AEQD1cQrkYD+YsKVo08DSxvNKEsD7BA==",
+ "version": "13.0.8",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz",
+ "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==",
"dev": true,
"requires": {
"@types/yargs-parser": "*"
@@ -24251,200 +26738,252 @@
}
}
},
- "jest-resolve-dependencies": {
+ "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.4.0",
+ "resolved": "https://registry.npmjs.org/jest-puppeteer/-/jest-puppeteer-4.4.0.tgz",
+ "integrity": "sha512-ZaiCTlPZ07B9HW0erAWNX6cyzBqbXMM7d2ugai4epBDKpKvRDpItlRQC6XjERoJELKZsPziFGS0OhhUvTvQAXA==",
+ "dev": true,
+ "requires": {
+ "expect-puppeteer": "^4.4.0",
+ "jest-environment-puppeteer": "^4.4.0"
+ }
+ },
+ "jest-regex-util": {
"version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz",
- "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==",
+ "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-dependencies": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.3.0.tgz",
+ "integrity": "sha512-bDUlLYmHW+f7J7KgcY2lkq8EMRqKonRl0XoD4Wp5SJkgAxKJnsaIOlrrVNTfXYf+YOu3VCjm/Ac2hPF2nfsCIA==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-regex-util": "^24.3.0",
- "jest-snapshot": "^24.9.0"
+ "@jest/types": "^25.3.0",
+ "jest-regex-util": "^25.2.6",
+ "jest-snapshot": "^25.3.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"
- }
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
},
- "@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==",
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
- "callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
- "source-map": "^0.6.0"
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
}
},
- "@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==",
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
- "@jest/console": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/istanbul-lib-coverage": "^2.0.0"
+ "fill-range": "^7.0.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==",
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.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==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "color-name": "~1.1.4"
}
},
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
"diff-sequences": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz",
- "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz",
+ "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==",
"dev": true
},
"expect": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz",
- "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-25.3.0.tgz",
+ "integrity": "sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "ansi-styles": "^3.2.0",
- "jest-get-type": "^24.9.0",
- "jest-matcher-utils": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-regex-util": "^24.9.0"
- },
- "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
- }
+ "@jest/types": "^25.3.0",
+ "ansi-styles": "^4.0.0",
+ "jest-get-type": "^25.2.6",
+ "jest-matcher-utils": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-regex-util": "^25.2.6"
}
},
- "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==",
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"requires": {
- "chalk": "^2.0.1",
- "diff-sequences": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "pretty-format": "^24.9.0"
+ "to-regex-range": "^5.0.1"
}
},
- "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==",
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
- "jest-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==",
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "jest-diff": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz",
+ "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==",
"dev": true,
"requires": {
- "chalk": "^2.0.1",
- "jest-diff": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "pretty-format": "^24.9.0"
+ "chalk": "^3.0.0",
+ "diff-sequences": "^25.2.6",
+ "jest-get-type": "^25.2.6",
+ "pretty-format": "^25.3.0"
}
},
+ "jest-get-type": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
+ "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
+ "dev": true
+ },
"jest-message-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
- "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz",
+ "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
+ "@jest/types": "^25.3.0",
"@types/stack-utils": "^1.0.1",
- "chalk": "^2.0.1",
- "micromatch": "^3.1.10",
- "slash": "^2.0.0",
+ "chalk": "^3.0.0",
+ "micromatch": "^4.0.2",
+ "slash": "^3.0.0",
"stack-utils": "^1.0.1"
}
},
+ "jest-regex-util": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz",
+ "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==",
+ "dev": true
+ },
"jest-resolve": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
- "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz",
+ "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
+ "@jest/types": "^25.3.0",
"browser-resolve": "^1.11.3",
- "chalk": "^2.0.1",
+ "chalk": "^3.0.0",
"jest-pnp-resolver": "^1.2.1",
- "realpath-native": "^1.1.0"
+ "realpath-native": "^2.0.0",
+ "resolve": "^1.15.1"
}
},
"jest-snapshot": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz",
- "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.3.0.tgz",
+ "integrity": "sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg==",
"dev": true,
"requires": {
"@babel/types": "^7.0.0",
- "@jest/types": "^24.9.0",
- "chalk": "^2.0.1",
- "expect": "^24.9.0",
- "jest-diff": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "jest-matcher-utils": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-resolve": "^24.9.0",
- "mkdirp": "^0.5.1",
+ "@jest/types": "^25.3.0",
+ "@types/prettier": "^1.19.0",
+ "chalk": "^3.0.0",
+ "expect": "^25.3.0",
+ "jest-diff": "^25.3.0",
+ "jest-get-type": "^25.2.6",
+ "jest-matcher-utils": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-resolve": "^25.3.0",
+ "make-dir": "^3.0.0",
"natural-compare": "^1.4.0",
- "pretty-format": "^24.9.0",
- "semver": "^6.2.0"
+ "pretty-format": "^25.3.0",
+ "semver": "^6.3.0"
+ }
+ },
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
}
},
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
"pretty-format": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
- "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz",
+ "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
+ "@jest/types": "^25.3.0",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^16.12.0"
+ }
+ },
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
+ },
+ "realpath-native": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz",
+ "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
}
},
"semver": {
@@ -24454,225 +26993,256 @@
"dev": true
},
"slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
}
}
},
"jest-runner": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz",
- "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.3.0.tgz",
+ "integrity": "sha512-csDqSC9qGHYWDrzrElzEgFbteztFeZJmKhSgY5jlCIcN0+PhActzRNku0DA1Xa1HxGOb0/AfbP1EGJlP4fGPtA==",
"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",
+ "@jest/console": "^25.3.0",
+ "@jest/environment": "^25.3.0",
+ "@jest/test-result": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
"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",
+ "graceful-fs": "^4.2.3",
+ "jest-config": "^25.3.0",
+ "jest-docblock": "^25.3.0",
+ "jest-haste-map": "^25.3.0",
+ "jest-jasmine2": "^25.3.0",
+ "jest-leak-detector": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-resolve": "^25.3.0",
+ "jest-runtime": "^25.3.0",
+ "jest-util": "^25.3.0",
+ "jest-worker": "^25.2.6",
"source-map-support": "^0.5.6",
- "throat": "^4.0.0"
+ "throat": "^5.0.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==",
+ "@jest/console": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz",
+ "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0"
+ "@jest/source-map": "^25.2.6",
+ "chalk": "^3.0.0",
+ "jest-util": "^25.3.0",
+ "slash": "^3.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==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz",
+ "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==",
"dev": true,
"requires": {
"callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
+ "graceful-fs": "^4.2.3",
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz",
+ "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==",
"dev": true,
"requires": {
- "@jest/console": "^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/console": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.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==",
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "color-name": "~1.1.4"
}
},
- "@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==",
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "to-regex-range": "^5.0.1"
}
},
+ "fsevents": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
+ "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
+ "dev": true,
+ "optional": true
+ },
"graceful-fs": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
"dev": true
},
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
"jest-haste-map": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz",
- "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz",
+ "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "anymatch": "^2.0.0",
+ "@jest/types": "^25.3.0",
+ "anymatch": "^3.0.3",
"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",
+ "fsevents": "^2.1.2",
+ "graceful-fs": "^4.2.3",
+ "jest-serializer": "^25.2.6",
+ "jest-util": "^25.3.0",
+ "jest-worker": "^25.2.6",
+ "micromatch": "^4.0.2",
"sane": "^4.0.3",
- "walker": "^1.0.7"
- },
- "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"
- }
- }
+ "walker": "^1.0.7",
+ "which": "^2.0.2"
}
},
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz",
+ "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
+ "@jest/types": "^25.3.0",
"@types/stack-utils": "^1.0.1",
- "chalk": "^2.0.1",
- "micromatch": "^3.1.10",
- "slash": "^2.0.0",
+ "chalk": "^3.0.0",
+ "micromatch": "^4.0.2",
+ "slash": "^3.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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz",
+ "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
+ "@jest/types": "^25.3.0",
"browser-resolve": "^1.11.3",
- "chalk": "^2.0.1",
+ "chalk": "^3.0.0",
"jest-pnp-resolver": "^1.2.1",
- "realpath-native": "^1.1.0"
+ "realpath-native": "^2.0.0",
+ "resolve": "^1.15.1"
}
},
"jest-serializer": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz",
- "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz",
+ "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==",
"dev": true
},
"jest-util": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz",
- "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz",
+ "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==",
"dev": true,
"requires": {
- "@jest/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",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
"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"
- }
- }
+ "make-dir": "^3.0.0"
+ }
+ },
+ "jest-worker": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz",
+ "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==",
+ "dev": true,
+ "requires": {
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
}
},
"merge-stream": {
@@ -24681,10 +27251,47 @@
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
- "slash": {
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "realpath-native": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz",
+ "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
"source-map": {
@@ -24694,173 +27301,274 @@
"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==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
"dev": true,
"requires": {
- "has-flag": "^3.0.0"
+ "has-flag": "^4.0.0"
+ }
+ },
+ "throat": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
+ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
}
}
}
},
"jest-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",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.3.0.tgz",
+ "integrity": "sha512-gn5KYB1wxXRM3nfw8fVpthFu60vxQUCr+ShGq41+ZBFF3DRHZRKj3HDWVAVB4iTNBj2y04QeAo5cZ/boYaPg0w==",
+ "dev": true,
+ "requires": {
+ "@jest/console": "^25.3.0",
+ "@jest/environment": "^25.3.0",
+ "@jest/source-map": "^25.2.6",
+ "@jest/test-result": "^25.3.0",
+ "@jest/transform": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "@types/yargs": "^15.0.0",
+ "chalk": "^3.0.0",
+ "collect-v8-coverage": "^1.0.0",
"exit": "^0.1.2",
"glob": "^7.1.3",
- "graceful-fs": "^4.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"
+ "graceful-fs": "^4.2.3",
+ "jest-config": "^25.3.0",
+ "jest-haste-map": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-mock": "^25.3.0",
+ "jest-regex-util": "^25.2.6",
+ "jest-resolve": "^25.3.0",
+ "jest-snapshot": "^25.3.0",
+ "jest-util": "^25.3.0",
+ "jest-validate": "^25.3.0",
+ "realpath-native": "^2.0.0",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0",
+ "yargs": "^15.3.1"
},
"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==",
+ "@jest/console": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz",
+ "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0"
+ "@jest/source-map": "^25.2.6",
+ "chalk": "^3.0.0",
+ "jest-util": "^25.3.0",
+ "slash": "^3.0.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==",
+ "@jest/source-map": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz",
+ "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==",
"dev": true,
"requires": {
- "@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"
- }
- }
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.3",
+ "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==",
+ "@jest/test-result": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz",
+ "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==",
"dev": true,
"requires": {
+ "@jest/console": "^25.3.0",
+ "@jest/types": "^25.3.0",
"@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "collect-v8-coverage": "^1.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==",
+ "@jest/transform": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.3.0.tgz",
+ "integrity": "sha512-W01p8kTDvvEX6kd0tJc7Y5VdYyFaKwNWy1HQz6Jqlhu48z/8Gxp+yFCDVj+H8Rc7ezl3Mg0hDaGuFVkmHOqirg==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "@babel/core": "^7.1.0",
+ "@jest/types": "^25.3.0",
+ "babel-plugin-istanbul": "^6.0.0",
+ "chalk": "^3.0.0",
+ "convert-source-map": "^1.4.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "graceful-fs": "^4.2.3",
+ "jest-haste-map": "^25.3.0",
+ "jest-regex-util": "^25.2.6",
+ "jest-util": "^25.3.0",
+ "micromatch": "^4.0.2",
+ "pirates": "^4.0.1",
+ "realpath-native": "^2.0.0",
+ "slash": "^3.0.0",
+ "source-map": "^0.6.1",
+ "write-file-atomic": "^3.0.0"
}
},
"ansi-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
},
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "babel-plugin-istanbul": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
+ "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^4.0.0",
+ "test-exclude": "^6.0.0"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
"cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"dev": true,
"requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
}
},
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
"diff-sequences": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz",
- "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz",
+ "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==",
+ "dev": true
+ },
+ "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
},
"expect": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz",
- "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-25.3.0.tgz",
+ "integrity": "sha512-buboTXML2h/L0Kh44Ys2Cx49mX20ISc5KDirkxIs3Q9AJv0kazweUAbukegr+nHDOvFRKmxdojjIHCjqAceYfg==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "ansi-styles": "^3.2.0",
- "jest-get-type": "^24.9.0",
- "jest-matcher-utils": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-regex-util": "^24.9.0"
- },
- "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
- }
+ "@jest/types": "^25.3.0",
+ "ansi-styles": "^4.0.0",
+ "jest-get-type": "^25.2.6",
+ "jest-matcher-utils": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-regex-util": "^25.2.6"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
}
},
"find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"requires": {
- "locate-path": "^3.0.0"
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
}
},
+ "fsevents": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
+ "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
+ "dev": true,
+ "optional": true
+ },
"get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@@ -24887,203 +27595,163 @@
"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
"dev": true
},
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "is-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
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
"jest-diff": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz",
- "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.3.0.tgz",
+ "integrity": "sha512-vyvs6RPoVdiwARwY4kqFWd4PirPLm2dmmkNzKqo38uZOzJvLee87yzDjIZLmY1SjM3XR5DwsUH+cdQ12vgqi1w==",
"dev": true,
"requires": {
- "chalk": "^2.0.1",
- "diff-sequences": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "pretty-format": "^24.9.0"
+ "chalk": "^3.0.0",
+ "diff-sequences": "^25.2.6",
+ "jest-get-type": "^25.2.6",
+ "pretty-format": "^25.3.0"
}
},
"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==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
+ "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
"dev": true
},
"jest-haste-map": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz",
- "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.3.0.tgz",
+ "integrity": "sha512-LjXaRa+F8wwtSxo9G+hHD/Cp63PPQzvaBL9XCVoJD2rrcJO0Zr2+YYzAFWWYJ5GlPUkoaJFJtOuk0sL6MJY80A==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "anymatch": "^2.0.0",
+ "@jest/types": "^25.3.0",
+ "anymatch": "^3.0.3",
"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",
+ "fsevents": "^2.1.2",
+ "graceful-fs": "^4.2.3",
+ "jest-serializer": "^25.2.6",
+ "jest-util": "^25.3.0",
+ "jest-worker": "^25.2.6",
+ "micromatch": "^4.0.2",
"sane": "^4.0.3",
- "walker": "^1.0.7"
- }
- },
- "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"
+ "walker": "^1.0.7",
+ "which": "^2.0.2"
}
},
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.3.0.tgz",
+ "integrity": "sha512-5QNy9Id4WxJbRITEbA1T1kem9bk7y2fD0updZMSTNHtbEDnYOGLDPAuFBhFgVmOZpv0n6OMdVkK+WhyXEPCcOw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@jest/test-result": "^24.9.0",
- "@jest/types": "^24.9.0",
+ "@jest/types": "^25.3.0",
"@types/stack-utils": "^1.0.1",
- "chalk": "^2.0.1",
- "micromatch": "^3.1.10",
- "slash": "^2.0.0",
+ "chalk": "^3.0.0",
+ "micromatch": "^4.0.2",
+ "slash": "^3.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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.3.0.tgz",
+ "integrity": "sha512-yRn6GbuqB4j3aYu+Z1ezwRiZfp0o9om5uOcBovVtkcRLeBCNP5mT0ysdenUsxAHnQUgGwPOE1wwhtQYe6NKirQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0"
+ "@jest/types": "^25.3.0"
}
},
+ "jest-regex-util": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz",
+ "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==",
+ "dev": true
+ },
"jest-resolve": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
- "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.3.0.tgz",
+ "integrity": "sha512-IHoQAAybulsJ+ZgWis+ekYKDAoFkVH5Nx/znpb41zRtpxj4fr2WNV9iDqavdSm8GIpMlsfZxbC/fV9DhW0q9VQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
+ "@jest/types": "^25.3.0",
"browser-resolve": "^1.11.3",
- "chalk": "^2.0.1",
+ "chalk": "^3.0.0",
"jest-pnp-resolver": "^1.2.1",
- "realpath-native": "^1.1.0"
+ "realpath-native": "^2.0.0",
+ "resolve": "^1.15.1"
}
},
"jest-serializer": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz",
- "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz",
+ "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==",
"dev": true
},
"jest-snapshot": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz",
- "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.3.0.tgz",
+ "integrity": "sha512-GGpR6Oro2htJPKh5RX4PR1xwo5jCEjtvSPLW1IS7N85y+2bWKbiknHpJJRKSdGXghElb5hWaeQASJI4IiRayGg==",
"dev": true,
"requires": {
"@babel/types": "^7.0.0",
- "@jest/types": "^24.9.0",
- "chalk": "^2.0.1",
- "expect": "^24.9.0",
- "jest-diff": "^24.9.0",
- "jest-get-type": "^24.9.0",
- "jest-matcher-utils": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-resolve": "^24.9.0",
- "mkdirp": "^0.5.1",
+ "@jest/types": "^25.3.0",
+ "@types/prettier": "^1.19.0",
+ "chalk": "^3.0.0",
+ "expect": "^25.3.0",
+ "jest-diff": "^25.3.0",
+ "jest-get-type": "^25.2.6",
+ "jest-matcher-utils": "^25.3.0",
+ "jest-message-util": "^25.3.0",
+ "jest-resolve": "^25.3.0",
+ "make-dir": "^3.0.0",
"natural-compare": "^1.4.0",
- "pretty-format": "^24.9.0",
- "semver": "^6.2.0"
+ "pretty-format": "^25.3.0",
+ "semver": "^6.3.0"
}
},
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz",
+ "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==",
"dev": true,
"requires": {
- "@jest/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",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
"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"
- }
- }
- }
- },
- "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"
+ "make-dir": "^3.0.0"
}
},
"jest-worker": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz",
- "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz",
+ "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==",
"dev": true,
"requires": {
"merge-stream": "^2.0.0",
- "supports-color": "^6.1.0"
+ "supports-color": "^7.0.0"
}
},
- "leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
- "dev": true
- },
"locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
+ "p-locate": "^4.1.0"
}
},
"merge-stream": {
@@ -25092,22 +27760,38 @@
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true
},
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
"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.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
- "p-limit": "^2.0.0"
+ "p-limit": "^2.2.0"
}
},
"p-try": {
@@ -25116,24 +27800,57 @@
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
"pretty-format": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
- "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz",
+ "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
+ "@jest/types": "^25.3.0",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^16.12.0"
}
},
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
+ },
+ "realpath-native": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz",
+ "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==",
+ "dev": true
+ },
"require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"dev": true
},
+ "resolve": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -25141,9 +27858,9 @@
"dev": true
},
"slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
"source-map": {
@@ -25153,49 +27870,90 @@
"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==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
"dev": true,
"requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
}
},
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
"requires": {
- "ansi-regex": "^4.1.0"
+ "is-number": "^7.0.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==",
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"requires": {
- "has-flag": "^3.0.0"
+ "isexe": "^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==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
+ "requires": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
}
},
"y18n": {
@@ -25205,29 +27963,40 @@
"dev": true
},
"yargs": {
- "version": "13.3.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
- "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
+ "version": "15.3.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz",
+ "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==",
"dev": true,
"requires": {
- "cliui": "^5.0.0",
- "find-up": "^3.0.0",
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
"get-caller-file": "^2.0.1",
"require-directory": "^2.1.1",
"require-main-filename": "^2.0.0",
"set-blocking": "^2.0.0",
- "string-width": "^3.0.0",
+ "string-width": "^4.2.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
- "yargs-parser": "^13.1.1"
+ "yargs-parser": "^18.1.1"
+ }
+ },
+ "yargs-parser": {
+ "version": "18.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz",
+ "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
}
}
}
},
"jest-serializer": {
- "version": "24.4.0",
- "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz",
- "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==",
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz",
+ "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==",
"dev": true
},
"jest-serializer-enzyme": {
@@ -25256,60 +28025,26 @@
}
}
},
- "jest-snapshot": {
+ "jest-util": {
"version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz",
- "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz",
+ "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==",
"dev": true,
"requires": {
- "@babel/types": "^7.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",
- "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",
+ "graceful-fs": "^4.1.15",
+ "is-ci": "^2.0.0",
"mkdirp": "^0.5.1",
- "natural-compare": "^1.4.0",
- "pretty-format": "^24.9.0",
- "semver": "^6.2.0"
+ "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"
- }
- },
- "@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",
@@ -25322,139 +28057,25 @@
}
},
"@types/yargs": {
- "version": "13.0.6",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.6.tgz",
- "integrity": "sha512-IkltIncDQWv6fcAvnHtJ6KtkmY/vtR3bViOaCzpj/A3yNhlfZAgxNe6AEQD1cQrkYD+YsKVo08DSxvNKEsD7BA==",
+ "version": "13.0.8",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz",
+ "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==",
"dev": true,
"requires": {
"@types/yargs-parser": "*"
}
},
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "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==",
+ "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": {
- "@jest/types": "^24.9.0",
- "ansi-regex": "^4.0.0",
- "ansi-styles": "^3.2.0",
- "react-is": "^16.8.4"
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
}
},
- "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-specific-snapshot": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/jest-specific-snapshot/-/jest-specific-snapshot-2.0.0.tgz",
- "integrity": "sha512-aXaNqBg/svwEpY5iQEzEHc5I85cUBKgfeVka9KmpznxLnatpjiqjr7QLb/BYNYlsrZjZzgRHTjQJ+Svx+dbdvg==",
- "dev": true,
- "requires": {
- "jest-snapshot": "^24.1.0"
- }
- },
- "jest-util": {
- "version": "24.7.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.7.1.tgz",
- "integrity": "sha512-/KilOue2n2rZ5AnEBYoxOXkeTu6vi7cjgQ8MXEkih0oeAXT6JkS3fr7/j8+engCjciOU1Nq5loMSKe0A1oeX0A==",
- "dev": true,
- "requires": {
- "@jest/console": "^24.7.1",
- "@jest/fake-timers": "^24.7.1",
- "@jest/source-map": "^24.3.0",
- "@jest/test-result": "^24.7.1",
- "@jest/types": "^24.7.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": {
"graceful-fs": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
@@ -25476,161 +28097,234 @@
}
},
"jest-validate": {
- "version": "24.7.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.7.0.tgz",
- "integrity": "sha512-cgai/gts9B2chz1rqVdmLhzYxQbgQurh1PEQSvSgPZ8KGa1AqXsqC45W5wKEwzxKrWqypuQrQxnF4+G9VejJJA==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.3.0.tgz",
+ "integrity": "sha512-3WuXgIZ4HXUvW6gk9twFFkT9j6zUorKnF2oEY8VEsHb7x5LGvVlN3WUsbqazVKuyXwvikO2zFJ/YTySMsMje2w==",
"dev": true,
"requires": {
- "@jest/types": "^24.7.0",
- "camelcase": "^5.0.0",
- "chalk": "^2.0.1",
- "jest-get-type": "^24.3.0",
- "leven": "^2.1.0",
- "pretty-format": "^24.7.0"
+ "@jest/types": "^25.3.0",
+ "camelcase": "^5.3.1",
+ "chalk": "^3.0.0",
+ "jest-get-type": "^25.2.6",
+ "leven": "^3.1.0",
+ "pretty-format": "^25.3.0"
},
"dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "jest-get-type": {
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
+ "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
+ "dev": true
+ },
+ "leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.3.0.tgz",
+ "integrity": "sha512-wToHwF8bkQknIcFkBqNfKu4+UZqnrLn/Vr+wwKQwwvPzkBfDDKp/qIabFqdgtoi5PEnM8LFByVsOrHoa3SpTVA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^25.3.0",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^16.12.0"
+ }
+ },
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
}
}
},
"jest-watcher": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz",
- "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.3.0.tgz",
+ "integrity": "sha512-dtFkfidFCS9Ucv8azOg2hkiY3sgJEHeTLtGFHS+jfBEE7eRtrO6+2r1BokyDkaG2FOD7485r/SgpC1MFAENfeA==",
"dev": true,
"requires": {
- "@jest/test-result": "^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.9.0",
- "string-length": "^2.0.0"
+ "@jest/test-result": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^3.0.0",
+ "jest-util": "^25.3.0",
+ "string-length": "^3.1.0"
},
"dependencies": {
"@jest/console": {
- "version": "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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.3.0.tgz",
+ "integrity": "sha512-LvSDNqpmZIZyweFaEQ6wKY7CbexPitlsLHGJtcooNECo0An/w49rFhjCJzu6efeb6+a3ee946xss1Jcd9r03UQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0",
- "jest-message-util": "^24.9.0",
- "jest-mock": "^24.9.0"
+ "@jest/source-map": "^25.2.6",
+ "chalk": "^3.0.0",
+ "jest-util": "^25.3.0",
+ "slash": "^3.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==",
+ "version": "25.2.6",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz",
+ "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==",
"dev": true,
"requires": {
"callsites": "^3.0.0",
- "graceful-fs": "^4.1.15",
+ "graceful-fs": "^4.2.3",
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.3.0.tgz",
+ "integrity": "sha512-mqrGuiiPXl1ap09Mydg4O782F3ouDQfsKqtQzIjitpwv3t1cHDwCto21jThw6WRRE+dKcWQvLG70GpyLJICfGw==",
"dev": true,
"requires": {
- "@jest/console": "^24.9.0",
- "@jest/types": "^24.9.0",
- "@types/istanbul-lib-coverage": "^2.0.0"
+ "@jest/console": "^25.3.0",
+ "@jest/types": "^25.3.0",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.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==",
+ "ansi-escapes": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+ "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
"dev": true,
"requires": {
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^1.1.1",
- "@types/yargs": "^13.0.0"
+ "type-fest": "^0.11.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==",
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"dev": true,
"requires": {
- "@types/yargs-parser": "*"
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
}
},
- "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==",
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"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"
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
}
},
- "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==",
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"requires": {
- "@jest/types": "^24.9.0"
+ "color-name": "~1.1.4"
}
},
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
+ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
"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==",
+ "version": "25.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.3.0.tgz",
+ "integrity": "sha512-dc625P/KS/CpWTJJJxKc4bA3A6c+PJGBAqS8JTJqx4HqPoKNqXg/Ec8biL2Z1TabwK7E7Ilf0/ukSEXM1VwzNA==",
"dev": true,
"requires": {
- "@jest/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",
+ "@jest/types": "^25.3.0",
+ "chalk": "^3.0.0",
"is-ci": "^2.0.0",
- "mkdirp": "^0.5.1",
- "slash": "^2.0.0",
- "source-map": "^0.6.0"
+ "make-dir": "^3.0.0"
}
},
"slash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
- "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
"source-map": {
@@ -25638,19 +28332,40 @@
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "type-fest": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+ "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+ "dev": true
}
}
},
"jest-worker": {
- "version": "24.6.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz",
- "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==",
+ "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": "^1.0.1",
+ "merge-stream": "^2.0.0",
"supports-color": "^6.1.0"
},
"dependencies": {
+ "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
+ },
"supports-color": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
@@ -25787,80 +28502,213 @@
}
},
"jsdoctypeparser": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-5.0.1.tgz",
- "integrity": "sha512-dYwcK6TKzvq+ZKtbp4sbQSW9JMo6s+4YFfUs5D/K7bZsn3s1NhEhZ+jmIPzby0HbkbECBe+hNPEa6a+E21o94w==",
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-6.1.0.tgz",
+ "integrity": "sha512-UCQBZ3xCUBv/PLfwKAJhp6jmGOSLFNKzrotXGNgbKhWvz27wPsCsVeP7gIcHPElQw2agBmynAitXqhxR58XAmA==",
"dev": true
},
"jsdom": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz",
- "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==",
+ "version": "15.2.1",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz",
+ "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==",
"dev": true,
"requires": {
"abab": "^2.0.0",
- "acorn": "^5.5.3",
- "acorn-globals": "^4.1.0",
+ "acorn": "^7.1.0",
+ "acorn-globals": "^4.3.2",
"array-equal": "^1.0.0",
- "cssom": ">= 0.3.2 < 0.4.0",
- "cssstyle": "^1.0.0",
- "data-urls": "^1.0.0",
+ "cssom": "^0.4.1",
+ "cssstyle": "^2.0.0",
+ "data-urls": "^1.1.0",
"domexception": "^1.0.1",
- "escodegen": "^1.9.1",
+ "escodegen": "^1.11.1",
"html-encoding-sniffer": "^1.0.2",
- "left-pad": "^1.3.0",
- "nwsapi": "^2.0.7",
- "parse5": "4.0.0",
+ "nwsapi": "^2.2.0",
+ "parse5": "5.1.0",
"pn": "^1.1.0",
- "request": "^2.87.0",
- "request-promise-native": "^1.0.5",
- "sax": "^1.2.4",
+ "request": "^2.88.0",
+ "request-promise-native": "^1.0.7",
+ "saxes": "^3.1.9",
"symbol-tree": "^3.2.2",
- "tough-cookie": "^2.3.4",
+ "tough-cookie": "^3.0.1",
"w3c-hr-time": "^1.0.1",
+ "w3c-xmlserializer": "^1.1.2",
"webidl-conversions": "^4.0.2",
- "whatwg-encoding": "^1.0.3",
- "whatwg-mimetype": "^2.1.0",
- "whatwg-url": "^6.4.1",
- "ws": "^5.2.0",
+ "whatwg-encoding": "^1.0.5",
+ "whatwg-mimetype": "^2.3.0",
+ "whatwg-url": "^7.0.0",
+ "ws": "^7.0.0",
"xml-name-validator": "^3.0.0"
},
"dependencies": {
"abab": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz",
- "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz",
+ "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==",
"dev": true
},
- "cssstyle": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz",
- "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==",
+ "acorn": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz",
+ "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==",
+ "dev": true
+ },
+ "acorn-globals": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz",
+ "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==",
+ "dev": true,
+ "requires": {
+ "acorn": "^6.0.1",
+ "acorn-walk": "^6.0.1"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
+ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
+ "dev": true
+ }
+ }
+ },
+ "acorn-walk": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
+ "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==",
+ "dev": true
+ },
+ "cssom": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
+ "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==",
+ "dev": true
+ },
+ "data-urls": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
+ "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
+ "dev": true,
+ "requires": {
+ "abab": "^2.0.0",
+ "whatwg-mimetype": "^2.2.0",
+ "whatwg-url": "^7.0.0"
+ }
+ },
+ "escodegen": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz",
+ "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==",
"dev": true,
"requires": {
- "cssom": "0.3.x"
+ "esprima": "^4.0.1",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1",
+ "source-map": "~0.6.1"
}
},
- "nwsapi": {
- "version": "2.0.9",
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz",
- "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==",
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
"parse5": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
- "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
+ "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==",
"dev": true
},
- "ws": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
- "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
+ "request-promise-core": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz",
+ "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==",
"dev": true,
"requires": {
- "async-limiter": "~1.0.0"
+ "lodash": "^4.17.15"
+ }
+ },
+ "request-promise-native": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz",
+ "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==",
+ "dev": true,
+ "requires": {
+ "request-promise-core": "1.1.3",
+ "stealthy-require": "^1.1.1",
+ "tough-cookie": "^2.3.3"
+ },
+ "dependencies": {
+ "tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true
+ },
+ "tough-cookie": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
+ "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==",
+ "dev": true,
+ "requires": {
+ "ip-regex": "^2.1.0",
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ }
+ },
+ "whatwg-encoding": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+ "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+ "dev": true,
+ "requires": {
+ "iconv-lite": "0.4.24"
+ }
+ },
+ "whatwg-mimetype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+ "dev": true
+ },
+ "whatwg-url": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+ "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^1.0.1",
+ "webidl-conversions": "^4.0.2"
}
+ },
+ "ws": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz",
+ "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==",
+ "dev": true
}
}
},
@@ -25870,6 +28718,12 @@
"integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=",
"dev": true
},
+ "json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
"json-parse-better-errors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
@@ -25996,6 +28850,15 @@
"set-immediate-shim": "~1.0.1"
}
},
+ "keyv": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.0.tgz",
+ "integrity": "sha512-U7ioE8AimvRVLfw4LffyOIRhL2xVgmE8T22L6i0BucSnBUyv4w+I7VN/zVZwRKHOI6ZRUcdMdWHQ8KSUvGpEog==",
+ "dev": true,
+ "requires": {
+ "json-buffer": "3.0.1"
+ }
+ },
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
@@ -26058,12 +28921,6 @@
"invert-kv": "^1.0.0"
}
},
- "left-pad": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz",
- "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==",
- "dev": true
- },
"lerna": {
"version": "3.18.2",
"resolved": "https://registry.npmjs.org/lerna/-/lerna-3.18.2.tgz",
@@ -26095,23 +28952,6 @@
"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",
@@ -26183,6 +29023,17 @@
"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",
@@ -26524,12 +29375,25 @@
"cli-cursor": "^2.1.0",
"date-fns": "^1.27.2",
"figures": "^2.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"
+ }
+ }
}
},
"livereload-js": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz",
- "integrity": "sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg==",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz",
+ "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==",
"dev": true
},
"load-json-file": {
@@ -26715,12 +29579,6 @@
"integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=",
"dev": true
},
- "lodash.unescape": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz",
- "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=",
- "dev": true
- },
"lodash.uniq": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
@@ -26734,6 +29592,19 @@
"dev": true,
"requires": {
"chalk": "^2.0.1"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
}
},
"log-update": {
@@ -26953,6 +29824,15 @@
}
}
},
+ "lolex": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz",
+ "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ },
"longest": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
@@ -26989,6 +29869,12 @@
"integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
"dev": true
},
+ "lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "dev": true
+ },
"lowlight": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.11.0.tgz",
@@ -27461,9 +30347,9 @@
}
},
"memize": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/memize/-/memize-1.0.5.tgz",
- "integrity": "sha512-Dm8Jhb5kiC4+ynYsVR4QDXKt+o2dfqGuY4hE2x+XlXZkdndlT80bJxfcMv5QGp/FCy6MhG7f5ElpmKPFKOSEpg=="
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/memize/-/memize-1.1.0.tgz",
+ "integrity": "sha512-K4FcPETOMTwe7KL2LK0orMhpOmWD2wRGwWWpbZy0fyArwsyIKR8YJVz8+efBAh3BO4zPqlSICu4vsLTRRqtFAg=="
},
"memoize-one": {
"version": "5.1.1",
@@ -27731,6 +30617,17 @@
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
},
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
"cliui": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
@@ -28085,6 +30982,7 @@
"version": "7.1.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -28093,6 +30991,15 @@
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
+ },
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
}
}
},
@@ -28108,6 +31015,85 @@
"metro-cache": "0.56.3",
"metro-core": "0.56.3",
"pretty-format": "^24.7.0"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
+ "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^1.1.1",
+ "@types/yargs": "^13.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "13.0.8",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz",
+ "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "jest-validate": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz",
+ "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^24.9.0",
+ "camelcase": "^5.3.1",
+ "chalk": "^2.0.1",
+ "jest-get-type": "^24.9.0",
+ "leven": "^3.1.0",
+ "pretty-format": "^24.9.0"
+ },
+ "dependencies": {
+ "pretty-format": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
+ "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^24.9.0",
+ "ansi-regex": "^4.0.0",
+ "ansi-styles": "^3.2.0",
+ "react-is": "^16.8.4"
+ }
+ }
+ }
+ },
+ "leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true
+ }
}
},
"metro-core": {
@@ -28538,6 +31524,12 @@
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
"integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
},
+ "mimic-response": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
+ "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
+ "dev": true
+ },
"min-document": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
@@ -28884,6 +31876,31 @@
"mkdirp": "^0.5.1",
"rimraf": "^2.5.4",
"run-queue": "^1.0.3"
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ }
}
},
"ms": {
@@ -29035,6 +32052,35 @@
"lower-case": "^1.1.1"
}
},
+ "nock": {
+ "version": "12.0.3",
+ "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz",
+ "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.0",
+ "json-stringify-safe": "^5.0.1",
+ "lodash": "^4.17.13",
+ "propagate": "^2.0.0"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "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
+ }
+ }
+ },
"node-dir": {
"version": "0.1.17",
"resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz",
@@ -29084,6 +32130,31 @@
"which": "1"
},
"dependencies": {
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ },
+ "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"
+ }
+ }
+ }
+ },
"semver": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
@@ -29098,6 +32169,45 @@
"integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
"dev": true
},
+ "node-libs-browser": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+ "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
+ "dev": true,
+ "requires": {
+ "assert": "^1.1.1",
+ "browserify-zlib": "^0.2.0",
+ "buffer": "^4.3.0",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "^1.0.0",
+ "crypto-browserify": "^3.11.0",
+ "domain-browser": "^1.1.1",
+ "events": "^3.0.0",
+ "https-browserify": "^1.0.0",
+ "os-browserify": "^0.3.0",
+ "path-browserify": "0.0.1",
+ "process": "^0.11.10",
+ "punycode": "^1.2.4",
+ "querystring-es3": "^0.2.0",
+ "readable-stream": "^2.3.3",
+ "stream-browserify": "^2.0.1",
+ "stream-http": "^2.7.2",
+ "string_decoder": "^1.0.0",
+ "timers-browserify": "^2.0.4",
+ "tty-browserify": "0.0.0",
+ "url": "^0.11.0",
+ "util": "^0.11.0",
+ "vm-browserify": "^1.0.1"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ }
+ }
+ },
"node-modules-regexp": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
@@ -29148,6 +32258,20 @@
"integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==",
"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"
+ }
+ },
"minipass": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
@@ -29168,6 +32292,15 @@
"osenv": "^0.1.4"
}
},
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -29432,6 +32565,14 @@
"tough-cookie": "~2.4.3",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "dev": true
+ }
}
},
"strip-ansi": {
@@ -29549,6 +32690,33 @@
"semver": "~5.3.0",
"tar": "^4.4.8",
"which": "1"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ },
+ "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"
+ }
+ }
+ }
+ }
}
},
"semver": {
@@ -29716,6 +32884,33 @@
"semver": "~5.3.0",
"tar": "^4.4.12",
"which": "1"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ },
+ "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"
+ }
+ }
+ }
+ }
}
},
"resolve-from": {
@@ -29774,24 +32969,26 @@
}
},
"npm-package-json-lint": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-4.0.3.tgz",
- "integrity": "sha512-cuvTR2l5dOjjlRR3a1CCp+mh2A2HyQRxydwdcYi0Z77NRlADpf7wF3Jf8XFLGZM7J6afXNRBofBjQ1UWFyOtKA==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-5.0.0.tgz",
+ "integrity": "sha512-a7meq98EnSqniPWNhTj0TMJbTFKr8SPEkQep3iPCQVJWfhQ8fKI5+bUSgNyEbYfzfIrIjMTb0r/tCkX7FX+bYQ==",
"dev": true,
"requires": {
- "ajv": "^6.10.2",
+ "ajv": "^6.12.0",
"ajv-errors": "^1.0.1",
- "chalk": "^2.4.2",
- "cosmiconfig": "^5.2.1",
+ "chalk": "^4.0.0",
+ "cosmiconfig": "^6.0.0",
"debug": "^4.1.1",
- "globby": "^10.0.1",
+ "globby": "^11.0.0",
"ignore": "^5.1.4",
- "is-plain-obj": "^2.0.0",
+ "is-plain-obj": "^2.1.0",
+ "jsonc-parser": "^2.2.1",
"log-symbols": "^3.0.0",
- "meow": "^5.0.0",
- "plur": "^3.1.1",
- "semver": "^6.3.0",
- "strip-json-comments": "^3.0.1"
+ "meow": "^6.1.0",
+ "plur": "^4.0.0",
+ "semver": "^7.2.2",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.0"
},
"dependencies": {
"@nodelib/fs.stat": {
@@ -29800,6 +32997,18 @@
"integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
"dev": true
},
+ "ajv": {
+ "version": "6.12.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
+ "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
"array-union": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
@@ -29815,16 +33024,34 @@
"fill-range": "^7.0.1"
}
},
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "camelcase-keys": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+ "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.3.1",
+ "map-obj": "^4.0.0",
+ "quick-lru": "^4.0.1"
+ }
+ },
"cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
"dev": true,
"requires": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
}
},
"debug": {
@@ -29836,14 +33063,11 @@
"ms": "^2.1.1"
}
},
- "dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "requires": {
- "path-type": "^4.0.0"
- }
+ "fast-deep-equal": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
+ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
+ "dev": true
},
"fast-glob": {
"version": "3.1.1",
@@ -29856,14 +33080,6 @@
"glob-parent": "^5.1.0",
"merge2": "^1.3.0",
"micromatch": "^4.0.2"
- },
- "dependencies": {
- "merge2": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
- "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
- "dev": true
- }
}
},
"fill-range": {
@@ -29875,18 +33091,14 @@
"to-regex-range": "^5.0.1"
}
},
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
}
},
"glob-parent": {
@@ -29899,18 +33111,16 @@
}
},
"globby": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
- "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz",
+ "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==",
"dev": true,
"requires": {
- "@types/glob": "^7.1.1",
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
- "fast-glob": "^3.0.3",
- "glob": "^7.1.3",
- "ignore": "^5.1.1",
- "merge2": "^1.2.3",
+ "fast-glob": "^3.1.1",
+ "ignore": "^5.1.4",
+ "merge2": "^1.3.0",
"slash": "^3.0.0"
}
},
@@ -29920,15 +33130,17 @@
"integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==",
"dev": true
},
- "import-fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
- "dev": true,
- "requires": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
- }
+ "indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true
+ },
+ "irregular-plurals": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.2.0.tgz",
+ "integrity": "sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q==",
+ "dev": true
},
"is-glob": {
"version": "4.0.1",
@@ -29946,11 +33158,26 @@
"dev": true
},
"is-plain-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.0.0.tgz",
- "integrity": "sha512-EYisGhpgSCwspmIuRHGjROWTon2Xp8Z7U03Wubk/bTL5TTRC5R1rGVgyjzBrk9+ULdH6cRD06KRcw/xfqhVYKQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
"dev": true
},
+ "jsonc-parser": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz",
+ "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==",
+ "dev": true
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
"log-symbols": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
@@ -29958,8 +33185,52 @@
"dev": true,
"requires": {
"chalk": "^2.4.2"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
+ }
+ },
+ "map-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
+ "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
+ "dev": true
+ },
+ "meow": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.0.tgz",
+ "integrity": "sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg==",
+ "dev": true,
+ "requires": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.1.1",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.0.0",
+ "minimist-options": "^4.0.1",
+ "normalize-package-data": "^2.5.0",
+ "read-pkg-up": "^7.0.0",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.8.1",
+ "yargs-parser": "^18.1.1"
}
},
+ "merge2": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
+ "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
+ "dev": true
+ },
"micromatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
@@ -29970,32 +33241,179 @@
"picomatch": "^2.0.5"
}
},
+ "minimist-options": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.0.2.tgz",
+ "integrity": "sha512-seq4hpWkYSUh1y7NXxzucwAN9yVlBc3Upgdjz8vLCP97jG8kaOmzYrVH/m7tQ1NYD1wdtZbSLfdy4zFmRWuc/w==",
+ "dev": true,
+ "requires": {
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0"
+ },
+ "dependencies": {
+ "is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+ "dev": true
+ }
+ }
+ },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
"parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
+ "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
"dev": true,
"requires": {
+ "@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
+ "json-parse-better-errors": "^1.0.1",
+ "lines-and-columns": "^1.1.6"
}
},
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
"path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true
},
+ "picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "dev": true
+ },
+ "plur": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz",
+ "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==",
+ "dev": true,
+ "requires": {
+ "irregular-plurals": "^3.2.0"
+ }
+ },
+ "quick-lru": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+ "dev": true
+ },
+ "read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "requires": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true
+ }
+ }
+ },
+ "read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ }
+ },
+ "redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "dev": true,
+ "requires": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ }
+ },
+ "resolve": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
+ "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
"semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
"dev": true
},
"slash": {
@@ -30004,10 +33422,19 @@
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
+ "strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "dev": true,
+ "requires": {
+ "min-indent": "^1.0.0"
+ }
+ },
"strip-json-comments": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
- "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz",
+ "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==",
"dev": true
},
"to-regex-range": {
@@ -30018,6 +33445,28 @@
"requires": {
"is-number": "^7.0.0"
}
+ },
+ "trim-newlines": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
+ "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==",
+ "dev": true
+ },
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true
+ },
+ "yargs-parser": {
+ "version": "18.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz",
+ "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
}
}
},
@@ -30096,6 +33545,12 @@
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
},
+ "nwsapi": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
+ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
+ "dev": true
+ },
"oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
@@ -30202,12 +33657,6 @@
"has": "^1.0.1"
}
},
- "object.entries-ponyfill": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object.entries-ponyfill/-/object.entries-ponyfill-1.0.1.tgz",
- "integrity": "sha1-Kavfd8v70mVm3RqiTp2I9lQz0lY=",
- "dev": true
- },
"object.fromentries": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz",
@@ -30374,6 +33823,17 @@
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
},
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
"cli-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
@@ -30501,6 +33961,12 @@
"os-tmpdir": "^1.0.0"
}
},
+ "p-cancelable": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz",
+ "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==",
+ "dev": true
+ },
"p-defer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
@@ -30508,12 +33974,18 @@
"dev": true
},
"p-each-series": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz",
- "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz",
+ "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==",
+ "dev": true
+ },
+ "p-event": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.1.0.tgz",
+ "integrity": "sha512-4vAd06GCsgflX4wHN1JqrMzBh/8QZ4j+rzp0cd2scXRwuBEv+QR3wrVA5aLhWDLw4y2WgDKvzWF3CCLmVM1UgA==",
"dev": true,
"requires": {
- "p-reduce": "^1.0.0"
+ "p-timeout": "^2.0.1"
}
},
"p-finally": {
@@ -30521,6 +33993,12 @@
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
},
+ "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": "1.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
@@ -30576,6 +34054,15 @@
"integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=",
"dev": true
},
+ "p-timeout": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz",
+ "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==",
+ "dev": true,
+ "requires": {
+ "p-finally": "^1.0.0"
+ }
+ },
"p-try": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
@@ -30624,9 +34111,9 @@
}
},
"parse-asn1": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz",
- "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==",
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
+ "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
"dev": true,
"requires": {
"asn1.js": "^4.0.0",
@@ -30721,6 +34208,12 @@
"integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
"dev": true
},
+ "path-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+ "dev": true
+ },
"path-dirname": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
@@ -30932,15 +34425,6 @@
}
}
},
- "plur": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/plur/-/plur-3.1.1.tgz",
- "integrity": "sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==",
- "dev": true,
- "requires": {
- "irregular-plurals": "^2.0.0"
- }
- },
"pn": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
@@ -30983,30 +34467,39 @@
"dev": true
},
"portfinder": {
- "version": "1.0.20",
- "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz",
- "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==",
+ "version": "1.0.25",
+ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz",
+ "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==",
"dev": true,
"requires": {
- "async": "^1.5.2",
- "debug": "^2.2.0",
- "mkdirp": "0.5.x"
+ "async": "^2.6.2",
+ "debug": "^3.1.1",
+ "mkdirp": "^0.5.1"
},
"dependencies": {
"async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
- "dev": true
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
+ "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.14"
+ }
},
"debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"dev": true,
"requires": {
- "ms": "2.0.0"
+ "ms": "^2.1.1"
}
+ },
+ "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
}
}
},
@@ -31027,6 +34520,28 @@
"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",
@@ -31102,6 +34617,19 @@
"chalk": "^2.4.1",
"source-map": "^0.6.1",
"supports-color": "^5.4.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"
+ }
+ }
}
},
"source-map": {
@@ -31678,6 +35206,19 @@
"lodash": "^4.17.11",
"log-symbols": "^2.2.0",
"postcss": "^7.0.7"
+ },
+ "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"
+ }
+ }
}
},
"postcss-resolve-nested-selector": {
@@ -31816,6 +35357,26 @@
"react-is": "^16.8.4"
},
"dependencies": {
+ "@jest/types": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
+ "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^1.1.1",
+ "@types/yargs": "^13.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "13.0.8",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz",
+ "integrity": "sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
"ansi-regex": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
@@ -32130,13 +35691,13 @@
}
},
"prompts": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.0.tgz",
- "integrity": "sha512-NfbbPPg/74fT7wk2XYQ7hAIp9zJyZp5Fu19iRbORqqy1BhtrkZ0fPafBU+7bmn8ie69DpT0R6QpJIN2oisYjJg==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.1.tgz",
+ "integrity": "sha512-qIP2lQyCwYbdzcqHIUi2HAxiWixhoM9OdLCWf8txXsapC/X9YdsCoeyRIXE/GP+Q0J37Q7+XN/MFqbUa7IzXNA==",
"dev": true,
"requires": {
"kleur": "^3.0.3",
- "sisteransi": "^1.0.3"
+ "sisteransi": "^1.0.4"
}
},
"promzard": {
@@ -32168,6 +35729,12 @@
"reflect.ownkeys": "^0.2.0"
}
},
+ "propagate": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz",
+ "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==",
+ "dev": true
+ },
"property-information": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/property-information/-/property-information-5.3.0.tgz",
@@ -32199,13 +35766,13 @@
}
},
"proxy-addr": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
- "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
+ "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
"dev": true,
"requires": {
"forwarded": "~0.1.2",
- "ipaddr.js": "1.8.0"
+ "ipaddr.js": "1.9.1"
}
},
"proxy-from-env": {
@@ -32471,6 +36038,20 @@
"ms": "^2.1.1"
}
},
+ "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"
+ }
+ },
"https-proxy-agent": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz",
@@ -32498,6 +36079,15 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
"ws": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
@@ -32533,7 +36123,8 @@
"querystring": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+ "dev": true
},
"querystring-es3": {
"version": "0.2.1",
@@ -32585,9 +36176,9 @@
}
},
"randombytes": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
- "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dev": true,
"requires": {
"safe-buffer": "^5.1.0"
@@ -32610,19 +36201,49 @@
"dev": true
},
"raw-body": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz",
- "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
"dev": true,
"requires": {
- "bytes": "1",
- "string_decoder": "0.10"
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
},
"dependencies": {
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "dev": true,
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
"dev": true
}
}
@@ -32812,6 +36433,17 @@
"node-releases": "^1.1.29"
}
},
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -33140,6 +36772,19 @@
"chalk": "^2.0.0",
"esutils": "^2.0.2",
"js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
}
},
"@babel/parser": {
@@ -33480,6 +37125,17 @@
"ws": "^1.1.0"
},
"dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "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",
@@ -33643,6 +37299,17 @@
"through": "^2.3.6"
},
"dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
@@ -33731,6 +37398,19 @@
"log-symbols": "^2.2.0",
"strip-ansi": "^5.2.0",
"wcwidth": "^1.0.1"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
}
},
"p-limit": {
@@ -33830,6 +37510,26 @@
}
}
},
+ "react-native-url-polyfill": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/react-native-url-polyfill/-/react-native-url-polyfill-1.1.2.tgz",
+ "integrity": "sha512-RPYwjW+4udnAf26xUCQP2dn4t2tnRFo3Ii4s/hy7Ivpe7xYtXp7CMVX505CR8X3p0f8NKmOJ4MQEFMMnbd/Y/Q==",
+ "requires": {
+ "buffer": "^5.4.3",
+ "whatwg-url-without-unicode": "8.0.0-1"
+ },
+ "dependencies": {
+ "buffer": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz",
+ "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==",
+ "requires": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4"
+ }
+ }
+ }
+ },
"react-outside-click-handler": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/react-outside-click-handler/-/react-outside-click-handler-1.2.2.tgz",
@@ -34228,32 +37928,37 @@
}
},
"reakit": {
- "version": "1.0.0-beta.12",
- "resolved": "https://registry.npmjs.org/reakit/-/reakit-1.0.0-beta.12.tgz",
- "integrity": "sha512-jf/0RWmJypG9wFbbCSj9mFxb474TCFnAweKnrh3yLJiMjKDEAFXic0cNyhqxSuOUUyZeT67bUFbu25DXBNfRmQ==",
+ "version": "1.0.0-rc.0",
+ "resolved": "https://registry.npmjs.org/reakit/-/reakit-1.0.0-rc.0.tgz",
+ "integrity": "sha512-jG9RfLE9DX3XP6xiUmindu8dJmd4rLs+ohQ2xppF9LVYQ/7Qa9B4kz8mNYbe42u8muE3nMM78T2RfXz+c/ZMsQ==",
"requires": {
+ "@popperjs/core": "^2.1.0",
"body-scroll-lock": "^2.6.4",
- "popper.js": "^1.16.0",
- "reakit-system": "^0.7.0",
- "reakit-utils": "^0.7.1"
- },
- "dependencies": {
- "popper.js": {
- "version": "1.16.0",
- "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.0.tgz",
- "integrity": "sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw=="
- }
+ "reakit-system": "^0.10.0",
+ "reakit-utils": "^0.10.0",
+ "reakit-warning": "^0.1.0"
}
},
"reakit-system": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/reakit-system/-/reakit-system-0.7.0.tgz",
- "integrity": "sha512-6MaQsoyIhU0b0RGfIfGSSGujCx0XVBtfJkRcn+TviiWwMXGS9liTCDBE1vn7fLnUYiR6kqll50Nmw//oIn97cg=="
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/reakit-system/-/reakit-system-0.10.0.tgz",
+ "integrity": "sha512-73ZI50NB2A6WAF3OsPJEEz73fax5cFiMoGMx3KxPT/AcS39rPqlBW6QkawtZC1HUebQXlsLxwZWicoFt8UubmQ==",
+ "requires": {
+ "reakit-utils": "^0.10.0"
+ }
},
"reakit-utils": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/reakit-utils/-/reakit-utils-0.7.1.tgz",
- "integrity": "sha512-xQJctof9V+wkC7OxSL7P14d5Se6l/apCfhY8liIfVihtakzXOkvKea4Ka/TbEfpoTKN7MRO4xNMxjfzuGFexHQ=="
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/reakit-utils/-/reakit-utils-0.10.0.tgz",
+ "integrity": "sha512-s1+nqLYrHo54U38iETdY86+VD+CZBTqF9rxMmphuft1Iz1i+L+OqOVJMq5sviBkTiEz8zRMhrNLcjBERFiPnkA=="
+ },
+ "reakit-warning": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/reakit-warning/-/reakit-warning-0.1.0.tgz",
+ "integrity": "sha512-nfujYGWoZ1lh6eAFTVQc2aNjrAEf30PHffJw8Q8tiJJY4Knoy7eLA4jQGHTl3gOjhA9+Yd8KSmiLoOPlr6A0kA==",
+ "requires": {
+ "reakit-utils": "^0.10.0"
+ }
},
"realpath-native": {
"version": "1.1.0",
@@ -34375,11 +38080,30 @@
"integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
"dev": true
},
+ "regenerate-unicode-properties": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+ "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+ "dev": true,
+ "requires": {
+ "regenerate": "^1.4.0"
+ }
+ },
"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.14.4",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz",
+ "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "^7.8.4",
+ "private": "^0.1.8"
+ }
+ },
"regex-not": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
@@ -34511,22 +38235,36 @@
"integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
"dev": true
},
+ "regexpu-core": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz",
+ "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==",
+ "dev": true,
+ "requires": {
+ "regenerate": "^1.4.0",
+ "regenerate-unicode-properties": "^8.2.0",
+ "regjsgen": "^0.5.1",
+ "regjsparser": "^0.6.4",
+ "unicode-match-property-ecmascript": "^1.0.4",
+ "unicode-match-property-value-ecmascript": "^1.2.0"
+ }
+ },
"regextras": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.6.1.tgz",
- "integrity": "sha512-EzIHww9xV2Kpqx+corS/I7OBmf2rZ0pKKJPsw5Dc+l6Zq1TslDmtRIP9maVn3UH+72MIXmn8zzDgP07ihQogUA==",
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.0.tgz",
+ "integrity": "sha512-ds+fL+Vhl918gbAUb0k2gVKbTZLsg84Re3DI6p85Et0U0tYME3hyW4nMK8Px4dtDaBA2qNjvG5uWyW7eK5gfmw==",
"dev": true
},
"regjsgen": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
- "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==",
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
+ "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
"dev": true
},
"regjsparser": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
- "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
+ "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
"dev": true,
"requires": {
"jsesc": "~0.5.0"
@@ -34693,6 +38431,19 @@
"chalk": "^2.0.0",
"esutils": "^2.0.2",
"js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ }
}
},
"@babel/parser": {
@@ -35076,18 +38827,15 @@
"requires": {
"mime-db": "1.40.0"
}
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "dev": true
}
}
},
- "request-progress": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
- "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=",
- "dev": true,
- "requires": {
- "throttleit": "^1.0.0"
- }
- },
"request-promise-core": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz",
@@ -35215,6 +38963,15 @@
"integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
"dev": true
},
+ "responselike": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
+ "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
+ "dev": true,
+ "requires": {
+ "lowercase-keys": "^2.0.0"
+ }
+ },
"restore-cursor": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
@@ -35271,12 +39028,28 @@
}
},
"rimraf": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
- "glob": "^7.0.5"
+ "glob": "^7.1.3"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "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"
+ }
+ }
}
},
"ripemd160": {
@@ -35318,6 +39091,17 @@
"strip-json-comments": "^2.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"
+ }
+ },
"postcss": {
"version": "6.0.23",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
@@ -35639,6 +39423,15 @@
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"dev": true
},
+ "saxes": {
+ "version": "3.1.11",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz",
+ "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==",
+ "dev": true,
+ "requires": {
+ "xmlchars": "^2.1.1"
+ }
+ },
"scheduler": {
"version": "0.15.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz",
@@ -36425,9 +40218,9 @@
}
},
"source-map-support": {
- "version": "0.5.10",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz",
- "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==",
+ "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",
@@ -36461,21 +40254,21 @@
"dev": true
},
"spawnd": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-4.0.0.tgz",
- "integrity": "sha512-ql3qhJnhAkvXpaqKBWOqou1rUTSQhFRaZkyOT+MTFB4xY3X+brgw6LTWV2wHuE9A6YPhrNe1cbg7S+jAYnbC0Q==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-4.4.0.tgz",
+ "integrity": "sha512-jLPOfB6QOEgMOQY15Z6+lwZEhH3F5ncXxIaZ7WHPIapwNNLyjrs61okj3VJ3K6tmP5TZ6cO0VAu9rEY4MD4YQg==",
"dev": true,
"requires": {
"exit": "^0.1.2",
"signal-exit": "^3.0.2",
- "tree-kill": "^1.2.1",
- "wait-port": "^0.2.2"
+ "tree-kill": "^1.2.2",
+ "wait-port": "^0.2.7"
},
"dependencies": {
"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
}
}
@@ -36717,13 +40510,30 @@
"dev": true
},
"string-length": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz",
- "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz",
+ "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==",
"dev": true,
"requires": {
"astral-regex": "^1.0.0",
- "strip-ansi": "^4.0.0"
+ "strip-ansi": "^5.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
+ },
+ "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"
+ }
+ }
}
},
"string-template": {
@@ -37069,72 +40879,413 @@
"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==",
+ "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"
+ }
+ }
+ }
+ },
+ "string.prototype.trim": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz",
+ "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1",
+ "function-bind": "^1.1.1"
+ },
+ "dependencies": {
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "es-abstract": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
+ "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.1.5",
+ "is-regex": "^1.0.5",
+ "object-inspect": "^1.7.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimleft": "^2.1.1",
+ "string.prototype.trimright": "^2.1.1"
+ },
+ "dependencies": {
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ }
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
+ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+ "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "object-inspect": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
+ "dev": true
+ },
+ "string.prototype.trimleft": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
+ "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5",
+ "string.prototype.trimstart": "^1.0.0"
+ }
+ },
+ "string.prototype.trimright": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
+ "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5",
+ "string.prototype.trimend": "^1.0.0"
+ }
+ }
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz",
+ "integrity": "sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ },
+ "dependencies": {
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "es-abstract": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
+ "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.1.5",
+ "is-regex": "^1.0.5",
+ "object-inspect": "^1.7.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimleft": "^2.1.1",
+ "string.prototype.trimright": "^2.1.1"
+ },
+ "dependencies": {
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ }
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
+ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+ "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "object-inspect": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
+ "dev": true
+ },
+ "string.prototype.trimleft": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
+ "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5",
+ "string.prototype.trimstart": "^1.0.0"
+ }
+ },
+ "string.prototype.trimright": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
+ "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5",
+ "string.prototype.trimend": "^1.0.0"
+ }
+ }
+ }
+ },
+ "string.prototype.trimleft": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz",
+ "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ },
+ "dependencies": {
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ }
+ }
+ },
+ "string.prototype.trimright": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz",
+ "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==",
+ "requires": {
+ "define-properties": "^1.1.3",
+ "function-bind": "^1.1.1"
+ },
+ "dependencies": {
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ }
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz",
+ "integrity": "sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ },
+ "dependencies": {
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "es-abstract": {
+ "version": "1.17.5",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
+ "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.1.5",
+ "is-regex": "^1.0.5",
+ "object-inspect": "^1.7.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.0",
+ "string.prototype.trimleft": "^2.1.1",
+ "string.prototype.trimright": "^2.1.1"
+ },
+ "dependencies": {
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ }
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "dev": true
+ },
+ "is-callable": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
+ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
+ "dev": true
+ },
+ "is-regex": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
+ "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "object-inspect": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
+ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
+ "dev": true
+ },
+ "string.prototype.trimleft": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
+ "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
"dev": true,
"requires": {
"define-properties": "^1.1.3",
- "function-bind": "^1.1.1"
+ "es-abstract": "^1.17.5",
+ "string.prototype.trimstart": "^1.0.0"
}
},
"string.prototype.trimright": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
- "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
+ "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
"dev": true,
"requires": {
"define-properties": "^1.1.3",
- "function-bind": "^1.1.1"
- }
- }
- }
- },
- "string.prototype.trim": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz",
- "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.2",
- "es-abstract": "^1.5.0",
- "function-bind": "^1.0.2"
- }
- },
- "string.prototype.trimleft": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz",
- "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==",
- "requires": {
- "define-properties": "^1.1.3",
- "function-bind": "^1.1.1"
- },
- "dependencies": {
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "requires": {
- "object-keys": "^1.0.12"
- }
- }
- }
- },
- "string.prototype.trimright": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz",
- "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==",
- "requires": {
- "define-properties": "^1.1.3",
- "function-bind": "^1.1.1"
- },
- "dependencies": {
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "requires": {
- "object-keys": "^1.0.12"
+ "es-abstract": "^1.17.5",
+ "string.prototype.trimend": "^1.0.0"
}
}
}
@@ -37369,6 +41520,17 @@
"integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
"dev": true
},
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
"debug": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -37559,9 +41721,9 @@
}
},
"svg-parser": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.3.tgz",
- "integrity": "sha512-fnCWiifNhK8i2Z7b9R5tbNahpxrRdAaQbnoxKlT2KrSCj9Kq/yBSgulCRgBJRhy1dPnSY5slg5ehPUnzpEcHlg==",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
+ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
"dev": true
},
"svg-tags": {
@@ -37592,6 +41754,17 @@
"util.promisify": "~1.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"
+ }
+ },
"css-select": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
@@ -37920,11 +42093,11 @@
}
},
"tannin": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.1.0.tgz",
- "integrity": "sha512-LxhcXqpMHEOVeVKmuG5aCPPsTXFlO373vrWkqN7FSJBVLS6lFOAg8ZGzIyGhrOf7Ho3xB4jdGedY1gi/8J1FCA==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.2.0.tgz",
+ "integrity": "sha512-U7GgX/RcSeUETbV7gYgoz8PD7Ni4y95pgIP/Z6ayI3CfhSujwKEBlGFTCRN+Aqnuyf4AN2yHL+L8x+TCGjb9uA==",
"requires": {
- "@tannin/plural-forms": "^1.0.3"
+ "@tannin/plural-forms": "^1.1.0"
}
},
"tapable": {
@@ -38074,15 +42247,15 @@
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
"dev": true
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "dev": true
}
}
},
- "term-size": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.1.1.tgz",
- "integrity": "sha512-UqvQSch04R+69g4RDhrslmGvGL3ucDRX/U+snYW0Mab4uCAyKSndUksaoqlJ81QKSpRnIsuOYQCbC2ZWx2896A==",
- "dev": true
- },
"terminal-link": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.0.0.tgz",
@@ -38146,16 +42319,16 @@
}
},
"terser-webpack-plugin": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz",
- "integrity": "sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==",
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz",
+ "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==",
"dev": true,
"requires": {
"cacache": "^12.0.2",
"find-cache-dir": "^2.1.0",
"is-wsl": "^1.1.0",
"schema-utils": "^1.0.0",
- "serialize-javascript": "^1.7.0",
+ "serialize-javascript": "^2.1.2",
"source-map": "^0.6.1",
"terser": "^4.1.2",
"webpack-sources": "^1.4.0",
@@ -38192,9 +42365,9 @@
}
},
"chownr": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz",
- "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
"dev": true
},
"find-cache-dir": {
@@ -38349,9 +42522,9 @@
"dev": true
},
"serialize-javascript": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz",
- "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz",
+ "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==",
"dev": true
},
"source-map": {
@@ -38403,30 +42576,20 @@
}
},
"test-exclude": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.2.tgz",
- "integrity": "sha512-N2pvaLpT8guUpb5Fe1GJlmvmzH3x+DAKmmyEQmFP792QcLYoGE1syxztSvPD1V8yPe6VrcCt6YGQVjSRjCASsA==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
"dev": true,
"requires": {
- "glob": "^7.1.3",
- "minimatch": "^3.0.4",
- "read-pkg-up": "^4.0.0",
- "require-main-filename": "^2.0.0"
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
},
"dependencies": {
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
"glob": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
- "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+ "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",
@@ -38436,101 +42599,6 @@
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
- },
- "load-json-file": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
- "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^4.0.0",
- "pify": "^3.0.0",
- "strip-bom": "^3.0.0"
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "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==",
- "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
- },
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
- "dev": true,
- "requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- }
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true
- },
- "read-pkg": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
- "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
- "dev": true,
- "requires": {
- "load-json-file": "^4.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^3.0.0"
- }
- },
- "read-pkg-up": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
- "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
- "dev": true,
- "requires": {
- "find-up": "^3.0.0",
- "read-pkg": "^3.0.0"
- }
- },
- "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
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
- "dev": true
}
}
},
@@ -38565,9 +42633,9 @@
}
},
"thread-loader": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.2.tgz",
- "integrity": "sha512-7xpuc9Ifg6WU+QYw/8uUqNdRwMD+N5gjwHKMqETrs96Qn+7BHwECpt2Brzr4HFlf4IAkZsayNhmGdbkBsTJ//w==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz",
+ "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==",
"dev": true,
"requires": {
"loader-runner": "^2.3.1",
@@ -38576,9 +42644,9 @@
},
"dependencies": {
"neo-async": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz",
- "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
+ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
"dev": true
}
}
@@ -38595,12 +42663,6 @@
"integrity": "sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg==",
"dev": true
},
- "throttleit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
- "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=",
- "dev": true
- },
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -38624,9 +42686,9 @@
"dev": true
},
"timers-browserify": {
- "version": "2.0.10",
- "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz",
- "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==",
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz",
+ "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==",
"dev": true,
"requires": {
"setimmediate": "^1.0.4"
@@ -38714,6 +42776,12 @@
}
}
},
+ "to-readable-stream": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-2.1.0.tgz",
+ "integrity": "sha512-o3Qa6DGg1CEXshSdvWNX2sN4QHqg03SPq7U6jPXRahlQdl5dK8oXjkU/2/sGrnOZKeGV1zLSO8qPwyKklPPE7w==",
+ "dev": true
+ },
"to-regex": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
@@ -38893,6 +42961,15 @@
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
"dev": true
},
+ "tsutils": {
+ "version": "3.17.1",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
+ "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ }
+ },
"tty-browserify": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
@@ -38929,19 +43006,42 @@
"prelude-ls": "~1.1.2"
}
},
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true
+ },
"type-fest": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
"integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ=="
},
"type-is": {
- "version": "1.6.16",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
- "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"dev": true,
"requires": {
"media-typer": "0.3.0",
- "mime-types": "~2.1.18"
+ "mime-types": "~2.1.24"
+ },
+ "dependencies": {
+ "mime-db": {
+ "version": "1.43.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
+ "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.26",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
+ "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.43.0"
+ }
+ }
}
},
"typed-styles": {
@@ -38956,10 +43056,19 @@
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true
},
+ "typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "dev": true,
+ "requires": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
"typescript": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz",
- "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==",
+ "version": "3.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz",
+ "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==",
"dev": true
},
"ua-parser-js": {
@@ -39088,9 +43197,9 @@
}
},
"unicode-match-property-value-ecmascript": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz",
- "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
+ "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
"dev": true
},
"unicode-property-aliases-ecmascript": {
@@ -39344,6 +43453,7 @@
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
"integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+ "dev": true,
"requires": {
"punycode": "1.3.2",
"querystring": "0.2.0"
@@ -39352,7 +43462,8 @@
"punycode": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+ "dev": true
}
}
},
@@ -39494,9 +43605,9 @@
"dev": true
},
"uuid": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
- "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz",
+ "integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw=="
},
"v8-compile-cache": {
"version": "2.1.0",
@@ -39504,6 +43615,34 @@
"integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
"dev": true
},
+ "v8-to-istanbul": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.2.tgz",
+ "integrity": "sha512-G9R+Hpw0ITAmPSr47lSlc5A1uekSYzXxTMlFxso2xoffwo4jQnzbv1p9yXIinO8UMZKfAFewaCHwWvnH4Jb4Ug==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^1.6.0",
+ "source-map": "^0.7.3"
+ },
+ "dependencies": {
+ "convert-source-map": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true
+ }
+ }
+ },
"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",
@@ -39593,6 +43732,12 @@
"integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==",
"dev": true
},
+ "vm-browserify": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+ "dev": true
+ },
"void-elements": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
@@ -39710,6 +43855,17 @@
"browser-process-hrtime": "^0.1.2"
}
},
+ "w3c-xmlserializer": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz",
+ "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==",
+ "dev": true,
+ "requires": {
+ "domexception": "^1.0.1",
+ "webidl-conversions": "^4.0.2",
+ "xml-name-validator": "^3.0.0"
+ }
+ },
"wait-on": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.3.0.tgz",
@@ -39724,9 +43880,9 @@
},
"dependencies": {
"core-js": {
- "version": "2.6.10",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz",
- "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==",
+ "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
},
"rx": {
@@ -39738,9 +43894,9 @@
}
},
"wait-port": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.6.tgz",
- "integrity": "sha512-nXE5Yp0Zs1obhFVc0Da7WVJc3y0LxoCq3j4mtV0NdI5P/ZvRdKp5yhuojvMOcOxSwpQL1hGbOgMNQ+4wpRpwCA==",
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-0.2.7.tgz",
+ "integrity": "sha512-pJ6cSBIa0w1sDg4y/wXN4bmvhM9OneOvwdFHo647L2NShBi/oXG4lRaLic5cO1HaYGbUhEvratPfl/WMlIC+tg==",
"dev": true,
"requires": {
"chalk": "^2.4.2",
@@ -39748,6 +43904,17 @@
"debug": "^4.1.1"
},
"dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
"commander": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz",
@@ -39822,9 +43989,9 @@
"dev": true
},
"webpack": {
- "version": "4.41.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.0.tgz",
- "integrity": "sha512-yNV98U4r7wX1VJAj5kyMsu36T8RPPQntcb5fJLOsMz/pt/WrKC0Vp1bAlqPLkA1LegSwQwf6P+kAbyhRKVQ72g==",
+ "version": "4.42.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz",
+ "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==",
"dev": true,
"requires": {
"@webassemblyjs/ast": "1.8.5",
@@ -39847,15 +44014,15 @@
"node-libs-browser": "^2.2.1",
"schema-utils": "^1.0.0",
"tapable": "^1.1.3",
- "terser-webpack-plugin": "^1.4.1",
+ "terser-webpack-plugin": "^1.4.3",
"watchpack": "^1.6.0",
"webpack-sources": "^1.4.1"
},
"dependencies": {
"acorn": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz",
- "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==",
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
+ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
"dev": true
},
"big.js": {
@@ -39864,6 +44031,12 @@
"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
"dev": true
},
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true
+ },
"json5": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
@@ -39874,13 +44047,13 @@
}
},
"loader-utils": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
- "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
- "emojis-list": "^2.0.0",
+ "emojis-list": "^3.0.0",
"json5": "^1.0.1"
}
},
@@ -39890,49 +44063,6 @@
"integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==",
"dev": true
},
- "node-libs-browser": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
- "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
- "dev": true,
- "requires": {
- "assert": "^1.1.1",
- "browserify-zlib": "^0.2.0",
- "buffer": "^4.3.0",
- "console-browserify": "^1.1.0",
- "constants-browserify": "^1.0.0",
- "crypto-browserify": "^3.11.0",
- "domain-browser": "^1.1.1",
- "events": "^3.0.0",
- "https-browserify": "^1.0.0",
- "os-browserify": "^0.3.0",
- "path-browserify": "0.0.1",
- "process": "^0.11.10",
- "punycode": "^1.2.4",
- "querystring-es3": "^0.2.0",
- "readable-stream": "^2.3.3",
- "stream-browserify": "^2.0.1",
- "stream-http": "^2.7.2",
- "string_decoder": "^1.0.0",
- "timers-browserify": "^2.0.4",
- "tty-browserify": "0.0.0",
- "url": "^0.11.0",
- "util": "^0.11.0",
- "vm-browserify": "^1.0.1"
- }
- },
- "path-browserify": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
- "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
- "dev": true
- },
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
- "dev": true
- },
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -39945,12 +44075,6 @@
"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
"dev": true
},
- "vm-browserify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz",
- "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==",
- "dev": true
- },
"webpack-sources": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
@@ -39964,13 +44088,13 @@
}
},
"webpack-bundle-analyzer": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz",
- "integrity": "sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==",
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.1.tgz",
+ "integrity": "sha512-Nfd8HDwfSx1xBwC+P8QMGvHAOITxNBSvu/J/mCJvOwv+G4VWkU7zir9SSenTtyCi0LnVtmsc7G5SZo1uV+bxRw==",
"dev": true,
"requires": {
- "acorn": "^6.0.7",
- "acorn-walk": "^6.1.1",
+ "acorn": "^7.1.1",
+ "acorn-walk": "^7.1.1",
"bfj": "^6.1.1",
"chalk": "^2.4.1",
"commander": "^2.18.0",
@@ -39978,18 +44102,29 @@
"express": "^4.16.3",
"filesize": "^3.6.1",
"gzip-size": "^5.0.0",
- "lodash": "^4.17.10",
+ "lodash": "^4.17.15",
"mkdirp": "^0.5.1",
"opener": "^1.5.1",
"ws": "^6.0.0"
},
"dependencies": {
"acorn": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz",
- "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz",
+ "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==",
"dev": true
},
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
"commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
@@ -39999,29 +44134,69 @@
}
},
"webpack-cli": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz",
- "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==",
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz",
+ "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==",
"dev": true,
"requires": {
- "chalk": "^2.4.1",
- "cross-spawn": "^6.0.5",
- "enhanced-resolve": "^4.1.0",
- "global-modules-path": "^2.3.0",
- "import-local": "^2.0.0",
- "interpret": "^1.1.0",
- "loader-utils": "^1.1.0",
- "supports-color": "^5.5.0",
- "v8-compile-cache": "^2.0.2",
- "yargs": "^12.0.2"
+ "chalk": "2.4.2",
+ "cross-spawn": "6.0.5",
+ "enhanced-resolve": "4.1.0",
+ "findup-sync": "3.0.0",
+ "global-modules": "2.0.0",
+ "import-local": "2.0.0",
+ "interpret": "1.2.0",
+ "loader-utils": "1.2.3",
+ "supports-color": "6.1.0",
+ "v8-compile-cache": "2.0.3",
+ "yargs": "13.2.4"
},
"dependencies": {
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "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
},
+ "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
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "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"
+ }
+ },
"cross-spawn": {
"version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
@@ -40035,6 +44210,17 @@
"which": "^1.2.9"
}
},
+ "enhanced-resolve": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz",
+ "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "memory-fs": "^0.4.0",
+ "tapable": "^1.0.0"
+ }
+ },
"execa": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
@@ -40059,6 +44245,12 @@
"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
+ },
"get-stream": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
@@ -40068,12 +44260,27 @@
"pump": "^3.0.0"
}
},
+ "interpret": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
+ "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
+ "dev": true
+ },
"invert-kv": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
"integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
"dev": true
},
+ "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"
+ }
+ },
"lcid": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
@@ -40083,6 +44290,17 @@
"invert-kv": "^2.0.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"
+ }
+ },
"locate-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
@@ -40121,12 +44339,6 @@
"mem": "^4.0.0"
}
},
- "p-is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
- "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
- "dev": true
- },
"p-limit": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
@@ -40161,49 +44373,87 @@
"once": "^1.3.1"
}
},
+ "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": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"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"
+ }
+ },
"supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "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"
}
},
+ "v8-compile-cache": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz",
+ "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==",
+ "dev": true
+ },
+ "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.2.4",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz",
+ "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==",
"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",
+ "os-locale": "^3.1.0",
"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.0"
}
}
}
@@ -40259,13 +44509,32 @@
}
},
"webpack-livereload-plugin": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/webpack-livereload-plugin/-/webpack-livereload-plugin-2.2.0.tgz",
- "integrity": "sha512-sx9xA5mHoNOUgLQI0PmXT3KV9ecsVmUaTgr+fsoL69qAOHw/7VzkL1+ZMDQ8n0dPbWounswK6cBRSgMod7Nhgg==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/webpack-livereload-plugin/-/webpack-livereload-plugin-2.3.0.tgz",
+ "integrity": "sha512-vVBLQLlNpElt2sfsBG+XLDeVbQFS4RrniVU8Hi1/hX5ycSfx6mtW8MEEITr2g0Cvo36kuPWShFFDuy+DS7KFMA==",
"dev": true,
"requires": {
+ "anymatch": "^3.1.1",
"portfinder": "^1.0.17",
"tiny-lr": "^1.1.1"
+ },
+ "dependencies": {
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ }
}
},
"webpack-log": {
@@ -40283,6 +44552,12 @@
"resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
"integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
"dev": true
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "dev": true
}
}
},
@@ -40351,21 +44626,19 @@
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz",
"integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng=="
},
- "whatwg-mimetype": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz",
- "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==",
- "dev": true
- },
- "whatwg-url": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
- "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
- "dev": true,
+ "whatwg-url-without-unicode": {
+ "version": "8.0.0-1",
+ "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-1.tgz",
+ "integrity": "sha512-0Uy8mjsG5O8Y53327XL+ZqsrMdxO1CL/6m840SmW5iyRWFvU2zlxS2RzpD3pFFVKYOKCmsKn5JKzWxQ+bImnWA==",
"requires": {
- "lodash.sortby": "^4.7.0",
- "tr46": "^1.0.1",
- "webidl-conversions": "^4.0.2"
+ "webidl-conversions": "^5.0.0"
+ },
+ "dependencies": {
+ "webidl-conversions": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+ "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="
+ }
}
},
"which": {
@@ -40544,6 +44817,12 @@
}
}
},
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -40698,9 +44977,9 @@
}
},
"ws": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.0.0.tgz",
- "integrity": "sha512-c2UlYcAZp1VS8AORtpq6y4RJIkJ9dQz18W32SpR/qXGfLDZ2jU4y4wKvvZwqbi7U6gxFQTeE+urMbXU/tsDy4w==",
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
+ "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
"dev": true,
"requires": {
"async-limiter": "~1.0.0"
@@ -40720,6 +44999,14 @@
"requires": {
"simple-plist": "^1.0.0",
"uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "dev": true
+ }
}
},
"xml": {
@@ -40740,6 +45027,12 @@
"integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
"dev": true
},
+ "xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true
+ },
"xmldoc": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz",
@@ -40761,6 +45054,15 @@
"integrity": "sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98=",
"dev": true
},
+ "xregexp": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz",
+ "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime-corejs3": "^7.8.3"
+ }
+ },
"xtend": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
diff --git a/package.json b/package.json
index d8ed5f7f4aa86f..c1520542e52b9e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "gutenberg",
- "version": "7.6.0",
+ "version": "7.9.1",
"private": true,
"description": "A new WordPress editor experience.",
"author": "The WordPress Contributors",
@@ -38,6 +38,7 @@
"@wordpress/deprecated": "file:packages/deprecated",
"@wordpress/dom": "file:packages/dom",
"@wordpress/dom-ready": "file:packages/dom-ready",
+ "@wordpress/edit-navigation": "file:packages/edit-navigation",
"@wordpress/edit-post": "file:packages/edit-post",
"@wordpress/edit-site": "file:packages/edit-site",
"@wordpress/edit-widgets": "file:packages/edit-widgets",
@@ -49,6 +50,7 @@
"@wordpress/html-entities": "file:packages/html-entities",
"@wordpress/i18n": "file:packages/i18n",
"@wordpress/icons": "file:packages/icons",
+ "@wordpress/interface": "file:packages/interface",
"@wordpress/is-shallow-equal": "file:packages/is-shallow-equal",
"@wordpress/keyboard-shortcuts": "file:packages/keyboard-shortcuts",
"@wordpress/keycodes": "file:packages/keycodes",
@@ -72,20 +74,27 @@
"devDependencies": {
"@actions/core": "1.0.0",
"@actions/github": "1.0.0",
- "@babel/core": "7.8.3",
+ "@babel/core": "7.9.0",
"@babel/plugin-syntax-jsx": "7.8.3",
- "@babel/runtime-corejs3": "7.8.3",
- "@babel/traverse": "7.8.3",
+ "@babel/runtime-corejs3": "7.9.2",
+ "@babel/traverse": "7.9.0",
+ "@jest/types": "25.3.0",
"@octokit/rest": "16.26.0",
+ "@octokit/webhooks": "7.1.0",
"@storybook/addon-a11y": "5.3.2",
"@storybook/addon-docs": "5.3.2",
"@storybook/addon-knobs": "5.3.2",
- "@storybook/addon-storyshots": "5.3.2",
"@storybook/addon-storysource": "5.3.2",
"@storybook/addon-viewport": "5.3.2",
"@storybook/react": "5.3.2",
- "@types/jest": "24.0.25",
+ "@testing-library/react": "10.0.2",
+ "@types/classnames": "2.2.10",
+ "@types/lodash": "4.14.149",
+ "@types/prettier": "1.19.0",
+ "@types/qs": "6.9.1",
+ "@types/react-dom": "16.9.5",
"@types/requestidlecallback": "0.3.1",
+ "@types/sprintf-js": "1.1.2",
"@wordpress/babel-plugin-import-jsx-pragma": "file:packages/babel-plugin-import-jsx-pragma",
"@wordpress/babel-plugin-makepot": "file:packages/babel-plugin-makepot",
"@wordpress/babel-preset-default": "file:packages/babel-preset-default",
@@ -105,16 +114,18 @@
"@wordpress/library-export-default-webpack-plugin": "file:packages/library-export-default-webpack-plugin",
"@wordpress/npm-package-json-lint-config": "file:packages/npm-package-json-lint-config",
"@wordpress/postcss-themes": "file:packages/postcss-themes",
+ "@wordpress/prettier-config": "file:packages/prettier-config",
+ "@wordpress/project-management-automation": "file:packages/project-management-automation",
"@wordpress/scripts": "file:packages/scripts",
- "babel-loader": "8.0.6",
- "babel-plugin-emotion": "10.0.27",
+ "babel-loader": "8.1.0",
+ "babel-plugin-emotion": "10.0.33",
"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",
"babel-plugin-require-context-hook": "1.0.0",
"benchmark": "2.1.4",
"browserslist": "4.9.1",
- "chalk": "2.4.2",
+ "chalk": "4.0.0",
"commander": "4.1.0",
"concurrently": "3.5.0",
"copy-webpack-plugin": "4.5.2",
@@ -122,19 +133,20 @@
"css-loader": "3.2.0",
"cssnano": "4.1.10",
"deep-freeze": "0.0.1",
- "enzyme": "3.9.0",
+ "enzyme": "3.11.0",
"eslint-plugin-eslint-comments": "3.1.2",
- "eslint-plugin-import": "2.18.2",
+ "eslint-plugin-import": "2.20.2",
+ "execa": "4.0.0",
"fast-glob": "2.2.7",
"fbjs": "0.8.17",
"glob": "7.1.2",
"husky": "3.0.5",
- "inquirer": "7.0.3",
+ "inquirer": "7.1.0",
"is-equal-shallow": "0.1.3",
- "jest-emotion": "10.0.17",
- "jest-junit": "6.4.0",
+ "jest-emotion": "10.0.32",
+ "jest-junit": "10.0.0",
"jest-serializer-enzyme": "1.0.0",
- "jsdom": "11.12.0",
+ "jsdom": "15.2.1",
"lerna": "3.18.2",
"lint-staged": "9.2.5",
"lodash": "4.17.15",
@@ -142,6 +154,7 @@
"metro-react-native-babel-preset": "0.55.0",
"metro-react-native-babel-transformer": "0.55.0",
"mkdirp": "0.5.1",
+ "nock": "12.0.3",
"node-sass": "4.12.0",
"node-watch": "0.6.0",
"postcss": "7.0.13",
@@ -152,7 +165,7 @@
"react-dom": "16.9.0",
"react-native": "0.61.5",
"react-test-renderer": "16.9.0",
- "rimraf": "2.6.2",
+ "rimraf": "3.0.2",
"rtlcss": "2.4.0",
"sass-loader": "6.0.7",
"semver": "6.0.0",
@@ -164,16 +177,18 @@
"sprintf-js": "1.1.1",
"style-loader": "1.0.0",
"stylelint-config-wordpress": "13.1.0",
- "typescript": "3.5.3",
- "uuid": "3.3.2",
- "webpack": "4.41.0",
+ "typescript": "3.8.3",
+ "uuid": "7.0.2",
+ "webpack": "4.42.0",
"worker-farm": "1.7.0"
},
"scripts": {
"prebuild": "npm run check-engines",
- "clean:packages": "rimraf ./packages/*/build ./packages/*/build-module ./packages/*/build-style ./packages/*/node_modules",
+ "clean:packages": "rimraf \"./packages/*/@(build|build-module|build-style)\"",
+ "clean:package-types": "tsc --build --clean",
"prebuild:packages": "npm run clean:packages && lerna run build",
- "build:packages": "node ./bin/packages/build.js",
+ "build:packages": "npm run build:package-types && node ./bin/packages/build.js",
+ "build:package-types": "node ./bin/packages/validate-typescript-version.js && tsc --build",
"build": "npm run build:packages && wp-scripts build",
"check-engines": "wp-scripts check-engines",
"check-licenses": "concurrently \"wp-scripts check-licenses --prod --gpl2\" \"wp-scripts check-licenses --dev\"",
@@ -182,28 +197,28 @@
"predev": "npm run check-engines",
"dev": "npm run build:packages && concurrently \"wp-scripts start\" \"npm run dev:packages\"",
"dev:packages": "node ./bin/packages/watch.js",
- "docs:build": "node ./docs/tool/index.js && node ./bin/api-docs/update-readmes.js",
+ "docs:build": "node ./docs/tool/index.js && node ./bin/api-docs/update-api-docs.js",
"fixtures:clean": "rimraf \"packages/e2e-tests/fixtures/blocks/*.+(json|serialized.html)\"",
"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": "concurrently \"npm run lint-js\" \"npm run lint-pkg-json\" \"npm run lint-css\"",
"lint-js": "wp-scripts lint-js",
"lint-js:fix": "npm run lint-js -- --fix",
+ "prelint-php": "npm run wp-env run composer install -- --no-interaction",
"lint-php": "npm run wp-env run composer run-script lint",
"lint-pkg-json": "wp-scripts lint-pkg-json . 'packages/*/package.json'",
"lint-css": "wp-scripts lint-style '**/*.scss'",
"lint-css:fix": "npm run lint-css -- --fix",
- "lint-types": "tsc",
"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",
- "publish:dev": "npm run build:packages && lerna publish --dist-tag next",
- "publish:legacy": "npm run build:packages && lerna publish --dist-tag legacy",
- "publish:prod": "npm run build:packages && lerna publish",
+ "publish:dev": "npm run clean:package-types && npm run build:packages && lerna publish --dist-tag next",
+ "publish:legacy": "npm run clean:package-types && npm run build:packages && lerna publish --dist-tag legacy",
+ "publish:prod": "npm run clean:package-types && npm run build:packages && lerna publish",
"test": "npm run lint && npm run test-unit",
"test-e2e": "wp-scripts test-e2e --config packages/e2e-tests/jest.config.js",
"test-e2e:watch": "npm run test-e2e -- --watch",
@@ -234,6 +249,9 @@
}
},
"lint-staged": {
+ "package-lock.json": [
+ "node ./bin/check-latest-npm.js"
+ ],
"packages/*/package.json": [
"wp-scripts lint-pkg-json"
],
@@ -244,13 +262,13 @@
"wp-scripts format-js",
"wp-scripts lint-js"
],
- "{docs/{toc.json,tool/*.js},packages/{*/README.md,*/src/{actions,selectors}.js,components/src/*/**/README.md}}": [
- "node ./docs/tool/index.js",
- "node ./docs/tool/are-data-files-unstaged.js"
+ "{docs/{toc.json,tool/*.js},packages/{*/README.md,components/src/*/**/README.md}}": [
+ "node ./docs/tool/index.js"
],
"packages/**/*.js": [
- "node ./bin/api-docs/update-readmes.js",
- "node ./bin/api-docs/are-readmes-unstaged.js"
+ "node ./bin/api-docs/update-api-docs.js",
+ "node ./bin/api-docs/are-api-docs-unstaged.js",
+ "node ./bin/packages/lint-staged-typecheck.js"
]
},
"wp-env": {
diff --git a/packages/README.md b/packages/README.md
index 30cccbed973c42..44162e64f69b23 100644
--- a/packages/README.md
+++ b/packages/README.md
@@ -7,46 +7,44 @@ This repository uses [lerna] to manage WordPress modules and publish them as pac
When creating a new package, you need to provide at least the following:
1. `package.json` based on the template:
- ```json
- {
- "name": "@wordpress/package-name",
- "version": "1.0.0-beta.0",
- "description": "Package description.",
- "author": "The WordPress Contributors",
- "license": "GPL-2.0-or-later",
- "keywords": [
- "wordpress"
- ],
- "homepage": "https://github.com/WordPress/gutenberg/tree/master/packages/package-name/README.md",
- "repository": {
- "type": "git",
- "url": "https://github.com/WordPress/gutenberg.git"
- },
- "bugs": {
- "url": "https://github.com/WordPress/gutenberg/issues"
- },
- "main": "build/index.js",
- "module": "build-module/index.js",
- "react-native": "src/index",
- "dependencies": {
- "@babel/runtime": "^7.8.3"
- },
- "publishConfig": {
- "access": "public"
- }
- }
- ```
- This assumes that your code is located in the `src` folder and will be transpiled with `Babel`.
+ ```json
+ {
+ "name": "@wordpress/package-name",
+ "version": "1.0.0-beta.0",
+ "description": "Package description.",
+ "author": "The WordPress Contributors",
+ "license": "GPL-2.0-or-later",
+ "keywords": [ "wordpress" ],
+ "homepage": "https://github.com/WordPress/gutenberg/tree/master/packages/package-name/README.md",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/WordPress/gutenberg.git"
+ },
+ "bugs": {
+ "url": "https://github.com/WordPress/gutenberg/issues"
+ },
+ "main": "build/index.js",
+ "module": "build-module/index.js",
+ "react-native": "src/index",
+ "dependencies": {
+ "@babel/runtime": "^7.9.2"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+ }
+ ```
+ This assumes that your code is located in the `src` folder and will be transpiled with `Babel`.
2. `.npmrc` file which disables creating `package-lock.json` file for the package:
- ```
- package-lock=false
- ```
+ ```
+ package-lock=false
+ ```
3. `README.md` file containing at least:
- - Package name
- - Package description
- - Installation details
- - Usage example
- - `Code is Poetry` logo (`
`)
+ - Package name
+ - Package description
+ - Installation details
+ - Usage example
+ - `Code is Poetry` logo (`
`)
## Managing Dependencies
@@ -57,7 +55,7 @@ There are two types of dependencies that you might want to add to one of the exi
Production dependencies are stored in the `dependencies` section of the package’s `package.json` file.
#### Adding New Dependencies
-
+
The simplest way to add a production dependency to one of the packages is to run a very convenient [lerna add](https://github.com/lerna/lerna/tree/master/commands/add#readme) command from the root of the project.
_Example:_
@@ -79,9 +77,9 @@ _Example:_
@@ -43,7 +43,6 @@
"check-node-version": "^3.1.1",
"cross-spawn": "^5.1.0",
- "eslint": "^5.16.0",
-- "jest": "^24.7.1",
- "jest-puppeteer": "^4.0.0",
+ "eslint": "^6.8.0",
+- "jest": "^25.3.0",
+ "jest-puppeteer": "^4.4.0",
"minimist": "^1.2.0",
"npm-package-json-lint": "^3.6.0",
```
@@ -93,7 +91,7 @@ Next, you need to run `npm install` in the root of the project to ensure that `p
This is the most confusing part of working with [lerna] which causes a lot of hassles for contributors. The most successful strategy so far is to do the following:
1. First, remove the existing dependency as described in the previous section.
2. Next, add the same dependency back as described in the first section of this chapter. This time it wil get the latest version applied unless you enforce a different version explicitly.
-
+
### Development Dependencies
In contrast to production dependencies, development dependencies shouldn't be stored in individual WordPress packages. Instead they should be installed in the project's `package.json` file using the usual `npm install` command. In effect, all development tools are configured to work with every package at the same time to ensure they share the same characteristics and integrate correctly with each other.
@@ -119,16 +117,16 @@ _Example:_
### Bug Fix
-- Fixed an off-by-one error with the `sum` function.
+- Fixed an off-by-one error with the `sum` function.
```
There are a number of common release subsections you can follow. Each is intended to align to a specific meaning in the context of the [Semantic Versioning (`semver`) specification](https://semver.org/) the project adheres to. It is important that you describe your changes accurately, since this is used in the packages release process to help determine the version of the next release.
-- "Breaking Change" - A backwards-incompatible change which requires specific attention of the impacted developers to reconcile (requires a major version bump).
-- "New Feature" - The addition of a new backwards-compatible function or feature to the existing public API (requires a minor verison bump).
-- "Enhancement" - Backwards-compatible improvements to existing functionality (requires a minor version bump).
-- "Bug Fix" - Resolutions to existing buggy behavior (requires a patch version bump).
-- "Internal" - Changes which do not have an impact on the public interface or behavior of the module (requires a patch version bump).
+- "Breaking Change" - A backwards-incompatible change which requires specific attention of the impacted developers to reconcile (requires a major version bump).
+- "New Feature" - The addition of a new backwards-compatible function or feature to the existing public API (requires a minor verison bump).
+- "Enhancement" - Backwards-compatible improvements to existing functionality (requires a minor version bump).
+- "Bug Fix" - Resolutions to existing buggy behavior (requires a patch version bump).
+- "Internal" - Changes which do not have an impact on the public interface or behavior of the module (requires a patch version bump).
While other section naming can be used when appropriate, it's important that are expressed clearly to avoid confusion for both the packages releaser and third-party consumers.
@@ -190,5 +188,61 @@ npm run publish:legacy
This is usually necessary when adding bug fixes or security patches to the earlier versions of WordPress.
+## TypeScript
+
+The [TypeScript](http://www.typescriptlang.org/) language is a typed superset of JavaScript that compiles to plain JavaScript.
+Gutenberg does not use the TypeScript language, however TypeScript has powerful tooling that can be applied to JavaScript projects.
+
+Gutenberg uses TypeScript for several reasons, including:
+
+- Powerful editor integrations improve developer experience.
+- Type system can detect some issues and lead to more robust software.
+- Type declarations can be produced to allow other projects to benefit from these advantages as well.
+
+### Using TypeScript
+
+Gutenberg uses TypeScript by running the TypeScript compiler (`tsc`) on select packages.
+These packages benefit from type checking and produced type declarations in the published packages.
+
+To opt-in to TypeScript tooling, packages should include a `tsconfig.json` file in the package root and add an entry to the root `tsconfig.json` references.
+The changes will indicate that the package has opted-in and will be included in the TypeScript build process.
+
+A `tsconfig.json` file should look like the following (comments are not necessary):
+
+```jsonc
+{
+ // Extends a base configuration common to most packages
+ "extends": "../../tsconfig.base.json",
+
+ // Options for the TypeScript compiler
+ // We'll usually set our `rootDir` and `declarationDir` as follows, which is specific
+ // to each project.
+ "compilerOptions": {
+ "rootDir": "src",
+ "declarationDir": "build-types"
+ },
+
+ // Which source files should be included
+ "include": [ "src/**/*" ],
+
+ // Other WordPress package dependencies that have opted-in to TypeScript should be listed
+ // here. In this case, our package depends on `@wordpress/dom-ready`.
+ "references": [ { "path": "../dom-ready" } ]
+}
+```
+
+Type declarations will be produced in the `build-types` which should be included in the published package.
+For consumers to use the published type declarations, we'll set the `types` field in `package.json`:
+
+```json
+{
+ "main": "build/index.js",
+ "main-module": "build-module/index.js",
+ "types": "build-types"
+}
+```
+
+Ensure that the `build-types` directory will be included in the published package, for example if a `files` field is declared.
+
[lerna]: https://lerna.js.org/
[npm]: https://www.npmjs.com/
diff --git a/packages/a11y/CHANGELOG.md b/packages/a11y/CHANGELOG.md
index 6d3354f059cc82..872d37767d1b9b 100644
--- a/packages/a11y/CHANGELOG.md
+++ b/packages/a11y/CHANGELOG.md
@@ -1,3 +1,11 @@
+## Master
+
+## 2.9.0 (2020-04-15)
+
+### New feature
+
+- Include TypeScript type declarations ([#18942](https://github.com/WordPress/gutenberg/pull/18942))
+
## 2.0.0 (2018-09-05)
### Breaking Change
diff --git a/packages/a11y/README.md b/packages/a11y/README.md
index a45253197e7e6b..46cf83291fd301 100644
--- a/packages/a11y/README.md
+++ b/packages/a11y/README.md
@@ -23,7 +23,7 @@ Create the live regions.
# **speak**
Allows you to easily announce dynamic interface updates to screen readers using ARIA live regions.
-This module is inspired by the `speak` function in wp-a11y.js
+This module is inspired by the `speak` function in `wp-a11y.js`.
_Usage_
@@ -39,15 +39,15 @@ speak( 'The message you want to send to the ARIA live region', 'assertive' );
_Parameters_
-- _message_ `string`: The message to be announced by Assistive Technologies.
-- _ariaLive_ `string`: Optional. The politeness level for aria-live. Possible values: polite or assertive. Default polite.
+- _message_ `string`: The message to be announced by assistive technologies.
+- _ariaLive_ `[string]`: The politeness level for aria-live; default: 'polite'.
### Background
-For context I'll quote [this article on WordPress.org](https://make.wordpress.org/accessibility/2015/04/15/let-wordpress-speak-new-in-wordpress-4-2/) by [@joedolson](https://github.com/joedolson):
+For context I’ll quote [this article on WordPress.org](https://make.wordpress.org/accessibility/2015/04/15/let-wordpress-speak-new-in-wordpress-4-2/) by [@joedolson](https://github.com/joedolson):
> #### Why.
>
@@ -71,4 +71,4 @@ For context I'll quote [this article on WordPress.org](https://make.wordpress.or
See
-
+
diff --git a/packages/a11y/package.json b/packages/a11y/package.json
index 3f2dc80ae20901..fb9ca433bdd021 100644
--- a/packages/a11y/package.json
+++ b/packages/a11y/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/a11y",
- "version": "2.7.0",
+ "version": "2.9.0",
"description": "Accessibility (a11y) utilities for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -21,8 +21,9 @@
"main": "build/index.js",
"module": "build-module/index.js",
"react-native": "src/index",
+ "types": "build-types",
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/dom-ready": "file:../dom-ready"
},
"publishConfig": {
diff --git a/packages/a11y/src/addContainer.js b/packages/a11y/src/add-container.js
similarity index 72%
rename from packages/a11y/src/addContainer.js
rename to packages/a11y/src/add-container.js
index edd733a6626a60..122adeaf8a15da 100644
--- a/packages/a11y/src/addContainer.js
+++ b/packages/a11y/src/add-container.js
@@ -1,15 +1,13 @@
/**
* Build the live regions markup.
*
- * @param {string} ariaLive Optional. Value for the 'aria-live' attribute, default 'polite'.
+ * @param {string} [ariaLive] Value for the 'aria-live' attribute; default: 'polite'.
*
* @return {HTMLDivElement} The ARIA live region HTML element.
*/
-const addContainer = function( ariaLive ) {
- ariaLive = ariaLive || 'polite';
-
+export default function addContainer( ariaLive = 'polite' ) {
const container = document.createElement( 'div' );
- container.id = 'a11y-speak-' + ariaLive;
+ container.id = `a11y-speak-${ ariaLive }`;
container.className = 'a11y-speak-region';
container.setAttribute(
@@ -30,12 +28,10 @@ const addContainer = function( ariaLive ) {
container.setAttribute( 'aria-relevant', 'additions text' );
container.setAttribute( 'aria-atomic', 'true' );
- const body = document.querySelector( 'body' );
+ const { body } = document;
if ( body ) {
body.appendChild( container );
}
return container;
-};
-
-export default addContainer;
+}
diff --git a/packages/a11y/src/clear.js b/packages/a11y/src/clear.js
index 94bab6ff853084..d4429a5394db2e 100644
--- a/packages/a11y/src/clear.js
+++ b/packages/a11y/src/clear.js
@@ -1,11 +1,10 @@
/**
* Clear the a11y-speak-region elements.
*/
-const clear = function() {
- const regions = document.querySelectorAll( '.a11y-speak-region' );
+export default function clear() {
+ const regions = document.getElementsByClassName( 'a11y-speak-region' );
+
for ( let i = 0; i < regions.length; i++ ) {
regions[ i ].textContent = '';
}
-};
-
-export default clear;
+}
diff --git a/packages/a11y/src/filterMessage.js b/packages/a11y/src/filter-message.js
similarity index 89%
rename from packages/a11y/src/filterMessage.js
rename to packages/a11y/src/filter-message.js
index 27a48e85fec98b..54fab7dec1aaa4 100644
--- a/packages/a11y/src/filterMessage.js
+++ b/packages/a11y/src/filter-message.js
@@ -7,7 +7,7 @@ let previousMessage = '';
*
* @return {string} The filtered message.
*/
-const filterMessage = function( message ) {
+export default function filterMessage( message ) {
/*
* Strip HTML tags (if any) from the message string. Ideally, messages should
* be simple strings, carefully crafted for specific use with A11ySpeak.
@@ -24,6 +24,4 @@ const filterMessage = function( message ) {
previousMessage = message;
return message;
-};
-
-export default filterMessage;
+}
diff --git a/packages/a11y/src/index.js b/packages/a11y/src/index.js
index 97d10c65920202..cdd493091c2394 100644
--- a/packages/a11y/src/index.js
+++ b/packages/a11y/src/index.js
@@ -6,26 +6,26 @@ import domReady from '@wordpress/dom-ready';
/**
* Internal dependencies
*/
-import addContainer from './addContainer';
+import addContainer from './add-container';
import clear from './clear';
-import filterMessage from './filterMessage';
+import filterMessage from './filter-message';
/**
* Create the live regions.
*/
-export const setup = function() {
- const containerPolite = document.getElementById( 'a11y-speak-polite' );
+export function setup() {
const containerAssertive = document.getElementById(
'a11y-speak-assertive'
);
+ const containerPolite = document.getElementById( 'a11y-speak-polite' );
- if ( containerPolite === null ) {
- addContainer( 'polite' );
- }
if ( containerAssertive === null ) {
addContainer( 'assertive' );
}
-};
+ if ( containerPolite === null ) {
+ addContainer( 'polite' );
+ }
+}
/**
* Run setup on domReady.
@@ -34,11 +34,10 @@ domReady( setup );
/**
* Allows you to easily announce dynamic interface updates to screen readers using ARIA live regions.
- * This module is inspired by the `speak` function in wp-a11y.js
+ * This module is inspired by the `speak` function in `wp-a11y.js`.
*
- * @param {string} message The message to be announced by Assistive Technologies.
- * @param {string} ariaLive Optional. The politeness level for aria-live. Possible values:
- * polite or assertive. Default polite.
+ * @param {string} message The message to be announced by assistive technologies.
+ * @param {string} [ariaLive] The politeness level for aria-live; default: 'polite'.
*
* @example
* ```js
@@ -51,20 +50,20 @@ domReady( setup );
* speak( 'The message you want to send to the ARIA live region', 'assertive' );
* ```
*/
-export const speak = function( message, ariaLive ) {
+export function speak( message, ariaLive ) {
// Clear previous messages to allow repeated strings being read out.
clear();
message = filterMessage( message );
- const containerPolite = document.getElementById( 'a11y-speak-polite' );
const containerAssertive = document.getElementById(
'a11y-speak-assertive'
);
+ const containerPolite = document.getElementById( 'a11y-speak-polite' );
- if ( containerAssertive && 'assertive' === ariaLive ) {
+ if ( containerAssertive && ariaLive === 'assertive' ) {
containerAssertive.textContent = message;
} else if ( containerPolite ) {
containerPolite.textContent = message;
}
-};
+}
diff --git a/packages/a11y/src/index.native.js b/packages/a11y/src/index.native.js
index 4e5e9841118b17..41a6591d34516f 100644
--- a/packages/a11y/src/index.native.js
+++ b/packages/a11y/src/index.native.js
@@ -1,19 +1,18 @@
/**
* Internal dependencies
*/
-import filterMessage from './filterMessage';
+import filterMessage from './filter-message';
/**
* Update the ARIA live notification area text node.
*
* @param {string} message The message to be announced by Assistive Technologies.
- * @param {string} ariaLive Optional. The politeness level for aria-live. Possible values:
- * polite or assertive. Default polite.
+ * @param {string} [ariaLive] The politeness level for aria-live; default: 'polite'.
*/
-export const speak = function( message, ariaLive ) {
+export function speak( message, ariaLive ) {
message = filterMessage( message );
//TODO: Use native module to speak message
- if ( 'assertive' === ariaLive ) {
+ if ( ariaLive === 'assertive' ) {
} else {
}
-};
+}
diff --git a/packages/a11y/src/test/addContainer.test.js b/packages/a11y/src/test/add-container.test.js
similarity index 91%
rename from packages/a11y/src/test/addContainer.test.js
rename to packages/a11y/src/test/add-container.test.js
index 6ebf062237c9c0..c7e351dd38ef28 100644
--- a/packages/a11y/src/test/addContainer.test.js
+++ b/packages/a11y/src/test/add-container.test.js
@@ -1,14 +1,14 @@
/**
* Internal dependencies
*/
-import addContainer from '../addContainer';
+import addContainer from '../add-container';
describe( 'addContainer', () => {
describe( 'with polite param', () => {
it( 'should create an aria-live element with aria-live attr set to polite', () => {
const container = addContainer( 'polite' );
- expect( container ).not.toBe( null );
+ expect( container ).not.toBeNull();
expect( container.className ).toBe( 'a11y-speak-region' );
expect( container.id ).toBe( 'a11y-speak-polite' );
expect( container.getAttribute( 'style' ) ).not.toBeNull();
@@ -24,7 +24,7 @@ describe( 'addContainer', () => {
it( 'should create an aria-live element with aria-live attr set to assertive', () => {
const container = addContainer( 'assertive' );
- expect( container ).not.toBe( null );
+ expect( container ).not.toBeNull();
expect( container.className ).toBe( 'a11y-speak-region' );
expect( container.id ).toBe( 'a11y-speak-assertive' );
expect( container.getAttribute( 'style' ) ).not.toBeNull();
@@ -40,7 +40,7 @@ describe( 'addContainer', () => {
it( 'should default to creating an aria-live element with aria-live attr set to polite', () => {
const container = addContainer( 'polite' );
- expect( container ).not.toBe( null );
+ expect( container ).not.toBeNull();
expect( container.className ).toBe( 'a11y-speak-region' );
expect( container.id ).toBe( 'a11y-speak-polite' );
expect( container.getAttribute( 'style' ) ).not.toBeNull();
diff --git a/packages/a11y/src/test/clear.test.js b/packages/a11y/src/test/clear.test.js
index 02438dda1a4ecb..e45a45560c666f 100644
--- a/packages/a11y/src/test/clear.test.js
+++ b/packages/a11y/src/test/clear.test.js
@@ -8,12 +8,12 @@ describe( 'clear', () => {
const container1 = document.createElement( 'div' );
container1.className = 'a11y-speak-region';
container1.textContent = 'not empty';
- document.querySelector( 'body' ).appendChild( container1 );
+ document.body.appendChild( container1 );
const container2 = document.createElement( 'div' );
container2.className = 'a11y-speak-region';
container2.textContent = 'not empty';
- document.querySelector( 'body' ).appendChild( container2 );
+ document.body.appendChild( container2 );
clear();
expect( container1.textContent ).toBe( '' );
diff --git a/packages/a11y/src/test/filterMessage.test.js b/packages/a11y/src/test/filter-message.test.js
similarity index 88%
rename from packages/a11y/src/test/filterMessage.test.js
rename to packages/a11y/src/test/filter-message.test.js
index 95302abb8d1ce2..9b0613ae72e3d5 100644
--- a/packages/a11y/src/test/filterMessage.test.js
+++ b/packages/a11y/src/test/filter-message.test.js
@@ -1,7 +1,7 @@
/**
* Internal dependencies
*/
-import filterMessage from '../filterMessage';
+import filterMessage from '../filter-message';
describe( 'filterMessage', () => {
describe( 'when a clean message is passed in', () => {
@@ -15,7 +15,7 @@ describe( 'filterMessage', () => {
it( 'should add a space to the message to make sure it is announced again', () => {
filterMessage( 'repeated message.' );
const actual = filterMessage( 'repeated message.' );
- expect( actual ).toBe( 'repeated message.' + '\u00A0' );
+ expect( actual ).toBe( 'repeated message.\u00A0' );
} );
} );
diff --git a/packages/a11y/src/test/index.test.js b/packages/a11y/src/test/index.test.js
index 9888f9adb3a145..b17806c895353c 100644
--- a/packages/a11y/src/test/index.test.js
+++ b/packages/a11y/src/test/index.test.js
@@ -8,7 +8,7 @@ import domReady from '@wordpress/dom-ready';
*/
import { setup, speak } from '../';
import clear from '../clear';
-import filterMessage from '../filterMessage';
+import filterMessage from '../filter-message';
jest.mock( '../clear', () => {
return jest.fn();
@@ -18,7 +18,7 @@ jest.mock( '@wordpress/dom-ready', () => {
callback();
} );
} );
-jest.mock( '../filterMessage', () => {
+jest.mock( '../filter-message', () => {
return jest.fn( ( message ) => {
return message;
} );
@@ -82,9 +82,9 @@ describe( 'speak', () => {
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' )
+ ).toBeNull();
} );
} );
@@ -103,12 +103,10 @@ describe( 'speak', () => {
} );
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' ) ).toBeNull();
+ expect(
+ document.getElementById( 'a11y-speak-assertive' )
+ ).toBeNull();
} );
} );
diff --git a/packages/a11y/tsconfig.json b/packages/a11y/tsconfig.json
new file mode 100644
index 00000000000000..1a0a90bc8cb582
--- /dev/null
+++ b/packages/a11y/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "declarationDir": "build-types"
+ },
+ "references": [ { "path": "../dom-ready" } ],
+ "include": [ "src/**/*" ]
+}
diff --git a/packages/annotations/package.json b/packages/annotations/package.json
index 903d268911414a..a7613b253c69b8 100644
--- a/packages/annotations/package.json
+++ b/packages/annotations/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/annotations",
- "version": "1.12.1",
+ "version": "1.14.1",
"description": "Annotate content in the Gutenberg editor.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -21,14 +21,14 @@
"module": "build-module/index.js",
"react-native": "src/index",
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/data": "file:../data",
"@wordpress/hooks": "file:../hooks",
"@wordpress/i18n": "file:../i18n",
"@wordpress/rich-text": "file:../rich-text",
"lodash": "^4.17.15",
"rememo": "^3.0.0",
- "uuid": "^3.3.2"
+ "uuid": "^7.0.2"
},
"publishConfig": {
"access": "public"
diff --git a/packages/annotations/src/block/index.js b/packages/annotations/src/block/index.js
index c27c170b2d64a1..3a5dee89607abc 100644
--- a/packages/annotations/src/block/index.js
+++ b/packages/annotations/src/block/index.js
@@ -11,7 +11,7 @@ import { withSelect } from '@wordpress/data';
* @return {Object} The enhanced component.
*/
const addAnnotationClassName = ( OriginalComponent ) => {
- return withSelect( ( select, { clientId } ) => {
+ return withSelect( ( select, { clientId, className } ) => {
const annotations = select(
'core/annotations'
).__experimentalGetAnnotationsForBlock( clientId );
@@ -21,6 +21,8 @@ const addAnnotationClassName = ( OriginalComponent ) => {
.map( ( annotation ) => {
return 'is-annotated-by-' + annotation.source;
} )
+ .concat( className )
+ .filter( Boolean )
.join( ' ' ),
};
} )( OriginalComponent );
diff --git a/packages/annotations/src/store/actions.js b/packages/annotations/src/store/actions.js
index f5d5b8cf208e55..00c9fa589732af 100644
--- a/packages/annotations/src/store/actions.js
+++ b/packages/annotations/src/store/actions.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import uuid from 'uuid/v4';
+import { v4 as uuid } from 'uuid';
/**
* Adds an annotation to a block.
diff --git a/packages/api-fetch/package.json b/packages/api-fetch/package.json
index 0e5f9c1a912b2e..5d5d52358d69a3 100644
--- a/packages/api-fetch/package.json
+++ b/packages/api-fetch/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/api-fetch",
- "version": "3.11.0",
+ "version": "3.13.1",
"description": "Utility to make WordPress REST API requests.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -22,7 +22,8 @@
"module": "build-module/index.js",
"react-native": "src/index",
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
+ "@wordpress/element": "file:../element",
"@wordpress/i18n": "file:../i18n",
"@wordpress/url": "file:../url"
},
diff --git a/packages/api-fetch/src/index.js b/packages/api-fetch/src/index.js
index 9e7edc985709ed..64fc3ef09e0c33 100644
--- a/packages/api-fetch/src/index.js
+++ b/packages/api-fetch/src/index.js
@@ -2,6 +2,7 @@
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
+import { useEffect, useState } from '@wordpress/element';
/**
* Internal dependencies
@@ -156,6 +157,42 @@ function apiFetch( options ) {
} );
}
+/**
+ * Function that fetches data using apiFetch, and updates the status.
+ *
+ * @param {string} path Query path.
+ */
+function useApiFetch( path ) {
+ // Indicate the fetching status
+ const [ isLoading, setIsLoading ] = useState( true );
+ const [ data, setData ] = useState( null );
+ const [ error, setError ] = useState( null );
+
+ useEffect( () => {
+ setIsLoading( true );
+ setData( null );
+ setError( null );
+
+ apiFetch( { path } )
+ .then( ( fetchedData ) => {
+ setData( fetchedData );
+ // We've stopped fetching
+ setIsLoading( false );
+ } )
+ .catch( ( err ) => {
+ setError( err );
+ // We've stopped fetching
+ setIsLoading( false );
+ } );
+ }, [ path ] );
+
+ return {
+ isLoading,
+ data,
+ error,
+ };
+}
+
apiFetch.use = registerMiddleware;
apiFetch.setFetchHandler = setFetchHandler;
@@ -165,4 +202,6 @@ apiFetch.createRootURLMiddleware = createRootURLMiddleware;
apiFetch.fetchAllMiddleware = fetchAllMiddleware;
apiFetch.mediaUploadMiddleware = mediaUploadMiddleware;
+apiFetch.useApiFetch = useApiFetch;
+
export default apiFetch;
diff --git a/packages/autop/CHANGELOG.md b/packages/autop/CHANGELOG.md
index 0f40e07f861653..23c8689b2145c7 100644
--- a/packages/autop/CHANGELOG.md
+++ b/packages/autop/CHANGELOG.md
@@ -1,3 +1,11 @@
+## Master
+
+## 2.7.0 (2020-04-15)
+
+### New feature
+
+- Include TypeScript type declarations ([#20669](https://github.com/WordPress/gutenberg/pull/20669))
+
## 2.3.0 (2019-05-21)
### Bug Fix
diff --git a/packages/autop/package.json b/packages/autop/package.json
index 9a4f5d7fbaaacb..fc1bc1cdeb8e99 100644
--- a/packages/autop/package.json
+++ b/packages/autop/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/autop",
- "version": "2.6.0",
+ "version": "2.7.0",
"description": "WordPress's automatic paragraph functions `autop` and `removep`.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -20,9 +20,10 @@
"main": "build/index.js",
"module": "build-module/index.js",
"react-native": "src/index",
+ "types": "build-types",
"sideEffects": false,
"dependencies": {
- "@babel/runtime": "^7.8.3"
+ "@babel/runtime": "^7.9.2"
},
"publishConfig": {
"access": "public"
diff --git a/packages/autop/src/index.js b/packages/autop/src/index.js
index 3a0fc7fa73600e..b2c605620852f3 100644
--- a/packages/autop/src/index.js
+++ b/packages/autop/src/index.js
@@ -1,7 +1,7 @@
/**
* The regular expression for an HTML element.
*
- * @type {string}
+ * @type {RegExp}
*/
const htmlSplitRegex = ( () => {
/* eslint-disable no-multi-spaces */
@@ -52,7 +52,7 @@ const htmlSplitRegex = ( () => {
* Separate HTML elements and comments from the text.
*
* @param {string} input The text which has to be formatted.
- * @return {Array} The formatted text.
+ * @return {string[]} The formatted text.
*/
function htmlSplit( input ) {
const parts = [];
@@ -60,9 +60,15 @@ function htmlSplit( input ) {
let match;
while ( ( match = workingInput.match( htmlSplitRegex ) ) ) {
- parts.push( workingInput.slice( 0, match.index ) );
+ // The `match` result, when invoked on a RegExp with the `g` flag (`/foo/g`) will not include `index`.
+ // If the `g` flag is omitted, `index` is included.
+ // `htmlSplitRegex` does not have the `g` flag so we can assert it will have an index number.
+ // Assert `match.index` is a number.
+ const index = /** @type {number} */ ( match.index );
+
+ parts.push( workingInput.slice( 0, index ) );
parts.push( match[ 0 ] );
- workingInput = workingInput.slice( match.index + match[ 0 ].length );
+ workingInput = workingInput.slice( index + match[ 0 ].length );
}
if ( workingInput.length ) {
@@ -75,9 +81,9 @@ function htmlSplit( input ) {
/**
* Replace characters or phrases within HTML elements only.
*
- * @param {string} haystack The text which has to be formatted.
- * @param {Object} replacePairs In the form {from: 'to', ...}.
- * @return {string} The formatted text.
+ * @param {string} haystack The text which has to be formatted.
+ * @param {Record} replacePairs In the form {from: 'to', …}.
+ * @return {string} The formatted text.
*/
function replaceInHtmlTags( haystack, replacePairs ) {
// Find all elements.
@@ -337,6 +343,7 @@ export function removep( html ) {
'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';
+ /** @type {string[]} */
const preserve = [];
let preserveLinebreaks = false;
let preserveBr = false;
@@ -399,7 +406,7 @@ export function removep( html ) {
html = html.replace( /\n[\s\u00a0]+\n/g, '\n\n' );
// Replace tags with line breaks.
- html = html.replace( /(\s*) \s*/gi, function( match, space ) {
+ html = html.replace( /(\s*) \s*/gi, function( _, space ) {
if ( space && space.indexOf( '\n' ) !== -1 ) {
return '\n\n';
}
@@ -470,7 +477,7 @@ export function removep( html ) {
// Restore preserved tags.
if ( preserve.length ) {
html = html.replace( //g, function() {
- return preserve.shift();
+ return /** @type {string} */ ( preserve.shift() );
} );
}
diff --git a/packages/autop/tsconfig.json b/packages/autop/tsconfig.json
new file mode 100644
index 00000000000000..1a0a90bc8cb582
--- /dev/null
+++ b/packages/autop/tsconfig.json
@@ -0,0 +1,9 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "declarationDir": "build-types"
+ },
+ "references": [ { "path": "../dom-ready" } ],
+ "include": [ "src/**/*" ]
+}
diff --git a/packages/babel-plugin-makepot/package.json b/packages/babel-plugin-makepot/package.json
index 2219269afd4b65..3412b1160796e7 100644
--- a/packages/babel-plugin-makepot/package.json
+++ b/packages/babel-plugin-makepot/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/babel-plugin-makepot",
- "version": "3.4.0",
+ "version": "3.5.0",
"description": "WordPress Babel internationalization (i18n) plugin.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -29,7 +29,7 @@
"main": "build/index.js",
"module": "build-module/index.js",
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"gettext-parser": "^1.3.1",
"lodash": "^4.17.15"
},
diff --git a/packages/babel-preset-default/CHANGELOG.md b/packages/babel-preset-default/CHANGELOG.md
index 16bd181f83a302..808cc1302c123d 100644
--- a/packages/babel-preset-default/CHANGELOG.md
+++ b/packages/babel-preset-default/CHANGELOG.md
@@ -1,10 +1,16 @@
## Master
+## 4.12.0 (2020-04-15)
+
+### New Features
+
+- The bundled `@babel/core` dependency has been updated from requiring `^7.8.3` to requiring `^7.9.0`. All other Babel plugins were updated to the latest version (see [Highlights](https://babeljs.io/blog/2020/03/16/7.9.0)).
+
## 4.10.0 (2020-02-04)
### 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)).
+- 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)
diff --git a/packages/babel-preset-default/index.js b/packages/babel-preset-default/index.js
index 15454ecb36fd65..e331b212cd0ba8 100644
--- a/packages/babel-preset-default/index.js
+++ b/packages/babel-preset-default/index.js
@@ -58,7 +58,6 @@ module.exports = function( api ) {
return {
presets: [ getPresetEnv() ],
plugins: [
- require.resolve( '@babel/plugin-proposal-object-rest-spread' ),
require.resolve( '@wordpress/warning/babel-plugin' ),
[
require.resolve( '@wordpress/babel-plugin-import-jsx-pragma' ),
@@ -76,9 +75,6 @@ module.exports = function( api ) {
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 9661558f620a48..1cd59eb16d05bf 100644
--- a/packages/babel-preset-default/package.json
+++ b/packages/babel-preset-default/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/babel-preset-default",
- "version": "4.10.0",
+ "version": "4.12.1",
"description": "Default Babel preset for WordPress development.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -27,18 +27,16 @@
],
"main": "index.js",
"dependencies": {
- "@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",
+ "@babel/core": "^7.9.0",
+ "@babel/plugin-transform-react-jsx": "^7.9.4",
+ "@babel/plugin-transform-runtime": "^7.9.0",
+ "@babel/preset-env": "^7.9.0",
+ "@babel/runtime": "^7.9.2",
"@wordpress/babel-plugin-import-jsx-pragma": "file:../babel-plugin-import-jsx-pragma",
"@wordpress/browserslist-config": "file:../browserslist-config",
"@wordpress/element": "file:../element",
"@wordpress/warning": "file:../warning",
- "core-js": "^3.1.4"
+ "core-js": "^3.6.4"
},
"publishConfig": {
"access": "public"
diff --git a/packages/babel-preset-default/test/__snapshots__/index.js.snap b/packages/babel-preset-default/test/__snapshots__/index.js.snap
index 58bfb14629a285..9f7b9d7e009d99 100644
--- a/packages/babel-preset-default/test/__snapshots__/index.js.snap
+++ b/packages/babel-preset-default/test/__snapshots__/index.js.snap
@@ -11,9 +11,7 @@ describe('Babel preset default', function () {
}
function _foo() {
- _foo = _wrapAsyncGenerator(
- /*#__PURE__*/
- _regeneratorRuntime.mark(function _callee() {
+ _foo = _wrapAsyncGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
@@ -35,11 +33,7 @@ describe('Babel preset default', function () {
return _foo.apply(this, arguments);
}
- test('support for async generator functions',
- /*#__PURE__*/
- _asyncToGenerator(
- /*#__PURE__*/
- _regeneratorRuntime.mark(function _callee2() {
+ test('support for async generator functions', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
var generator;
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
@@ -52,13 +46,12 @@ describe('Babel preset default', function () {
case 4:
_context2.t1 = _context2.sent;
- _context2.t2 = {
+ (0, _context2.t0)(_context2.t1).toEqual({
done: false,
value: 2
- };
- (0, _context2.t0)(_context2.t1).toEqual(_context2.t2);
+ });
- case 7:
+ case 6:
case \\"end\\":
return _context2.stop();
}
diff --git a/packages/base-styles/_mixins.scss b/packages/base-styles/_mixins.scss
index b97325fd9116ff..2e1b4d957e0132 100644
--- a/packages/base-styles/_mixins.scss
+++ b/packages/base-styles/_mixins.scss
@@ -114,124 +114,32 @@
}
/**
- * Button states and focus styles
+ * Focus styles.
*/
-// Buttons with rounded corners.
-@mixin button-style__disabled {
- opacity: 0.6;
- cursor: default;
-}
-
-@mixin button-style__active() {
- outline: none;
- background-color: $white;
- color: $dark-gray-900;
- box-shadow: inset 0 0 0 1px $light-gray-700, inset 0 0 0 2px $white;
-}
-
-@mixin button-style__focus-active() {
- box-shadow: 0 0 0 1px color($theme-color);
-
- // Windows High Contrast mode will show this outline, but not the box-shadow.
- outline: 1px solid transparent;
-}
-
-// Switch.
-@mixin switch-style__focus-active() {
- box-shadow: 0 0 0 2px $white, 0 0 0 3px $dark-gray-300;
+@mixin block-toolbar-button-style__focus() {
+ box-shadow: inset 0 0 0 $border-width-focus $theme-color, inset 0 0 0 4px $white;
// Windows High Contrast mode will show this outline, but not the box-shadow.
outline: 2px solid transparent;
- outline-offset: 2px;
}
-
-/**
- * Block Toolbar/Formatting Buttons
- */
-
-@mixin block-toolbar-button-style__focus() {
- box-shadow: inset 0 0 0 2px color($theme-color), inset 0 0 0 4px $white; // Inner halo makes this work on top of a toggled button.
- outline: 2px solid transparent; // Shown to Windows 10 High Contrast Mode.
-}
-
-
// Tabs, Inputs, Square buttons.
@mixin input-style__neutral() {
box-shadow: 0 0 0 transparent;
transition: box-shadow 0.1s linear;
- border-radius: $radius-round-rectangle;
- border: $border-width solid $dark-gray-200;
+ border-radius: $radius-block-ui;
+ border: $border-width solid $medium-gray-text;
@include reduce-motion("transition");
}
-@mixin input-style__focus() {
- color: $dark-gray-900;
- border-color: $blue-medium-focus;
- box-shadow: 0 0 0 1px $blue-medium-focus;
-
- // Windows High Contrast mode will show this outline, but not the box-shadow.
- outline: 2px solid transparent;
-}
-
-// Square buttons.
-@mixin square-style__neutral() {
- outline-offset: -1px;
-}
-
-@mixin square-style__focus() {
- color: $dark-gray-900;
- outline-offset: -1px;
- outline: 1px dotted $dark-gray-500;
-}
-
-// Menu items.
-@mixin menu-style__neutral() {
- border: none;
- box-shadow: none;
-}
-
-@mixin menu-style__hover() {
- color: $dark-gray-900;
- border: none;
- box-shadow: none;
- background: $light-gray-200;
-}
-
-@mixin menu-style__focus() {
- color: $dark-gray-900;
- border: none;
- box-shadow: none;
- outline-offset: -2px;
- outline: 1px dotted $dark-gray-500;
-}
-// Blocks in the Library.
-@mixin block-style__disabled {
- opacity: 0.6;
- cursor: default;
-}
-
-@mixin block-style__hover {
- border-color: $theme-color;
- color: $theme-color !important;
-}
-
-@mixin block-style__focus() {
- box-shadow: inset 0 0 0 1px $white, 0 0 0 2px $theme-color;
-
- // Windows High Contrast mode will show this outline, but not the box-shadow.
- outline: 2px solid transparent;
-}
-
-@mixin block-style__is-active() {
- color: $white;
- background: $dark-gray-primary;
+@mixin input-style__focus() {
+ border-color: color($theme-color);
+ box-shadow: 0 0 0 ($border-width-focus - $border-width) $theme-color;
// Windows High Contrast mode will show this outline, but not the box-shadow.
outline: 2px solid transparent;
- outline-offset: -2px;
}
@@ -416,7 +324,7 @@
}
&:checked:focus {
- box-shadow: 0 0 0 2px $medium-gray-text;
+ box-shadow: 0 0 0 $border-width-focus $medium-gray-text;
}
}
@@ -459,7 +367,7 @@
}
&:focus {
- box-shadow: 0 0 0 2px $dark-gray-500;
+ box-shadow: 0 0 0 $border-width-focus $dark-gray-500;
}
}
}
diff --git a/packages/base-styles/_variables.scss b/packages/base-styles/_variables.scss
index 14710d5d973e32..8935761075ed9a 100644
--- a/packages/base-styles/_variables.scss
+++ b/packages/base-styles/_variables.scss
@@ -16,6 +16,8 @@ $editor-line-height: 1.8;
$big-font-size: 18px;
$mobile-text-min-font-size: 16px; // Any font size below 16px will cause Mobile Safari to "zoom in"
$border-width: 1px;
+$border-width-focus: 1.5px;
+$border-width-tab: 4px;
/**
* Grid System.
@@ -36,6 +38,7 @@ $grid-unit-60: 6 * $grid-unit; // 48px
* Dimensions.
*/
+$icon-size: 24px;
$button-size: 36px;
$button-size-small: 24px;
$panel-padding: 16px;
@@ -48,6 +51,7 @@ $admin-sidebar-width-big: 190px;
$admin-sidebar-width-collapsed: 36px;
$modal-min-width: 360px;
$spinner-size: 18px;
+$mobile-header-toolbar-height: 44px;
/**
@@ -71,27 +75,24 @@ $widget-area-width: 700px;
*/
$block-toolbar-height: $grid-unit-60;
+$mobile-block-toolbar-height: 44px;
$block-padding: 14px; // Space between block footprint and focus boundaries. These are drawn outside the block footprint, and do not affect the size.
$block-spacing: 4px; // Vertical space between blocks.
-$block-side-ui-width: 28px; // Width of the movers/drag handle UI.
+$block-side-ui-width: $button-size; // Width of the movers/drag handle UI.
$block-side-ui-clearance: 2px; // Space between movers/drag handle UI, and block.
$block-container-side-padding: $block-side-ui-width + $block-padding + 2 * $block-side-ui-clearance; // Total space left and right of the block footprint.
$block-bg-padding--v: $block-padding + $block-spacing + $block-side-ui-clearance; // padding for Blocks with a background color (eg: paragraph or group)
$block-bg-padding--h: $block-side-ui-width + $block-side-ui-clearance; // padding for Blocks with a background color (eg: paragraph or group)
+$dimmed-opacity: 1;
$block-edge-to-content: 16px;
+$solid-border-space: 12px;
+$dashed-border-space: 6px;
$block-selected-margin: 3px;
$block-selected-border-width: 1px;
$block-selected-padding: 0;
$block-selected-child-margin: 5px;
-$block-selected-child-border-width: 1px;
-$block-selected-child-padding: 0;
$block-selected-to-content: $block-edge-to-content - $block-selected-margin - $block-selected-border-width;
-$block-selected-child-to-content: $block-selected-to-content - $block-selected-child-margin - $block-selected-child-border-width;
-$block-custom-appender-to-content: $block-selected-margin - $block-selected-border-width;
-$block-media-container-to-content: $block-selected-child-margin + $block-selected-border-width;
-$block-selected-vertical-margin-descendant: 2 * $block-selected-to-content;
-$block-selected-vertical-margin-child: $block-edge-to-content;
/**
diff --git a/packages/base-styles/_z-index.scss b/packages/base-styles/_z-index.scss
index 9a3f207b6be01f..b0b09d483dab9f 100644
--- a/packages/base-styles/_z-index.scss
+++ b/packages/base-styles/_z-index.scss
@@ -24,7 +24,7 @@ $z-layers: (
".block-library-gallery-item__inline-menu": 20,
".block-editor-url-input__suggestions": 30,
".edit-post-layout__footer": 30,
- ".block-editor-editor-skeleton__header": 30,
+ ".interface-interface-skeleton__header": 30,
".edit-site-header": 62,
".edit-widgets-header": 30,
".block-library-button__inline-link .block-editor-url-input__suggestions": 6, // URL suggestions for button block above sibling inserter
@@ -62,7 +62,7 @@ $z-layers: (
// Show sidebar above wp-admin navigation bar for mobile viewports:
// #wpadminbar { z-index: 99999 }
- ".block-editor-editor-skeleton__sidebar": 100000,
+ ".interface-interface-skeleton__sidebar": 100000,
".edit-post-layout__toogle-sidebar-panel": 100000,
".edit-site-sidebar": 100000,
".edit-widgets-sidebar": 100000,
@@ -73,7 +73,7 @@ $z-layers: (
// Show sidebar in greater than small viewports above editor related elements
// but bellow #adminmenuback { z-index: 100 }
- ".block-editor-editor-skeleton__sidebar {greater than small}": 90,
+ ".interface-interface-skeleton__sidebar {greater than small}": 90,
".edit-site-sidebar {greater than small}": 90,
".edit-widgets-sidebar {greater than small}": 90,
@@ -102,12 +102,13 @@ $z-layers: (
".components-popover.table-of-contents__popover": 99998,
".components-popover.block-editor-block-navigation__popover": 99998,
".components-popover.edit-post-more-menu__content": 99998,
+ ".components-popover.edit-site-more-menu__content": 99998,
".components-popover.block-editor-rich-text__inline-format-toolbar": 99998,
".components-autocomplete__results": 1000000,
".skip-to-selected-block": 100000,
- ".block-editor-editor-skeleton__publish": 100000,
+ ".interface-interface-skeleton__actions": 100000,
// Show NUX tips above popovers, wp-admin menus, submenus, and sidebar:
".nux-dot-tip": 1000001,
diff --git a/packages/base-styles/package.json b/packages/base-styles/package.json
index 6c678639d989a5..a5f8f21f0a621a 100644
--- a/packages/base-styles/package.json
+++ b/packages/base-styles/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/base-styles",
- "version": "1.4.0",
+ "version": "1.6.0",
"description": "Base SCSS utilities and variables for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/blob/CHANGELOG.md b/packages/blob/CHANGELOG.md
index 1288967c3cfdb6..6878f2dcfb709b 100644
--- a/packages/blob/CHANGELOG.md
+++ b/packages/blob/CHANGELOG.md
@@ -1,3 +1,11 @@
+## Master
+
+## 2.8.0 (2020-04-15)
+
+### New feature
+
+- Include TypeScript type declarations ([#18942](https://github.com/WordPress/gutenberg/pull/18942))
+
## 2.1.0 (2018-10-19)
### New Features
diff --git a/packages/blob/package.json b/packages/blob/package.json
index 86a19462a1e219..9789a8ecea13c5 100644
--- a/packages/blob/package.json
+++ b/packages/blob/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/blob",
- "version": "2.7.0",
+ "version": "2.8.0",
"description": "Blob utilities for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -20,9 +20,10 @@
"main": "build/index.js",
"module": "build-module/index.js",
"react-native": "src/index",
+ "types": "build-types",
"sideEffects": false,
"dependencies": {
- "@babel/runtime": "^7.8.3"
+ "@babel/runtime": "^7.9.2"
},
"publishConfig": {
"access": "public"
diff --git a/packages/blob/src/index.js b/packages/blob/src/index.js
index 61e90ef2b4c294..ef8ba7e2f7e394 100644
--- a/packages/blob/src/index.js
+++ b/packages/blob/src/index.js
@@ -4,7 +4,7 @@
const { createObjectURL, revokeObjectURL } = window.URL;
/**
- * @type {{[key: string]: File|undefined}}
+ * @type {Record}
*/
const cache = {};
diff --git a/packages/blob/tsconfig.json b/packages/blob/tsconfig.json
new file mode 100644
index 00000000000000..3c2c31f506f132
--- /dev/null
+++ b/packages/blob/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "declarationDir": "build-types"
+ },
+ "include": [ "src/**/*" ]
+}
diff --git a/packages/block-directory/package.json b/packages/block-directory/package.json
index b67bc37395f053..a9653a267c3f31 100644
--- a/packages/block-directory/package.json
+++ b/packages/block-directory/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/block-directory",
- "version": "1.5.3",
+ "version": "1.7.1",
"description": "Extend editor with block directory features to search, download and install blocks.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/block-directory/src/components/block-ratings/index.js b/packages/block-directory/src/components/block-ratings/index.js
index c55cace300028c..c04f6c0fd7c5cd 100644
--- a/packages/block-directory/src/components/block-ratings/index.js
+++ b/packages/block-directory/src/components/block-ratings/index.js
@@ -13,13 +13,11 @@ export const BlockRatings = ( { rating, 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 843fca4385ce2a..a2d13b0aacb51b 100644
--- a/packages/block-directory/src/components/block-ratings/stars.js
+++ b/packages/block-directory/src/components/block-ratings/stars.js
@@ -17,7 +17,13 @@ function Stars( { rating } ) {
const emptyStarCount = 5 - ( fullStarCount + halfStarCount );
return (
-
+
{ times( fullStarCount, ( i ) => (
- { sprintf( __( 'Authored by %s' ), author ) }
+ { sprintf(
+ /* translators: %s: author name. */
+ __( 'Authored by %s' ),
+ author
+ ) }
{ sprintf(
+ /* translators: 1: number of blocks. 2: average rating. */
_n(
- 'This author has %d block, with an average rating of %d.',
- 'This author has %d blocks, with an average rating of %d.',
+ 'This author has %1$d block, with an average rating of %2$d.',
+ 'This author has %1$d blocks, with an average rating of %2$d.',
authorBlockCount
),
authorBlockCount,
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 78ab2962e60ce8..dc835ed3295399 100644
--- a/packages/block-directory/src/components/downloadable-block-header/index.js
+++ b/packages/block-directory/src/components/downloadable-block-header/index.js
@@ -20,10 +20,13 @@ function DownloadableBlockHeader( {
return (
{ icon.match( /\.(jpeg|jpg|gif|png)(?:\?.*)?$/ ) !== null ? (
- // translators: %s: Name of the plugin e.g: "Akismet".
) : (
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 b6865a5c9197e9..4c65e639554a9d 100644
--- a/packages/block-directory/src/components/downloadable-block-info/index.js
+++ b/packages/block-directory/src/components/downloadable-block-info/index.js
@@ -19,6 +19,7 @@ function DownloadableBlockInfo( {
{ sprintf(
+ /* translators: %s: number of active installations. */
_n(
'%d active installation',
'%d active installations',
diff --git a/packages/block-directory/src/components/downloadable-block-list-item/style.scss b/packages/block-directory/src/components/downloadable-block-list-item/style.scss
index b32b58356c4fd4..84521724a1da0c 100644
--- a/packages/block-directory/src/components/downloadable-block-list-item/style.scss
+++ b/packages/block-directory/src/components/downloadable-block-list-item/style.scss
@@ -10,7 +10,7 @@
justify-content: center;
background: transparent;
word-break: break-word;
- border-radius: $radius-round-rectangle;
+ border-radius: $radius-block-ui;
border: $border-width solid $light-gray-500;
transition: all 0.05s ease-in-out;
@include reduce-motion("transition");
diff --git a/packages/block-directory/src/components/downloadable-blocks-panel/index.js b/packages/block-directory/src/components/downloadable-blocks-panel/index.js
index 29d7cbb29ecac0..08d346d6774a58 100644
--- a/packages/block-directory/src/components/downloadable-blocks-panel/index.js
+++ b/packages/block-directory/src/components/downloadable-blocks-panel/index.js
@@ -55,6 +55,7 @@ function DownloadableBlocksPanel( {
}
const resultsFoundMessage = sprintf(
+ /* translators: %s: number of available blocks. */
_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.',
diff --git a/packages/block-editor/README.md b/packages/block-editor/README.md
index d6c047e4cb8801..4c9673524d397e 100644
--- a/packages/block-editor/README.md
+++ b/packages/block-editor/README.md
@@ -93,6 +93,18 @@ _Returns_
- `WPElement`: Block Breadcrumb.
+
# **BlockContextProvider**
+
+Component which merges passed value with current consumed block context.
+
+_Related_
+
+-
+
+_Parameters_
+
+- _props_ `BlockContextProviderProps`:
+
# **BlockControls**
Undocumented declaration.
@@ -143,8 +155,9 @@ _Related_
_Parameters_
-- _blocks_ `(Array|Object)`: A block instance (object) or an array of blocks to be previewed.
-- _viewportWidth_ `number`: Width of the preview container in pixels. Controls at what size the blocks will be rendered inside the preview. Default: 700.
+- _preview_ `Object`: options for how the preview should be shown
+- _preview.blocks_ `(Array|Object)`: A block instance (object) or an array of blocks to be previewed.
+- _preview.viewportWidth_ `number`: Width of the preview container in pixels. Controls at what size the blocks will be rendered inside the preview. Default: 700.
_Returns_
@@ -289,7 +302,7 @@ _Parameters_
_Returns_
-- `?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.
+- `?Object`: 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.
# **getFontSizeClass**
@@ -303,6 +316,45 @@ _Returns_
- `string`: String with the class corresponding to the fontSize passed. The class is generated by appending 'has-' followed by fontSizeSlug in kebabCase and ending with '-font-size'.
+# **getFontSizeObjectByValue**
+
+Returns the corresponding font size object for a given value.
+
+_Parameters_
+
+- _fontSizes_ `Array`: Array of font size objects.
+- _value_ `number`: Font size value.
+
+_Returns_
+
+- `Object`: Font size object.
+
+# **getGradientSlugByValue**
+
+Retrieves the gradient slug per slug.
+
+_Parameters_
+
+- _gradients_ `Array`: Gradient Palette
+- _value_ `string`: Gradient value
+
+_Returns_
+
+- `string`: Gradient slug.
+
+# **getGradientValueBySlug**
+
+Retrieves the gradient value per slug.
+
+_Parameters_
+
+- _gradients_ `Array`: Gradient Palette
+- _slug_ `string`: Gradient slug
+
+_Returns_
+
+- `string`: Gradient value.
+
# **InnerBlocks**
_Related_
@@ -420,7 +472,6 @@ _Properties_
- _\_\_experimentalBlockDirectory_ `boolean`: Whether the user has enabled the Block Directory
- _\_\_experimentalEnableFullSiteEditing_ `boolean`: Whether the user has enabled Full Site Editing
- _\_\_experimentalEnableFullSiteEditingDemo_ `boolean`: Whether the user has enabled Full Site Editing Demo Templates
-- _\_\_mobileEnablePageTemplates_ `boolean`: Whether the user has enabled the Page Templates
# **SkipToSelectedBlock**
diff --git a/packages/block-editor/package.json b/packages/block-editor/package.json
index dfe9bf03d86a3e..d5b0385d3cb3fb 100644
--- a/packages/block-editor/package.json
+++ b/packages/block-editor/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/block-editor",
- "version": "3.7.3",
+ "version": "3.9.1",
"description": "Generic block editor.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -22,7 +22,7 @@
"module": "build-module/index.js",
"react-native": "src/index",
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/a11y": "file:../a11y",
"@wordpress/blob": "file:../blob",
"@wordpress/blocks": "file:../blocks",
@@ -39,6 +39,7 @@
"@wordpress/is-shallow-equal": "file:../is-shallow-equal",
"@wordpress/keyboard-shortcuts": "file:../keyboard-shortcuts",
"@wordpress/keycodes": "file:../keycodes",
+ "@wordpress/priority-queue": "file:../priority-queue",
"@wordpress/rich-text": "file:../rich-text",
"@wordpress/token-list": "file:../token-list",
"@wordpress/url": "file:../url",
@@ -50,9 +51,8 @@
"dom-scroll-into-view": "^1.2.1",
"inherits": "^2.0.3",
"lodash": "^4.17.15",
- "memize": "^1.0.5",
+ "memize": "^1.1.0",
"react-autosize-textarea": "^3.0.2",
- "react-resize-aware": "^3.0.0",
"react-spring": "^8.0.19",
"redux-multi": "^0.1.12",
"refx": "^3.0.0",
diff --git a/packages/editor/src/components/autocompleters/block.js b/packages/block-editor/src/autocompleters/block.js
similarity index 91%
rename from packages/editor/src/components/autocompleters/block.js
rename to packages/block-editor/src/autocompleters/block.js
index d4fb7507477d05..db17bd51b4d84c 100644
--- a/packages/editor/src/components/autocompleters/block.js
+++ b/packages/block-editor/src/autocompleters/block.js
@@ -6,9 +6,13 @@ import { once } from 'lodash';
/**
* WordPress dependencies
*/
-import { select, dispatch } from '@wordpress/data';
+import { select } from '@wordpress/data';
import { createBlock } from '@wordpress/blocks';
-import { BlockIcon } from '@wordpress/block-editor';
+
+/**
+ * Internal dependencies
+ */
+import BlockIcon from '../components/block-icon';
/** @typedef {import('@wordpress/block-editor').WPEditorInserterItem} WPEditorInserterItem */
@@ -68,7 +72,13 @@ function defaultGetSelectedBlockName() {
* @return {Promise} Promise resolving once reusable blocks fetched.
*/
const fetchReusableBlocks = once( () => {
- dispatch( 'core/editor' ).__experimentalFetchReusableBlocks();
+ const { __experimentalFetchReusableBlocks } = select(
+ 'core/block-editor'
+ ).getSettings();
+
+ if ( __experimentalFetchReusableBlocks ) {
+ __experimentalFetchReusableBlocks();
+ }
} );
/**
@@ -84,7 +94,7 @@ export function createBlockCompleter( {
} = {} ) {
return {
name: 'blocks',
- className: 'editor-autocompleters__block',
+ className: 'block-editor-autocompleters__block',
triggerPrefix: '/',
options() {
fetchReusableBlocks();
diff --git a/packages/block-editor/src/autocompleters/style.scss b/packages/block-editor/src/autocompleters/style.scss
new file mode 100644
index 00000000000000..fc51b518435e50
--- /dev/null
+++ b/packages/block-editor/src/autocompleters/style.scss
@@ -0,0 +1,5 @@
+.block-editor-autocompleters__block {
+ .block-editor-block-icon {
+ margin-right: 8px;
+ }
+}
diff --git a/packages/editor/src/components/autocompleters/test/block.js b/packages/block-editor/src/autocompleters/test/block.js
similarity index 99%
rename from packages/editor/src/components/autocompleters/test/block.js
rename to packages/block-editor/src/autocompleters/test/block.js
index 87534d69d159d2..91a7c164cf396e 100644
--- a/packages/editor/src/components/autocompleters/test/block.js
+++ b/packages/block-editor/src/autocompleters/test/block.js
@@ -7,7 +7,7 @@ import { shallow } from 'enzyme';
* Internal dependencies
*/
import blockCompleter, { createBlockCompleter } from '../block';
-import '../../../';
+import '../../store';
describe( 'block', () => {
let originalFetch;
diff --git a/packages/block-editor/src/components/alignment-toolbar/index.js b/packages/block-editor/src/components/alignment-toolbar/index.js
index 4e44ea01387b4e..2536e2e7e79b96 100644
--- a/packages/block-editor/src/components/alignment-toolbar/index.js
+++ b/packages/block-editor/src/components/alignment-toolbar/index.js
@@ -30,6 +30,7 @@ const DEFAULT_ALIGNMENT_CONTROLS = [
const POPOVER_PROPS = {
position: 'bottom right',
+ isAlternate: true,
};
export function AlignmentToolbar( props ) {
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 fad7ec9756a73a..4c5300651aef32 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
@@ -50,6 +50,7 @@ exports[`AlignmentToolbar should allow custom alignment controls to be specified
label="Change text alignment"
popoverProps={
Object {
+ "isAlternate": true,
"position": "bottom right",
}
}
@@ -121,6 +122,7 @@ exports[`AlignmentToolbar should match snapshot 1`] = `
label="Change text alignment"
popoverProps={
Object {
+ "isAlternate": true,
"position": "bottom right",
}
}
diff --git a/packages/block-editor/src/components/autocomplete/index.js b/packages/block-editor/src/components/autocomplete/index.js
index 2deea118054500..acba4f26729233 100644
--- a/packages/block-editor/src/components/autocomplete/index.js
+++ b/packages/block-editor/src/components/autocomplete/index.js
@@ -9,11 +9,22 @@ import { clone } from 'lodash';
import { applyFilters, hasFilter } from '@wordpress/hooks';
import { compose } from '@wordpress/compose';
import { Autocomplete as OriginalAutocomplete } from '@wordpress/components';
+import { useMemo } from '@wordpress/element';
+import { getDefaultBlockName } from '@wordpress/blocks';
/**
* Internal dependencies
*/
import { withBlockEditContext } from '../block-edit/context';
+import blockAutocompleter from '../../autocompleters/block';
+
+/**
+ * Shared reference to an empty array for cases where it is important to avoid
+ * returning a new array reference on every invocation.
+ *
+ * @type {Array}
+ */
+const EMPTY_ARRAY = [];
/**
* Wrap the default Autocomplete component with one that
@@ -26,7 +37,13 @@ import { withBlockEditContext } from '../block-edit/context';
*/
export function withFilteredAutocompleters( Autocomplete ) {
return ( props ) => {
- let { completers = [] } = props;
+ let { completers = EMPTY_ARRAY, blockName } = props;
+ completers = useMemo( () => {
+ if ( blockName === getDefaultBlockName() ) {
+ return completers.concat( [ blockAutocompleter ] );
+ }
+ return completers;
+ }, [ completers, blockName ] );
if ( hasFilter( 'editor.Autocomplete.completers' ) ) {
completers = applyFilters(
diff --git a/packages/block-editor/src/components/block-breadcrumb/style.scss b/packages/block-editor/src/components/block-breadcrumb/style.scss
index db915e4d68f7bc..6dc47828019ad9 100644
--- a/packages/block-editor/src/components/block-breadcrumb/style.scss
+++ b/packages/block-editor/src/components/block-breadcrumb/style.scss
@@ -17,6 +17,7 @@
height: $button-size-small;
line-height: $button-size-small;
padding: 0;
+ position: relative;
&:hover:not(:disabled) {
text-decoration: underline;
@@ -24,10 +25,20 @@
}
&:focus {
- @include square-style__focus();
- outline-offset: -2px;
box-shadow: none;
}
+
+ &:focus::before {
+ content: "";
+ display: block;
+ position: absolute;
+ border-radius: $radius-block-ui;
+ top: $border-width;
+ right: $border-width;
+ bottom: $border-width;
+ left: $border-width;
+ box-shadow: inset 0 0 0 $border-width-focus $theme-color;
+ }
}
.block-editor-block-breadcrumb__current {
diff --git a/packages/block-editor/src/components/block-card/index.js b/packages/block-editor/src/components/block-card/index.js
index 674d437d9c7a3e..aaff1af27e16dd 100644
--- a/packages/block-editor/src/components/block-card/index.js
+++ b/packages/block-editor/src/components/block-card/index.js
@@ -8,12 +8,12 @@ function BlockCard( { blockType } ) {
-
+
{ blockType.title }
-
-
+
+
{ blockType.description }
-
+
);
diff --git a/packages/block-editor/src/components/block-card/style.scss b/packages/block-editor/src/components/block-card/style.scss
index 3b1c753929f868..993ac878d03c4c 100644
--- a/packages/block-editor/src/components/block-card/style.scss
+++ b/packages/block-editor/src/components/block-card/style.scss
@@ -18,7 +18,9 @@
.block-editor-block-card__title {
font-weight: 500;
- margin-bottom: 5px;
+ &.block-editor-block-card__title {
+ margin: 0 0 5px;
+ }
}
.block-editor-block-card__description {
diff --git a/packages/block-editor/src/components/block-context/README.md b/packages/block-editor/src/components/block-context/README.md
new file mode 100644
index 00000000000000..acb51b48e14576
--- /dev/null
+++ b/packages/block-editor/src/components/block-context/README.md
@@ -0,0 +1,57 @@
+Block Context
+=============
+
+Block Context is a React implementation of WordPress's block context. Block context, much like [React's context](https://reactjs.org/docs/context.html), is a method for passing and inheriting values deeply through a hierarchy of blocks. Because of the similarities with React's context, the client-side implementation here is quite minimal. It is complemented by equivalent behaviors in the server-side rendering of a block.
+
+Note that the implementation of Block Context is distinct from [the `BlockEdit` context](../block-edit). While it is true that both provide context relevant for the editing of a block, Block Context is implemented separately so as to prioritize it as most identifiable amongst the machinery of block context, and not amongst other client-side editing context of a block.
+
+## Usage
+
+Currently, only the [Provider component](https://reactjs.org/docs/context.html#contextprovider) is made available on the public interface of the `@wordpress/block-editor` module. This can be used to add or override context which can then be consumed by blocks rendered within that context in the block editor.
+
+```js
+import { BlockContextProvider } from '@wordpress/block-editor';
+
+function MyCustomPostEditor() {
+ return (
+
+
+
+ );
+}
+```
+
+Internal to the `@wordpress/block-editor` module, a component can access the [full Context object](https://reactjs.org/docs/context.html#api), typically for use in combination with [`useContext`](https://reactjs.org/docs/hooks-reference.html#usecontext).
+
+```js
+import { useContext } from '@wordpress/element';
+
+// Only available internally within `@wordpress/block-editor`!
+import BlockContext from '../block-context';
+
+function MyBlockComponent() {
+ const { postId } = useContext( BlockContext );
+
+ return 'The current post ID is: ' + postId;
+}
+```
+
+The reason `BlockContext` is only internally available within the `@wordpress/block-editor` module is to reinforce the expectation that external consumption of values from block context should be declared on the block registration using the `context` property.
+
+## Props
+
+`BlockContextProvider` behaves like a standard [`Context.Provider` component](https://reactjs.org/docs/context.html#contextprovider). It receives `value` and `children` props. The `value` is merged with the current block context value.
+
+### `value`
+
+- Type: `Record`
+- Required: Yes
+
+Context value to merge with current value.
+
+### `children`
+
+- Type: `ReactNode`
+- Required: Yes
+
+Component children.
diff --git a/packages/block-editor/src/components/block-context/index.js b/packages/block-editor/src/components/block-context/index.js
new file mode 100644
index 00000000000000..617ae2ef2a8ed5
--- /dev/null
+++ b/packages/block-editor/src/components/block-context/index.js
@@ -0,0 +1,36 @@
+/**
+ * WordPress dependencies
+ */
+import { createContext, useContext, useMemo } from '@wordpress/element';
+
+/** @typedef {import('react').ReactNode} ReactNode */
+
+/**
+ * @typedef BlockContextProviderProps
+ *
+ * @property {Record} value Context value to merge with current
+ * value.
+ * @property {ReactNode} children Component children.
+ */
+
+/** @type {import('react').Context>} */
+const Context = createContext( {} );
+
+/**
+ * Component which merges passed value with current consumed block context.
+ *
+ * @see https://github.com/WordPress/gutenberg/blob/master/packages/block-editor/src/components/block-context/README.md
+ *
+ * @param {BlockContextProviderProps} props
+ */
+export function BlockContextProvider( { value, children } ) {
+ const context = useContext( Context );
+ const nextValue = useMemo( () => ( { ...context, ...value } ), [
+ context,
+ value,
+ ] );
+
+ return ;
+}
+
+export default Context;
diff --git a/packages/block-editor/src/components/block-edit/edit.js b/packages/block-editor/src/components/block-edit/edit.js
index a4f08d0c96a36f..936fb24c4fc2a1 100644
--- a/packages/block-editor/src/components/block-edit/edit.js
+++ b/packages/block-editor/src/components/block-edit/edit.js
@@ -2,6 +2,7 @@
* External dependencies
*/
import classnames from 'classnames';
+import { pick } from 'lodash';
/**
* WordPress dependencies
@@ -12,10 +13,36 @@ import {
hasBlockSupport,
getBlockType,
} from '@wordpress/blocks';
+import { useContext, useMemo } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import BlockContext from '../block-context';
+
+/**
+ * Default value used for blocks which do not define their own context needs,
+ * used to guarantee that a block's `context` prop will always be an object. It
+ * is assigned as a constant since it is always expected to be an empty object,
+ * and in order to avoid unnecessary React reconciliations of a changing object.
+ *
+ * @type {{}}
+ */
+const DEFAULT_BLOCK_CONTEXT = {};
export const Edit = ( props ) => {
const { attributes = {}, name } = props;
const blockType = getBlockType( name );
+ const blockContext = useContext( BlockContext );
+
+ // Assign context values using the block type's declared context needs.
+ const context = useMemo(
+ () =>
+ blockType && blockType.context
+ ? pick( blockContext, blockType.context )
+ : DEFAULT_BLOCK_CONTEXT,
+ [ blockType, blockContext ]
+ );
if ( ! blockType ) {
return null;
@@ -32,7 +59,7 @@ export const Edit = ( props ) => {
);
if ( lightBlockWrapper ) {
- return ;
+ return ;
}
// Generate a class name for the block's editable form
@@ -41,7 +68,9 @@ export const Edit = ( props ) => {
: null;
const className = classnames( generatedClassName, attributes.className );
- return ;
+ return (
+
+ );
};
export default withFilters( 'editor.BlockEdit' )( Edit );
diff --git a/packages/block-editor/src/components/block-edit/test/edit.js b/packages/block-editor/src/components/block-edit/test/edit.js
index 0b07eb03b2aad6..6c273de2351961 100644
--- a/packages/block-editor/src/components/block-edit/test/edit.js
+++ b/packages/block-editor/src/components/block-edit/test/edit.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import { shallow } from 'enzyme';
+import { shallow, mount } from 'enzyme';
import { noop } from 'lodash';
/**
@@ -17,6 +17,7 @@ import {
* Internal dependencies
*/
import { Edit } from '../edit';
+import { BlockContextProvider } from '../../block-context';
describe( 'Edit', () => {
afterEach( () => {
@@ -79,4 +80,47 @@ describe( 'Edit', () => {
);
expect( wrapper.find( edit ).hasClass( 'my-class' ) ).toBe( true );
} );
+
+ it( 'should assign context', () => {
+ const edit = ( { context } ) => context.value;
+ registerBlockType( 'core/test-block', {
+ category: 'common',
+ title: 'block title',
+ context: [ 'value' ],
+ edit,
+ save: noop,
+ } );
+
+ const wrapper = mount(
+
+
+
+ );
+
+ expect( wrapper.html() ).toBe( 'Ok' );
+ } );
+
+ describe( 'light wrapper', () => {
+ it( 'should assign context', () => {
+ const edit = ( { context } ) => context.value;
+ registerBlockType( 'core/test-block', {
+ category: 'common',
+ title: 'block title',
+ context: [ 'value' ],
+ supports: {
+ lightBlockWrapper: true,
+ },
+ edit,
+ save: noop,
+ } );
+
+ const wrapper = mount(
+
+
+
+ );
+
+ expect( wrapper.html() ).toBe( 'Ok' );
+ } );
+ } );
} );
diff --git a/packages/block-editor/src/components/block-inspector/index.js b/packages/block-editor/src/components/block-inspector/index.js
index ae07e4d486bdc3..0a0eab0784ab19 100644
--- a/packages/block-editor/src/components/block-inspector/index.js
+++ b/packages/block-editor/src/components/block-inspector/index.js
@@ -5,6 +5,7 @@ import { __ } from '@wordpress/i18n';
import {
getBlockType,
getUnregisteredTypeHandlerName,
+ hasBlockSupport,
} from '@wordpress/blocks';
import {
PanelBody,
@@ -31,7 +32,6 @@ const BlockInspector = ( {
showNoBlockSelectedMessage = true,
} ) => {
const slot = useSlot( InspectorAdvancedControls.slotName );
- const hasFills = Boolean( slot.fills && slot.fills.length );
if ( count > 1 ) {
return ;
@@ -59,14 +59,22 @@ const BlockInspector = ( {
return null;
}
+ const hasFills = Boolean( slot.fills && slot.fills.length );
+
return (
{ hasBlockStyles && (
-
+
-
+ { hasBlockSupport(
+ blockType.name,
+ 'defaultStylePicker',
+ true
+ ) && (
+
+ ) }
) }
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 bd226053c6e9b8..3075f0da1f8aff 100644
--- a/packages/block-editor/src/components/block-list-appender/index.js
+++ b/packages/block-editor/src/components/block-list-appender/index.js
@@ -27,6 +27,7 @@ function BlockListAppender( {
isLocked,
renderAppender: CustomAppender,
className,
+ tagName: TagName = 'div',
} ) {
if ( isLocked || CustomAppender === false ) {
return null;
@@ -57,7 +58,7 @@ function BlockListAppender( {
}
return (
-
{ appender }
-
+
);
}
diff --git a/packages/block-editor/src/components/block-list-appender/style.scss b/packages/block-editor/src/components/block-list-appender/style.scss
index e0fdd9d4e0afb0..bafeb06de9bd74 100644
--- a/packages/block-editor/src/components/block-list-appender/style.scss
+++ b/packages/block-editor/src/components/block-list-appender/style.scss
@@ -8,6 +8,14 @@
.has-background & {
margin: ($grid-unit-20 + $block-spacing) $grid-unit-10;
}
+
+ // Animate appearance.
+ .block-list-appender__toggle {
+ opacity: 1;
+ transform: scale(1);
+ transition: all 0.1s ease;
+ @include reduce-motion("transition");
+ }
}
.block-list-appender.is-drop-target > div::before {
@@ -24,3 +32,13 @@
.block-list-appender > .block-editor-inserter {
display: block;
}
+
+
+// Hide the nested appender unless parent or child is selected.
+// This selector targets unselected blocks that have only a single nesting level.
+.block-editor-block-list__block:not(.is-selected):not(.has-child-selected):not(.block-editor-block-list__layout) {
+ .block-editor-block-list__layout > .block-list-appender .block-list-appender__toggle {
+ opacity: 0;
+ transform: scale(0);
+ }
+}
diff --git a/packages/block-editor/src/components/block-list/block-elements.js b/packages/block-editor/src/components/block-list/block-elements.js
new file mode 100644
index 00000000000000..1d71649a1cc479
--- /dev/null
+++ b/packages/block-editor/src/components/block-list/block-elements.js
@@ -0,0 +1,23 @@
+const ELEMENTS = [
+ 'p',
+ 'div',
+ 'h1',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'ol',
+ 'ul',
+ 'li',
+ 'figure',
+ 'nav',
+ 'pre',
+ 'header',
+ 'section',
+ 'aside',
+ 'footer',
+ 'main',
+];
+
+export default ELEMENTS;
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 be93d313342ad7..fc8876253734c2 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
@@ -10,7 +10,7 @@ import styles from './block-mobile-floating-toolbar.scss';
const FloatingToolbar = ( { children } ) => {
return (
-
+
{ children }
);
diff --git a/packages/block-editor/src/components/block-list/block-wrapper.js b/packages/block-editor/src/components/block-list/block-wrapper.js
index 964bef9008420a..52f353428e23f0 100644
--- a/packages/block-editor/src/components/block-list/block-wrapper.js
+++ b/packages/block-editor/src/components/block-list/block-wrapper.js
@@ -27,6 +27,7 @@ import { isInsideRootBlock } from '../../utils/dom';
import useMovingAnimation from './moving-animation';
import { Context, BlockNodes } from './root-container';
import { BlockContext } from './block';
+import ELEMENTS from './block-elements';
const BlockComponent = forwardRef(
( { children, tagName = 'div', __unstableIsHtml, ...props }, wrapper ) => {
@@ -101,7 +102,10 @@ const BlockComponent = forwardRef(
// should only consider tabbables within editable display, since it
// may be the wrapper itself or a side control which triggered the
// focus event, don't unnecessary transition to an inner tabbable.
- if ( wrapper.current.contains( document.activeElement ) ) {
+ if (
+ document.activeElement &&
+ isInsideRootBlock( wrapper.current, document.activeElement )
+ ) {
return;
}
@@ -109,9 +113,11 @@ const BlockComponent = forwardRef(
const textInputs = focus.tabbable
.find( wrapper.current )
.filter( isTextField )
- // Exclude inner blocks
- .filter( ( node ) =>
- isInsideRootBlock( wrapper.current, node )
+ // Exclude inner blocks and block appenders
+ .filter(
+ ( node ) =>
+ isInsideRootBlock( wrapper.current, node ) &&
+ ! node.closest( '.block-list-appender' )
);
// If reversed (e.g. merge via backspace), use the last in the set of
@@ -199,7 +205,11 @@ const BlockComponent = forwardRef(
{ ...props }
id={ blockElementId }
ref={ wrapper }
- className={ classnames( className, props.className ) }
+ className={ classnames(
+ className,
+ props.className,
+ wrapperProps && wrapperProps.className
+ ) }
data-block={ clientId }
data-type={ name }
data-title={ blockTitle }
@@ -209,6 +219,7 @@ const BlockComponent = forwardRef(
onMouseLeave={ isSelected ? onMouseLeave : undefined }
tabIndex="0"
style={ {
+ ...( wrapperProps ? wrapperProps.style : {} ),
...( props.style || {} ),
...animationStyle,
} }
@@ -219,21 +230,7 @@ const BlockComponent = forwardRef(
}
);
-const elements = [
- 'p',
- 'div',
- 'h1',
- 'h2',
- 'h3',
- 'h4',
- 'h5',
- 'h6',
- 'ol',
- 'ul',
- 'figure',
-];
-
-const ExtendedBlockComponent = elements.reduce( ( acc, element ) => {
+const ExtendedBlockComponent = ELEMENTS.reduce( ( acc, element ) => {
acc[ element ] = forwardRef( ( props, ref ) => {
return ;
} );
diff --git a/packages/block-editor/src/components/block-list/block-wrapper.native.js b/packages/block-editor/src/components/block-list/block-wrapper.native.js
new file mode 100644
index 00000000000000..c97dae59059f54
--- /dev/null
+++ b/packages/block-editor/src/components/block-list/block-wrapper.native.js
@@ -0,0 +1,11 @@
+/**
+ * Internal dependencies
+ */
+import ELEMENTS from './block-elements';
+
+const ExtendedBlockComponent = ELEMENTS.reduce( ( acc, element ) => {
+ acc[ element ] = element;
+ return acc;
+}, String );
+
+export const Block = ExtendedBlockComponent;
diff --git a/packages/block-editor/src/components/block-list/block.js b/packages/block-editor/src/components/block-list/block.js
index 52b1a915364b04..448f4b74514565 100644
--- a/packages/block-editor/src/components/block-list/block.js
+++ b/packages/block-editor/src/components/block-list/block.js
@@ -39,6 +39,7 @@ function BlockListBlock( {
isLocked,
clientId,
rootClientId,
+ isHighlighted,
isSelected,
isMultiSelected,
isPartOfMultiSelection,
@@ -61,7 +62,6 @@ function BlockListBlock( {
enableAnimation,
isNavigationMode,
isMultiSelecting,
- hasSelectedUI = true,
} ) {
// In addition to withSelect, we should favor using useSelect in this
// component going forward to avoid leaking new props to the public API
@@ -87,7 +87,7 @@ function BlockListBlock( {
isDraggingBlocks && ( isSelected || isPartOfMultiSelection );
// Determine whether the block has props to apply to the wrapper.
- if ( ! lightBlockWrapper && blockType.getEditWrapperProps ) {
+ if ( blockType.getEditWrapperProps ) {
wrapperProps = {
...wrapperProps,
...blockType.getEditWrapperProps( attributes ),
@@ -109,9 +109,9 @@ function BlockListBlock( {
customClassName,
'wp-block block-editor-block-list__block',
{
- 'has-selected-ui': hasSelectedUI,
'has-warning': ! isValid || !! hasError || isUnregisteredBlock,
'is-selected': isSelected,
+ 'is-highlighted': isHighlighted,
'is-multi-selected': isMultiSelected,
'is-reusable': isReusableBlock( blockType ),
'is-dragging': isDragging,
@@ -228,6 +228,7 @@ const applyWithSelect = withSelect(
getTemplateLock,
__unstableGetBlockWithoutInnerBlocks,
isNavigationMode,
+ isBlockHighlighted,
} = select( 'core/block-editor' );
const block = __unstableGetBlockWithoutInnerBlocks( clientId );
const isSelected = isBlockSelected( clientId );
@@ -248,6 +249,7 @@ const applyWithSelect = withSelect(
const { name, attributes, isValid } = block || {};
return {
+ isHighlighted: isBlockHighlighted( clientId ),
isMultiSelected: isBlockMultiSelected( clientId ),
isPartOfMultiSelection:
isBlockMultiSelected( 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 2501094b59339c..918c414ba833ce 100644
--- a/packages/block-editor/src/components/block-list/block.native.js
+++ b/packages/block-editor/src/components/block-list/block.native.js
@@ -12,7 +12,6 @@ import { withDispatch, withSelect } from '@wordpress/data';
import { compose, withPreferredColorScheme } from '@wordpress/compose';
import {
getBlockType,
- getUnregisteredTypeHandlerName,
__experimentalGetAccessibleBlockLabel as getAccessibleBlockLabel,
} from '@wordpress/blocks';
import { __ } from '@wordpress/i18n';
@@ -67,6 +66,7 @@ class BlockListBlock extends Component {
this.props.onCaretVerticalPositionChange
}
clientId={ this.props.clientId }
+ contentStyle={ this.props.contentStyle }
/>
);
}
@@ -79,104 +79,6 @@ class BlockListBlock extends Component {
);
}
- applySelectedBlockStyle() {
- const { hasChildren, getStylesFromColorScheme } = this.props;
-
- const fullSolidBorderStyle = {
- // define style for full border
- ...styles.fullSolidBordered,
- ...getStylesFromColorScheme(
- styles.solidBorderColor,
- styles.solidBorderColorDark
- ),
- };
-
- if ( hasChildren ) {
- // if block has children apply style for selected parent
- return { ...styles.selectedParent, ...fullSolidBorderStyle };
- }
-
- /* selected block is one of below:
- 1. does not have children
- 2. is not on root list level
- 3. is an emty group block on root or nested level */
- return { ...styles.selectedLeaf, ...fullSolidBorderStyle };
- }
-
- applyUnSelectedBlockStyle() {
- const {
- hasChildren,
- isParentSelected,
- isAncestorSelected,
- hasParent,
- getStylesFromColorScheme,
- isLastBlock,
- } = this.props;
-
- // if block does not have parent apply neutral or full
- // margins depending if block has children or not
- if ( ! hasParent ) {
- return hasChildren ? styles.neutral : styles.full;
- }
-
- if ( isParentSelected ) {
- // parent of a block is selected
- const dashedBorderStyle = {
- // define style for dashed border
- ...styles.dashedBordered,
- ...getStylesFromColorScheme(
- styles.dashedBorderColor,
- styles.dashedBorderColorDark
- ),
- };
-
- // return apply childOfSelected or childOfSelectedLeaf
- // margins depending if block has children or not
- return {
- ...( hasChildren
- ? styles.childOfSelected
- : styles.childOfSelectedLeaf ),
- ...dashedBorderStyle,
- ...( ! isLastBlock && styles.marginVerticalChild ),
- };
- }
-
- if ( isAncestorSelected ) {
- // ancestor of a block is selected
- return {
- ...styles.descendantOfSelectedLeaf,
- ...( hasChildren && {
- ...styles.marginHorizontalNone,
- ...styles.marginVerticalNone,
- } ),
- ...( ! isLastBlock && styles.marginVerticalDescendant ),
- };
- }
-
- // if none of above condition are met return apply neutral or full
- // margins depending if block has children or not
- return hasChildren ? styles.neutral : styles.full;
- }
-
- applyBlockStyle() {
- const { isSelected, isDimmed } = this.props;
-
- return [
- isSelected
- ? this.applySelectedBlockStyle()
- : this.applyUnSelectedBlockStyle(),
- isDimmed && styles.dimmed,
- ];
- }
-
- applyToolbarStyle() {
- const { hasChildren, isUnregisteredBlock } = this.props;
-
- if ( ! hasChildren || isUnregisteredBlock ) {
- return styles.neutralToolbar;
- }
- }
-
render() {
const {
attributes,
@@ -188,10 +90,18 @@ class BlockListBlock extends Component {
order,
title,
parentId,
+ isDimmed,
isTouchable,
+ onDeleteBlock,
+ horizontalDirection,
hasParent,
+ isParentSelected,
onSelect,
showFloatingToolbar,
+ getStylesFromColorScheme,
+ marginVertical,
+ marginHorizontal,
+ isInnerBlockSelected,
} = this.props;
const accessibilityLabel = getAccessibleBlockLabel(
@@ -200,13 +110,18 @@ class BlockListBlock extends Component {
order + 1
);
+ const accessible = ! ( isSelected || isInnerBlockSelected );
+
return (
-
+
{ showFloatingToolbar && (
{ hasParent && (
@@ -225,8 +140,33 @@ class BlockListBlock extends Component {
+ { isSelected && (
+
+ ) }
+ { isParentSelected && (
+
+ ) }
{ isValid ? (
this.getBlockForType()
) : (
@@ -235,9 +175,13 @@ class BlockListBlock extends Component {
icon={ icon }
/>
) }
-
+
{ isSelected && (
-
+
) }
@@ -259,16 +203,15 @@ export default compose( [
getBlockRootClientId,
getLowestCommonAncestorWithSelectedBlock,
getBlockParents,
- getBlockCount,
+ hasSelectedInnerBlock,
} = select( 'core/block-editor' );
const order = getBlockIndex( clientId, rootClientId );
const isSelected = isBlockSelected( clientId );
- const isLastBlock = order === getBlockCount( rootClientId ) - 1;
+ const isInnerBlockSelected = hasSelectedInnerBlock( clientId );
const block = __unstableGetBlockWithoutInnerBlocks( clientId );
const { name, attributes, isValid } = block || {};
- const isUnregisteredBlock = name === getUnregisteredTypeHandlerName();
const blockType = getBlockType( name || 'core/missing' );
const title = blockType.title;
const icon = blockType.icon;
@@ -292,8 +235,6 @@ export default compose( [
? parents[ commonAncestorIndex ]
: parents[ parents.length - 1 ];
- const hasChildren =
- ! isUnregisteredBlock && !! getBlockCount( clientId );
const hasParent = !! parentId;
const isParentSelected =
selectedBlockClientId && selectedBlockClientId === parentId;
@@ -329,18 +270,16 @@ export default compose( [
title,
attributes,
blockType,
- isLastBlock,
isSelected,
+ isInnerBlockSelected,
isValid,
parentId,
isParentSelected,
firstToSelectId,
- hasChildren,
hasParent,
isAncestorSelected,
isTouchable,
isDimmed,
- isUnregisteredBlock,
showFloatingToolbar,
};
} ),
diff --git a/packages/block-editor/src/components/block-list/block.native.scss b/packages/block-editor/src/components/block-list/block.native.scss
index 4c6936e57f5458..0d1c60fe4f1f19 100644
--- a/packages/block-editor/src/components/block-list/block.native.scss
+++ b/packages/block-editor/src/components/block-list/block.native.scss
@@ -2,18 +2,6 @@
flex: 1 1 auto;
}
-.fullSolidBordered {
- border-width: $block-selected-border-width;
- border-radius: 4px;
- border-style: solid;
-}
-
-.dashedBordered {
- border-width: $block-selected-child-border-width;
- border-radius: 2px;
- border-style: dashed;
-}
-
.solidBorderColor {
border-color: $blue-wordpress;
}
@@ -31,32 +19,7 @@
}
.dimmed {
- opacity: 0.2;
-}
-
-.horizontalSpaceNone {
- padding-left: 0;
- padding-right: 0;
- margin-left: 0;
- margin-right: 0;
-}
-
-.marginHorizontalNone {
- margin-left: 0;
- margin-right: 0;
-}
-
-.marginVerticalDescendant {
- margin-bottom: $block-selected-vertical-margin-descendant;
-}
-
-.marginVerticalChild {
- margin-bottom: $block-selected-vertical-margin-child;
-}
-
-.marginVerticalNone {
- margin-top: 0;
- margin-bottom: 0;
+ opacity: $dimmed-opacity;
}
.blockTitle {
@@ -66,44 +29,6 @@
padding-bottom: 4px;
}
-.neutral {
- margin: 0;
- border: 0;
- padding: 0;
-}
-
-.full {
- margin: $block-edge-to-content;
- border: 0;
- padding: 0;
-}
-
-.selectedLeaf {
- margin: $block-selected-margin;
- padding-left: $block-selected-to-content;
- padding-right: $block-selected-to-content;
- padding-top: $block-selected-to-content;
-}
-
-.selectedParent {
- margin: $block-selected-margin;
- padding: 0;
-}
-
-.childOfSelected {
- margin: $block-selected-child-margin;
- padding: 0;
-}
-
-.childOfSelectedLeaf {
- margin: $block-selected-child-margin;
- padding: $block-selected-child-to-content;
-}
-
-.descendantOfSelectedLeaf {
- margin: $block-selected-child-to-content;
-}
-
.aztec_container {
flex: 1;
}
@@ -137,3 +62,25 @@
margin-left: -$block-edge-to-content;
margin-right: -$block-edge-to-content;
}
+
+.solidBorder {
+ position: absolute;
+ top: -$solid-border-space;
+ bottom: 0;
+ left: -$solid-border-space;
+ right: -$solid-border-space;
+ border-width: $block-selected-border-width;
+ border-radius: 4px;
+ border-style: solid;
+}
+
+.dashedBorder {
+ position: absolute;
+ top: -$dashed-border-space;
+ bottom: -$dashed-border-space;
+ left: -$dashed-border-space;
+ right: -$dashed-border-space;
+ border-width: $block-selected-border-width;
+ border-radius: 2px;
+ border-style: dashed;
+}
diff --git a/packages/block-editor/src/components/block-list/breadcrumb.js b/packages/block-editor/src/components/block-list/breadcrumb.js
index a47db75152663e..2151725040c461 100644
--- a/packages/block-editor/src/components/block-list/breadcrumb.js
+++ b/packages/block-editor/src/components/block-list/breadcrumb.js
@@ -1,7 +1,7 @@
/**
* WordPress dependencies
*/
-import { Toolbar, Button } from '@wordpress/components';
+import { Button } from '@wordpress/components';
import { useSelect, useDispatch } from '@wordpress/data';
import { useEffect, useRef } from '@wordpress/element';
import { BACKSPACE, DELETE } from '@wordpress/keycodes';
@@ -75,16 +75,14 @@ function BlockBreadcrumb( {
return (
-
- setNavigationMode( false ) }
- onKeyDown={ onKeyDown }
- label={ label }
- >
-
-
-
+ setNavigationMode( false ) }
+ onKeyDown={ onKeyDown }
+ label={ label }
+ >
+
+
);
}
diff --git a/packages/block-editor/src/components/block-list/index.js b/packages/block-editor/src/components/block-list/index.js
index cbc95d7714c765..aeb21f503e78d4 100644
--- a/packages/block-editor/src/components/block-list/index.js
+++ b/packages/block-editor/src/components/block-list/index.js
@@ -29,8 +29,8 @@ function BlockList(
rootClientId,
isDraggable,
renderAppender,
- __experimentalUIParts = {},
__experimentalTagName = 'div',
+ __experimentalAppenderTagName,
__experimentalPassedProps = {},
},
ref
@@ -72,9 +72,6 @@ function BlockList(
element: ref,
rootClientId,
} );
- const __experimentalContainerProps = rootClientId
- ? {}
- : { hasPopover: __experimentalUIParts.hasPopover };
return (
{ blockClientIds.map( ( clientId, index ) => {
const isBlockInSelection = hasMultiSelection
@@ -107,9 +103,6 @@ function BlockList(
// otherwise there might be a small delay to trigger the animation.
index={ index }
enableAnimation={ enableAnimation }
- hasSelectedUI={
- __experimentalUIParts.hasSelectedUI
- }
className={
clientId === targetClientId
? 'is-drop-target'
@@ -120,6 +113,7 @@ function BlockList(
);
} ) }
-
-
+
+
+
+
+
);
}
@@ -97,16 +98,28 @@ export class BlockList extends Component {
withFooter = true,
isReadOnly,
isRootList,
+ horizontal,
shouldShowInsertionPointBefore,
shouldShowInsertionPointAfter,
+ marginVertical = styles.defaultBlock.marginTop,
+ marginHorizontal = styles.defaultBlock.marginLeft,
} = this.props;
+ const { blockToolbar, blockBorder, headerToolbar } = styles;
+
const forceRefresh =
shouldShowInsertionPointBefore || shouldShowInsertionPointAfter;
+ const containerStyle = {
+ flex: isRootList ? 1 : 0,
+ // We set negative margin in the parent to remove the edge spacing between parent block and child block in ineer blocks
+ marginVertical: isRootList ? 0 : -marginVertical,
+ marginHorizontal: isRootList ? 0 : -marginHorizontal,
+ };
+
return (
{ this.shouldShowInnerBlockAppender() && (
-
+
-
+
+
{ shouldShowInsertionPointBefore( clientId ) && (
) }
@@ -166,10 +211,16 @@ export class BlockList extends Component {
key={ clientId }
showTitle={ false }
clientId={ clientId }
+ marginVertical={ marginVertical }
+ marginHorizontal={ marginHorizontal }
rootClientId={ this.props.rootClientId }
onCaretVerticalPositionChange={
this.onCaretVerticalPositionChange
}
+ horizontalDirection={ horizontalDirection }
+ contentStyle={ contentStyle }
+ onAddBlock={ onAddBlock }
+ onDeleteBlock={ onDeleteBlock }
/>
{ ! this.shouldShowInnerBlockAppender() &&
shouldShowInsertionPointAfter( clientId ) && (
@@ -185,6 +236,7 @@ export class BlockList extends Component {
return (
<>
{
this.addBlockToEndOfPost( paragraphBlock );
} }
@@ -197,7 +249,7 @@ export class BlockList extends Component {
}
export default compose( [
- withSelect( ( select, { rootClientId } ) => {
+ withSelect( ( select, { rootClientId, __experimentalMoverDirection } ) => {
const {
getBlockCount,
getBlockOrder,
@@ -207,12 +259,16 @@ export default compose( [
getSettings,
} = select( 'core/block-editor' );
+ const horizontalDirection =
+ __experimentalMoverDirection === 'horizontal';
+
const selectedBlockClientId = getSelectedBlockClientId();
const blockClientIds = getBlockOrder( rootClientId );
const insertionPoint = getBlockInsertionPoint();
const blockInsertionPointIsVisible = isBlockInsertionPointVisible();
const shouldShowInsertionPointBefore = ( clientId ) => {
return (
+ ! horizontalDirection &&
blockInsertionPointIsVisible &&
insertionPoint.rootClientId === rootClientId &&
// if list is empty, show the insertion point (via the default appender)
@@ -223,6 +279,7 @@ export default compose( [
};
const shouldShowInsertionPointAfter = ( clientId ) => {
return (
+ ! horizontalDirection &&
blockInsertionPointIsVisible &&
insertionPoint.rootClientId === rootClientId &&
// if the insertion point is at the end of the list
@@ -243,6 +300,7 @@ export default compose( [
selectedBlockClientId,
isReadOnly,
isRootList: rootClientId === undefined,
+ horizontalDirection,
};
} ),
withDispatch( ( dispatch ) => {
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 7aa46530ad3878..3d23ad7da4431b 100644
--- a/packages/block-editor/src/components/block-list/insertion-point.js
+++ b/packages/block-editor/src/components/block-list/insertion-point.js
@@ -49,7 +49,6 @@ function Indicator( { clientId } ) {
}
export default function InsertionPoint( {
- className,
isMultiSelecting,
hasMultiSelection,
selectedBlockClientId,
@@ -72,7 +71,11 @@ export default function InsertionPoint( {
} );
function onMouseMove( event ) {
- if ( event.target.className !== className ) {
+ if (
+ ! event.target.classList.contains(
+ 'block-editor-block-list__layout'
+ )
+ ) {
if ( isInserterShown ) {
setIsInserterShown( false );
}
@@ -177,7 +180,10 @@ export default function InsertionPoint( {
}
) }
>
-
+
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 6af4ba78ea6348..c4fa6a46fc2d14 100644
--- a/packages/block-editor/src/components/block-list/moving-animation.js
+++ b/packages/block-editor/src/components/block-list/moving-animation.js
@@ -10,7 +10,7 @@ import {
useState,
useLayoutEffect,
useReducer,
- useMemo,
+ useRef,
} from '@wordpress/element';
import { useReducedMotion } from '@wordpress/compose';
import { getScrollContainer } from '@wordpress/dom';
@@ -69,12 +69,7 @@ function useMovingAnimation(
} );
const previous = ref.current ? getAbsolutePosition( ref.current ) : null;
- const scrollContainer = useMemo( () => {
- if ( ! adjustScrolling ) {
- return false;
- }
- return getScrollContainer( ref.current );
- }, [ adjustScrolling ] );
+ const scrollContainer = useRef();
useLayoutEffect( () => {
if ( triggeredAnimation ) {
@@ -82,14 +77,17 @@ function useMovingAnimation(
}
}, [ triggeredAnimation ] );
useLayoutEffect( () => {
+ scrollContainer.current = getScrollContainer( ref.current );
if ( prefersReducedMotion ) {
- if ( adjustScrolling && scrollContainer ) {
+ if ( adjustScrolling && scrollContainer.current && previous ) {
// if the animation is disabled and the scroll needs to be adjusted,
// 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.current.scrollTop =
+ scrollContainer.current.scrollTop -
+ previous.top +
+ destination.top;
}
return;
@@ -100,8 +98,10 @@ function useMovingAnimation(
x: previous ? previous.left - destination.left : 0,
y: previous ? previous.top - destination.top : 0,
scrollTop:
- previous && scrollContainer
- ? scrollContainer.scrollTop - previous.top + destination.top
+ previous && scrollContainer.current
+ ? scrollContainer.current.scrollTop -
+ previous.top +
+ destination.top
: 0,
};
ref.current.style.transform =
@@ -127,11 +127,12 @@ function useMovingAnimation(
onFrame: ( props ) => {
if (
adjustScrolling &&
- scrollContainer &&
+ scrollContainer.current &&
! prefersReducedMotion &&
props.y
) {
- scrollContainer.scrollTop = transform.scrollTop + props.y;
+ scrollContainer.current.scrollTop =
+ transform.scrollTop + props.y;
}
},
} );
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 57bc4ff137459c..89569ab0a90444 100644
--- a/packages/block-editor/src/components/block-list/root-container.js
+++ b/packages/block-editor/src/components/block-list/root-container.js
@@ -1,3 +1,8 @@
+/**
+ * External dependencies
+ */
+import classnames from 'classnames';
+
/**
* WordPress dependencies
*/
@@ -46,7 +51,7 @@ function onDragStart( event ) {
}
}
-function RootContainer( { children, className, hasPopover = true }, ref ) {
+function RootContainer( { children, className }, ref ) {
const {
selectedBlockClientId,
hasMultiSelection,
@@ -76,17 +81,16 @@ function RootContainer( { children, className, hasPopover = true }, ref ) {
return (
- { hasPopover ? : null }
+
diff --git a/packages/block-editor/src/components/block-list/style.native.scss b/packages/block-editor/src/components/block-list/style.native.scss
index c102d1644d838b..78994455ca0f30 100644
--- a/packages/block-editor/src/components/block-list/style.native.scss
+++ b/packages/block-editor/src/components/block-list/style.native.scss
@@ -4,6 +4,16 @@
background-color: #fff;
}
+.horizontalContentContainer {
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ align-items: stretch;
+ max-width: $content-width;
+ overflow: visible;
+ width: 100%;
+}
+
.switch {
flex-direction: row;
justify-content: flex-start;
@@ -30,8 +40,9 @@
flex: 1;
text-align: center;
font-family: $default-monospace-font;
- font-size: 12px;
- font-weight: bold;
+ font-size: 14px;
+ color: $gray;
+ margin: 0 8px;
}
.labelStyleAddHereDark {
@@ -46,7 +57,30 @@
height: 80px;
}
-.paddingToContent {
- padding-left: $block-custom-appender-to-content;
- padding-right: $block-custom-appender-to-content;
+.defaultBlock {
+ margin: $block-edge-to-content;
+}
+
+.defaultAppender {
+ margin: $block-edge-to-content;
+}
+
+.innerAppender {
+ margin: $block-edge-to-content / 2;
+}
+
+.blockBorder {
+ width: $block-selected-border-width;
+}
+
+.headerToolbar {
+ height: $mobile-header-toolbar-height;
+}
+
+.blockToolbar {
+ height: $mobile-block-toolbar-height;
+}
+
+.overflowVisible {
+ overflow: visible;
}
diff --git a/packages/block-editor/src/components/block-list/style.scss b/packages/block-editor/src/components/block-list/style.scss
index 7142b93dd36dbe..f7dc606b69cb15 100644
--- a/packages/block-editor/src/components/block-list/style.scss
+++ b/packages/block-editor/src/components/block-list/style.scss
@@ -1,3 +1,8 @@
+.block-editor-block-list__block {
+ margin-left: auto;
+ margin-right: auto;
+}
+
.block-editor-block-list__layout .block-editor-block-list__block { // Needs specificity to override inherited styles.
// While block is being dragged, dim the slot dragged from, and hide some UI.
&.is-dragging {
@@ -15,34 +20,12 @@
}
}
-
-/**
- * General Post Content Layout
- */
-
-// Add side padding for the main block container, currently post_content.
-// The purpose of this padding is to ensure that on small viewports, there is
-// room for the block border that sits 14px ($block-padding) offset from the
-// block footprint, as well as the side-UI.
-.block-editor-block-list__layout {
- padding-left: $block-padding;
- padding-right: $block-padding;
- position: relative;
-
- // Beyond the mobile breakpoint, compensate for side UI.
- @include break-small() {
- padding-left: $block-padding + $block-side-ui-width + $block-padding + $border-width * 2;
- padding-right: $block-padding + $block-side-ui-width + $block-padding + $border-width * 2;
- }
-
- // Don't propogate that padding to nested blocks.
- .block-editor-block-list__layout {
- padding-left: 0;
- padding-right: 0;
- }
+// This remove the margins set here: https://github.com/WordPress/gutenberg/blob/17e5c2d870d84fb6de48dcd5bc3c38cd0c0fb0d0/packages/block-library/src/editor.scss#L56
+// It removes the margins around blocks when a BlockPreview is rendered in the block style selector
+.block-editor-block-styles .editor-styles-wrapper .block-editor-block-list__block {
+ margin: 0;
}
-
/**
* Notices & Block Selected/Hover Styles.
*/
@@ -91,18 +74,18 @@
z-index: 1;
pointer-events: none;
content: "";
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
+ top: $border-width;
+ bottom: $border-width;
+ left: $border-width;
+ right: $border-width;
// 2px outside.
- box-shadow: 0 0 0 2px $blue-medium-focus;
- border-radius: $radius-block-ui;
+ box-shadow: 0 0 0 $border-width-focus $blue-medium-focus;
+ border-radius: $radius-block-ui - $border-width; // Border is outset, so so subtract the width to achieve correct radius.
// Show a light color for dark themes.
.is-dark-theme & {
- box-shadow: 0 0 0 2px $blue-medium-focus-dark;
+ box-shadow: 0 0 0 $border-width-focus $blue-medium-focus-dark;
}
}
}
@@ -140,10 +123,12 @@
*/
.block-editor-block-list__layout {
+ position: relative;
// The primary indicator of selection in text is the native selection marker.
// When selecting multiple blocks, we provide an additional selection indicator.
.is-navigate-mode & .block-editor-block-list__block.is-selected,
+ .block-editor-block-list__block.is-highlighted,
.block-editor-block-list__block.is-multi-selected {
// Show selection borders around every non-nested block's actual footprint.
@@ -152,24 +137,26 @@
z-index: 1;
pointer-events: none;
content: "";
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
+ top: $border-width;
+ bottom: $border-width;
+ left: $border-width;
+ right: $border-width;
}
.is-block-content, // Floats.
&::after { // Everything else.
// 2px outside.
- box-shadow: 0 0 0 2px $blue-medium-focus;
- border-radius: $radius-block-ui;
+ box-shadow: 0 0 0 $border-width-focus $blue-medium-focus;
+ border-radius: $radius-block-ui - $border-width; // Border is outset, so so subtract the width to achieve correct radius.
+ transition: box-shadow 0.2s ease-out;
+ @include reduce-motion("transition");
// Windows High Contrast mode will show this outline.
outline: 2px solid transparent;
// Show a lighter color for dark themes.
.is-dark-theme & {
- box-shadow: 0 0 0 2px $blue-medium-focus-dark;
+ box-shadow: 0 0 0 $border-width-focus $blue-medium-focus-dark;
}
}
@@ -198,6 +185,20 @@
min-height: ( $block-padding + $block-spacing ) * 2;
}
+ &::after {
+ content: "";
+ pointer-events: none;
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ border-radius: $radius-block-ui;
+ box-shadow: 0 0 0 $border-width-focus transparent;
+ transition: box-shadow 0.1s ease-in;
+ @include reduce-motion("transition");
+ }
+
// Warnings
&.has-warning {
// When a block has a warning, you shouldn't be able to manipulate the contents.
@@ -294,18 +295,6 @@
clear: both;
}
- // Full-wide.
- &[data-align="full"],
- &.alignfull {
- margin-left: -$block-padding;
- margin-right: -$block-padding;
-
- @include break-small() {
- margin-left: -$block-padding - $block-padding - $block-side-ui-width - $border-width - $border-width;
- margin-right: -$block-padding - $block-padding - $block-side-ui-width - $border-width - $border-width;
- }
- }
-
// Clear floats.
&[data-clear="true"] {
float: none;
@@ -331,7 +320,7 @@
cursor: grab;
}
-// Insertion point (includes inbetween inserter and insertion indicator)
+// Insertion point (includes inbetween/sibling inserter and insertion indicator)
.block-editor-block-list__insertion-point {
position: relative;
z-index: z-index(".block-editor-block-list__insertion-point");
@@ -341,7 +330,7 @@
.block-editor-block-list__insertion-point-indicator {
position: absolute;
top: calc(50% - #{ $border-width });
- height: 2px;
+ height: $border-width-focus;
left: 0;
right: 0;
background: theme(primary);
@@ -406,12 +395,6 @@
animation: block-editor-inserter__toggle__fade-in-animation-delayed 1.2s ease;
animation-fill-mode: forwards;
@include reduce-motion("animation");
-
- &:hover {
- animation: block-editor-inserter__toggle__fade-in-animation 0.2s ease;
- animation-fill-mode: forwards;
- @include reduce-motion("animation");
- }
}
}
@@ -430,12 +413,30 @@
@keyframes block-editor-inserter__toggle__fade-in-animation {
from {
opacity: 0;
+ transform: scale(0);
}
to {
opacity: 1;
+ transform: scale(1);
}
}
+// Hide the appender that sits at the end of block lists, when inside a nested block,
+// unless the block itself, or a parent, is selected.
+.wp-block .block-list-appender .block-editor-inserter__toggle {
+ animation: block-editor-inserter__toggle__fade-in-animation 0.1s ease;
+ animation-fill-mode: forwards;
+ @include reduce-motion("animation");
+}
+
+.wp-block:not(.is-selected):not(.has-child-selected) .block-editor-default-block-appender {
+ display: none;
+
+ .block-editor-inserter__toggle {
+ opacity: 0;
+ transform: scale(0);
+ }
+}
// This is the edge-to-edge hover area that contains the plus.
.block-editor-block-list__block {
@@ -481,21 +482,6 @@
padding-left: $block-toolbar-height; // Provide space for the mover control on full-wide items.
}
-.edit-post-header-toolbar__block-toolbar,
-.block-editor-block-contextual-toolbar {
- // Adapt the height of the toolbar items.
- .components-toolbar {
- height: $block-toolbar-height;
- background: none;
- }
-
- // Adapt the height of all toolbar buttons.
- .components-button {
- height: $block-toolbar-height;
- }
-}
-
-
/**
* Block Toolbar when contextual.
*/
@@ -520,30 +506,28 @@
display: block;
z-index: z-index(".block-editor-block-list__breadcrumb");
- .components-toolbar {
- display: flex;
- border: none;
- background: none;
+ // The button here has a special style to appear as a toolbar.
+ .components-button {
+ font-size: $default-font-size;
+ height: $block-toolbar-height - $border-width - $border-width;
+ padding: $grid-unit-15 $grid-unit-20;
- // The button here has a special style to appear as a toolbar.
- .components-button {
- font-size: $default-font-size;
- height: $block-toolbar-height;
- padding: $grid-unit-15 $grid-unit-20;
-
- // Block UI appearance.
- border: $border-width solid $dark-gray-primary;
- border-radius: $radius-block-ui;
- background-color: $white;
-
- // When button is focused, it receives a box-shadow instead of the border.
- &:focus {
- border: none;
- box-shadow: inset 0 0 0 1px color($theme-color), 0 0 0 1px color($theme-color);
- }
- }
+ // Position this to align with the block toolbar.
+ position: relative;
+ top: -$border-width;
- // @todo, it should have the block type icon here.
+ // Block UI appearance.
+ box-shadow: 0 0 0 $border-width $dark-gray-primary;
+ border-radius: $radius-block-ui - $border-width; // Border is outset, so so subtract the width to achieve correct radius.
+ background-color: $white;
+
+ // Indent to align with block toolbar.
+ margin-left: $block-toolbar-height + $border-width;
+
+ // When button is focused, it receives a box-shadow instead of the border.
+ &:focus {
+ box-shadow: 0 0 0 $border-width-focus $theme-color;
+ }
}
}
@@ -605,11 +589,8 @@
// Position the block toolbar.
.block-editor-block-list__breadcrumb,
.block-editor-block-contextual-toolbar {
- margin-bottom: $grid-unit-20;
-
- // @todo It should position the block transform dialog as the left margin of a block. It currently
- // positions instead, the mover control.
- margin-left: - $block-toolbar-height - $border-width;
+ margin-bottom: $grid-unit-15;
+ margin-left: - $block-toolbar-height;
}
.block-editor-block-contextual-toolbar[data-align="full"],
@@ -626,3 +607,35 @@
.is-dragging-components-draggable .components-tooltip {
display: none;
}
+
+
+// Add side padding for the canvas, currently edit-post-visual-editor.
+// The purpose of this padding is to ensure that on small viewports, there is
+// room for the block border that sits 14px ($block-padding) offset from the
+// block footprint.
+// These paddings and margins are removed from the BlockPreview component's style
+// Any change need to be reflected there.
+.block-editor-block-list__layout.is-root-container {
+ padding-left: $block-padding;
+ padding-right: $block-padding;
+
+ @include break-small() {
+ padding-left: $block-side-ui-width;
+ padding-right: $block-side-ui-width;
+ }
+
+ // Full-wide. (to account for the padddings added above)
+ // The first two rules account for the alignment wrapper div for the image block.
+ > div:not(.block-editor-block-list__block) > .block-editor-block-list__block[data-align="full"],
+ > div:not(.block-editor-block-list__block) > .block-editor-block-list__block.alignfull,
+ > .block-editor-block-list__block[data-align="full"],
+ > .block-editor-block-list__block.alignfull {
+ margin-left: -$block-padding;
+ margin-right: -$block-padding;
+
+ @include break-small() {
+ margin-left: -$block-side-ui-width;
+ margin-right: -$block-side-ui-width;
+ }
+ }
+}
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 1e77f8711a51de..2d40464f2c0c56 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
@@ -105,8 +105,9 @@ export default function useMultiSelection( ref ) {
);
if (
- ! blockNode.contains( startContainer ) ||
- ! blockNode.contains( endContainer )
+ !! blockNode &&
+ ( ! blockNode.contains( startContainer ) ||
+ ! blockNode.contains( endContainer ) )
) {
selection.removeAllRanges();
}
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 43a34c0466b54d..b4a56abc4df1b0 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
@@ -19,9 +19,17 @@ 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,
+ horizontalDirection,
+} ) => (
-
+
@@ -48,13 +56,15 @@ export default compose(
order: getBlockIndex( clientId ),
};
} ),
- withDispatch( ( dispatch, { clientId, rootClientId } ) => {
+ withDispatch( ( dispatch, { clientId, rootClientId, onDelete } ) => {
const { removeBlock } = dispatch( 'core/block-editor' );
return {
- onDelete: () => {
- Keyboard.dismiss();
- removeBlock( clientId, rootClientId );
- },
+ onDelete:
+ onDelete ||
+ ( () => {
+ Keyboard.dismiss();
+ removeBlock( clientId, rootClientId );
+ } ),
};
} )
)( BlockMobileToolbar );
diff --git a/packages/block-editor/src/components/block-mobile-toolbar/style.native.scss b/packages/block-editor/src/components/block-mobile-toolbar/style.native.scss
index 2633fc1f1c2fcc..0a0bcd016d5b37 100644
--- a/packages/block-editor/src/components/block-mobile-toolbar/style.native.scss
+++ b/packages/block-editor/src/components/block-mobile-toolbar/style.native.scss
@@ -1,6 +1,6 @@
.toolbar {
flex-direction: row;
- height: 44px;
+ height: $mobile-block-toolbar-height;
align-items: flex-start;
margin-left: 2px;
margin-right: 2px;
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 b572e21ee79dd8..5ca80153bee052 100644
--- a/packages/block-editor/src/components/block-mover/index.native.js
+++ b/packages/block-editor/src/components/block-mover/index.native.js
@@ -1,6 +1,7 @@
/**
* External dependencies
*/
+import { I18nManager } from 'react-native';
import { first, last, partial, castArray } from 'lodash';
/**
@@ -10,58 +11,123 @@ import { ToolbarButton } from '@wordpress/components';
import { __, sprintf } from '@wordpress/i18n';
import { withSelect, withDispatch } from '@wordpress/data';
import { withInstanceId, compose } from '@wordpress/compose';
-import { arrowUp, arrowDown } from '@wordpress/icons';
+import { arrowUp, arrowDown, arrowLeft, arrowRight } from '@wordpress/icons';
+
+const horizontalMover = {
+ backwardButtonIcon: arrowLeft,
+ forwardButtonIcon: arrowRight,
+ backwardButtonHint: __( 'Double tap to move the block to the left' ),
+ forwardButtonHint: __( 'Double tap to move the block to the right' ),
+ firstBlockTitle: __( 'Move block left' ),
+ lastBlockTitle: __( 'Move block right' ),
+ /* translators: accessibility text. %1: current block position (number). %2: next block position (number) */
+ backwardButtonTitle: __(
+ 'Move block left from position %1$s to position %2$s'
+ ),
+ /* translators: accessibility text. %1: current block position (number). %2: next block position (number) */
+ forwardButtonTitle: __(
+ 'Move block right from position %1$s to position %2$s'
+ ),
+};
+
+const verticalMover = {
+ backwardButtonIcon: arrowUp,
+ forwardButtonIcon: arrowDown,
+ backwardButtonHint: __( 'Double tap to move the block up' ),
+ forwardButtonHint: __( 'Double tap to move the block down' ),
+ firstBlockTitle: __( 'Move block up' ),
+ lastBlockTitle: __( 'Move block down' ),
+ /* translators: accessibility text. %1: current block position (number). %2: next block position (number) */
+ backwardButtonTitle: __( 'Move block up from row %1$s to row %2$s' ),
+ /* translators: accessibility text. %1: current block position (number). %2: next block position (number) */
+ forwardButtonTitle: __( 'Move block down from row %1$s to row %2$s' ),
+};
const BlockMover = ( {
isFirst,
isLast,
+ isRTL,
isLocked,
onMoveDown,
onMoveUp,
firstIndex,
rootClientId,
+ horizontalDirection,
} ) => {
+ const {
+ backwardButtonIcon,
+ forwardButtonIcon,
+ backwardButtonHint,
+ forwardButtonHint,
+ firstBlockTitle,
+ lastBlockTitle,
+ } = horizontalDirection ? horizontalMover : verticalMover;
+
if ( isLocked || ( isFirst && isLast && ! rootClientId ) ) {
return null;
}
+ const switchButtonPropIfRTL = (
+ isBackwardButton,
+ forwardButtonProp,
+ backwardButtonProp
+ ) => {
+ if ( isRTL && horizontalDirection ) {
+ // for RTL and horizontal direction switch prop between forward and backward button
+ if ( isBackwardButton ) {
+ return forwardButtonProp; // set forwardButtonProp for backward button
+ }
+ return backwardButtonProp; // set backwardButtonProp for forward button
+ }
+
+ return isBackwardButton ? backwardButtonProp : forwardButtonProp;
+ };
+
+ const getMoverButtonTitle = ( isBackwardButton ) => {
+ const fromIndex = firstIndex + 1; // current position based on index
+ // for backwardButton decrease index (move left/up) for forwardButton increase index (move right/down)
+ const direction = isBackwardButton ? -1 : 1;
+ const toIndex = fromIndex + direction; // position after move
+
+ const { backwardButtonTitle, forwardButtonTitle } = horizontalDirection
+ ? horizontalMover
+ : verticalMover;
+
+ const buttonTitle = switchButtonPropIfRTL(
+ isBackwardButton,
+ forwardButtonTitle,
+ backwardButtonTitle
+ );
+
+ return sprintf( buttonTitle, fromIndex, toIndex );
+ };
+
+ const getArrowIcon = ( isBackwardButton ) =>
+ switchButtonPropIfRTL(
+ isBackwardButton,
+ forwardButtonIcon,
+ backwardButtonIcon
+ );
+
return (
<>
>
@@ -90,6 +156,7 @@ export default compose(
firstIndex,
isFirst: firstIndex === 0,
isLast: lastIndex === blockOrder.length - 1,
+ isRTL: I18nManager.isRTL,
isLocked: getTemplateLock( rootClientId ) === 'all',
rootClientId,
};
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 88e67e5ff4a715..fbdc10cb256138 100644
--- a/packages/block-editor/src/components/block-mover/mover-description.js
+++ b/packages/block-editor/src/components/block-mover/mover-description.js
@@ -58,8 +58,8 @@ export function getBlockMoverDescription(
}
if ( isFirst && isLast ) {
- // translators: %s: Type of block (i.e. Text, Image etc)
return sprintf(
+ // translators: %s: Type of block (i.e. Text, Image etc)
__( 'Block %s is the only block, and cannot be moved' ),
type
);
diff --git a/packages/block-editor/src/components/block-mover/style.scss b/packages/block-editor/src/components/block-mover/style.scss
index 83dcf5c459fe60..e60bbcaacdb902 100644
--- a/packages/block-editor/src/components/block-mover/style.scss
+++ b/packages/block-editor/src/components/block-mover/style.scss
@@ -21,6 +21,10 @@
flex-direction: row;
}
+ .block-editor-block-mover__control {
+ height: $block-toolbar-height/2;
+ }
+
// Position the icons correctly.
.components-toolbar .block-editor-block-mover__control-up {
svg {
diff --git a/packages/block-editor/src/components/block-navigation/list.js b/packages/block-editor/src/components/block-navigation/list.js
index 32c8eba5049e89..55a1b28848b9dd 100644
--- a/packages/block-editor/src/components/block-navigation/list.js
+++ b/packages/block-editor/src/components/block-navigation/list.js
@@ -7,7 +7,7 @@ import classnames from 'classnames';
/**
* WordPress dependencies
*/
-import { Button } from '@wordpress/components';
+import { Button, VisuallyHidden } from '@wordpress/components';
import {
__experimentalGetBlockLabel as getBlockLabel,
getBlockType,
@@ -58,9 +58,9 @@ export default function BlockNavigationList( {
{ getBlockLabel( blockType, block.attributes ) }
{ isSelected && (
-
+
{ __( '(selected block)' ) }
-
+
) }
diff --git a/packages/block-editor/src/components/block-navigation/style.scss b/packages/block-editor/src/components/block-navigation/style.scss
index 6a6f47e7250561..abc9ad802ed08e 100644
--- a/packages/block-editor/src/components/block-navigation/style.scss
+++ b/packages/block-editor/src/components/block-navigation/style.scss
@@ -81,10 +81,12 @@ $tree-item-height: 36px;
margin-right: 6px;
}
- &.is-selected,
- &.is-selected:focus {
+ &.is-selected svg,
+ &.is-selected:focus svg {
color: $white;
background: $dark-gray-primary;
+ box-shadow: 0 0 0 $border-width $dark-gray-primary;
+ border-radius: $border-width;
}
}
diff --git a/packages/block-editor/src/components/block-patterns/index.js b/packages/block-editor/src/components/block-patterns/index.js
deleted file mode 100644
index caac37ef7cfc35..00000000000000
--- a/packages/block-editor/src/components/block-patterns/index.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * External dependencies
- */
-import { map } from 'lodash';
-
-/**
- * WordPress dependencies
- */
-import { useMemo, useCallback } from '@wordpress/element';
-import { parse, cloneBlock } from '@wordpress/blocks';
-import { useSelect, useDispatch } from '@wordpress/data';
-import { ENTER, SPACE } from '@wordpress/keycodes';
-import { __, sprintf } from '@wordpress/i18n';
-
-/**
- * Internal dependencies
- */
-import BlockPreview from '../block-preview';
-
-function BlockPattern( { pattern, onClick } ) {
- const { title, content } = pattern;
- const blocks = useMemo( () => parse( content ), [ content ] );
-
- return (
- onClick( pattern, blocks ) }
- onKeyDown={ ( event ) => {
- if ( ENTER === event.keyCode || SPACE === event.keyCode ) {
- onClick( blocks );
- }
- } }
- tabIndex={ 0 }
- >
-
-
-
-
{ title }
-
- );
-}
-
-function BlockPatterns( { patterns } ) {
- const getBlockInsertionPoint = useSelect( ( select ) => {
- return select( 'core/block-editor' ).getBlockInsertionPoint;
- } );
- const { insertBlocks } = useDispatch( 'core/block-editor' );
- const { createSuccessNotice } = useDispatch( 'core/notices' );
- const onClickPattern = useCallback( ( pattern, blocks ) => {
- const { index, rootClientId } = getBlockInsertionPoint();
- insertBlocks(
- map( blocks, ( block ) => cloneBlock( block ) ),
- index,
- rootClientId,
- false
- );
- createSuccessNotice(
- sprintf( __( 'Pattern "%s" inserted' ), pattern.title ),
- {
- type: 'snackbar',
- }
- );
- }, [] );
-
- return (
-
- { patterns.map( ( pattern, index ) => (
-
- ) ) }
-
- );
-}
-
-export default BlockPatterns;
diff --git a/packages/block-editor/src/components/block-patterns/style.scss b/packages/block-editor/src/components/block-patterns/style.scss
deleted file mode 100644
index f40f46b04001cb..00000000000000
--- a/packages/block-editor/src/components/block-patterns/style.scss
+++ /dev/null
@@ -1,30 +0,0 @@
-.block-editor-patterns {
- padding: 16px;
-}
-
-.block-editor-patterns__item {
- border-radius: 2px;
- cursor: pointer;
- margin-bottom: 16px;
- border: 1px solid $light-gray-500;
- transition: all 0.05s ease-in-out;
- position: relative;
-
- &:hover {
- background: $white;
- box-shadow: 0 0 0 1px $white, 0 0 0 3px $dark-gray-500;
- }
-
- &:focus {
- @include block-style__focus();
- }
-}
-
-.block-editor-patterns__item-preview {
- padding: $grid-unit-20;
-}
-
-.block-editor-patterns__item-title {
- text-align: center;
- padding: 10px 0;
-}
diff --git a/packages/block-editor/src/components/block-preview/auto.js b/packages/block-editor/src/components/block-preview/auto.js
index 6b7c5857169c0c..b02b362390e46a 100644
--- a/packages/block-editor/src/components/block-preview/auto.js
+++ b/packages/block-editor/src/components/block-preview/auto.js
@@ -1,46 +1,51 @@
-/**
- * External dependencies
- */
-import useResizeAware from 'react-resize-aware';
-
/**
* WordPress dependencies
*/
import { Disabled } from '@wordpress/components';
+import { useResizeObserver, pure } from '@wordpress/compose';
/**
* Internal dependencies
*/
import BlockList from '../block-list';
-function AutoBlockPreview( { viewportWidth } ) {
+// This is used to avoid rendering the block list if the sizes change.
+const MemoizedBlockList = pure( BlockList );
+
+function AutoBlockPreview( { viewportWidth, __experimentalPadding } ) {
const [
containerResizeListener,
{ width: containerWidth },
- ] = useResizeAware();
+ ] = useResizeObserver();
const [
containtResizeListener,
{ height: contentHeight },
- ] = useResizeAware();
+ ] = useResizeObserver();
+
+ const scale =
+ ( containerWidth - 2 * __experimentalPadding ) / viewportWidth;
return (
{ containerResizeListener }
{ containtResizeListener }
-
+
);
diff --git a/packages/block-editor/src/components/block-preview/index.js b/packages/block-editor/src/components/block-preview/index.js
index 522bd6014282bc..d49fad67dac347 100644
--- a/packages/block-editor/src/components/block-preview/index.js
+++ b/packages/block-editor/src/components/block-preview/index.js
@@ -1,19 +1,18 @@
/**
* External dependencies
*/
-import { castArray, noop } from 'lodash';
+import { castArray } from 'lodash';
/**
* WordPress dependencies
*/
import { useSelect } from '@wordpress/data';
-import { useLayoutEffect, useReducer, useMemo } from '@wordpress/element';
+import { useMemo } from '@wordpress/element';
/**
* Internal dependencies
*/
import BlockEditorProvider from '../provider';
-import ScaledBlockPreview from './scaled';
import AutoHeightBlockPreview from './auto';
/**
@@ -21,52 +20,30 @@ import AutoHeightBlockPreview from './auto';
*
* @see https://github.com/WordPress/gutenberg/blob/master/packages/block-editor/src/components/block-preview/README.md
*
- * @param {Array|Object} blocks A block instance (object) or an array of blocks to be previewed.
- * @param {number} viewportWidth Width of the preview container in pixels. Controls at what size the blocks will be rendered inside the preview. Default: 700.
+ * @param {Object} preview options for how the preview should be shown
+ * @param {Array|Object} preview.blocks A block instance (object) or an array of blocks to be previewed.
+ * @param {number} preview.viewportWidth Width of the preview container in pixels. Controls at what size the blocks will be rendered inside the preview. Default: 700.
+ *
* @return {WPComponent} The component to be rendered.
*/
export function BlockPreview( {
blocks,
+ __experimentalPadding = 0,
viewportWidth = 700,
- padding,
- autoHeight = false,
- __experimentalOnReady = noop,
- __experimentalScalingDelay = 100,
} ) {
const settings = useSelect( ( select ) =>
select( 'core/block-editor' ).getSettings()
);
const renderedBlocks = useMemo( () => castArray( blocks ), [ blocks ] );
- const [ recompute, triggerRecompute ] = useReducer(
- ( state ) => state + 1,
- 0
- );
- useLayoutEffect( triggerRecompute, [ blocks ] );
if ( ! blocks || blocks.length === 0 ) {
return null;
}
return (
- { /*
- * The key prop is used to force recomputing the preview
- * by remounting the component, ScaledBlockPreview is not meant to
- * be rerendered.
- */ }
- { autoHeight ? (
-
- ) : (
-
- ) }
+
);
}
diff --git a/packages/block-editor/src/components/block-preview/scaled.js b/packages/block-editor/src/components/block-preview/scaled.js
deleted file mode 100644
index 69496241fdb5ac..00000000000000
--- a/packages/block-editor/src/components/block-preview/scaled.js
+++ /dev/null
@@ -1,155 +0,0 @@
-/**
- * External dependencies
- */
-import classnames from 'classnames';
-
-/**
- * WordPress dependencies
- */
-import { Disabled } from '@wordpress/components';
-import { useLayoutEffect, useState, useRef } from '@wordpress/element';
-
-/**
- * Internal dependencies
- */
-import BlockList from '../block-list';
-import { getBlockPreviewContainerDOMNode } from '../../utils/dom';
-
-const getInlineStyles = ( scale, x, y, isReady, width ) => ( {
- transform: `scale(${ scale })`,
- visibility: isReady ? 'visible' : 'hidden',
- left: x,
- top: y,
- width,
-} );
-
-function ScaledBlockPreview( {
- blocks,
- viewportWidth,
- padding = 0,
- onReady,
- scalingDelay,
-} ) {
- const previewRef = useRef( null );
-
- const [ isReady, setIsReady ] = useState( false );
- const [ previewScale, setPreviewScale ] = useState( 1 );
- const [ { x, y }, setPosition ] = useState( { x: 0, y: 0 } );
-
- // Dynamically calculate the scale factor
- useLayoutEffect( () => {
- // Timer - required to account for async render of `BlockEditorProvider`
- const timerId = setTimeout( () => {
- const containerElement = previewRef.current;
- if ( ! containerElement ) {
- return;
- }
-
- // Auxiliary vars used for onReady() callback.
- let scale,
- offsetX = 0,
- offsetY = 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
- );
- if ( ! previewElement ) {
- return;
- }
-
- let containerElementRect = containerElement.getBoundingClientRect();
- containerElementRect = {
- width: containerElementRect.width - padding * 2,
- height: containerElementRect.height - padding * 2,
- left: containerElementRect.left,
- top: containerElementRect.top,
- };
- const scaledElementRect = previewElement.getBoundingClientRect();
-
- scale =
- containerElementRect.width / scaledElementRect.width || 1;
- offsetX =
- -( scaledElementRect.left - containerElementRect.left ) *
- scale +
- padding;
- offsetY =
- containerElementRect.height >
- scaledElementRect.height * scale
- ? ( containerElementRect.height -
- scaledElementRect.height * scale ) /
- 2 +
- padding
- : 0;
-
- setPreviewScale( scale );
- setPosition( { x: offsetX, y: offsetY } );
-
- // Hack: we need to reset the scaled elements margins
- previewElement.style.marginTop = '0';
- } else {
- const containerElementRect = containerElement.getBoundingClientRect();
- scale = containerElementRect.width / viewportWidth;
- setPreviewScale( scale );
- }
-
- setIsReady( true );
- onReady( {
- scale,
- position: { x: offsetX, y: offsetY },
- previewContainerRef: previewRef,
-
- inlineStyles: getInlineStyles(
- scale,
- offsetX,
- offsetY,
- true,
- viewportWidth
- ),
- } );
- }, scalingDelay );
-
- // Cleanup
- return () => {
- if ( timerId ) {
- window.clearTimeout( timerId );
- }
- };
- }, [] );
-
- if ( ! blocks || blocks.length === 0 ) {
- return null;
- }
-
- const previewStyles = getInlineStyles(
- previewScale,
- x,
- y,
- isReady,
- viewportWidth
- );
-
- return (
-
-
-
-
-
- );
-}
-
-export default ScaledBlockPreview;
diff --git a/packages/block-editor/src/components/block-preview/style.scss b/packages/block-editor/src/components/block-preview/style.scss
index 1628c178dbd059..1d0df3962fd741 100644
--- a/packages/block-editor/src/components/block-preview/style.scss
+++ b/packages/block-editor/src/components/block-preview/style.scss
@@ -9,9 +9,6 @@
width: 100%;
overflow: hidden;
- &.is-ready {
- overflow: visible;
- }
}
.block-editor-block-preview__content {
@@ -35,17 +32,25 @@
overflow: visible;
min-height: auto;
- .block-editor-block-preview__container &.is-centered {
- .block-editor-block-list__layout,
- .block-editor-block-list__block {
- padding: 0;
- }
- }
-
.block-editor-block-list__insertion-point,
.block-editor-block-drop-zone,
.reusable-block-indicator,
.block-list-appender {
display: none;
}
+
+ // Reset default editor padding
+ .block-editor-block-list__layout.is-root-container {
+ padding-left: 0;
+ padding-right: 0;
+
+ > div:not(.block-editor-block-list__block) > .block-editor-block-list__block[data-align="full"],
+ > div:not(.block-editor-block-list__block) > .block-editor-block-list__block.alignfull,
+ > .block-editor-block-list__block[data-align="full"],
+ > .block-editor-block-list__block.alignfull {
+ margin-left: 0;
+ margin-right: 0;
+ }
+ }
}
+
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 278c3b79b0be32..e4c2c64682a32f 100644
--- a/packages/block-editor/src/components/block-settings-menu/index.js
+++ b/packages/block-editor/src/components/block-settings-menu/index.js
@@ -29,7 +29,7 @@ import BlockSettingsMenuControls from '../block-settings-menu-controls';
const POPOVER_PROPS = {
className: 'block-editor-block-settings-menu__popover',
position: 'bottom right',
- noArrow: true,
+ isAlternate: true,
};
export function BlockSettingsMenu( { clientIds } ) {
diff --git a/packages/block-editor/src/components/block-styles/style.scss b/packages/block-editor/src/components/block-styles/style.scss
index da6c8d0ebbbb79..ab720c9495d992 100644
--- a/packages/block-editor/src/components/block-styles/style.scss
+++ b/packages/block-editor/src/components/block-styles/style.scss
@@ -10,24 +10,30 @@
flex-shrink: 0;
cursor: pointer;
overflow: hidden;
- border-radius: $radius-round-rectangle;
+ border-radius: $radius-block-ui;
padding: $grid-unit-05 * 1.5;
- padding-top: calc(50% * 0.75 - #{ $grid-unit-05 } * 1.5);
+ display: flex;
+ flex-direction: column;
&:focus {
- @include block-style__focus();
- }
+ box-shadow: 0 0 0 $border-width-focus $theme-color;
- &:hover {
- @include block-style__hover;
+ // Windows High Contrast mode will show this outline, but not the box-shadow.
+ outline: 2px solid transparent;
+ }
- .block-editor-block-styles__item-preview {
- border-color: $theme-color;
- }
+ &:hover .block-editor-block-styles__item-preview {
+ border-color: $theme-color;
}
&.is-active {
- @include block-style__is-active();
+ .block-editor-block-styles__item-label {
+ font-weight: bold;
+ }
+
+ .block-editor-block-styles__item-preview {
+ border: 2px solid $dark-gray-primary;
+ }
}
}
@@ -36,18 +42,13 @@
outline: $border-width solid transparent; // Shown in Windows High Contrast mode.
padding: 0;
border: $border-width solid rgba($dark-gray-primary, 0.2);
- border-radius: $radius-round-rectangle;
+ border-radius: $radius-block-ui;
display: flex;
overflow: hidden;
background: $white;
- padding-top: 75%;
- margin-top: -75%;
-
- .block-editor-block-preview__container {
- padding-top: 0;
- margin: 0;
- margin-top: -75%;
- }
+ align-items: center;
+ flex-grow: 1;
+ min-height: 80px;
}
.block-editor-block-styles__item-label {
diff --git a/packages/block-editor/src/components/block-switcher/index.js b/packages/block-editor/src/components/block-switcher/index.js
index e74cfc9ad94b76..eb2f7653af4f28 100644
--- a/packages/block-editor/src/components/block-switcher/index.js
+++ b/packages/block-editor/src/components/block-switcher/index.js
@@ -29,6 +29,11 @@ import BlockStyles from '../block-styles';
import BlockPreview from '../block-preview';
import BlockTypesList from '../block-types-list';
+const POPOVER_PROPS = {
+ position: 'bottom right',
+ isAlternate: true,
+};
+
export class BlockSwitcher extends Component {
constructor() {
super( ...arguments );
@@ -99,7 +104,7 @@ export class BlockSwitcher extends Component {
return (
{
@@ -114,6 +119,7 @@ export class BlockSwitcher extends Component {
1 === blocks.length
? __( 'Change block type or style' )
: sprintf(
+ /* translators: %s: number of blocks. */
_n(
'Change type of %d block',
'Change type of %d blocks',
diff --git a/packages/block-editor/src/components/block-switcher/style.scss b/packages/block-editor/src/components/block-switcher/style.scss
index 82ea12fc16a9d0..17878a4db2963c 100644
--- a/packages/block-editor/src/components/block-switcher/style.scss
+++ b/packages/block-editor/src/components/block-switcher/style.scss
@@ -3,21 +3,9 @@
}
// Show an indicator triangle.
+.block-editor-block-switcher__no-switcher-icon,
.block-editor-block-switcher__toggle {
position: relative;
-
- &::after {
- display: none;
- content: "";
- position: absolute;
- bottom: 1px;
- right: 0;
- border-color: transparent;
- border-style: solid;
- border-width: 4px;
- border-right-color: currentColor;
- border-bottom-color: currentColor;
- }
}
@@ -41,14 +29,12 @@
}
}
-// When the block switcher does not have any transformations, we show it but as disabled.
-// The background and opacity change helps make the icon legible, despite being disabled.
+// Even when the block switcher does not have any transformations, it still serves as a block indicator.
.components-button.block-editor-block-switcher__no-switcher-icon:disabled {
- opacity: 0.84;
+ opacity: 1;
- // Also make the icon monochrome to further imply disabled state.
- // We use !important here because icon colors are set as inline styles,
- // and should be overridden when disabled.
+ // Since it's not clickable, though, don't show a hover state.
+ &,
.block-editor-block-icon.has-colors {
color: $dark-gray-primary !important;
}
@@ -83,7 +69,6 @@
max-width: calc(340px * 2);
display: flex;
background: $white;
- box-shadow: $shadow-popover;
padding: 0;
.components-menu-group {
@@ -164,10 +149,6 @@
}
.components-button.block-editor-block-switcher__toggle {
- &::after {
- display: block;
- }
-
.block-editor-block-icon,
.block-editor-block-switcher__transform {
width: $block-toolbar-height;
diff --git a/packages/block-editor/src/components/block-switcher/test/__snapshots__/index.js.snap b/packages/block-editor/src/components/block-switcher/test/__snapshots__/index.js.snap
index ab8ff515675b62..a7a9d6dd1bbed0 100644
--- a/packages/block-editor/src/components/block-switcher/test/__snapshots__/index.js.snap
+++ b/packages/block-editor/src/components/block-switcher/test/__snapshots__/index.js.snap
@@ -29,7 +29,12 @@ exports[`BlockSwitcher should render enabled block switcher with multi block whe
@@ -39,7 +44,12 @@ exports[`BlockSwitcher should render switcher with blocks 1`] = `
diff --git a/packages/block-editor/src/components/block-toolbar/index.js b/packages/block-editor/src/components/block-toolbar/index.js
index 36b20c44e0fcba..d2dc21fff63c20 100644
--- a/packages/block-editor/src/components/block-toolbar/index.js
+++ b/packages/block-editor/src/components/block-toolbar/index.js
@@ -16,16 +16,16 @@ import BlockSwitcher from '../block-switcher';
import BlockControls from '../block-controls';
import BlockFormatControls from '../block-format-controls';
import BlockSettingsMenu from '../block-settings-menu';
-import { useShowMoversGestures } from './utils';
+import { useShowMoversGestures, useToggleBlockHighlight } from './utils';
export default function BlockToolbar( { hideDragHandle } ) {
const {
blockClientIds,
+ blockClientId,
hasFixedToolbar,
isValid,
mode,
moverDirection,
- hasMovers = true,
} = useSelect( ( select ) => {
const {
getBlockMode,
@@ -36,15 +36,15 @@ export default function BlockToolbar( { hideDragHandle } ) {
getSettings,
} = select( 'core/block-editor' );
const selectedBlockClientIds = getSelectedBlockClientIds();
- const blockRootClientId = getBlockRootClientId(
- selectedBlockClientIds[ 0 ]
- );
+ const selectedBlockClientId = selectedBlockClientIds[ 0 ];
+ const blockRootClientId = getBlockRootClientId( selectedBlockClientId );
- const { __experimentalMoverDirection, __experimentalUIParts = {} } =
+ const { __experimentalMoverDirection } =
getBlockListSettings( blockRootClientId ) || {};
return {
blockClientIds: selectedBlockClientIds,
+ blockClientId: selectedBlockClientId,
hasFixedToolbar: getSettings().hasFixedToolbar,
rootClientId: blockRootClientId,
isValid:
@@ -56,22 +56,23 @@ export default function BlockToolbar( { hideDragHandle } ) {
? getBlockMode( selectedBlockClientIds[ 0 ] )
: null,
moverDirection: __experimentalMoverDirection,
- hasMovers: __experimentalUIParts.hasMovers,
};
}, [] );
+ const toggleBlockHighlight = useToggleBlockHighlight( blockClientId );
const nodeRef = useRef();
- const {
- showMovers,
- gestures: showMoversGestures,
- } = useShowMoversGestures( { ref: nodeRef } );
+ const { showMovers, gestures: showMoversGestures } = useShowMoversGestures(
+ {
+ ref: nodeRef,
+ onChange: toggleBlockHighlight,
+ }
+ );
const displayHeaderToolbar =
useViewportMatch( 'medium', '<' ) || hasFixedToolbar;
- const shouldShowMovers =
- displayHeaderToolbar || ( showMovers && hasMovers );
+ const shouldShowMovers = displayHeaderToolbar || showMovers;
if ( blockClientIds.length === 0 ) {
return null;
diff --git a/packages/block-editor/src/components/block-toolbar/style.scss b/packages/block-editor/src/components/block-toolbar/style.scss
index d03ae73ec64351..6cc37f4d9309d4 100644
--- a/packages/block-editor/src/components/block-toolbar/style.scss
+++ b/packages/block-editor/src/components/block-toolbar/style.scss
@@ -44,130 +44,11 @@
.block-editor-block-toolbar,
.block-editor-format-toolbar {
- // Toolbar buttons.
- .components-button {
- position: relative;
-
- // Give all buttons extra padding to fit text.
- padding-left: $grid-unit-20;
- padding-right: $grid-unit-20;
-
- // Don't show the focus inherited by the Button component.
- &:focus:enabled {
- box-shadow: none;
- outline: none;
- }
-
- // Focus and toggle pseudo elements.
- &::before {
- content: "";
- position: absolute;
- display: block;
- border-radius: $radius-block-ui;
- height: 32px;
- min-width: 32px;
-
- // Position the focus rectangle.
- left: $grid-unit-10;
- right: $grid-unit-10;
- }
-
- svg {
- position: relative;
-
- // Center the icon inside.
- margin-left: auto;
- margin-right: auto;
- }
-
- // Toggled style.
- &.is-pressed {
- color: $white;
-
- &::before {
- background: $dark-gray-primary;
- }
- }
-
- // Focus style.
- &:focus::before {
- @include block-toolbar-button-style__focus();
- }
-
- // Ensure the icon buttons remain square.
- &.has-icon {
- // Reduce the default padding when a button only has an icon.
- padding-left: $grid-unit-10;
- padding-right: $grid-unit-10;
-
- min-width: $block-toolbar-height;
- justify-content: center;
- }
-
- // @todo: We should extract the tabs styles to the tabs component itself
- &.components-tab-button {
- font-weight: 500;
-
- span {
- display: inline-block;
- padding-left: 0;
- padding-right: 0;
- position: relative;
- }
- }
- }
-
- // Size multiple sequential buttons to be optically balanced.
- // Icons are 36px, as set by a 24px icon and 12px padding.
- .components-toolbar div > .components-button.has-icon {
- min-width: $block-toolbar-height - $grid-unit-15;
- padding-left: $grid-unit-15 / 2; // 6px.
- padding-right: $grid-unit-15 / 2;
-
- svg {
- min-width: $button-size-small; // This is the optimal icon size, and we size the whole button after this.
- }
-
- &::before {
- left: 2px;
- right: 2px;
- }
- }
-
- // First button in a group.
- .components-toolbar div:first-child .components-button {
- min-width: $block-toolbar-height - $grid-unit-15 / 2;
- padding-left: $grid-unit-15 - $border-width;
- padding-right: $grid-unit-15 / 2;
-
- &::before {
- left: $grid-unit-10;
- right: 2px;
- }
- }
-
- // Last button in a group.
- .components-toolbar div:last-child .components-button {
- min-width: $block-toolbar-height - $grid-unit-15 / 2;
- padding-left: $grid-unit-15 / 2;
- padding-right: $grid-unit-15 - $border-width;
-
- &::before {
- left: 2px;
- right: $grid-unit-10;
- }
- }
-
- // Single buttons should remain 48px.
- .components-toolbar div:first-child:last-child > .components-button {
- min-width: $block-toolbar-height;
- padding-left: $grid-unit-15;
- padding-right: $grid-unit-15;
-
- &::before {
- left: $grid-unit-10;
- right: $grid-unit-10;
- }
+ // Override Toolbar buttons size.
+ .components-toolbar-group,
+ .components-toolbar {
+ display: flex;
+ flex-wrap: nowrap;
}
}
@@ -202,10 +83,19 @@
top: -1px;
transform: translateX(-48px);
user-select: none;
- z-index: -1; // This makes it slide out from underneath the toolbar.
}
}
+ // Explicitly color the background of the switcher to "cover" the mover control as it animates out.
+ .block-editor-block-toolbar__block-switcher-wrapper {
+ background: $white;
+ border-left: $border-width solid;
+ border-radius: 0 0 $radius-block-ui $radius-block-ui;
+ position: relative;
+ z-index: 1;
+ margin-left: -$border-width;
+ }
+
.block-editor-block-toolbar__mover-trigger-wrapper:not(:empty) {
@include break-medium() {
background-color: $white;
diff --git a/packages/block-editor/src/components/block-toolbar/utils.js b/packages/block-editor/src/components/block-toolbar/utils.js
index da64ca0bfb3488..2ee4a65b0d43f5 100644
--- a/packages/block-editor/src/components/block-toolbar/utils.js
+++ b/packages/block-editor/src/components/block-toolbar/utils.js
@@ -1,9 +1,15 @@
+/**
+ * External dependencies
+ */
+import { noop } from 'lodash';
/**
* WordPress dependencies
*/
+import { useDispatch } from '@wordpress/data';
import { useState, useRef, useEffect, useCallback } from '@wordpress/element';
-const { clearTimeout, setTimeout } = window;
+const { clearTimeout, requestAnimationFrame, setTimeout } = window;
+const DEBOUNCE_TIMEOUT = 250;
/**
* Hook that creates a showMover state, as well as debounced show/hide callbacks
@@ -11,11 +17,17 @@ const { clearTimeout, setTimeout } = window;
export function useDebouncedShowMovers( {
ref,
isFocused,
- debounceTimeout = 500,
+ debounceTimeout = DEBOUNCE_TIMEOUT,
+ onChange = noop,
} ) {
const [ showMovers, setShowMovers ] = useState( false );
const timeoutRef = useRef();
+ const handleOnChange = ( nextIsFocused ) => {
+ setShowMovers( nextIsFocused );
+ onChange( nextIsFocused );
+ };
+
const getIsHovered = () => {
return ref?.current && ref.current.matches( ':hover' );
};
@@ -26,40 +38,41 @@ export function useDebouncedShowMovers( {
return ! isFocused && ! isHovered;
};
- const debouncedShowMovers = useCallback(
- ( event ) => {
- if ( event ) {
- event.stopPropagation();
- }
+ const clearTimeoutRef = () => {
+ const timeout = timeoutRef.current;
- const timeout = timeoutRef.current;
+ if ( timeout && clearTimeout ) {
+ clearTimeout( timeout );
+ }
+ };
- if ( timeout && clearTimeout ) {
- clearTimeout( timeout );
- }
- if ( ! showMovers ) {
- setShowMovers( true );
- }
- },
- [ showMovers ]
- );
+ const debouncedShowMovers = ( event ) => {
+ if ( event ) {
+ event.stopPropagation();
+ }
- const debouncedHideMovers = useCallback(
- ( event ) => {
- if ( event ) {
- event.stopPropagation();
- }
+ clearTimeoutRef();
- timeoutRef.current = setTimeout( () => {
- if ( shouldHideMovers() ) {
- setShowMovers( false );
- }
- }, debounceTimeout );
- },
- [ isFocused ]
- );
+ if ( ! showMovers ) {
+ handleOnChange( true );
+ }
+ };
+
+ const debouncedHideMovers = ( event ) => {
+ if ( event ) {
+ event.stopPropagation();
+ }
- useEffect( () => () => clearTimeout( timeoutRef.current ), [] );
+ clearTimeoutRef();
+
+ timeoutRef.current = setTimeout( () => {
+ if ( shouldHideMovers() ) {
+ handleOnChange( false );
+ }
+ }, debounceTimeout );
+ };
+
+ useEffect( () => () => clearTimeoutRef(), [] );
return {
showMovers,
@@ -72,13 +85,17 @@ export function useDebouncedShowMovers( {
* Hook that provides a showMovers state and gesture events for DOM elements
* that interact with the showMovers state.
*/
-export function useShowMoversGestures( { ref, debounceTimeout = 500 } ) {
+export function useShowMoversGestures( {
+ ref,
+ debounceTimeout = DEBOUNCE_TIMEOUT,
+ onChange = noop,
+} ) {
const [ isFocused, setIsFocused ] = useState( false );
const {
showMovers,
debouncedShowMovers,
debouncedHideMovers,
- } = useDebouncedShowMovers( { ref, debounceTimeout, isFocused } );
+ } = useDebouncedShowMovers( { ref, debounceTimeout, isFocused, onChange } );
const registerRef = useRef( false );
@@ -135,3 +152,33 @@ export function useShowMoversGestures( { ref, debounceTimeout = 500 } ) {
},
};
}
+
+/**
+ * Hook that toggles the highlight (outline) state of a block
+ *
+ * @param {string} clientId The block's clientId
+ *
+ * @return {Function} Callback function to toggle highlight state.
+ */
+export function useToggleBlockHighlight( clientId ) {
+ const { toggleBlockHighlight } = useDispatch( 'core/block-editor' );
+
+ const updateBlockHighlight = useCallback(
+ ( isFocused ) => {
+ toggleBlockHighlight( clientId, isFocused );
+ },
+ [ clientId ]
+ );
+
+ useEffect( () => {
+ return () => {
+ // Sequences state change to enable editor updates (e.g. cursor
+ // position) to render correctly.
+ requestAnimationFrame( () => {
+ updateBlockHighlight( false );
+ } );
+ };
+ }, [] );
+
+ return updateBlockHighlight;
+}
diff --git a/packages/block-editor/src/components/block-variation-picker/index.js b/packages/block-editor/src/components/block-variation-picker/index.js
index 4b8819bac6fe45..f7db011f294875 100644
--- a/packages/block-editor/src/components/block-variation-picker/index.js
+++ b/packages/block-editor/src/components/block-variation-picker/index.js
@@ -37,6 +37,7 @@ function BlockVariationPicker( {
{ variations.map( ( variation ) => (
@@ -46,8 +47,14 @@ function BlockVariationPicker( {
iconSize={ 48 }
onClick={ () => onSelect( variation ) }
className="block-editor-block-variation-picker__variation"
- label={ variation.title }
+ label={ variation.description || variation.title }
/>
+
+ { variation.title }
+
) ) }
diff --git a/packages/block-editor/src/components/block-variation-picker/style.scss b/packages/block-editor/src/components/block-variation-picker/style.scss
index 9edcd19bf03578..87a30a86f261ba 100644
--- a/packages/block-editor/src/components/block-variation-picker/style.scss
+++ b/packages/block-editor/src/components/block-variation-picker/style.scss
@@ -32,11 +32,23 @@
margin: $grid-unit-10 $grid-unit-10 0 0;
flex-shrink: 1;
max-width: 100px;
+
+ button {
+ display: flex;
+ }
}
.block-editor-block-variation-picker__variation {
padding: $grid-unit-10;
}
+
+ .block-editor-block-variation-picker__variation-label {
+ font-family: $default-font;
+ font-size: 12px;
+ display: block;
+ margin-right: $grid-unit-15;
+ text-align: center;
+ }
}
.block-editor-block-variation-picker__variation {
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 371ef144e7a160..385666e257e2e0 100644
--- a/packages/block-editor/src/components/button-block-appender/index.js
+++ b/packages/block-editor/src/components/button-block-appender/index.js
@@ -6,9 +6,9 @@ import classnames from 'classnames';
/**
* WordPress dependencies
*/
-import { Button, Tooltip } from '@wordpress/components';
+import { Button, Tooltip, VisuallyHidden } from '@wordpress/components';
import { _x, sprintf } from '@wordpress/i18n';
-import { Icon, plus } from '@wordpress/icons';
+import { Icon, create } from '@wordpress/icons';
/**
* Internal dependencies
@@ -22,6 +22,7 @@ function ButtonBlockAppender( {
} ) {
return (
{
let label;
if ( hasSingleBlockType ) {
- // translators: %s: the name of the block when there is only one
label = sprintf(
+ // translators: %s: the name of the block when there is only one
_x( 'Add %s', 'directly add the only allowed block' ),
blockTitle
);
@@ -62,10 +63,8 @@ function ButtonBlockAppender( {
disabled={ disabled }
label={ label }
>
-
- { 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 692c013a69f729..4a3be1a5b5ac06 100644
--- a/packages/block-editor/src/components/button-block-appender/index.native.js
+++ b/packages/block-editor/src/components/button-block-appender/index.native.js
@@ -20,6 +20,7 @@ function ButtonBlockAppender( {
rootClientId,
getStylesFromColorScheme,
showSeparator,
+ onAddBlock,
} ) {
const appenderStyle = {
...styles.appender,
@@ -39,7 +40,7 @@ function ButtonBlockAppender( {
rootClientId={ rootClientId }
renderToggle={ ( { onToggle, disabled, isOpen } ) => (
{
+ return (
+
+
+
+ );
+};
+export default PanelColorGradientSettings;
diff --git a/packages/block-editor/src/components/colors/color-panel.js b/packages/block-editor/src/components/colors/color-panel.js
new file mode 100644
index 00000000000000..95784826eb302d
--- /dev/null
+++ b/packages/block-editor/src/components/colors/color-panel.js
@@ -0,0 +1,91 @@
+/**
+ * External dependencies
+ */
+import { map } from 'lodash';
+
+/**
+ * Internal dependencies
+ */
+import PanelColorSettings from '../panel-color-settings';
+import ContrastChecker from '../contrast-checker';
+
+const resolveContrastCheckerColor = ( color, colorSettings, detectedColor ) => {
+ if ( typeof color === 'function' ) {
+ return color( colorSettings );
+ } else if ( color === true ) {
+ return detectedColor;
+ }
+ return color;
+};
+
+export default function ColorPanel( {
+ title,
+ colorSettings,
+ colorPanelProps,
+ contrastCheckers,
+ detectedBackgroundColor,
+ detectedColor,
+ panelChildren,
+ initialOpen,
+} ) {
+ return (
+
+ { 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 }
+
+ );
+}
diff --git a/packages/block-editor/src/components/colors/color-panel.native.js b/packages/block-editor/src/components/colors/color-panel.native.js
new file mode 100644
index 00000000000000..3c505bfd0f15f4
--- /dev/null
+++ b/packages/block-editor/src/components/colors/color-panel.native.js
@@ -0,0 +1,3 @@
+export default function ColorPanel() {
+ return null;
+}
diff --git a/packages/block-editor/src/components/colors/use-colors.js b/packages/block-editor/src/components/colors/use-colors.js
index 214aab8a9e2dac..66b1c9944e4db0 100644
--- a/packages/block-editor/src/components/colors/use-colors.js
+++ b/packages/block-editor/src/components/colors/use-colors.js
@@ -3,7 +3,7 @@
*/
import memoize from 'memize';
import classnames from 'classnames';
-import { map, kebabCase, camelCase, castArray, startCase } from 'lodash';
+import { kebabCase, camelCase, castArray, startCase, isFunction } from 'lodash';
/**
* WordPress dependencies
@@ -22,10 +22,9 @@ import {
/**
* Internal dependencies
*/
-import PanelColorSettings from '../panel-color-settings';
-import ContrastChecker from '../contrast-checker';
import InspectorControls from '../inspector-controls';
import { useBlockEditContext } from '../block-edit';
+import ColorPanel from './color-panel';
/**
* Browser dependencies
@@ -39,81 +38,6 @@ const COMMON_COLOR_LABELS = {
backgroundColor: __( 'Background Color' ),
};
-const resolveContrastCheckerColor = ( color, colorSettings, detectedColor ) => {
- if ( typeof color === 'function' ) {
- return color( colorSettings );
- } else if ( color === true ) {
- return detectedColor;
- }
- return color;
-};
-
-const ColorPanel = ( {
- title,
- colorSettings,
- colorPanelProps,
- contrastCheckers,
- detectedBackgroundColor,
- detectedColor,
- panelChildren,
- initialOpen,
-} ) => (
-
- { 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 }
-
-);
const InspectorControlsColorPanel = ( props ) => (
@@ -172,37 +96,48 @@ export default function __experimentalUseColors(
children,
className: componentClassName = '',
style: componentStyle = {},
- } ) =>
- // Clone children, setting the style property from the color configuration,
- // if not already set explicitly through props.
- Children.map( children, ( child ) => {
- let colorStyle = {};
- if ( color ) {
- colorStyle = { [ property ]: colorValue };
- } else if ( customColor ) {
- colorStyle = { [ property ]: customColor };
- }
+ } ) => {
+ let colorStyle = {};
+ if ( color ) {
+ colorStyle = { [ property ]: colorValue };
+ } else if ( customColor ) {
+ colorStyle = { [ property ]: customColor };
+ }
+ const extraProps = {
+ className: classnames( componentClassName, {
+ [ `has-${ kebabCase( color ) }-${ kebabCase(
+ property
+ ) }` ]: color,
+ [ className || `has-${ kebabCase( name ) }` ]:
+ color || customColor,
+ } ),
+ style: {
+ ...colorStyle,
+ ...componentStyle,
+ },
+ };
- return cloneElement( child, {
- className: classnames(
- componentClassName,
- child.props.className,
- {
- [ `has-${ kebabCase( color ) }-${ kebabCase(
- property
- ) }` ]: color,
- [ className ||
- `has-${ kebabCase( name ) }` ]:
- color || customColor,
- }
- ),
- style: {
- ...colorStyle,
- ...componentStyle,
- ...( child.props.style || {} ),
- },
- } );
- } ),
+ if ( isFunction( children ) ) {
+ return children( extraProps );
+ }
+
+ return (
+ // Clone children, setting the style property from the color configuration,
+ // if not already set explicitly through props.
+ Children.map( children, ( child ) => {
+ return cloneElement( child, {
+ className: classnames(
+ child.props.className,
+ extraProps.className
+ ),
+ style: {
+ ...extraProps.style,
+ ...( child.props.style || {} ),
+ },
+ } );
+ } )
+ );
+ },
{ maxSize: colorConfigs.length }
),
[ colorConfigs.length ]
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 ae641852ab9b90..f2e208fcca34cf 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
@@ -39,7 +39,10 @@ export function DefaultBlockAppender( {
return (
{ showSeparator ? (
diff --git a/packages/block-editor/src/components/editable-text/README.md b/packages/block-editor/src/components/editable-text/README.md
new file mode 100644
index 00000000000000..6696a43c7e05c0
--- /dev/null
+++ b/packages/block-editor/src/components/editable-text/README.md
@@ -0,0 +1,114 @@
+# `EditableText`
+
+Renders an editable text input in which text formatting is not allowed.
+
+## Properties
+
+### `value: String`
+
+*Required.* String to make editable.
+
+### `onChange( value: String ): Function`
+
+*Required.* Called when the value changes.
+
+### `tagName: String`
+
+*Default: `div`.* The [tag name](https://www.w3.org/TR/html51/syntax.html#tag-name) of the editable element. Elements that display inline are not supported.
+
+### `disableLineBreaks: Boolean`
+
+*Optional.* `Text` won't insert line breaks on `Enter` if set to `true`.
+
+### `placeholder: String`
+
+*Optional.* Placeholder text to show when the field is empty, similar to the
+ [`input` and `textarea` attribute of the same name](https://developer.mozilla.org/en-US/docs/Learn/HTML/Forms/HTML5_updates#The_placeholder_attribute).
+
+### `keepPlaceholderOnFocus: Boolean`
+
+*Optional.* Show placeholder even when selected/focused, as long as there is no content.
+
+### `onSplit( value: String ): Function`
+
+*Optional.* Called when the content can be split, where `value` is a piece of content being split off. Here you should create a new block with that content and return it. Note that you also need to provide `onReplace` in order for this to take any effect.
+
+### `onReplace( blocks: Array ): Function`
+
+*Optional.* Called when the `Text` instance can be replaced with the given blocks.
+
+### `onMerge( forward: Boolean ): Function`
+
+*Optional.* Called when blocks can be merged. `forward` is true when merging with the next block, false when merging with the previous block.
+
+### `onRemove( forward: Boolean ): Function`
+
+*Optional.* Called when the block can be removed. `forward` is true when the selection is expected to move to the next block, false to the previous block.
+
+## EditableText.Content
+
+`EditableText.Content` should be used in the `save` function of your block to correctly save text content.
+
+## Example
+
+{% codetabs %}
+{% ES5 %}
+```js
+wp.blocks.registerBlockType( /* ... */, {
+ // ...
+
+ attributes: {
+ content: {
+ source: 'html',
+ selector: 'div',
+ },
+ },
+
+ edit: function( props ) {
+ return wp.element.createElement( wp.editor.EditableText, {
+ className: props.className,
+ value: props.attributes.content,
+ onChange: function( content ) {
+ props.setAttributes( { content: content } );
+ }
+ } );
+ },
+
+ save: function( props ) {
+ return wp.element.createElement( wp.editor.EditableText.Content, {
+ value: props.attributes.content
+ } );
+ }
+} );
+```
+{% ESNext %}
+```js
+const { registerBlockType } = wp.blocks;
+const { EditableText } = wp.editor;
+
+registerBlockType( /* ... */, {
+ // ...
+
+ attributes: {
+ content: {
+ source: 'html',
+ selector: '.text',
+ },
+ },
+
+ edit( { className, attributes, setAttributes } ) {
+ return (
+ setAttributes( { content } ) }
+ />
+ );
+ },
+
+ save( { attributes } ) {
+ return ;
+ }
+} );
+```
+{% end %}
diff --git a/packages/block-editor/src/components/editable-text/index.js b/packages/block-editor/src/components/editable-text/index.js
new file mode 100644
index 00000000000000..21366087257efb
--- /dev/null
+++ b/packages/block-editor/src/components/editable-text/index.js
@@ -0,0 +1,29 @@
+/**
+ * WordPress dependencies
+ */
+import { forwardRef } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import RichText from '../rich-text';
+
+const EditableText = forwardRef( ( props, ref ) => {
+ return (
+
+ );
+} );
+
+EditableText.Content = ( { value = '', tagName: Tag = 'div', ...props } ) => {
+ return { value } ;
+};
+
+/**
+ * Renders an editable text input in which text formatting is not allowed.
+ */
+export default EditableText;
diff --git a/packages/block-editor/src/components/editor-skeleton/index.js b/packages/block-editor/src/components/editor-skeleton/index.js
deleted file mode 100644
index ca4f3646f529c6..00000000000000
--- a/packages/block-editor/src/components/editor-skeleton/index.js
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * External dependencies
- */
-import classnames from 'classnames';
-
-/**
- * WordPress dependencies
- */
-import { useEffect } from '@wordpress/element';
-import { navigateRegions } from '@wordpress/components';
-import { __ } from '@wordpress/i18n';
-
-function useHTMLClass( className ) {
- useEffect( () => {
- const element =
- document && document.querySelector( `html:not(.${ className })` );
- if ( ! element ) {
- return;
- }
- element.classList.toggle( className );
- return () => {
- element.classList.toggle( className );
- };
- }, [ className ] );
-}
-
-function EditorSkeleton( {
- footer,
- header,
- sidebar,
- content,
- publish,
- className,
-} ) {
- useHTMLClass( 'block-editor-editor-skeleton__html-container' );
- return (
-
- { !! header && (
-
- { header }
-
- ) }
-
-
- { content }
-
- { !! sidebar && (
-
- { sidebar }
-
- ) }
- { !! publish && (
-
- { publish }
-
- ) }
-
- { !! footer && (
-
- { footer }
-
- ) }
-
- );
-}
-
-export default navigateRegions( EditorSkeleton );
diff --git a/packages/block-editor/src/components/editor-styles/index.js b/packages/block-editor/src/components/editor-styles/index.js
new file mode 100644
index 00000000000000..e5acac522d6515
--- /dev/null
+++ b/packages/block-editor/src/components/editor-styles/index.js
@@ -0,0 +1,38 @@
+/**
+ * External dependencies
+ */
+import { compact, map } from 'lodash';
+
+/**
+ * WordPress dependencies
+ */
+import { useEffect } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import transformStyles from '../../utils/transform-styles';
+
+function EditorStyles( { styles } ) {
+ useEffect( () => {
+ const updatedStyles = transformStyles(
+ styles,
+ '.editor-styles-wrapper'
+ );
+
+ const nodes = map( compact( updatedStyles ), ( updatedCSS ) => {
+ const node = document.createElement( 'style' );
+ node.innerHTML = updatedCSS;
+ document.body.appendChild( node );
+
+ return node;
+ } );
+
+ return () =>
+ nodes.forEach( ( node ) => document.body.removeChild( node ) );
+ }, [ styles ] );
+
+ return null;
+}
+
+export default EditorStyles;
diff --git a/packages/block-editor/src/components/font-sizes/index.js b/packages/block-editor/src/components/font-sizes/index.js
index 931f9c2a89474d..55ef51a02aa4d5 100644
--- a/packages/block-editor/src/components/font-sizes/index.js
+++ b/packages/block-editor/src/components/font-sizes/index.js
@@ -1,3 +1,7 @@
-export { getFontSize, getFontSizeClass } from './utils';
+export {
+ getFontSize,
+ getFontSizeClass,
+ getFontSizeObjectByValue,
+} from './utils';
export { default as FontSizePicker } from './font-size-picker';
export { default as withFontSizes } from './with-font-sizes';
diff --git a/packages/block-editor/src/components/font-sizes/utils.js b/packages/block-editor/src/components/font-sizes/utils.js
index 17f3cfe680dc75..8604e9f287788a 100644
--- a/packages/block-editor/src/components/font-sizes/utils.js
+++ b/packages/block-editor/src/components/font-sizes/utils.js
@@ -11,7 +11,7 @@ import { find, kebabCase } from 'lodash';
* @param {?string} fontSizeAttribute Content of the font size attribute (slug).
* @param {?number} customFontSizeAttribute Contents of the custom font size attribute (value).
*
- * @return {?string} If fontSizeAttribute is set and an equal slug is found in fontSizes it returns the font size object for that slug.
+ * @return {?Object} 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 = (
@@ -30,6 +30,25 @@ export const getFontSize = (
};
};
+/**
+ * Returns the corresponding font size object for a given value.
+ *
+ * @param {Array} fontSizes Array of font size objects.
+ * @param {number} value Font size value.
+ *
+ * @return {Object} Font size object.
+ */
+export function getFontSizeObjectByValue( fontSizes, value ) {
+ const fontSizeObject = find( fontSizes, { size: value } );
+ if ( fontSizeObject ) {
+ return fontSizeObject;
+ }
+
+ return {
+ size: value,
+ };
+}
+
/**
* Returns a class based on fontSizeName.
*
diff --git a/packages/block-editor/src/components/gradients/index.js b/packages/block-editor/src/components/gradients/index.js
index 988ca37da2cfe3..8e5efdb3b0704e 100644
--- a/packages/block-editor/src/components/gradients/index.js
+++ b/packages/block-editor/src/components/gradients/index.js
@@ -21,7 +21,15 @@ export function __experimentalGetGradientClass( gradientSlug ) {
return `has-${ gradientSlug }-gradient-background`;
}
-function getGradientValueBySlug( gradients, slug ) {
+/**
+ * Retrieves the gradient value per slug.
+ *
+ * @param {Array} gradients Gradient Palette
+ * @param {string} slug Gradient slug
+ *
+ * @return {string} Gradient value.
+ */
+export function getGradientValueBySlug( gradients, slug ) {
const gradient = find( gradients, [ 'slug', slug ] );
return gradient && gradient.gradient;
}
@@ -34,7 +42,14 @@ export function __experimentalGetGradientObjectByGradientValue(
return gradient;
}
-function getGradientSlugByValue( gradients, value ) {
+/**
+ * Retrieves the gradient slug per slug.
+ *
+ * @param {Array} gradients Gradient Palette
+ * @param {string} value Gradient value
+ * @return {string} Gradient slug.
+ */
+export function getGradientSlugByValue( gradients, value ) {
const gradient = __experimentalGetGradientObjectByGradientValue(
gradients,
value
diff --git a/packages/block-editor/src/components/index.js b/packages/block-editor/src/components/index.js
index e18fb29690199e..158bdb77295b03 100644
--- a/packages/block-editor/src/components/index.js
+++ b/packages/block-editor/src/components/index.js
@@ -9,20 +9,19 @@ export { default as AlignmentToolbar } from './alignment-toolbar';
export { default as Autocomplete } from './autocomplete';
export { default as BlockAlignmentToolbar } from './block-alignment-toolbar';
export { default as BlockBreadcrumb } from './block-breadcrumb';
+export { BlockContextProvider } from './block-context';
export { default as BlockControls } from './block-controls';
export { default as BlockEdit, useBlockEditContext } from './block-edit';
export { default as BlockFormatControls } from './block-format-controls';
export { default as BlockIcon } from './block-icon';
export { default as BlockNavigationDropdown } from './block-navigation/dropdown';
export { default as __experimentalBlockNavigationList } from './block-navigation/list';
-export { default as __experimentalBlockPatterns } from './block-patterns';
export { default as __experimentalBlockVariationPicker } from './block-variation-picker';
export { default as BlockVerticalAlignmentToolbar } from './block-vertical-alignment-toolbar';
export { default as ButtonBlockerAppender } from './button-block-appender';
export { default as ColorPalette } from './color-palette';
export { default as ColorPaletteControl } from './color-palette/control';
export { default as ContrastChecker } from './contrast-checker';
-export { default as __experimentalEditorSkeleton } from './editor-skeleton';
export { default as __experimentalGradientPicker } from './gradient-picker';
export { default as __experimentalGradientPickerControl } from './gradient-picker/control';
export { default as __experimentalGradientPickerPanel } from './gradient-picker/panel';
@@ -33,6 +32,7 @@ export { default as InnerBlocks } from './inner-blocks';
export { default as InspectorAdvancedControls } from './inspector-advanced-controls';
export { default as InspectorControls } from './inspector-controls';
export { default as __experimentalLinkControl } from './link-control';
+export { default as __experimentalLineHeightControl } from './line-height-control';
export { default as MediaReplaceFlow } from './media-replace-flow';
export { default as MediaPlaceholder } from './media-placeholder';
export { default as MediaUpload } from './media-upload';
@@ -47,6 +47,7 @@ export {
__unstableRichTextInputEvent,
} from './rich-text';
export { default as ToolSelector } from './tool-selector';
+export { default as __experimentalUnitControl } from './unit-control';
export { default as URLInput } from './url-input';
export { default as URLInputButton } from './url-input/button';
export { default as URLPopover } from './url-popover';
@@ -71,7 +72,9 @@ export { default as BlockTitle } from './block-title';
export { default as BlockToolbar } from './block-toolbar';
export { default as CopyHandler } from './copy-handler';
export { default as DefaultBlockAppender } from './default-block-appender';
+export { default as __unstableEditorStyles } from './editor-styles';
export { default as Inserter } from './inserter';
+export { default as __experimentalLibrary } from './inserter/library';
export { default as BlockEditorKeyboardShortcuts } from './keyboard-shortcuts';
export { default as MultiSelectScrollIntoView } from './multi-select-scroll-into-view';
export { default as NavigableToolbar } from './navigable-toolbar';
diff --git a/packages/block-editor/src/components/index.native.js b/packages/block-editor/src/components/index.native.js
index 9fe95c7d93cd25..d859f6d65b6f67 100644
--- a/packages/block-editor/src/components/index.native.js
+++ b/packages/block-editor/src/components/index.native.js
@@ -1,5 +1,6 @@
// Block Creation Components
export { default as BlockAlignmentToolbar } from './block-alignment-toolbar';
+export { BlockContextProvider } from './block-context';
export { default as BlockControls } from './block-controls';
export { default as BlockEdit, useBlockEditContext } from './block-edit';
export { default as BlockFormatControls } from './block-format-controls';
@@ -11,6 +12,7 @@ export * from './font-sizes';
export { default as AlignmentToolbar } from './alignment-toolbar';
export { default as InnerBlocks } from './inner-blocks';
export { default as InspectorControls } from './inspector-controls';
+export { default as __experimentalLineHeightControl } from './line-height-control';
export { default as PlainText } from './plain-text';
export {
default as RichText,
@@ -30,6 +32,7 @@ export { default as URLInput } from './url-input';
export { default as BlockInvalidWarning } from './block-list/block-invalid-warning';
export { default as BlockCaption } from './block-caption';
export { default as Caption } from './caption';
+export { default as PanelColorSettings } from './panel-color-settings';
export { BottomSheetSettings, BlockSettingsButton } from './block-settings';
export { default as VideoPlayer, VIDEO_ASPECT_RATIO } from './video-player';
@@ -37,14 +40,15 @@ export { default as VideoPlayer, VIDEO_ASPECT_RATIO } from './video-player';
// Content Related Components
export {
__experimentalPageTemplatePicker,
- __experimentalUsePageTemplatePickerVisible,
- __experimentalWithPageTemplatePickerVisible,
+ __experimentalWithPageTemplatePicker,
} from './page-template-picker';
export { default as BlockList } from './block-list';
export { default as BlockMover } from './block-mover';
export { default as BlockToolbar } from './block-toolbar';
export { default as DefaultBlockAppender } from './default-block-appender';
+export { default as __unstableEditorStyles } from './editor-styles';
export { default as Inserter } from './inserter';
+export { Block as __experimentalBlock } from './block-list/block-wrapper';
// State Related Components
export { default as BlockEditorProvider } from './provider';
diff --git a/packages/block-editor/src/components/inner-blocks/button-block-appender.js b/packages/block-editor/src/components/inner-blocks/button-block-appender.js
index 5823a5e42c7b0c..874366015abd16 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
@@ -4,11 +4,16 @@
import BaseButtonBlockAppender from '../button-block-appender';
import withClientId from './with-client-id';
-export const ButtonBlockAppender = ( { clientId, showSeparator } ) => {
+export const ButtonBlockAppender = ( {
+ clientId,
+ showSeparator,
+ onAddBlock,
+} ) => {
return (
);
};
diff --git a/packages/block-editor/src/components/inner-blocks/index.js b/packages/block-editor/src/components/inner-blocks/index.js
index 55f2890e8d8dab..64b958d7f8bf10 100644
--- a/packages/block-editor/src/components/inner-blocks/index.js
+++ b/packages/block-editor/src/components/inner-blocks/index.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import { pick, isEqual } from 'lodash';
+import { mapValues, pick, isEqual } from 'lodash';
import classnames from 'classnames';
/**
@@ -11,6 +11,7 @@ import { withViewportMatch } from '@wordpress/viewport';
import { Component, forwardRef, useRef } from '@wordpress/element';
import { withSelect, withDispatch } from '@wordpress/data';
import {
+ getBlockType,
synchronizeBlocksWithTemplate,
withBlockContentContext,
} from '@wordpress/blocks';
@@ -27,8 +28,44 @@ import DefaultBlockAppender from './default-block-appender';
* Internal dependencies
*/
import BlockList from '../block-list';
+import { BlockContextProvider } from '../block-context';
import { withBlockEditContext } from '../block-edit/context';
+/**
+ * Block context cache, implemented as a WeakMap mapping block types to a
+ * WeakMap mapping attributes object to context value.
+ *
+ * @type {WeakMap>}
+ */
+const BLOCK_CONTEXT_CACHE = new WeakMap();
+
+/**
+ * Returns a cached context object value for a given set of attributes for the
+ * block type.
+ *
+ * @param {Record} attributes Block attributes object.
+ * @param {WPBlockType} blockType Block type settings.
+ *
+ * @return {Record} Context value.
+ */
+function getBlockContext( attributes, blockType ) {
+ if ( ! BLOCK_CONTEXT_CACHE.has( blockType ) ) {
+ BLOCK_CONTEXT_CACHE.set( blockType, new WeakMap() );
+ }
+
+ const blockTypeCache = BLOCK_CONTEXT_CACHE.get( blockType );
+ if ( ! blockTypeCache.has( attributes ) ) {
+ const context = mapValues(
+ blockType.providesContext,
+ ( attributeName ) => attributes[ attributeName ]
+ );
+
+ blockTypeCache.set( attributes, context );
+ }
+
+ return blockTypeCache.get( attributes );
+}
+
class InnerBlocks extends Component {
constructor() {
super( ...arguments );
@@ -61,7 +98,7 @@ class InnerBlocks extends Component {
// Set controlled blocks value from parent, if any.
if ( __experimentalBlocks ) {
__unstableMarkNextChangeAsNotPersistent();
- replaceInnerBlocks( __experimentalBlocks );
+ replaceInnerBlocks( __experimentalBlocks, false );
}
}
@@ -125,7 +162,6 @@ class InnerBlocks extends Component {
parentLock,
__experimentalCaptureToolbars,
__experimentalMoverDirection,
- __experimentalUIParts,
} = this.props;
const newSettings = {
@@ -135,7 +171,6 @@ class InnerBlocks extends Component {
__experimentalCaptureToolbars:
__experimentalCaptureToolbars || false,
__experimentalMoverDirection,
- __experimentalUIParts,
};
if ( ! isShallowEqual( blockListSettings, newSettings ) ) {
@@ -150,6 +185,7 @@ class InnerBlocks extends Component {
hasOverlay,
__experimentalCaptureToolbars: captureToolbars,
forwardedRef,
+ block,
...props
} = this.props;
const { templateInProcess } = this.state;
@@ -163,7 +199,7 @@ class InnerBlocks extends Component {
'is-capturing-toolbar': captureToolbars,
} );
- const blockList = (
+ let blockList = (
);
+ // Wrap context provider if (and only if) block has context to provide.
+ const blockType = getBlockType( block.name );
+ if ( blockType && blockType.providesContext ) {
+ const context = getBlockContext( block.attributes, blockType );
+
+ blockList = (
+
+ { blockList }
+
+ );
+ }
+
if ( props.__experimentalTagName ) {
return blockList;
}
@@ -227,13 +275,15 @@ const ComposedInnerBlocks = compose( [
} = ownProps;
return {
- replaceInnerBlocks( blocks ) {
+ replaceInnerBlocks( blocks, forceUpdateSelection ) {
replaceInnerBlocks(
clientId,
blocks,
- block.innerBlocks.length === 0 &&
- templateInsertUpdatesSelection &&
- blocks.length !== 0
+ forceUpdateSelection !== undefined
+ ? forceUpdateSelection
+ : block.innerBlocks.length === 0 &&
+ templateInsertUpdatesSelection &&
+ blocks.length !== 0
);
},
__unstableMarkNextChangeAsNotPersistent,
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 5ec57dea4e5545..94985621c0feee 100644
--- a/packages/block-editor/src/components/inner-blocks/index.native.js
+++ b/packages/block-editor/src/components/inner-blocks/index.native.js
@@ -109,16 +109,37 @@ class InnerBlocks extends Component {
}
render() {
- const { clientId, renderAppender } = this.props;
+ const {
+ clientId,
+ renderAppender,
+ __experimentalMoverDirection,
+ horizontal,
+ contentResizeMode,
+ contentStyle,
+ onAddBlock,
+ onDeleteBlock,
+ marginVertical,
+ marginHorizontal,
+ } = this.props;
const { templateInProcess } = this.state;
return (
<>
{ ! templateInProcess && (
) }
>
diff --git a/packages/block-editor/src/components/inserter-list-item/style.scss b/packages/block-editor/src/components/inserter-list-item/style.scss
index 3ecebfdb94d8da..745caa0ed1ff7a 100644
--- a/packages/block-editor/src/components/inserter-list-item/style.scss
+++ b/packages/block-editor/src/components/inserter-list-item/style.scss
@@ -2,7 +2,7 @@
display: block;
width: 33.33%;
padding: 0;
- margin: 0 0 12px;
+ margin: 0;
}
.components-button.block-editor-block-types-list__item {
@@ -11,13 +11,13 @@
width: 100%;
font-size: $default-font-size;
color: $dark-gray-700;
- padding: 0 4px;
+ padding: $grid-unit-10;
align-items: stretch;
justify-content: center;
cursor: pointer;
background: transparent;
word-break: break-word;
- border-radius: $radius-round-rectangle;
+ border-radius: $radius-block-ui;
border: $border-width solid transparent;
transition: all 0.05s ease-in-out;
@include reduce-motion("transition");
@@ -25,23 +25,30 @@
height: auto;
&:disabled {
- @include block-style__disabled();
+ opacity: 0.6;
+ cursor: default;
}
&:not(:disabled) {
&:hover {
- @include block-style__hover();
+ border-color: $theme-color;
+ color: $theme-color !important;
}
&.is-active {
- @include block-style__is-active();
+ color: $white;
+ background: $dark-gray-primary;
+
+ // Windows High Contrast mode will show this outline, but not the box-shadow.
+ outline: 2px solid transparent;
+ outline-offset: -2px;
}
}
}
.block-editor-block-types-list__item-icon {
padding: 12px 20px;
- border-radius: $radius-round-rectangle;
+ border-radius: $radius-block-ui;
color: $dark-gray-primary;
transition: all 0.05s ease-in-out;
@include reduce-motion("transition");
@@ -59,4 +66,5 @@
.block-editor-block-types-list__item-title {
padding: 4px 2px 8px;
+ font-size: 12px;
}
diff --git a/packages/block-editor/src/components/inserter/block-list.js b/packages/block-editor/src/components/inserter/block-list.js
new file mode 100644
index 00000000000000..9bffeef1adfca5
--- /dev/null
+++ b/packages/block-editor/src/components/inserter/block-list.js
@@ -0,0 +1,300 @@
+/**
+ * External dependencies
+ */
+import {
+ map,
+ includes,
+ filter,
+ findIndex,
+ flow,
+ sortBy,
+ groupBy,
+ isEmpty,
+} from 'lodash';
+
+/**
+ * WordPress dependencies
+ */
+import { __, _x, _n, sprintf } from '@wordpress/i18n';
+import { withSpokenMessages } from '@wordpress/components';
+import { addQueryArgs } from '@wordpress/url';
+import { controlsRepeat } from '@wordpress/icons';
+import { speak } from '@wordpress/a11y';
+import { createBlock } from '@wordpress/blocks';
+import { useMemo, useEffect } from '@wordpress/element';
+import { useSelect } from '@wordpress/data';
+import { compose } from '@wordpress/compose';
+
+/**
+ * Internal dependencies
+ */
+import BlockTypesList from '../block-types-list';
+import ChildBlocks from './child-blocks';
+import __experimentalInserterMenuExtension from '../inserter-menu-extension';
+import { searchItems } from './search-items';
+import InserterPanel from './panel';
+
+// Copied over from the Columns block. It seems like it should become part of public API.
+const createBlocksFromInnerBlocksTemplate = ( innerBlocksTemplate ) => {
+ return map(
+ innerBlocksTemplate,
+ ( [ name, attributes, innerBlocks = [] ] ) =>
+ createBlock(
+ name,
+ attributes,
+ createBlocksFromInnerBlocksTemplate( innerBlocks )
+ )
+ );
+};
+
+const getBlockNamespace = ( item ) => item.name.split( '/' )[ 0 ];
+
+const MAX_SUGGESTED_ITEMS = 9;
+
+function InserterBlockList( {
+ rootClientId,
+ onInsert,
+ onHover,
+ __experimentalSelectBlockOnInsert: selectBlockOnInsert,
+ filterValue,
+ debouncedSpeak,
+} ) {
+ const {
+ categories,
+ collections,
+ items,
+ rootChildBlocks,
+ fetchReusableBlocks,
+ } = useSelect(
+ ( select ) => {
+ const { getInserterItems, getBlockName, getSettings } = select(
+ 'core/block-editor'
+ );
+ const {
+ getCategories,
+ getCollections,
+ getChildBlockNames,
+ } = select( 'core/blocks' );
+ const rootBlockName = getBlockName( rootClientId );
+ const { __experimentalFetchReusableBlocks } = getSettings();
+
+ return {
+ categories: getCategories(),
+ collections: getCollections(),
+ rootChildBlocks: getChildBlockNames( rootBlockName ),
+ items: getInserterItems( rootClientId ),
+ fetchReusableBlocks: __experimentalFetchReusableBlocks,
+ };
+ },
+ [ rootClientId ]
+ );
+
+ // Fetch resuable blocks on mount
+ useEffect( () => {
+ if ( fetchReusableBlocks ) {
+ fetchReusableBlocks();
+ }
+ }, [] );
+
+ const onSelectItem = ( item ) => {
+ const { name, title, initialAttributes, innerBlocks } = item;
+ const insertedBlock = createBlock(
+ name,
+ initialAttributes,
+ createBlocksFromInnerBlocksTemplate( innerBlocks )
+ );
+
+ onInsert( insertedBlock );
+
+ if ( ! selectBlockOnInsert ) {
+ // translators: %s: the name of the block that has been added
+ const message = sprintf( __( '%s block added' ), title );
+ speak( message );
+ }
+ };
+
+ const filteredItems = useMemo( () => {
+ return searchItems( items, categories, collections, filterValue );
+ }, [ filterValue, items, categories, collections ] );
+
+ const childItems = useMemo( () => {
+ return filter( filteredItems, ( { name } ) =>
+ includes( rootChildBlocks, name )
+ );
+ }, [ filteredItems, rootChildBlocks ] );
+
+ const suggestedItems = useMemo( () => {
+ return filter( items, ( item ) => item.utility > 0 ).slice(
+ 0,
+ MAX_SUGGESTED_ITEMS
+ );
+ }, [ items ] );
+
+ const reusableItems = useMemo( () => {
+ return filter( filteredItems, { category: 'reusable' } );
+ }, [ filteredItems ] );
+
+ const itemsPerCategory = useMemo( () => {
+ const getCategoryIndex = ( item ) => {
+ return findIndex(
+ categories,
+ ( category ) => category.slug === item.category
+ );
+ };
+
+ return flow(
+ ( itemList ) =>
+ filter( itemList, ( item ) => item.category !== 'reusable' ),
+ ( itemList ) => sortBy( itemList, getCategoryIndex ),
+ ( itemList ) => groupBy( itemList, 'category' )
+ )( filteredItems );
+ }, [ filteredItems, categories ] );
+
+ const itemsPerCollection = useMemo( () => {
+ // Create a new Object to avoid mutating collection
+ const result = { ...collections };
+ Object.keys( collections ).forEach( ( namespace ) => {
+ result[ namespace ] = filteredItems.filter(
+ ( item ) => getBlockNamespace( item ) === namespace
+ );
+ if ( result[ namespace ].length === 0 ) {
+ delete result[ namespace ];
+ }
+ } );
+
+ return result;
+ }, [ filteredItems, collections ] );
+
+ // Announce search results on change
+ useEffect( () => {
+ const resultCount = Object.keys( itemsPerCategory ).reduce(
+ ( accumulator, currentCategorySlug ) => {
+ return (
+ accumulator + itemsPerCategory[ currentCategorySlug ].length
+ );
+ },
+ 0
+ );
+
+ const resultsFoundMessage = sprintf(
+ /* translators: %d: number of results. */
+ _n( '%d result found.', '%d results found.', resultCount ),
+ resultCount
+ );
+ debouncedSpeak( resultsFoundMessage );
+ }, [ itemsPerCategory, debouncedSpeak ] );
+
+ const hasItems = ! isEmpty( filteredItems );
+ const hasChildItems = childItems.length > 0;
+
+ return (
+
+
+
+ { ! hasChildItems && !! suggestedItems.length && ! filterValue && (
+
+
+
+ ) }
+
+ { ! hasChildItems &&
+ map( categories, ( category ) => {
+ const categoryItems = itemsPerCategory[ category.slug ];
+ if ( ! categoryItems || ! categoryItems.length ) {
+ return null;
+ }
+ return (
+
+
+
+ );
+ } ) }
+
+ { ! hasChildItems &&
+ map( collections, ( collection, namespace ) => {
+ const collectionItems = itemsPerCollection[ namespace ];
+ if ( ! collectionItems || ! collectionItems.length ) {
+ return null;
+ }
+
+ return (
+
+
+
+ );
+ } ) }
+
+ { ! hasChildItems && !! reusableItems.length && (
+
+
+
+ { __( 'Manage all reusable blocks' ) }
+
+
+ ) }
+
+ <__experimentalInserterMenuExtension.Slot
+ fillProps={ {
+ onSelect: onSelectItem,
+ onHover,
+ filterValue,
+ hasItems,
+ } }
+ >
+ { ( fills ) => {
+ if ( fills.length ) {
+ return fills;
+ }
+ if ( ! hasItems ) {
+ return (
+
+ { __( 'No blocks found.' ) }
+
+ );
+ }
+ return null;
+ } }
+
+
+ );
+}
+
+export default compose( withSpokenMessages )( InserterBlockList );
diff --git a/packages/block-editor/src/components/inserter/block-patterns.js b/packages/block-editor/src/components/inserter/block-patterns.js
new file mode 100644
index 00000000000000..56288df4be228a
--- /dev/null
+++ b/packages/block-editor/src/components/inserter/block-patterns.js
@@ -0,0 +1,84 @@
+/**
+ * External dependencies
+ */
+import { map } from 'lodash';
+
+/**
+ * WordPress dependencies
+ */
+import { useMemo, useCallback } from '@wordpress/element';
+import { parse, cloneBlock } from '@wordpress/blocks';
+import { useDispatch } from '@wordpress/data';
+import { ENTER, SPACE } from '@wordpress/keycodes';
+import { __, sprintf, _x } from '@wordpress/i18n';
+
+/**
+ * Internal dependencies
+ */
+import BlockPreview from '../block-preview';
+import useAsyncList from './use-async-list';
+import InserterPanel from './panel';
+
+function BlockPattern( { pattern, onClick } ) {
+ const { content } = pattern;
+ const blocks = useMemo( () => parse( content ), [ content ] );
+
+ return (
+ onClick( pattern, blocks ) }
+ onKeyDown={ ( event ) => {
+ if ( ENTER === event.keyCode || SPACE === event.keyCode ) {
+ onClick( blocks );
+ }
+ } }
+ tabIndex={ 0 }
+ aria-label={ pattern.title }
+ >
+
+
+ );
+}
+
+function BlockPatternPlaceholder() {
+ return (
+
+ );
+}
+
+function BlockPatterns( { patterns, onInsert } ) {
+ const currentShownPatterns = useAsyncList( patterns );
+ const { createSuccessNotice } = useDispatch( 'core/notices' );
+ const onClickPattern = useCallback( ( pattern, blocks ) => {
+ onInsert( map( blocks, ( block ) => cloneBlock( block ) ) );
+ createSuccessNotice(
+ sprintf(
+ /* translators: %s: block pattern title. */
+ __( 'Pattern "%s" inserted.' ),
+ pattern.title
+ ),
+ {
+ type: 'snackbar',
+ }
+ );
+ }, [] );
+
+ return (
+
+ { patterns.map( ( pattern, index ) =>
+ currentShownPatterns[ index ] === pattern ? (
+
+ ) : (
+
+ )
+ ) }
+
+ );
+}
+
+export default BlockPatterns;
diff --git a/packages/block-editor/src/components/inserter/index.js b/packages/block-editor/src/components/inserter/index.js
index 5f03ae982b2cd1..6b292f4506d49a 100644
--- a/packages/block-editor/src/components/inserter/index.js
+++ b/packages/block-editor/src/components/inserter/index.js
@@ -29,8 +29,8 @@ const defaultRenderToggle = ( {
} ) => {
let label;
if ( hasSingleBlockType ) {
- // translators: %s: the name of the block when there is only one
label = sprintf(
+ // translators: %s: the name of the block when there is only one
_x( 'Add %s', 'directly add the only allowed block' ),
blockTitle
);
@@ -236,8 +236,8 @@ export default compose( [
);
if ( ! selectBlockOnInsert ) {
- // translators: %s: the name of the block that has been added
const message = sprintf(
+ // translators: %s: the name of the block that has been added
__( '%s block added' ),
allowedBlockType.title
);
diff --git a/packages/block-editor/src/components/inserter/library.js b/packages/block-editor/src/components/inserter/library.js
new file mode 100644
index 00000000000000..a5e7094f54d4a7
--- /dev/null
+++ b/packages/block-editor/src/components/inserter/library.js
@@ -0,0 +1,47 @@
+/**
+ * External dependencies
+ */
+import { noop } from 'lodash';
+
+/**
+ * WordPress dependencies
+ */
+import { useSelect } from '@wordpress/data';
+
+/**
+ * Internal dependencies
+ */
+import InserterMenu from './menu';
+
+function InserterLibrary( {
+ rootClientId,
+ clientId,
+ isAppender,
+ showInserterHelpPanel,
+ __experimentalSelectBlockOnInsert: selectBlockOnInsert,
+ onSelect = noop,
+} ) {
+ const { destinationRootClientId } = useSelect( ( select ) => {
+ const { getBlockRootClientId } = select( 'core/block-editor' );
+
+ rootClientId =
+ rootClientId || getBlockRootClientId( clientId ) || undefined;
+
+ return {
+ rootClientId,
+ };
+ } );
+
+ return (
+
+ );
+}
+
+export default InserterLibrary;
diff --git a/packages/block-editor/src/components/inserter/menu.js b/packages/block-editor/src/components/inserter/menu.js
index c81e2956203b36..6e446717f37517 100644
--- a/packages/block-editor/src/components/inserter/menu.js
+++ b/packages/block-editor/src/components/inserter/menu.js
@@ -1,267 +1,83 @@
/**
* External dependencies
*/
-import {
- filter,
- findIndex,
- flow,
- groupBy,
- isEmpty,
- map,
- sortBy,
- without,
- includes,
-} from 'lodash';
-import scrollIntoView from 'dom-scroll-into-view';
+import { includes, pick } from 'lodash';
/**
* WordPress dependencies
*/
-import { speak } from '@wordpress/a11y';
-import { __, _n, _x, sprintf } from '@wordpress/i18n';
-import { Component, createRef } from '@wordpress/element';
-import { PanelBody, withSpokenMessages } from '@wordpress/components';
-import {
- isReusableBlock,
- createBlock,
- isUnmodifiedDefaultBlock,
- getBlockType,
- getBlockFromExample,
-} from '@wordpress/blocks';
-import { withDispatch, withSelect } from '@wordpress/data';
-import { withInstanceId, compose, withSafeTimeout } from '@wordpress/compose';
+import { useState } from '@wordpress/element';
import { LEFT, RIGHT, UP, DOWN, BACKSPACE, ENTER } from '@wordpress/keycodes';
-import { addQueryArgs } from '@wordpress/url';
-import { controlsRepeat } from '@wordpress/icons';
+import { TabPanel } from '@wordpress/components';
+import { __ } from '@wordpress/i18n';
+import { useSelect, useDispatch } from '@wordpress/data';
+import { isUnmodifiedDefaultBlock } from '@wordpress/blocks';
/**
* Internal dependencies
*/
-import BlockPreview from '../block-preview';
-import BlockTypesList from '../block-types-list';
-import BlockCard from '../block-card';
-import ChildBlocks from './child-blocks';
import Tips from './tips';
-import __experimentalInserterMenuExtension from '../inserter-menu-extension';
-import { searchItems } from './search-items';
-
-const MAX_SUGGESTED_ITEMS = 9;
+import InserterSearchForm from './search-form';
+import InserterPreviewPanel from './preview-panel';
+import InserterBlockList from './block-list';
+import BlockPatterns from './block-patterns';
const stopKeyPropagation = ( event ) => event.stopPropagation();
-const getBlockNamespace = ( item ) => item.name.split( '/' )[ 0 ];
-
-// Copied over from the Columns block. It seems like it should become part of public API.
-const createBlocksFromInnerBlocksTemplate = ( innerBlocksTemplate ) => {
- return map(
- innerBlocksTemplate,
- ( [ name, attributes, innerBlocks = [] ] ) =>
- createBlock(
- name,
- attributes,
- createBlocksFromInnerBlocksTemplate( innerBlocks )
- )
- );
-};
-
-export class InserterMenu extends Component {
- constructor() {
- super( ...arguments );
- this.state = {
- childItems: [],
- filterValue: '',
- hoveredItem: null,
- suggestedItems: [],
- reusableItems: [],
- itemsPerCategory: {},
- itemsPerCollection: {},
- openPanels: [ 'suggested' ],
- };
- this.onChangeSearchInput = this.onChangeSearchInput.bind( this );
- this.onHover = this.onHover.bind( this );
- this.panels = {};
- this.inserterResults = createRef();
- }
-
- componentDidMount() {
- if ( this.props.fetchReusableBlocks ) {
- this.props.fetchReusableBlocks();
- }
- this.filter();
- }
-
- componentDidUpdate( prevProps ) {
- if ( prevProps.items !== this.props.items ) {
- this.filter( this.state.filterValue );
- }
- }
-
- onChangeSearchInput( event ) {
- this.filter( event.target.value );
- }
-
- onHover( item ) {
- this.setState( {
- hoveredItem: item,
- } );
-
- const { showInsertionPoint, hideInsertionPoint } = this.props;
- if ( item ) {
- showInsertionPoint();
- } else {
- hideInsertionPoint();
- }
- }
-
- bindPanel( name ) {
- return ( ref ) => {
- this.panels[ name ] = ref;
- };
- }
-
- onTogglePanel( panel ) {
- return () => {
- const isOpened = this.state.openPanels.indexOf( panel ) !== -1;
- if ( isOpened ) {
- this.setState( {
- openPanels: without( this.state.openPanels, panel ),
- } );
- } else {
- this.setState( {
- openPanels: [ ...this.state.openPanels, panel ],
- } );
-
- this.props.setTimeout( () => {
- // We need a generic way to access the panel's container
- scrollIntoView(
- this.panels[ panel ],
- this.inserterResults.current,
- {
- alignWithTop: true,
- }
- );
- } );
- }
- };
- }
-
- filterOpenPanels(
- filterValue,
- itemsPerCategory,
- itemsPerCollection,
- filteredItems,
- reusableItems
- ) {
- if ( filterValue === this.state.filterValue ) {
- return this.state.openPanels;
- }
- if ( ! filterValue ) {
- return [ 'suggested' ];
- }
- let openPanels = [];
- if ( reusableItems.length > 0 ) {
- openPanels.push( 'reusable' );
- }
- if ( filteredItems.length > 0 ) {
- openPanels = openPanels.concat(
- Object.keys( itemsPerCategory ),
- Object.keys( itemsPerCollection )
- );
- }
-
- return openPanels;
- }
-
- filter( filterValue = '' ) {
+function InserterMenu( {
+ rootClientId,
+ clientId,
+ isAppender,
+ __experimentalSelectBlockOnInsert,
+ onSelect,
+ showInserterHelpPanel,
+} ) {
+ const [ filterValue, setFilterValue ] = useState( '' );
+ const [ hoveredItem, setHoveredItem ] = useState( null );
+ const {
+ destinationRootClientId,
+ patterns,
+ getSelectedBlock,
+ getBlockIndex,
+ getBlockSelectionEnd,
+ getBlockOrder,
+ } = useSelect( ( select ) => {
const {
- categories,
- collections,
- debouncedSpeak,
- items,
- rootChildBlocks,
- } = this.props;
-
- const filteredItems = searchItems(
- items,
- categories,
- collections,
- filterValue
- );
-
- const childItems = filter( filteredItems, ( { name } ) =>
- includes( rootChildBlocks, name )
- );
+ getSettings,
+ getBlockRootClientId,
+ getBlockSelectionEnd: _getBlockSelectionEnd,
+ } = select( 'core/block-editor' );
- let suggestedItems = [];
- if ( ! filterValue ) {
- const maxSuggestedItems =
- this.props.maxSuggestedItems || MAX_SUGGESTED_ITEMS;
- suggestedItems = filter(
- items,
- ( item ) => item.utility > 0
- ).slice( 0, maxSuggestedItems );
+ let destRootClientId = rootClientId;
+ if ( ! destRootClientId && ! clientId && ! isAppender ) {
+ const end = _getBlockSelectionEnd();
+ if ( end ) {
+ destRootClientId = getBlockRootClientId( end ) || undefined;
+ }
}
-
- const reusableItems = filter( filteredItems, { category: 'reusable' } );
-
- const getCategoryIndex = ( item ) => {
- return findIndex(
- categories,
- ( category ) => category.slug === item.category
- );
+ return {
+ patterns: getSettings().__experimentalBlockPatterns,
+ destinationRootClientId: destRootClientId,
+ ...pick( select( 'core/block-editor' ), [
+ 'getSelectedBlock',
+ 'getBlockIndex',
+ 'getBlockSelectionEnd',
+ 'getBlockOrder',
+ ] ),
};
- const itemsPerCategory = flow(
- ( itemList ) =>
- filter( itemList, ( item ) => item.category !== 'reusable' ),
- ( itemList ) => sortBy( itemList, getCategoryIndex ),
- ( itemList ) => groupBy( itemList, 'category' )
- )( filteredItems );
-
- // Create a new Object to avoid mutating this.props.collection
- const itemsPerCollection = { ...collections };
- Object.keys( collections ).forEach( ( namespace ) => {
- itemsPerCollection[ namespace ] = filteredItems.filter(
- ( item ) => getBlockNamespace( item ) === namespace
- );
- if ( itemsPerCollection[ namespace ].length === 0 ) {
- delete itemsPerCollection[ namespace ];
- }
- } );
-
- this.setState( {
- hoveredItem: null,
- childItems,
- filterValue,
- suggestedItems,
- reusableItems,
- itemsPerCategory,
- itemsPerCollection,
- openPanels: this.filterOpenPanels(
- filterValue,
- itemsPerCategory,
- itemsPerCollection,
- filteredItems,
- reusableItems
- ),
- } );
-
- const resultCount = Object.keys( itemsPerCategory ).reduce(
- ( accumulator, currentCategorySlug ) => {
- return (
- accumulator + itemsPerCategory[ currentCategorySlug ].length
- );
- },
- 0
- );
-
- const resultsFoundMessage = sprintf(
- _n( '%d result found.', '%d results found.', resultCount ),
- resultCount
- );
- debouncedSpeak( resultsFoundMessage );
- }
-
- onKeyDown( event ) {
+ }, [] );
+ const {
+ replaceBlocks,
+ insertBlocks,
+ showInsertionPoint,
+ hideInsertionPoint,
+ } = useDispatch( 'core/block-editor' );
+ const hasPatterns =
+ ! destinationRootClientId &&
+ !! patterns &&
+ !! patterns.length &&
+ ! filterValue;
+ const onKeyDown = ( event ) => {
if (
includes(
[ LEFT, DOWN, RIGHT, UP, BACKSPACE, ENTER ],
@@ -271,378 +87,136 @@ export class InserterMenu extends Component {
// Stop the key event from propagating up to ObserveTyping.startTypingInTextField.
event.stopPropagation();
}
- }
-
- render() {
- const {
- categories,
- collections,
- instanceId,
- onSelect,
- rootClientId,
- showInserterHelpPanel,
- } = this.props;
- const {
- childItems,
- hoveredItem,
- itemsPerCategory,
- itemsPerCollection,
- openPanels,
- reusableItems,
- suggestedItems,
- filterValue,
- } = this.state;
- const isPanelOpen = ( panel ) => openPanels.indexOf( panel ) !== -1;
- const hasItems =
- ! isEmpty( suggestedItems ) ||
- ! isEmpty( reusableItems ) ||
- ! isEmpty( itemsPerCategory ) ||
- ! isEmpty( itemsPerCollection );
- const hoveredItemBlockType = hoveredItem
- ? getBlockType( hoveredItem.name )
- : null;
- const hasHelpPanel = hasItems && showInserterHelpPanel;
-
- // Disable reason (no-autofocus): The inserter menu is a modal display, not one which
- // is always visible, and one which already incurs this behavior of autoFocus via
- // Popover's focusOnMount.
- // Disable reason (no-static-element-interactions): Navigational key-presses within
- // the menu are prevented from triggering WritingFlow and ObserveTyping interactions.
- /* eslint-disable jsx-a11y/no-autofocus, jsx-a11y/no-static-element-interactions */
- return (
-
-
-
- { __( 'Search for a block' ) }
-
-
-
-
-
-
- { !! suggestedItems.length && (
-
-
-
- ) }
-
- { map( categories, ( category ) => {
- const categoryItems =
- itemsPerCategory[ category.slug ];
- if ( ! categoryItems || ! categoryItems.length ) {
- return null;
- }
- return (
-
-
-
- );
- } ) }
-
- { map( collections, ( collection, namespace ) => {
- const collectionItems =
- itemsPerCollection[ namespace ];
- if (
- ! collectionItems ||
- ! collectionItems.length
- ) {
- return null;
- }
-
- return (
-
-
-
- );
- } ) }
+ };
+
+ // To avoid duplication, getInsertionIndex is extracted and used in two event handlers
+ // This breaks the withDispatch not containing any logic rule.
+ // Since it's a function only called when the event handlers are called,
+ // it's fine to extract it.
+ // eslint-disable-next-line no-restricted-syntax
+ function getInsertionIndex() {
+ // If the clientId is defined, we insert at the position of the block.
+ if ( clientId ) {
+ return getBlockIndex( clientId, destinationRootClientId );
+ }
- { !! reusableItems.length && (
-
-
-
- { __( 'Manage all reusable blocks' ) }
-
-
- ) }
+ // If there a selected block, we insert after the selected block.
+ const end = getBlockSelectionEnd();
+ if ( ! isAppender && end ) {
+ return getBlockIndex( end, destinationRootClientId ) + 1;
+ }
- <__experimentalInserterMenuExtension.Slot
- fillProps={ {
- onSelect,
- onHover: this.onHover,
- filterValue,
- hasItems,
- } }
- >
- { ( fills ) => {
- if ( fills.length ) {
- return fills;
- }
- if ( ! hasItems ) {
- return (
-
- { __( 'No blocks found.' ) }
-
- );
- }
- return null;
- } }
-
-
- { showInserterHelpPanel && (
-
-
-
- ) }
-
- { hasHelpPanel && hoveredItem && (
-
- { ! isReusableBlock( hoveredItem ) && (
-
- ) }
-
- { isReusableBlock( hoveredItem ) ||
- hoveredItemBlockType.example ? (
-
-
-
- ) : (
-
- { __( 'No Preview Available.' ) }
-
- ) }
-
-
- ) }
-
- );
- /* eslint-enable jsx-a11y/no-autofocus, jsx-a11y/no-static-element-interactions */
+ // Otherwise, we insert at the end of the current rootClientId
+ return getBlockOrder( destinationRootClientId ).length;
}
-}
-export default compose(
- withSelect( ( select, { clientId, isAppender, rootClientId } ) => {
- const {
- getInserterItems,
- getBlockName,
- getBlockRootClientId,
- getBlockSelectionEnd,
- getSettings,
- } = select( 'core/block-editor' );
- const { getCategories, getCollections, getChildBlockNames } = select(
- 'core/blocks'
- );
-
- let destinationRootClientId = rootClientId;
- if ( ! destinationRootClientId && ! clientId && ! isAppender ) {
- const end = getBlockSelectionEnd();
- if ( end ) {
- destinationRootClientId =
- getBlockRootClientId( end ) || undefined;
- }
+ const onInsertBlocks = ( blocks ) => {
+ const selectedBlock = getSelectedBlock();
+ if (
+ ! isAppender &&
+ selectedBlock &&
+ isUnmodifiedDefaultBlock( selectedBlock )
+ ) {
+ replaceBlocks( selectedBlock.clientId, blocks );
+ } else {
+ insertBlocks(
+ blocks,
+ getInsertionIndex(),
+ destinationRootClientId,
+ __experimentalSelectBlockOnInsert
+ );
}
- const destinationRootBlockName = getBlockName(
- destinationRootClientId
- );
-
- const {
- __experimentalFetchReusableBlocks: fetchReusableBlocks,
- } = getSettings();
-
- return {
- categories: getCategories(),
- collections: getCollections(),
- rootChildBlocks: getChildBlockNames( destinationRootBlockName ),
- items: getInserterItems( destinationRootClientId ),
- destinationRootClientId,
- fetchReusableBlocks,
- };
- } ),
- withDispatch( ( dispatch, ownProps, { select } ) => {
- const { showInsertionPoint, hideInsertionPoint } = dispatch(
- 'core/block-editor'
- );
- // To avoid duplication, getInsertionIndex is extracted and used in two event handlers
- // This breaks the withDispatch not containing any logic rule.
- // Since it's a function only called when the event handlers are called,
- // it's fine to extract it.
- // eslint-disable-next-line no-restricted-syntax
- function getInsertionIndex() {
- const {
- getBlockIndex,
- getBlockSelectionEnd,
- getBlockOrder,
- } = select( 'core/block-editor' );
- const { clientId, destinationRootClientId, isAppender } = ownProps;
-
- // If the clientId is defined, we insert at the position of the block.
- if ( clientId ) {
- return getBlockIndex( clientId, destinationRootClientId );
- }
+ onSelect();
+ };
- // If there a selected block, we insert after the selected block.
- const end = getBlockSelectionEnd();
- if ( ! isAppender && end ) {
- return getBlockIndex( end, destinationRootClientId ) + 1;
- }
-
- // Otherwise, we insert at the end of the current rootClientId
- return getBlockOrder( destinationRootClientId ).length;
+ const onHover = ( item ) => {
+ setHoveredItem( item );
+ if ( item ) {
+ const index = getInsertionIndex();
+ showInsertionPoint( destinationRootClientId, index );
+ } else {
+ hideInsertionPoint();
}
+ };
+
+ const blocksTab = (
+ <>
+
+ { showInserterHelpPanel && (
+
+
+
+ ) }
+ >
+ );
- return {
- showInsertionPoint() {
- const index = getInsertionIndex();
- showInsertionPoint( ownProps.destinationRootClientId, index );
- },
- hideInsertionPoint,
- onSelect( item ) {
- const { replaceBlocks, insertBlock } = dispatch(
- 'core/block-editor'
- );
- const { getSelectedBlock } = select( 'core/block-editor' );
- const {
- isAppender,
- onSelect,
- __experimentalSelectBlockOnInsert: selectBlockOnInsert,
- } = ownProps;
- const { name, title, initialAttributes, innerBlocks } = item;
- const selectedBlock = getSelectedBlock();
- const insertedBlock = createBlock(
- name,
- initialAttributes,
- createBlocksFromInnerBlocksTemplate( innerBlocks )
- );
-
- if (
- ! isAppender &&
- selectedBlock &&
- isUnmodifiedDefaultBlock( selectedBlock )
- ) {
- replaceBlocks( selectedBlock.clientId, insertedBlock );
- } else {
- insertBlock(
- insertedBlock,
- getInsertionIndex(),
- ownProps.destinationRootClientId,
- selectBlockOnInsert
- );
+ const patternsTab = (
+
+
+
+ );
- if ( ! selectBlockOnInsert ) {
- // translators: %s: the name of the block that has been added
- const message = sprintf(
- __( '%s block added' ),
- title
- );
- speak( message );
- }
- }
+ // Disable reason (no-autofocus): The inserter menu is a modal display, not one which
+ // is always visible, and one which already incurs this behavior of autoFocus via
+ // Popover's focusOnMount.
+ // Disable reason (no-static-element-interactions): Navigational key-presses within
+ // the menu are prevented from triggering WritingFlow and ObserveTyping interactions.
+ /* eslint-disable jsx-a11y/no-autofocus, jsx-a11y/no-static-element-interactions */
+ return (
+
+
+
+ { hasPatterns && (
+
+ { ( tab ) => {
+ if ( tab.name === 'blocks' ) {
+ return blocksTab;
+ }
+ return patternsTab;
+ } }
+
+ ) }
+ { ! hasPatterns && blocksTab }
+
+ { showInserterHelpPanel && hoveredItem && (
+
+
+
+ ) }
+
+ );
+ /* eslint-enable jsx-a11y/no-autofocus, jsx-a11y/no-static-element-interactions */
+}
- onSelect();
- return insertedBlock;
- },
- };
- } ),
- withSpokenMessages,
- withInstanceId,
- withSafeTimeout
-)( InserterMenu );
+export default InserterMenu;
diff --git a/packages/block-editor/src/components/inserter/menu.native.js b/packages/block-editor/src/components/inserter/menu.native.js
index 12c8d7d842bc29..0ecfba8e84e709 100644
--- a/packages/block-editor/src/components/inserter/menu.native.js
+++ b/packages/block-editor/src/components/inserter/menu.native.js
@@ -241,7 +241,8 @@ export default compose(
);
const count = getBlockCount();
- if ( count === 1 ) {
+ // Check if there is a rootClientId because that means it is a nested replacable block and we don't want to clear/reset all blocks.
+ if ( count === 1 && ! ownProps.rootClientId ) {
// removing the last block is not possible with `removeBlock` action
// it always inserts a default block if the last of the blocks have been removed
clearSelectedBlock();
diff --git a/packages/block-editor/src/components/inserter/panel.js b/packages/block-editor/src/components/inserter/panel.js
new file mode 100644
index 00000000000000..aa53395d55dd65
--- /dev/null
+++ b/packages/block-editor/src/components/inserter/panel.js
@@ -0,0 +1,22 @@
+/**
+ * WordPress dependencies
+ */
+import { Icon } from '@wordpress/components';
+
+function InserterPanel( { title, icon, children } ) {
+ return (
+ <>
+
+
+ { title }
+
+
+
+
+ { children }
+
+ >
+ );
+}
+
+export default InserterPanel;
diff --git a/packages/block-editor/src/components/inserter/preview-panel.js b/packages/block-editor/src/components/inserter/preview-panel.js
new file mode 100644
index 00000000000000..763edbbd506377
--- /dev/null
+++ b/packages/block-editor/src/components/inserter/preview-panel.js
@@ -0,0 +1,58 @@
+/**
+ * WordPress dependencies
+ */
+import {
+ isReusableBlock,
+ createBlock,
+ getBlockFromExample,
+ getBlockType,
+} from '@wordpress/blocks';
+import { __ } from '@wordpress/i18n';
+
+/**
+ * Internal dependencies
+ */
+import BlockCard from '../block-card';
+import BlockPreview from '../block-preview';
+
+function InserterPreviewPanel( { item } ) {
+ const hoveredItemBlockType = getBlockType( item.name );
+ return (
+
+
+ { isReusableBlock( item ) || hoveredItemBlockType.example ? (
+
+
+
+ ) : (
+
+ { __( 'No Preview Available.' ) }
+
+ ) }
+
+ { ! isReusableBlock( item ) &&
}
+
+ );
+}
+
+export default InserterPreviewPanel;
diff --git a/packages/block-editor/src/components/inserter/search-form.js b/packages/block-editor/src/components/inserter/search-form.js
new file mode 100644
index 00000000000000..6c1f140a98ac7f
--- /dev/null
+++ b/packages/block-editor/src/components/inserter/search-form.js
@@ -0,0 +1,42 @@
+/**
+ * WordPress dependencies
+ */
+import { useInstanceId } from '@wordpress/compose';
+import { __ } from '@wordpress/i18n';
+import { VisuallyHidden } from '@wordpress/components';
+import { Icon, search } from '@wordpress/icons';
+
+function InserterSearchForm( { onChange } ) {
+ const instanceId = useInstanceId( InserterSearchForm );
+
+ // Disable reason (no-autofocus): The inserter menu is a modal display, not one which
+ // is always visible, and one which already incurs this behavior of autoFocus via
+ // Popover's focusOnMount.
+ /* eslint-disable jsx-a11y/no-autofocus */
+ return (
+
+
+ { __( 'Search for a block' ) }
+
+ onChange( event.target.value ) }
+ autoComplete="off"
+ />
+
+
+ );
+ /* eslint-enable jsx-a11y/no-autofocus */
+}
+
+export default InserterSearchForm;
diff --git a/packages/block-editor/src/components/inserter/style.scss b/packages/block-editor/src/components/inserter/style.scss
index 6545773ce3c089..000f3c2cf99bd4 100644
--- a/packages/block-editor/src/components/inserter/style.scss
+++ b/packages/block-editor/src/components/inserter/style.scss
@@ -1,6 +1,6 @@
$block-inserter-preview-height: 350px;
+$block-inserter-width: 350px;
$block-inserter-tabs-height: 44px;
-$block-inserter-search-height: 38px;
.block-editor-inserter {
display: inline-block;
@@ -37,6 +37,8 @@ $block-inserter-search-height: 38px;
.block-editor-inserter__menu {
height: 100%;
+ position: relative;
+ overflow: visible;
}
.block-editor-inserter__main-area {
@@ -45,8 +47,7 @@ $block-inserter-search-height: 38px;
flex-direction: column;
height: 100%;
@include break-medium {
- width: 400px;
- position: relative;
+ width: $block-inserter-width;
}
}
@@ -62,43 +63,98 @@ $block-inserter-search-height: 38px;
z-index: z-index(".components-popover.block-editor-inserter__popover");
}
-.components-popover input[type="search"].block-editor-inserter__search {
- display: block;
- margin: $grid-unit-20;
- padding: 11px $grid-unit-20;
- position: relative;
+.block-editor-inserter__search {
+ padding: $grid-unit-20;
z-index: 1;
- border-radius: $radius-round-rectangle;
flex-shrink: 0;
+ position: relative;
- /* Fonts smaller than 16px causes mobile safari to zoom. */
- font-size: $mobile-text-min-font-size;
- @include break-small {
- font-size: $default-font-size;
- }
+ input[type="search"].block-editor-inserter__search-input {
+ display: block;
+ padding: $grid-unit-20 $grid-unit-60 $grid-unit-20 $grid-unit-20;
+ border-radius: $radius-block-ui;
+ background: $light-gray-200;
+ border: none;
+ width: 100%;
+ height: $grid-unit-60;
+
+ /* Fonts smaller than 16px causes mobile safari to zoom. */
+ font-size: $mobile-text-min-font-size;
+ @include break-small {
+ font-size: $default-font-size;
+ }
- &:focus {
- @include input-style__focus();
+ &:focus {
+ background: $white;
+ box-shadow: 0 0 0 $border-width-focus $theme-color;
+ }
}
}
-.block-editor-inserter__results {
+.block-editor-inserter__search-icon {
+ position: absolute;
+ top: $grid-unit-20 + ($grid-unit-60 - $icon-size) / 2;
+ right: $grid-unit-20 + ($grid-unit-60 - $icon-size) / 2;
+}
+
+.block-editor-inserter__tabs {
+ display: flex;
flex-grow: 1;
- overflow: auto;
- position: relative;
- z-index: 1; // Necessary for the stacked card below parent blocks to show up.
- padding: 0 $grid-unit-20 $grid-unit-20 $grid-unit-20;
+ flex-direction: column;
+ margin-top: -$grid-unit-10;
- &:focus {
- outline: $border-width dotted $dark-gray-500;
+ .components-tab-panel__tabs {
+ border-bottom: $border-width solid $light-gray-500;
+
+ .components-tab-panel__tabs-item {
+ flex-grow: 1;
+ margin-bottom: -$border-width;
+ }
}
- // Don't show the top border on the first panel, let the Search border be the border.
- [role="presentation"] + .components-panel__body {
- border-top: none;
+ .components-tab-panel__tab-content {
+ display: flex;
+ flex-grow: 1;
+ flex-direction: column;
+ position: relative;
}
}
+.block-editor-inserter__panel-header {
+ display: inline-flex;
+ align-items: center;
+ padding: $grid-unit-20 $grid-unit-20 0;
+}
+
+.block-editor-inserter__panel-content {
+ padding: 0 $grid-unit-20;
+}
+
+.block-editor-inserter__panel-title {
+ color: $theme-color;
+ text-transform: uppercase;
+ font-size: 11px;
+ font-weight: 500;
+ margin-right: $grid-unit-10;
+}
+
+.block-editor-inserter__block-list {
+ flex-grow: 1;
+ position: relative;
+}
+
+// This extra div is needed because
+// flex grow and overflow auto doesn't work well together.
+.block-editor-inserter__scrollable {
+ overflow: auto;
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ overflow-y: scroll;
+}
+
.block-editor-inserter__popover .block-editor-block-types-list {
margin: 0 -8px;
}
@@ -109,7 +165,8 @@ $block-inserter-search-height: 38px;
}
.block-editor-inserter__manage-reusable-blocks {
- margin: $grid-unit-20 0 0 $grid-unit-20;
+ display: inline-block;
+ margin: $grid-unit-20;
}
.block-editor-inserter__no-results {
@@ -135,101 +192,73 @@ $block-inserter-search-height: 38px;
}
}
-.block-editor-inserter__menu-help-panel {
+.block-editor-inserter__preview-container {
display: none;
- border: $border-width solid $light-gray-secondary;
width: 300px;
- min-height: $block-inserter-preview-height;
- margin-right: 20px;
- padding: 20px;
background: $white;
+ border-radius: $radius-block-ui;
+ border: $border-width solid $light-gray-500;
+ position: absolute;
+ top: $grid-unit-20;
+ left: calc(100% + #{$grid-unit-20});
@include break-medium {
- position: absolute;
- top: 0;
- left: calc(100% + 20px);
- display: flex;
- flex-direction: column;
+ display: block;
}
.block-editor-block-card {
- padding-bottom: 20px;
- margin-bottom: 20px;
- border-bottom: $border-width solid $light-gray-500;
- @include edit-post__fade-in-animation();
- }
-
- .block-editor-inserter__preview {
- display: flex;
- flex-grow: 1;
- overflow-y: auto;
+ padding: $grid-unit-20;
}
-}
-
-.block-editor-inserter__menu-help-panel-no-block {
- display: flex;
- height: 100%;
- flex-direction: column;
- @include edit-post__fade-in-animation();
-
- .block-editor-inserter__menu-help-panel-no-block-text {
- flex-grow: 1;
- h4 {
- font-size: $big-font-size;
- }
- }
-
- .components-notice {
- margin: 0;
- }
-
- h4 {
- margin-top: 0;
+ .block-editor-block-card__title {
+ font-size: $default-font-size;
}
}
-.block-editor-inserter__menu-help-panel-hover-area {
- flex-grow: 1;
- margin-top: 20px;
- padding: 20px;
- border: 1px dotted $light-gray-500;
- display: flex;
- align-items: center;
- text-align: center;
-}
-
-.block-editor-inserter__menu-help-panel-title {
- font-size: $big-font-size;
- font-weight: 600;
- margin-bottom: 20px;
-}
-
.block-editor-inserter__preview-content {
- border: $border-width solid $light-gray-500;
- border-radius: $radius-round-rectangle;
- min-height: 150px;
+ min-height: $grid-unit-60 * 3;
+ background: $light-gray-200;
display: grid;
flex-grow: 1;
-
- .block-editor-block-preview__container {
- margin-right: 0;
- margin-left: 0;
- padding: 10px;
- }
+ align-items: center;
}
.block-editor-inserter__preview-content-missing {
flex: 1;
display: flex;
justify-content: center;
- color: $dark-gray-400;
- border: $border-width solid $light-gray-500;
- border-radius: $radius-round-rectangle;
align-items: center;
+ min-height: $grid-unit-60 * 3;
+ color: $dark-gray-400;
+ background: $light-gray-200;
}
.block-editor-inserter__tips {
+ border-top: $border-width solid $light-gray-500;
padding: $grid-unit-20;
flex-shrink: 0;
}
+
+.block-editor-inserter__patterns-item {
+ border-radius: $radius-block-ui;
+ cursor: pointer;
+ margin-top: $grid-unit-20;
+ transition: all 0.05s ease-in-out;
+ position: relative;
+ border: $border-width solid transparent;
+
+ &:hover {
+ border: $border-width solid $theme-color;
+ }
+
+ &:focus {
+ box-shadow: inset 0 0 0 1px $white, 0 0 0 $border-width-focus $theme-color;
+
+ // Windows High Contrast mode will show this outline, but not the box-shadow.
+ outline: 2px solid transparent;
+ }
+
+ &.is-placeholder {
+ min-height: 100px;
+ }
+}
diff --git a/packages/block-editor/src/components/inserter/test/menu.js b/packages/block-editor/src/components/inserter/test/block-list.js
similarity index 50%
rename from packages/block-editor/src/components/inserter/test/menu.js
rename to packages/block-editor/src/components/inserter/test/block-list.js
index 70881f2f30ce3a..65b70a70902100 100644
--- a/packages/block-editor/src/components/inserter/test/menu.js
+++ b/packages/block-editor/src/components/inserter/test/block-list.js
@@ -1,30 +1,37 @@
/**
* External dependencies
*/
-import { noop } from 'lodash';
-import TestUtils from 'react-dom/test-utils';
+import TestUtils, { act } from 'react-dom/test-utils';
import ReactDOM from 'react-dom';
/**
* Internal dependencies
*/
+import InserterBlockList from '../block-list';
+import useSelect from '../../../../../data/src/components/use-select';
import items, { categories, collections } from './fixtures';
-import { InserterMenu } from '../menu';
-
-const DEFAULT_PROPS = {
- position: 'top center',
- categories,
- collections,
- items,
- debouncedSpeak: noop,
- fetchReusableBlocks: noop,
- setTimeout: noop,
-};
+
+jest.mock( '../../../../../data/src/components/use-select', () => {
+ // This allows us to tweaak the returned value on each test
+ const mock = jest.fn();
+ return mock;
+} );
+
+jest.mock( '../../../../../data/src/components/use-dispatch', () => {
+ return {
+ useDispatch: () => ( {} ),
+ };
+} );
const getWrapperForProps = ( propOverrides ) => {
- return TestUtils.renderIntoDocument(
-
- );
+ let wrapper;
+ act( () => {
+ wrapper = TestUtils.renderIntoDocument(
+
+ );
+ } );
+
+ return wrapper;
};
const initializeMenuDefaultStateAndReturnElement = ( propOverrides ) => {
@@ -58,45 +65,23 @@ const assertNoResultsMessageNotToBePresent = ( element ) => {
expect( noResultsMessage ).toBe( null );
};
-const assertOpenedPanels = ( element, expectedOpen = 0 ) => {
- expect(
- element.querySelectorAll( '.components-panel__body.is-opened ' )
- ).toHaveLength( expectedOpen );
-};
-
-const getTabButtonWithContent = ( element, content ) => {
- let foundButton;
- const buttons = element.querySelectorAll( '.components-button' );
- buttons.forEach( ( button ) => {
- if ( button.textContent === content ) {
- foundButton = button;
- }
- } );
- return foundButton;
-};
-
-const performSearchWithText = ( element, searchText ) => {
- const searchElement = element.querySelector(
- '.block-editor-inserter__search'
- );
- TestUtils.Simulate.change( searchElement, {
- target: { value: searchText },
- } );
-};
-
describe( 'InserterMenu', () => {
- it( 'should show the suggested tab by default', () => {
- const element = initializeMenuDefaultStateAndReturnElement();
- const activeCategory = element.querySelector(
- '.components-panel__body.is-opened > .components-panel__body-title'
- );
- expect( activeCategory.textContent ).toBe( 'Most used' );
+ beforeEach( () => {
+ useSelect.mockImplementation( () => ( {
+ categories,
+ collections,
+ items,
+ } ) );
} );
it( 'should show nothing if there are no items', () => {
- const element = initializeMenuDefaultStateAndReturnElement( {
- items: [],
- } );
+ const noItems = [];
+ useSelect.mockImplementation( () => ( {
+ categories,
+ collections,
+ items: noItems,
+ } ) );
+ const element = initializeMenuDefaultStateAndReturnElement();
const visibleBlocks = element.querySelector(
'.block-editor-block-types-list__item'
);
@@ -108,7 +93,10 @@ describe( 'InserterMenu', () => {
it( 'should show only high utility items in the suggested tab', () => {
const element = initializeMenuDefaultStateAndReturnElement();
- const visibleBlocks = element.querySelectorAll(
+ const firstPanel = element.querySelector(
+ '.block-editor-inserter__panel-content'
+ );
+ const visibleBlocks = firstPanel.querySelectorAll(
'.block-editor-block-types-list__item-title'
);
expect( visibleBlocks ).toHaveLength( 3 );
@@ -117,83 +105,72 @@ describe( 'InserterMenu', () => {
expect( visibleBlocks[ 2 ].textContent ).toEqual( 'Some Other Block' );
} );
- it( 'should limit the number of items shown in the suggested tab', () => {
- const element = initializeMenuDefaultStateAndReturnElement( {
- maxSuggestedItems: 2,
- } );
- const visibleBlocks = element.querySelectorAll(
- '.block-editor-block-types-list__list-item'
- );
- expect( visibleBlocks ).toHaveLength( 2 );
- } );
-
it( 'should show items from the embed category in the embed tab', () => {
const element = initializeAllClosedMenuStateAndReturnElement();
- const embedTab = getTabButtonWithContent( element, 'Embeds' );
-
- TestUtils.Simulate.click( embedTab );
-
- assertOpenedPanels( element, 1 );
-
- const visibleBlocks = element.querySelectorAll(
+ const embedTabContent = element.querySelectorAll(
+ '.block-editor-inserter__panel-content'
+ )[ 4 ];
+ const embedTabTitle = element.querySelectorAll(
+ '.block-editor-inserter__panel-title'
+ )[ 4 ];
+ const blocks = embedTabContent.querySelectorAll(
'.block-editor-block-types-list__item-title'
);
- expect( visibleBlocks ).toHaveLength( 2 );
- expect( visibleBlocks[ 0 ].textContent ).toBe( 'YouTube' );
- expect( visibleBlocks[ 1 ].textContent ).toBe( 'A Text Embed' );
+ expect( embedTabTitle.textContent ).toBe( 'Embeds' );
+ expect( blocks ).toHaveLength( 2 );
+ expect( blocks[ 0 ].textContent ).toBe( 'YouTube' );
+ expect( blocks[ 1 ].textContent ).toBe( 'A Text Embed' );
assertNoResultsMessageNotToBePresent( element );
} );
it( 'should show reusable items in the reusable tab', () => {
const element = initializeAllClosedMenuStateAndReturnElement();
- const reusableTab = getTabButtonWithContent( element, 'Reusable' );
-
- TestUtils.Simulate.click( reusableTab );
-
- assertOpenedPanels( element, 1 );
-
- const visibleBlocks = element.querySelectorAll(
+ const reusableTabContent = element.querySelectorAll(
+ '.block-editor-inserter__panel-content'
+ )[ 6 ];
+ const reusableTabTitle = element.querySelectorAll(
+ '.block-editor-inserter__panel-title'
+ )[ 6 ];
+ const blocks = reusableTabContent.querySelectorAll(
'.block-editor-block-types-list__item-title'
);
- expect( visibleBlocks ).toHaveLength( 1 );
- expect( visibleBlocks[ 0 ].textContent ).toBe( 'My reusable block' );
+ expect( reusableTabTitle.textContent ).toBe( 'Reusable' );
+ expect( blocks ).toHaveLength( 1 );
+ expect( blocks[ 0 ].textContent ).toBe( 'My reusable block' );
assertNoResultsMessageNotToBePresent( element );
} );
it( 'should show the common category blocks', () => {
const element = initializeAllClosedMenuStateAndReturnElement();
- const commonBlocksTab = getTabButtonWithContent(
- element,
- 'Common blocks'
- );
-
- TestUtils.Simulate.click( commonBlocksTab );
-
- assertOpenedPanels( element, 1 );
-
- const visibleBlocks = element.querySelectorAll(
+ const commonTabContent = element.querySelectorAll(
+ '.block-editor-inserter__panel-content'
+ )[ 1 ];
+ const commonTabTitle = element.querySelectorAll(
+ '.block-editor-inserter__panel-title'
+ )[ 1 ];
+ const blocks = commonTabContent.querySelectorAll(
'.block-editor-block-types-list__item-title'
);
- expect( visibleBlocks ).toHaveLength( 3 );
- expect( visibleBlocks[ 0 ].textContent ).toBe( 'Text' );
- expect( visibleBlocks[ 1 ].textContent ).toBe( 'Advanced Text' );
- expect( visibleBlocks[ 2 ].textContent ).toBe( 'Some Other Block' );
+ expect( commonTabTitle.textContent ).toBe( 'Common blocks' );
+ expect( blocks ).toHaveLength( 3 );
+ expect( blocks[ 0 ].textContent ).toBe( 'Text' );
+ expect( blocks[ 1 ].textContent ).toBe( 'Advanced Text' );
+ expect( blocks[ 2 ].textContent ).toBe( 'Some Other Block' );
assertNoResultsMessageNotToBePresent( element );
} );
it( 'should disable items with `isDisabled`', () => {
- const element = initializeMenuDefaultStateAndReturnElement();
- const layoutTab = getTabButtonWithContent( element, 'Layout elements' );
-
- TestUtils.Simulate.click( layoutTab );
-
- const disabledBlocks = element.querySelectorAll(
+ const element = initializeAllClosedMenuStateAndReturnElement();
+ const layoutTabContent = element.querySelectorAll(
+ '.block-editor-inserter__panel-content'
+ )[ 2 ];
+ const disabledBlocks = layoutTabContent.querySelectorAll(
'.block-editor-block-types-list__item[disabled], .block-editor-block-types-list__item[aria-disabled="true"]'
);
@@ -202,53 +179,51 @@ describe( 'InserterMenu', () => {
} );
it( 'should allow searching for items', () => {
- const element = initializeMenuDefaultStateAndReturnElement();
- performSearchWithText( element, 'text' );
-
- assertOpenedPanels( element, 3 );
+ const element = initializeMenuDefaultStateAndReturnElement( {
+ filterValue: 'text',
+ } );
const matchingCategories = element.querySelectorAll(
- '.components-panel__body-toggle'
+ '.block-editor-inserter__panel-title'
);
expect( matchingCategories ).toHaveLength( 3 );
expect( matchingCategories[ 0 ].textContent ).toBe( 'Common blocks' );
expect( matchingCategories[ 1 ].textContent ).toBe( 'Embeds' );
- const visibleBlocks = element.querySelectorAll(
+ const blocks = element.querySelectorAll(
'.block-editor-block-types-list__item-title'
);
- expect( visibleBlocks ).toHaveLength( 5 );
- expect( visibleBlocks[ 0 ].textContent ).toBe( 'Text' );
- expect( visibleBlocks[ 1 ].textContent ).toBe( 'Advanced Text' );
- expect( visibleBlocks[ 2 ].textContent ).toBe( 'A Text Embed' );
+ expect( blocks ).toHaveLength( 5 );
+ expect( blocks[ 0 ].textContent ).toBe( 'Text' );
+ expect( blocks[ 1 ].textContent ).toBe( 'Advanced Text' );
+ expect( blocks[ 2 ].textContent ).toBe( 'A Text Embed' );
assertNoResultsMessageNotToBePresent( element );
} );
it( 'should trim whitespace of search terms', () => {
- const element = initializeMenuDefaultStateAndReturnElement();
- performSearchWithText( element, ' text' );
-
- assertOpenedPanels( element, 3 );
+ const element = initializeMenuDefaultStateAndReturnElement( {
+ filterValue: ' text',
+ } );
const matchingCategories = element.querySelectorAll(
- '.components-panel__body-toggle'
+ '.block-editor-inserter__panel-title'
);
expect( matchingCategories ).toHaveLength( 3 );
expect( matchingCategories[ 0 ].textContent ).toBe( 'Common blocks' );
expect( matchingCategories[ 1 ].textContent ).toBe( 'Embeds' );
- const visibleBlocks = element.querySelectorAll(
+ const blocks = element.querySelectorAll(
'.block-editor-block-types-list__item-title'
);
- expect( visibleBlocks ).toHaveLength( 5 );
- expect( visibleBlocks[ 0 ].textContent ).toBe( 'Text' );
- expect( visibleBlocks[ 1 ].textContent ).toBe( 'Advanced Text' );
- expect( visibleBlocks[ 2 ].textContent ).toBe( 'A Text Embed' );
+ expect( blocks ).toHaveLength( 5 );
+ expect( blocks[ 0 ].textContent ).toBe( 'Text' );
+ expect( blocks[ 1 ].textContent ).toBe( 'Advanced Text' );
+ expect( blocks[ 2 ].textContent ).toBe( 'A Text Embed' );
assertNoResultsMessageNotToBePresent( element );
} );
diff --git a/packages/block-editor/src/components/inserter/tips.js b/packages/block-editor/src/components/inserter/tips.js
index 255275c296ce24..d5d47b03dc24c9 100644
--- a/packages/block-editor/src/components/inserter/tips.js
+++ b/packages/block-editor/src/components/inserter/tips.js
@@ -2,28 +2,25 @@
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
-import {
- __experimentalCreateInterpolateElement,
- useState,
-} from '@wordpress/element';
+import { createInterpolateElement, useState } from '@wordpress/element';
import { Tip } from '@wordpress/components';
const globalTips = [
- __experimentalCreateInterpolateElement(
+ createInterpolateElement(
__(
'While writing, you can press / to quickly insert new blocks.'
),
{ kbd: }
),
- __experimentalCreateInterpolateElement(
+ createInterpolateElement(
__(
'Indent a list by pressing space at the beginning of a line.'
),
{ kbd: }
),
- __experimentalCreateInterpolateElement(
+ createInterpolateElement(
__(
- 'Outdent a list by pressing backspace at the beginning of a line'
+ 'Outdent a list by pressing backspace at the beginning of a line.'
),
{ kbd: }
),
diff --git a/packages/block-editor/src/components/inserter/use-async-list.js b/packages/block-editor/src/components/inserter/use-async-list.js
new file mode 100644
index 00000000000000..ab546f08b2c896
--- /dev/null
+++ b/packages/block-editor/src/components/inserter/use-async-list.js
@@ -0,0 +1,40 @@
+/**
+ * WordPress dependencies
+ */
+import { useEffect, useReducer } from '@wordpress/element';
+import { createQueue } from '@wordpress/priority-queue';
+
+function listReducer( state, action ) {
+ if ( action.type === 'reset' && state.length !== 0 ) {
+ return [];
+ }
+
+ if ( action.type === 'append' ) {
+ return [ ...state, action.item ];
+ }
+
+ return state;
+}
+
+function useAsyncList( list ) {
+ const [ current, dispatch ] = useReducer( listReducer, [] );
+
+ useEffect( () => {
+ dispatch( { type: 'reset' } );
+ const asyncQueue = createQueue();
+ const append = ( index = 0 ) => () => {
+ if ( list.length <= index ) {
+ return;
+ }
+ dispatch( { type: 'append', item: list[ index ] } );
+ asyncQueue.add( {}, append( index + 1 ) );
+ };
+ asyncQueue.add( {}, append( 0 ) );
+
+ return () => asyncQueue.reset();
+ }, [ list ] );
+
+ return current;
+}
+
+export default useAsyncList;
diff --git a/packages/block-editor/src/components/line-height-control/index.js b/packages/block-editor/src/components/line-height-control/index.js
new file mode 100644
index 00000000000000..cb0f8ebed1f876
--- /dev/null
+++ b/packages/block-editor/src/components/line-height-control/index.js
@@ -0,0 +1,88 @@
+/**
+ * WordPress dependencies
+ */
+import { __ } from '@wordpress/i18n';
+import { TextControl } from '@wordpress/components';
+import { ZERO } from '@wordpress/keycodes';
+
+/**
+ * Internal dependencies
+ */
+import {
+ BASE_DEFAULT_VALUE,
+ RESET_VALUE,
+ STEP,
+ useIsLineHeightControlsDisabled,
+ isLineHeightDefined,
+} from './utils';
+
+export default function LineHeightControl( { value: lineHeight, onChange } ) {
+ // Don't render the controls if disabled by editor settings
+ const isDisabled = useIsLineHeightControlsDisabled();
+ if ( isDisabled ) {
+ return null;
+ }
+
+ const isDefined = isLineHeightDefined( lineHeight );
+
+ const handleOnKeyDown = ( event ) => {
+ const { keyCode } = event;
+
+ if ( keyCode === ZERO && ! isDefined ) {
+ /**
+ * Prevents the onChange callback from firing, which prevents
+ * the logic from assuming the change was triggered from
+ * an input arrow CLICK.
+ */
+ event.preventDefault();
+ onChange( '0' );
+ }
+ };
+
+ const handleOnChange = ( nextValue ) => {
+ // Set the next value without modification if lineHeight has been defined
+ if ( isDefined ) {
+ onChange( nextValue );
+ return;
+ }
+
+ // Otherwise...
+ /**
+ * The following logic handles the initial up/down arrow CLICK of the
+ * input element. This is so that the next values (from an undefined value state)
+ * are more better suited for line-height rendering.
+ */
+ let adjustedNextValue = nextValue;
+
+ switch ( nextValue ) {
+ case `${ STEP }`:
+ // Increment by step value
+ adjustedNextValue = BASE_DEFAULT_VALUE + STEP;
+ break;
+ case '0':
+ // Decrement by step value
+ adjustedNextValue = BASE_DEFAULT_VALUE - STEP;
+ break;
+ }
+
+ onChange( adjustedNextValue );
+ };
+
+ const value = isDefined ? lineHeight : RESET_VALUE;
+
+ return (
+
+
+
+ );
+}
diff --git a/packages/block-editor/src/components/line-height-control/style.scss b/packages/block-editor/src/components/line-height-control/style.scss
new file mode 100644
index 00000000000000..ad98d76e4a2ed1
--- /dev/null
+++ b/packages/block-editor/src/components/line-height-control/style.scss
@@ -0,0 +1,8 @@
+.block-editor-line-height-control {
+ margin-bottom: 24px;
+
+ input {
+ display: block;
+ max-width: 60px;
+ }
+}
diff --git a/packages/block-editor/src/components/line-height-control/utils.js b/packages/block-editor/src/components/line-height-control/utils.js
new file mode 100644
index 00000000000000..351a35a66a6a0a
--- /dev/null
+++ b/packages/block-editor/src/components/line-height-control/utils.js
@@ -0,0 +1,44 @@
+/**
+ * WordPress dependencies
+ */
+import { useSelect } from '@wordpress/data';
+
+export const BASE_DEFAULT_VALUE = 1.5;
+export const STEP = 0.1;
+/**
+ * There are varying value types within LineHeightControl:
+ *
+ * {undefined} Initial value. No changes from the user.
+ * {string} Input value. Value consumed/outputted by the input. Empty would be ''.
+ * {number} Block attribute type. Input value needs to be converted for attribute setting.
+ *
+ * Note: If the value is undefined, the input requires it to be an empty string ('')
+ * in order to be considered "controlled" by props (rather than internal state).
+ */
+export const RESET_VALUE = '';
+
+/**
+ * Retrieves whether custom lineHeight controls should be disabled from editor settings.
+ *
+ * @return {boolean} Whether lineHeight controls should be disabled.
+ */
+export function useIsLineHeightControlsDisabled() {
+ const isDisabled = useSelect( ( select ) => {
+ const { getSettings } = select( 'core/block-editor' );
+
+ return !! getSettings().__experimentalDisableCustomLineHeight;
+ }, [] );
+
+ return isDisabled;
+}
+
+/**
+ * Determines if the lineHeight attribute has been properly defined.
+ *
+ * @param {any} lineHeight The value to check.
+ *
+ * @return {boolean} Whether the lineHeight attribute is valid.
+ */
+export function isLineHeightDefined( lineHeight ) {
+ return lineHeight !== undefined && lineHeight !== RESET_VALUE;
+}
diff --git a/packages/block-editor/src/components/link-control/README.md b/packages/block-editor/src/components/link-control/README.md
index aeee36017a3f18..f05d9773f24f86 100644
--- a/packages/block-editor/src/components/link-control/README.md
+++ b/packages/block-editor/src/components/link-control/README.md
@@ -92,6 +92,14 @@ Value change handler, called with the updated value if the user selects a new li
/>
```
+### showSuggestions
+
+- Type: `boolean`
+- Required: No
+- Default: `true`
+
+Whether to present suggestions when typing the URL.
+
### showInitialSuggestions
- Type: `boolean`
diff --git a/packages/block-editor/src/components/link-control/index.js b/packages/block-editor/src/components/link-control/index.js
index 1a47f3283550f8..2e7234f7809e31 100644
--- a/packages/block-editor/src/components/link-control/index.js
+++ b/packages/block-editor/src/components/link-control/index.js
@@ -90,11 +90,13 @@ const makeCancelable = ( promise ) => {
* providing a custom `settings` prop.
*/
+/* eslint-disable jsdoc/valid-types */
/**
* Custom settings values associated with a link.
*
* @typedef {{[setting:string]:any}} WPLinkControlSettingsValue
*/
+/* eslint-enable */
/**
* Custom settings values associated with a link.
@@ -105,12 +107,14 @@ const makeCancelable = ( promise ) => {
* @property {string} title Human-readable label to show in user interface.
*/
+/* eslint-disable jsdoc/valid-types */
/**
* Properties associated with a link control value, composed as a union of the
* default properties and any custom settings values.
*
* @typedef {WPLinkControlDefaultValue&WPLinkControlSettingsValue} WPLinkControlValue
*/
+/* eslint-enable */
/** @typedef {(nextValue:WPLinkControlValue)=>void} WPLinkControlOnChangeProp */
@@ -139,6 +143,7 @@ const makeCancelable = ( promise ) => {
* @property {WPLinkControlValue=} value Current link value.
* @property {WPLinkControlOnChangeProp=} onChange Value change handler, called with the updated value if
* the user selects a new link or updates settings.
+ * @property {boolean=} showSuggestions Whether to present suggestions when typing the URL.
* @property {boolean=} showInitialSuggestions Whether to present initial suggestions immediately.
* @property {WPLinkControlCreateSuggestionProp=} createSuggestion Handler to manage creation of link value from suggestion.
*/
@@ -154,6 +159,7 @@ function LinkControl( {
value,
settings,
onChange = noop,
+ showSuggestions = true,
showInitialSuggestions,
forceIsEditingLink,
createSuggestion,
@@ -345,6 +351,10 @@ function LinkControl( {
// Effects
const getSearchHandler = useCallback(
( val, args ) => {
+ if ( ! showSuggestions ) {
+ return Promise.resolve( [] );
+ }
+
return isURLLike( val )
? handleDirectEntry( val, args )
: handleEntitySearch( val, args );
@@ -434,7 +444,11 @@ function LinkControl( {
const searchResultsLabelId = `block-editor-link-control-search-results-label-${ instanceId }`;
const labelText = isInitialSuggestions
? __( 'Recently updated' )
- : sprintf( __( 'Search results for "%s"' ), inputValue );
+ : sprintf(
+ /* translators: %s: search term. */
+ __( 'Search results for "%s"' ),
+ inputValue
+ );
// VisuallyHidden rightly doesn't accept custom classNames
// so we conditionally render it as a wrapper to visually hide the label
@@ -544,7 +558,9 @@ function LinkControl( {
stopEditing();
}
} }
- renderSuggestions={ renderSearchResults }
+ renderSuggestions={
+ showSuggestions ? renderSearchResults : null
+ }
fetchSuggestions={ getSearchHandler }
showInitialSuggestions={ showInitialSuggestions }
errorMessage={ errorMessage }
diff --git a/packages/block-editor/src/components/link-control/search-create-button.js b/packages/block-editor/src/components/link-control/search-create-button.js
index 0b9f48394107ce..5f9cb9406eed9e 100644
--- a/packages/block-editor/src/components/link-control/search-create-button.js
+++ b/packages/block-editor/src/components/link-control/search-create-button.js
@@ -8,7 +8,7 @@ import classnames from 'classnames';
*/
import { __, sprintf } from '@wordpress/i18n';
import { Button, Icon } from '@wordpress/components';
-import { __experimentalCreateInterpolateElement } from '@wordpress/element';
+import { createInterpolateElement } from '@wordpress/element';
export const LinkControlSearchCreate = ( {
searchTerm,
@@ -38,8 +38,9 @@ export const LinkControlSearchCreate = ( {
- { __experimentalCreateInterpolateElement(
+ { createInterpolateElement(
sprintf(
+ /* translators: %s: search term. */
__( 'New page: %s ' ),
searchTerm
),
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 34f230a1d14ca9..cdba15d6d4f7b9 100644
--- a/packages/block-editor/src/components/link-control/settings-drawer.js
+++ b/packages/block-editor/src/components/link-control/settings-drawer.js
@@ -7,7 +7,7 @@ import { noop } from 'lodash';
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
-import { ToggleControl } from '@wordpress/components';
+import { ToggleControl, VisuallyHidden } from '@wordpress/components';
const defaultSettings = [
{
@@ -44,9 +44,9 @@ const LinkControlSettingsDrawer = ( {
return (
-
+
{ __( 'Currently selected link settings' ) }
-
+
{ theSettings }
);
diff --git a/packages/block-editor/src/components/link-control/style.scss b/packages/block-editor/src/components/link-control/style.scss
index 320bfcfd6a3371..6759385d0fe387 100644
--- a/packages/block-editor/src/components/link-control/style.scss
+++ b/packages/block-editor/src/components/link-control/style.scss
@@ -41,6 +41,10 @@ $block-editor-link-control-number-of-actions: 1;
@include input-style__focus();
}
}
+
+ .components-base-control__field {
+ margin-bottom: 0;
+ }
}
.block-editor-link-control__search-error {
@@ -103,7 +107,7 @@ $block-editor-link-control-number-of-actions: 1;
.block-editor-link-control__search-results {
margin: 0;
- padding: $grid-unit-20/2 $grid-unit-20 $grid-unit-20;
+ padding: $grid-unit-20/2 $grid-unit-20 $grid-unit-20/2;
max-height: 200px;
overflow-y: auto; // allow results list to scroll
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 faa5202cd23a8a..857f93071f8b04 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`] = `"Currently selected link settings "`;
+exports[`Basic rendering should render 1`] = `"Currently selected link settings "`;
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 e244cb495c4d7a..759e1b47a43bb5 100644
--- a/packages/block-editor/src/components/link-control/test/index.js
+++ b/packages/block-editor/src/components/link-control/test/index.js
@@ -240,6 +240,55 @@ describe( 'Searching for a link', () => {
);
} );
+ it( 'should trim search term', async () => {
+ const searchTerm = ' Hello ';
+
+ 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();
+
+ const searchResultTextHighlightElements = Array.from(
+ container.querySelectorAll(
+ '[role="listbox"] button[role="option"] mark'
+ )
+ );
+
+ const invalidResults = searchResultTextHighlightElements.find(
+ ( mark ) => mark.innerHTML !== 'Hello'
+ );
+
+ // Grab the first argument that was passed to the fetchSuggestions
+ // handler (which is mocked out).
+ const mockFetchSuggestionsFirstArg =
+ mockFetchSearchSuggestions.mock.calls[ 0 ][ 0 ];
+
+ // Given we're mocking out the results we should always have 4 mark elements.
+ expect( searchResultTextHighlightElements ).toHaveLength( 4 );
+
+ // Make sure there are no `mark` elements which contain anything other
+ // than the trimmed search term (ie: no whitespace).
+ expect( invalidResults ).toBeFalsy();
+
+ // Implementation detail test to ensure that the fetch handler is called
+ // with the trimmed search value. We do this because we are mocking out
+ // the fetch handler in our test so we need to assert it would be called
+ // correctly in a real world scenario.
+ expect( mockFetchSuggestionsFirstArg ).toEqual( 'Hello' );
+ } );
+
it.each( [
[ 'couldbeurlorentitysearchterm' ],
[ 'ThisCouldAlsoBeAValidURL' ],
diff --git a/packages/block-editor/src/components/media-replace-flow/index.js b/packages/block-editor/src/components/media-replace-flow/index.js
index 32aa43e910f2bf..ed72ad8a5f25f2 100644
--- a/packages/block-editor/src/components/media-replace-flow/index.js
+++ b/packages/block-editor/src/components/media-replace-flow/index.js
@@ -1,7 +1,12 @@
+/**
+ * External dependencies
+ */
+import { uniqueId } from 'lodash';
+
/**
* WordPress dependencies
*/
-import { useState, createRef } from '@wordpress/element';
+import { useState, createRef, renderToString } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import { speak } from '@wordpress/a11y';
import {
@@ -11,20 +16,18 @@ import {
ToolbarGroup,
Button,
Dropdown,
- withNotices,
} from '@wordpress/components';
-import { LEFT, RIGHT, UP, DOWN, BACKSPACE, ENTER } from '@wordpress/keycodes';
-import { useSelect } from '@wordpress/data';
+import { withDispatch, useSelect } from '@wordpress/data';
+import { DOWN } from '@wordpress/keycodes';
import { compose } from '@wordpress/compose';
-import { link, upload, media as mediaIcon } from '@wordpress/icons';
+import { upload, media as mediaIcon } from '@wordpress/icons';
/**
* Internal dependencies
*/
import MediaUpload from '../media-upload';
import MediaUploadCheck from '../media-upload/check';
-import LinkEditor from '../url-popover/link-editor';
-import LinkViewer from '../url-popover/link-viewer';
+import LinkControl from '../link-control';
const MediaReplaceFlow = ( {
mediaURL,
@@ -33,48 +36,58 @@ const MediaReplaceFlow = ( {
accept,
onSelect,
onSelectURL,
- onError,
name = __( 'Replace' ),
+ createNotice,
+ removeNotice,
} ) => {
- const [ showURLInput, setShowURLInput ] = useState( false );
- const [ showEditURLInput, setShowEditURLInput ] = useState( false );
const [ mediaURLValue, setMediaURLValue ] = useState( mediaURL );
const mediaUpload = useSelect( ( select ) => {
return select( 'core/block-editor' ).getSettings().mediaUpload;
}, [] );
const editMediaButtonRef = createRef();
+ const errorNoticeID = uniqueId(
+ 'block-editor/media-replace-flow/error-notice/'
+ );
- const stopPropagation = ( event ) => {
- event.stopPropagation();
- };
-
- const stopPropagationRelevantKeys = ( event ) => {
- if (
- [ LEFT, DOWN, RIGHT, UP, BACKSPACE, ENTER ].indexOf(
- event.keyCode
- ) > -1
- ) {
- // Stop the key event from propagating up to ObserveTyping.startTypingInTextField.
- event.stopPropagation();
- }
+ const onError = ( message ) => {
+ const errorElement = document.createElement( 'div' );
+ errorElement.innerHTML = renderToString( message );
+ // The default error contains some HTML that,
+ // for example, makes the filename bold.
+ // The notice, by default, accepts strings only and so
+ // we need to remove the html from the error.
+ const renderMsg =
+ errorElement.textContent || errorElement.innerText || '';
+ // We need to set a timeout for showing the notice
+ // so that VoiceOver and possibly other screen readers
+ // can announce the error afer the toolbar button
+ // regains focus once the upload dialog closes.
+ // Otherwise VO simply skips over the notice and announces
+ // the focused element and the open menu.
+ setTimeout( () => {
+ createNotice( 'error', renderMsg, {
+ speak: true,
+ id: errorNoticeID,
+ isDismissible: true,
+ } );
+ }, 1000 );
};
const selectMedia = ( media ) => {
onSelect( media );
setMediaURLValue( media.url );
speak( __( 'The media file has been replaced' ) );
+ removeNotice( errorNoticeID );
};
const selectURL = ( newURL ) => {
onSelectURL( newURL );
- setShowEditURLInput( false );
};
- const uploadFiles = ( event, closeDropdown ) => {
+ const uploadFiles = ( event ) => {
const files = event.target.files;
const setMedia = ( [ media ] ) => {
selectMedia( media );
- closeDropdown();
};
mediaUpload( {
allowedTypes,
@@ -92,36 +105,6 @@ const MediaReplaceFlow = ( {
}
};
- let urlInputUIContent;
- if ( showEditURLInput ) {
- urlInputUIContent = (
- setMediaURLValue( url ) }
- onSubmit={ ( event ) => {
- event.preventDefault();
- selectURL( mediaURLValue );
- editMediaButtonRef.current.focus();
- } }
- />
- );
- } else {
- urlInputUIContent = (
-
- setShowEditURLInput( ! showEditURLInput )
- }
- />
- );
- }
-
return (
- { onSelectURL && (
-
- setShowURLInput( ! showURLInput )
- }
- aria-expanded={ showURLInput }
- >
- { __( 'Insert from URL' ) }
-
- ) }
- { showURLInput && (
-
- { urlInputUIContent }
-
+ { onSelectURL && (
+ // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
+
) }
>
) }
@@ -193,4 +186,12 @@ const MediaReplaceFlow = ( {
);
};
-export default compose( withNotices )( MediaReplaceFlow );
+export default compose( [
+ withDispatch( ( dispatch ) => {
+ const { createNotice, removeNotice } = dispatch( 'core/notices' );
+ return {
+ createNotice,
+ removeNotice,
+ };
+ } ),
+] )( MediaReplaceFlow );
diff --git a/packages/block-editor/src/components/media-replace-flow/style.scss b/packages/block-editor/src/components/media-replace-flow/style.scss
index 38ac4d82cbd1dd..bde255a1842141 100644
--- a/packages/block-editor/src/components/media-replace-flow/style.scss
+++ b/packages/block-editor/src/components/media-replace-flow/style.scss
@@ -5,25 +5,66 @@
display: none;
}
-.block-editor-media-flow__url-input {
- padding: 0 15px;
- max-width: 255px;
- padding-bottom: 10px;
+// Forcing some space above the list of options in
+// the dropdown to visually balance them.
+.block-editor-media-replace-flow__options .components-popover__content {
+ padding-top: $grid-unit-20;
+}
- input {
- max-width: 180px;
- }
+.block-editor-media-replace-flow__indicator {
+ margin-left: 4px;
}
-.block-editor-media-replace-flow__link-viewer {
- // Overflow is not working properly if we show the icon.
- .components-external-link__icon {
- display: none;
+.block-editor-media-flow__url-input {
+ margin-top: $grid-unit-20;
+
+ .block-editor-media-replace-flow__image-url-label {
+ top: $grid-unit-20;
}
- .components-visually-hidden {
- position: initial;
+
+ .block-editor-link-control {
+ margin-top: -16px;
+ width: auto;
+
+ .components-base-control .components-base-control__field {
+ margin-bottom: 0;
+ }
+
+ .block-editor-link-control__search-item-title {
+ max-width: 180px;
+ margin-top: $grid-unit-20;
+ }
+
+ .block-editor-link-control__search-item.is-current {
+ width: auto;
+ padding: 0;
+ }
+
+ .block-editor-link-control__search-input.block-editor-link-control__search-input input[type="text"] {
+ margin: 16px 0 0 0;
+ width: 100%;
+ }
+
+ .block-editor-link-control__search-actions {
+ right: 4px;
+ }
}
- .components-button {
- flex-shrink: 0;
+}
+
+.block-editor-media-flow__error {
+ padding: 0 20px 20px 20px;
+ max-width: 255px;
+
+ .components-with-notices-ui {
+ max-width: 255px;
+
+ .components-notice__content {
+ overflow: hidden;
+ word-wrap: break-word;
+ }
+ .components-notice__dismiss {
+ position: absolute;
+ right: 10px;
+ }
}
}
diff --git a/packages/block-editor/src/components/media-upload-progress/index.native.js b/packages/block-editor/src/components/media-upload-progress/index.native.js
index 63f53c97a1d3a3..0692077c8595e3 100644
--- a/packages/block-editor/src/components/media-upload-progress/index.native.js
+++ b/packages/block-editor/src/components/media-upload-progress/index.native.js
@@ -121,6 +121,7 @@ export class MediaUploadProgress extends React.Component {
const { isUploadInProgress, isUploadFailed } = this.state;
const showSpinner = this.state.isUploadInProgress;
const progress = this.state.progress * 100;
+ // eslint-disable-next-line @wordpress/i18n-no-collapsible-whitespace
const retryMessage = __(
'Failed to insert media.\nPlease tap for options.'
);
diff --git a/packages/block-editor/src/components/media-upload-progress/styles.native.scss b/packages/block-editor/src/components/media-upload-progress/styles.native.scss
index 9924af03a33c42..22355ccc1ad02b 100644
--- a/packages/block-editor/src/components/media-upload-progress/styles.native.scss
+++ b/packages/block-editor/src/components/media-upload-progress/styles.native.scss
@@ -4,4 +4,5 @@
.progressBar {
background-color: $gray-lighten-30;
+ z-index: 1;
}
diff --git a/packages/block-editor/src/components/media-upload/index.native.js b/packages/block-editor/src/components/media-upload/index.native.js
index b9543141b175b1..a2cc12e6028f7b 100644
--- a/packages/block-editor/src/components/media-upload/index.native.js
+++ b/packages/block-editor/src/components/media-upload/index.native.js
@@ -13,7 +13,7 @@ import {
*/
import { __ } from '@wordpress/i18n';
import { Picker } from '@wordpress/components';
-import { camera, wordpress } from '@wordpress/icons';
+import { capturePhoto, captureVideo, image, wordpress } from '@wordpress/icons';
export const MEDIA_TYPE_IMAGE = 'image';
export const MEDIA_TYPE_VIDEO = 'video';
@@ -27,7 +27,7 @@ const cameraImageSource = {
value: mediaSources.deviceCamera + '-IMAGE', // This is needed to diferenciate image-camera from video-camera sources.
label: __( 'Take a Photo' ),
types: [ MEDIA_TYPE_IMAGE ],
- icon: camera,
+ icon: capturePhoto,
};
const cameraVideoSource = {
@@ -35,7 +35,7 @@ const cameraVideoSource = {
value: mediaSources.deviceCamera,
label: __( 'Take a Video' ),
types: [ MEDIA_TYPE_VIDEO ],
- icon: camera,
+ icon: captureVideo,
};
const deviceLibrarySource = {
@@ -43,6 +43,7 @@ const deviceLibrarySource = {
value: mediaSources.deviceLibrary,
label: __( 'Choose from device' ),
types: [ MEDIA_TYPE_IMAGE, MEDIA_TYPE_VIDEO ],
+ icon: image,
};
const siteLibrarySource = {
@@ -104,9 +105,9 @@ export class MediaUpload extends React.Component {
.filter( ( source ) => {
return __experimentalOnlyMediaLibrary
? source.mediaLibrary
- : allowedTypes.filter( ( allowedType ) =>
+ : allowedTypes.some( ( allowedType ) =>
source.types.includes( allowedType )
- ).length > 0;
+ );
} )
.map( ( source ) => {
return {
diff --git a/packages/block-editor/src/components/multi-select-scroll-into-view/index.js b/packages/block-editor/src/components/multi-select-scroll-into-view/index.js
index 3443ee44d2956c..025a2628bff180 100644
--- a/packages/block-editor/src/components/multi-select-scroll-into-view/index.js
+++ b/packages/block-editor/src/components/multi-select-scroll-into-view/index.js
@@ -21,19 +21,25 @@ import { getBlockDOMNode } from '../../utils/dom';
*/
export default function MultiSelectScrollIntoView() {
const selector = ( select ) => {
- const { getBlockSelectionEnd, isMultiSelecting } = select(
- 'core/block-editor'
- );
+ const {
+ getBlockSelectionEnd,
+ hasMultiSelection,
+ isMultiSelecting,
+ } = select( 'core/block-editor' );
return {
selectionEnd: getBlockSelectionEnd(),
+ isMultiSelection: hasMultiSelection(),
isMultiSelecting: isMultiSelecting(),
};
};
- const { selectionEnd, isMultiSelecting } = useSelect( selector, [] );
+ const { isMultiSelection, selectionEnd, isMultiSelecting } = useSelect(
+ selector,
+ []
+ );
useEffect( () => {
- if ( ! selectionEnd || isMultiSelecting ) {
+ if ( ! selectionEnd || isMultiSelecting || ! isMultiSelection ) {
return;
}
@@ -54,7 +60,7 @@ export default function MultiSelectScrollIntoView() {
scrollIntoView( extentNode, scrollContainer, {
onlyScrollIfNeeded: true,
} );
- }, [ selectionEnd, isMultiSelecting ] );
+ }, [ isMultiSelection, selectionEnd, isMultiSelecting ] );
return null;
}
diff --git a/packages/block-editor/src/components/multi-selection-inspector/index.js b/packages/block-editor/src/components/multi-selection-inspector/index.js
index d501e1247d71ac..3109834295d559 100644
--- a/packages/block-editor/src/components/multi-selection-inspector/index.js
+++ b/packages/block-editor/src/components/multi-selection-inspector/index.js
@@ -27,15 +27,18 @@ function MultiSelectionInspector( { blocks } ) {
/>
- { /* translators: %d: number of blocks */
- sprintf(
+ { sprintf(
+ /* translators: %d: number of blocks */
_n( '%d block', '%d blocks', blocks.length ),
blocks.length
) }
- { /* translators: %d: number of words */
- sprintf( _n( '%d word', '%d words', words ), words ) }
+ { sprintf(
+ /* translators: %d: number of words */
+ _n( '%d word', '%d words', words ),
+ words
+ ) }
diff --git a/packages/block-editor/src/components/observe-typing/index.js b/packages/block-editor/src/components/observe-typing/index.js
index a4f948c13c3575..6e50f1360672bc 100644
--- a/packages/block-editor/src/components/observe-typing/index.js
+++ b/packages/block-editor/src/components/observe-typing/index.js
@@ -43,6 +43,7 @@ function isKeyDownEligibleForStartTyping( event ) {
}
function ObserveTyping( { children, setTimeout: setSafeTimeout } ) {
+ const typingContainer = useRef();
const lastMouseMove = useRef();
const isTyping = useSelect( ( select ) =>
select( 'core/block-editor' ).isTyping()
@@ -130,11 +131,11 @@ function ObserveTyping( { children, setTimeout: setSafeTimeout } ) {
// Abort early if already typing, or key press is incurred outside a
// text field (e.g. arrow-ing through toolbar buttons).
- // Ignore typing in a block toolbar
+ // Ignore typing if outside the current DOM container
if (
isTyping ||
! isTextField( target ) ||
- target.closest( '.block-editor-block-toolbar' )
+ ! typingContainer.current.contains( target )
) {
return;
}
@@ -176,6 +177,7 @@ function ObserveTyping( { children, setTimeout: setSafeTimeout } ) {
/* eslint-disable jsx-a11y/no-static-element-interactions */
return (
{
- const butonStyles = getStylesFromColorScheme(
+const PickerButton = ( { icon, label, onPress } ) => {
+ const butonWrapperStyles = usePreferredColorSchemeStyle(
+ styles.buttonWrapper,
+ styles.buttonWrapperDark
+ );
+ const buttonStyles = usePreferredColorSchemeStyle(
styles.button,
styles.buttonDark
);
- const butonTextStyles = getStylesFromColorScheme(
+ const buttonTextStyles = usePreferredColorSchemeStyle(
styles.buttonText,
styles.buttonTextDark
);
@@ -30,12 +34,14 @@ const PickerButton = ( { icon, label, onPress, getStylesFromColorScheme } ) => {
accessibilityHint={ __( 'Double tap to select layout' ) }
activeOpacity={ 0.7 }
onPress={ onPress }
- style={ butonStyles }
+ style={ butonWrapperStyles }
>
-
{ icon }
-
{ label }
+
+ { icon }
+ { label }
+
);
};
-export default withPreferredColorScheme( PickerButton );
+export default PickerButton;
diff --git a/packages/block-editor/src/components/page-template-picker/default-templates.js b/packages/block-editor/src/components/page-template-picker/default-templates.native.js
similarity index 82%
rename from packages/block-editor/src/components/page-template-picker/default-templates.js
rename to packages/block-editor/src/components/page-template-picker/default-templates.native.js
index 737b8b699d0831..f5a6911f49bf2f 100644
--- a/packages/block-editor/src/components/page-template-picker/default-templates.js
+++ b/packages/block-editor/src/components/page-template-picker/default-templates.native.js
@@ -12,9 +12,9 @@ import memoize from 'memize';
/**
* Internal dependencies
*/
-import { About, Contact, Portfolio, Services, Team } from './templates';
+import { About, Blog, Contact, Portfolio, Services, Team } from './templates';
-const defaultTemplates = [ About, Contact, Portfolio, Services, Team ];
+const defaultTemplates = [ About, Blog, Contact, Portfolio, Services, Team ];
const createInnerBlocks = ( { name, attributes, innerBlocks } ) => {
return createBlock(
diff --git a/packages/block-editor/src/components/page-template-picker/index.native.js b/packages/block-editor/src/components/page-template-picker/index.native.js
index 88fa9323799fc8..3fdc5146b2551b 100644
--- a/packages/block-editor/src/components/page-template-picker/index.native.js
+++ b/packages/block-editor/src/components/page-template-picker/index.native.js
@@ -2,9 +2,7 @@
* Internal dependencies
*/
import __experimentalPageTemplatePicker from './picker';
-import __experimentalWithPageTemplatePickerVisible from './with-page-template-picker-visible';
-import __experimentalUsePageTemplatePickerVisible from './use-page-template-picker-visible';
+import __experimentalWithPageTemplatePicker from './with-page-template-picker';
export { __experimentalPageTemplatePicker };
-export { __experimentalWithPageTemplatePickerVisible };
-export { __experimentalUsePageTemplatePickerVisible };
+export { __experimentalWithPageTemplatePicker };
diff --git a/packages/block-editor/src/components/page-template-picker/picker.js b/packages/block-editor/src/components/page-template-picker/picker.js
deleted file mode 100644
index b3ff9f1a281a24..00000000000000
--- a/packages/block-editor/src/components/page-template-picker/picker.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * WordPress dependencies
- */
-import { useState } from '@wordpress/element';
-import { useDispatch } from '@wordpress/data';
-
-/**
- * External dependencies
- */
-import { logUserEvent, userEvents } from 'react-native-gutenberg-bridge';
-
-/**
- * Internal dependencies
- */
-import Button from './button';
-import Container from './container';
-import getDefaultTemplates from './default-templates';
-import Preview from './preview';
-
-const __experimentalPageTemplatePicker = ( {
- templates = getDefaultTemplates(),
-} ) => {
- const { editPost } = useDispatch( 'core/editor' );
- const [ templatePreview, setTemplatePreview ] = useState();
-
- const onApply = () => {
- editPost( {
- title: templatePreview.name,
- blocks: templatePreview.blocks,
- } );
- logUserEvent( userEvents.editorSessionTemplateApply, {
- template: templatePreview.key,
- } );
- setTemplatePreview( undefined );
- };
-
- return (
- <>
-
- { templates.map( ( template ) => (
- {
- logUserEvent(
- userEvents.editorSessionTemplatePreview,
- {
- template: template.key,
- }
- );
- setTemplatePreview( template );
- } }
- />
- ) ) }
-
-
setTemplatePreview( undefined ) }
- onApply={ onApply }
- />
- >
- );
-};
-
-export default __experimentalPageTemplatePicker;
diff --git a/packages/block-editor/src/components/page-template-picker/picker.native.js b/packages/block-editor/src/components/page-template-picker/picker.native.js
new file mode 100644
index 00000000000000..25bb4b772ec242
--- /dev/null
+++ b/packages/block-editor/src/components/page-template-picker/picker.native.js
@@ -0,0 +1,132 @@
+/**
+ * WordPress dependencies
+ */
+import { useState, useEffect, useRef } from '@wordpress/element';
+import { useDispatch, useSelect } from '@wordpress/data';
+
+/**
+ * External dependencies
+ */
+import { logUserEvent, userEvents } from 'react-native-gutenberg-bridge';
+import { Animated, Dimensions, Keyboard } from 'react-native';
+
+/**
+ * Internal dependencies
+ */
+import Button from './button';
+import Container from './container';
+import getDefaultTemplates from './default-templates';
+import Preview from './preview';
+
+// Used to hide the picker if there's no enough space in the window
+const PICKER_HEIGHT_OFFSET = 150;
+
+const __experimentalPageTemplatePicker = ( {
+ templates = getDefaultTemplates(),
+ visible,
+} ) => {
+ const { editPost } = useDispatch( 'core/editor' );
+ const { title } = useSelect( ( select ) => {
+ const { getEditedPostAttribute } = select( 'core/editor' );
+
+ return {
+ title: getEditedPostAttribute( 'title' ),
+ };
+ } );
+
+ const [ templatePreview, setTemplatePreview ] = useState();
+ const [ pickerVisible, setPickerVisible ] = useState( visible );
+ const contentOpacity = useRef( new Animated.Value( 0 ) ).current;
+
+ useEffect( () => {
+ if ( shouldShowPicker() && visible && ! pickerVisible ) {
+ setPickerVisible( true );
+ }
+ startPickerAnimation( visible );
+
+ Keyboard.addListener( 'keyboardDidShow', onKeyboardDidShow );
+ Keyboard.addListener( 'keyboardDidHide', onKeyboardDidHide );
+
+ return () => {
+ Keyboard.removeListener( 'keyboardDidShow', onKeyboardDidShow );
+ Keyboard.removeListener( 'keyboardDidHide', onKeyboardDidHide );
+ };
+ }, [ visible ] );
+
+ const onKeyboardDidShow = () => {
+ if ( visible ) {
+ startPickerAnimation( shouldShowPicker() );
+ }
+ };
+
+ const onKeyboardDidHide = () => {
+ if ( visible ) {
+ setPickerVisible( true );
+ startPickerAnimation( true );
+ }
+ };
+
+ const shouldShowPicker = () => {
+ // On smaller devices on landscape we hide the picker
+ // so it doesn't overlap with the editor's content
+ const windowHeight = Dimensions.get( 'window' ).height;
+ return PICKER_HEIGHT_OFFSET < windowHeight / 3;
+ };
+
+ const onApply = () => {
+ editPost( {
+ title: title || templatePreview.name,
+ blocks: templatePreview.blocks,
+ } );
+ logUserEvent( userEvents.editorSessionTemplateApply, {
+ template: templatePreview.key,
+ } );
+ setTemplatePreview( undefined );
+ };
+
+ const startPickerAnimation = ( isVisible ) => {
+ Animated.timing( contentOpacity, {
+ toValue: isVisible ? 1 : 0,
+ duration: 300,
+ useNativeDriver: true,
+ } ).start( () => {
+ if ( ! isVisible ) {
+ setPickerVisible( isVisible );
+ }
+ } );
+ };
+
+ if ( ! pickerVisible ) {
+ return null;
+ }
+
+ return (
+
+
+ { templates.map( ( template ) => (
+ {
+ logUserEvent(
+ userEvents.editorSessionTemplatePreview,
+ {
+ template: template.key,
+ }
+ );
+ setTemplatePreview( template );
+ } }
+ />
+ ) ) }
+
+ setTemplatePreview( undefined ) }
+ onApply={ onApply }
+ />
+
+ );
+};
+
+export default __experimentalPageTemplatePicker;
diff --git a/packages/block-editor/src/components/page-template-picker/preview.native.js b/packages/block-editor/src/components/page-template-picker/preview.native.js
index 65b19d93ba9269..68a6fe983f5beb 100644
--- a/packages/block-editor/src/components/page-template-picker/preview.native.js
+++ b/packages/block-editor/src/components/page-template-picker/preview.native.js
@@ -3,14 +3,21 @@
*/
import { BlockEditorProvider, BlockList } from '@wordpress/block-editor';
import { ModalHeaderBar } from '@wordpress/components';
-import { usePreferredColorScheme } from '@wordpress/compose';
+import { usePreferredColorSchemeStyle } from '@wordpress/compose';
import { useSelect } from '@wordpress/data';
+import { useEffect, useRef } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
/**
* External dependencies
*/
-import { Modal, View, SafeAreaView } from 'react-native';
+import { Modal, Platform, View, SafeAreaView } from 'react-native';
+import { subscribeAndroidModalClosed } from 'react-native-gutenberg-bridge';
+
+/**
+ * Internal dependencies
+ */
+import styles from './styles.scss';
// We are replicating this here because the one in @wordpress/block-editor always
// tries to scale the preview and we would need a lot of cross platform code to handle
@@ -27,10 +34,12 @@ const BlockPreview = ( { blocks } ) => {
readOnly: true,
};
+ const header = ;
+
return (
-
+
);
@@ -39,9 +48,34 @@ BlockPreview.displayName = 'BlockPreview';
const Preview = ( props ) => {
const { template, onDismiss, onApply } = props;
- const preferredColorScheme = usePreferredColorScheme();
- const containerBackgroundColor =
- preferredColorScheme === 'dark' ? 'black' : 'white';
+ const previewContainerStyle = usePreferredColorSchemeStyle(
+ styles.previewContainer,
+ styles.previewContainerDark
+ );
+ const previewContentStyle = usePreferredColorSchemeStyle(
+ styles.previewContent,
+ styles.previewContentDark
+ );
+ const androidModalClosedSubscription = useRef();
+
+ useEffect( () => {
+ if ( Platform.OS === 'android' ) {
+ androidModalClosedSubscription.current = subscribeAndroidModalClosed(
+ () => {
+ onDismiss();
+ }
+ );
+ }
+
+ return () => {
+ if (
+ androidModalClosedSubscription &&
+ androidModalClosedSubscription.current
+ ) {
+ androidModalClosedSubscription.current.remove();
+ }
+ };
+ }, [] );
if ( template === undefined ) {
return null;
@@ -64,16 +98,16 @@ const Preview = ( props ) => {
onRequestClose={ onDismiss }
supportedOrientations={ [ 'portrait', 'landscape' ] }
>
-
+
-
+
+
+
);
diff --git a/packages/block-editor/src/components/page-template-picker/styles.native.scss b/packages/block-editor/src/components/page-template-picker/styles.native.scss
index 8c6a5663f19726..e37dda2ba7aa31 100644
--- a/packages/block-editor/src/components/page-template-picker/styles.native.scss
+++ b/packages/block-editor/src/components/page-template-picker/styles.native.scss
@@ -6,12 +6,21 @@
padding: 0 12px;
}
-.button {
- background-color: rgba($black, 0.04);
+.buttonWrapper {
+ background-color: $white;
border-radius: 20px;
- flex-direction: row;
margin-right: 8px;
+ overflow: hidden;
+}
+
+.buttonWrapperDark {
+ background-color: $black;
+}
+
+.button {
+ background-color: rgba($black, 0.04);
padding: 9px 18px 9px 14px;
+ flex-direction: row;
align-items: center;
}
@@ -34,3 +43,26 @@
.buttonTextDark {
color: $light-opacity-700;
}
+
+.previewContainer {
+ flex: 1;
+ background-color: $white;
+}
+
+.previewContainerDark {
+ background-color: #0f1518;
+}
+
+.previewContent {
+ flex: 1;
+ background-color: $white;
+}
+
+.previewContentDark {
+ background-color: $black;
+}
+
+.previewHeader {
+ flex: 0;
+ height: 15px;
+}
diff --git a/packages/block-editor/src/components/page-template-picker/templates/blog.native.js b/packages/block-editor/src/components/page-template-picker/templates/blog.native.js
new file mode 100644
index 00000000000000..3ebd6173f164c7
--- /dev/null
+++ b/packages/block-editor/src/components/page-template-picker/templates/blog.native.js
@@ -0,0 +1,82 @@
+/**
+ * WordPress dependencies
+ */
+import { __ } from '@wordpress/i18n';
+
+const Blog = {
+ // translators: title for "Blog" page template
+ name: __( 'Blog' ),
+ key: 'blog',
+ icon: '📰',
+ content: [
+ {
+ name: 'core/image',
+ attributes: {
+ url:
+ 'https://mgblayoutexamples.files.wordpress.com/2020/02/people-woman-coffee-meeting.jpg',
+ },
+ },
+ {
+ name: 'core/spacer',
+ attributes: {
+ height: 24,
+ },
+ },
+ {
+ name: 'core/heading',
+ attributes: {
+ // translators: sample content for "Blog" page template
+ content: __( 'Latest Blog Posts' ),
+ level: 2,
+ },
+ },
+ {
+ name: 'core/latest-posts',
+ attributes: {},
+ },
+ {
+ name: 'core/spacer',
+ attributes: {
+ height: 24,
+ },
+ },
+ {
+ name: 'core/separator',
+ attributes: {},
+ },
+ {
+ name: 'core/spacer',
+ attributes: {
+ height: 24,
+ },
+ },
+ {
+ name: 'core/heading',
+ attributes: {
+ align: 'center',
+ // translators: sample content for "Blog" page template
+ content: __( 'Follow our Blog' ),
+ level: 2,
+ },
+ },
+ {
+ name: 'core/button',
+ attributes: {
+ // translators: sample content for "Blog" page template
+ text: __( 'Subscribe' ),
+ },
+ },
+ {
+ name: 'core/spacer',
+ attributes: {
+ height: 24,
+ },
+ },
+ {
+ name: 'core/separator',
+ attributes: {},
+ },
+ ],
+};
+
+export default Blog;
diff --git a/packages/block-editor/src/components/page-template-picker/templates/contact.native.js b/packages/block-editor/src/components/page-template-picker/templates/contact.native.js
index de45d5bb3822fc..ebb216311f28d3 100644
--- a/packages/block-editor/src/components/page-template-picker/templates/contact.native.js
+++ b/packages/block-editor/src/components/page-template-picker/templates/contact.native.js
@@ -7,7 +7,7 @@ const Contact = {
// translators: title for "Contact" page template
name: __( 'Contact' ),
key: 'contact',
- icon: '✉',
+ icon: '📫',
content: [
{
name: 'core/paragraph',
diff --git a/packages/block-editor/src/components/page-template-picker/templates/index.native.js b/packages/block-editor/src/components/page-template-picker/templates/index.native.js
index 3147b37db37e75..c424b3e97fe7a9 100644
--- a/packages/block-editor/src/components/page-template-picker/templates/index.native.js
+++ b/packages/block-editor/src/components/page-template-picker/templates/index.native.js
@@ -1,4 +1,5 @@
export { default as About } from './about';
+export { default as Blog } from './blog';
export { default as Contact } from './contact';
export { default as Portfolio } from './portfolio';
export { default as Services } from './services';
diff --git a/packages/block-editor/src/components/page-template-picker/templates/services.native.js b/packages/block-editor/src/components/page-template-picker/templates/services.native.js
index 214f37a449ea62..3aed3918348179 100644
--- a/packages/block-editor/src/components/page-template-picker/templates/services.native.js
+++ b/packages/block-editor/src/components/page-template-picker/templates/services.native.js
@@ -7,7 +7,7 @@ const Services = {
// translators: title for "Services" page template
name: __( 'Services' ),
key: 'services',
- icon: '🛠',
+ icon: '🔧',
content: [
{
name: 'core/paragraph',
@@ -116,7 +116,7 @@ const Services = {
{
name: 'core/spacer',
attributes: {
- height: 40,
+ height: 24,
},
},
{
diff --git a/packages/block-editor/src/components/page-template-picker/use-page-template-picker-visible.js b/packages/block-editor/src/components/page-template-picker/use-page-template-picker.native.js
similarity index 57%
rename from packages/block-editor/src/components/page-template-picker/use-page-template-picker-visible.js
rename to packages/block-editor/src/components/page-template-picker/use-page-template-picker.native.js
index ac2f78692dec8f..53b173324ad69d 100644
--- a/packages/block-editor/src/components/page-template-picker/use-page-template-picker-visible.js
+++ b/packages/block-editor/src/components/page-template-picker/use-page-template-picker.native.js
@@ -4,16 +4,18 @@
import { isUnmodifiedDefaultBlock } from '@wordpress/blocks';
import { useSelect } from '@wordpress/data';
-const __experimentalUsePageTemplatePickerVisible = () => {
+export const __experimentalUsePageTemplatePickerAvailable = () => {
return useSelect( ( select ) => {
const { getCurrentPostType } = select( 'core/editor' );
+ return getCurrentPostType() === 'page';
+ }, [] );
+};
- const { getBlockOrder, getBlock, getSettings } = select(
- 'core/block-editor'
- );
+export const __experimentalUsePageTemplatePickerVisible = () => {
+ const isTemplatePickerAvailable = __experimentalUsePageTemplatePickerAvailable();
- const isPageTemplatesEnabled = getSettings()
- .__mobileEnablePageTemplates;
+ return useSelect( ( select ) => {
+ const { getBlockOrder, getBlock } = select( 'core/block-editor' );
const blocks = getBlockOrder();
const isEmptyBlockList = blocks.length === 0;
@@ -21,10 +23,7 @@ const __experimentalUsePageTemplatePickerVisible = () => {
const isOnlyUnmodifiedDefault =
blocks.length === 1 && isUnmodifiedDefaultBlock( firstBlock );
const isEmptyContent = isEmptyBlockList || isOnlyUnmodifiedDefault;
- const isPage = getCurrentPostType() === 'page';
- return isPageTemplatesEnabled && isEmptyContent && isPage;
+ return isEmptyContent && isTemplatePickerAvailable;
}, [] );
};
-
-export default __experimentalUsePageTemplatePickerVisible;
diff --git a/packages/block-editor/src/components/page-template-picker/with-page-template-picker-visible.js b/packages/block-editor/src/components/page-template-picker/with-page-template-picker-visible.js
deleted file mode 100644
index edb7893778ae86..00000000000000
--- a/packages/block-editor/src/components/page-template-picker/with-page-template-picker-visible.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * WordPress dependencies
- */
-import { createHigherOrderComponent } from '@wordpress/compose';
-
-/**
- * Internal dependencies
- */
-import __experimentalUsePageTemplatePickerVisible from './use-page-template-picker-visible';
-
-const __experimentalWithPageTemplatePickerVisible = createHigherOrderComponent(
- ( WrappedComponent ) => ( props ) => {
- const showPageTemplatePicker = __experimentalUsePageTemplatePickerVisible();
- return (
-
- );
- },
- '__experimentalWithPageTemplatePickerVisible'
-);
-
-export default __experimentalWithPageTemplatePickerVisible;
diff --git a/packages/block-editor/src/components/page-template-picker/with-page-template-picker.native.js b/packages/block-editor/src/components/page-template-picker/with-page-template-picker.native.js
new file mode 100644
index 00000000000000..121bd46db9ce12
--- /dev/null
+++ b/packages/block-editor/src/components/page-template-picker/with-page-template-picker.native.js
@@ -0,0 +1,30 @@
+/**
+ * WordPress dependencies
+ */
+import { createHigherOrderComponent } from '@wordpress/compose';
+
+/**
+ * Internal dependencies
+ */
+import {
+ __experimentalUsePageTemplatePickerVisible,
+ __experimentalUsePageTemplatePickerAvailable,
+} from './use-page-template-picker';
+
+const __experimentalWithPageTemplatePicker = createHigherOrderComponent(
+ ( WrappedComponent ) => ( props ) => {
+ const isTemplatePickerVisible = __experimentalUsePageTemplatePickerVisible();
+ const isTemplatePickerAvailable = __experimentalUsePageTemplatePickerAvailable();
+
+ return (
+
+ );
+ },
+ '__experimentalWithPageTemplatePicker'
+);
+
+export default __experimentalWithPageTemplatePicker;
diff --git a/packages/block-editor/src/components/plain-text/index.js b/packages/block-editor/src/components/plain-text/index.js
index a0a2aae23a2ce7..7421fe3be0932f 100644
--- a/packages/block-editor/src/components/plain-text/index.js
+++ b/packages/block-editor/src/components/plain-text/index.js
@@ -1,24 +1,35 @@
+/**
+ * External dependencies
+ */
+import TextareaAutosize from 'react-autosize-textarea';
+import classnames from 'classnames';
+
/**
* WordPress dependencies
*/
import { forwardRef } from '@wordpress/element';
/**
- * External dependencies
+ * Internal dependencies
*/
-import TextareaAutosize from 'react-autosize-textarea';
-import classnames from 'classnames';
+import EditableText from '../editable-text';
/**
* @see https://github.com/WordPress/gutenberg/blob/master/packages/block-editor/src/components/plain-text/README.md
*/
-const PlainText = forwardRef( ( { onChange, className, ...props }, ref ) => {
+const PlainText = forwardRef( ( { __experimentalVersion, ...props }, ref ) => {
+ if ( __experimentalVersion === 2 ) {
+ return ;
+ }
+
+ const { className, onChange, ...remainingProps } = props;
+
return (
onChange( event.target.value ) }
- { ...props }
+ { ...remainingProps }
/>
);
} );
diff --git a/packages/block-editor/src/components/plain-text/index.native.js b/packages/block-editor/src/components/plain-text/index.native.js
index 9ddb1fba7465c1..468549b448576d 100644
--- a/packages/block-editor/src/components/plain-text/index.native.js
+++ b/packages/block-editor/src/components/plain-text/index.native.js
@@ -70,6 +70,7 @@ export default class PlainText extends Component {
style={
this.props.style || styles[ 'block-editor-plain-text' ]
}
+ scrollEnabled={ false }
/>
);
}
diff --git a/packages/block-editor/src/components/responsive-block-control/index.js b/packages/block-editor/src/components/responsive-block-control/index.js
index 8a3d3eef08145e..53854980a1070d 100644
--- a/packages/block-editor/src/components/responsive-block-control/index.js
+++ b/packages/block-editor/src/components/responsive-block-control/index.js
@@ -26,9 +26,8 @@ function ResponsiveBlockControl( props ) {
isResponsive = false,
defaultLabel = {
id: 'all',
- label: __(
- 'All'
- ) /* translators: 'Label. Used to signify a layout property (eg: margin, padding) will apply uniformly to all screensizes.' */,
+ /* translators: 'Label. Used to signify a layout property (eg: margin, padding) will apply uniformly to all screensizes.' */
+ label: __( 'All' ),
},
viewports = [
{
@@ -50,10 +49,13 @@ function ResponsiveBlockControl( props ) {
return null;
}
- /* translators: 'Toggle control label. Should the property be the same across all screen sizes or unique per screen size.'. %s property value for the control (eg: margin, padding...etc) */
const toggleControlLabel =
toggleLabel ||
- sprintf( __( 'Use the same %s on all screensizes.' ), property );
+ sprintf(
+ /* translators: 'Toggle control label. Should the property be the same across all screen sizes or unique per screen size.'. %s property value for the control (eg: margin, padding...etc) */
+ __( 'Use the same %s on all screensizes.' ),
+ property
+ );
/* translators: 'Help text for the responsive mode toggle control.' */
const toggleHelpText = __(
diff --git a/packages/block-editor/src/components/responsive-block-control/label.js b/packages/block-editor/src/components/responsive-block-control/label.js
index dba8fe9e310c74..b0bd0c180cb902 100644
--- a/packages/block-editor/src/components/responsive-block-control/label.js
+++ b/packages/block-editor/src/components/responsive-block-control/label.js
@@ -2,6 +2,7 @@
* WordPress dependencies
*/
import { useInstanceId } from '@wordpress/compose';
+import { VisuallyHidden } from '@wordpress/components';
import { _x, sprintf } from '@wordpress/i18n';
import { Fragment } from '@wordpress/element';
@@ -14,6 +15,7 @@ export default function ResponsiveBlockControlLabel( {
const accessibleLabel =
desc ||
sprintf(
+ /* translators: 1: property name. 2: viewport name. */
_x(
'Controls the %1$s property for %2$s viewports.',
'Text labelling a interface as controlling a given layout property (eg: margin) for a given screen size.'
@@ -26,12 +28,9 @@ export default function ResponsiveBlockControlLabel( {
{ viewport.label }
-
+
{ accessibleLabel }
-
+
);
}
diff --git a/packages/block-editor/src/components/responsive-block-control/test/__snapshots__/index.js.snap b/packages/block-editor/src/components/responsive-block-control/test/__snapshots__/index.js.snap
index 50527efe610212..a5e0beb316a347 100644
--- a/packages/block-editor/src/components/responsive-block-control/test/__snapshots__/index.js.snap
+++ b/packages/block-editor/src/components/responsive-block-control/test/__snapshots__/index.js.snap
@@ -1,3 +1,3 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`Basic rendering should render with required props 1`] = `"Padding Toggle between using the same value for all screen sizes or using a unique value per screen size.
All Controls the padding property for All viewports. Please select Small Medium Large
All is used here for testing purposes to ensure we have access to details about the device.
"`;
+exports[`Basic rendering should render with required props 1`] = `"Padding Toggle between using the same value for all screen sizes or using a unique value per screen size.
All Controls the padding property for All viewports. Please select Small Medium Large
All is used here for testing purposes to ensure we have access to details about the device.
"`;
diff --git a/packages/block-editor/src/components/rich-text/format-toolbar/index.js b/packages/block-editor/src/components/rich-text/format-toolbar/index.js
index 159014241e85ee..3bbc0eadd680e3 100644
--- a/packages/block-editor/src/components/rich-text/format-toolbar/index.js
+++ b/packages/block-editor/src/components/rich-text/format-toolbar/index.js
@@ -14,6 +14,7 @@ import { chevronDown } from '@wordpress/icons';
const POPOVER_PROPS = {
position: 'bottom right',
+ isAlternate: true,
};
const FormatToolbar = () => {
diff --git a/packages/block-editor/src/components/rich-text/index.js b/packages/block-editor/src/components/rich-text/index.js
index 6cfbbcc51ac998..142c02e8ed9074 100644
--- a/packages/block-editor/src/components/rich-text/index.js
+++ b/packages/block-editor/src/components/rich-text/index.js
@@ -67,7 +67,15 @@ function getMultilineTag( multiline ) {
return multiline === true ? 'p' : multiline;
}
-function getAllowedFormats( { allowedFormats, formattingControls } ) {
+function getAllowedFormats( {
+ allowedFormats,
+ formattingControls,
+ disableFormats,
+} ) {
+ if ( disableFormats ) {
+ return getAllowedFormats.EMPTY_ARRAY;
+ }
+
if ( ! allowedFormats && ! formattingControls ) {
return;
}
@@ -83,6 +91,8 @@ function getAllowedFormats( { allowedFormats, formattingControls } ) {
return formattingControls.map( ( name ) => `core/${ name }` );
}
+getAllowedFormats.EMPTY_ARRAY = [];
+
function RichTextWrapper(
{
children,
@@ -112,6 +122,8 @@ function RichTextWrapper(
style,
preserveWhiteSpace,
__unstableEmbedURLOnPaste,
+ __unstableDisableFormats: disableFormats,
+ disableLineBreaks,
...props
},
forwardedRef
@@ -141,10 +153,7 @@ function RichTextWrapper(
const selectionStart = getSelectionStart();
const selectionEnd = getSelectionEnd();
- const {
- __experimentalCanUserUseUnfilteredHTML,
- __experimentalUndo: undo,
- } = getSettings();
+ const { __experimentalUndo: undo } = getSettings();
let isSelected;
@@ -171,7 +180,6 @@ function RichTextWrapper(
}
return {
- canUserUseUnfilteredHTML: __experimentalCanUserUseUnfilteredHTML,
isCaretWithinFormattedText: isCaretWithinFormattedText(),
selectionStart: isSelected ? selectionStart.offset : undefined,
selectionEnd: isSelected ? selectionEnd.offset : undefined,
@@ -186,7 +194,6 @@ function RichTextWrapper(
// retreived from the store on merge.
// To do: fix this somehow.
const {
- canUserUseUnfilteredHTML,
isCaretWithinFormattedText,
selectionStart,
selectionEnd,
@@ -207,6 +214,7 @@ function RichTextWrapper(
const adjustedAllowedFormats = getAllowedFormats( {
allowedFormats,
formattingControls,
+ disableFormats,
} );
const hasFormats =
! adjustedAllowedFormats || adjustedAllowedFormats.length > 0;
@@ -334,14 +342,18 @@ function RichTextWrapper(
if ( multiline ) {
if ( shiftKey ) {
- onChange( insert( value, '\n' ) );
+ if ( ! disableLineBreaks ) {
+ onChange( insert( value, '\n' ) );
+ }
} else if ( canSplit && isEmptyLine( value ) ) {
splitValue( value );
} else {
onChange( insertLineSeparator( value ) );
}
} else if ( shiftKey || ! canSplit ) {
- onChange( insert( value, '\n' ) );
+ if ( ! disableLineBreaks ) {
+ onChange( insert( value, '\n' ) );
+ }
} else {
splitValue( value );
}
@@ -394,7 +406,6 @@ function RichTextWrapper(
plainText,
mode,
tagName,
- canUserUseUnfilteredHTML,
} );
if ( typeof content === 'string' ) {
@@ -437,7 +448,6 @@ function RichTextWrapper(
onSplit,
splitValue,
__unstableEmbedURLOnPaste,
- canUserUseUnfilteredHTML,
multiline,
]
);
@@ -511,6 +521,7 @@ function RichTextWrapper(
__unstableMarkAutomaticChange={ __unstableMarkAutomaticChange }
__unstableDidAutomaticChange={ didAutomaticChange }
__unstableUndo={ undo }
+ __unstableDisableFormats={ disableFormats }
style={ style }
preserveWhiteSpace={ preserveWhiteSpace }
disabled={ disabled }
diff --git a/packages/block-editor/src/components/rich-text/style.scss b/packages/block-editor/src/components/rich-text/style.scss
index d08ae54ce51a7a..cc5f2a1d379a3a 100644
--- a/packages/block-editor/src/components/rich-text/style.scss
+++ b/packages/block-editor/src/components/rich-text/style.scss
@@ -3,19 +3,6 @@
margin-top: 0;
}
- a {
- color: $blue-medium-700;
- }
-
- code {
- padding: 2px;
- border-radius: 2px;
- color: $dark-gray-800;
- background: $light-gray-200;
- font-family: $editor-html-font;
- font-size: inherit; // This is necessary to override upstream CSS.
- }
-
[data-rich-text-placeholder] {
pointer-events: none;
}
diff --git a/packages/block-editor/src/components/unit-control/index.js b/packages/block-editor/src/components/unit-control/index.js
new file mode 100644
index 00000000000000..e5a1fb3e902473
--- /dev/null
+++ b/packages/block-editor/src/components/unit-control/index.js
@@ -0,0 +1,61 @@
+/**
+ * WordPress dependencies
+ */
+import { __experimentalUnitControl as BaseUnitControl } from '@wordpress/components';
+import { useSelect } from '@wordpress/data';
+
+const { __defaultUnits } = BaseUnitControl;
+
+export default function UnitControl( { units: unitsProp, ...props } ) {
+ const settings = useCustomUnitsSettings();
+ const isDisabled = !! settings;
+
+ // Adjust units based on add_theme_support( 'experimental-custom-units' );
+ let units;
+
+ /**
+ * Handle extra arguments for add_theme_support
+ *
+ * Example: add_theme_support( 'experimental-custom-units', 'rem' );
+ * Or: add_theme_support( 'experimental-custom-units', 'px, 'rem', 'em' );
+ *
+ * Note: If there are unit argument (e.g. 'em'), these units are enabled
+ * within the control.
+ */
+ if ( Array.isArray( settings ) ) {
+ units = filterUnitsWithSettings( settings, unitsProp );
+ } else {
+ units = isDisabled ? false : unitsProp;
+ }
+
+ return ;
+}
+
+// Hoisting statics from the BaseUnitControl
+UnitControl.__defaultUnits = __defaultUnits;
+
+/**
+ * Hook that retrieves the 'experimental-custom-units' setting from add_theme_support()
+ */
+function useCustomUnitsSettings() {
+ const settings = useSelect( ( select ) => {
+ const { getSettings } = select( 'core/block-editor' );
+ return getSettings().__experimentalDisableCustomUnits;
+ }, [] );
+
+ return settings;
+}
+
+/**
+ * Filters available units based on values defined by settings.
+ *
+ * @param {Array} settings Collection of preferred units.
+ * @param {Array} units Collection of available units.
+ *
+ * @return {Array} Filtered units based on settings.
+ */
+function filterUnitsWithSettings( settings = [], units = [] ) {
+ return units.filter( ( unit ) => {
+ return settings.includes( unit.value );
+ } );
+}
diff --git a/packages/block-editor/src/components/url-input/index.js b/packages/block-editor/src/components/url-input/index.js
index f9c6eeb4b94e66..7c2f403d28938e 100644
--- a/packages/block-editor/src/components/url-input/index.js
+++ b/packages/block-editor/src/components/url-input/index.js
@@ -178,6 +178,7 @@ class URLInput extends Component {
if ( !! suggestions.length ) {
this.props.debouncedSpeak(
sprintf(
+ /* translators: %s: number of results. */
_n(
'%d result found, use up and down arrow keys to navigate.',
'%d results found, use up and down arrow keys to navigate.',
@@ -214,7 +215,7 @@ class URLInput extends Component {
this.props.onChange( inputValue );
if ( ! this.props.disableSuggestions ) {
- this.updateSuggestions( inputValue );
+ this.updateSuggestions( inputValue.trim() );
}
}
@@ -231,7 +232,7 @@ class URLInput extends Component {
! ( suggestions && suggestions.length )
) {
// Ensure the suggestions are updated with the current input value
- this.updateSuggestions( value );
+ this.updateSuggestions( value.trim() );
}
}
diff --git a/packages/block-editor/src/components/url-input/style.scss b/packages/block-editor/src/components/url-input/style.scss
index e54b3a667d5352..0237689edb4c4b 100644
--- a/packages/block-editor/src/components/url-input/style.scss
+++ b/packages/block-editor/src/components/url-input/style.scss
@@ -86,7 +86,7 @@ $input-size: 300px;
width: 100%;
border: none;
text-align: left;
- @include menu-style__neutral();
+ box-shadow: none;
&:hover {
background: $light-gray-500;
diff --git a/packages/block-editor/src/components/url-popover/link-viewer-url.js b/packages/block-editor/src/components/url-popover/link-viewer-url.js
new file mode 100644
index 00000000000000..5cf710f2030097
--- /dev/null
+++ b/packages/block-editor/src/components/url-popover/link-viewer-url.js
@@ -0,0 +1,27 @@
+/**
+ * External dependencies
+ */
+import classnames from 'classnames';
+
+/**
+ * WordPress dependencies
+ */
+import { ExternalLink } from '@wordpress/components';
+import { safeDecodeURI, filterURLForDisplay } from '@wordpress/url';
+
+export default function LinkViewerURL( { url, urlLabel, className } ) {
+ const linkClassName = classnames(
+ className,
+ 'block-editor-url-popover__link-viewer-url'
+ );
+
+ if ( ! url ) {
+ return ;
+ }
+
+ return (
+
+ { urlLabel || filterURLForDisplay( safeDecodeURI( url ) ) }
+
+ );
+}
diff --git a/packages/block-editor/src/components/url-popover/link-viewer.js b/packages/block-editor/src/components/url-popover/link-viewer.js
index f5cbd7459355f8..09e1487bc4dcaf 100644
--- a/packages/block-editor/src/components/url-popover/link-viewer.js
+++ b/packages/block-editor/src/components/url-popover/link-viewer.js
@@ -7,26 +7,13 @@ import classnames from 'classnames';
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
-import { ExternalLink, Button } from '@wordpress/components';
-import { safeDecodeURI, filterURLForDisplay } from '@wordpress/url';
+import { Button } from '@wordpress/components';
import { pencil } from '@wordpress/icons';
-function LinkViewerUrl( { url, urlLabel, className } ) {
- const linkClassName = classnames(
- className,
- 'block-editor-url-popover__link-viewer-url'
- );
-
- if ( ! url ) {
- return ;
- }
-
- return (
-
- { urlLabel || filterURLForDisplay( safeDecodeURI( url ) ) }
-
- );
-}
+/**
+ * Internal dependencies
+ */
+import LinkViewerURL from './link-viewer-url';
export default function LinkViewer( {
className,
@@ -44,7 +31,7 @@ export default function LinkViewer( {
) }
{ ...props }
>
- {
+ if ( ! enableContrastChecking ) {
+ return;
+ }
+
+ const colorsDetectionElement = getBlockDOMNode( clientId );
+ if ( ! colorsDetectionElement ) {
+ return;
+ }
+ setDetectedColor( getComputedStyle( colorsDetectionElement ).color );
+
+ let backgroundColorNode = colorsDetectionElement;
+ let backgroundColor = getComputedStyle( backgroundColorNode )
+ .backgroundColor;
+ while (
+ backgroundColor === 'rgba(0, 0, 0, 0)' &&
+ backgroundColorNode.parentNode &&
+ backgroundColorNode.parentNode.nodeType === Node.ELEMENT_NODE
+ ) {
+ backgroundColorNode = backgroundColorNode.parentNode;
+ backgroundColor = getComputedStyle( backgroundColorNode )
+ .backgroundColor;
+ }
+
+ setDetectedBackgroundColor( backgroundColor );
+ } );
+
+ return (
+
+
+ { enableContrastChecking && (
+
+ ) }
+
+
+ );
+}
diff --git a/packages/block-editor/src/hooks/color-panel.native.js b/packages/block-editor/src/hooks/color-panel.native.js
new file mode 100644
index 00000000000000..3c505bfd0f15f4
--- /dev/null
+++ b/packages/block-editor/src/hooks/color-panel.native.js
@@ -0,0 +1,3 @@
+export default function ColorPanel() {
+ return null;
+}
diff --git a/packages/block-editor/src/hooks/color.js b/packages/block-editor/src/hooks/color.js
new file mode 100644
index 00000000000000..c196a521b39061
--- /dev/null
+++ b/packages/block-editor/src/hooks/color.js
@@ -0,0 +1,292 @@
+/**
+ * External dependencies
+ */
+import classnames from 'classnames';
+import { isObject } from 'lodash';
+
+/**
+ * WordPress dependencies
+ */
+import { addFilter } from '@wordpress/hooks';
+import { hasBlockSupport, getBlockSupport } from '@wordpress/blocks';
+import { __ } from '@wordpress/i18n';
+import { useSelect } from '@wordpress/data';
+import { useRef, useEffect } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import {
+ getColorClassName,
+ getColorObjectByColorValue,
+ getColorObjectByAttributeValues,
+} from '../components/colors';
+import {
+ __experimentalGetGradientClass,
+ getGradientValueBySlug,
+ getGradientSlugByValue,
+} from '../components/gradients';
+import { cleanEmptyObject } from './utils';
+import ColorPanel from './color-panel';
+
+export const COLOR_SUPPORT_KEY = '__experimentalColor';
+
+const hasColorSupport = ( blockType ) =>
+ hasBlockSupport( blockType, COLOR_SUPPORT_KEY );
+
+const hasGradientSupport = ( blockType ) => {
+ const colorSupport = getBlockSupport( blockType, COLOR_SUPPORT_KEY );
+
+ return isObject( colorSupport ) && !! colorSupport.gradients;
+};
+
+/**
+ * Filters registered block settings, extending attributes to include
+ * `backgroundColor` and `textColor` attribute.
+ *
+ * @param {Object} settings Original block settings
+ * @return {Object} Filtered block settings
+ */
+function addAttributes( settings ) {
+ if ( ! hasColorSupport( settings ) ) {
+ return settings;
+ }
+
+ // allow blocks to specify their own attribute definition with default values if needed.
+ if ( ! settings.attributes.backgroundColor ) {
+ Object.assign( settings.attributes, {
+ backgroundColor: {
+ type: 'string',
+ },
+ } );
+ }
+ if ( ! settings.attributes.textColor ) {
+ Object.assign( settings.attributes, {
+ textColor: {
+ type: 'string',
+ },
+ } );
+ }
+
+ if ( hasGradientSupport( settings ) && ! settings.attributes.gradient ) {
+ Object.assign( settings.attributes, {
+ gradient: {
+ type: 'string',
+ },
+ } );
+ }
+
+ return settings;
+}
+
+/**
+ * Override props assigned to save component to inject colors classnames.
+ *
+ * @param {Object} props Additional props applied to save element
+ * @param {Object} blockType Block type
+ * @param {Object} attributes Block attributes
+ * @return {Object} Filtered props applied to save element
+ */
+export function addSaveProps( props, blockType, attributes ) {
+ if ( ! hasColorSupport( blockType ) ) {
+ return props;
+ }
+
+ const hasGradient = hasGradientSupport( blockType );
+
+ // I'd have prefered to avoid the "style" attribute usage here
+ const { backgroundColor, textColor, gradient, style } = attributes;
+
+ const backgroundClass = getColorClassName(
+ 'background-color',
+ backgroundColor
+ );
+ const gradientClass = __experimentalGetGradientClass( gradient );
+ const textClass = getColorClassName( 'color', textColor );
+ const newClassName = classnames(
+ props.className,
+ textClass,
+ gradientClass,
+ {
+ // Don't apply the background class if there's a custom gradient
+ [ backgroundClass ]:
+ ( ! hasGradient || ! style?.color?.gradient ) &&
+ !! backgroundClass,
+ 'has-text-color': textColor || style?.color?.text,
+ 'has-background':
+ backgroundColor ||
+ style?.color?.background ||
+ ( hasGradient && ( gradient || style?.color?.gradient ) ),
+ }
+ );
+ props.className = newClassName ? newClassName : undefined;
+
+ return props;
+}
+
+/**
+ * Filters registered block settings to extand the block edit wrapper
+ * to apply the desired styles and classnames properly.
+ *
+ * @param {Object} settings Original block settings
+ * @return {Object} Filtered block settings
+ */
+export function addEditProps( settings ) {
+ if ( ! hasColorSupport( settings ) ) {
+ return settings;
+ }
+ const existingGetEditWrapperProps = settings.getEditWrapperProps;
+ settings.getEditWrapperProps = ( attributes ) => {
+ let props = {};
+ if ( existingGetEditWrapperProps ) {
+ props = existingGetEditWrapperProps( attributes );
+ }
+ return addSaveProps( props, settings, attributes );
+ };
+
+ return settings;
+}
+
+/**
+ * Inspector control panel containing the color related configuration
+ *
+ * @param {Object} props
+ *
+ * @return {WPElement} Color edit element.
+ */
+export function ColorEdit( props ) {
+ const { name: blockName, attributes } = props;
+ const { colors, gradients } = useSelect( ( select ) => {
+ return select( 'core/block-editor' ).getSettings();
+ }, [] );
+ // Shouldn't be needed but right now the ColorGradientsPanel
+ // can trigger both onChangeColor and onChangeBackground
+ // synchronously causing our two callbacks to override changes
+ // from each other.
+ const localAttributes = useRef( attributes );
+ useEffect( () => {
+ localAttributes.current = attributes;
+ }, [ attributes ] );
+
+ if ( ! hasColorSupport( blockName ) ) {
+ return null;
+ }
+
+ const hasGradient = hasGradientSupport( blockName );
+
+ const { style, textColor, backgroundColor, gradient } = attributes;
+ let gradientValue;
+ if ( hasGradient && gradient ) {
+ gradientValue = getGradientValueBySlug( gradients, gradient );
+ } else if ( hasGradient ) {
+ gradientValue = style?.color?.gradient;
+ }
+
+ const onChangeColor = ( name ) => ( value ) => {
+ const colorObject = getColorObjectByColorValue( colors, value );
+ const attributeName = name + 'Color';
+ const newStyle = {
+ ...localAttributes.current.style,
+ color: {
+ ...localAttributes.current?.style?.color,
+ [ name ]: colorObject?.slug ? undefined : value,
+ },
+ };
+
+ const newNamedColor = colorObject?.slug ? colorObject.slug : undefined;
+ const newAttributes = {
+ style: cleanEmptyObject( newStyle ),
+ [ attributeName ]: newNamedColor,
+ };
+
+ props.setAttributes( newAttributes );
+ localAttributes.current = {
+ ...localAttributes.current,
+ ...newAttributes,
+ };
+ };
+
+ const onChangeGradient = ( value ) => {
+ const slug = getGradientSlugByValue( gradients, value );
+ let newAttributes;
+ if ( slug ) {
+ const newStyle = {
+ ...localAttributes.current?.style,
+ color: {
+ ...localAttributes.current?.style?.color,
+ gradient: undefined,
+ },
+ };
+ newAttributes = {
+ style: cleanEmptyObject( newStyle ),
+ gradient: slug,
+ };
+ } else {
+ const newStyle = {
+ ...localAttributes.current?.style,
+ color: {
+ ...localAttributes.current?.style?.color,
+ gradient: value,
+ },
+ };
+ newAttributes = {
+ style: cleanEmptyObject( newStyle ),
+ gradient: undefined,
+ };
+ }
+ props.setAttributes( newAttributes );
+ localAttributes.current = {
+ ...localAttributes.current,
+ ...newAttributes,
+ };
+ };
+
+ return (
+
+ );
+}
+
+addFilter(
+ 'blocks.registerBlockType',
+ 'core/color/addAttribute',
+ addAttributes
+);
+
+addFilter(
+ 'blocks.getSaveContent.extraProps',
+ 'core/color/addSaveProps',
+ addSaveProps
+);
+
+addFilter(
+ 'blocks.registerBlockType',
+ 'core/color/addEditProps',
+ addEditProps
+);
diff --git a/packages/block-editor/src/hooks/custom-class-name.js b/packages/block-editor/src/hooks/custom-class-name.js
index 1431b6ee4b9684..45d89df175cc1e 100644
--- a/packages/block-editor/src/hooks/custom-class-name.js
+++ b/packages/block-editor/src/hooks/custom-class-name.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import { assign, difference, omit } from 'lodash';
+import { difference, omit } from 'lodash';
import classnames from 'classnames';
/**
@@ -32,12 +32,13 @@ import { InspectorAdvancedControls } from '../components';
*/
export function addAttribute( settings ) {
if ( hasBlockSupport( settings, 'customClassName', true ) ) {
- // Use Lodash's assign to gracefully handle if attributes are undefined
- settings.attributes = assign( settings.attributes, {
+ // Gracefully handle if settings.attributes is undefined.
+ settings.attributes = {
+ ...settings.attributes,
className: {
type: 'string',
},
- } );
+ };
}
return settings;
@@ -65,6 +66,7 @@ export const withInspectorControl = createHigherOrderComponent(
{
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 4edfd96db65c28..659bf3a60efe4f 100644
--- a/packages/block-editor/src/hooks/custom-class-name.native.js
+++ b/packages/block-editor/src/hooks/custom-class-name.native.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import { assign, difference, compact } from 'lodash';
+import { difference, compact } from 'lodash';
import classnames from 'classnames';
/**
@@ -24,12 +24,13 @@ import {
*/
export function addAttribute( settings ) {
if ( hasBlockSupport( settings, 'customClassName', true ) ) {
- // Use Lodash's assign to gracefully handle if attributes are undefined
- settings.attributes = assign( settings.attributes, {
+ // Gracefully handle if settings.attributes is undefined.
+ settings.attributes = {
+ ...settings.attributes,
className: {
type: 'string',
},
- } );
+ };
}
return settings;
diff --git a/packages/block-editor/src/hooks/font-size.js b/packages/block-editor/src/hooks/font-size.js
new file mode 100644
index 00000000000000..5f13821ad75149
--- /dev/null
+++ b/packages/block-editor/src/hooks/font-size.js
@@ -0,0 +1,151 @@
+/**
+ * WordPress dependencies
+ */
+import { addFilter } from '@wordpress/hooks';
+import { hasBlockSupport } from '@wordpress/blocks';
+import { useSelect } from '@wordpress/data';
+import TokenList from '@wordpress/token-list';
+
+/**
+ * Internal dependencies
+ */
+import {
+ getFontSize,
+ getFontSizeClass,
+ getFontSizeObjectByValue,
+ FontSizePicker,
+} from '../components/font-sizes';
+import { cleanEmptyObject } from './utils';
+
+export const FONT_SIZE_SUPPORT_KEY = '__experimentalFontSize';
+
+/**
+ * Filters registered block settings, extending attributes to include
+ * `fontSize` and `fontWeight` attributes.
+ *
+ * @param {Object} settings Original block settings
+ * @return {Object} Filtered block settings
+ */
+function addAttributes( settings ) {
+ if ( ! hasBlockSupport( settings, FONT_SIZE_SUPPORT_KEY ) ) {
+ return settings;
+ }
+
+ // Allow blocks to specify a default value if needed.
+ if ( ! settings.attributes.fontSize ) {
+ Object.assign( settings.attributes, {
+ fontSize: {
+ type: 'string',
+ },
+ } );
+ }
+
+ return settings;
+}
+
+/**
+ * Override props assigned to save component to inject font size.
+ *
+ * @param {Object} props Additional props applied to save element
+ * @param {Object} blockType Block type
+ * @param {Object} attributes Block attributes
+ * @return {Object} Filtered props applied to save element
+ */
+function addSaveProps( props, blockType, attributes ) {
+ if ( ! hasBlockSupport( blockType, FONT_SIZE_SUPPORT_KEY ) ) {
+ return props;
+ }
+
+ // Use TokenList to dedupe classes.
+ const classes = new TokenList( props.className );
+ classes.add( getFontSizeClass( attributes.fontSize ) );
+ const newClassName = classes.value;
+ props.className = newClassName ? newClassName : undefined;
+
+ return props;
+}
+
+/**
+ * Filters registered block settings to expand the block edit wrapper
+ * by applying the desired styles and classnames.
+ *
+ * @param {Object} settings Original block settings
+ * @return {Object} Filtered block settings
+ */
+function addEditProps( settings ) {
+ if ( ! hasBlockSupport( settings, FONT_SIZE_SUPPORT_KEY ) ) {
+ return settings;
+ }
+
+ const existingGetEditWrapperProps = settings.getEditWrapperProps;
+ settings.getEditWrapperProps = ( attributes ) => {
+ let props = {};
+ if ( existingGetEditWrapperProps ) {
+ props = existingGetEditWrapperProps( attributes );
+ }
+ return addSaveProps( props, settings, attributes );
+ };
+
+ return settings;
+}
+
+/**
+ * Inspector control panel containing the font size related configuration
+ *
+ * @param {Object} props
+ *
+ * @return {WPElement} Font size edit element.
+ */
+export function FontSizeEdit( props ) {
+ const {
+ name: blockName,
+ attributes: { fontSize, style },
+ setAttributes,
+ } = props;
+
+ const { fontSizes } = useSelect( ( select ) =>
+ select( 'core/block-editor' ).getSettings()
+ );
+
+ if ( ! hasBlockSupport( blockName, FONT_SIZE_SUPPORT_KEY ) ) {
+ return null;
+ }
+
+ const fontSizeObject = getFontSize(
+ fontSizes,
+ fontSize,
+ style?.typography?.fontSize
+ );
+ const onChange = ( value ) => {
+ const fontSizeSlug = getFontSizeObjectByValue( fontSizes, value ).slug;
+
+ setAttributes( {
+ style: cleanEmptyObject( {
+ ...style,
+ typography: {
+ ...style?.typography,
+ fontSize: fontSizeSlug ? undefined : value,
+ },
+ } ),
+ fontSize: fontSizeSlug,
+ } );
+ };
+
+ return (
+
+ );
+}
+
+addFilter(
+ 'blocks.registerBlockType',
+ 'core/font/addAttribute',
+ addAttributes
+);
+
+addFilter(
+ 'blocks.getSaveContent.extraProps',
+ 'core/font/addSaveProps',
+ addSaveProps
+);
+
+addFilter( 'blocks.registerBlockType', 'core/font/addEditProps', addEditProps );
diff --git a/packages/block-editor/src/hooks/index.js b/packages/block-editor/src/hooks/index.js
index ab3ae2756ce70c..5d9b2f5393a8dd 100644
--- a/packages/block-editor/src/hooks/index.js
+++ b/packages/block-editor/src/hooks/index.js
@@ -5,5 +5,8 @@ import { AlignmentHookSettingsProvider } from './align';
import './anchor';
import './custom-class-name';
import './generated-class-name';
+import './style';
+import './color';
+import './font-size';
export { AlignmentHookSettingsProvider };
diff --git a/packages/block-editor/src/hooks/index.native.js b/packages/block-editor/src/hooks/index.native.js
index d85f61d596d93b..43c5327b4fa5c3 100644
--- a/packages/block-editor/src/hooks/index.native.js
+++ b/packages/block-editor/src/hooks/index.native.js
@@ -3,3 +3,6 @@
*/
import './custom-class-name';
import './generated-class-name';
+import './style';
+import './color';
+import './font-size';
diff --git a/packages/block-editor/src/hooks/line-height.js b/packages/block-editor/src/hooks/line-height.js
new file mode 100644
index 00000000000000..3a146ea341234d
--- /dev/null
+++ b/packages/block-editor/src/hooks/line-height.js
@@ -0,0 +1,49 @@
+/**
+ * WordPress dependencies
+ */
+import { hasBlockSupport } from '@wordpress/blocks';
+
+/**
+ * Internal dependencies
+ */
+import LineHeightControl from '../components/line-height-control';
+import { cleanEmptyObject } from './utils';
+
+export const LINE_HEIGHT_SUPPORT_KEY = '__experimentalLineHeight';
+
+/**
+ * Inspector control panel containing the line height related configuration
+ *
+ * @param {Object} props
+ *
+ * @return {WPElement} Line height edit element.
+ */
+export function LineHeightEdit( props ) {
+ const {
+ name: blockName,
+ attributes: { style },
+ } = props;
+
+ if ( ! hasBlockSupport( blockName, LINE_HEIGHT_SUPPORT_KEY ) ) {
+ return null;
+ }
+
+ const onChange = ( newLineHeightValue ) => {
+ const newStyle = {
+ ...style,
+ typography: {
+ ...style?.typography,
+ lineHeight: newLineHeightValue,
+ },
+ };
+ props.setAttributes( {
+ style: cleanEmptyObject( newStyle ),
+ } );
+ };
+ return (
+
+ );
+}
diff --git a/packages/block-editor/src/hooks/style.js b/packages/block-editor/src/hooks/style.js
new file mode 100644
index 00000000000000..f23a5c2612e2bc
--- /dev/null
+++ b/packages/block-editor/src/hooks/style.js
@@ -0,0 +1,185 @@
+/**
+ * External dependencies
+ */
+import { has, get } from 'lodash';
+
+/**
+ * WordPress dependencies
+ */
+import { addFilter } from '@wordpress/hooks';
+import { hasBlockSupport } from '@wordpress/blocks';
+import { createHigherOrderComponent } from '@wordpress/compose';
+import { PanelBody } from '@wordpress/components';
+import { __ } from '@wordpress/i18n';
+import { Platform } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import InspectorControls from '../components/inspector-controls';
+import { COLOR_SUPPORT_KEY, ColorEdit } from './color';
+import { LINE_HEIGHT_SUPPORT_KEY, LineHeightEdit } from './line-height';
+import { FONT_SIZE_SUPPORT_KEY, FontSizeEdit } from './font-size';
+
+const styleSupportKeys = [
+ COLOR_SUPPORT_KEY,
+ LINE_HEIGHT_SUPPORT_KEY,
+ FONT_SIZE_SUPPORT_KEY,
+];
+
+const typographySupportKeys = [
+ LINE_HEIGHT_SUPPORT_KEY,
+ FONT_SIZE_SUPPORT_KEY,
+];
+
+const hasStyleSupport = ( blockType ) =>
+ styleSupportKeys.some( ( key ) => hasBlockSupport( blockType, key ) );
+
+/**
+ * Returns the inline styles to add depending on the style object
+ *
+ * @param {Object} styles Styles configuration
+ * @return {Object} Flattened CSS variables declaration
+ */
+export function getInlineStyles( styles = {} ) {
+ const mappings = {
+ lineHeight: [ 'typography', 'lineHeight' ],
+ fontSize: [ 'typography', 'fontSize' ],
+ background: [ 'color', 'gradient' ],
+ backgroundColor: [ 'color', 'background' ],
+ color: [ 'color', 'text' ],
+ };
+
+ const output = {};
+ Object.entries( mappings ).forEach( ( [ styleKey, objectKey ] ) => {
+ if ( has( styles, objectKey ) ) {
+ output[ styleKey ] = get( styles, objectKey );
+ }
+ } );
+
+ return output;
+}
+
+/**
+ * Filters registered block settings, extending attributes to include `style` attribute.
+ *
+ * @param {Object} settings Original block settings
+ * @return {Object} Filtered block settings
+ */
+function addAttribute( settings ) {
+ if ( ! hasStyleSupport( settings ) ) {
+ return settings;
+ }
+
+ // allow blocks to specify their own attribute definition with default values if needed.
+ if ( ! settings.attributes.style ) {
+ Object.assign( settings.attributes, {
+ style: {
+ type: 'object',
+ },
+ } );
+ }
+
+ return settings;
+}
+
+/**
+ * Override props assigned to save component to inject the CSS variables definition.
+ *
+ * @param {Object} props Additional props applied to save element
+ * @param {Object} blockType Block type
+ * @param {Object} attributes Block attributes
+ * @return {Object} Filtered props applied to save element
+ */
+export function addSaveProps( props, blockType, attributes ) {
+ if ( ! hasStyleSupport( blockType ) ) {
+ return props;
+ }
+
+ const { style } = attributes;
+ props.style = {
+ ...getInlineStyles( style ),
+ ...props.style,
+ };
+
+ return props;
+}
+
+/**
+ * Filters registered block settings to extand the block edit wrapper
+ * to apply the desired styles and classnames properly.
+ *
+ * @param {Object} settings Original block settings
+ * @return {Object} Filtered block settings
+ */
+export function addEditProps( settings ) {
+ if ( ! hasStyleSupport( settings ) ) {
+ return settings;
+ }
+
+ const existingGetEditWrapperProps = settings.getEditWrapperProps;
+ settings.getEditWrapperProps = ( attributes ) => {
+ let props = {};
+ if ( existingGetEditWrapperProps ) {
+ props = existingGetEditWrapperProps( attributes );
+ }
+
+ return addSaveProps( props, settings, attributes );
+ };
+
+ return settings;
+}
+
+/**
+ * Override the default edit UI to include new inspector controls for
+ * all the custom styles configs.
+ *
+ * @param {Function} BlockEdit Original component
+ * @return {Function} Wrapped component
+ */
+export const withBlockControls = createHigherOrderComponent(
+ ( BlockEdit ) => ( props ) => {
+ const { name: blockName } = props;
+ const hasTypographySupport = typographySupportKeys.some( ( key ) =>
+ hasBlockSupport( blockName, key )
+ );
+
+ return [
+ Platform.OS === 'web' && hasTypographySupport && (
+
+
+
+
+
+
+ ),
+ ,
+ ,
+ ];
+ },
+ 'withToolbarControls'
+);
+
+addFilter(
+ 'blocks.registerBlockType',
+ 'core/style/addAttribute',
+ addAttribute
+);
+
+addFilter(
+ 'blocks.getSaveContent.extraProps',
+ 'core/style/addSaveProps',
+ addSaveProps
+);
+
+addFilter(
+ 'blocks.registerBlockType',
+ 'core/style/addEditProps',
+ addEditProps
+);
+
+addFilter(
+ 'editor.BlockEdit',
+ 'core/style/with-block-controls',
+ withBlockControls
+);
diff --git a/packages/block-editor/src/hooks/test/color.js b/packages/block-editor/src/hooks/test/color.js
new file mode 100644
index 00000000000000..9c3361ce80c950
--- /dev/null
+++ b/packages/block-editor/src/hooks/test/color.js
@@ -0,0 +1,12 @@
+/**
+ * Internal dependencies
+ */
+import { cleanEmptyObject } from '../utils';
+
+describe( 'cleanEmptyObject', () => {
+ it( 'should remove nested keys', () => {
+ expect( cleanEmptyObject( { color: { text: undefined } } ) ).toEqual(
+ undefined
+ );
+ } );
+} );
diff --git a/packages/block-editor/src/hooks/test/style.js b/packages/block-editor/src/hooks/test/style.js
new file mode 100644
index 00000000000000..533694be7282ed
--- /dev/null
+++ b/packages/block-editor/src/hooks/test/style.js
@@ -0,0 +1,28 @@
+/**
+ * Internal dependencies
+ */
+import { getInlineStyles } from '../style';
+
+describe( 'getInlineStyles', () => {
+ it( 'should return an empty object when called with undefined', () => {
+ expect( getInlineStyles() ).toEqual( {} );
+ } );
+
+ it( 'should ignore unknown styles', () => {
+ expect( getInlineStyles( { color: 'red' } ) ).toEqual( {} );
+ } );
+
+ it( 'should return the correct inline styles', () => {
+ expect(
+ getInlineStyles( {
+ color: { text: 'red', background: 'black' },
+ typography: { lineHeight: 1.5, fontSize: 10 },
+ } )
+ ).toEqual( {
+ backgroundColor: 'black',
+ color: 'red',
+ lineHeight: 1.5,
+ fontSize: 10,
+ } );
+ } );
+} );
diff --git a/packages/block-editor/src/hooks/test/anchor.js b/packages/block-editor/src/hooks/test/utils.js
similarity index 100%
rename from packages/block-editor/src/hooks/test/anchor.js
rename to packages/block-editor/src/hooks/test/utils.js
diff --git a/packages/block-editor/src/hooks/utils.js b/packages/block-editor/src/hooks/utils.js
new file mode 100644
index 00000000000000..dba018f2cfc8aa
--- /dev/null
+++ b/packages/block-editor/src/hooks/utils.js
@@ -0,0 +1,23 @@
+/**
+ * External dependencies
+ */
+import { pickBy, isEqual, isObject, identity, mapValues } from 'lodash';
+
+/**
+ * Removed undefined values from nested object.
+ *
+ * @param {*} object
+ * @return {*} Object cleaned from undefined values
+ */
+export const cleanEmptyObject = ( object ) => {
+ if ( ! isObject( object ) ) {
+ return object;
+ }
+ const cleanedNestedObjects = pickBy(
+ mapValues( object, cleanEmptyObject ),
+ identity
+ );
+ return isEqual( cleanedNestedObjects, {} )
+ ? undefined
+ : cleanedNestedObjects;
+};
diff --git a/packages/block-editor/src/store/actions.js b/packages/block-editor/src/store/actions.js
index a9162f4b6d7728..c59bd31bdd9c6e 100644
--- a/packages/block-editor/src/store/actions.js
+++ b/packages/block-editor/src/store/actions.js
@@ -258,6 +258,9 @@ function getBlocksWithDefaultStylesApplied( blocks, blockEditorSettings ) {
);
return blocks.map( ( block ) => {
const blockName = block.name;
+ if ( ! hasBlockSupport( blockName, 'defaultStylePicker', true ) ) {
+ return block;
+ }
if ( ! preferredStyleVariations[ blockName ] ) {
return block;
}
@@ -785,7 +788,7 @@ export function updateBlockListSettings( clientId, settings ) {
};
}
-/*
+/**
* Returns an action object used in signalling that the block editor settings have been updated.
*
* @param {Object} settings Updated settings
@@ -987,3 +990,17 @@ export function* insertAfterBlock( clientId ) {
);
yield insertDefaultBlock( {}, rootClientId, firstSelectedIndex + 1 );
}
+
+/**
+ * Returns an action object that toggles the highlighted block state.
+ *
+ * @param {string} clientId The block's clientId.
+ * @param {boolean} isHighlighted The highlight state.
+ */
+export function toggleBlockHighlight( clientId, isHighlighted ) {
+ return {
+ type: 'TOGGLE_BLOCK_HIGHLIGHT',
+ clientId,
+ isHighlighted,
+ };
+}
diff --git a/packages/block-editor/src/store/defaults.js b/packages/block-editor/src/store/defaults.js
index 3fbcd61f2e7bdf..3066066e3ea488 100644
--- a/packages/block-editor/src/store/defaults.js
+++ b/packages/block-editor/src/store/defaults.js
@@ -33,7 +33,6 @@ export const PREFERENCES_DEFAULTS = {
* @property {boolean} __experimentalBlockDirectory Whether the user has enabled the Block Directory
* @property {boolean} __experimentalEnableFullSiteEditing Whether the user has enabled Full Site Editing
* @property {boolean} __experimentalEnableFullSiteEditingDemo Whether the user has enabled Full Site Editing Demo Templates
- * @property {boolean} __mobileEnablePageTemplates Whether the user has enabled the Page Templates
*/
export const SETTINGS_DEFAULTS = {
alignWide: false,
diff --git a/packages/block-editor/src/store/effects.js b/packages/block-editor/src/store/effects.js
index b01e37b1e76dd8..5142020ffffa1e 100644
--- a/packages/block-editor/src/store/effects.js
+++ b/packages/block-editor/src/store/effects.js
@@ -223,9 +223,9 @@ export default {
MULTI_SELECT: ( action, { getState } ) => {
const blockCount = getSelectedBlockCount( getState() );
- /* translators: %s: number of selected blocks */
speak(
sprintf(
+ /* translators: %s: number of selected blocks */
_n( '%s block selected.', '%s blocks selected.', blockCount ),
blockCount
),
diff --git a/packages/block-editor/src/store/reducer.js b/packages/block-editor/src/store/reducer.js
index 1027890f2d8eca..78e405a528f5ad 100644
--- a/packages/block-editor/src/store/reducer.js
+++ b/packages/block-editor/src/store/reducer.js
@@ -1448,6 +1448,28 @@ export function automaticChangeStatus( state, action ) {
// Reset the state by default (for any action not handled).
}
+/**
+ * Reducer returning current highlighted block.
+ *
+ * @param {boolean} state Current highlighted block.
+ * @param {Object} action Dispatched action.
+ *
+ * @return {string} Updated state.
+ */
+export function highlightedBlock( state, action ) {
+ const { clientId, isHighlighted } = action;
+
+ if ( action.type === 'TOGGLE_BLOCK_HIGHLIGHT' ) {
+ if ( isHighlighted ) {
+ return clientId;
+ } else if ( state === clientId ) {
+ return null;
+ }
+ }
+
+ return state;
+}
+
export default combineReducers( {
blocks,
isTyping,
@@ -1467,4 +1489,5 @@ export default combineReducers( {
lastBlockAttributesChange,
isNavigationMode,
automaticChangeStatus,
+ highlightedBlock,
} );
diff --git a/packages/block-editor/src/store/selectors.js b/packages/block-editor/src/store/selectors.js
index 52be22ab843fee..fc9dd38979294b 100644
--- a/packages/block-editor/src/store/selectors.js
+++ b/packages/block-editor/src/store/selectors.js
@@ -1621,3 +1621,15 @@ export function isNavigationMode( state ) {
export function didAutomaticChange( state ) {
return !! state.automaticChangeStatus;
}
+
+/**
+ * Returns true if the current highlighted block matches the block clientId.
+ *
+ * @param {Object} state Global application state.
+ * @param {string} clientId The block to check.
+ *
+ * @return {boolean} Whether the block is currently highlighted.
+ */
+export function isBlockHighlighted( state, clientId ) {
+ return state.highlightedBlock === clientId;
+}
diff --git a/packages/block-editor/src/style.scss b/packages/block-editor/src/style.scss
index 14030fb1b1fa58..ba14cf1e346cbd 100644
--- a/packages/block-editor/src/style.scss
+++ b/packages/block-editor/src/style.scss
@@ -5,6 +5,7 @@
// Only add styles for components that are used inside the editing canvas here:
+@import "./autocompleters/style.scss";
@import "./components/block-icon/style.scss";
@import "./components/block-inspector/style.scss";
@import "./components/block-list/style.scss";
@@ -15,7 +16,6 @@
@import "./components/block-mobile-toolbar/style.scss";
@import "./components/block-mover/style.scss";
@import "./components/block-navigation/style.scss";
-@import "./components/block-patterns/style.scss";
@import "./components/block-preview/style.scss";
@import "./components/block-settings-menu/style.scss";
@import "./components/block-styles/style.scss";
@@ -27,6 +27,7 @@
@import "./components/contrast-checker/style.scss";
@import "./components/default-block-appender/style.scss";
@import "./components/link-control/style.scss";
+@import "./components/line-height-control/style.scss";
@import "./components/image-size-control/style.scss";
@import "./components/inner-blocks/style.scss";
@import "./components/inserter-list-item/style.scss";
@@ -53,6 +54,5 @@
// Styles for components that are used outside of the editing canvas go here:
@import "./components/block-toolbar/style.scss";
-@import "./components/editor-skeleton/style.scss";
@import "./components/inserter/style.scss";
diff --git a/packages/block-editor/src/utils/dom.js b/packages/block-editor/src/utils/dom.js
index 1ea7c881b494df..8234fb127f67ae 100644
--- a/packages/block-editor/src/utils/dom.js
+++ b/packages/block-editor/src/utils/dom.js
@@ -4,14 +4,21 @@
* in cases where isolated behaviors need remote access to a block node.
*
* @param {string} clientId Block client ID.
- * @param {Element} scope an optional DOM Element to which the selector should be scoped
*
- * @return {Element} Block DOM node.
+ * @return {Element?} Block DOM node.
*/
export function getBlockDOMNode( clientId ) {
return document.getElementById( 'block-' + clientId );
}
+/**
+ * Returns the preview container DOM node for a given block client ID, or
+ * undefined if the container cannot be determined.
+ *
+ * @param {string} clientId Block client ID.
+ *
+ * @return {Node|undefined} Preview container DOM node.
+ */
export function getBlockPreviewContainerDOMNode( clientId ) {
const domNode = getBlockDOMNode( clientId );
@@ -23,10 +30,10 @@ export function getBlockPreviewContainerDOMNode( clientId ) {
}
/**
- * Returns true if the given HTMLElement is a block focus stop. Blocks without
- * their own text fields rely on the focus stop to be keyboard navigable.
+ * Returns true if the given element is a block focus stop. Blocks without their
+ * own text fields rely on the focus stop to be keyboard navigable.
*
- * @param {HTMLElement} element Element to test.
+ * @param {Element} element Element to test.
*
* @return {boolean} Whether element is a block focus stop.
*/
@@ -37,8 +44,8 @@ export function isBlockFocusStop( element ) {
/**
* Returns true if two elements are contained within the same block.
*
- * @param {HTMLElement} a First element.
- * @param {HTMLElement} b Second element.
+ * @param {Element} a First element.
+ * @param {Element} b Second element.
*
* @return {boolean} Whether elements are in the same block.
*/
@@ -50,28 +57,25 @@ export function isInSameBlock( a, b ) {
}
/**
- * Returns true if an elements is considered part of the block and not its children.
+ * Returns true if an element is considered part of the block and not its
+ * children.
*
- * @param {HTMLElement} blockElement Block container element.
- * @param {HTMLElement} element Element.
+ * @param {Element} blockElement Block container element.
+ * @param {Element} element Element.
*
- * @return {boolean} Whether element is in the block Element but not its children.
+ * @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 parentBlock = element.closest( '.block-editor-block-list__block' );
+ return parentBlock === blockElement;
}
/**
- * Returns true if the given HTMLElement contains inner blocks (an InnerBlocks
+ * Returns true if the given element contains inner blocks (an InnerBlocks
* element).
*
- * @param {HTMLElement} element Element to test.
+ * @param {Element} element Element to test.
*
* @return {boolean} Whether element contains inner blocks.
*/
@@ -85,16 +89,22 @@ export function hasInnerBlocksContext( element ) {
/**
* Finds the block client ID given any DOM node inside the block.
*
- * @param {Node} node DOM node.
+ * @param {Node?} node DOM node.
*
- * @return {string|undefined} Client ID or undefined if the node is not part of a block.
+ * @return {string|undefined} Client ID or undefined if the node is not part of
+ * a block.
*/
export function getBlockClientId( node ) {
- if ( node.nodeType !== node.ELEMENT_NODE ) {
- node = node.parentElement;
+ while ( node && node.nodeType !== window.Node.ELEMENT_NODE ) {
+ node = node.parentNode;
+ }
+
+ if ( ! node ) {
+ return;
}
- const blockNode = node.closest( '.block-editor-block-list__block' );
+ const elementNode = /** @type {Element} */ ( node );
+ const blockNode = elementNode.closest( '.block-editor-block-list__block' );
if ( ! blockNode ) {
return;
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 4e0d07e4083d74..e74559515adaf4 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
@@ -1,8 +1,3 @@
-/**
- * External dependencies
- */
-import { parse, resolve } from 'url';
-
/**
* Return `true` if the given path is http/https.
*
@@ -62,10 +57,7 @@ function isValidURL( meta ) {
* @return {string} the full path to the file
*/
function getResourcePath( str, baseURL ) {
- const pathname = parse( str ).pathname;
- const filePath = resolve( baseURL, pathname );
-
- return filePath;
+ return new URL( str, baseURL ).toString();
}
/**
diff --git a/packages/block-editor/tsconfig.json b/packages/block-editor/tsconfig.json
new file mode 100644
index 00000000000000..7cd3fd793fcbc7
--- /dev/null
+++ b/packages/block-editor/tsconfig.json
@@ -0,0 +1,13 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "declarationDir": "build-types"
+ },
+ // NOTE: This package is being progressively typed. You are encouraged to
+ // expand this array with files which can be type-checked. At some point in
+ // the future, this can be simplified to an `includes` of `src/**/*`.
+ "files": [
+ "src/utils/dom.js"
+ ]
+}
diff --git a/packages/block-library/package.json b/packages/block-library/package.json
index 68acaac0d89555..f2fc25a0b1b398 100644
--- a/packages/block-library/package.json
+++ b/packages/block-library/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/block-library",
- "version": "2.14.3",
+ "version": "2.16.1",
"description": "Block library for the WordPress editor.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -24,7 +24,7 @@
"build-style/**"
],
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/a11y": "file:../a11y",
"@wordpress/api-fetch": "file:../api-fetch",
"@wordpress/autop": "file:../autop",
@@ -53,10 +53,9 @@
"classnames": "^2.2.5",
"fast-average-color": "4.3.0",
"lodash": "^4.17.15",
- "memize": "^1.0.5",
+ "memize": "^1.1.0",
"moment": "^2.22.1",
- "tinycolor2": "^1.4.1",
- "url": "^0.11.0"
+ "tinycolor2": "^1.4.1"
},
"publishConfig": {
"access": "public"
diff --git a/packages/block-library/src/block/edit-panel/editor.scss b/packages/block-library/src/block/edit-panel/editor.scss
index dcaceb1f64e7d1..0537c7d0523474 100644
--- a/packages/block-library/src/block/edit-panel/editor.scss
+++ b/packages/block-library/src/block/edit-panel/editor.scss
@@ -48,11 +48,9 @@
}
.is-navigate-mode .is-selected .reusable-block-edit-panel {
- border-color: $blue-medium-focus;
- border-style: solid;
- border-bottom: 0;
+ box-shadow: 0 0 0 $border-width $blue-medium-focus;
.is-dark-theme & {
- border-color: $blue-medium-focus;
+ box-shadow: 0 0 0 $border-width $blue-medium-focus;
}
}
diff --git a/packages/block-library/src/block/editor.scss b/packages/block-library/src/block/editor.scss
index 516b41feb52776..6fba5c19b5309d 100644
--- a/packages/block-library/src/block/editor.scss
+++ b/packages/block-library/src/block/editor.scss
@@ -1,3 +1,16 @@
-.edit-post-visual-editor .block-library-block__reusable-block-container .block-editor-writing-flow__click-redirect {
- min-height: auto;
+.edit-post-visual-editor .block-library-block__reusable-block-container {
+ .block-editor-writing-flow__click-redirect {
+ min-height: auto;
+ }
+
+ // Unset the padding that root containers get when they're actually root containers.
+ .is-root-container {
+ padding-left: 0;
+ padding-right: 0;
+ }
+
+ // Allow vertical paddings to collapse to better fit the flow.
+ .block-editor-writing-flow {
+ display: block;
+ }
}
diff --git a/packages/block-library/src/block/index.js b/packages/block-library/src/block/index.js
index 585333c696a6f5..f1c350fb16d040 100644
--- a/packages/block-library/src/block/index.js
+++ b/packages/block-library/src/block/index.js
@@ -14,7 +14,7 @@ export const settings = {
title: __( 'Reusable Block' ),
category: 'reusable',
description: __(
- 'Create content, and save it for you and other contributors to reuse across your site. Update the block, and the changes apply everywhere it’s used.'
+ 'Create and save content to reuse across your site. Update the block, and the changes apply everywhere it’s used.'
),
supports: {
customClassName: false,
diff --git a/packages/block-library/src/button/block.json b/packages/block-library/src/button/block.json
index bc35b9ff5ee32e..6bd96a3edd4da3 100644
--- a/packages/block-library/src/button/block.json
+++ b/packages/block-library/src/button/block.json
@@ -19,18 +19,6 @@
"source": "html",
"selector": "a"
},
- "backgroundColor": {
- "type": "string"
- },
- "textColor": {
- "type": "string"
- },
- "customBackgroundColor": {
- "type": "string"
- },
- "customTextColor": {
- "type": "string"
- },
"linkTarget": {
"type": "string",
"source": "attribute",
@@ -48,12 +36,6 @@
},
"borderRadius": {
"type": "number"
- },
- "gradient": {
- "type": "string"
- },
- "customGradient": {
- "type": "string"
}
}
}
diff --git a/packages/block-library/src/button/deprecated.js b/packages/block-library/src/button/deprecated.js
index 18045aa562c00a..e0915201a0b2a3 100644
--- a/packages/block-library/src/button/deprecated.js
+++ b/packages/block-library/src/button/deprecated.js
@@ -7,22 +7,56 @@ import classnames from 'classnames';
/**
* WordPress dependencies
*/
-import { RichText, getColorClassName } from '@wordpress/block-editor';
+import {
+ RichText,
+ getColorClassName,
+ __experimentalGetGradientClass,
+} from '@wordpress/block-editor';
-const colorsMigration = ( attributes ) => {
- return omit(
- {
- ...attributes,
- customTextColor:
- attributes.textColor && '#' === attributes.textColor[ 0 ]
- ? attributes.textColor
- : undefined,
- customBackgroundColor:
- attributes.color && '#' === attributes.color[ 0 ]
- ? attributes.color
- : undefined,
- },
- [ 'color', 'textColor' ]
+const migrateCustomColorsAndGradients = ( attributes ) => {
+ if (
+ ! attributes.customTextColor &&
+ ! attributes.customBackgroundColor &&
+ ! attributes.customGradient
+ ) {
+ return attributes;
+ }
+ const style = { color: {} };
+ if ( attributes.customTextColor ) {
+ style.color.text = attributes.customTextColor;
+ }
+ if ( attributes.customBackgroundColor ) {
+ style.color.background = attributes.customBackgroundColor;
+ }
+ if ( attributes.customGradient ) {
+ style.color.gradient = attributes.customGradient;
+ }
+ return {
+ ...omit( attributes, [
+ 'customTextColor',
+ 'customBackgroundColor',
+ 'customGradient',
+ ] ),
+ style,
+ };
+};
+
+const oldColorsMigration = ( attributes ) => {
+ return migrateCustomColorsAndGradients(
+ omit(
+ {
+ ...attributes,
+ customTextColor:
+ attributes.textColor && '#' === attributes.textColor[ 0 ]
+ ? attributes.textColor
+ : undefined,
+ customBackgroundColor:
+ attributes.color && '#' === attributes.color[ 0 ]
+ ? attributes.color
+ : undefined,
+ },
+ [ 'color', 'textColor' ]
+ )
);
};
@@ -47,6 +81,116 @@ const blockAttributes = {
};
const deprecated = [
+ {
+ supports: {
+ align: true,
+ alignWide: false,
+ },
+ attributes: {
+ ...blockAttributes,
+ linkTarget: {
+ type: 'string',
+ source: 'attribute',
+ selector: 'a',
+ attribute: 'target',
+ },
+ rel: {
+ type: 'string',
+ source: 'attribute',
+ selector: 'a',
+ attribute: 'rel',
+ },
+ placeholder: {
+ type: 'string',
+ },
+ borderRadius: {
+ type: 'number',
+ },
+ backgroundColor: {
+ type: 'string',
+ },
+ textColor: {
+ type: 'string',
+ },
+ customBackgroundColor: {
+ type: 'string',
+ },
+ customTextColor: {
+ type: 'string',
+ },
+ customGradient: {
+ type: 'string',
+ },
+ gradient: {
+ type: 'string',
+ },
+ },
+ migrate: migrateCustomColorsAndGradients,
+ save( { attributes } ) {
+ const {
+ backgroundColor,
+ borderRadius,
+ customBackgroundColor,
+ customTextColor,
+ customGradient,
+ linkTarget,
+ gradient,
+ rel,
+ text,
+ textColor,
+ title,
+ url,
+ } = attributes;
+
+ const textClass = getColorClassName( 'color', textColor );
+ const backgroundClass =
+ ! customGradient &&
+ getColorClassName( 'background-color', backgroundColor );
+ const gradientClass = __experimentalGetGradientClass( gradient );
+
+ const buttonClasses = classnames( 'wp-block-button__link', {
+ 'has-text-color': textColor || customTextColor,
+ [ textClass ]: textClass,
+ 'has-background':
+ backgroundColor ||
+ customBackgroundColor ||
+ customGradient ||
+ gradient,
+ [ backgroundClass ]: backgroundClass,
+ 'no-border-radius': borderRadius === 0,
+ [ gradientClass ]: gradientClass,
+ } );
+
+ const buttonStyle = {
+ background: customGradient ? customGradient : undefined,
+ backgroundColor:
+ backgroundClass || customGradient || gradient
+ ? undefined
+ : customBackgroundColor,
+ color: textClass ? undefined : customTextColor,
+ borderRadius: borderRadius ? borderRadius + 'px' : undefined,
+ };
+
+ // The use of a `title` attribute here is soft-deprecated, but still applied
+ // if it had already been assigned, for the sake of backward-compatibility.
+ // A title will no longer be assigned for new or updated button block links.
+
+ return (
+
+
+
+ );
+ },
+ },
{
attributes: {
...blockAttributes,
@@ -95,11 +239,11 @@ const deprecated = [
.replace( /is-style-squared[\s]?/, '' )
.trim();
}
- return {
+ return migrateCustomColorsAndGradients( {
...attributes,
className: newClassName ? newClassName : undefined,
borderRadius: 0,
- };
+ } );
},
save( { attributes } ) {
const {
@@ -170,6 +314,7 @@ const deprecated = [
type: 'string',
},
},
+ migrate: oldColorsMigration,
save( { attributes } ) {
const {
url,
@@ -214,7 +359,6 @@ const deprecated = [
);
},
- migrate: colorsMigration,
},
{
attributes: {
@@ -253,7 +397,7 @@ const deprecated = [
);
},
- migrate: colorsMigration,
+ migrate: oldColorsMigration,
},
{
attributes: {
@@ -287,7 +431,7 @@ const deprecated = [
);
},
- migrate: colorsMigration,
+ migrate: oldColorsMigration,
},
];
diff --git a/packages/block-library/src/button/edit.js b/packages/block-library/src/button/edit.js
index a7e33c4c3430d2..38b5b43f96d684 100644
--- a/packages/block-library/src/button/edit.js
+++ b/packages/block-library/src/button/edit.js
@@ -8,54 +8,26 @@ import classnames from 'classnames';
*/
import { __ } from '@wordpress/i18n';
import { useCallback, useState } from '@wordpress/element';
-import { compose } from '@wordpress/compose';
import {
KeyboardShortcuts,
PanelBody,
RangeControl,
TextControl,
ToggleControl,
- withFallbackStyles,
ToolbarButton,
ToolbarGroup,
Popover,
} from '@wordpress/components';
import {
BlockControls,
- __experimentalUseGradient,
- ContrastChecker,
InspectorControls,
- __experimentalPanelColorGradientSettings as PanelColorGradientSettings,
RichText,
- withColors,
+ __experimentalBlock as Block,
__experimentalLinkControl as LinkControl,
} from '@wordpress/block-editor';
import { rawShortcut, displayShortcut } from '@wordpress/keycodes';
import { link } from '@wordpress/icons';
-const { getComputedStyle } = window;
-
-const applyFallbackStyles = withFallbackStyles( ( node, ownProps ) => {
- const { textColor, backgroundColor } = ownProps;
- const backgroundColorValue = backgroundColor && backgroundColor.color;
- const textColorValue = textColor && textColor.color;
- //avoid the use of querySelector if textColor color is known and verify if node is available.
- const textNode =
- ! textColorValue && node
- ? node.querySelector( '[contenteditable="true"]' )
- : null;
- return {
- fallbackBackgroundColor:
- backgroundColorValue || ! node
- ? undefined
- : getComputedStyle( node ).backgroundColor,
- fallbackTextColor:
- textColorValue || ! textNode
- ? undefined
- : getComputedStyle( textNode ).color,
- };
-} );
-
const NEW_TAB_REL = 'noreferrer noopener';
const MIN_BORDER_RADIUS_VALUE = 0;
const MAX_BORDER_RADIUS_VALUE = 50;
@@ -141,18 +113,7 @@ function URLPicker( {
);
}
-function ButtonEdit( {
- attributes,
- backgroundColor,
- textColor,
- setBackgroundColor,
- setTextColor,
- fallbackBackgroundColor,
- fallbackTextColor,
- setAttributes,
- className,
- isSelected,
-} ) {
+function ButtonEdit( { attributes, setAttributes, className, isSelected } ) {
const {
borderRadius,
linkTarget,
@@ -186,33 +147,19 @@ function ButtonEdit( {
},
[ rel, setAttributes ]
);
- const {
- gradientClass,
- gradientValue,
- setGradient,
- } = __experimentalUseGradient();
return (
-
+ <>
setAttributes( { text: value } ) }
withoutInteractiveFormatting
- className={ classnames( 'wp-block-button__link', {
- 'has-background': backgroundColor.color || gradientValue,
- [ backgroundColor.class ]:
- ! gradientValue && backgroundColor.class,
- 'has-text-color': textColor.color,
- [ textColor.class ]: textColor.class,
- [ gradientClass ]: gradientClass,
+ className={ classnames( className, 'wp-block-button__link', {
'no-border-radius': borderRadius === 0,
} ) }
style={ {
- ...( ! backgroundColor.color && gradientValue
- ? { background: gradientValue }
- : { backgroundColor: backgroundColor.color } ),
- color: textColor.color,
borderRadius: borderRadius
? borderRadius + 'px'
: undefined,
@@ -226,35 +173,6 @@ function ButtonEdit( {
onToggleOpenInNewTab={ onToggleOpenInNewTab }
/>
-
-
-
-
+ >
);
}
-export default compose( [
- withColors( 'backgroundColor', { textColor: 'color' } ),
- applyFallbackStyles,
-] )( ButtonEdit );
+export default ButtonEdit;
diff --git a/packages/block-library/src/button/edit.native.js b/packages/block-library/src/button/edit.native.js
index be1215a9cdbca0..d772e4b307b394 100644
--- a/packages/block-library/src/button/edit.native.js
+++ b/packages/block-library/src/button/edit.native.js
@@ -24,7 +24,7 @@ import {
BottomSheet,
} from '@wordpress/components';
import { Component } from '@wordpress/element';
-import { withSelect } from '@wordpress/data';
+import { withSelect, withDispatch } from '@wordpress/data';
import { isURL, prependHTTP } from '@wordpress/url';
import { link, external } from '@wordpress/icons';
@@ -52,8 +52,10 @@ class ButtonEdit extends Component {
this.onChangeURL = this.onChangeURL.bind( this );
this.onClearSettings = this.onClearSettings.bind( this );
this.onLayout = this.onLayout.bind( this );
+ this.dismissSheet = this.dismissSheet.bind( this );
this.getURLFromClipboard = this.getURLFromClipboard.bind( this );
- this.onToggleLinkSettings = this.onToggleLinkSettings.bind( this );
+ this.onShowLinkSettings = this.onShowLinkSettings.bind( this );
+ this.onHideLinkSettings = this.onHideLinkSettings.bind( this );
this.onToggleButtonFocus = this.onToggleButtonFocus.bind( this );
this.setRef = this.setRef.bind( this );
@@ -150,12 +152,25 @@ class ButtonEdit extends Component {
}
getBackgroundColor() {
- const { backgroundColor } = this.props;
- if ( backgroundColor.color ) {
- // `backgroundColor` which should be set when we are able to resolve it
- return backgroundColor.color;
- }
- return styles.fallbackButton.backgroundColor;
+ const { backgroundColor, attributes } = this.props;
+ const { style } = attributes;
+
+ return (
+ ( style && style.color && style.color.background ) ||
+ backgroundColor.color ||
+ styles.fallbackButton.backgroundColor
+ );
+ }
+
+ getTextColor() {
+ const { textColor, attributes } = this.props;
+ const { style } = attributes;
+
+ return (
+ ( style && style.color && style.color.text ) ||
+ textColor.color ||
+ styles.fallbackButton.color
+ );
}
onChangeText( value ) {
@@ -200,9 +215,12 @@ class ButtonEdit extends Component {
} );
}
- onToggleLinkSettings() {
- const { isLinkSheetVisible } = this.state;
- this.setState( { isLinkSheetVisible: ! isLinkSheetVisible } );
+ onShowLinkSettings() {
+ this.setState( { isLinkSheetVisible: true } );
+ }
+
+ onHideLinkSettings() {
+ this.setState( { isLinkSheetVisible: false } );
}
onToggleButtonFocus( value ) {
@@ -228,6 +246,13 @@ class ButtonEdit extends Component {
this.setState( { maxWidth: width - buttonSpacing } );
}
+ dismissSheet() {
+ this.setState( {
+ isLinkSheetVisible: false,
+ } );
+ this.props.closeSettingsBottomSheet();
+ }
+
getLinkSettings( url, rel, linkTarget, isCompatibleWithSettings ) {
return (
<>
@@ -237,6 +262,7 @@ class ButtonEdit extends Component {
value={ url || '' }
valuePlaceholder={ __( 'Add URL' ) }
onChange={ this.onChangeURL }
+ onSubmit={ this.dismissSheet }
autoCapitalize="none"
autoCorrect={ false }
// eslint-disable-next-line jsx-a11y/no-autofocus
@@ -263,6 +289,7 @@ class ButtonEdit extends Component {
value={ rel || '' }
valuePlaceholder={ __( 'None' ) }
onChange={ this.onChangeLinkRel }
+ onSubmit={ this.dismissSheet }
autoCapitalize="none"
autoCorrect={ false }
separatorType={
@@ -279,13 +306,7 @@ class ButtonEdit extends Component {
}
render() {
- const {
- attributes,
- textColor,
- isSelected,
- clientId,
- onReplace,
- } = this.props;
+ const { attributes, isSelected, clientId, onReplace } = this.props;
const {
placeholder,
text,
@@ -351,7 +372,7 @@ class ButtonEdit extends Component {
onChange={ this.onChangeText }
style={ {
...richTextStyle.richText,
- color: textColor.color || '#fff',
+ color: this.getTextColor(),
} }
textAlign="center"
placeholderTextColor={
@@ -368,7 +389,7 @@ class ButtonEdit extends Component {
this.onToggleButtonFocus( true )
}
__unstableMobileNoFocusOnMount={ ! isSelected }
- selectionColor={ textColor.color || '#fff' }
+ selectionColor={ this.getTextColor() }
onReplace={ onReplace }
onRemove={ () => onReplace( [] ) }
/>
@@ -378,9 +399,9 @@ class ButtonEdit extends Component {
@@ -389,7 +410,7 @@ class ButtonEdit extends Component {
{ this.getLinkSettings( url, rel, linkTarget ) }
@@ -447,4 +468,11 @@ export default compose( [
hasParents,
};
} ),
+ withDispatch( ( dispatch ) => {
+ return {
+ closeSettingsBottomSheet() {
+ dispatch( 'core/edit-post' ).closeGeneralSidebar();
+ },
+ };
+ } ),
] )( ButtonEdit );
diff --git a/packages/block-library/src/button/editor.native.scss b/packages/block-library/src/button/editor.native.scss
index ef2e1a54b69519..16dff6478dc350 100644
--- a/packages/block-library/src/button/editor.native.scss
+++ b/packages/block-library/src/button/editor.native.scss
@@ -30,6 +30,7 @@
.fallbackButton {
background-color: $button-fallback-bg;
+ color: $white;
}
.clearLinkButton {
diff --git a/packages/block-library/src/button/editor.scss b/packages/block-library/src/button/editor.scss
index db005f644042ce..efed2d4910b1a1 100644
--- a/packages/block-library/src/button/editor.scss
+++ b/packages/block-library/src/button/editor.scss
@@ -13,10 +13,7 @@
.wp-block-button {
position: relative;
-
- [contenteditable] {
- cursor: text;
- }
+ cursor: text;
// Make placeholder text white unless custom colors or outline versions are chosen.
&:not(.has-text-color):not(.is-style-outline) [data-rich-text-placeholder]::after {
@@ -24,7 +21,7 @@
}
// Add outline to button on focus to indicate focus-state
- .block-editor-rich-text__editable:focus {
+ &:focus {
box-shadow: 0 0 0 1px $white, 0 0 0 3px $blue-medium-500;
// Windows' High Contrast mode will show this outline, but not the box-shadow.
@@ -33,7 +30,7 @@
}
// Increase placeholder opacity to meet contrast ratios.
- [data-rich-text-placeholder]::after {
+ &[data-rich-text-placeholder]::after {
opacity: 0.8;
}
}
diff --git a/packages/block-library/src/button/index.js b/packages/block-library/src/button/index.js
index c74cf4ed4beda2..fab563649938fb 100644
--- a/packages/block-library/src/button/index.js
+++ b/packages/block-library/src/button/index.js
@@ -33,6 +33,9 @@ export const settings = {
supports: {
align: true,
alignWide: false,
+ reusable: false,
+ lightBlockWrapper: true,
+ __experimentalColor: { gradients: true },
},
parent: [ 'core/buttons' ],
styles: [
diff --git a/packages/block-library/src/button/save.js b/packages/block-library/src/button/save.js
index 542222f49e98c2..6a7aeb8088c1a7 100644
--- a/packages/block-library/src/button/save.js
+++ b/packages/block-library/src/button/save.js
@@ -6,54 +6,16 @@ import classnames from 'classnames';
/**
* WordPress dependencies
*/
-import {
- RichText,
- getColorClassName,
- __experimentalGetGradientClass,
-} from '@wordpress/block-editor';
+import { RichText } from '@wordpress/block-editor';
export default function save( { attributes } ) {
- const {
- backgroundColor,
- borderRadius,
- customBackgroundColor,
- customTextColor,
- customGradient,
- linkTarget,
- gradient,
- rel,
- text,
- textColor,
- title,
- url,
- } = attributes;
-
- const textClass = getColorClassName( 'color', textColor );
- const backgroundClass =
- ! customGradient &&
- getColorClassName( 'background-color', backgroundColor );
- const gradientClass = __experimentalGetGradientClass( gradient );
+ const { borderRadius, linkTarget, rel, text, title, url } = attributes;
const buttonClasses = classnames( 'wp-block-button__link', {
- 'has-text-color': textColor || customTextColor,
- [ textClass ]: textClass,
- 'has-background':
- backgroundColor ||
- customBackgroundColor ||
- customGradient ||
- gradient,
- [ backgroundClass ]: backgroundClass,
'no-border-radius': borderRadius === 0,
- [ gradientClass ]: gradientClass,
} );
const buttonStyle = {
- background: customGradient ? customGradient : undefined,
- backgroundColor:
- backgroundClass || customGradient || gradient
- ? undefined
- : customBackgroundColor,
- color: textClass ? undefined : customTextColor,
borderRadius: borderRadius ? borderRadius + 'px' : undefined,
};
@@ -62,17 +24,15 @@ export default function save( { attributes } ) {
// A title will no longer be assigned for new or updated button block links.
return (
-
-
-
+
);
}
diff --git a/packages/block-library/src/button/style.scss b/packages/block-library/src/button/style.scss
index 7bbe8900b8dc29..40f44b71ace52b 100644
--- a/packages/block-library/src/button/style.scss
+++ b/packages/block-library/src/button/style.scss
@@ -1,24 +1,13 @@
$blocks-button__height: 56px;
-.wp-block-button {
- color: $white;
-
- &.aligncenter {
- text-align: center;
- }
-
- &.alignright {
- /*rtl:ignore*/
- text-align: right;
- }
-}
-
+// Prefer the link selector instead of the regular button classname
+// to support the previous markup in addition to the new one.
.wp-block-button__link {
+ color: $white;
background-color: $dark-gray-700;
border: none;
border-radius: $blocks-button__height / 2;
box-shadow: none;
- color: inherit;
cursor: pointer;
display: inline-block;
font-size: $big-font-size;
@@ -32,26 +21,36 @@ $blocks-button__height: 56px;
&:focus,
&:active,
&:visited {
- color: inherit;
+ color: $white;
}
-}
-.wp-gs .wp-block-button__link:not(.has-background) {
- background-color: var(--wp--color--primary);
+ &.aligncenter {
+ text-align: center;
+ }
+
+ &.alignright {
+ /*rtl:ignore*/
+ text-align: right;
+ }
}
-.is-style-squared .wp-block-button__link {
+// the first selector is required for old buttons markup
+.wp-block-button.is-style-squared,
+.wp-block-button__link.wp-block-button.is-style-squared {
border-radius: 0;
}
-.no-border-radius.wp-block-button__link {
+
+
+// the first selector is required for old buttons markup
+
+.wp-block-button.no-border-radius,
+.wp-block-button__link.wp-block-button.no-border-radius {
border-radius: 0 !important;
}
-.is-style-outline {
+.wp-block-button.is-style-outline,
+.wp-block-button__link.is-style-outline {
color: $dark-gray-700;
-
- .wp-block-button__link {
- background-color: transparent;
- border: 2px solid;
- }
+ background-color: transparent;
+ border: 2px solid;
}
diff --git a/packages/block-library/src/buttons/edit.js b/packages/block-library/src/buttons/edit.js
index 15590ca49e713b..d9b76ed8f1bcb6 100644
--- a/packages/block-library/src/buttons/edit.js
+++ b/packages/block-library/src/buttons/edit.js
@@ -13,9 +13,6 @@ import { name as buttonBlockName } from '../button/';
const ALLOWED_BLOCKS = [ buttonBlockName ];
const BUTTONS_TEMPLATE = [ [ 'core/button' ] ];
-const UI_PARTS = {
- hasSelectedUI: false,
-};
// Inside buttons block alignment options are not supported.
const alignmentHooksSetting = {
@@ -29,7 +26,6 @@ function ButtonsEdit( { className } ) {
diff --git a/packages/block-library/src/buttons/style.scss b/packages/block-library/src/buttons/style.scss
index f82a5191316863..3d4843d5ca3e9b 100644
--- a/packages/block-library/src/buttons/style.scss
+++ b/packages/block-library/src/buttons/style.scss
@@ -1,7 +1,15 @@
-.wp-block-buttons .wp-block-button {
+// Increased specificity to override blocks default margin.
+.wp-block-buttons .wp-block-button.wp-block-button {
display: inline-block;
- margin: $grid-unit-05;
+ margin-right: $grid-unit-10;
+ margin-bottom: $grid-unit-10;
}
+
+.wp-block-buttons.alignright .wp-block-button {
+ margin-right: none;
+ margin-left: $grid-unit-10;
+}
+
.wp-block-buttons.aligncenter {
text-align: center;
}
diff --git a/packages/block-library/src/categories/edit.js b/packages/block-library/src/categories/edit.js
index 7fb05234a6743f..b17f3007b4329d 100644
--- a/packages/block-library/src/categories/edit.js
+++ b/packages/block-library/src/categories/edit.js
@@ -11,6 +11,7 @@ import {
Placeholder,
Spinner,
ToggleControl,
+ VisuallyHidden,
} from '@wordpress/components';
import { compose, withInstanceId } from '@wordpress/compose';
import { withSelect } from '@wordpress/data';
@@ -136,9 +137,9 @@ class CategoriesEdit extends Component {
const selectId = `blocks-category-select-${ instanceId }`;
return (
<>
-
+
{ __( 'Categories' ) }
-
+
+
setAttributes( { content } ) }
placeholder={ __( 'Write code…' ) }
aria-label={ __( 'Code' ) }
/>
-
+
);
}
diff --git a/packages/block-library/src/code/editor.scss b/packages/block-library/src/code/editor.scss
index 5a4d5ee76e1acc..bc47a4f35ee9da 100644
--- a/packages/block-library/src/code/editor.scss
+++ b/packages/block-library/src/code/editor.scss
@@ -1,14 +1,4 @@
-.wp-block-code .block-editor-plain-text {
- font-family: $editor-html-font;
- color: $dark-gray-800;
-
- /* Fonts smaller than 16px causes mobile safari to zoom. */
- font-size: $mobile-text-min-font-size;
- @include break-small {
- font-size: $default-font-size;
- }
-
- &:focus {
- box-shadow: none;
- }
+.wp-block-code > code {
+ // PlainText cannot be an inline element yet.
+ display: block;
}
diff --git a/packages/block-library/src/code/index.js b/packages/block-library/src/code/index.js
index 65506cfcdfc5d7..ce07ea4e3e98ad 100644
--- a/packages/block-library/src/code/index.js
+++ b/packages/block-library/src/code/index.js
@@ -24,14 +24,17 @@ export const settings = {
icon,
example: {
attributes: {
+ /* eslint-disable @wordpress/i18n-no-collapsible-whitespace */
// translators: Preserve \n markers for line breaks
content: __(
'// A "block" is the abstract term used\n// to describe units of markup that\n// when composed together, form the\n// content or layout of a page.\nregisterBlockType( name, settings );'
),
+ /* eslint-enable @wordpress/i18n-no-collapsible-whitespace */
},
},
supports: {
html: false,
+ lightBlockWrapper: true,
},
transforms,
edit,
diff --git a/packages/block-library/src/column/edit.js b/packages/block-library/src/column/edit.js
index 1760c0da4b75d4..1664bff4ffeb59 100644
--- a/packages/block-library/src/column/edit.js
+++ b/packages/block-library/src/column/edit.js
@@ -63,7 +63,7 @@ function ColumnEdit( {
templateLock={ false }
renderAppender={
hasChildBlocks
- ? false
+ ? undefined
: () =>
}
__experimentalTagName={ Block.div }
diff --git a/packages/block-library/src/column/edit.native.js b/packages/block-library/src/column/edit.native.js
new file mode 100644
index 00000000000000..70d519ca2e78c6
--- /dev/null
+++ b/packages/block-library/src/column/edit.native.js
@@ -0,0 +1,118 @@
+/**
+ * External dependencies
+ */
+import { View } from 'react-native';
+
+/**
+ * WordPress dependencies
+ */
+import { withSelect } from '@wordpress/data';
+import { compose, withPreferredColorScheme } from '@wordpress/compose';
+import {
+ InnerBlocks,
+ BlockControls,
+ BlockVerticalAlignmentToolbar,
+} from '@wordpress/block-editor';
+/**
+ * Internal dependencies
+ */
+import styles from './editor.scss';
+
+function ColumnEdit( {
+ attributes,
+ setAttributes,
+ hasChildren,
+ isSelected,
+ getStylesFromColorScheme,
+ isParentSelected,
+ contentStyle,
+} ) {
+ const { verticalAlignment } = attributes;
+
+ const updateAlignment = ( alignment ) => {
+ setAttributes( { verticalAlignment: alignment } );
+ };
+
+ if ( ! isSelected && ! hasChildren ) {
+ return (
+
+ );
+ }
+
+ return (
+ <>
+
+
+
+
+
+
+ >
+ );
+}
+
+function ColumnEditWrapper( props ) {
+ const { verticalAlignment } = props.attributes;
+
+ const getVerticalAlignmentRemap = ( alignment ) => {
+ if ( ! alignment ) return styles.flexBase;
+ return {
+ ...styles.flexBase,
+ ...styles[ `is-vertically-aligned-${ alignment }` ],
+ };
+ };
+
+ return (
+
+
+
+ );
+}
+
+export default compose( [
+ withSelect( ( select, { clientId } ) => {
+ const {
+ getBlockCount,
+ getBlockRootClientId,
+ getSelectedBlockClientId,
+ } = select( 'core/block-editor' );
+
+ const selectedBlockClientId = getSelectedBlockClientId();
+ const isSelected = selectedBlockClientId === clientId;
+
+ const parentId = getBlockRootClientId( clientId );
+ const hasChildren = !! getBlockCount( clientId );
+
+ const isParentSelected =
+ selectedBlockClientId && selectedBlockClientId === parentId;
+
+ return {
+ hasChildren,
+ isParentSelected,
+ isSelected,
+ };
+ } ),
+ withPreferredColorScheme,
+] )( ColumnEditWrapper );
diff --git a/packages/block-library/src/column/editor.native.scss b/packages/block-library/src/column/editor.native.scss
new file mode 100644
index 00000000000000..ec9579c63234b1
--- /dev/null
+++ b/packages/block-library/src/column/editor.native.scss
@@ -0,0 +1,36 @@
+.columnPlaceholderNotSelected {
+ padding-top: $block-selected-to-content;
+}
+
+.columnPlaceholder {
+ flex: 1;
+ padding: $block-selected-to-content;
+ background-color: $white;
+ border: $border-width dashed $gray;
+ border-radius: 4px;
+}
+
+.columnPlaceholderDark {
+ background-color: $black;
+ border: $border-width dashed $gray-70;
+}
+
+.innerBlocksBottomSpace {
+ margin-bottom: $block-selected-to-content;
+}
+
+.is-vertically-aligned-top {
+ justify-content: flex-start;
+}
+
+.is-vertically-aligned-center {
+ justify-content: center;
+}
+
+.is-vertically-aligned-bottom {
+ justify-content: flex-end;
+}
+
+.flexBase {
+ flex: 1;
+}
diff --git a/packages/block-library/src/column/index.native.js b/packages/block-library/src/column/index.native.js
new file mode 100644
index 00000000000000..d03c4756174bcc
--- /dev/null
+++ b/packages/block-library/src/column/index.native.js
@@ -0,0 +1,17 @@
+/**
+ * Internal dependencies
+ */
+import * as webSettings from './index.js';
+import metadata from './block.json';
+
+const { name } = metadata;
+
+export { metadata, name };
+
+export const settings = {
+ ...webSettings.settings,
+ supports: {
+ ...webSettings.settings.supports,
+ inserter: true,
+ },
+};
diff --git a/packages/block-library/src/columns/block.json b/packages/block-library/src/columns/block.json
index 8dc01cfafab4dd..3c22ca71fba621 100644
--- a/packages/block-library/src/columns/block.json
+++ b/packages/block-library/src/columns/block.json
@@ -4,18 +4,6 @@
"attributes": {
"verticalAlignment": {
"type": "string"
- },
- "backgroundColor": {
- "type": "string"
- },
- "customBackgroundColor": {
- "type": "string"
- },
- "customTextColor" : {
- "type": "string"
- },
- "textColor": {
- "type": "string"
}
}
}
diff --git a/packages/block-library/src/columns/deprecated.js b/packages/block-library/src/columns/deprecated.js
index 3d08e3d74c2183..34b3076904a63f 100644
--- a/packages/block-library/src/columns/deprecated.js
+++ b/packages/block-library/src/columns/deprecated.js
@@ -8,7 +8,7 @@ import classnames from 'classnames';
* WordPress dependencies
*/
import { createBlock } from '@wordpress/blocks';
-import { InnerBlocks } from '@wordpress/block-editor';
+import { InnerBlocks, getColorClassName } from '@wordpress/block-editor';
/**
* Given an HTML string for a deprecated columns inner block, returns the
@@ -38,7 +38,84 @@ function getDeprecatedLayoutColumn( originalContent ) {
}
}
+const migrateCustomColors = ( attributes ) => {
+ if ( ! attributes.customTextColor && ! attributes.customBackgroundColor ) {
+ return attributes;
+ }
+ const style = { color: {} };
+ if ( attributes.customTextColor ) {
+ style.color.text = attributes.customTextColor;
+ }
+ if ( attributes.customBackgroundColor ) {
+ style.color.background = attributes.customBackgroundColor;
+ }
+ return {
+ ...omit( attributes, [ 'customTextColor', 'customBackgroundColor' ] ),
+ style,
+ };
+};
+
export default [
+ {
+ attributes: {
+ verticalAlignment: {
+ type: 'string',
+ },
+ backgroundColor: {
+ type: 'string',
+ },
+ customBackgroundColor: {
+ type: 'string',
+ },
+ customTextColor: {
+ type: 'string',
+ },
+ textColor: {
+ type: 'string',
+ },
+ },
+ migrate: migrateCustomColors,
+ save( { attributes } ) {
+ const {
+ verticalAlignment,
+ backgroundColor,
+ customBackgroundColor,
+ textColor,
+ customTextColor,
+ } = attributes;
+
+ const backgroundClass = getColorClassName(
+ 'background-color',
+ backgroundColor
+ );
+
+ const textClass = getColorClassName( 'color', textColor );
+
+ const className = classnames( {
+ 'has-background': backgroundColor || customBackgroundColor,
+ 'has-text-color': textColor || customTextColor,
+ [ backgroundClass ]: backgroundClass,
+ [ textClass ]: textClass,
+ [ `are-vertically-aligned-${ verticalAlignment }` ]: verticalAlignment,
+ } );
+
+ const style = {
+ backgroundColor: backgroundClass
+ ? undefined
+ : customBackgroundColor,
+ color: textClass ? undefined : customTextColor,
+ };
+
+ return (
+
+
+
+ );
+ },
+ },
{
attributes: {
columns: {
diff --git a/packages/block-library/src/columns/edit.js b/packages/block-library/src/columns/edit.js
index 926a26014ccde0..372e535a931a8f 100644
--- a/packages/block-library/src/columns/edit.js
+++ b/packages/block-library/src/columns/edit.js
@@ -9,7 +9,6 @@ import { dropRight, get, map, times } from 'lodash';
*/
import { __ } from '@wordpress/i18n';
import { PanelBody, RangeControl } from '@wordpress/components';
-import { useRef } from '@wordpress/element';
import {
InspectorControls,
@@ -17,7 +16,6 @@ import {
BlockControls,
BlockVerticalAlignmentToolbar,
__experimentalBlockVariationPicker,
- __experimentalUseColors,
__experimentalBlock as Block,
} from '@wordpress/block-editor';
import { withDispatch, useDispatch, useSelect } from '@wordpress/data';
@@ -61,22 +59,6 @@ function ColumnsEditContainer( {
[ clientId ]
);
- const ref = useRef();
- const {
- BackgroundColor,
- InspectorControlsColorPanel,
- TextColor,
- } = __experimentalUseColors(
- [
- { name: 'textColor', property: 'color' },
- { name: 'backgroundColor', className: 'has-background' },
- ],
- {
- contrastCheckers: [ { backgroundColor: true, textColor: true } ],
- colorDetector: { targetRef: ref },
- }
- );
-
const classes = classnames( {
[ `are-vertically-aligned-${ verticalAlignment }` ]: verticalAlignment,
} );
@@ -100,20 +82,14 @@ function ColumnsEditContainer( {
/>
- { InspectorControlsColorPanel }
-
-
-
-
-
+
>
);
}
diff --git a/packages/block-library/src/columns/edit.native.js b/packages/block-library/src/columns/edit.native.js
new file mode 100644
index 00000000000000..a3394d02ed9657
--- /dev/null
+++ b/packages/block-library/src/columns/edit.native.js
@@ -0,0 +1,280 @@
+/**
+ * External dependencies
+ */
+import { View } from 'react-native';
+import { dropRight, times } from 'lodash';
+
+/**
+ * WordPress dependencies
+ */
+import { __ } from '@wordpress/i18n';
+import { PanelBody, RangeControl } from '@wordpress/components';
+import {
+ InspectorControls,
+ InnerBlocks,
+ BlockControls,
+ BlockVerticalAlignmentToolbar,
+} from '@wordpress/block-editor';
+import { withDispatch, useSelect } from '@wordpress/data';
+import { useEffect, useState } from '@wordpress/element';
+import { useResizeObserver } from '@wordpress/compose';
+import { createBlock } from '@wordpress/blocks';
+/**
+ * Internal dependencies
+ */
+import styles from './editor.scss';
+
+/**
+ * Allowed blocks constant is passed to InnerBlocks precisely as specified here.
+ * The contents of the array should never change.
+ * The array should contain the name of each block that is allowed.
+ * In columns block, the only block we allow is 'core/column'.
+ *
+ * @constant
+ * @type {string[]}
+ */
+const ALLOWED_BLOCKS = [ 'core/column' ];
+
+/**
+ * Number of columns to assume for template in case the user opts to skip
+ * template option selection.
+ *
+ * @type {number}
+ */
+const DEFAULT_COLUMNS = 2;
+const MIN_COLUMNS_NUMBER = 1;
+
+const BREAKPOINTS = {
+ mobile: 480,
+ large: 768,
+};
+
+function ColumnsEditContainer( {
+ attributes,
+ updateAlignment,
+ updateColumns,
+ columnCount,
+ isSelected,
+ onAddNextColumn,
+ onDeleteBlock,
+} ) {
+ const [ resizeListener, sizes ] = useResizeObserver();
+ const [ columnsInRow, setColumnsInRow ] = useState( MIN_COLUMNS_NUMBER );
+
+ const containerMaxWidth = styles.columnsContainer.maxWidth;
+
+ const { verticalAlignment } = attributes;
+ const { width } = sizes || {};
+
+ useEffect( () => {
+ const newColumnCount = ! columnCount ? DEFAULT_COLUMNS : columnCount;
+ updateColumns( columnCount, newColumnCount );
+ setColumnsInRow( getColumnsInRow( width, newColumnCount ) );
+ }, [ columnCount ] );
+
+ useEffect( () => {
+ setColumnsInRow( getColumnsInRow( width, columnCount ) );
+ }, [ width ] );
+
+ const getColumnWidth = ( containerWidth = containerMaxWidth ) => {
+ const minWidth = Math.min( containerWidth, containerMaxWidth );
+ const columnBaseWidth = minWidth / columnsInRow;
+
+ let columnWidth = columnBaseWidth;
+ if ( columnsInRow > 1 ) {
+ const margins = columnsInRow * 2 * styles.columnMargin.marginLeft;
+ columnWidth = ( minWidth - margins ) / columnsInRow;
+ }
+
+ return columnWidth;
+ };
+
+ const getColumnsInRow = ( containerWidth, columnsNumber ) => {
+ if ( containerWidth < BREAKPOINTS.mobile ) {
+ // show only 1 Column in row for mobile breakpoint container width
+ return 1;
+ } else if ( containerWidth < BREAKPOINTS.large ) {
+ // show 2 Column in row for large breakpoint container width
+ return Math.min( Math.max( 1, columnCount ), 2 );
+ }
+ // show all Column in one row
+ return Math.max( 1, columnsNumber );
+ };
+
+ const renderAppender = () => {
+ if ( isSelected ) {
+ return (
+
+ );
+ }
+ return null;
+ };
+
+ return (
+ <>
+
+
+
+ updateColumns( columnCount, value )
+ }
+ min={ MIN_COLUMNS_NUMBER }
+ max={ columnCount + 1 }
+ separatorType={ 'none' }
+ type="stepper"
+ />
+
+
+
+
+
+
+ { resizeListener }
+ 1 ? 'horizontal' : undefined
+ }
+ horizontal={ true }
+ allowedBlocks={ ALLOWED_BLOCKS }
+ contentResizeMode="stretch"
+ onAddBlock={ onAddNextColumn }
+ onDeleteBlock={
+ columnCount === 1 ? onDeleteBlock : undefined
+ }
+ contentStyle={ { width: getColumnWidth( width ) } }
+ />
+
+ >
+ );
+}
+
+const ColumnsEditContainerWrapper = withDispatch(
+ ( dispatch, ownProps, registry ) => ( {
+ /**
+ * Update all child Column blocks with a new vertical alignment setting
+ * based on whatever alignment is passed in. This allows change to parent
+ * to overide anything set on a individual column basis.
+ *
+ * @param {string} verticalAlignment the vertical alignment setting
+ */
+ updateAlignment( verticalAlignment ) {
+ const { clientId, setAttributes } = ownProps;
+ const { updateBlockAttributes } = dispatch( 'core/block-editor' );
+ const { getBlockOrder } = registry.select( 'core/block-editor' );
+
+ // Update own alignment.
+ setAttributes( { verticalAlignment } );
+
+ // Update all child Column Blocks to match
+ const innerBlockClientIds = getBlockOrder( clientId );
+ innerBlockClientIds.forEach( ( innerBlockClientId ) => {
+ updateBlockAttributes( innerBlockClientId, {
+ verticalAlignment,
+ } );
+ } );
+ },
+ updateBlockSettings( settings ) {
+ const { clientId } = ownProps;
+ const { updateBlockListSettings } = dispatch( 'core/block-editor' );
+ updateBlockListSettings( clientId, settings );
+ },
+ /**
+ * Updates the column columnCount, including necessary revisions to child Column
+ * blocks to grant required or redistribute available space.
+ *
+ * @param {number} previousColumns Previous column columnCount.
+ * @param {number} newColumns New column columnCount.
+ */
+ updateColumns( previousColumns, newColumns ) {
+ const { clientId } = ownProps;
+ const { replaceInnerBlocks } = dispatch( 'core/block-editor' );
+ const { getBlocks, getBlockAttributes } = registry.select(
+ 'core/block-editor'
+ );
+
+ let innerBlocks = getBlocks( clientId );
+
+ // Redistribute available width for existing inner blocks.
+ const isAddingColumn = newColumns > previousColumns;
+
+ if ( isAddingColumn ) {
+ // Get verticalAlignment from Columns block to set the same to new Column
+ const { verticalAlignment } = getBlockAttributes( clientId );
+
+ innerBlocks = [
+ ...innerBlocks,
+ ...times( newColumns - previousColumns, () => {
+ return createBlock( 'core/column', {
+ verticalAlignment,
+ } );
+ } ),
+ ];
+ } else {
+ // The removed column will be the last of the inner blocks.
+ innerBlocks = dropRight(
+ innerBlocks,
+ previousColumns - newColumns
+ );
+ }
+
+ replaceInnerBlocks( clientId, innerBlocks, false );
+ },
+ onAddNextColumn: () => {
+ const { clientId } = ownProps;
+ const { replaceInnerBlocks, selectBlock } = dispatch(
+ 'core/block-editor'
+ );
+ const { getBlocks, getBlockAttributes } = registry.select(
+ 'core/block-editor'
+ );
+
+ // Get verticalAlignment from Columns block to set the same to new Column
+ const { verticalAlignment } = getBlockAttributes( clientId );
+
+ const innerBlocks = getBlocks( clientId );
+
+ const insertedBlock = createBlock( 'core/column', {
+ verticalAlignment,
+ } );
+
+ innerBlocks.push( insertedBlock );
+
+ replaceInnerBlocks( clientId, innerBlocks, true );
+ selectBlock( insertedBlock.clientId );
+ },
+ onDeleteBlock: () => {
+ const { clientId } = ownProps;
+ const { removeBlock } = dispatch( 'core/block-editor' );
+ removeBlock( clientId );
+ },
+ } )
+)( ColumnsEditContainer );
+
+const ColumnsEdit = ( props ) => {
+ const { clientId } = props;
+ const { columnCount } = useSelect(
+ ( select ) => {
+ const { getBlockCount } = select( 'core/block-editor' );
+
+ return {
+ columnCount: getBlockCount( clientId ),
+ };
+ },
+ [ clientId ]
+ );
+
+ return (
+
+ );
+};
+
+export default ColumnsEdit;
diff --git a/packages/block-library/src/columns/editor.native.scss b/packages/block-library/src/columns/editor.native.scss
new file mode 100644
index 00000000000000..991655a13f3278
--- /dev/null
+++ b/packages/block-library/src/columns/editor.native.scss
@@ -0,0 +1,11 @@
+.columnsContainer {
+ max-width: $content-width;
+}
+
+.innerBlocksSelected {
+ margin-bottom: $block-edge-to-content;
+}
+
+.columnMargin {
+ margin: $block-edge-to-content / 2;
+}
diff --git a/packages/block-library/src/columns/editor.scss b/packages/block-library/src/columns/editor.scss
index 73231a940dd83c..d4928ac611d83a 100644
--- a/packages/block-library/src/columns/editor.scss
+++ b/packages/block-library/src/columns/editor.scss
@@ -4,14 +4,6 @@
max-width: none;
}
-// Ideally this shouldn't be necessary. There should be no default margins in
-// the editor.
-.editor-styles-wrapper .block-editor-block-list__block.wp-block-column,
-.editor-styles-wrapper .block-editor-block-list__block.wp-block-columns {
- margin-top: 0;
- margin-bottom: 0;
-}
-
// To do: remove horizontal margin override by the editor.
@include break-small() {
.editor-styles-wrapper
diff --git a/packages/block-library/src/columns/index.js b/packages/block-library/src/columns/index.js
index 8d94dcd82ea4ec..dec1d8672e6974 100644
--- a/packages/block-library/src/columns/index.js
+++ b/packages/block-library/src/columns/index.js
@@ -27,6 +27,7 @@ export const settings = {
align: [ 'wide', 'full' ],
html: false,
lightBlockWrapper: true,
+ __experimentalColor: { gradients: true },
},
variations,
example: {
diff --git a/packages/block-library/src/columns/save.js b/packages/block-library/src/columns/save.js
index 3d2249389910d2..0d9a5305cbeaeb 100644
--- a/packages/block-library/src/columns/save.js
+++ b/packages/block-library/src/columns/save.js
@@ -6,39 +6,17 @@ import classnames from 'classnames';
/**
* WordPress dependencies
*/
-import { InnerBlocks, getColorClassName } from '@wordpress/block-editor';
+import { InnerBlocks } from '@wordpress/block-editor';
export default function save( { attributes } ) {
- const {
- verticalAlignment,
- backgroundColor,
- customBackgroundColor,
- textColor,
- customTextColor,
- } = attributes;
-
- const backgroundClass = getColorClassName(
- 'background-color',
- backgroundColor
- );
-
- const textClass = getColorClassName( 'color', textColor );
+ const { verticalAlignment } = attributes;
const className = classnames( {
- 'has-background': backgroundColor || customBackgroundColor,
- 'has-text-color': textColor || customTextColor,
- [ backgroundClass ]: backgroundClass,
- [ textClass ]: textClass,
[ `are-vertically-aligned-${ verticalAlignment }` ]: verticalAlignment,
} );
- const style = {
- backgroundColor: backgroundClass ? undefined : customBackgroundColor,
- color: textClass ? undefined : customTextColor,
- };
-
return (
-
+
);
diff --git a/packages/block-library/src/columns/variations.js b/packages/block-library/src/columns/variations.js
index 93e83796d137cc..31b58cc71893c0 100644
--- a/packages/block-library/src/columns/variations.js
+++ b/packages/block-library/src/columns/variations.js
@@ -14,7 +14,8 @@ import { __ } from '@wordpress/i18n';
const variations = [
{
name: 'two-columns-equal',
- title: __( 'Two columns; equal split' ),
+ title: __( '50 / 50' ),
+ description: __( 'Two columns; equal split' ),
icon: (
+ { url &&
+ ( gradient || customGradient ) &&
+ dimRatio !== 0 && (
+
+ ) }
+ { VIDEO_BACKGROUND_TYPE === backgroundType && url && (
+
+ ) }
+
+
+
+
+ );
+ },
+ },
{
attributes: {
...blockAttributes,
diff --git a/packages/block-library/src/cover/edit-media-icon.native.js b/packages/block-library/src/cover/edit-media-icon.native.js
deleted file mode 100644
index e10b209cf35c43..00000000000000
--- a/packages/block-library/src/cover/edit-media-icon.native.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/**
- * WordPress dependencies
- */
-import { Path, Rect, SVG } from '@wordpress/components';
-
-export const EditMediaIcon = (
-
-
-
-
-
-
-);
diff --git a/packages/block-library/src/cover/edit.js b/packages/block-library/src/cover/edit.js
index b9354dc6fc7363..5fe5db7a206757 100644
--- a/packages/block-library/src/cover/edit.js
+++ b/packages/block-library/src/cover/edit.js
@@ -20,7 +20,7 @@ import {
ToggleControl,
withNotices,
} from '@wordpress/components';
-import { compose, withInstanceId } from '@wordpress/compose';
+import { compose, withInstanceId, useInstanceId } from '@wordpress/compose';
import {
BlockControls,
BlockIcon,
@@ -32,6 +32,7 @@ import {
ColorPalette,
__experimentalUseGradient,
__experimentalPanelColorGradientSettings as PanelColorGradientSettings,
+ __experimentalUnitControl as UnitControl,
} from '@wordpress/block-editor';
import { __ } from '@wordpress/i18n';
import { withDispatch } from '@wordpress/data';
@@ -45,6 +46,7 @@ import {
IMAGE_BACKGROUND_TYPE,
VIDEO_BACKGROUND_TYPE,
COVER_MIN_HEIGHT,
+ CSS_UNITS,
backgroundImageStyles,
dimRatioToClass,
} from './shared';
@@ -71,47 +73,57 @@ function retrieveFastAverageColor() {
return retrieveFastAverageColor.fastAverageColor;
}
-const CoverHeightInput = withInstanceId( function( {
- value = '',
- instanceId,
+function CoverHeightInput( {
onChange,
+ onUnitChange,
+ unit = 'px',
+ value = '',
} ) {
const [ temporaryInput, setTemporaryInput ] = useState( null );
+ const instanceId = useInstanceId( UnitControl );
const inputId = `block-cover-height-input-${ instanceId }`;
+ const isPx = unit === 'px';
+
+ const handleOnChange = ( unprocessedValue ) => {
+ const inputValue =
+ unprocessedValue !== ''
+ ? parseInt( unprocessedValue, 10 )
+ : undefined;
+
+ if ( isNaN( inputValue ) && inputValue !== undefined ) {
+ setTemporaryInput( unprocessedValue );
+ return;
+ }
+ setTemporaryInput( null );
+ onChange( inputValue );
+ };
+
+ const handleOnBlur = () => {
+ if ( temporaryInput !== null ) {
+ setTemporaryInput( null );
+ }
+ };
+
+ const inputValue = temporaryInput !== null ? temporaryInput : value;
+ const min = isPx ? COVER_MIN_HEIGHT : 0;
+
return (
-
-
+ {
- const unprocessedValue = event.target.value;
- const inputValue =
- unprocessedValue !== ''
- ? parseInt( event.target.value, 10 )
- : undefined;
- if (
- ( isNaN( inputValue ) ||
- inputValue < COVER_MIN_HEIGHT ) &&
- inputValue !== undefined
- ) {
- setTemporaryInput( event.target.value );
- return;
- }
- setTemporaryInput( null );
- onChange( inputValue );
- } }
- onBlur={ () => {
- if ( temporaryInput !== null ) {
- setTemporaryInput( null );
- }
- } }
- value={ temporaryInput !== null ? temporaryInput : value }
- min={ COVER_MIN_HEIGHT }
+ min={ min }
+ onBlur={ handleOnBlur }
+ onChange={ handleOnChange }
+ onUnitChange={ onUnitChange }
step="1"
+ style={ { maxWidth: 80 } }
+ unit={ unit }
+ units={ CSS_UNITS }
+ value={ inputValue }
/>
);
-} );
+}
const RESIZABLE_BOX_ENABLE_OPTION = {
top: false,
@@ -227,6 +239,7 @@ function CoverEdit( {
focalPoint,
hasParallax,
minHeight,
+ minHeightUnit,
url,
} = attributes;
const {
@@ -252,15 +265,18 @@ function CoverEdit( {
);
const [ temporaryMinHeight, setTemporaryMinHeight ] = useState( null );
-
const { removeAllNotices, createErrorNotice } = noticeOperations;
+ const minHeightWithUnit = minHeightUnit
+ ? `${ minHeight }${ minHeightUnit }`
+ : minHeight;
+
const style = {
...( backgroundType === IMAGE_BACKGROUND_TYPE
? backgroundImageStyles( url )
: {} ),
backgroundColor: overlayColor.color,
- minHeight: temporaryMinHeight || minHeight,
+ minHeight: temporaryMinHeight || minHeightWithUnit || undefined,
};
if ( gradientValue && ! url ) {
@@ -339,9 +355,15 @@ function CoverEdit( {
setAttributes( { minHeight: newMinHeight } )
}
+ onUnitChange={ ( nextUnit ) => {
+ setAttributes( {
+ minHeightUnit: nextUnit,
+ } );
+ } }
/>
toggleSelection( false ) }
+ onResizeStart={ () => {
+ setAttributes( { minHeightUnit: 'px' } );
+ toggleSelection( false );
+ } }
onResize={ setTemporaryMinHeight }
onResizeStop={ ( newMinHeight ) => {
toggleSelection( true );
diff --git a/packages/block-library/src/cover/edit.native.js b/packages/block-library/src/cover/edit.native.js
index a9777bd8934fc7..a154caa5066767 100644
--- a/packages/block-library/src/cover/edit.native.js
+++ b/packages/block-library/src/cover/edit.native.js
@@ -2,6 +2,7 @@
* External dependencies
*/
import { View, TouchableWithoutFeedback } from 'react-native';
+import Video from 'react-native-video';
/**
* WordPress dependencies
@@ -21,15 +22,17 @@ import {
InnerBlocks,
InspectorControls,
MEDIA_TYPE_IMAGE,
+ MEDIA_TYPE_VIDEO,
MediaPlaceholder,
MediaUpload,
+ MediaUploadProgress,
withColors,
__experimentalUseGradient,
} from '@wordpress/block-editor';
import { compose, withPreferredColorScheme } from '@wordpress/compose';
import { withSelect } from '@wordpress/data';
-import { useEffect } from '@wordpress/element';
-import { cover as icon } from '@wordpress/icons';
+import { useEffect, useState } from '@wordpress/element';
+import { cover as icon, replace } from '@wordpress/icons';
/**
* Internal dependencies
@@ -41,12 +44,11 @@ import {
IMAGE_BACKGROUND_TYPE,
VIDEO_BACKGROUND_TYPE,
} from './shared';
-import { EditMediaIcon } from './edit-media-icon';
/**
* Constants
*/
-const ALLOWED_MEDIA_TYPES = [ MEDIA_TYPE_IMAGE ];
+const ALLOWED_MEDIA_TYPES = [ MEDIA_TYPE_IMAGE, MEDIA_TYPE_VIDEO ];
const INNER_BLOCKS_TEMPLATE = [
[
'core/paragraph',
@@ -62,19 +64,27 @@ const COVER_DEFAULT_HEIGHT = 300;
const Cover = ( {
attributes,
getStylesFromColorScheme,
- hasChildren,
isParentSelected,
onFocus,
overlayColor,
setAttributes,
} ) => {
- const { backgroundType, dimRatio, focalPoint, minHeight, url } = attributes;
+ const {
+ backgroundType,
+ dimRatio,
+ focalPoint,
+ minHeight,
+ url,
+ id,
+ style,
+ } = attributes;
const CONTAINER_HEIGHT = minHeight || COVER_DEFAULT_HEIGHT;
const { gradientValue } = __experimentalUseGradient();
const hasBackground = !! (
url ||
+ ( style && style.color && style.color.background ) ||
attributes.overlayColor ||
overlayColor.color ||
gradientValue
@@ -109,26 +119,32 @@ const Cover = ( {
setAttributes( { dimRatio: value } );
};
+ const [ isVideoLoading, setIsVideoLoading ] = useState( true );
+
+ const onVideoLoadStart = () => {
+ setIsVideoLoading( true );
+ };
+
+ const onVideoLoad = () => {
+ setIsVideoLoading( false );
+ };
+
+ const backgroundColor = getStylesFromColorScheme(
+ styles.backgroundSolid,
+ styles.backgroundSolidDark
+ );
+
const overlayStyles = [
styles.overlay,
- {
+ url && { opacity: dimRatio / 100 },
+ ! gradientValue && {
backgroundColor:
- overlayColor && overlayColor.color
- ? overlayColor.color
- : styles.overlay.color,
- // Set opacity to 1 while video / theme color support is not available
- opacity:
- url && VIDEO_BACKGROUND_TYPE !== backgroundType
- ? dimRatio / 100
- : 1,
+ overlayColor?.color ||
+ style?.color?.background ||
+ styles.overlay.color,
},
// While we don't support theme colors we add a default bg color
- ! overlayColor.color && ! url
- ? getStylesFromColorScheme(
- styles.backgroundSolid,
- styles.backgroundSolidDark
- )
- : {},
+ ! overlayColor.color && ! url ? backgroundColor : {},
];
const placeholderIconStyle = getStylesFromColorScheme(
@@ -143,7 +159,7 @@ const Cover = ( {
@@ -179,43 +195,67 @@ const Cover = ( {
);
- const containerStyles = [
- hasChildren && ! isParentSelected && styles.regularMediaPadding,
- hasChildren && isParentSelected && styles.innerPadding,
- ];
-
- const background = ( openMediaOptions, getMediaOptions ) => (
+ const renderBackground = ( {
+ open: openMediaOptions,
+ getMediaOptions,
+ } ) => (
-
+
{ getMediaOptions() }
{ isParentSelected && toolbarControls( openMediaOptions ) }
-
- { /* When the gradient is set as a background the backgroundType is equal to IMAGE_BACKGROUND_TYPE */ }
- { IMAGE_BACKGROUND_TYPE === backgroundType &&
- ( gradientValue ? (
-
- ) : (
-
- ) ) }
+ {
+ setAttributes( {
+ id: mediaServerId,
+ url: mediaUrl,
+ backgroundType,
+ } );
+ } }
+ renderContent={ () => (
+ <>
+ { IMAGE_BACKGROUND_TYPE === backgroundType && (
+
+ ) }
+ { VIDEO_BACKGROUND_TYPE === backgroundType && (
+
+ ) }
+ >
+ ) }
+ />
);
if ( ! hasBackground ) {
return (
-
+
+
{ controls }
-
-
-
-
- { /* We don't render overlay on top of gradient */ }
- { ! gradientValue && (
-
- ) }
+
+
+
- {
- return background( open, getMediaOptions );
- } }
- />
+
+ { gradientValue && (
+
+ ) }
+
+
);
};
@@ -263,15 +302,11 @@ const Cover = ( {
export default compose( [
withColors( { overlayColor: 'background-color' } ),
withSelect( ( select, { clientId } ) => {
- const { getSelectedBlockClientId, getBlockCount } = select(
- 'core/block-editor'
- );
+ const { getSelectedBlockClientId } = select( 'core/block-editor' );
const selectedBlockClientId = getSelectedBlockClientId();
- const hasChildren = getBlockCount( clientId );
return {
- hasChildren,
isParentSelected: selectedBlockClientId === clientId,
};
} ),
diff --git a/packages/block-library/src/cover/editor.scss b/packages/block-library/src/cover/editor.scss
index cca0e8a751e099..31faa3872936d0 100644
--- a/packages/block-library/src/cover/editor.scss
+++ b/packages/block-library/src/cover/editor.scss
@@ -9,10 +9,6 @@
width: 100%;
}
- .block-editor-block-list__block {
- color: $light-gray-100;
- }
-
// The .wp-block-cover class is used just to increase selector specificity.
.wp-block-cover__inner-container {
// Avoid text align inherit from cover image align.
diff --git a/packages/block-library/src/cover/save.js b/packages/block-library/src/cover/save.js
index 4f5d997176b7b3..4e45fa41347b58 100644
--- a/packages/block-library/src/cover/save.js
+++ b/packages/block-library/src/cover/save.js
@@ -33,13 +33,17 @@ export default function save( { attributes } ) {
hasParallax,
overlayColor,
url,
- minHeight,
+ minHeight: minHeightProp,
+ minHeightUnit,
} = attributes;
const overlayColorClass = getColorClassName(
'background-color',
overlayColor
);
const gradientClass = __experimentalGetGradientClass( gradient );
+ const minHeight = minHeightUnit
+ ? `${ minHeightProp }${ minHeightUnit }`
+ : minHeightProp;
const style =
backgroundType === IMAGE_BACKGROUND_TYPE
@@ -64,7 +68,7 @@ export default function save( { attributes } ) {
{
'has-background-dim': dimRatio !== 0,
'has-parallax': hasParallax,
- 'has-background-gradient': customGradient,
+ 'has-background-gradient': gradient || customGradient,
[ gradientClass ]: ! url && gradientClass,
}
);
diff --git a/packages/block-library/src/cover/shared.js b/packages/block-library/src/cover/shared.js
index bf1e794606aa3d..1fba24ccd1c68f 100644
--- a/packages/block-library/src/cover/shared.js
+++ b/packages/block-library/src/cover/shared.js
@@ -5,6 +5,14 @@ export function backgroundImageStyles( url ) {
return url ? { backgroundImage: `url(${ url })` } : {};
}
+export const CSS_UNITS = [
+ { value: 'px', label: 'px', default: 430 },
+ { value: 'em', label: 'em', default: 20 },
+ { value: 'rem', label: 'rem', default: 20 },
+ { value: 'vw', label: 'vw', default: 20 },
+ { value: 'vh', label: 'vh', default: 50 },
+];
+
export function dimRatioToClass( ratio ) {
return ratio === 0 || ratio === 50 || ! ratio
? null
diff --git a/packages/block-library/src/cover/style.native.scss b/packages/block-library/src/cover/style.native.scss
index 2141f715a2b7e5..b1e7b5bad9257d 100644
--- a/packages/block-library/src/cover/style.native.scss
+++ b/packages/block-library/src/cover/style.native.scss
@@ -8,18 +8,6 @@
fill: $white;
}
-.innerPadding {
- padding: $block-selected-to-content;
-}
-
-.regularMediaPadding {
- padding: $block-edge-to-content;
-}
-
-.denseMediaPadding {
- padding: $block-media-container-to-content;
-}
-
.backgroundContainer {
overflow: hidden;
width: 100%;
@@ -29,6 +17,7 @@
.content {
justify-content: center;
width: 100%;
+ padding: $block-edge-to-content;
z-index: 3;
}
diff --git a/packages/block-library/src/cover/style.scss b/packages/block-library/src/cover/style.scss
index 739742d1e62270..1742bf45f9de5a 100644
--- a/packages/block-library/src/cover/style.scss
+++ b/packages/block-library/src/cover/style.scss
@@ -1,7 +1,6 @@
.wp-block-cover-image,
.wp-block-cover {
position: relative;
- background-color: $black;
background-size: cover;
background-position: center center;
min-height: 430px;
@@ -11,7 +10,6 @@
justify-content: center;
align-items: center;
overflow: hidden;
-
&.has-parallax {
background-attachment: fixed;
@@ -28,9 +26,13 @@
}
}
- &.has-background-dim::before {
- content: "";
- background-color: inherit;
+ &.has-background-dim {
+ background-color: $black;
+
+ &::before {
+ content: "";
+ background-color: inherit;
+ }
}
&.has-background-dim:not(.has-background-gradient)::before,
diff --git a/packages/block-library/src/embed/editor.scss b/packages/block-library/src/embed/editor.scss
index 342b4fe1b116b2..f84b5b886bd10d 100644
--- a/packages/block-library/src/embed/editor.scss
+++ b/packages/block-library/src/embed/editor.scss
@@ -7,17 +7,6 @@
// therefore the video doesn't intrinsically clear floats like an image does.
clear: both;
- // Apply a min-width, or the embed can collapse when floated.
- // Instagram widgets have a min-width of 326px, so go a bit beyond that.
- @include break-small() {
- min-width: 360px;
-
- // The placeholder should not have this min-width.
- &.components-placeholder {
- min-width: 0;
- }
- }
-
&.is-loading {
display: flex;
flex-direction: column;
diff --git a/packages/block-library/src/embed/embed-preview.js b/packages/block-library/src/embed/embed-preview.js
index db139e5292b7bd..0e70f84729acc6 100644
--- a/packages/block-library/src/embed/embed-preview.js
+++ b/packages/block-library/src/embed/embed-preview.js
@@ -7,7 +7,6 @@ import { getPhotoHtml } from './util';
/**
* External dependencies
*/
-import { parse } from 'url';
import { includes } from 'lodash';
import classnames from 'classnames/dedupe';
@@ -69,13 +68,13 @@ class EmbedPreview extends Component {
const { interactive } = this.state;
const html = 'photo' === type ? getPhotoHtml( preview ) : preview.html;
- const parsedHost = parse( url ).host.split( '.' );
+ const parsedHost = new URL( url ).host.split( '.' );
const parsedHostBaseUrl = parsedHost
.splice( parsedHost.length - 2, parsedHost.length - 1 )
.join( '.' );
const cannotPreview = includes( HOSTS_NO_PREVIEWS, parsedHostBaseUrl );
- // translators: %s: host providing embed content e.g: www.youtube.com
const iframeTitle = sprintf(
+ // translators: %s: host providing embed content e.g: www.youtube.com
__( 'Embedded content from %s' ),
parsedHostBaseUrl
);
@@ -126,8 +125,8 @@ class EmbedPreview extends Component {
{ url }
- { /* translators: %s: host providing embed content e.g: www.youtube.com */
- sprintf(
+ { sprintf(
+ /* translators: %s: host providing embed content e.g: www.youtube.com */
__(
"Embedded content from %s can't be previewed in the editor."
),
diff --git a/packages/block-library/src/embed/icons.js b/packages/block-library/src/embed/icons.js
index 1ad0c76cf1c634..292a3d336aaaa2 100644
--- a/packages/block-library/src/embed/icons.js
+++ b/packages/block-library/src/embed/icons.js
@@ -98,7 +98,7 @@ export const embedTumblrIcon = {
foreground: '#35465c',
src: (
-
+
),
};
diff --git a/packages/block-library/src/embed/style.scss b/packages/block-library/src/embed/style.scss
index 4abaf5b7778f57..0905f04dd8e4e8 100644
--- a/packages/block-library/src/embed/style.scss
+++ b/packages/block-library/src/embed/style.scss
@@ -1,6 +1,6 @@
// Apply max-width to floated items that have no intrinsic width
-.block-editor-block-list__block[data-type="core/embed"][data-align="left"],
-.block-editor-block-list__block[data-type="core/embed"][data-align="right"],
+.block-editor-block-list__block[data-type*="core-embed"][data-align="left"] .is-block-content,
+.block-editor-block-list__block[data-type*="core-embed"][data-align="right"] .is-block-content,
.wp-block-embed.alignleft,
.wp-block-embed.alignright {
// Instagram widgets have a min-width of 326px, so go a bit beyond that.
diff --git a/packages/block-library/src/embed/test/__snapshots__/index.js.snap b/packages/block-library/src/embed/test/__snapshots__/index.js.snap
index a3aa6b0bb28b63..cd54f37827706f 100644
--- a/packages/block-library/src/embed/test/__snapshots__/index.js.snap
+++ b/packages/block-library/src/embed/test/__snapshots__/index.js.snap
@@ -2,16 +2,8 @@
exports[`core/embed block edit matches snapshot 1`] = `
-
@@ -79,12 +71,12 @@ exports[`core/embed block edit matches snapshot 1`] = `
focusable="false"
height="24"
role="img"
- viewBox="-2 -2 24 24"
+ viewBox="0 0 24 24"
width="24"
xmlns="http://www.w3.org/2000/svg"
>
diff --git a/packages/block-library/src/gallery/edit.js b/packages/block-library/src/gallery/edit.js
index c3b556b683503d..3f77212f71990a 100644
--- a/packages/block-library/src/gallery/edit.js
+++ b/packages/block-library/src/gallery/edit.js
@@ -20,11 +20,10 @@ import {
import { compose } from '@wordpress/compose';
import {
PanelBody,
- RangeControl,
SelectControl,
- StepperControl,
ToggleControl,
withNotices,
+ RangeControl,
} from '@wordpress/components';
import { MediaPlaceholder, InspectorControls } from '@wordpress/block-editor';
import { Component, Platform } from '@wordpress/element';
@@ -40,7 +39,6 @@ import { sharedIcon } from './shared-icon';
import { defaultColumnsNumber, pickRelevantMediaFiles } from './shared';
import Gallery from './gallery';
-const ColumnsControl = Platform.OS === 'web' ? RangeControl : StepperControl;
const MAX_COLUMNS = 8;
const linkOptions = [
{ value: 'attachment', label: __( 'Attachment Page' ) },
@@ -67,6 +65,11 @@ const MOBILE_CONTROL_PROPS_SEPARATOR_NONE = Platform.select( {
native: { separatorType: 'none' },
} );
+const MOBILE_CONTROL_PROPS_RANGE_CONTROL = Platform.select( {
+ web: {},
+ native: { type: 'stepper' },
+} );
+
class GalleryEdit extends Component {
constructor() {
super( ...arguments );
@@ -393,13 +396,14 @@ class GalleryEdit extends Component {
{ images.length > 1 && (
-
) }
diff --git a/packages/block-library/src/gallery/editor.scss b/packages/block-library/src/gallery/editor.scss
index 91f17230d8ba4a..4689d36f0c2721 100644
--- a/packages/block-library/src/gallery/editor.scss
+++ b/packages/block-library/src/gallery/editor.scss
@@ -60,7 +60,7 @@ figure.wp-block-gallery {
.is-selected .block-library-gallery-item__inline-menu {
background: $white;
border: 1px solid $dark-gray-primary;
- border-radius: $radius-round-rectangle;
+ border-radius: $radius-block-ui;
transition: box-shadow 0.2s ease-out;
@include reduce-motion("transition");
diff --git a/packages/block-library/src/gallery/gallery-image.js b/packages/block-library/src/gallery/gallery-image.js
index b661ff0abf1979..77325ba9e77348 100644
--- a/packages/block-library/src/gallery/gallery-image.js
+++ b/packages/block-library/src/gallery/gallery-image.js
@@ -15,12 +15,7 @@ import { withSelect, withDispatch } from '@wordpress/data';
import { RichText } from '@wordpress/block-editor';
import { isBlobURL } from '@wordpress/blob';
import { compose } from '@wordpress/compose';
-import { close } from '@wordpress/icons';
-
-/**
- * Internal dependencies
- */
-import { leftArrow, rightArrow } from './icons';
+import { close, chevronLeft, chevronRight } from '@wordpress/icons';
class GalleryImage extends Component {
constructor() {
@@ -199,7 +194,7 @@ class GalleryImage extends Component {
{ href ? { img } : img }
{
images,
} = attributes;
- const captionClassNames = classnames( 'blocks-gallery-caption', {
- 'screen-reader-text': ! isSelected && RichText.isEmpty( caption ),
- } );
-
return (
{
>
{ images.map( ( img, index ) => {
- /* translators: %1$d is the order number of the image, %2$d is the total number of images. */
const ariaLabel = sprintf(
+ /* translators: 1: the order number of the image. 2: the total number of images. */
__( 'image %1$d of %2$d in gallery' ),
index + 1,
images.length
@@ -91,9 +88,10 @@ export const Gallery = ( props ) => {
} ) }
{ mediaPlaceholder }
- {
);
};
+function RichTextVisibilityHelper( { isHidden, ...richTextProps } ) {
+ return isHidden ? (
+
+ ) : (
+
+ );
+}
+
export default Gallery;
diff --git a/packages/block-library/src/gallery/gallery.native.js b/packages/block-library/src/gallery/gallery.native.js
index 27dc15df623e9f..70cd50e08e5e77 100644
--- a/packages/block-library/src/gallery/gallery.native.js
+++ b/packages/block-library/src/gallery/gallery.native.js
@@ -77,7 +77,7 @@ export const Gallery = ( props ) => {
};
return (
-
+
{
}
>
{ images.map( ( img, index ) => {
- /* translators: %1$d is the order number of the image, %2$d is the total number of images. */
const ariaLabel = sprintf(
+ /* translators: 1: the order number of the image. 2: the total number of images. */
__( 'image %1$d of %2$d in gallery' ),
index + 1,
images.length
diff --git a/packages/block-library/src/gallery/icons.js b/packages/block-library/src/gallery/icons.js
deleted file mode 100644
index 09d906f5939325..00000000000000
--- a/packages/block-library/src/gallery/icons.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * WordPress dependencies
- */
-import { Path, SVG } from '@wordpress/components';
-
-export const leftArrow = (
-
-
-
-);
-
-export const rightArrow = (
-
-
-
-);
diff --git a/packages/block-library/src/group/block.json b/packages/block-library/src/group/block.json
index 8883720bbc2aab..9359f8101603ba 100644
--- a/packages/block-library/src/group/block.json
+++ b/packages/block-library/src/group/block.json
@@ -2,17 +2,9 @@
"name": "core/group",
"category": "layout",
"attributes": {
- "backgroundColor": {
- "type": "string"
- },
- "customBackgroundColor": {
- "type": "string"
- },
- "textColor": {
- "type": "string"
- },
- "customTextColor": {
- "type": "string"
+ "tagName": {
+ "type": "string",
+ "default": "div"
}
}
}
diff --git a/packages/block-library/src/group/deprecated.js b/packages/block-library/src/group/deprecated.js
index 31440c003f8669..3e6d394197ffd6 100644
--- a/packages/block-library/src/group/deprecated.js
+++ b/packages/block-library/src/group/deprecated.js
@@ -2,13 +2,94 @@
* External dependencies
*/
import classnames from 'classnames';
+import { omit } from 'lodash';
/**
* WordPress dependencies
*/
import { InnerBlocks, getColorClassName } from '@wordpress/block-editor';
+const migrateAttributes = ( attributes ) => {
+ if ( ! attributes.tagName ) {
+ attributes = {
+ ...attributes,
+ tagName: 'div',
+ };
+ }
+
+ if ( ! attributes.customTextColor && ! attributes.customBackgroundColor ) {
+ return attributes;
+ }
+ const style = { color: {} };
+ if ( attributes.customTextColor ) {
+ style.color.text = attributes.customTextColor;
+ }
+ if ( attributes.customBackgroundColor ) {
+ style.color.background = attributes.customBackgroundColor;
+ }
+ return {
+ ...omit( attributes, [ 'customTextColor', 'customBackgroundColor' ] ),
+ style,
+ };
+};
+
const deprecated = [
+ // Version of the block without global styles support
+ {
+ attributes: {
+ backgroundColor: {
+ type: 'string',
+ },
+ customBackgroundColor: {
+ type: 'string',
+ },
+ textColor: {
+ type: 'string',
+ },
+ customTextColor: {
+ type: 'string',
+ },
+ },
+ supports: {
+ align: [ 'wide', 'full' ],
+ anchor: true,
+ html: false,
+ },
+ migrate: migrateAttributes,
+ save( { attributes } ) {
+ const {
+ backgroundColor,
+ customBackgroundColor,
+ textColor,
+ customTextColor,
+ } = attributes;
+
+ const backgroundClass = getColorClassName(
+ 'background-color',
+ backgroundColor
+ );
+ const textClass = getColorClassName( 'color', textColor );
+ const className = classnames( backgroundClass, textClass, {
+ 'has-text-color': textColor || customTextColor,
+ 'has-background': backgroundColor || customBackgroundColor,
+ } );
+
+ const styles = {
+ backgroundColor: backgroundClass
+ ? undefined
+ : customBackgroundColor,
+ color: textClass ? undefined : customTextColor,
+ };
+
+ return (
+
+ );
+ },
+ },
// Version of the group block with a bug that made text color class not applied.
{
attributes: {
@@ -25,6 +106,7 @@ const deprecated = [
type: 'string',
},
},
+ migrate: migrateAttributes,
supports: {
align: [ 'wide', 'full' ],
anchor: true,
@@ -79,6 +161,7 @@ const deprecated = [
anchor: true,
html: false,
},
+ migrate: migrateAttributes,
save( { attributes } ) {
const { backgroundColor, customBackgroundColor } = attributes;
diff --git a/packages/block-library/src/group/edit.js b/packages/block-library/src/group/edit.js
index 80f496967f599f..6a7989f8a8df96 100644
--- a/packages/block-library/src/group/edit.js
+++ b/packages/block-library/src/group/edit.js
@@ -1,57 +1,36 @@
/**
* WordPress dependencies
*/
-import { withSelect } from '@wordpress/data';
-import { compose } from '@wordpress/compose';
-import { InnerBlocks, __experimentalUseColors } from '@wordpress/block-editor';
-import { useRef } from '@wordpress/element';
+import { useSelect } from '@wordpress/data';
+import {
+ InnerBlocks,
+ __experimentalBlock as Block,
+} from '@wordpress/block-editor';
-function GroupEdit( { hasInnerBlocks, className } ) {
- const ref = useRef();
- const {
- TextColor,
- BackgroundColor,
- InspectorControlsColorPanel,
- } = __experimentalUseColors(
- [
- { name: 'textColor', property: 'color' },
- { name: 'backgroundColor', className: 'has-background' },
- ],
- {
- contrastCheckers: [ { backgroundColor: true, textColor: true } ],
- colorDetector: { targetRef: ref },
- }
+function GroupEdit( { attributes, className, clientId } ) {
+ const hasInnerBlocks = useSelect(
+ ( select ) => {
+ const { getBlock } = select( 'core/block-editor' );
+ const block = getBlock( clientId );
+ return !! ( block && block.innerBlocks.length );
+ },
+ [ clientId ]
);
+ const BlockWrapper = Block[ attributes.tagName ];
return (
- <>
- { InspectorControlsColorPanel }
-
-
-
-
-
- >
+
+
+
+ }
+ />
+
+
);
}
-export default compose( [
- withSelect( ( select, { clientId } ) => {
- const { getBlock } = select( 'core/block-editor' );
-
- const block = getBlock( clientId );
-
- return {
- hasInnerBlocks: !! ( block && block.innerBlocks.length ),
- };
- } ),
-] )( GroupEdit );
+export default GroupEdit;
diff --git a/packages/block-library/src/group/edit.native.js b/packages/block-library/src/group/edit.native.js
index a1b261f3340c6c..257ba8b4e628c7 100644
--- a/packages/block-library/src/group/edit.native.js
+++ b/packages/block-library/src/group/edit.native.js
@@ -33,9 +33,11 @@ function GroupEdit( { hasInnerBlocks, isSelected, getStylesFromColorScheme } ) {
}
return (
-
+
+
+
);
}
diff --git a/packages/block-library/src/group/editor.native.scss b/packages/block-library/src/group/editor.native.scss
index 2f426176fe22a2..7f8a9ce1322462 100644
--- a/packages/block-library/src/group/editor.native.scss
+++ b/packages/block-library/src/group/editor.native.scss
@@ -22,3 +22,7 @@
margin-left: 0;
margin-right: 0;
}
+
+.innerBlocks {
+ margin-bottom: $block-edge-to-content;
+}
diff --git a/packages/block-library/src/group/index.js b/packages/block-library/src/group/index.js
index 225e6e2ed03496..d07cf54f7256d8 100644
--- a/packages/block-library/src/group/index.js
+++ b/packages/block-library/src/group/index.js
@@ -29,8 +29,12 @@ export const settings = {
],
example: {
attributes: {
- customBackgroundColor: '#ffffff',
- customTextColor: '#000000',
+ style: {
+ color: {
+ text: '#000000',
+ background: '#ffffff',
+ },
+ },
},
innerBlocks: [
{
@@ -87,6 +91,8 @@ export const settings = {
align: [ 'wide', 'full' ],
anchor: true,
html: false,
+ lightBlockWrapper: true,
+ __experimentalColor: { gradients: true },
},
transforms: {
from: [
diff --git a/packages/block-library/src/group/save.js b/packages/block-library/src/group/save.js
index 6d248efbfc2579..f24c9f37cdf409 100644
--- a/packages/block-library/src/group/save.js
+++ b/packages/block-library/src/group/save.js
@@ -1,41 +1,16 @@
-/**
- * External dependencies
- */
-import classnames from 'classnames';
-
/**
* WordPress dependencies
*/
-import { InnerBlocks, getColorClassName } from '@wordpress/block-editor';
+import { InnerBlocks } from '@wordpress/block-editor';
export default function save( { attributes } ) {
- const {
- backgroundColor,
- customBackgroundColor,
- textColor,
- customTextColor,
- } = attributes;
-
- const backgroundClass = getColorClassName(
- 'background-color',
- backgroundColor
- );
- const textClass = getColorClassName( 'color', textColor );
- const className = classnames( backgroundClass, textClass, {
- 'has-text-color': textColor || customTextColor,
- 'has-background': backgroundColor || customBackgroundColor,
- } );
-
- const styles = {
- backgroundColor: backgroundClass ? undefined : customBackgroundColor,
- color: textClass ? undefined : customTextColor,
- };
+ const { tagName: Tag } = attributes;
return (
-
+
);
}
diff --git a/packages/block-library/src/heading/block.json b/packages/block-library/src/heading/block.json
index 2c47b2c7096521..120bece3d39ae3 100644
--- a/packages/block-library/src/heading/block.json
+++ b/packages/block-library/src/heading/block.json
@@ -17,12 +17,6 @@
},
"placeholder": {
"type": "string"
- },
- "textColor": {
- "type": "string"
- },
- "customTextColor": {
- "type": "string"
}
}
}
diff --git a/packages/block-library/src/heading/deprecated.js b/packages/block-library/src/heading/deprecated.js
index fffa0f9b4e7976..7a43fc9d5b8689 100644
--- a/packages/block-library/src/heading/deprecated.js
+++ b/packages/block-library/src/heading/deprecated.js
@@ -2,6 +2,7 @@
* External dependencies
*/
import classnames from 'classnames';
+import { omit } from 'lodash';
/**
* WordPress dependencies
@@ -30,17 +31,77 @@ const blockAttributes = {
placeholder: {
type: 'string',
},
- textColor: {
- type: 'string',
- },
- customTextColor: {
- type: 'string',
- },
+};
+
+const migrateCustomColors = ( attributes ) => {
+ if ( ! attributes.customTextColor ) {
+ return attributes;
+ }
+ const style = {
+ color: {
+ text: attributes.customTextColor,
+ },
+ };
+ return {
+ ...omit( attributes, [ 'customTextColor' ] ),
+ style,
+ };
};
const deprecated = [
{
- attributes: blockAttributes,
+ supports: blockSupports,
+ attributes: {
+ ...blockAttributes,
+ customTextColor: {
+ type: 'string',
+ },
+ textColor: {
+ type: 'string',
+ },
+ },
+ migrate: migrateCustomColors,
+ save( { attributes } ) {
+ const {
+ align,
+ content,
+ customTextColor,
+ level,
+ textColor,
+ } = attributes;
+ const tagName = 'h' + level;
+
+ const textClass = getColorClassName( 'color', textColor );
+
+ const className = classnames( {
+ [ textClass ]: textClass,
+ 'has-text-color': textColor || customTextColor,
+ [ `has-text-align-${ align }` ]: align,
+ } );
+
+ return (
+
+ );
+ },
+ },
+ {
+ attributes: {
+ ...blockAttributes,
+ customTextColor: {
+ type: 'string',
+ },
+ textColor: {
+ type: 'string',
+ },
+ },
+ migrate: migrateCustomColors,
save( { attributes } ) {
const {
align,
@@ -73,7 +134,16 @@ const deprecated = [
},
{
supports: blockSupports,
- attributes: blockAttributes,
+ attributes: {
+ ...blockAttributes,
+ customTextColor: {
+ type: 'string',
+ },
+ textColor: {
+ type: 'string',
+ },
+ },
+ migrate: migrateCustomColors,
save( { attributes } ) {
const {
align,
diff --git a/packages/block-library/src/heading/edit.js b/packages/block-library/src/heading/edit.js
index 3e43660a300efe..28f9a6da5be576 100644
--- a/packages/block-library/src/heading/edit.js
+++ b/packages/block-library/src/heading/edit.js
@@ -12,93 +12,91 @@ import HeadingToolbar from './heading-toolbar';
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
-import { PanelBody } from '@wordpress/components';
+import { PanelBody, __experimentalText as Text } from '@wordpress/components';
import { createBlock } from '@wordpress/blocks';
import {
AlignmentToolbar,
BlockControls,
InspectorControls,
RichText,
- __experimentalUseColors,
__experimentalBlock as Block,
} from '@wordpress/block-editor';
-import { useRef } from '@wordpress/element';
+import { Platform } from '@wordpress/element';
function HeadingEdit( { attributes, setAttributes, mergeBlocks, onReplace } ) {
- const ref = useRef();
- const { TextColor, InspectorControlsColorPanel } = __experimentalUseColors(
- [ { name: 'textColor', property: 'color' } ],
- {
- contrastCheckers: { backgroundColor: true, textColor: true },
- colorDetector: { targetRef: ref },
- },
- []
- );
-
- const { align, content, level, placeholder } = attributes;
+ const { align, content, level, placeholder, style } = attributes;
const tagName = 'h' + level;
+ const isAndroid = Platform.select( {
+ android: true,
+ native: false,
+ web: false,
+ } );
+
+ const styles = {
+ color: style && style.color && style.color.text,
+ };
return (
<>
setAttributes( { level: newLevel } )
}
/>
- {
- setAttributes( { align: nextAlign } );
- } }
- />
-
-
-
- { __( 'Level' ) }
-
- setAttributes( { level: newLevel } )
- }
+ { ! isAndroid && (
+ {
+ setAttributes( { align: nextAlign } );
+ } }
/>
-
-
- { InspectorControlsColorPanel }
-
-
- setAttributes( { content: value } )
+ ) }
+
+ { Platform.OS === 'web' && (
+
+
+ { __( 'Level' ) }
+
+ setAttributes( { level: newLevel } )
+ }
+ />
+
+
+ ) }
+ setAttributes( { content: value } ) }
+ onMerge={ mergeBlocks }
+ onSplit={ ( value ) => {
+ if ( ! value ) {
+ return createBlock( 'core/paragraph' );
}
- onMerge={ mergeBlocks }
- onSplit={ ( value ) => {
- if ( ! value ) {
- return createBlock( 'core/paragraph' );
- }
- return createBlock( 'core/heading', {
- ...attributes,
- content: value,
- } );
- } }
- onReplace={ onReplace }
- onRemove={ () => onReplace( [] ) }
- className={ classnames( {
- [ `has-text-align-${ align }` ]: align,
- } ) }
- placeholder={ placeholder || __( 'Write heading…' ) }
- />
-
+ return createBlock( 'core/heading', {
+ ...attributes,
+ content: value,
+ } );
+ } }
+ onReplace={ onReplace }
+ onRemove={ () => onReplace( [] ) }
+ className={ classnames( {
+ [ `has-text-align-${ align }` ]: align,
+ } ) }
+ placeholder={ placeholder || __( 'Write heading…' ) }
+ textAlign={ align }
+ style={ styles }
+ />
>
);
}
diff --git a/packages/block-library/src/heading/edit.native.js b/packages/block-library/src/heading/edit.native.js
deleted file mode 100644
index 8d8d8b49aef99a..00000000000000
--- a/packages/block-library/src/heading/edit.native.js
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * Internal dependencies
- */
-import HeadingToolbar from './heading-toolbar';
-
-/**
- * External dependencies
- */
-import { View } from 'react-native';
-
-/**
- * WordPress dependencies
- */
-import { __ } from '@wordpress/i18n';
-import {
- RichText,
- BlockControls,
- __experimentalUseColors,
-} from '@wordpress/block-editor';
-import { createBlock } from '@wordpress/blocks';
-
-const HeadingEdit = ( {
- attributes,
- mergeBlocks,
- onFocus,
- onReplace,
- setAttributes,
- style,
-} ) => {
- const { align, content, level, placeholder } = attributes;
-
- /* eslint-disable @wordpress/no-unused-vars-before-return */
- const { TextColor } = __experimentalUseColors( [
- { name: 'textColor', property: 'color' },
- ] );
- /* eslint-enable @wordpress/no-unused-vars-before-return */
-
- return (
-
-
-
- setAttributes( { level: newLevel } )
- }
- isCollapsed={ false }
- />
-
-
-
- setAttributes( { content: value } )
- }
- onMerge={ mergeBlocks }
- onSplit={ ( value ) => {
- if ( ! value ) {
- return createBlock( 'core/paragraph' );
- }
-
- return createBlock( 'core/heading', {
- ...attributes,
- content: value,
- } );
- } }
- onReplace={ onReplace }
- onRemove={ () => onReplace( [] ) }
- placeholder={ placeholder || __( 'Write heading…' ) }
- textAlign={ align }
- />
-
-
- );
-};
-
-export default HeadingEdit;
diff --git a/packages/block-library/src/heading/heading-level-icon.js b/packages/block-library/src/heading/heading-level-icon.js
index 29a60cd93d7217..eef2b3af3b5e7e 100644
--- a/packages/block-library/src/heading/heading-level-icon.js
+++ b/packages/block-library/src/heading/heading-level-icon.js
@@ -18,8 +18,8 @@ export default function HeadingLevelIcon( { level, isPressed = false } ) {
return (
);
diff --git a/packages/block-library/src/heading/style.scss b/packages/block-library/src/heading/style.scss
new file mode 100644
index 00000000000000..31a6989c39c817
--- /dev/null
+++ b/packages/block-library/src/heading/style.scss
@@ -0,0 +1,10 @@
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ &.has-background {
+ padding: $block-bg-padding--v $block-bg-padding--h;
+ }
+}
diff --git a/packages/block-library/src/html/index.js b/packages/block-library/src/html/index.js
index f3e592da15318e..78abd06156f10d 100644
--- a/packages/block-library/src/html/index.js
+++ b/packages/block-library/src/html/index.js
@@ -10,7 +10,6 @@ import { html as icon } from '@wordpress/icons';
import edit from './edit';
import metadata from './block.json';
import save from './save';
-import transforms from './transforms';
const { name } = metadata;
@@ -34,7 +33,6 @@ export const settings = {
className: false,
html: false,
},
- transforms,
edit,
save,
};
diff --git a/packages/block-library/src/html/transforms.js b/packages/block-library/src/html/transforms.js
deleted file mode 100644
index 7b6c054f1c2080..00000000000000
--- a/packages/block-library/src/html/transforms.js
+++ /dev/null
@@ -1,29 +0,0 @@
-const transforms = {
- from: [
- {
- type: 'raw',
- isMatch: ( node ) =>
- node.nodeName === 'FIGURE' && !! node.querySelector( 'iframe' ),
- schema: ( { phrasingContentSchema } ) => ( {
- figure: {
- require: [ 'iframe' ],
- children: {
- iframe: {
- attributes: [
- 'src',
- 'allowfullscreen',
- 'height',
- 'width',
- ],
- },
- figcaption: {
- children: phrasingContentSchema,
- },
- },
- },
- } ),
- },
- ],
-};
-
-export default transforms;
diff --git a/packages/block-library/src/image/edit.js b/packages/block-library/src/image/edit.js
index 28edc6a340818a..30ddaefd89602e 100644
--- a/packages/block-library/src/image/edit.js
+++ b/packages/block-library/src/image/edit.js
@@ -33,7 +33,7 @@ import {
__experimentalImageSizeControl as ImageSizeControl,
__experimentalImageURLInputUI as ImageURLInputUI,
} from '@wordpress/block-editor';
-import { Component, Fragment } from '@wordpress/element';
+import { Component } from '@wordpress/element';
import { __, sprintf } from '@wordpress/i18n';
import { getPath } from '@wordpress/url';
import { withViewportMatch } from '@wordpress/viewport';
@@ -391,12 +391,6 @@ export class ImageEdit extends Component {
);
const src = isExternal ? url : undefined;
- const labels = {
- title: ! url ? __( 'Image' ) : __( 'Edit image' ),
- instructions: __(
- 'Upload an image file, pick one from your media library, or add one with a URL.'
- ),
- };
const mediaPreview = !! url && (
}
- labels={ labels }
onSelect={ this.onSelectImage }
onSelectURL={ this.onSelectURL }
notices={ noticeUI }
@@ -516,17 +509,23 @@ export class ImageEdit extends Component {
>
);
- const AlignmentWrapper = needsAlignmentWrapper ? Block.div : Fragment;
- const BlockContentWrapper = needsAlignmentWrapper
- ? 'figure'
- : Block.figure;
// Disable reason: Each block can be selected by clicking on it
/* eslint-disable jsx-a11y/click-events-have-key-events */
return (
<>
{ controls }
-
-
+
+
{ ( sizes ) => {
const {
@@ -542,6 +541,7 @@ export class ImageEdit extends Component {
defaultedAlt = alt;
} else if ( filename ) {
defaultedAlt = sprintf(
+ /* translators: %s: file name */
__(
'This image has an empty alt attribute; its file name is %s'
),
@@ -704,8 +704,8 @@ export class ImageEdit extends Component {
) }
{ mediaPlaceholder }
-
-
+
+
>
);
/* eslint-enable jsx-a11y/click-events-have-key-events */
diff --git a/packages/block-library/src/image/edit.native.js b/packages/block-library/src/image/edit.native.js
index 453afaf43f0618..90c4b4707df689 100644
--- a/packages/block-library/src/image/edit.native.js
+++ b/packages/block-library/src/image/edit.native.js
@@ -15,7 +15,6 @@ import {
requestImageFailedRetryDialog,
requestImageUploadCancelDialog,
requestImageFullscreenPreview,
- showMediaEditorButton,
} from 'react-native-gutenberg-bridge';
import { isEmpty, get, find, map } from 'lodash';
@@ -44,17 +43,22 @@ import {
MediaEdit,
} from '@wordpress/block-editor';
import { __, sprintf } from '@wordpress/i18n';
-import { isURL } from '@wordpress/url';
+import { getProtocol } from '@wordpress/url';
import { doAction, hasAction } from '@wordpress/hooks';
import { compose, withPreferredColorScheme } from '@wordpress/compose';
import { withSelect } from '@wordpress/data';
-import { external, link, image as icon, textColor } from '@wordpress/icons';
+import {
+ external,
+ link,
+ image as icon,
+ textColor,
+ replace,
+} from '@wordpress/icons';
/**
* Internal dependencies
*/
import styles from './styles.scss';
-import { editImageIcon } from './icon';
import SvgIconRetry from './icon-retry';
import SvgIconCustomize from './icon-customize';
import { getUpdatedLinkTargetSettings } from './utils';
@@ -78,8 +82,6 @@ const getUrlForSlug = ( image, { sizeSlug } ) => {
return get( image, [ 'media_details', 'sizes', sizeSlug, 'source_url' ] );
};
-const isFileUrl = ( url ) => url && url.startsWith( 'file:' );
-
export class ImageEdit extends React.Component {
constructor( props ) {
super( props );
@@ -125,7 +127,7 @@ export class ImageEdit extends React.Component {
if (
! attributes.id &&
attributes.url &&
- isFileUrl( attributes.url )
+ getProtocol( attributes.url ) === 'file:'
) {
requestMediaImport( attributes.url, ( id, url ) => {
if ( url ) {
@@ -136,7 +138,11 @@ export class ImageEdit extends React.Component {
// Make sure we mark any temporary images as failed if they failed while
// the editor wasn't open
- if ( attributes.id && attributes.url && ! isURL( attributes.url ) ) {
+ if (
+ attributes.id &&
+ attributes.url &&
+ getProtocol( attributes.url ) === 'file:'
+ ) {
mediaUploadSync();
}
}
@@ -175,7 +181,10 @@ export class ImageEdit extends React.Component {
if ( this.state.isUploadInProgress ) {
requestImageUploadCancelDialog( attributes.id );
- } else if ( attributes.id && ! isURL( attributes.url ) ) {
+ } else if (
+ attributes.id &&
+ getProtocol( attributes.url ) === 'file:'
+ ) {
requestImageFailedRetryDialog( attributes.id );
} else if ( ! this.state.isCaptionSelected ) {
requestImageFullscreenPreview(
@@ -373,14 +382,13 @@ export class ImageEdit extends React.Component {
);
@@ -597,8 +605,7 @@ export class ImageEdit extends React.Component {
! isUploadInProgress &&
! isUploadFailed &&
finalWidth &&
- finalHeight &&
- showMediaEditorButton && (
+ finalHeight && (
-
-
-
-
-
-);
diff --git a/packages/block-library/src/index.js b/packages/block-library/src/index.js
index 0761b2b11292f3..206c705651e9af 100644
--- a/packages/block-library/src/index.js
+++ b/packages/block-library/src/index.js
@@ -68,6 +68,7 @@ import * as templatePart from './template-part';
import * as postTitle from './post-title';
import * as postContent from './post-content';
import * as postAuthor from './post-author';
+import * as postComments from './post-comments';
import * as postCommentsCount from './post-comments-count';
import * as postCommentsForm from './post-comments-form';
import * as postDate from './post-date';
@@ -199,6 +200,7 @@ export const __experimentalRegisterExperimentalCoreBlocks =
postTitle,
postContent,
postAuthor,
+ postComments,
postCommentsCount,
postCommentsForm,
postDate,
diff --git a/packages/block-library/src/index.native.js b/packages/block-library/src/index.native.js
index 262b1bf7354c19..4efee4a3deda82 100644
--- a/packages/block-library/src/index.native.js
+++ b/packages/block-library/src/index.native.js
@@ -148,12 +148,16 @@ export const registerCoreBlocks = () => {
mediaText,
preformatted,
gallery,
+ columns,
+ column,
group,
button,
spacer,
shortcode,
+ latestPosts,
devOnly( verse ),
cover,
+ devOnly( pullquote ),
].forEach( registerBlock );
setDefaultBlockName( paragraph.name );
diff --git a/packages/block-library/src/latest-posts/block.json b/packages/block-library/src/latest-posts/block.json
new file mode 100644
index 00000000000000..e730d861626502
--- /dev/null
+++ b/packages/block-library/src/latest-posts/block.json
@@ -0,0 +1,72 @@
+{
+ "name": "core/latest-posts",
+ "category": "widgets",
+ "attributes": {
+ "align": {
+ "type": "string",
+ "enum": ["left", "center", "right", "wide", "full"]
+ },
+ "className": {
+ "type": "string"
+ },
+ "categories": {
+ "type": "array"
+ },
+ "postsToShow": {
+ "type": "number",
+ "default": 5
+ },
+ "displayPostContent": {
+ "type": "boolean",
+ "default": false
+ },
+ "displayPostContentRadio": {
+ "type": "string",
+ "default": "excerpt"
+ },
+ "excerptLength": {
+ "type": "number",
+ "default": 55
+ },
+ "displayPostDate": {
+ "type": "boolean",
+ "default": false
+ },
+ "postLayout": {
+ "type": "string",
+ "default": "list"
+ },
+ "columns": {
+ "type": "number",
+ "default": 3
+ },
+ "order": {
+ "type": "string",
+ "default": "desc"
+ },
+ "orderBy": {
+ "type": "string",
+ "default": "date"
+ },
+ "displayFeaturedImage": {
+ "type": "boolean",
+ "default": false
+ },
+ "featuredImageAlign": {
+ "type": "string",
+ "enum": ["left", "center", "right"]
+ },
+ "featuredImageSizeSlug": {
+ "type": "string",
+ "default":"thumbnail"
+ },
+ "featuredImageSizeWidth": {
+ "type": "number",
+ "default":null
+ },
+ "featuredImageSizeHeight": {
+ "type": "number",
+ "default":null
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/block-library/src/latest-posts/constants.js b/packages/block-library/src/latest-posts/constants.js
new file mode 100644
index 00000000000000..70c34448a3bff6
--- /dev/null
+++ b/packages/block-library/src/latest-posts/constants.js
@@ -0,0 +1,3 @@
+export const MIN_EXCERPT_LENGTH = 10;
+export const MAX_EXCERPT_LENGTH = 100;
+export const MAX_POSTS_COLUMNS = 6;
diff --git a/packages/block-library/src/latest-posts/edit.js b/packages/block-library/src/latest-posts/edit.js
index 98e43940a9c8ba..8e58ddd7260554 100644
--- a/packages/block-library/src/latest-posts/edit.js
+++ b/packages/block-library/src/latest-posts/edit.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import { get, invoke, isUndefined, pickBy } from 'lodash';
+import { get, includes, invoke, isUndefined, pickBy } from 'lodash';
import classnames from 'classnames';
/**
@@ -32,13 +32,21 @@ import {
import { withSelect } from '@wordpress/data';
import { pin, list, grid } from '@wordpress/icons';
+/**
+ * Internal dependencies
+ */
+import {
+ MIN_EXCERPT_LENGTH,
+ MAX_EXCERPT_LENGTH,
+ MAX_POSTS_COLUMNS,
+} from './constants';
+
/**
* Module Constants
*/
const CATEGORIES_LIST_QUERY = {
per_page: -1,
};
-const MAX_POSTS_COLUMNS = 6;
class LatestPostsEdit extends Component {
constructor() {
@@ -96,6 +104,39 @@ class LatestPostsEdit extends Component {
featuredImageSizeWidth,
featuredImageSizeHeight,
} = attributes;
+ const suggestions = categoriesList.reduce(
+ ( accumulator, category ) => ( {
+ ...accumulator,
+ [ category.name ]: category,
+ } ),
+ {}
+ );
+ const categorySuggestions = categoriesList.reduce(
+ ( accumulator, category ) => ( {
+ ...accumulator,
+ [ category.name ]: category,
+ } ),
+ {}
+ );
+ const selectCategories = ( tokens ) => {
+ const hasNoSuggestion = tokens.some(
+ ( token ) => typeof token === 'string' && ! suggestions[ token ]
+ );
+ if ( hasNoSuggestion ) {
+ return;
+ }
+ // Categories that are already will be objects, while new additions will be strings (the name).
+ // allCategories nomalizes the array so that they are all objects.
+ const allCategories = tokens.map( ( token ) => {
+ return typeof token === 'string' ? suggestions[ token ] : token;
+ } );
+ // We do nothing if the category is not selected
+ // from suggestions.
+ if ( includes( allCategories, null ) ) {
+ return false;
+ }
+ setAttributes( { categories: allCategories } );
+ };
const inspectorControls = (
@@ -133,8 +174,8 @@ class LatestPostsEdit extends Component {
onChange={ ( value ) =>
setAttributes( { excerptLength: value } )
}
- min={ 10 }
- max={ 100 }
+ min={ MIN_EXCERPT_LENGTH }
+ max={ MAX_EXCERPT_LENGTH }
/>
) }
@@ -209,23 +250,20 @@ class LatestPostsEdit extends Component {
setAttributes( { order: value } )
}
onOrderByChange={ ( value ) =>
setAttributes( { orderBy: value } )
}
- onCategoryChange={ ( value ) =>
- setAttributes( {
- categories: '' !== value ? value : undefined,
- } )
- }
onNumberOfItemsChange={ ( value ) =>
setAttributes( { postsToShow: value } )
}
+ categorySuggestions={ categorySuggestions }
+ onCategoryChange={ selectCategories }
+ selectedCategories={ categories }
/>
+
{ postLayout === 'grid' && (
+ { excerpt
+ .trim()
+ .split( ' ', excerptLength )
+ .join( ' ' ) }
+ { /* translators: excerpt truncation character, default … */ }
+ { __( ' … ' ) }
+
+ { __( 'Read more' ) }
+
+ >
+ ) : (
+ excerpt
+ );
+
return (
{ displayFeaturedImage && (
@@ -369,30 +432,7 @@ class LatestPostsEdit extends Component {
{ displayPostContent &&
displayPostContentRadio === 'excerpt' && (
-
- { excerptLength <
- excerpt.trim().split( ' ' )
- .length
- ? excerpt
- .trim()
- .split(
- ' ',
- excerptLength
- )
- .join( ' ' ) +
- ' ... ' +
- __( 'Read more' ) +
- ' '
- : excerpt
- .trim()
- .split(
- ' ',
- excerptLength
- )
- .join( ' ' ) }
-
+ { postExcerpt }
) }
{ displayPostContent &&
@@ -423,9 +463,13 @@ export default withSelect( ( select, props ) => {
const { getEntityRecords, getMedia } = select( 'core' );
const { getSettings } = select( 'core/block-editor' );
const { imageSizes, imageDimensions } = getSettings();
+ const catIds =
+ categories && categories.length > 0
+ ? categories.map( ( cat ) => cat.id )
+ : [];
const latestPostsQuery = pickBy(
{
- categories,
+ categories: catIds,
order,
orderby: orderBy,
per_page: postsToShow,
@@ -439,8 +483,16 @@ export default withSelect( ( select, props ) => {
.map( ( { name, slug } ) => ( { value: slug, label: name } ) );
return {
- defaultImageWidth: imageDimensions[ featuredImageSizeSlug ].width,
- defaultImageHeight: imageDimensions[ featuredImageSizeSlug ].height,
+ defaultImageWidth: get(
+ imageDimensions,
+ [ featuredImageSizeSlug, 'width' ],
+ 0
+ ),
+ defaultImageHeight: get(
+ imageDimensions,
+ [ featuredImageSizeSlug, 'height' ],
+ 0
+ ),
imageSizeOptions,
latestPosts: ! Array.isArray( posts )
? posts
diff --git a/packages/block-library/src/latest-posts/edit.native.js b/packages/block-library/src/latest-posts/edit.native.js
new file mode 100644
index 00000000000000..37af86b2036a3f
--- /dev/null
+++ b/packages/block-library/src/latest-posts/edit.native.js
@@ -0,0 +1,254 @@
+/**
+ * External dependencies
+ */
+import { TouchableWithoutFeedback, View, Text } from 'react-native';
+import { isEmpty } from 'lodash';
+
+/**
+ * WordPress dependencies
+ */
+import { Component } from '@wordpress/element';
+import { compose, withPreferredColorScheme } from '@wordpress/compose';
+import { withDispatch } from '@wordpress/data';
+import { coreBlocks } from '@wordpress/block-library';
+import { __ } from '@wordpress/i18n';
+import { postList as icon } from '@wordpress/icons';
+import { InspectorControls } from '@wordpress/block-editor';
+import apiFetch from '@wordpress/api-fetch';
+import {
+ Icon,
+ PanelBody,
+ ToggleControl,
+ RangeControl,
+ QueryControls,
+} from '@wordpress/components';
+
+/**
+ * Internal dependencies
+ */
+import styles from './style.scss';
+import { MIN_EXCERPT_LENGTH, MAX_EXCERPT_LENGTH } from './constants';
+
+class LatestPostsEdit extends Component {
+ constructor() {
+ super( ...arguments );
+ this.state = {
+ categoriesList: [],
+ };
+ this.onSetDisplayPostContent = this.onSetDisplayPostContent.bind(
+ this
+ );
+ this.onSetDisplayPostContentRadio = this.onSetDisplayPostContentRadio.bind(
+ this
+ );
+ this.onSetExcerptLength = this.onSetExcerptLength.bind( this );
+ this.onSetDisplayPostDate = this.onSetDisplayPostDate.bind( this );
+ this.onSetOrder = this.onSetOrder.bind( this );
+ this.onSetOrderBy = this.onSetOrderBy.bind( this );
+ this.onSetPostsToShow = this.onSetPostsToShow.bind( this );
+ this.onSetCategories = this.onSetCategories.bind( this );
+ this.getInspectorControls = this.getInspectorControls.bind( this );
+ }
+
+ componentDidMount() {
+ this.isStillMounted = true;
+ this.fetchRequest = apiFetch( { path: '/wp/v2/categories' } )
+ .then( ( categoriesList ) => {
+ if ( this.isStillMounted ) {
+ this.setState( {
+ categoriesList: isEmpty( categoriesList )
+ ? []
+ : categoriesList,
+ } );
+ }
+ } )
+ .catch( () => {
+ if ( this.isStillMounted ) {
+ this.setState( { categoriesList: [] } );
+ }
+ } );
+ }
+
+ componentWillUnmount() {
+ this.isStillMounted = false;
+ }
+
+ onSetDisplayPostContent( value ) {
+ const { setAttributes } = this.props;
+ setAttributes( { displayPostContent: value } );
+ }
+
+ onSetDisplayPostContentRadio( value ) {
+ const { setAttributes } = this.props;
+ setAttributes( {
+ displayPostContentRadio: value ? 'excerpt' : 'full_post',
+ } );
+ }
+
+ onSetExcerptLength( value ) {
+ const { setAttributes } = this.props;
+ setAttributes( { excerptLength: value } );
+ }
+
+ onSetDisplayPostDate( value ) {
+ const { setAttributes } = this.props;
+ setAttributes( { displayPostDate: value } );
+ }
+
+ onSetOrder( value ) {
+ const { setAttributes } = this.props;
+ setAttributes( { order: value } );
+ }
+
+ onSetOrderBy( value ) {
+ const { setAttributes } = this.props;
+ setAttributes( { orderBy: value } );
+ }
+
+ onSetPostsToShow( value ) {
+ const { setAttributes } = this.props;
+ setAttributes( { postsToShow: value } );
+ }
+
+ onSetCategories( value ) {
+ const { setAttributes } = this.props;
+ setAttributes( {
+ categories: '' !== value ? value.toString() : undefined,
+ } );
+ }
+
+ getInspectorControls() {
+ const { attributes } = this.props;
+ const {
+ displayPostContent,
+ displayPostContentRadio,
+ excerptLength,
+ displayPostDate,
+ order,
+ orderBy,
+ postsToShow,
+ categories,
+ } = attributes;
+
+ const { categoriesList } = this.state;
+ const displayExcerptPostContent = displayPostContentRadio === 'excerpt';
+
+ return (
+
+
+
+ { displayPostContent && (
+
+ ) }
+ { displayPostContent && displayExcerptPostContent && (
+
+ ) }
+
+
+
+
+
+
+
+
+
+
+ );
+ }
+
+ render() {
+ const {
+ getStylesFromColorScheme,
+ name,
+ openGeneralSidebar,
+ isSelected,
+ } = this.props;
+
+ const blockType = coreBlocks[ name ];
+
+ const blockStyle = getStylesFromColorScheme(
+ styles.latestPostBlock,
+ styles.latestPostBlockDark
+ );
+
+ const iconStyle = getStylesFromColorScheme(
+ styles.latestPostBlockIcon,
+ styles.latestPostBlockIconDark
+ );
+
+ const titleStyle = getStylesFromColorScheme(
+ styles.latestPostBlockMessage,
+ styles.latestPostBlockMessageDark
+ );
+
+ return (
+
+
+ { this.getInspectorControls() }
+
+
+ { blockType.settings.title }
+
+
+ { __( 'CUSTOMIZE' ) }
+
+
+
+ );
+ }
+}
+
+export default compose( [
+ withDispatch( ( dispatch ) => {
+ const { openGeneralSidebar } = dispatch( 'core/edit-post' );
+
+ return {
+ openGeneralSidebar: () => openGeneralSidebar( 'edit-post/block' ),
+ };
+ } ),
+ withPreferredColorScheme,
+] )( LatestPostsEdit );
diff --git a/packages/block-library/src/latest-posts/index.js b/packages/block-library/src/latest-posts/index.js
index bbbacbb40128f8..63f7b7bfae638a 100644
--- a/packages/block-library/src/latest-posts/index.js
+++ b/packages/block-library/src/latest-posts/index.js
@@ -8,14 +8,15 @@ import { postList as icon } from '@wordpress/icons';
* Internal dependencies
*/
import edit from './edit';
+import metadata from './block.json';
-export const name = 'core/latest-posts';
+const { name } = metadata;
+export { metadata, name };
export const settings = {
title: __( 'Latest Posts' ),
description: __( 'Display a list of your most recent posts.' ),
icon,
- category: 'widgets',
keywords: [ __( 'recent posts' ) ],
supports: {
align: true,
diff --git a/packages/block-library/src/latest-posts/index.php b/packages/block-library/src/latest-posts/index.php
index 6e96f104612316..f9002ebde627da 100644
--- a/packages/block-library/src/latest-posts/index.php
+++ b/packages/block-library/src/latest-posts/index.php
@@ -33,7 +33,7 @@ function block_core_latest_posts_get_excerpt_length() {
* @return string Returns the post content with latest posts added.
*/
function render_block_core_latest_posts( $attributes ) {
- global $block_core_latest_posts_excerpt_length;
+ global $post, $block_core_latest_posts_excerpt_length;
$args = array(
'posts_per_page' => $attributes['postsToShow'],
@@ -47,7 +47,7 @@ function render_block_core_latest_posts( $attributes ) {
add_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 );
if ( isset( $attributes['categories'] ) ) {
- $args['category'] = $attributes['categories'];
+ $args['category__in'] = array_column( $attributes['categories'], 'id' );
}
$recent_posts = get_posts( $args );
@@ -55,6 +55,7 @@ function render_block_core_latest_posts( $attributes ) {
$list_items_markup = '';
foreach ( $recent_posts as $post ) {
+
$list_items_markup .= ' ';
if ( $attributes['displayFeaturedImage'] && has_post_thumbnail( $post ) ) {
@@ -108,21 +109,9 @@ function render_block_core_latest_posts( $attributes ) {
$trimmed_excerpt = get_the_excerpt( $post );
$list_items_markup .= sprintf(
- '%1$s',
+ '
%1$s
',
$trimmed_excerpt
);
-
- if ( strpos( $trimmed_excerpt, ' … ' ) !== false ) {
- $list_items_markup .= sprintf(
- '
%2$s ',
- esc_url( get_permalink( $post ) ),
- __( 'Read more' )
- );
- } else {
- $list_items_markup .= sprintf(
- ' '
- );
- }
}
if ( isset( $attributes['displayPostContent'] ) && $attributes['displayPostContent']
@@ -170,78 +159,16 @@ function render_block_core_latest_posts( $attributes ) {
* Registers the `core/latest-posts` block on server.
*/
function register_block_core_latest_posts() {
+ $path = __DIR__ . '/latest-posts/block.json';
+ $metadata = json_decode( file_get_contents( $path ), true );
+
register_block_type(
- 'core/latest-posts',
- array(
- 'attributes' => array(
- 'align' => array(
- 'type' => 'string',
- 'enum' => array( 'left', 'center', 'right', 'wide', 'full' ),
- ),
- 'className' => array(
- 'type' => 'string',
- ),
- 'categories' => array(
- 'type' => 'string',
- ),
- 'postsToShow' => array(
- 'type' => 'number',
- 'default' => 5,
- ),
- 'displayPostContent' => array(
- 'type' => 'boolean',
- 'default' => false,
- ),
- 'displayPostContentRadio' => array(
- 'type' => 'string',
- 'default' => 'excerpt',
- ),
- 'excerptLength' => array(
- 'type' => 'number',
- 'default' => 55,
- ),
- 'displayPostDate' => array(
- 'type' => 'boolean',
- 'default' => false,
- ),
- 'postLayout' => array(
- 'type' => 'string',
- 'default' => 'list',
- ),
- 'columns' => array(
- 'type' => 'number',
- 'default' => 3,
- ),
- 'order' => array(
- 'type' => 'string',
- 'default' => 'desc',
- ),
- 'orderBy' => array(
- 'type' => 'string',
- 'default' => 'date',
- ),
- 'displayFeaturedImage' => array(
- 'type' => 'boolean',
- 'default' => false,
- ),
- 'featuredImageAlign' => array(
- 'type' => 'string',
- 'enum' => array( 'left', 'center', 'right' ),
- ),
- 'featuredImageSizeSlug' => array(
- 'type' => 'string',
- 'default' => 'thumbnail',
- ),
- 'featuredImageSizeWidth' => array(
- 'type' => 'number',
- 'default' => null,
- ),
- 'featuredImageSizeHeight' => array(
- 'type' => 'number',
- 'default' => null,
- ),
- ),
- 'render_callback' => 'render_block_core_latest_posts',
+ $metadata['name'],
+ array_merge(
+ $metadata,
+ array(
+ 'render_callback' => 'render_block_core_latest_posts',
+ )
)
);
}
diff --git a/packages/block-library/src/latest-posts/style.native.scss b/packages/block-library/src/latest-posts/style.native.scss
new file mode 100644
index 00000000000000..529c52f507fecf
--- /dev/null
+++ b/packages/block-library/src/latest-posts/style.native.scss
@@ -0,0 +1,47 @@
+.latestPostBlock {
+ height: 142;
+ background-color: $gray-lighten-30;
+ padding-top: 12;
+ padding-bottom: 12;
+ padding-left: 12;
+ padding-right: 12;
+ border-top-left-radius: 4;
+ border-top-right-radius: 4;
+ border-bottom-left-radius: 4;
+ border-bottom-right-radius: 4;
+ align-items: center;
+ justify-content: center;
+}
+
+.latestPostBlockDark {
+ background-color: $background-dark-secondary;
+}
+
+.latestPostBlockIcon {
+ fill: $gray-dark;
+ width: 24px;
+ height: 24px;
+}
+
+.latestPostBlockIconDark {
+ fill: $white;
+}
+
+.latestPostBlockMessage {
+ text-align: center;
+ margin-top: 8;
+ font-size: 14;
+ color: $gray-dark;
+}
+
+.latestPostBlockMessageDark {
+ color: $white;
+}
+
+.latestPostBlockSubtitle {
+ margin-top: 10;
+ text-align: center;
+ font-size: 14;
+ font-weight: 500;
+ color: $blue-wordpress;
+}
diff --git a/packages/block-library/src/latest-posts/style.scss b/packages/block-library/src/latest-posts/style.scss
index cb5fc32c270666..c16e80c221ef49 100644
--- a/packages/block-library/src/latest-posts/style.scss
+++ b/packages/block-library/src/latest-posts/style.scss
@@ -20,7 +20,7 @@
padding: 0;
li {
- margin: 0 16px 16px 0;
+ margin: 0 20px 20px 0;
width: 100%;
}
}
@@ -28,7 +28,7 @@
@include break-small {
@for $i from 2 through 6 {
&.columns-#{ $i } li {
- width: calc((100% / #{ $i }) - 16px);
+ width: calc((100% / #{ $i }) - 20px);
}
}
}
@@ -63,3 +63,7 @@
text-align: center;
}
}
+
+.edit-post-visual-editor .wp-block-latest-posts.is-grid li {
+ margin-bottom: 20px;
+}
diff --git a/packages/block-library/src/list/test/edit.native.js b/packages/block-library/src/list/test/edit.native.js
new file mode 100644
index 00000000000000..0968a02f2eba15
--- /dev/null
+++ b/packages/block-library/src/list/test/edit.native.js
@@ -0,0 +1,16 @@
+/**
+ * External dependencies
+ */
+import { shallow } from 'enzyme';
+
+/**
+ * Internal dependencies
+ */
+import ListEdit from '../edit';
+
+describe( 'ListEdit component', () => {
+ it( 'renders without crashing', () => {
+ const wrapper = shallow( );
+ expect( wrapper ).toBeTruthy();
+ } );
+} );
diff --git a/packages/block-library/src/media-text/block.json b/packages/block-library/src/media-text/block.json
index eb16cddf7d6a64..44cca8579e99c9 100644
--- a/packages/block-library/src/media-text/block.json
+++ b/packages/block-library/src/media-text/block.json
@@ -6,12 +6,6 @@
"type": "string",
"default": "wide"
},
- "backgroundColor": {
- "type": "string"
- },
- "customBackgroundColor": {
- "type": "string"
- },
"mediaAlt": {
"type": "string",
"source": "attribute",
diff --git a/packages/block-library/src/media-text/deprecated.js b/packages/block-library/src/media-text/deprecated.js
index 83512f4ee163fb..cd06840df83df6 100644
--- a/packages/block-library/src/media-text/deprecated.js
+++ b/packages/block-library/src/media-text/deprecated.js
@@ -2,7 +2,7 @@
* External dependencies
*/
import classnames from 'classnames';
-import { noop } from 'lodash';
+import { noop, isEmpty, omit } from 'lodash';
/**
* WordPress dependencies
@@ -16,6 +16,21 @@ import { imageFillStyles } from './media-container';
const DEFAULT_MEDIA_WIDTH = 50;
+const migrateCustomColors = ( attributes ) => {
+ if ( ! attributes.customBackgroundColor ) {
+ return attributes;
+ }
+ const style = {
+ color: {
+ background: attributes.customBackgroundColor,
+ },
+ };
+ return {
+ ...omit( attributes, [ 'customBackgroundColor' ] ),
+ style,
+ };
+};
+
const baseAttributes = {
align: {
type: 'string',
@@ -24,9 +39,6 @@ const baseAttributes = {
backgroundColor: {
type: 'string',
},
- customBackgroundColor: {
- type: 'string',
- },
mediaAlt: {
type: 'string',
source: 'attribute',
@@ -41,12 +53,6 @@ const baseAttributes = {
mediaId: {
type: 'number',
},
- mediaUrl: {
- type: 'string',
- source: 'attribute',
- selector: 'figure video,figure img',
- attribute: 'src',
- },
mediaType: {
type: 'string',
},
@@ -64,6 +70,39 @@ export default [
{
attributes: {
...baseAttributes,
+ customBackgroundColor: {
+ type: 'string',
+ },
+ mediaLink: {
+ type: 'string',
+ },
+ linkDestination: {
+ type: 'string',
+ },
+ linkTarget: {
+ type: 'string',
+ source: 'attribute',
+ selector: 'figure a',
+ attribute: 'target',
+ },
+ href: {
+ type: 'string',
+ source: 'attribute',
+ selector: 'figure a',
+ attribute: 'href',
+ },
+ rel: {
+ type: 'string',
+ source: 'attribute',
+ selector: 'figure a',
+ attribute: 'rel',
+ },
+ linkClass: {
+ type: 'string',
+ source: 'attribute',
+ selector: 'figure a',
+ attribute: 'class',
+ },
verticalAlignment: {
type: 'string',
},
@@ -74,6 +113,124 @@ export default [
type: 'object',
},
},
+ migrate: migrateCustomColors,
+ save( { attributes } ) {
+ const {
+ backgroundColor,
+ customBackgroundColor,
+ isStackedOnMobile,
+ mediaAlt,
+ mediaPosition,
+ mediaType,
+ mediaUrl,
+ mediaWidth,
+ mediaId,
+ verticalAlignment,
+ imageFill,
+ focalPoint,
+ linkClass,
+ href,
+ linkTarget,
+ rel,
+ } = attributes;
+ const newRel = isEmpty( rel ) ? undefined : rel;
+
+ let image = (
+
+ );
+
+ if ( href ) {
+ image = (
+
+ { image }
+
+ );
+ }
+
+ const mediaTypeRenders = {
+ image: () => image,
+ video: () => ,
+ };
+ const backgroundClass = getColorClassName(
+ 'background-color',
+ backgroundColor
+ );
+ const className = classnames( {
+ 'has-media-on-the-right': 'right' === mediaPosition,
+ 'has-background': backgroundClass || customBackgroundColor,
+ [ backgroundClass ]: backgroundClass,
+ 'is-stacked-on-mobile': isStackedOnMobile,
+ [ `is-vertically-aligned-${ verticalAlignment }` ]: verticalAlignment,
+ 'is-image-fill': imageFill,
+ } );
+ const backgroundStyles = imageFill
+ ? imageFillStyles( mediaUrl, focalPoint )
+ : {};
+
+ let gridTemplateColumns;
+ if ( mediaWidth !== DEFAULT_MEDIA_WIDTH ) {
+ gridTemplateColumns =
+ 'right' === mediaPosition
+ ? `auto ${ mediaWidth }%`
+ : `${ mediaWidth }% auto`;
+ }
+ const style = {
+ backgroundColor: backgroundClass
+ ? undefined
+ : customBackgroundColor,
+ gridTemplateColumns,
+ };
+ return (
+
+
+ { ( mediaTypeRenders[ mediaType ] || noop )() }
+
+
+
+
+
+ );
+ },
+ },
+ {
+ attributes: {
+ ...baseAttributes,
+ customBackgroundColor: {
+ type: 'string',
+ },
+ mediaUrl: {
+ type: 'string',
+ source: 'attribute',
+ selector: 'figure video,figure img',
+ attribute: 'src',
+ },
+ verticalAlignment: {
+ type: 'string',
+ },
+ imageFill: {
+ type: 'boolean',
+ },
+ focalPoint: {
+ type: 'object',
+ },
+ },
+ migrate: migrateCustomColors,
save( { attributes } ) {
const {
backgroundColor,
@@ -147,7 +304,18 @@ export default [
},
},
{
- attributes: baseAttributes,
+ attributes: {
+ ...baseAttributes,
+ customBackgroundColor: {
+ type: 'string',
+ },
+ mediaUrl: {
+ type: 'string',
+ source: 'attribute',
+ selector: 'figure video,figure img',
+ attribute: 'src',
+ },
+ },
save( { attributes } ) {
const {
backgroundColor,
diff --git a/packages/block-library/src/media-text/edit.js b/packages/block-library/src/media-text/edit.js
index 03a767862f1be4..86fd9c808596ce 100644
--- a/packages/block-library/src/media-text/edit.js
+++ b/packages/block-library/src/media-text/edit.js
@@ -15,8 +15,6 @@ import {
BlockVerticalAlignmentToolbar,
InnerBlocks,
InspectorControls,
- PanelColorSettings,
- withColors,
__experimentalImageURLInputUI as ImageURLInputUI,
} from '@wordpress/block-editor';
import { Component } from '@wordpress/element';
@@ -183,10 +181,8 @@ class MediaTextEdit extends Component {
const {
attributes,
className,
- backgroundColor,
isSelected,
setAttributes,
- setBackgroundColor,
image,
} = this.props;
const {
@@ -210,8 +206,6 @@ class MediaTextEdit extends Component {
const classNames = classnames( className, {
'has-media-on-the-right': 'right' === mediaPosition,
'is-selected': isSelected,
- 'has-background': backgroundColor.class || backgroundColor.color,
- [ backgroundColor.class ]: backgroundColor.class,
'is-stacked-on-mobile': isStackedOnMobile,
[ `is-vertically-aligned-${ verticalAlignment }` ]: verticalAlignment,
'is-image-fill': imageFill,
@@ -224,15 +218,7 @@ class MediaTextEdit extends Component {
const style = {
gridTemplateColumns,
msGridColumns: gridTemplateColumns,
- backgroundColor: backgroundColor.color,
};
- const colorSettings = [
- {
- value: backgroundColor.color,
- onChange: setBackgroundColor,
- label: __( 'Background color' ),
- },
- ];
const toolbarControls = [
{
icon: pullLeft,
@@ -311,11 +297,6 @@ class MediaTextEdit extends Component {
<>
{ mediaTextGeneralSettings }
-
@@ -352,7 +333,6 @@ class MediaTextEdit extends Component {
}
export default compose( [
- withColors( 'backgroundColor' ),
withSelect( ( select, props ) => {
const { getMedia } = select( 'core' );
const {
diff --git a/packages/block-library/src/media-text/edit.native.js b/packages/block-library/src/media-text/edit.native.js
index 3a582686c7c7b6..d2c70814cd5f7b 100644
--- a/packages/block-library/src/media-text/edit.native.js
+++ b/packages/block-library/src/media-text/edit.native.js
@@ -184,14 +184,13 @@ class MediaTextEdit extends Component {
backgroundColor,
setAttributes,
isSelected,
- isParentSelected,
- isAncestorSelected,
} = this.props;
const {
isStackedOnMobile,
mediaPosition,
mediaWidth,
verticalAlignment,
+ style,
} = attributes;
const { containerWidth } = this.state;
@@ -202,11 +201,14 @@ class MediaTextEdit extends Component {
: this.state.mediaWidth || mediaWidth;
const widthString = `${ temporaryMediaWidth }%`;
- const innerBlockContainerStyle = ! shouldStack && {
- ...styles.paddingHorizontalNone,
- ...( mediaPosition === 'right' && styles.innerPaddingMediaOnRight ),
- ...( mediaPosition === 'left' && styles.innerPaddingMediaOnLeft ),
- };
+ const innerBlockContainerStyle = ! shouldStack
+ ? styles.innerBlock
+ : {
+ ...( mediaPosition === 'left'
+ ? styles.innerBlockStackMediaLeft
+ : styles.innerBlockStackMediaRight ),
+ };
+
const containerStyles = {
...styles[ 'wp-block-media-text' ],
...styles[
@@ -215,20 +217,28 @@ class MediaTextEdit extends Component {
...( mediaPosition === 'right'
? styles[ 'has-media-on-the-right' ]
: {} ),
- ...( shouldStack ? styles[ 'is-stacked-on-mobile' ] : {} ),
+ ...( shouldStack && styles[ 'is-stacked-on-mobile' ] ),
...( shouldStack && mediaPosition === 'right'
? styles[ 'is-stacked-on-mobile.has-media-on-the-right' ]
: {} ),
- backgroundColor: backgroundColor.color,
+ ...( isSelected && styles[ 'is-selected' ] ),
+ backgroundColor:
+ ( style && style.color && style.color.background ) ||
+ backgroundColor.color,
};
+
const innerBlockWidth = shouldStack ? 100 : 100 - temporaryMediaWidth;
const innerBlockWidthString = `${ innerBlockWidth }%`;
- const mediaContainerStyle = {
- ...( isParentSelected || isAncestorSelected
- ? styles.denseMediaPadding
- : styles.regularMediaPadding ),
- ...( isSelected && styles.innerPadding ),
- };
+
+ const mediaContainerStyle = shouldStack
+ ? {
+ ...( mediaPosition === 'left' && styles.mediaStackLeft ),
+ ...( mediaPosition === 'right' && styles.mediaStackRight ),
+ }
+ : {
+ ...( mediaPosition === 'left' && styles.mediaLeft ),
+ ...( mediaPosition === 'right' && styles.mediaRight ),
+ };
const toolbarControls = [
{
@@ -256,7 +266,6 @@ class MediaTextEdit extends Component {
.block-editor-inner-blocks {
word-break: break-word;
grid-column: 2;
grid-row: 1;
diff --git a/packages/block-library/src/media-text/index.js b/packages/block-library/src/media-text/index.js
index 97996b6a8bb5e9..db22f30b70abf0 100644
--- a/packages/block-library/src/media-text/index.js
+++ b/packages/block-library/src/media-text/index.js
@@ -25,6 +25,7 @@ export const settings = {
supports: {
align: [ 'wide', 'full' ],
html: false,
+ __experimentalColor: { gradients: true },
},
example: {
attributes: {
diff --git a/packages/block-library/src/media-text/media-container.native.js b/packages/block-library/src/media-text/media-container.native.js
index c53b8e5d1f2139..cac4d5615a7265 100644
--- a/packages/block-library/src/media-text/media-container.native.js
+++ b/packages/block-library/src/media-text/media-container.native.js
@@ -29,9 +29,9 @@ import {
} from '@wordpress/block-editor';
import { Component } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
-import { isURL } from '@wordpress/url';
+import { isURL, getProtocol } from '@wordpress/url';
import { compose, withPreferredColorScheme } from '@wordpress/compose';
-import { pencil } from '@wordpress/icons';
+import { replace } from '@wordpress/icons';
/**
* Internal dependencies
@@ -74,7 +74,7 @@ class MediaContainer extends Component {
// Make sure we mark any temporary images as failed if they failed while
// the editor wasn't open
- if ( mediaId && mediaUrl && mediaUrl.indexOf( 'file:' ) === 0 ) {
+ if ( mediaId && mediaUrl && getProtocol( mediaUrl ) === 'file:' ) {
mediaUploadSync();
}
}
@@ -101,7 +101,7 @@ class MediaContainer extends Component {
if ( this.state.isUploadInProgress ) {
requestImageUploadCancelDialog( mediaId );
- } else if ( mediaId && ! isURL( mediaUrl ) ) {
+ } else if ( mediaId && getProtocol( mediaUrl ) === 'file:' ) {
requestImageFailedRetryDialog( mediaId );
}
}
@@ -131,7 +131,7 @@ class MediaContainer extends Component {
diff --git a/packages/block-library/src/media-text/save.js b/packages/block-library/src/media-text/save.js
index 12a39e2d45f0a4..f7b676b94c18fb 100644
--- a/packages/block-library/src/media-text/save.js
+++ b/packages/block-library/src/media-text/save.js
@@ -7,7 +7,7 @@ import { noop, isEmpty } from 'lodash';
/**
* WordPress dependencies
*/
-import { InnerBlocks, getColorClassName } from '@wordpress/block-editor';
+import { InnerBlocks } from '@wordpress/block-editor';
/**
* Internal dependencies
@@ -18,8 +18,6 @@ const DEFAULT_MEDIA_WIDTH = 50;
export default function save( { attributes } ) {
const {
- backgroundColor,
- customBackgroundColor,
isStackedOnMobile,
mediaAlt,
mediaPosition,
@@ -66,14 +64,8 @@ export default function save( { attributes } ) {
image: () => image,
video: () => ,
};
- const backgroundClass = getColorClassName(
- 'background-color',
- backgroundColor
- );
const className = classnames( {
'has-media-on-the-right': 'right' === mediaPosition,
- 'has-background': backgroundClass || customBackgroundColor,
- [ backgroundClass ]: backgroundClass,
'is-stacked-on-mobile': isStackedOnMobile,
[ `is-vertically-aligned-${ verticalAlignment }` ]: verticalAlignment,
'is-image-fill': imageFill,
@@ -90,7 +82,6 @@ export default function save( { attributes } ) {
: `${ mediaWidth }% auto`;
}
const style = {
- backgroundColor: backgroundClass ? undefined : customBackgroundColor,
gridTemplateColumns,
};
return (
diff --git a/packages/block-library/src/media-text/style.native.scss b/packages/block-library/src/media-text/style.native.scss
index 75fb16c740df81..4e8cca364896da 100644
--- a/packages/block-library/src/media-text/style.native.scss
+++ b/packages/block-library/src/media-text/style.native.scss
@@ -1,3 +1,5 @@
+$media-to-text: 12px;
+
.wp-block-media-text {
display: flex;
align-items: flex-start;
@@ -28,6 +30,10 @@
align-items: flex-end;
}
+.is-selected {
+ padding-bottom: 8;
+}
+
.content {
flex: 1;
}
@@ -104,27 +110,35 @@
color: $gray-dark;
}
-.innerPadding {
- padding: $block-selected-to-content;
+// Inner blocks STACK
+.innerBlockStackMediaLeft {
+ margin-top: $media-to-text;
+}
+
+.innerBlockStackMediaRight {
+ margin-bottom: $media-to-text;
}
-.innerPaddingMediaOnLeft {
- padding-right: $block-selected-to-content;
+// Inner blocks
+.innerBlock {
+ padding-right: $media-to-text;
+ padding-left: $media-to-text;
}
-.innerPaddingMediaOnRight {
- padding-left: $block-selected-to-content;
+// Media STACK
+.mediaStackLeft {
+ margin-bottom: $media-to-text;
}
-.paddingHorizontalNone {
- padding-left: 0;
- padding-right: 0;
+.mediaStackRight {
+ margin-top: $media-to-text;
}
-.regularMediaPadding {
- padding: $block-edge-to-content;
+// Media
+.mediaLeft {
+ padding-right: $media-to-text;
}
-.denseMediaPadding {
- padding: $block-media-container-to-content;
+.mediaRight {
+ padding-left: $media-to-text;
}
diff --git a/packages/block-library/src/media-text/style.scss b/packages/block-library/src/media-text/style.scss
index 2a59f2cbffbecc..76549eac202696 100644
--- a/packages/block-library/src/media-text/style.scss
+++ b/packages/block-library/src/media-text/style.scss
@@ -65,8 +65,8 @@
/*!rtl:end:ignore*/
}
-.wp-block-media-text > figure > img,
-.wp-block-media-text > figure > video {
+.wp-block-media-text__media img,
+.wp-block-media-text__media video {
max-width: unset;
width: 100%;
vertical-align: middle;
diff --git a/packages/block-library/src/missing/edit.js b/packages/block-library/src/missing/edit.js
index b9caa890a5b950..3f1d39f11edc01 100644
--- a/packages/block-library/src/missing/edit.js
+++ b/packages/block-library/src/missing/edit.js
@@ -17,6 +17,7 @@ function MissingBlockWarning( { attributes, convertToHTML } ) {
let messageHTML;
if ( hasContent && hasHTMLBlock ) {
messageHTML = sprintf(
+ /* translators: %s: block name */
__(
'Your site doesn’t include support for the "%s" block. You can leave this block intact, convert its content to a Custom HTML block, or remove it entirely.'
),
@@ -29,6 +30,7 @@ function MissingBlockWarning( { attributes, convertToHTML } ) {
);
} else {
messageHTML = sprintf(
+ /* translators: %s: block name */
__(
'Your site doesn’t include support for the "%s" block. You can leave this block intact or remove it entirely.'
),
diff --git a/packages/block-library/src/missing/edit.native.js b/packages/block-library/src/missing/edit.native.js
index f77e29ce9c94a3..f4072ca42000db 100644
--- a/packages/block-library/src/missing/edit.native.js
+++ b/packages/block-library/src/missing/edit.native.js
@@ -75,11 +75,12 @@ export class UnsupportedBlockEdit extends Component {
styles.infoSheetIconDark
);
- // translators: %s: Name of the block
const titleFormat =
Platform.OS === 'android'
- ? __( "'%s' isn't yet supported on WordPress for Android" )
- : __( "'%s' isn't yet supported on WordPress for iOS" );
+ ? // translators: %s: Name of the block
+ __( "'%s' isn't yet supported on WordPress for Android" )
+ : // translators: %s: Name of the block
+ __( "'%s' isn't yet supported on WordPress for iOS" );
const infoTitle = sprintf( titleFormat, title );
return (
diff --git a/packages/block-library/src/navigation-link/edit.js b/packages/block-library/src/navigation-link/edit.js
index 4bd4b9f351943d..b20ca1e528eef6 100644
--- a/packages/block-library/src/navigation-link/edit.js
+++ b/packages/block-library/src/navigation-link/edit.js
@@ -28,6 +28,7 @@ import {
InspectorControls,
RichText,
__experimentalLinkControl as LinkControl,
+ __experimentalBlock as Block,
} from '@wordpress/block-editor';
import { isURL, prependHTTP } from '@wordpress/url';
import { Fragment, useState, useEffect, useRef } from '@wordpress/element';
@@ -192,8 +193,8 @@ function NavigationLinkEdit( {
/>
-
- { showSubmenuIcon && (
-
-
-
- ) }
{ isLinkOpen && (
) }
+ { showSubmenuIcon && (
+
+
+
+ ) }
-
+
);
}
diff --git a/packages/block-library/src/navigation-link/index.js b/packages/block-library/src/navigation-link/index.js
index b53e4003c0ec01..57c01fc50ad76b 100644
--- a/packages/block-library/src/navigation-link/index.js
+++ b/packages/block-library/src/navigation-link/index.js
@@ -2,7 +2,7 @@
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
-import { navigation as icon } from '@wordpress/icons';
+import { mapMarker as icon } from '@wordpress/icons';
/**
* Internal dependencies
@@ -26,6 +26,7 @@ export const settings = {
supports: {
reusable: false,
html: false,
+ lightBlockWrapper: true,
},
__experimentalLabel: ( { label } ) => label,
diff --git a/packages/block-library/src/navigation/edit.js b/packages/block-library/src/navigation/edit.js
index 82230a34408531..357811b021c91a 100644
--- a/packages/block-library/src/navigation/edit.js
+++ b/packages/block-library/src/navigation/edit.js
@@ -15,6 +15,7 @@ import {
FontSizePicker,
withFontSizes,
__experimentalUseColors,
+ __experimentalBlock as Block,
} from '@wordpress/block-editor';
import { createBlock } from '@wordpress/blocks';
@@ -31,7 +32,8 @@ import {
import { compose } from '@wordpress/compose';
import { __ } from '@wordpress/i18n';
import { menu } from '@wordpress/icons';
-
+import { addQueryArgs } from '@wordpress/url';
+import { useApiFetch } from '@wordpress/api-fetch';
/**
* Internal dependencies
*/
@@ -45,9 +47,6 @@ function Navigation( {
clientId,
fontSize,
hasExistingNavItems,
- hasResolvedPages,
- isRequestingPages,
- pages,
setAttributes,
setFontSize,
updateNavItemBlocks,
@@ -56,16 +55,9 @@ function Navigation( {
//
// HOOKS
//
- /* eslint-disable @wordpress/no-unused-vars-before-return */
const ref = useRef();
const { selectBlock } = useDispatch( 'core/block-editor' );
-
- const {
- TextColor,
- BackgroundColor,
- InspectorControlsColorPanel,
- ColorPanel,
- } = __experimentalUseColors(
+ const { TextColor, BackgroundColor, ColorPanel } = __experimentalUseColors(
[
{ name: 'textColor', property: 'color' },
{ name: 'backgroundColor', className: 'has-background' },
@@ -86,14 +78,35 @@ function Navigation( {
[ fontSize.size ]
);
- /* eslint-enable @wordpress/no-unused-vars-before-return */
const { navigatorToolbarButton, navigatorModal } = useBlockNavigator(
clientId
);
+ const baseUrl = '/wp/v2/pages';
+
+ // "view" is required to ensure Pages are returned by REST API
+ // for users with lower capabilities such as "Contributor" otherwise
+ // Pages are not returned in the request if "edit" context is set
+ const context = 'view';
+
+ const filterDefaultPages = {
+ parent: 0,
+ order: 'asc',
+ orderby: 'id',
+ context,
+ };
+
+ const queryPath = addQueryArgs( baseUrl, filterDefaultPages );
+
+ const { isLoading: isRequestingPages, data: pages } = useApiFetch(
+ queryPath
+ );
+
+ const hasPages = !! pages;
+
// Builds navigation links from default Pages.
const defaultPagesNavigationItems = useMemo( () => {
- if ( ! pages ) {
+ if ( ! hasPages ) {
return null;
}
@@ -133,12 +146,6 @@ function Navigation( {
selectBlock( clientId );
}
- const hasPages = hasResolvedPages && pages && pages.length;
-
- const blockClassNames = classnames( className, {
- [ `items-justification-${ attributes.itemsJustification }` ]: attributes.itemsJustification,
- [ fontSize.class ]: fontSize.class,
- } );
const blockInlineStyles = {
fontSize: fontSize.size ? fontSize.size + 'px' : undefined,
};
@@ -148,7 +155,7 @@ function Navigation( {
// then show the Placeholder
if ( ! hasExistingNavItems ) {
return (
-
+
-
+
);
}
+ const blockClassNames = classnames( className, {
+ [ `items-justified-${ attributes.itemsJustification }` ]: attributes.itemsJustification,
+ [ fontSize.class ]: fontSize.class,
+ 'is-vertical': attributes.orientation === 'vertical',
+ } );
+
// UI State: rendered Block UI
return (
@@ -242,7 +255,6 @@ function Navigation( {
/>
- { InspectorControlsColorPanel }
-
@@ -266,13 +277,25 @@ function Navigation( {
{ __( 'Loading Navigation…' ) }{ ' ' }
>
) }
-
-
+
@@ -284,31 +307,8 @@ export default compose( [
withSelect( ( select, { clientId } ) => {
const innerBlocks = select( 'core/block-editor' ).getBlocks( clientId );
- const filterDefaultPages = {
- parent: 0,
- order: 'asc',
- orderby: 'id',
- };
-
- const pagesSelect = [
- 'core',
- 'getEntityRecords',
- [ 'postType', 'page', filterDefaultPages ],
- ];
-
return {
hasExistingNavItems: !! innerBlocks.length,
- pages: select( 'core' ).getEntityRecords(
- 'postType',
- 'page',
- filterDefaultPages
- ),
- isRequestingPages: select( 'core/data' ).isResolving(
- ...pagesSelect
- ),
- hasResolvedPages: select( 'core/data' ).hasFinishedResolution(
- ...pagesSelect
- ),
};
} ),
withDispatch( ( dispatch, { clientId } ) => {
diff --git a/packages/block-library/src/navigation/editor.scss b/packages/block-library/src/navigation/editor.scss
index 220dea8d44b739..4098185c23a59e 100644
--- a/packages/block-library/src/navigation/editor.scss
+++ b/packages/block-library/src/navigation/editor.scss
@@ -1,53 +1,15 @@
$navigation-height: 60px;
$navigation-item-height: 46px;
-// Reduce the paddings, margins, and UI of inner-blocks.
-// @todo: eventually we may add a feature that lets a parent container absorb the block UI of a child block.
-// When that happens, leverage that instead of the following overrides.
-[data-type="core/navigation"] {
-
- .wp-block-navigation .block-editor-inner-blocks {
- flex: 1; // expand to fill available space required for justification
- }
-
- // 1. Reset margins on immediate innerblocks container.
- .wp-block-navigation .block-editor-inner-blocks > .block-editor-block-list__layout {
- margin-left: 0;
- margin-right: 0;
- }
-
- .wp-block-navigation.items-justification-left .block-editor-inner-blocks > .block-editor-block-list__layout {
- justify-content: flex-start;
- }
-
- .wp-block-navigation.items-justification-center .block-editor-inner-blocks > .block-editor-block-list__layout {
- justify-content: center;
- }
-
- .wp-block-navigation.items-justification-right .block-editor-inner-blocks > .block-editor-block-list__layout {
- justify-content: flex-end;
- }
-
- .wp-block-navigation .block-editor-block-list__block::before {
- left: 0;
- right: 0;
- }
-
- // Remove the dashed outlines for child blocks.
- &.is-selected .wp-block-navigation .block-editor-block-list__block::before,
- &.has-child-selected .wp-block-navigation .block-editor-block-list__block::before {
- border-color: transparent !important; // !important used to keep the selector from growing any more complex.
- }
-
- // Hide the sibling inserter.
- .wp-block-navigation .block-editor-block-list__insertion-point {
- display: none;
- }
+// Undo default editor styles.
+.editor-styles-wrapper .wp-block-navigation ul,
+.editor-styles-wrapper .wp-block-navigation ol {
+ margin-bottom: 0;
+ margin-left: 0;
+}
- // Set a min width when the item is focused and empty in order to show the caret.
- .wp-block-navigation .wp-block-navigation-link.is-selected .block-editor-rich-text__editable:focus {
- min-width: 20px;
- }
+.editor-styles-wrapper .wp-block-navigation .block-editor-block-list__block {
+ margin: 0;
}
// Polish the Appender.
@@ -57,10 +19,20 @@ $navigation-item-height: 46px;
align-items: center;
}
+.wp-block-navigation.is-vertical .block-list-appender {
+ margin: $grid-unit-10;
+}
+
.wp-block-navigation__inserter-content {
padding: $grid-unit-20;
}
+// Ensure sub-menus stay open and visible when a nested block is selected.
+.wp-block-navigation__container.is-parent-of-selected-block {
+ visibility: visible;
+ opacity: 1;
+}
+
/**
* Colors Selector component
*/
diff --git a/packages/block-library/src/navigation/index.js b/packages/block-library/src/navigation/index.js
index 26d43f3c5481c8..db72a33515837d 100644
--- a/packages/block-library/src/navigation/index.js
+++ b/packages/block-library/src/navigation/index.js
@@ -29,6 +29,52 @@ export const settings = {
anchor: true,
html: false,
inserter: true,
+ lightBlockWrapper: true,
+ },
+
+ variations: [
+ {
+ name: 'horizontal',
+ isDefault: true,
+ title: __( 'Navigation (horizontal)' ),
+ description: __( 'Links shown in a row.' ),
+ attributes: { orientation: 'horizontal' },
+ },
+ {
+ name: 'vertical',
+ title: __( 'Navigation (vertical)' ),
+ description: __( 'Links shown in a column.' ),
+ attributes: { orientation: 'vertical' },
+ },
+ ],
+
+ example: {
+ innerBlocks: [
+ {
+ name: 'core/navigation-link',
+ attributes: {
+ // translators: 'Home' as in a website's home page.
+ label: __( 'Home' ),
+ url: 'https://make.wordpress.org/',
+ },
+ },
+ {
+ name: 'core/navigation-link',
+ attributes: {
+ // translators: 'About' as in a website's about page.
+ label: __( 'About' ),
+ url: 'https://make.wordpress.org/',
+ },
+ },
+ {
+ name: 'core/navigation-link',
+ attributes: {
+ // translators: 'Contact' as in a website's contact page.
+ label: __( 'Contact' ),
+ url: 'https://make.wordpress.org/',
+ },
+ },
+ ],
},
styles: [
diff --git a/packages/block-library/src/navigation/index.php b/packages/block-library/src/navigation/index.php
index 355aa989701cd8..e0332a5ab206d3 100644
--- a/packages/block-library/src/navigation/index.php
+++ b/packages/block-library/src/navigation/index.php
@@ -197,15 +197,23 @@ function block_core_navigation_build_html( $attributes, $block, $colors, $font_s
$font_sizes['css_classes']
);
$classes[] = 'wp-block-navigation-link';
- $css_classes = trim( implode( ' ', $classes ) );
$style_attribute = ( $colors['inline_styles'] || $font_sizes['inline_styles'] )
? sprintf( ' style="%s"', esc_attr( $colors['inline_styles'] ) . esc_attr( $font_sizes['inline_styles'] ) )
: '';
foreach ( (array) $block['innerBlocks'] as $key => $block ) {
+ $css_classes = trim( implode( ' ', $classes ) );
$has_submenu = count( (array) $block['innerBlocks'] ) > 0;
+ $is_active = ! empty( $block['attrs']['id'] ) && ( get_the_ID() === $block['attrs']['id'] );
- $html .= '';
@@ -284,6 +292,9 @@ function register_block_core_navigation() {
'core/navigation',
array(
'attributes' => array(
+ 'orientation' => array(
+ 'type' => 'string',
+ ),
'className' => array(
'type' => 'string',
),
diff --git a/packages/block-library/src/navigation/style.scss b/packages/block-library/src/navigation/style.scss
index 34f003903a0660..3c7488427ed76a 100644
--- a/packages/block-library/src/navigation/style.scss
+++ b/packages/block-library/src/navigation/style.scss
@@ -1,284 +1,133 @@
-$navigation-menu-height: $grid-unit-10 * 7;
-$navigation-sub-menu-height: $grid-unit-10 * 5;
-$navigation-sub-menu-width: $grid-unit-10 * 25;
-
-/*
-* Frontend: reset the default list styles
-*/
-
-.wp-block-navigation > ul {
- display: block;
+.wp-block-navigation__container {
+ // Reset the default list styles
list-style: none;
margin: 0;
padding-left: 0;
- @include break-small {
- display: flex;
- flex-wrap: wrap;
- }
+ // Horizontal layout
+ display: flex;
+ flex-wrap: wrap;
- // Submenu
- ul {
- list-style: none;
- padding-left: 0;
- margin-top: 0;
- margin-left: 0;
+ // Vertical layout
- li {
- margin: 0;
- }
+ .is-vertical & {
+ display: block;
}
}
-/*
-* Frontend: styles for submenu flyout
-*/
-
-.wp-block-navigation > ul {
- li {
- z-index: 1;
-
- &:hover,
- &:focus-within {
- cursor: pointer;
- z-index: 99999;
- }
-
- // Submenu Display
- &:hover > ul,
- &:focus-within > ul,
- & ul:hover,
- & ul:focus {
- visibility: visible;
- opacity: 1;
- display: flex;
- flex-direction: column;
- }
- }
+.wp-block-navigation-link {
+ display: flex;
+ align-items: center;
+ position: relative;
+ margin: 0;
+ padding: $grid-unit-10;
+}
- & > li ul {
+// Styles for submenu flyout
+.has-child {
+ .wp-block-navigation__container {
+ border: $border-width solid rgba(0, 0, 0, 0.15);
+ padding: $grid-unit-10 * 0.75 $grid-unit-10 * 2;
+ background-color: inherit;
+ color: inherit;
position: absolute;
left: 0;
top: 100%;
- min-width: $navigation-sub-menu-width;
- max-width: $navigation-sub-menu-width;
+ z-index: 1;
opacity: 0;
transition: opacity 0.1s linear;
visibility: hidden;
- }
-}
-/*
-* Styles shared between editor and frontend
-*/
-.wp-block-navigation,
-.wp-block-navigation .block-editor-block-list__layout {
- display: flex;
- flex-wrap: wrap;
-}
-
-.wp-block-navigation {
-
- // set a width on the editor submenus
- .block-editor-block-list__layout .block-editor-block-list__layout {
- width: $navigation-sub-menu-width;
- }
-
- // Remove paddings on subsequent immediate children.
- .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block {
- margin: 0;
- width: auto;
- }
-
- &,
- > .wp-block-navigation__container {
- align-items: center;
- width: 100%;
-
- > .wp-block-navigation-link {
- display: flex;
- margin-top: 0;
- margin-bottom: 0;
- }
- }
-
- // Main menu
- .wp-block-navigation-link {
- position: relative;
- margin: 0;
- min-height: $navigation-menu-height;
- display: flex;
- line-height: 1.4;
-
- // Sub menus
- .wp-block,
- .wp-block-navigation-link {
- min-height: auto; // reset the min-height and rely on padding
- padding: 0;
- }
-
- // Sub menus (editor canvas)
- .wp-block .wp-block-navigation-link {
- margin: 0;
- }
-
- > .block-editor-inner-blocks {
- display: none;
- }
-
- &.has-child > .wp-block-navigation__container,
- &.is-editing.has-child > .block-editor-inner-blocks {
- // Box model
- display: flex;
- border: $border-width solid rgba(0, 0, 0, 0.15);
-
- // Position (first level)
- position: absolute;
- z-index: 1;
- top: 100%;
- left: 0; // just under the main menu item.
-
- // Position (nested levels)
- .block-editor-inner-blocks,
+ // Nested submenus sit to the left on large breakpoints
+ @include break-medium {
.wp-block-navigation__container {
left: 100%;
- top: - $border-width;
+ top: -$border-width;
}
}
+ }
+ // Separating out hover and focus-within so hover works again on IE: https://davidwalsh.name/css-focus-within#comment-513401
+ // We will need to replace focus-within with a JS solution for IE keyboard support.
+ &:hover {
+ cursor: pointer;
- // Inherit colors from menu
- .block-editor-inner-blocks,
- .wp-block-navigation__container {
- background-color: inherit;
- color: inherit;
- }
-
- // All links
- .wp-block-navigation-link__content {
+ > .wp-block-navigation__container {
+ visibility: visible;
+ opacity: 1;
display: flex;
- align-items: center;
- width: max-content;
- padding: $grid-unit-10 * 0.75 $grid-unit-10 * 2;
- }
-
- // Submenu links only
- .wp-block-navigation-link {
-
- &:first-child:not(:only-child) .wp-block-navigation-link__content {
- padding-top: $grid-unit-10;
- }
-
- &:last-child .wp-block-navigation-link__content {
- padding-bottom: $grid-unit-10;
- }
- }
-
- &.has-child .wp-block-navigation-link__content {
- min-width: 100%;
- padding-right: $grid-unit-10 * 4;
- position: relative;
+ flex-direction: column;
}
+ }
- .wp-block-navigation-link__submenu-icon {
- position: absolute;
- right: $grid-unit-10 * 2;
+ &:focus-within {
+ cursor: pointer;
- svg {
- fill: currentColor;
- }
+ > .wp-block-navigation__container {
+ visibility: visible;
+ opacity: 1;
+ display: flex;
+ flex-direction: column;
}
+ }
+}
- // reset rotation of submenu indicator icons on nested levels
- .wp-block-navigation-link svg {
- transform: rotate(0);
- }
+// All links
+.wp-block-navigation-link__content {
+ padding: $grid-unit-10 * 0.75 $grid-unit-10 * 2;
- &.has-text-color .wp-block-navigation-link__content {
- color: inherit;
- }
+ .has-text-color & {
+ color: inherit;
}
}
-// Styles
-.wp-block-navigation {
-
- // Default / Light styles
- .wp-block-navigation-link,
- &.is-style-light .wp-block-navigation-link {
- // No text color
- &:not(.has-text-color) > .block-editor-inner-blocks,
- &:not(.has-text-color) > .wp-block-navigation__container {
- color: $light-style-sub-menu-text-color;
- }
+.wp-block-navigation-link__label {
+ word-break: normal;
+ overflow-wrap: break-word;
+}
- // No background color
- &:not(.has-background) > .block-editor-inner-blocks,
- &:not(.has-background) > .wp-block-navigation__container {
- background-color: $light-style-sub-menu-background-color;
- }
- }
+.wp-block-navigation-link__submenu-icon {
+ padding: $grid-unit-10 * 0.75 $grid-unit-10 * 2;
- // Dark styles.
- &.is-style-dark .wp-block-navigation-link {
- // No text color
- &:not(.has-text-color) > .block-editor-inner-blocks,
- &:not(.has-text-color) > .wp-block-navigation__container {
- color: $dark-style-sub-menu-text-color;
- }
+ svg {
+ fill: currentColor;
- // No background color
- &:not(.has-background) > .block-editor-inner-blocks,
- &:not(.has-background) > .wp-block-navigation__container {
- background-color: $dark-style-sub-menu-background-color;
+ @include break-medium {
+ // reset rotation of submenu indicator icons on nested levels
+ transform: rotate(0);
}
}
}
-/*
-* Frontend: non-shared styles & overrides
-*/
-
-.wp-block-navigation {
-
- .wp-block-navigation-link.has-child > .wp-block-navigation__container {
- display: flex;
- flex-direction: column;
- padding: 0;
+// Default / Light styles
+.wp-block-navigation-link,
+.is-style-light .wp-block-navigation-link {
+ &:not(.has-text-color) .wp-block-navigation-link__content {
+ color: $light-style-sub-menu-text-color;
}
}
+.is-style-light:not(.has-background) .wp-block-navigation__container {
+ background-color: $light-style-sub-menu-background-color;
+}
-/*
-* TODO: organize/untangle styles below this line
-*/
-
-.wp-block-navigation {
-
- & > ul {
- & > li {
- & > a {
- display: flex;
- align-items: center;
- }
-
- &:first-of-type > a {
- padding-left: 0;
- }
-
- &:last-of-type > a {
- padding-right: 0;
- }
- }
+// Dark styles.
+.is-style-dark .wp-block-navigation-link {
+ &:not(.has-text-color) .wp-block-navigation-link__content {
+ color: $dark-style-sub-menu-text-color;
}
+}
+.is-style-dark:not(.has-background) .wp-block-navigation__container {
+ background-color: $dark-style-sub-menu-background-color;
+}
- &.items-justified-left > ul {
- justify-content: flex-start;
- }
+// Jutification.
+.items-justified-left > ul {
+ justify-content: flex-start;
+}
- &.items-justified-center > ul {
- justify-content: center;
- }
+.items-justified-center > ul {
+ justify-content: center;
+}
- &.items-justified-right > ul {
- justify-content: flex-end;
- }
+.items-justified-right > ul {
+ justify-content: flex-end;
}
diff --git a/packages/block-library/src/navigation/theme.scss b/packages/block-library/src/navigation/theme.scss
index 0b80d85004697a..d628390770ebbc 100644
--- a/packages/block-library/src/navigation/theme.scss
+++ b/packages/block-library/src/navigation/theme.scss
@@ -4,3 +4,8 @@
list-style: none;
}
}
+
+// Overrides generic ".entry-content li" styles on the front end.
+.wp-block-navigation-link.wp-block-navigation-link {
+ margin: 0;
+}
diff --git a/packages/block-library/src/paragraph/block.json b/packages/block-library/src/paragraph/block.json
index 4f1d668b7c4d5c..acd5e48f0f63e0 100644
--- a/packages/block-library/src/paragraph/block.json
+++ b/packages/block-library/src/paragraph/block.json
@@ -18,27 +18,12 @@
"placeholder": {
"type": "string"
},
- "textColor": {
- "type": "string"
- },
- "customTextColor": {
- "type": "string"
- },
- "backgroundColor": {
- "type": "string"
- },
- "customBackgroundColor": {
- "type": "string"
- },
- "fontSize": {
- "type": "string"
- },
- "customFontSize": {
- "type": "number"
- },
"direction": {
"type": "string",
- "enum": [ "ltr", "rtl" ]
+ "enum": [
+ "ltr",
+ "rtl"
+ ]
}
}
}
diff --git a/packages/block-library/src/paragraph/deprecated.js b/packages/block-library/src/paragraph/deprecated.js
index 8c0502d808079f..24896a034207d0 100644
--- a/packages/block-library/src/paragraph/deprecated.js
+++ b/packages/block-library/src/paragraph/deprecated.js
@@ -38,31 +38,133 @@ const blockAttributes = {
textColor: {
type: 'string',
},
- customTextColor: {
- type: 'string',
- },
backgroundColor: {
type: 'string',
},
- customBackgroundColor: {
- type: 'string',
- },
fontSize: {
type: 'string',
},
- customFontSize: {
- type: 'number',
- },
direction: {
type: 'string',
enum: [ 'ltr', 'rtl' ],
},
+ style: {
+ type: 'object',
+ },
+};
+
+const migrateCustomColorsAndFontSizes = ( attributes ) => {
+ if (
+ ! attributes.customTextColor &&
+ ! attributes.customBackgroundColor &&
+ ! attributes.customFontSize
+ ) {
+ return attributes;
+ }
+ const style = {};
+ if ( attributes.customTextColor || attributes.customBackgroundColor ) {
+ style.color = {};
+ }
+ if ( attributes.customTextColor ) {
+ style.color.text = attributes.customTextColor;
+ }
+ if ( attributes.customBackgroundColor ) {
+ style.color.background = attributes.customBackgroundColor;
+ }
+ if ( attributes.customFontSize ) {
+ style.typography = { fontSize: attributes.customFontSize };
+ }
+ return {
+ ...omit( attributes, [
+ 'customTextColor',
+ 'customBackgroundColor',
+ 'customFontSize',
+ ] ),
+ style,
+ };
};
const deprecated = [
{
supports,
- attributes: blockAttributes,
+ attributes: {
+ ...omit( blockAttributes, [ 'style' ] ),
+ customTextColor: {
+ type: 'string',
+ },
+ customBackgroundColor: {
+ type: 'string',
+ },
+ customFontSize: {
+ type: 'number',
+ },
+ },
+ migrate: migrateCustomColorsAndFontSizes,
+ save( { attributes } ) {
+ const {
+ align,
+ content,
+ dropCap,
+ backgroundColor,
+ textColor,
+ customBackgroundColor,
+ customTextColor,
+ fontSize,
+ customFontSize,
+ direction,
+ } = attributes;
+
+ const textClass = getColorClassName( 'color', textColor );
+ const backgroundClass = getColorClassName(
+ 'background-color',
+ backgroundColor
+ );
+ const fontSizeClass = getFontSizeClass( fontSize );
+
+ const className = classnames( {
+ 'has-text-color': textColor || customTextColor,
+ 'has-background': backgroundColor || customBackgroundColor,
+ 'has-drop-cap': dropCap,
+ [ `has-text-align-${ align }` ]: align,
+ [ fontSizeClass ]: fontSizeClass,
+ [ textClass ]: textClass,
+ [ backgroundClass ]: backgroundClass,
+ } );
+
+ const styles = {
+ backgroundColor: backgroundClass
+ ? undefined
+ : customBackgroundColor,
+ color: textClass ? undefined : customTextColor,
+ fontSize: fontSizeClass ? undefined : customFontSize,
+ };
+
+ return (
+
+ );
+ },
+ },
+ {
+ supports,
+ attributes: {
+ ...omit( blockAttributes, [ 'style' ] ),
+ customTextColor: {
+ type: 'string',
+ },
+ customBackgroundColor: {
+ type: 'string',
+ },
+ customFontSize: {
+ type: 'number',
+ },
+ },
+ migrate: migrateCustomColorsAndFontSizes,
save( { attributes } ) {
const {
align,
@@ -116,11 +218,21 @@ const deprecated = [
{
supports,
attributes: {
- ...blockAttributes,
+ ...omit( blockAttributes, [ 'style' ] ),
+ customTextColor: {
+ type: 'string',
+ },
+ customBackgroundColor: {
+ type: 'string',
+ },
+ customFontSize: {
+ type: 'number',
+ },
width: {
type: 'string',
},
},
+ migrate: migrateCustomColorsAndFontSizes,
save( { attributes } ) {
const {
width,
@@ -179,9 +291,7 @@ const deprecated = [
type: 'number',
},
},
- 'customFontSize',
- 'customTextColor',
- 'customBackgroundColor'
+ [ 'style' ]
),
save( { attributes } ) {
const {
@@ -215,8 +325,8 @@ const deprecated = [
);
},
migrate( attributes ) {
- return omit(
- {
+ return migrateCustomColorsAndFontSizes(
+ omit( {
...attributes,
customFontSize: isFinite( attributes.fontSize )
? attributes.fontSize
@@ -231,8 +341,8 @@ const deprecated = [
'#' === attributes.backgroundColor[ 0 ]
? attributes.backgroundColor
: undefined,
- },
- [ 'fontSize', 'textColor', 'backgroundColor' ]
+ } ),
+ [ 'fontSize', 'textColor', 'backgroundColor', 'style' ]
);
},
},
diff --git a/packages/block-library/src/paragraph/edit.js b/packages/block-library/src/paragraph/edit.js
index 105b1a502c763e..bcae630f0e5ac9 100644
--- a/packages/block-library/src/paragraph/edit.js
+++ b/packages/block-library/src/paragraph/edit.js
@@ -11,15 +11,12 @@ import { PanelBody, ToggleControl, ToolbarGroup } from '@wordpress/components';
import {
AlignmentToolbar,
BlockControls,
- FontSizePicker,
InspectorControls,
RichText,
- withFontSizes,
- __experimentalUseColors,
__experimentalBlock as Block,
+ getFontSize,
} from '@wordpress/block-editor';
import { createBlock } from '@wordpress/blocks';
-import { compose } from '@wordpress/compose';
import { useSelect } from '@wordpress/data';
import { useEffect, useState, useRef } from '@wordpress/element';
import { formatLtr } from '@wordpress/icons';
@@ -75,39 +72,32 @@ function useDropCapMinimumHeight( isDropCap, deps ) {
function ParagraphBlock( {
attributes,
- fontSize,
mergeBlocks,
onReplace,
setAttributes,
- setFontSize,
} ) {
- const { align, content, dropCap, placeholder, direction } = attributes;
-
+ const {
+ align,
+ content,
+ direction,
+ dropCap,
+ placeholder,
+ fontSize,
+ style,
+ } = attributes;
+ const { fontSizes } = useSelect( ( select ) =>
+ select( 'core/block-editor' ).getSettings()
+ );
const ref = useRef();
+ const fontSizeObject = getFontSize( fontSizes, fontSize, style?.fontSize );
const dropCapMinimumHeight = useDropCapMinimumHeight( dropCap, [
- fontSize.size,
+ fontSizeObject.size,
] );
- const {
- TextColor,
- BackgroundColor,
- InspectorControlsColorPanel,
- } = __experimentalUseColors(
- [
- { name: 'textColor', property: 'color' },
- { name: 'backgroundColor', className: 'has-background' },
- ],
- {
- contrastCheckers: [
- {
- backgroundColor: true,
- textColor: true,
- fontSize: fontSize.size,
- },
- ],
- colorDetector: { targetRef: ref },
- },
- [ fontSize.size ]
- );
+
+ const styles = {
+ direction,
+ minHeight: dropCapMinimumHeight,
+ };
return (
<>
@@ -127,10 +117,6 @@ function ParagraphBlock( {
-
- { InspectorControlsColorPanel }
-
-
-
- setAttributes( { content: newContent } )
- }
- onSplit={ ( value ) => {
- if ( ! value ) {
- return createBlock( name );
- }
+
+ setAttributes( { content: newContent } )
+ }
+ onSplit={ ( value ) => {
+ if ( ! value ) {
+ return createBlock( name );
+ }
- return createBlock( name, {
- ...attributes,
- content: value,
- } );
- } }
- onMerge={ mergeBlocks }
- onReplace={ onReplace }
- onRemove={
- onReplace ? () => onReplace( [] ) : undefined
- }
- aria-label={
- content
- ? __( 'Paragraph block' )
- : __(
- 'Empty block; start writing or type forward slash to choose a block'
- )
- }
- placeholder={
- placeholder ||
- __( 'Start writing or type / to choose a block' )
- }
- __unstableEmbedURLOnPaste
- __unstableAllowPrefixTransformations
- />
-
-
+ return createBlock( name, {
+ ...attributes,
+ content: value,
+ } );
+ } }
+ onMerge={ mergeBlocks }
+ onReplace={ onReplace }
+ onRemove={ onReplace ? () => onReplace( [] ) : undefined }
+ aria-label={
+ content
+ ? __( 'Paragraph block' )
+ : __(
+ 'Empty block; start writing or type forward slash to choose a block'
+ )
+ }
+ placeholder={
+ placeholder ||
+ __( 'Start writing or type / to choose a block' )
+ }
+ __unstableEmbedURLOnPaste
+ __unstableAllowPrefixTransformations
+ />
>
);
}
-const ParagraphEdit = compose( [ withFontSizes( 'fontSize' ) ] )(
- ParagraphBlock
-);
-
-export default ParagraphEdit;
+export default ParagraphBlock;
diff --git a/packages/block-library/src/paragraph/edit.native.js b/packages/block-library/src/paragraph/edit.native.js
index b02cdc3662125a..1027f46371508a 100644
--- a/packages/block-library/src/paragraph/edit.native.js
+++ b/packages/block-library/src/paragraph/edit.native.js
@@ -7,7 +7,6 @@ import {
AlignmentToolbar,
BlockControls,
RichText,
- __experimentalUseColors,
} from '@wordpress/block-editor';
const name = 'core/paragraph';
@@ -17,56 +16,52 @@ function ParagraphBlock( {
mergeBlocks,
onReplace,
setAttributes,
- style,
+ style: oldStyle,
} ) {
- const { align, content, placeholder } = attributes;
+ const { align, content, placeholder, style } = attributes;
- /* eslint-disable @wordpress/no-unused-vars-before-return */
- const { TextColor } = __experimentalUseColors( [
- { name: 'textColor', property: 'color' },
- ] );
- /* eslint-enable @wordpress/no-unused-vars-before-return */
+ const styles = {
+ ...oldStyle,
+ color: style && style.color && style.color.text,
+ };
return (
<>
{
setAttributes( { align: nextAlign } );
} }
/>
-
- {
- setAttributes( {
- content: nextContent,
- } );
- } }
- onSplit={ ( value ) => {
- if ( ! value ) {
- return createBlock( name );
- }
+ {
+ setAttributes( {
+ content: nextContent,
+ } );
+ } }
+ onSplit={ ( value ) => {
+ if ( ! value ) {
+ return createBlock( name );
+ }
- return createBlock( name, {
- ...attributes,
- content: value,
- } );
- } }
- onMerge={ mergeBlocks }
- onReplace={ onReplace }
- onRemove={ onReplace ? () => onReplace( [] ) : undefined }
- placeholder={ placeholder || __( 'Start writing…' ) }
- textAlign={ align }
- />
-
+ return createBlock( name, {
+ ...attributes,
+ content: value,
+ } );
+ } }
+ onMerge={ mergeBlocks }
+ onReplace={ onReplace }
+ onRemove={ onReplace ? () => onReplace( [] ) : undefined }
+ placeholder={ placeholder || __( 'Start writing…' ) }
+ textAlign={ align }
+ />
>
);
}
diff --git a/packages/block-library/src/paragraph/editor.scss b/packages/block-library/src/paragraph/editor.scss
index 20b0f6a4311cd9..d0afb9ca839208 100644
--- a/packages/block-library/src/paragraph/editor.scss
+++ b/packages/block-library/src/paragraph/editor.scss
@@ -3,34 +3,6 @@
min-height: auto !important;
}
-
-// Show a footprint fade effect when first selecting any block.
-.block-editor-block-list__block[data-type="core/paragraph"].is-selected {
- &::before {
- position: absolute;
- z-index: 1;
- pointer-events: none;
- content: "";
- top: 0;
- bottom: 0;
- left: 0;
- right: 0;
- animation: block-editor-block-list__block-fade-out-animation 0.3s ease-out 0.2s;
- animation-fill-mode: forwards;
- @include reduce-motion("animation");
- }
-
- // Only flash it if you're not typing.
- &:not(.is-typing)::before {
- background: rgba($black, 0.03);
-
- // Flash a white color for dark themes.
- .is-dark-theme & {
- background: rgba($white, 0.1);
- }
- }
-}
-
@keyframes block-editor-block-list__block-fade-out-animation {
from {
opacity: 1;
diff --git a/packages/block-library/src/paragraph/index.js b/packages/block-library/src/paragraph/index.js
index 7fa310086cb459..0e76e74adc338f 100644
--- a/packages/block-library/src/paragraph/index.js
+++ b/packages/block-library/src/paragraph/index.js
@@ -32,7 +32,11 @@ export const settings = {
content: __(
'In a village of La Mancha, the name of which I have no desire to call to mind, there lived not long since one of those gentlemen that keep a lance in the lance-rack, an old buckler, a lean hack, and a greyhound for coursing.'
),
- customFontSize: 28,
+ style: {
+ typography: {
+ fontSize: 28,
+ },
+ },
dropCap: true,
},
},
@@ -40,6 +44,9 @@ export const settings = {
className: false,
__unstablePasteTextInline: true,
lightBlockWrapper: true,
+ __experimentalColor: true,
+ __experimentalLineHeight: true,
+ __experimentalFontSize: true,
},
__experimentalLabel( attributes, { context } ) {
if ( context === 'accessibility' ) {
diff --git a/packages/block-library/src/paragraph/save.js b/packages/block-library/src/paragraph/save.js
index 2cdeeb46e60c9c..434cc022295588 100644
--- a/packages/block-library/src/paragraph/save.js
+++ b/packages/block-library/src/paragraph/save.js
@@ -6,53 +6,19 @@ import classnames from 'classnames';
/**
* WordPress dependencies
*/
-import {
- getColorClassName,
- getFontSizeClass,
- RichText,
-} from '@wordpress/block-editor';
+import { RichText } from '@wordpress/block-editor';
export default function save( { attributes } ) {
- const {
- align,
- content,
- dropCap,
- backgroundColor,
- textColor,
- customBackgroundColor,
- customTextColor,
- fontSize,
- customFontSize,
- direction,
- } = attributes;
-
- const textClass = getColorClassName( 'color', textColor );
- const backgroundClass = getColorClassName(
- 'background-color',
- backgroundColor
- );
- const fontSizeClass = getFontSizeClass( fontSize );
+ const { align, content, dropCap, direction } = attributes;
const className = classnames( {
- 'has-text-color': textColor || customTextColor,
- 'has-background': backgroundColor || customBackgroundColor,
'has-drop-cap': dropCap,
[ `has-text-align-${ align }` ]: align,
- [ fontSizeClass ]: fontSizeClass,
- [ textClass ]: textClass,
- [ backgroundClass ]: backgroundClass,
} );
- const styles = {
- backgroundColor: backgroundClass ? undefined : customBackgroundColor,
- color: textClass ? undefined : customTextColor,
- fontSize: fontSizeClass ? undefined : customFontSize,
- };
-
return (
{ sprintf( __( 'By %s' ), author.name ) }
+
+ { sprintf(
+ /* translators: %s: author name. */
+ __( 'By %s' ),
+ author.name
+ ) }
+
) : null;
}
diff --git a/packages/block-library/src/post-author/index.php b/packages/block-library/src/post-author/index.php
index 6dc30ea5b4ba18..57f1895f6cb0c6 100644
--- a/packages/block-library/src/post-author/index.php
+++ b/packages/block-library/src/post-author/index.php
@@ -23,16 +23,10 @@ function render_block_core_post_author() {
* Registers the `core/post-author` block on the server.
*/
function register_block_core_post_author() {
- $path = __DIR__ . '/post-author/block.json';
- $metadata = json_decode( file_get_contents( $path ), true );
-
- register_block_type(
- $metadata['name'],
- array_merge(
- $metadata,
- array(
- 'render_callback' => 'render_block_core_post_author',
- )
+ register_block_type_from_metadata(
+ __DIR__ . '/post-author',
+ array(
+ 'render_callback' => 'render_block_core_post_author',
)
);
}
diff --git a/packages/block-library/src/post-comments-count/index.php b/packages/block-library/src/post-comments-count/index.php
index 0c22f35068f175..a7e811b8157324 100644
--- a/packages/block-library/src/post-comments-count/index.php
+++ b/packages/block-library/src/post-comments-count/index.php
@@ -32,21 +32,15 @@ function render_block_core_post_comments_count( $attributes ) {
* Registers the `core/post-comments-count` block on the server.
*/
function register_block_core_post_comments_count() {
- $path = __DIR__ . '/post-comments-count/block.json';
- $metadata = json_decode( file_get_contents( $path ), true );
-
- register_block_type(
- $metadata['name'],
- array_merge(
- $metadata,
- array(
- 'attributes' => array(
- 'className' => array(
- 'type' => 'string',
- ),
+ register_block_type_from_metadata(
+ __DIR__ . '/post-comments-count',
+ array(
+ 'attributes' => array(
+ 'className' => array(
+ 'type' => 'string',
),
- 'render_callback' => 'render_block_core_post_comments_count',
- )
+ ),
+ 'render_callback' => 'render_block_core_post_comments_count',
)
);
}
diff --git a/packages/block-library/src/post-comments-form/index.php b/packages/block-library/src/post-comments-form/index.php
index cb1aff17fc5af1..9d5e78cffa5cfa 100644
--- a/packages/block-library/src/post-comments-form/index.php
+++ b/packages/block-library/src/post-comments-form/index.php
@@ -26,16 +26,10 @@ function render_block_core_post_comments_form() {
* Registers the `core/post-comments-form` block on the server.
*/
function register_block_core_post_comments_form() {
- $path = __DIR__ . '/post-comments-form/block.json';
- $metadata = json_decode( file_get_contents( $path ), true );
-
- register_block_type(
- $metadata['name'],
- array_merge(
- $metadata,
- array(
- 'render_callback' => 'render_block_core_post_comments_form',
- )
+ register_block_type_from_metadata(
+ __DIR__ . '/post-comments-form',
+ array(
+ 'render_callback' => 'render_block_core_post_comments_form',
)
);
}
diff --git a/packages/block-library/src/post-comments/block.json b/packages/block-library/src/post-comments/block.json
new file mode 100644
index 00000000000000..fdd930fb3d26c8
--- /dev/null
+++ b/packages/block-library/src/post-comments/block.json
@@ -0,0 +1,4 @@
+{
+ "name": "core/post-comments",
+ "category": "layout"
+}
diff --git a/packages/block-library/src/post-comments/edit.js b/packages/block-library/src/post-comments/edit.js
new file mode 100644
index 00000000000000..ca6d1083de8a15
--- /dev/null
+++ b/packages/block-library/src/post-comments/edit.js
@@ -0,0 +1,36 @@
+/**
+ * WordPress dependencies
+ */
+import { useSelect } from '@wordpress/data';
+import { useEntityId } from '@wordpress/core-data';
+import { __ } from '@wordpress/i18n';
+
+function PostCommentsDisplay( { postId } ) {
+ return useSelect(
+ ( select ) => {
+ const comments = select( 'core' ).getEntityRecords(
+ 'root',
+ 'comment',
+ {
+ post: postId,
+ }
+ );
+ // TODO: "No Comments" placeholder should be editable.
+ return comments && comments.length
+ ? comments.map( ( comment ) => (
+ { comment.content.raw }
+ ) )
+ : __( 'No comments.' );
+ },
+ [ postId ]
+ );
+}
+
+export default function PostCommentsEdit() {
+ // TODO: Update to handle multiple post types.
+ const postId = useEntityId( 'postType', 'post' );
+ if ( ! postId ) {
+ return 'Post Comments Placeholder';
+ }
+ return ;
+}
diff --git a/packages/block-library/src/post-comments/index.js b/packages/block-library/src/post-comments/index.js
new file mode 100644
index 00000000000000..fd76cc61678137
--- /dev/null
+++ b/packages/block-library/src/post-comments/index.js
@@ -0,0 +1,18 @@
+/**
+ * WordPress dependencies
+ */
+import { __ } from '@wordpress/i18n';
+
+/**
+ * Internal dependencies
+ */
+import metadata from './block.json';
+import edit from './edit';
+
+const { name } = metadata;
+export { metadata, name };
+
+export const settings = {
+ title: __( 'Post Comments' ),
+ edit,
+};
diff --git a/packages/block-library/src/post-comments/index.php b/packages/block-library/src/post-comments/index.php
new file mode 100644
index 00000000000000..85780230704ecd
--- /dev/null
+++ b/packages/block-library/src/post-comments/index.php
@@ -0,0 +1,37 @@
+ 'render_block_core_post_comments',
+ )
+ );
+}
+add_action( 'init', 'register_block_core_post_comments' );
diff --git a/packages/block-library/src/post-content/edit.js b/packages/block-library/src/post-content/edit.js
index d80b308b384b16..3336e0d8199676 100644
--- a/packages/block-library/src/post-content/edit.js
+++ b/packages/block-library/src/post-content/edit.js
@@ -1,3 +1,9 @@
export default function PostContentEdit() {
- return 'Post Content Placeholder';
+ return (
+
+ {
+ 'Welcome to WordPress and the wonderful world of blocks. This content represents how a post would look when editing block templates.'
+ }
+
+ );
}
diff --git a/packages/block-library/src/post-content/index.php b/packages/block-library/src/post-content/index.php
index 1e6870fd0b3134..dc7eebdf00ffa2 100644
--- a/packages/block-library/src/post-content/index.php
+++ b/packages/block-library/src/post-content/index.php
@@ -26,16 +26,10 @@ function render_block_core_post_content() {
* Registers the `core/post-content` block on the server.
*/
function register_block_core_post_content() {
- $path = __DIR__ . '/post-content/block.json';
- $metadata = json_decode( file_get_contents( $path ), true );
-
- register_block_type(
- $metadata['name'],
- array_merge(
- $metadata,
- array(
- 'render_callback' => 'render_block_core_post_content',
- )
+ register_block_type_from_metadata(
+ __DIR__ . '/post-content',
+ array(
+ 'render_callback' => 'render_block_core_post_content',
)
);
}
diff --git a/packages/block-library/src/post-date/edit.js b/packages/block-library/src/post-date/edit.js
index 5c04fe66cbb091..fae4aceef783df 100644
--- a/packages/block-library/src/post-date/edit.js
+++ b/packages/block-library/src/post-date/edit.js
@@ -90,7 +90,7 @@ export default function PostDateEdit( {
setAttributes,
} ) {
if ( ! useEntityId( 'postType', 'post' ) ) {
- return 'Post Date Placeholder';
+ return { 'Jan 1st, 1440' }
;
}
return ;
}
diff --git a/packages/block-library/src/post-date/index.php b/packages/block-library/src/post-date/index.php
index 22e4c53e311eaf..dd86ff7e8c92ca 100644
--- a/packages/block-library/src/post-date/index.php
+++ b/packages/block-library/src/post-date/index.php
@@ -27,16 +27,10 @@ function render_block_core_post_date( $attributes ) {
* Registers the `core/post-date` block on the server.
*/
function register_block_core_post_date() {
- $path = __DIR__ . '/post-date/block.json';
- $metadata = json_decode( file_get_contents( $path ), true );
-
- register_block_type(
- $metadata['name'],
- array_merge(
- $metadata,
- array(
- 'render_callback' => 'render_block_core_post_date',
- )
+ register_block_type_from_metadata(
+ __DIR__ . '/post-date',
+ array(
+ 'render_callback' => 'render_block_core_post_date',
)
);
}
diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php
index 5d2ee7755beee4..7f5ab586670fa8 100644
--- a/packages/block-library/src/post-excerpt/index.php
+++ b/packages/block-library/src/post-excerpt/index.php
@@ -47,16 +47,10 @@ function render_block_core_post_excerpt( $attributes ) {
* Registers the `core/post-excerpt` block on the server.
*/
function register_block_core_post_excerpt() {
- $path = __DIR__ . '/post-excerpt/block.json';
- $metadata = json_decode( file_get_contents( $path ), true );
-
- register_block_type(
- $metadata['name'],
- array_merge(
- $metadata,
- array(
- 'render_callback' => 'render_block_core_post_excerpt',
- )
+ register_block_type_from_metadata(
+ __DIR__ . '/post-excerpt',
+ array(
+ 'render_callback' => 'render_block_core_post_excerpt',
)
);
}
diff --git a/packages/block-library/src/post-featured-image/index.php b/packages/block-library/src/post-featured-image/index.php
index 4a03b2e4d30284..9a80c2525fa3ee 100644
--- a/packages/block-library/src/post-featured-image/index.php
+++ b/packages/block-library/src/post-featured-image/index.php
@@ -22,16 +22,10 @@ function render_block_core_post_featured_image() {
* Registers the `core/post-featured-image` block on the server.
*/
function register_block_core_post_featured_image() {
- $path = __DIR__ . '/post-featured-image/block.json';
- $metadata = json_decode( file_get_contents( $path ), true );
-
- register_block_type(
- $metadata['name'],
- array_merge(
- $metadata,
- array(
- 'render_callback' => 'render_block_core_post_featured_image',
- )
+ register_block_type_from_metadata(
+ __DIR__ . '/post-featured-image',
+ array(
+ 'render_callback' => 'render_block_core_post_featured_image',
)
);
}
diff --git a/packages/block-library/src/post-tags/index.php b/packages/block-library/src/post-tags/index.php
index 4fff8d0014c840..ed03b6055f7cfa 100644
--- a/packages/block-library/src/post-tags/index.php
+++ b/packages/block-library/src/post-tags/index.php
@@ -29,16 +29,10 @@ function render_block_core_post_tags() {
* Registers the `core/post-tags` block on the server.
*/
function register_block_core_post_tags() {
- $path = __DIR__ . '/post-tags/block.json';
- $metadata = json_decode( file_get_contents( $path ), true );
-
- register_block_type(
- $metadata['name'],
- array_merge(
- $metadata,
- array(
- 'render_callback' => 'render_block_core_post_tags',
- )
+ register_block_type_from_metadata(
+ __DIR__ . '/post-tags',
+ array(
+ 'render_callback' => 'render_block_core_post_tags',
)
);
}
diff --git a/packages/block-library/src/post-title/block.json b/packages/block-library/src/post-title/block.json
index b64dbc3740ab49..67502c3ba988d7 100644
--- a/packages/block-library/src/post-title/block.json
+++ b/packages/block-library/src/post-title/block.json
@@ -1,4 +1,5 @@
{
"name": "core/post-title",
- "category": "layout"
+ "category": "layout",
+ "context": [ "postId", "postType" ]
}
diff --git a/packages/block-library/src/post-title/edit.js b/packages/block-library/src/post-title/edit.js
index ed9782fa4b5892..e06cdddee244a7 100644
--- a/packages/block-library/src/post-title/edit.js
+++ b/packages/block-library/src/post-title/edit.js
@@ -1,3 +1,24 @@
-export default function PostTitleEdit() {
- return 'Post Title Placeholder';
+/**
+ * WordPress dependencies
+ */
+import { useSelect } from '@wordpress/data';
+
+export default function PostTitleEdit( { context } ) {
+ const { postType, postId } = context;
+
+ const post = useSelect(
+ ( select ) =>
+ select( 'core' ).getEditedEntityRecord(
+ 'postType',
+ postType,
+ postId
+ ),
+ [ postType, postId ]
+ );
+
+ if ( ! post ) {
+ return null;
+ }
+
+ return { post.title } ;
}
diff --git a/packages/block-library/src/post-title/index.php b/packages/block-library/src/post-title/index.php
index c635ad2a0f0eb9..5d0ea451ea0c4f 100644
--- a/packages/block-library/src/post-title/index.php
+++ b/packages/block-library/src/post-title/index.php
@@ -8,30 +8,26 @@
/**
* Renders the `core/post-title` block on the server.
*
+ * @param WP_Block $block The block instance.
+ *
* @return string Returns the filtered post title for the current post wrapped inside "h1" tags.
*/
-function render_block_core_post_title() {
- $post = gutenberg_get_post_from_context();
- if ( ! $post ) {
+function render_block_core_post_title( $block ) {
+ if ( ! isset( $block->context['postId'] ) ) {
return '';
}
- return '' . get_the_title( $post ) . ' ';
+
+ return '' . get_the_title( $block->context['postId'] ) . ' ';
}
/**
* Registers the `core/post-title` block on the server.
*/
function register_block_core_post_title() {
- $path = __DIR__ . '/post-title/block.json';
- $metadata = json_decode( file_get_contents( $path ), true );
-
- register_block_type(
- $metadata['name'],
- array_merge(
- $metadata,
- array(
- 'render_callback' => 'render_block_core_post_title',
- )
+ register_block_type_from_metadata(
+ __DIR__ . '/post-title',
+ array(
+ 'render_callback' => 'render_block_core_post_title',
)
);
}
diff --git a/packages/block-library/src/preformatted/edit.js b/packages/block-library/src/preformatted/edit.js
index 6a9bd052f0b59c..0acc7f26ae6c2a 100644
--- a/packages/block-library/src/preformatted/edit.js
+++ b/packages/block-library/src/preformatted/edit.js
@@ -2,7 +2,10 @@
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
-import { RichText } from '@wordpress/block-editor';
+import {
+ RichText,
+ __experimentalBlock as Block,
+} from '@wordpress/block-editor';
export default function PreformattedEdit( {
attributes,
@@ -15,7 +18,7 @@ export default function PreformattedEdit( {
return (
{
+ const newChildren = Children.map( props.children, ( child ) => {
+ if ( child && child.props.identifier === 'value' ) {
+ return cloneElement( child, {
+ style: styles.quote,
+ } );
+ }
+ if ( child && child.props.identifier === 'citation' ) {
+ return cloneElement( child, {
+ style: styles.citation,
+ } );
+ }
+ return child;
+ } );
+ return { newChildren } ;
+};
diff --git a/packages/block-library/src/pullquote/blockquote.native.scss b/packages/block-library/src/pullquote/blockquote.native.scss
new file mode 100644
index 00000000000000..e8022091e99c68
--- /dev/null
+++ b/packages/block-library/src/pullquote/blockquote.native.scss
@@ -0,0 +1,8 @@
+.quote {
+ font-size: 18px;
+}
+
+.citation {
+ font-size: 14px;
+ margin-top: 12px;
+}
diff --git a/packages/block-library/src/pullquote/edit.js b/packages/block-library/src/pullquote/edit.js
index 5fead7277ec98b..5a7dae5a5f8451 100644
--- a/packages/block-library/src/pullquote/edit.js
+++ b/packages/block-library/src/pullquote/edit.js
@@ -16,6 +16,11 @@ import {
withColors,
PanelColorSettings,
} from '@wordpress/block-editor';
+/**
+ * Internal dependencies
+ */
+import { Figure } from './figure';
+import { BlockQuote } from './blockquote';
/**
* Internal dependencies
@@ -124,12 +129,13 @@ class PullQuoteEdit extends Component {
return (
<>
-
-
+
@@ -141,9 +147,11 @@ class PullQuoteEdit extends Component {
// translators: placeholder text used for the quote
__( 'Write quote…' )
}
+ textAlign="center"
/>
{ ( ! RichText.isEmpty( citation ) || isSelected ) && (
) }
-
-
+
+
{
+ const { children, getStylesFromColorScheme } = props;
+
+ const wpPullquoteFigure = getStylesFromColorScheme(
+ styles.light,
+ styles.dark
+ );
+
+ return { children } ;
+} );
diff --git a/packages/block-library/src/pullquote/figure.native.scss b/packages/block-library/src/pullquote/figure.native.scss
new file mode 100644
index 00000000000000..e4f12c8c415fdc
--- /dev/null
+++ b/packages/block-library/src/pullquote/figure.native.scss
@@ -0,0 +1,16 @@
+%shared {
+ border-width: 3px 0;
+ padding: 21px 16px;
+}
+
+.light {
+ @extend %shared;
+ border-top-color: $gray-lighten-20;
+ border-bottom-color: $gray-lighten-20;
+}
+
+.dark {
+ @extend %shared;
+ border-top-color: $gray-50;
+ border-bottom-color: $gray-50;
+}
diff --git a/packages/block-library/src/rss/index.php b/packages/block-library/src/rss/index.php
index 0315cfc01325ff..07ddb3d007e53e 100644
--- a/packages/block-library/src/rss/index.php
+++ b/packages/block-library/src/rss/index.php
@@ -92,7 +92,7 @@ function render_block_core_rss( $attributes ) {
$class .= ' ' . $attributes['className'];
}
- return "";
+ return sprintf( "", esc_attr( $class ), $list_items );
}
/**
diff --git a/packages/block-library/src/search/index.php b/packages/block-library/src/search/index.php
index 5face0b9298990..a140caf0e01215 100644
--- a/packages/block-library/src/search/index.php
+++ b/packages/block-library/src/search/index.php
@@ -57,7 +57,7 @@ function render_block_core_search( $attributes ) {
return sprintf(
'',
- $class,
+ esc_attr( $class ),
esc_url( home_url( '/' ) ),
$label_markup . $input_markup . $button_markup
);
diff --git a/packages/block-library/src/separator/style.scss b/packages/block-library/src/separator/style.scss
index a4cf1f2fdb6d27..8decc9d0ba52dd 100644
--- a/packages/block-library/src/separator/style.scss
+++ b/packages/block-library/src/separator/style.scss
@@ -22,6 +22,7 @@
color: currentColor;
font-size: 20px;
letter-spacing: 2em;
+ /*rtl:ignore*/
padding-left: 2em;
font-family: serif;
}
diff --git a/packages/block-library/src/shortcode/editor.scss b/packages/block-library/src/shortcode/editor.scss
index 6043e66fd707f7..4d15b92337d8eb 100644
--- a/packages/block-library/src/shortcode/editor.scss
+++ b/packages/block-library/src/shortcode/editor.scss
@@ -16,7 +16,6 @@
}
.block-editor-plain-text {
- width: 80%;
max-height: 250px;
}
diff --git a/packages/block-library/src/shortcode/index.php b/packages/block-library/src/shortcode/index.php
index cfa8ab97dfa2bc..97a40b386d9c92 100644
--- a/packages/block-library/src/shortcode/index.php
+++ b/packages/block-library/src/shortcode/index.php
@@ -21,15 +21,10 @@ function render_block_core_shortcode( $attributes, $content ) {
* Registers the `core/shortcode` block on server.
*/
function register_block_core_shortcode() {
- $path = __DIR__ . '/shortcode/block.json';
- $metadata = json_decode( file_get_contents( $path ), true );
- register_block_type(
- $metadata['name'],
- array_merge(
- $metadata,
- array(
- 'render_callback' => 'render_block_core_shortcode',
- )
+ register_block_type_from_metadata(
+ __DIR__ . '/shortcode',
+ array(
+ 'render_callback' => 'render_block_core_shortcode',
)
);
}
diff --git a/packages/block-library/src/site-title/edit.js b/packages/block-library/src/site-title/edit.js
new file mode 100644
index 00000000000000..55661ca1ae9b29
--- /dev/null
+++ b/packages/block-library/src/site-title/edit.js
@@ -0,0 +1,20 @@
+/**
+ * WordPress dependencies
+ */
+import { useEntityProp } from '@wordpress/core-data';
+import { __ } from '@wordpress/i18n';
+import { PlainText } from '@wordpress/block-editor';
+
+export default function SiteTitleEdit() {
+ const [ title, setTitle ] = useEntityProp( 'root', 'site', 'title' );
+ return (
+
+ );
+}
diff --git a/packages/block-library/src/site-title/index.php b/packages/block-library/src/site-title/index.php
index a63760983436e2..7241bc50dffa56 100644
--- a/packages/block-library/src/site-title/index.php
+++ b/packages/block-library/src/site-title/index.php
@@ -24,16 +24,10 @@ function render_block_core_site_title( $attributes ) {
* Registers the `core/site-title` block on the server.
*/
function register_block_core_site_title() {
- $path = __DIR__ . '/site-title/block.json';
- $metadata = json_decode( file_get_contents( $path ), true );
-
- register_block_type(
- $metadata['name'],
- array_merge(
- $metadata,
- array(
- 'render_callback' => 'render_block_core_site_title',
- )
+ register_block_type_from_metadata(
+ __DIR__ . '/site-title',
+ array(
+ 'render_callback' => 'render_block_core_site_title',
)
);
}
diff --git a/packages/block-library/src/social-link/block.json b/packages/block-library/src/social-link/block.json
index 977f5731fd961a..a9725b56781f58 100644
--- a/packages/block-library/src/social-link/block.json
+++ b/packages/block-library/src/social-link/block.json
@@ -1,7 +1,6 @@
{
"name": "core/social-link",
"category": "widgets",
- "icon": "share",
"attributes": {
"url": {
"type": "string"
diff --git a/packages/block-library/src/social-link/edit.js b/packages/block-library/src/social-link/edit.js
index 2dd4e747638c28..7d6dace9ef0c7a 100644
--- a/packages/block-library/src/social-link/edit.js
+++ b/packages/block-library/src/social-link/edit.js
@@ -33,7 +33,11 @@ const SocialLinkEdit = ( { attributes, setAttributes, isSelected } ) => {
'wp-social-link__is-incomplete': ! url,
} );
- // Import icon.
+ // Disable reason: The rule is currently not considering use as JSX tagName.
+ //
+ // See: https://github.com/WordPress/gutenberg/issues/16418
+
+ // eslint-disable-next-line @wordpress/no-unused-vars-before-return
const IconComponent = getIconBySite( service );
const socialLinkName = getNameBySite( service );
@@ -41,7 +45,11 @@ const SocialLinkEdit = ( { attributes, setAttributes, isSelected } ) => {
diff --git a/packages/block-library/src/social-link/icons/tumblr.js b/packages/block-library/src/social-link/icons/tumblr.js
index 5999fe4ead681d..e696d2955fb444 100644
--- a/packages/block-library/src/social-link/icons/tumblr.js
+++ b/packages/block-library/src/social-link/icons/tumblr.js
@@ -5,6 +5,6 @@ import { Path, SVG } from '@wordpress/primitives';
export const TumblrIcon = () => (
-
+
);
diff --git a/packages/block-library/src/social-link/index.js b/packages/block-library/src/social-link/index.js
index bebeaad5832af4..771f364541f3e1 100644
--- a/packages/block-library/src/social-link/index.js
+++ b/packages/block-library/src/social-link/index.js
@@ -2,6 +2,7 @@
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
+import { share as icon } from '@wordpress/icons';
/**
* Internal dependencies
@@ -21,6 +22,7 @@ export const settings = {
reusable: false,
html: false,
},
+ icon,
edit,
description: __(
'Display an icon linking to a social media profile or website.'
diff --git a/packages/block-library/src/social-link/index.php b/packages/block-library/src/social-link/index.php
index 32111ff72db732..dc732a7a1f90ed 100644
--- a/packages/block-library/src/social-link/index.php
+++ b/packages/block-library/src/social-link/index.php
@@ -13,12 +13,10 @@
* @return string Rendered HTML of the referenced block.
*/
function render_block_core_social_link( $attributes ) {
- $service = ( isset( $attributes['service'] ) ) ? $attributes['service'] : 'Icon';
- $url = ( isset( $attributes['url'] ) ) ? $attributes['url'] : false;
- $label = ( isset( $attributes['label'] ) ) ?
- $attributes['label'] :
- /* translators: %s: Social Link service name */
- sprintf( __( 'Link to %s' ), block_core_social_link_get_name( $service ) );
+ $service = ( isset( $attributes['service'] ) ) ? $attributes['service'] : 'Icon';
+ $url = ( isset( $attributes['url'] ) ) ? $attributes['url'] : false;
+ $label = ( isset( $attributes['label'] ) ) ? $attributes['label'] : block_core_social_link_get_name( $service );
+ $class_name = isset( $attributes['className'] ) ? ' ' . $attributes['className'] : false;
// Don't render a link if there is no URL set.
if ( ! $url ) {
@@ -26,23 +24,17 @@ function render_block_core_social_link( $attributes ) {
}
$icon = block_core_social_link_get_icon( $service );
- return ' ' . $icon . ' ';
+ return ' ' . $icon . ' ';
}
/**
* Registers the `core/social-link` blocks.
*/
function register_block_core_social_link() {
- $path = __DIR__ . '/social-link/block.json';
- $metadata = json_decode( file_get_contents( $path ), true );
-
- register_block_type(
- $metadata['name'],
- array_merge(
- $metadata,
- array(
- 'render_callback' => 'render_block_core_social_link',
- )
+ register_block_type_from_metadata(
+ __DIR__ . '/social-link',
+ array(
+ 'render_callback' => 'render_block_core_social_link',
)
);
}
@@ -217,7 +209,7 @@ function block_core_social_link_services( $service = '', $field = '' ) {
),
'tumblr' => array(
'name' => 'Tumblr',
- 'icon' => ' ',
+ 'icon' => ' ',
),
'twitch' => array(
'name' => 'Twitch',
@@ -249,7 +241,7 @@ function block_core_social_link_services( $service = '', $field = '' ) {
),
'share' => array(
'name' => 'Share Icon',
- 'icon' => ' ',
+ 'icon' => ' ',
),
);
diff --git a/packages/block-library/src/social-links/block.json b/packages/block-library/src/social-links/block.json
index 6d25baacb1a857..3019a7f5c3b397 100644
--- a/packages/block-library/src/social-links/block.json
+++ b/packages/block-library/src/social-links/block.json
@@ -1,6 +1,5 @@
{
"name": "core/social-links",
"category": "widgets",
- "icon": "share",
"attributes": {}
}
diff --git a/packages/block-library/src/social-links/editor.scss b/packages/block-library/src/social-links/editor.scss
index 65779b881cf837..878bd952a11863 100644
--- a/packages/block-library/src/social-links/editor.scss
+++ b/packages/block-library/src/social-links/editor.scss
@@ -15,41 +15,10 @@
// @todo: eventually we may add a feature that lets a parent container absorb the block UI of a child block.
// When that happens, leverage that instead of the following overrides.
[data-type="core/social-links"] {
- // 1. Reset margins on immediate innerblocks container.
- .wp-block-social-links > .block-editor-inner-blocks > .block-editor-block-list__layout {
- margin-left: 0;
- margin-right: 0;
- }
-
- // 2. Remove paddings on subsequent immediate children.
.wp-block-social-links > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block {
- width: auto;
- padding-left: 0;
- padding-right: 0;
- margin-left: 0;
- margin-right: 0;
margin-top: 0;
margin-bottom: 0;
}
-
- // 3. Minimize the block outlines.
- .wp-block-social-links > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block::before {
- border-right: none;
- border-top: none;
- border-bottom: none;
- }
-
- // 4. Remove the dashed outlines for child blocks.
- &.is-selected .wp-block-social-links .block-editor-block-list__block::before,
- &.has-child-selected .wp-block-social-links .block-editor-block-list__block::before {
- border-color: transparent !important; // !important used to keep the selector from growing any more complex.
- }
-
- // Hide the mover.
- // Hide the sibling inserter.
- .wp-block-social-links .block-editor-block-list__insertion-point { // Needs specificity.
- display: none;
- }
}
// Polish the Appender.
@@ -114,3 +83,10 @@
// Windows High Contrast mode will show this outline, but not the box-shadow.
outline: 2px solid transparent;
}
+
+// To ensure a better selection footprint when editing, attach the margin to the block container.
+// @todo: This can very probably be removed entirely when this block receives a lighter DOM.
+.is-navigate-mode .block-editor-block-list__layout .block-editor-block-list__block[data-type="core/social-link"].is-selected::after,
+.block-editor-block-list__layout .block-editor-block-list__block[data-type="core/social-link"]:not([contenteditable]):focus::after {
+ right: 8px;
+}
diff --git a/packages/block-library/src/social-links/index.js b/packages/block-library/src/social-links/index.js
index 3eb0027959a09d..2c27f8daad2b65 100644
--- a/packages/block-library/src/social-links/index.js
+++ b/packages/block-library/src/social-links/index.js
@@ -2,6 +2,7 @@
* WordPress dependencies
*/
import { __, _x } from '@wordpress/i18n';
+import { share as icon } from '@wordpress/icons';
/**
* Internal dependencies
@@ -53,6 +54,7 @@ export const settings = {
{ name: 'logos-only', label: __( 'Logos Only' ) },
{ name: 'pill-shape', label: __( 'Pill Shape' ) },
],
+ icon,
edit,
save,
};
diff --git a/packages/block-library/src/social-links/style.scss b/packages/block-library/src/social-links/style.scss
index 3bfa4992e224a8..9a6f2adabea130 100644
--- a/packages/block-library/src/social-links/style.scss
+++ b/packages/block-library/src/social-links/style.scss
@@ -102,7 +102,7 @@
}
.wp-social-link-facebook {
- background-color: #1977f2;
+ background-color: #1778f2;
color: #fff;
}
@@ -147,7 +147,7 @@
}
.wp-social-link-linkedin {
- background-color: #0577b5;
+ background-color: #0d66c2;
color: #fff;
}
@@ -213,7 +213,7 @@
}
.wp-social-link-twitter {
- background-color: #21a1f3;
+ background-color: #1da1f2;
color: #fff;
}
@@ -238,7 +238,7 @@
}
.wp-social-link-youtube {
- background-color: #ff0100;
+ background-color: #f00;
color: #fff;
}
}
@@ -289,7 +289,7 @@
}
.wp-social-link-facebook {
- color: #1977f2;
+ color: #1778f2;
}
.wp-social-link-fivehundredpx {
@@ -325,7 +325,7 @@
}
.wp-social-link-linkedin {
- color: #0577b5;
+ color: #0d66c2;
}
.wp-social-link-mastodon {
@@ -378,7 +378,7 @@
}
.wp-social-link-twitter {
- color: #21a1f3;
+ color: #1da1f2;
}
.wp-social-link-vimeo {
@@ -399,7 +399,7 @@
}
.wp-social-link-youtube {
- color: #ff0100;
+ color: #f00;
}
}
diff --git a/packages/block-library/src/spacer/edit.js b/packages/block-library/src/spacer/edit.js
index 181290fab71f35..9a457c6e8ad173 100644
--- a/packages/block-library/src/spacer/edit.js
+++ b/packages/block-library/src/spacer/edit.js
@@ -6,24 +6,29 @@ import classnames from 'classnames';
/**
* WordPress dependencies
*/
-import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import { InspectorControls } from '@wordpress/block-editor';
-import { BaseControl, PanelBody, ResizableBox } from '@wordpress/components';
+import { PanelBody, ResizableBox, RangeControl } from '@wordpress/components';
import { compose, withInstanceId } from '@wordpress/compose';
import { withDispatch } from '@wordpress/data';
+import { Platform } from '@wordpress/element';
+
+const MIN_SPACER_HEIGHT = 20;
+const MAX_SPACER_HEIGHT = 500;
const SpacerEdit = ( {
attributes,
isSelected,
setAttributes,
- instanceId,
onResizeStart,
onResizeStop,
} ) => {
const { height } = attributes;
- const id = `block-spacer-height-input-${ instanceId }`;
- const [ inputHeightValue, setInputHeightValue ] = useState( height );
+ const updateHeight = ( value ) => {
+ setAttributes( {
+ height: value,
+ } );
+ };
return (
<>
@@ -37,7 +42,7 @@ const SpacerEdit = ( {
size={ {
height,
} }
- minHeight="20"
+ minHeight={ MIN_SPACER_HEIGHT }
enable={ {
top: false,
right: false,
@@ -48,45 +53,28 @@ const SpacerEdit = ( {
bottomLeft: false,
topLeft: false,
} }
+ isSelected={ isSelected }
onResizeStart={ onResizeStart }
onResizeStop={ ( event, direction, elt, delta ) => {
onResizeStop();
- const spacerHeight = parseInt( height + delta.height, 10 );
- setAttributes( {
- height: spacerHeight,
- } );
- setInputHeightValue( spacerHeight );
+ const spacerHeight = Math.min(
+ parseInt( height + delta.height, 10 ),
+ MAX_SPACER_HEIGHT
+ );
+ updateHeight( spacerHeight );
} }
/>
-
- {
- let spacerHeight = parseInt(
- event.target.value,
- 10
- );
- setInputHeightValue( spacerHeight );
- if ( isNaN( spacerHeight ) ) {
- // Set spacer height to default size and input box to empty string
- setInputHeightValue( '' );
- spacerHeight = 100;
- } else if ( spacerHeight < 20 ) {
- // Set spacer height to minimum size
- spacerHeight = 20;
- }
- setAttributes( {
- height: spacerHeight,
- } );
- } }
- value={ inputHeightValue }
- min="20"
- step="10"
- />
-
+
>
diff --git a/packages/block-library/src/spacer/edit.native.js b/packages/block-library/src/spacer/edit.native.js
deleted file mode 100644
index 8c5b34ba66fc93..00000000000000
--- a/packages/block-library/src/spacer/edit.native.js
+++ /dev/null
@@ -1,76 +0,0 @@
-/**
- * External dependencies
- */
-import { View } from 'react-native';
-/**
- * WordPress dependencies
- */
-import { RangeControl, PanelBody } from '@wordpress/components';
-import { withPreferredColorScheme } from '@wordpress/compose';
-import { useState, useEffect } from '@wordpress/element';
-import { InspectorControls } from '@wordpress/block-editor';
-import { __ } from '@wordpress/i18n';
-
-/**
- * Internal dependencies
- */
-import styles from './editor.scss';
-
-const minSpacerHeight = 20;
-const maxSpacerHeight = 500;
-
-const SpacerEdit = ( {
- isSelected,
- attributes,
- setAttributes,
- getStylesFromColorScheme,
-} ) => {
- const { height } = attributes;
- const [ sliderSpacerMaxHeight, setSpacerMaxHeight ] = useState( height );
-
- // Height defined on the web can be higher than
- // `maxSpacerHeight`, so there is a need to `setSpacerMaxHeight`
- // after the initial render.
- useEffect( () => {
- setSpacerMaxHeight(
- height > maxSpacerHeight ? height * 2 : maxSpacerHeight
- );
- }, [] );
-
- const changeAttribute = ( value ) => {
- setAttributes( {
- height: value,
- } );
- };
-
- const defaultStyle = getStylesFromColorScheme(
- styles.staticSpacer,
- styles.staticDarkSpacer
- );
-
- return (
-
-
-
-
-
-
-
- );
-};
-
-export default withPreferredColorScheme( SpacerEdit );
diff --git a/packages/block-library/src/style.scss b/packages/block-library/src/style.scss
index bd8ab8a093bb5c..2cedc194e3b2e6 100644
--- a/packages/block-library/src/style.scss
+++ b/packages/block-library/src/style.scss
@@ -13,6 +13,7 @@
@import "./embed/style.scss";
@import "./file/style.scss";
@import "./gallery/style.scss";
+@import "./heading/style.scss";
@import "./image/style.scss";
@import "./latest-comments/style.scss";
@import "./latest-posts/style.scss";
@@ -215,28 +216,30 @@
// Font sizes.
+:root {
+ .has-small-font-size {
+ font-size: 13px;
+ }
-.has-small-font-size {
- font-size: 13px;
-}
+ .has-regular-font-size, // Not used now, kept because of backward compatibility.
+ .has-normal-font-size {
+ font-size: 16px;
+ }
-.has-regular-font-size, // Not used now, kept because of backward compatibility.
-.has-normal-font-size {
- font-size: 16px;
-}
+ .has-medium-font-size {
+ font-size: 20px;
+ }
-.has-medium-font-size {
- font-size: 20px;
-}
+ .has-large-font-size {
+ font-size: 36px;
+ }
-.has-large-font-size {
- font-size: 36px;
+ .has-larger-font-size, // Not used now, kept because of backward compatibility.
+ .has-huge-font-size {
+ font-size: 42px;
+ }
}
-.has-larger-font-size, // Not used now, kept because of backward compatibility.
-.has-huge-font-size {
- font-size: 42px;
-}
// Text alignments.
.has-text-align-center {
diff --git a/packages/block-library/src/table/editor.scss b/packages/block-library/src/table/editor.scss
index c03d8170c49f15..6aedff7549c2d0 100644
--- a/packages/block-library/src/table/editor.scss
+++ b/packages/block-library/src/table/editor.scss
@@ -68,10 +68,6 @@
margin-bottom: 0;
}
}
-
- .components-base-control + .components-base-control {
- margin-top: 0;
- }
}
.blocks-table__placeholder-input {
diff --git a/packages/block-library/src/template-part/edit/placeholder.js b/packages/block-library/src/template-part/edit/placeholder.js
index abeb2d12139ef8..f3b3f7bc43e48d 100644
--- a/packages/block-library/src/template-part/edit/placeholder.js
+++ b/packages/block-library/src/template-part/edit/placeholder.js
@@ -22,14 +22,14 @@ function TemplatePartPreview() {
{ __( 'Preview' ) }
-
+
);
}
export default function TemplatePartPlaceholder( { setAttributes } ) {
- const [ slug, _setSlug ] = useState();
- const [ theme, setTheme ] = useState();
+ const [ slug, _setSlug ] = useState( '' );
+ const [ theme, setTheme ] = useState( '' );
const [ help, setHelp ] = useState();
// Try to find an existing template part.
diff --git a/packages/block-library/src/template-part/index.js b/packages/block-library/src/template-part/index.js
index 86b2c4cd2742e4..135b7a560e6b30 100644
--- a/packages/block-library/src/template-part/index.js
+++ b/packages/block-library/src/template-part/index.js
@@ -1,3 +1,8 @@
+/**
+ * External dependencies
+ */
+import { startCase } from 'lodash';
+
/**
* WordPress dependencies
*/
@@ -17,5 +22,6 @@ export const settings = {
supports: {
html: false,
},
+ __experimentalLabel: ( { slug } ) => startCase( slug ),
edit,
};
diff --git a/packages/block-library/src/template-part/index.php b/packages/block-library/src/template-part/index.php
index 1a2c4403ba10f4..77f519ccfcc18e 100644
--- a/packages/block-library/src/template-part/index.php
+++ b/packages/block-library/src/template-part/index.php
@@ -22,9 +22,8 @@ function render_block_core_template_part( $attributes ) {
} elseif ( wp_get_theme()->get( 'TextDomain' ) === $attributes['theme'] ) {
// Else, if the template part was provided by the active theme,
// render the corresponding file content.
- $template_part_file_path =
- get_stylesheet_directory() . '/block-template-parts/' . $attributes['slug'] . '.html';
- if ( file_exists( $template_part_file_path ) ) {
+ $template_part_file_path = get_stylesheet_directory() . '/block-template-parts/' . $attributes['slug'] . '.html';
+ if ( 0 === validate_file( $template_part_file_path ) && file_exists( $template_part_file_path ) ) {
$content = file_get_contents( $template_part_file_path );
}
}
diff --git a/packages/block-library/src/verse/edit.js b/packages/block-library/src/verse/edit.js
index 82a184ce167904..2c33afb53fd818 100644
--- a/packages/block-library/src/verse/edit.js
+++ b/packages/block-library/src/verse/edit.js
@@ -11,6 +11,7 @@ import {
RichText,
BlockControls,
AlignmentToolbar,
+ __experimentalBlock as Block,
} from '@wordpress/block-editor';
export default function VerseEdit( {
@@ -32,7 +33,7 @@ export default function VerseEdit( {
/>
{
diff --git a/packages/block-library/src/verse/index.js b/packages/block-library/src/verse/index.js
index e05ab62bf2f27f..04f41e2f6de0cf 100644
--- a/packages/block-library/src/verse/index.js
+++ b/packages/block-library/src/verse/index.js
@@ -25,12 +25,17 @@ export const settings = {
icon,
example: {
attributes: {
+ /* eslint-disable @wordpress/i18n-no-collapsible-whitespace */
// translators: Sample content for the Verse block. Can be replaced with a more locale-adequate work.
content: __(
'WHAT was he doing, the great god Pan,\n Down in the reeds by the river?\nSpreading ruin and scattering ban,\nSplashing and paddling with hoofs of a goat,\nAnd breaking the golden lilies afloat\n With the dragon-fly on the river.'
),
+ /* eslint-enable @wordpress/i18n-no-collapsible-whitespace */
},
},
+ supports: {
+ lightBlockWrapper: true,
+ },
keywords: [ __( 'poetry' ), __( 'poem' ) ],
transforms,
deprecated,
diff --git a/packages/block-library/src/video/edit-common-settings.js b/packages/block-library/src/video/edit-common-settings.js
index a180593ad055a3..f713faeba995fa 100644
--- a/packages/block-library/src/video/edit-common-settings.js
+++ b/packages/block-library/src/video/edit-common-settings.js
@@ -65,6 +65,7 @@ const VideoSettings = ( { setAttributes, attributes } ) => {
{ value: 'metadata', label: __( 'Metadata' ) },
{ value: 'none', label: __( 'None' ) },
] }
+ separatorType={ 'none' }
/>
>
);
diff --git a/packages/block-library/src/video/edit.js b/packages/block-library/src/video/edit.js
index 05e3bc0d9d3f6d..52a5db7c44fb12 100644
--- a/packages/block-library/src/video/edit.js
+++ b/packages/block-library/src/video/edit.js
@@ -184,7 +184,7 @@ class VideoEdit extends Component {
}
render={ ( { open } ) => (
{ ! this.props.attributes.poster
- ? __( 'Select Poster Image' )
- : __( 'Replace image' ) }
+ ? __( 'Select' )
+ : __( 'Replace' ) }
) }
/>
{ this.props.attributes.poster
? sprintf(
+ /* translators: %s: poster image URL. */
__(
'The current poster image url is %s'
),
@@ -212,10 +213,9 @@ class VideoEdit extends Component {
{ !! this.props.attributes.poster && (
- { __( 'Remove Poster Image' ) }
+ { __( 'Remove' ) }
) }
diff --git a/packages/block-library/src/video/edit.native.js b/packages/block-library/src/video/edit.native.js
index 555be844ced768..1afe94d47dc2fe 100644
--- a/packages/block-library/src/video/edit.native.js
+++ b/packages/block-library/src/video/edit.native.js
@@ -36,9 +36,9 @@ import {
InspectorControls,
} from '@wordpress/block-editor';
import { __, sprintf } from '@wordpress/i18n';
-import { isURL } from '@wordpress/url';
+import { isURL, getProtocol } from '@wordpress/url';
import { doAction, hasAction } from '@wordpress/hooks';
-import { video as SvgIcon, pencil } from '@wordpress/icons';
+import { video as SvgIcon, replace } from '@wordpress/icons';
/**
* Internal dependencies
@@ -80,7 +80,7 @@ class VideoEdit extends React.Component {
componentDidMount() {
const { attributes } = this.props;
- if ( attributes.id && ! isURL( attributes.src ) ) {
+ if ( attributes.id && getProtocol( attributes.src ) === 'file:' ) {
mediaUploadSync();
}
}
@@ -111,7 +111,10 @@ class VideoEdit extends React.Component {
if ( this.state.isUploadInProgress ) {
requestImageUploadCancelDialog( attributes.id );
- } else if ( attributes.id && ! isURL( attributes.src ) ) {
+ } else if (
+ attributes.id &&
+ getProtocol( attributes.src ) === 'file:'
+ ) {
requestImageFailedRetryDialog( attributes.id );
}
@@ -204,7 +207,7 @@ class VideoEdit extends React.Component {
{ getMediaOptions() }
diff --git a/packages/block-library/src/video/editor.scss b/packages/block-library/src/video/editor.scss
index ed7b70c1278dc4..dd93768200fbb7 100644
--- a/packages/block-library/src/video/editor.scss
+++ b/packages/block-library/src/video/editor.scss
@@ -2,11 +2,12 @@
text-align: center;
}
-.editor-video-poster-control .components-button {
- display: block;
- margin-right: 8px;
-}
+.editor-video-poster-control {
+ .components-base-control__label {
+ display: block;
+ }
-.editor-video-poster-control .components-button + .components-button {
- margin-top: 1em;
+ .components-button {
+ margin-right: $grid-unit-10;
+ }
}
diff --git a/packages/block-serialization-default-parser/package.json b/packages/block-serialization-default-parser/package.json
index fdefc9a59fa7bd..21a63e95685b5a 100644
--- a/packages/block-serialization-default-parser/package.json
+++ b/packages/block-serialization-default-parser/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/block-serialization-default-parser",
- "version": "3.5.0",
+ "version": "3.6.0",
"description": "Block serialization specification parser for WordPress posts.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -23,7 +23,7 @@
"react-native": "src/index",
"sideEffects": false,
"dependencies": {
- "@babel/runtime": "^7.8.3"
+ "@babel/runtime": "^7.9.2"
},
"publishConfig": {
"access": "public"
diff --git a/packages/block-serialization-default-parser/src/index.js b/packages/block-serialization-default-parser/src/index.js
index cc6f61e5fe7352..c6a844d0cc6dd7 100644
--- a/packages/block-serialization-default-parser/src/index.js
+++ b/packages/block-serialization-default-parser/src/index.js
@@ -39,7 +39,7 @@ let stack;
* once browsers reliably support atomic grouping or possessive
* quantifiers natively we should remove this trick and simplify
*
- * @type RegExp
+ * @type {RegExp}
*
* @since 3.8.0
* @since 4.6.1 added optimization to prevent backtracking on attribute parsing
diff --git a/packages/block-serialization-spec-parser/.eslintrc.json b/packages/block-serialization-spec-parser/.eslintrc.json
index ffee0154641f1d..363e55181855b4 100644
--- a/packages/block-serialization-spec-parser/.eslintrc.json
+++ b/packages/block-serialization-spec-parser/.eslintrc.json
@@ -4,7 +4,10 @@
"files": [ "shared-tests.js" ],
"extends": [
"plugin:@wordpress/eslint-plugin/test-unit"
- ]
+ ],
+ "rules": {
+ "jest/no-export": "off"
+ }
}
]
}
diff --git a/packages/block-serialization-spec-parser/package.json b/packages/block-serialization-spec-parser/package.json
index 1c5e9f2c6d715a..580e2a3d4713a2 100644
--- a/packages/block-serialization-spec-parser/package.json
+++ b/packages/block-serialization-spec-parser/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/block-serialization-spec-parser",
- "version": "3.4.0",
+ "version": "3.5.0",
"description": "Block serialization specification parser for WordPress posts.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/blocks/CHANGELOG.md b/packages/blocks/CHANGELOG.md
index 82d571202f45fa..9e6d1bbcf40fc7 100644
--- a/packages/blocks/CHANGELOG.md
+++ b/packages/blocks/CHANGELOG.md
@@ -1,3 +1,11 @@
+## Master
+
+## 6.13.0 (2020-04-01)
+
+### New Feature
+
+- Blocks can now be registered with an `defaultStylePicker` flag in the `supports` setting, allowing the default style picker to be removed.
+
## 6.4.0 (2019-08-05)
### Improvements
diff --git a/packages/blocks/README.md b/packages/blocks/README.md
index 2f78d4d7c2e29e..d6cf2684deaea6 100644
--- a/packages/blocks/README.md
+++ b/packages/blocks/README.md
@@ -608,7 +608,6 @@ _Parameters_
- _options.plainText_ `[string]`: Plain text version.
- _options.mode_ `[string]`: Handle content as blocks or inline content. _ 'AUTO': Decide based on the content passed. _ 'INLINE': Always handle as inline content, and return string. \* 'BLOCKS': Always handle as blocks, and return array of blocks.
- _options.tagName_ `[Array]`: The tag into which content will be inserted.
-- _options.canUserUseUnfilteredHTML_ `[boolean]`: Whether or not the user can use unfiltered HTML.
_Returns_
diff --git a/packages/blocks/package.json b/packages/blocks/package.json
index d8c30fe656a5fe..2fc125781fde76 100644
--- a/packages/blocks/package.json
+++ b/packages/blocks/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/blocks",
- "version": "6.12.1",
+ "version": "6.14.1",
"description": "Block API for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -21,7 +21,7 @@
"module": "build-module/index.js",
"react-native": "src/index",
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/autop": "file:../autop",
"@wordpress/blob": "file:../blob",
"@wordpress/block-serialization-default-parser": "file:../block-serialization-default-parser",
@@ -41,7 +41,7 @@
"showdown": "^1.8.6",
"simple-html-tokenizer": "^0.5.7",
"tinycolor2": "^1.4.1",
- "uuid": "^3.3.2"
+ "uuid": "^7.0.2"
},
"publishConfig": {
"access": "public"
diff --git a/packages/blocks/src/api/factory.js b/packages/blocks/src/api/factory.js
index 983bafd73caabe..8775b6f78ea013 100644
--- a/packages/blocks/src/api/factory.js
+++ b/packages/blocks/src/api/factory.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import uuid from 'uuid/v4';
+import { v4 as uuid } from 'uuid';
import {
every,
reduce,
diff --git a/packages/blocks/src/api/raw-handling/figure-content-reducer.js b/packages/blocks/src/api/raw-handling/figure-content-reducer.js
index 0d8d3ac9f6be65..bd397884f635fe 100644
--- a/packages/blocks/src/api/raw-handling/figure-content-reducer.js
+++ b/packages/blocks/src/api/raw-handling/figure-content-reducer.js
@@ -88,7 +88,11 @@ export default function( node, doc, schema ) {
// there is no text content.
// Otherwise, if directly at the root, wrap in a figure element.
if ( wrapper ) {
- if (
+ // In jsdom-jscore, 'node.classList' can be undefined.
+ // In this case, default to extract as it offers a better UI experience on mobile.
+ if ( ! node.classList ) {
+ wrapFigureContent( nodeToInsert, wrapper );
+ } else if (
node.classList.contains( 'alignright' ) ||
node.classList.contains( 'alignleft' ) ||
node.classList.contains( 'aligncenter' ) ||
diff --git a/packages/blocks/src/api/raw-handling/html-formatting-remover.js b/packages/blocks/src/api/raw-handling/html-formatting-remover.js
index b44fbe71deff1f..b5a9f6b75420b6 100644
--- a/packages/blocks/src/api/raw-handling/html-formatting-remover.js
+++ b/packages/blocks/src/api/raw-handling/html-formatting-remover.js
@@ -25,9 +25,21 @@ export default function( node ) {
return;
}
- // Ignore pre content.
- if ( node.parentElement.closest( 'pre' ) ) {
- return;
+ // Ignore pre content. Note that this does not use Element#closest due to
+ // a combination of (a) node may not be Element and (b) node.parentElement
+ // does not have full support in all browsers (Internet Exporer).
+ //
+ // See: https://developer.mozilla.org/en-US/docs/Web/API/Node/parentElement#Browser_compatibility
+
+ /** @type {Node?} */
+ let parent = node;
+ while ( ( parent = parent.parentNode ) ) {
+ if (
+ parent.nodeType === window.Node.ELEMENT_NODE &&
+ parent.nodeName === 'PRE'
+ ) {
+ return;
+ }
}
// First, replace any sequence of HTML formatting space with a single space.
diff --git a/packages/blocks/src/api/raw-handling/iframe-remover.js b/packages/blocks/src/api/raw-handling/iframe-remover.js
index 35adb29cdf8080..e7c951507cf835 100644
--- a/packages/blocks/src/api/raw-handling/iframe-remover.js
+++ b/packages/blocks/src/api/raw-handling/iframe-remover.js
@@ -1,8 +1,3 @@
-/**
- * WordPress dependencies
- */
-import { remove } from '@wordpress/dom';
-
/**
* Removes iframes.
*
@@ -12,6 +7,7 @@ import { remove } from '@wordpress/dom';
*/
export default function( node ) {
if ( node.nodeName === 'IFRAME' ) {
- remove( node );
+ const text = node.ownerDocument.createTextNode( node.src );
+ node.parentNode.replaceChild( text, node );
}
}
diff --git a/packages/blocks/src/api/raw-handling/paste-handler.js b/packages/blocks/src/api/raw-handling/paste-handler.js
index 50738ae0358ce8..cb94bbf770e5cb 100644
--- a/packages/blocks/src/api/raw-handling/paste-handler.js
+++ b/packages/blocks/src/api/raw-handling/paste-handler.js
@@ -126,14 +126,13 @@ function htmlToBlocks( { html, rawTransforms } ) {
* Converts an HTML string to known blocks. Strips everything else.
*
* @param {Object} options
- * @param {string} [options.HTML] The HTML to convert.
- * @param {string} [options.plainText] Plain text version.
- * @param {string} [options.mode] Handle content as blocks or inline content.
- * * 'AUTO': Decide based on the content passed.
- * * 'INLINE': Always handle as inline content, and return string.
- * * 'BLOCKS': Always handle as blocks, and return array of blocks.
- * @param {Array} [options.tagName] The tag into which content will be inserted.
- * @param {boolean} [options.canUserUseUnfilteredHTML] Whether or not the user can use unfiltered HTML.
+ * @param {string} [options.HTML] The HTML to convert.
+ * @param {string} [options.plainText] Plain text version.
+ * @param {string} [options.mode] Handle content as blocks or inline content.
+ * * 'AUTO': Decide based on the content passed.
+ * * 'INLINE': Always handle as inline content, and return string.
+ * * 'BLOCKS': Always handle as blocks, and return array of blocks.
+ * @param {Array} [options.tagName] The tag into which content will be inserted.
*
* @return {Array|string} A list of blocks or a string, depending on `handlerMode`.
*/
@@ -142,7 +141,6 @@ export function pasteHandler( {
plainText = '',
mode = 'AUTO',
tagName,
- canUserUseUnfilteredHTML = false,
} ) {
// First of all, strip any meta tags.
HTML = HTML.replace( / ]+>/g, '' );
@@ -243,15 +241,11 @@ export function pasteHandler( {
phrasingContentReducer,
specialCommentConverter,
commentRemover,
+ iframeRemover,
figureContentReducer,
blockquoteNormaliser,
];
- if ( ! canUserUseUnfilteredHTML ) {
- // Should run before `figureContentReducer`.
- filters.unshift( iframeRemover );
- }
-
const schema = {
...blockContentSchema,
// Keep top-level phrasing content, normalised by `normaliseBlocks`.
diff --git a/packages/blocks/src/api/raw-handling/phrasing-content.js b/packages/blocks/src/api/raw-handling/phrasing-content.js
index 1b56c1a7b10839..f9274af7832f1b 100644
--- a/packages/blocks/src/api/raw-handling/phrasing-content.js
+++ b/packages/blocks/src/api/raw-handling/phrasing-content.js
@@ -74,17 +74,6 @@ const embeddedContentSchema = {
},
canvas: { attributes: [ 'width', 'height' ] },
embed: { attributes: [ 'src', 'type', 'width', 'height' ] },
- iframe: {
- attributes: [
- 'src',
- 'srcdoc',
- 'name',
- 'sandbox',
- 'seamless',
- 'width',
- 'height',
- ],
- },
img: {
attributes: [
'alt',
diff --git a/packages/blocks/src/api/raw-handling/test/html-formatting-remover.js b/packages/blocks/src/api/raw-handling/test/html-formatting-remover.js
index d5efd50f4db857..64df51a4f781b6 100644
--- a/packages/blocks/src/api/raw-handling/test/html-formatting-remover.js
+++ b/packages/blocks/src/api/raw-handling/test/html-formatting-remover.js
@@ -2,7 +2,7 @@
* Internal dependencies
*/
import filter from '../html-formatting-remover';
-import { deepFilterHTML } from '../utils';
+import { deepFilterHTML, deepFilterNodeList } from '../utils';
describe( 'HTMLFormattingRemover', () => {
it( 'should trim text node without parent', () => {
@@ -102,6 +102,24 @@ describe( 'HTMLFormattingRemover', () => {
expect( deepFilterHTML( input, [ filter ] ) ).toEqual( input );
} );
+ it( 'should tolerate browser quirks of DOM parent property availability', () => {
+ const input = 'a';
+
+ const doc = document.implementation.createHTMLDocument( '' );
+ doc.body.innerHTML = input;
+
+ // Emulate absence of `parentElement` property.
+ // See: https://developer.mozilla.org/en-US/docs/Web/API/Node/parentElement#Browser_compatibility
+ Object.defineProperty( doc.body.firstChild, 'parentElement', {
+ get() {
+ return undefined;
+ },
+ } );
+
+ deepFilterNodeList( doc.body.childNodes, [ filter ], doc );
+ expect( doc.body.innerHTML ).toEqual( input );
+ } );
+
it( 'should not remove white space if next elemnt has none', () => {
const input = `
a b
`;
const output = 'a b
';
diff --git a/packages/blocks/src/api/utils.js b/packages/blocks/src/api/utils.js
index 11b333d8bdef23..dbf1dc79049b9d 100644
--- a/packages/blocks/src/api/utils.js
+++ b/packages/blocks/src/api/utils.js
@@ -184,7 +184,7 @@ export function getAccessibleBlockLabel(
if ( hasPosition && direction === 'vertical' ) {
if ( hasLabel ) {
return sprintf(
- /* translators: accessibility text. %1: The block title, %2: The block row number, %3: The block label.. */
+ /* translators: accessibility text. 1: The block title. 2: The block row number. 3: The block label.. */
__( '%1$s Block. Row %2$d. %3$s' ),
title,
position,
@@ -193,15 +193,15 @@ export function getAccessibleBlockLabel(
}
return sprintf(
- /* translators: accessibility text. %s: The block title, %d The block row number. */
- __( '%s Block. Row %d' ),
+ /* translators: accessibility text. 1: The block title. 2: The block row number. */
+ __( '%1$s Block. Row %2$d' ),
title,
position
);
} else if ( hasPosition && direction === 'horizontal' ) {
if ( hasLabel ) {
return sprintf(
- /* translators: accessibility text. %1: The block title, %2: The block column number, %3: The block label.. */
+ /* translators: accessibility text. 1: The block title. 2: The block column number. 3: The block label.. */
__( '%1$s Block. Column %2$d. %3$s' ),
title,
position,
@@ -210,8 +210,8 @@ export function getAccessibleBlockLabel(
}
return sprintf(
- /* translators: accessibility text. %s: The block title, %d The block column number. */
- __( '%s Block. Column %d' ),
+ /* translators: accessibility text. 1: The block title. 2: The block column number. */
+ __( '%1$s Block. Column %2$d' ),
title,
position
);
diff --git a/packages/components/README.md b/packages/components/README.md
index fb82b7f526f860..a035497b5d59db 100644
--- a/packages/components/README.md
+++ b/packages/components/README.md
@@ -27,6 +27,8 @@ export default function MyButton() {
}
```
-Many components also include styles which will need to be output in order to appear correctly. Within WordPress, you can [add the `wp-components` stylesheet as a dependency of your plugin's stylesheet](https://developer.wordpress.org/reference/functions/wp_enqueue_style/#parameters). In other projects, you can link to the `build-style/style.css` file directly.
+Many components include CSS to add style, you will need to add in order to appear correctly. Within WordPress, add the `wp-components` stylesheet as a dependency of your plugin's stylesheet. See [wp_enqueue_style documentation](https://developer.wordpress.org/reference/functions/wp_enqueue_style/#parameters) for how to specify dependencies.
+
+In non-WordPress projects, link to the `build-style/style.css` file directly, it is located at `node_modules/@wordpress/components/build-style/style.css`.
diff --git a/packages/components/package.json b/packages/components/package.json
index 809c6f05bdcd2e..4beac832581982 100644
--- a/packages/components/package.json
+++ b/packages/components/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/components",
- "version": "9.2.3",
+ "version": "9.4.1",
"description": "UI components for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -24,7 +24,7 @@
"build-style/**"
],
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@emotion/core": "^10.0.22",
"@emotion/css": "^10.0.22",
"@emotion/native": "^10.0.22",
@@ -48,16 +48,15 @@
"downshift": "^4.0.5",
"gradient-parser": "^0.1.5",
"lodash": "^4.17.15",
- "memize": "^1.0.5",
+ "memize": "^1.1.0",
"moment": "^2.22.1",
"re-resizable": "^6.0.0",
"react-dates": "^17.1.1",
- "react-resize-aware": "^3.0.0",
"react-spring": "^8.0.20",
- "reakit": "^1.0.0-beta.12",
+ "reakit": "^1.0.0-rc.0",
"rememo": "^3.0.0",
"tinycolor2": "^1.4.1",
- "uuid": "^3.3.2"
+ "uuid": "^7.0.2"
},
"publishConfig": {
"access": "public"
diff --git a/packages/components/src/angle-picker-control/stories/index.js b/packages/components/src/angle-picker-control/stories/index.js
index 0c861f1b414d44..5d88c9be90d59c 100644
--- a/packages/components/src/angle-picker-control/stories/index.js
+++ b/packages/components/src/angle-picker-control/stories/index.js
@@ -9,7 +9,7 @@ import { useState } from '@wordpress/element';
import AnglePickerControl from '../';
export default {
- title: 'Components|AnglePickerControl',
+ title: 'Components/AnglePickerControl',
component: AnglePickerControl,
};
diff --git a/packages/components/src/animate/style.scss b/packages/components/src/animate/style.scss
index b6932156b244ac..1d64423e42f1f0 100644
--- a/packages/components/src/animate/style.scss
+++ b/packages/components/src/animate/style.scss
@@ -36,6 +36,10 @@
&.is-from-left {
transform: translateX(+100%);
}
+
+ &.is-from-right {
+ transform: translateX(-100%);
+ }
}
@keyframes components-animate__slide-in-animation {
diff --git a/packages/components/src/autocomplete/index.js b/packages/components/src/autocomplete/index.js
index 6466328cabd836..8517c7bfc83e0b 100644
--- a/packages/components/src/autocomplete/index.js
+++ b/packages/components/src/autocomplete/index.js
@@ -227,6 +227,7 @@ export class Autocomplete extends Component {
if ( !! filteredOptions.length ) {
debouncedSpeak(
sprintf(
+ /* translators: %d: number of results. */
_n(
'%d result found, use up and down arrow keys to navigate.',
'%d results found, use up and down arrow keys to navigate.',
diff --git a/packages/components/src/autocomplete/style.scss b/packages/components/src/autocomplete/style.scss
index 891febedfad016..20dc5db90ae6e8 100644
--- a/packages/components/src/autocomplete/style.scss
+++ b/packages/components/src/autocomplete/style.scss
@@ -4,6 +4,9 @@
.components-autocomplete__result.components-button {
display: flex;
+ height: auto;
+ min-height: $button-size;
+ text-align: left;
width: 100%;
&.is-selected {
diff --git a/packages/components/src/base-control/style.scss b/packages/components/src/base-control/style.scss
index c94a581dc4e89b..bbdb59169d3776 100644
--- a/packages/components/src/base-control/style.scss
+++ b/packages/components/src/base-control/style.scss
@@ -12,7 +12,7 @@
.components-base-control__label {
display: inline-block;
- margin-bottom: $grid-unit-05;
+ margin-bottom: $grid-unit-10;
}
.components-base-control__help {
@@ -20,7 +20,3 @@
font-style: italic;
}
}
-
-.components-base-control + .components-base-control {
- margin-top: $grid-unit-20;
-}
diff --git a/packages/components/src/button-group/index.js b/packages/components/src/button-group/index.js
index 6f4fb672c8c6ef..2ef2b5e94c6018 100644
--- a/packages/components/src/button-group/index.js
+++ b/packages/components/src/button-group/index.js
@@ -3,10 +3,15 @@
*/
import classnames from 'classnames';
-function ButtonGroup( { className, ...props } ) {
+/**
+ * WordPress dependencies
+ */
+import { forwardRef } from '@wordpress/element';
+
+function ButtonGroup( { className, ...props }, ref ) {
const classes = classnames( 'components-button-group', className );
- return
;
+ return
;
}
-export default ButtonGroup;
+export default forwardRef( ButtonGroup );
diff --git a/packages/components/src/button-group/style.scss b/packages/components/src/button-group/style.scss
index 9d9c48f4980a98..f1dace4f64797a 100644
--- a/packages/components/src/button-group/style.scss
+++ b/packages/components/src/button-group/style.scss
@@ -4,17 +4,19 @@
.components-button {
border-radius: 0;
display: inline-flex;
+ color: $theme-color;
+ box-shadow: inset 0 0 0 $border-width $theme-color;
& + .components-button {
margin-left: -1px;
}
&:first-child {
- border-radius: 3px 0 0 3px;
+ border-radius: $radius-block-ui 0 0 $radius-block-ui;
}
&:last-child {
- border-radius: 0 3px 3px 0;
+ border-radius: 0 $radius-block-ui $radius-block-ui 0;
}
// The focused button should be elevated so the focus ring isn't cropped,
@@ -27,7 +29,7 @@
// The active button should look pressed.
&.is-primary {
- box-shadow: none;
+ box-shadow: inset 0 0 0 $border-width $theme-color;
}
}
}
diff --git a/packages/components/src/button/style.scss b/packages/components/src/button/style.scss
index 0778c339b7a79e..559d207972bb91 100644
--- a/packages/components/src/button/style.scss
+++ b/packages/components/src/button/style.scss
@@ -30,7 +30,7 @@
// Focus.
// See https://github.com/WordPress/gutenberg/issues/13267 for more context on these selectors.
&:focus:not(:disabled) {
- box-shadow: 0 0 0 2px color($theme-color);
+ box-shadow: 0 0 0 $border-width-focus $theme-color;
// Windows High Contrast mode will show this outline, but not the box-shadow.
outline: 1px solid transparent;
@@ -59,7 +59,7 @@
}
&:focus:not(:disabled) {
- box-shadow: inset 0 0 0 1px $white, 0 0 0 2px color($theme-color);
+ box-shadow: inset 0 0 0 1px $white, 0 0 0 $border-width-focus $theme-color;
// Windows High Contrast mode will show this outline, but not the box-shadow.
outline: 1px solid transparent;
@@ -188,7 +188,7 @@
color: #124964;
box-shadow:
0 0 0 $border-width #5b9dd9,
- 0 0 2px $border-width rgba(30, 140, 190, 0.8);
+ 0 0 $border-width-focus $border-width rgba(30, 140, 190, 0.8);
}
}
@@ -212,9 +212,18 @@
&.is-secondary.is-busy:disabled,
&.is-secondary.is-busy[aria-disabled="true"] {
animation: components-button__busy-animation 2500ms infinite linear;
- background-size: 100px 100%;
- background-image: repeating-linear-gradient(-45deg, $light-gray-500, $white 11px, $white 10px, $light-gray-500 20px);
opacity: 1;
+ background-size: 100px 100%;
+ // Disable reason: This function call looks nicer when each argument is on its own line.
+ /* stylelint-disable */
+ background-image: linear-gradient(
+ -45deg,
+ color($white shade(2%)) 28%,
+ color($white shade(12%)) 28%,
+ color($white shade(12%)) 72%,
+ color($white shade(2%)) 72%
+ );
+ /* stylelint-enable */
}
&.is-small {
@@ -249,6 +258,23 @@
}
}
+ // Toggled style.
+ &.is-pressed {
+ color: $white;
+ background: $dark-gray-primary;
+
+ &:focus:not(:disabled) {
+ box-shadow: inset 0 0 0 1px $white, 0 0 0 $border-width-focus $theme-color;
+
+ // Windows High Contrast mode will show this outline, but not the box-shadow.
+ outline: 2px solid transparent;
+ }
+
+ &:hover:not(:disabled) {
+ background: $dark-gray-primary;
+ }
+ }
+
svg {
fill: currentColor;
outline: none;
@@ -256,7 +282,7 @@
// Fixes a Safari+VoiceOver bug, where the screen reader text is announced not respecting the source order.
// See https://core.trac.wordpress.org/ticket/42006 and https://github.com/h5bp/html5-boilerplate/issues/1985
- .screen-reader-text {
+ .components-visually-hidden {
height: auto;
}
}
diff --git a/packages/components/src/card/styles/card-styles.js b/packages/components/src/card/styles/card-styles.js
index 1afba2ab42f639..dfdeb37726db11 100644
--- a/packages/components/src/card/styles/card-styles.js
+++ b/packages/components/src/card/styles/card-styles.js
@@ -109,13 +109,13 @@ export function bodySize() {
return `
&.is-size {
&-large {
- padding: 28px;
+ padding: 24px 32px;
}
&-medium {
- padding: 20px;
+ padding: 16px 24px;
}
&-small {
- padding: 12px;
+ padding: 16px;
}
&-extraSmall {
padding: 8px;
@@ -128,16 +128,16 @@ export function headerFooterSizes() {
return `
&.is-size {
&-large {
- padding: 20px 28px;
+ padding: 24px 32px;
}
&-medium {
- padding: 12px 20px;
+ padding: 16px 24px;
}
&-small {
- padding: 8px 12px;
+ padding: 16px;
}
&-extraSmall {
- padding: 4px 8px;
+ padding: 8px;
}
}
`;
diff --git a/packages/components/src/checkbox-control/README.md b/packages/components/src/checkbox-control/README.md
index b6245fbd036cd0..b6a055b2f7fc18 100644
--- a/packages/components/src/checkbox-control/README.md
+++ b/packages/components/src/checkbox-control/README.md
@@ -58,16 +58,18 @@ Render an is author checkbox:
import { CheckboxControl } from '@wordpress/components';
import { useState } from '@wordpress/element';
-const MyCheckboxControl = () => (
+const MyCheckboxControl = () => {
const [ isChecked, setChecked ] = useState( true );
-
-) );
+ return (
+
+ )
+};
```
### Props
diff --git a/packages/components/src/color-palette/test/__snapshots__/index.js.snap b/packages/components/src/color-palette/test/__snapshots__/index.js.snap
index 760221f289041e..07eed8a9d5019f 100644
--- a/packages/components/src/color-palette/test/__snapshots__/index.js.snap
+++ b/packages/components/src/color-palette/test/__snapshots__/index.js.snap
@@ -367,9 +367,9 @@ exports[`ColorPalette should render a dynamic toolbar of colors 1`] = `
xmlns="http://www.w3.org/2000/svg"
>
-
+
{ __(
'Use your left or right arrow keys or drag and drop with the mouse to change the gradient position. Press the button to change the color or remove the control point.'
) }
-
+
);
}
diff --git a/packages/components/src/custom-gradient-picker/stories/index.js b/packages/components/src/custom-gradient-picker/stories/index.js
new file mode 100644
index 00000000000000..e34cc07531af02
--- /dev/null
+++ b/packages/components/src/custom-gradient-picker/stories/index.js
@@ -0,0 +1,29 @@
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import CustomGradientPicker from '../';
+
+export default {
+ title: 'Components/CustomGradientPicker',
+ component: CustomGradientPicker,
+};
+
+const CustomGradientPickerWithState = ( props ) => {
+ const [ gradient, setGradient ] = useState();
+ return (
+
+ );
+};
+
+export const _default = () => {
+ return ;
+};
diff --git a/packages/components/src/custom-select-control/index.js b/packages/components/src/custom-select-control/index.js
index 94f63d6c8d41f5..49eb2b51a5c438 100644
--- a/packages/components/src/custom-select-control/index.js
+++ b/packages/components/src/custom-select-control/index.js
@@ -11,7 +11,7 @@ import { Icon, check, chevronDown } from '@wordpress/icons';
/**
* Internal dependencies
*/
-import { Button } from '../';
+import { Button, VisuallyHidden } from '../';
const itemToString = ( item ) => item && item.name;
// This is needed so that in Windows, where
@@ -98,19 +98,20 @@ export default function CustomSelectControl( {
className
) }
>
- { /* eslint-disable-next-line jsx-a11y/label-has-associated-control, jsx-a11y/label-has-for */ }
-
- { label }
-
+ { hideLabelFromVision ? (
+
+ { label }
+
+ ) : (
+ /* eslint-disable-next-line jsx-a11y/label-has-associated-control, jsx-a11y/label-has-for */
+
+ { label }
+
+ ) }
-
@@ -330,13 +330,13 @@ exports[`TimePicker matches the snapshot when the is12hour prop is specified 1`]
PM
-
+
@@ -498,12 +498,12 @@ exports[`TimePicker matches the snapshot when the is12hour prop is true 1`] = `
value="00"
/>
-
@@ -511,13 +511,13 @@ exports[`TimePicker matches the snapshot when the is12hour prop is true 1`] = `
PM
-
+
diff --git a/packages/components/src/date-time/time.js b/packages/components/src/date-time/time.js
index 25955a3335af28..9d8dbce3b2db04 100644
--- a/packages/components/src/date-time/time.js
+++ b/packages/components/src/date-time/time.js
@@ -15,6 +15,7 @@ import { __ } from '@wordpress/i18n';
* Internal dependencies
*/
import Button from '../button';
+import ButtonGroup from '../button-group';
/**
* Module Constants
@@ -318,24 +319,24 @@ class TimePicker extends Component {
/>
{ is12Hour && (
-
+
{ __( 'AM' ) }
{ __( 'PM' ) }
-
+
) }
diff --git a/packages/components/src/disabled/stories/index.js b/packages/components/src/disabled/stories/index.js
new file mode 100644
index 00000000000000..527c76899c6527
--- /dev/null
+++ b/packages/components/src/disabled/stories/index.js
@@ -0,0 +1,31 @@
+/**
+ * Internal dependencies
+ */
+import Disabled from '../';
+import SelectControl from '../../select-control/';
+import TextControl from '../../text-control/';
+import TextareaControl from '../../textarea-control/';
+
+export default {
+ title: 'Components/Disabled',
+ component: Disabled,
+};
+
+export const _default = () => {
+ return (
+
+
+
+ {} }
+ options={ [
+ { value: null, label: 'Select an option', disabled: true },
+ { value: 'a', label: 'Option A' },
+ { value: 'b', label: 'Option B' },
+ { value: 'c', label: 'Option C' },
+ ] }
+ />
+
+ );
+};
diff --git a/packages/components/src/drop-zone/index.js b/packages/components/src/drop-zone/index.js
index de2318d4d7c847..5180c6efdd7040 100644
--- a/packages/components/src/drop-zone/index.js
+++ b/packages/components/src/drop-zone/index.js
@@ -22,6 +22,7 @@ export function useDropZone( {
onDrop,
isDisabled,
withPosition,
+ __unstableIsRelative = false,
} ) {
const { addDropZone, removeDropZone } = useContext( Context );
const [ state, setState ] = useState( {
@@ -39,6 +40,7 @@ export function useDropZone( {
onHTMLDrop,
setState,
withPosition,
+ isRelative: __unstableIsRelative,
};
addDropZone( dropZone );
return () => {
@@ -76,6 +78,7 @@ function DropZoneComponent( {
onFilesDrop,
onHTMLDrop,
onDrop,
+ __unstableIsRelative: true,
}
);
diff --git a/packages/components/src/drop-zone/provider.js b/packages/components/src/drop-zone/provider.js
index cd71dc000e4ff4..43d9d859fd484b 100644
--- a/packages/components/src/drop-zone/provider.js
+++ b/packages/components/src/drop-zone/provider.js
@@ -150,18 +150,18 @@ class DropZoneProvider extends Component {
);
// Find the leaf dropzone not containing another dropzone
- const hoveredDropZone = find(
- hoveredDropZones,
- ( zone ) =>
- ! some(
- hoveredDropZones,
- ( subZone ) =>
- subZone !== zone &&
- zone.element.current.parentElement.contains(
- subZone.element.current
- )
- )
- );
+ const hoveredDropZone = find( hoveredDropZones, ( zone ) => {
+ const container = zone.isRelative
+ ? zone.element.current.parentElement
+ : zone.element.current;
+
+ return ! some(
+ hoveredDropZones,
+ ( subZone ) =>
+ subZone !== zone &&
+ container.contains( subZone.element.current )
+ );
+ } );
const hoveredDropZoneIndex = this.dropZones.indexOf( hoveredDropZone );
diff --git a/packages/components/src/dropdown-menu/index.native.js b/packages/components/src/dropdown-menu/index.native.js
index 6243847023227e..d665e37e49cae3 100644
--- a/packages/components/src/dropdown-menu/index.native.js
+++ b/packages/components/src/dropdown-menu/index.native.js
@@ -1,5 +1,184 @@
-function DropdownMenu() {
- return null;
+/**
+ * External dependencies
+ */
+import classnames from 'classnames';
+import { flatMap, isEmpty, isFunction } from 'lodash';
+import { Platform } from 'react-native';
+/**
+ * WordPress dependencies
+ */
+import { DOWN } from '@wordpress/keycodes';
+import deprecated from '@wordpress/deprecated';
+import { BottomSheet, PanelBody } from '@wordpress/components';
+import { withPreferredColorScheme } from '@wordpress/compose';
+
+/**
+ * Internal dependencies
+ */
+import Button from '../button';
+import Dropdown from '../dropdown';
+
+function mergeProps( defaultProps = {}, props = {} ) {
+ const mergedProps = {
+ ...defaultProps,
+ ...props,
+ };
+
+ if ( props.className && defaultProps.className ) {
+ mergedProps.className = classnames(
+ props.className,
+ defaultProps.className
+ );
+ }
+
+ return mergedProps;
+}
+
+function DropdownMenu( {
+ children,
+ className,
+ controls,
+ icon = 'menu',
+ label,
+ popoverProps,
+ toggleProps,
+ // The following props exist for backward compatibility.
+ menuLabel,
+ position,
+} ) {
+ if ( menuLabel ) {
+ deprecated( '`menuLabel` prop in `DropdownComponent`', {
+ alternative: '`menuProps` object and its `aria-label` property',
+ plugin: 'Gutenberg',
+ } );
+ }
+
+ if ( position ) {
+ deprecated( '`position` prop in `DropdownComponent`', {
+ alternative: '`popoverProps` object and its `position` property',
+ plugin: 'Gutenberg',
+ } );
+ }
+
+ if ( isEmpty( controls ) && ! isFunction( children ) ) {
+ return null;
+ }
+
+ // Normalize controls to nested array of objects (sets of controls)
+ let controlSets;
+ if ( ! isEmpty( controls ) ) {
+ controlSets = controls;
+ if ( ! Array.isArray( controlSets[ 0 ] ) ) {
+ controlSets = [ controlSets ];
+ }
+ }
+ const mergedPopoverProps = mergeProps(
+ {
+ className: 'components-dropdown-menu__popover',
+ position,
+ },
+ popoverProps
+ );
+
+ return (
+ {
+ const openOnArrowDown = ( event ) => {
+ if ( ! isOpen && event.keyCode === DOWN ) {
+ event.preventDefault();
+ event.stopPropagation();
+ onToggle();
+ }
+ };
+ const mergedToggleProps = mergeProps(
+ {
+ className: classnames(
+ 'components-dropdown-menu__toggle',
+ {
+ 'is-opened': isOpen,
+ }
+ ),
+ },
+ toggleProps
+ );
+
+ return (
+ {
+ onToggle( event );
+ if ( mergedToggleProps.onClick ) {
+ mergedToggleProps.onClick( event );
+ }
+ } }
+ onKeyDown={ ( event ) => {
+ openOnArrowDown( event );
+ if ( mergedToggleProps.onKeyDown ) {
+ mergedToggleProps.onKeyDown( event );
+ }
+ } }
+ aria-haspopup="true"
+ aria-expanded={ isOpen }
+ label={ label }
+ showTooltip
+ >
+ { mergedToggleProps.children }
+
+ );
+ } }
+ renderContent={ ( { isOpen, onClose, ...props } ) => {
+ return (
+
+ { isFunction( children ) ? children( props ) : null }
+
+ { flatMap(
+ controlSets,
+ ( controlSet, indexOfSet ) =>
+ controlSet.map(
+ ( control, indexOfControl ) => (
+ {
+ onClose();
+ if ( control.onClick ) {
+ control.onClick();
+ }
+ } }
+ editable={ false }
+ icon={ control.icon }
+ leftAlign={ true }
+ isSelected={ control.isActive }
+ separatorType={
+ indexOfControl ===
+ controlSet.length - 1 ||
+ Platform.OS === 'android'
+ ? 'none'
+ : 'leftMargin'
+ }
+ />
+ )
+ )
+ ) }
+
+
+ );
+ } }
+ />
+ );
}
-export default DropdownMenu;
+export default withPreferredColorScheme( DropdownMenu );
diff --git a/packages/components/src/dropdown-menu/stories/index.js b/packages/components/src/dropdown-menu/stories/index.js
new file mode 100644
index 00000000000000..0c29e016aacf2d
--- /dev/null
+++ b/packages/components/src/dropdown-menu/stories/index.js
@@ -0,0 +1,27 @@
+/**
+ * External dependencies
+ */
+import { text, object } from '@storybook/addon-knobs';
+
+/**
+ * Internal dependencies
+ */
+import DropdownMenu from '../';
+
+export default { title: 'Components/DropdownMenu', component: DropdownMenu };
+
+export const _default = () => {
+ const label = text( 'Label', 'Select a direction.' );
+ const icon = text( 'Icon', 'ellipsis' );
+ const controls = object( 'Controls', [
+ {
+ title: 'Up',
+ icon: 'arrow-up',
+ },
+ {
+ title: 'Down',
+ icon: 'arrow-down',
+ },
+ ] );
+ return ;
+};
diff --git a/packages/components/src/dropdown-menu/style.scss b/packages/components/src/dropdown-menu/style.scss
index c69ecd8c80a8dd..8b6c26be120168 100644
--- a/packages/components/src/dropdown-menu/style.scss
+++ b/packages/components/src/dropdown-menu/style.scss
@@ -34,20 +34,19 @@
height: 1px;
}
- &.is-active {
+ &.is-active svg {
// Block UI appearance.
- border: $border-width solid $dark-gray-primary;
- border-radius: $radius-block-ui;
color: $white;
background: $dark-gray-primary;
+ box-shadow: 0 0 0 $border-width $dark-gray-primary;
+ border-radius: $border-width;
}
// Formatting buttons
> svg {
- border-radius: $radius-round-rectangle;
+ border-radius: $radius-block-ui;
width: $button-size-small;
height: $button-size-small;
- margin: -1px $grid-unit-10 -1px 0;
}
}
diff --git a/packages/components/src/dropdown/index.js b/packages/components/src/dropdown/index.js
index cf47a7ac188a4a..dbf8380b1ffa47 100644
--- a/packages/components/src/dropdown/index.js
+++ b/packages/components/src/dropdown/index.js
@@ -78,7 +78,7 @@ class Dropdown extends Component {
const {
renderContent,
renderToggle,
- position = 'bottom',
+ position = 'bottom right',
className,
contentClassName,
expandOnMobile,
diff --git a/packages/components/src/font-size-picker/index.js b/packages/components/src/font-size-picker/index.js
index 999cc9b27e0959..30c316c0e1b9f3 100644
--- a/packages/components/src/font-size-picker/index.js
+++ b/packages/components/src/font-size-picker/index.js
@@ -12,6 +12,7 @@ import { textColor } from '@wordpress/icons';
import Button from '../button';
import RangeControl from '../range-control';
import CustomSelectControl from '../custom-select-control';
+import VisuallyHidden from '../visually-hidden';
const DEFAULT_FONT_SIZE = 'default';
const CUSTOM_FONT_SIZE = 'custom';
@@ -99,9 +100,7 @@ export default function FontSizePicker( {
const fontSizePickerNumberId = `components-font-size-picker__number#${ instanceId }`;
return (
-
- { __( 'Font size' ) }
-
+ { __( 'Font size' ) }
{ fontSizes.length > 0 && (
{
+ const [ isChecked, setChecked ] = useState( checked );
+ return (
+ {
+ setChecked( ! isChecked );
+ } }
+ />
+ );
+};
+
+export const _default = () => {
+ return ;
+};
diff --git a/packages/components/src/form-toggle/style.scss b/packages/components/src/form-toggle/style.scss
index ebe43dc70441a6..8be2aa6655ea98 100644
--- a/packages/components/src/form-toggle/style.scss
+++ b/packages/components/src/form-toggle/style.scss
@@ -77,7 +77,11 @@ $toggle-border-width: 2px;
}
&__input:focus + .components-form-toggle__track {
- @include switch-style__focus-active();
+ box-shadow: 0 0 0 2px $white, 0 0 0 (2px + $border-width-focus) $theme-color;
+
+ // Windows High Contrast mode will show this outline, but not the box-shadow.
+ outline: 2px solid transparent;
+ outline-offset: 2px;
}
&.is-checked {
diff --git a/packages/components/src/form-token-field/index.js b/packages/components/src/form-token-field/index.js
index b2c81977a50fbc..0641a327c64734 100644
--- a/packages/components/src/form-token-field/index.js
+++ b/packages/components/src/form-token-field/index.js
@@ -514,6 +514,7 @@ class FormTokenField extends Component {
const message = hasMatchingSuggestions
? sprintf(
+ /* translators: %d: number of results. */
_n(
'%d result found, use up and down arrow keys to navigate.',
'%d results found, use up and down arrow keys to navigate.',
diff --git a/packages/components/src/gradient-picker/stories/index.js b/packages/components/src/gradient-picker/stories/index.js
new file mode 100644
index 00000000000000..30d719ce4bec35
--- /dev/null
+++ b/packages/components/src/gradient-picker/stories/index.js
@@ -0,0 +1,83 @@
+/**
+ * External dependencies
+ */
+import { text, boolean, object } from '@storybook/addon-knobs';
+
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import GradientPicker from '../';
+
+export default {
+ title: 'Components/GradientPicker',
+ component: GradientPicker,
+};
+
+const GradientPickerWithState = ( props ) => {
+ const [ gradient, setGradient ] = useState();
+ return (
+
+ );
+};
+
+export const _default = () => {
+ const disableCustomGradients = boolean( 'Disable Custom Gradients', false );
+ const clearable = boolean( 'Clearable', true );
+ const className = text( 'Class Name', '' );
+ const gradients = object( 'Gradients', [
+ {
+ name: 'Vivid cyan blue to vivid purple',
+ 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%)',
+ 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%)',
+ 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%)',
+ 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%)',
+ 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%)',
+ slug: 'cool-to-warm-spectrum',
+ },
+ ] );
+
+ return (
+
+ );
+};
diff --git a/packages/components/src/guide/page-control.js b/packages/components/src/guide/page-control.js
index 837a0b31e7d5ad..1a39fdd1426c8e 100644
--- a/packages/components/src/guide/page-control.js
+++ b/packages/components/src/guide/page-control.js
@@ -37,8 +37,8 @@ export default function PageControl( {
isSelected={ page === currentPage }
/>
}
- /* translators: %1$d: current page number %2$d: total number of pages */
aria-label={ sprintf(
+ /* translators: 1: current page number 2: total number of pages */
__( 'Page %1$d of %2$d' ),
page + 1,
numberOfPages
diff --git a/packages/components/src/higher-order/with-focus-return/test/index.js b/packages/components/src/higher-order/with-focus-return/test/index.js
index cd110d4fa7cd8e..67502237260b32 100644
--- a/packages/components/src/higher-order/with-focus-return/test/index.js
+++ b/packages/components/src/higher-order/with-focus-return/test/index.js
@@ -2,12 +2,12 @@
* External dependencies
*/
import renderer from 'react-test-renderer';
-import { mount } from 'enzyme';
+import { render } from '@testing-library/react';
/**
* WordPress dependencies
*/
-import { Component, createElement } from '@wordpress/element';
+import { Component } from '@wordpress/element';
/**
* Internal dependencies
@@ -29,12 +29,8 @@ describe( 'withFocusReturn()', () => {
const Composite = withFocusReturn( Test );
const activeElement = document.createElement( 'button' );
const switchFocusTo = document.createElement( 'input' );
-
- const getInstance = ( wrapper ) => {
- return wrapper.root.find(
- ( node ) => node.instance instanceof Component
- ).instance;
- };
+ document.body.appendChild( activeElement );
+ document.body.appendChild( switchFocusTo );
beforeEach( () => {
activeElement.focus();
@@ -74,72 +70,78 @@ describe( 'withFocusReturn()', () => {
} );
it( 'should not switch focus back to the bound focus element', () => {
- const mountedComposite = renderer.create( );
-
- expect( getInstance( mountedComposite ).activeElementOnMount ).toBe(
- activeElement
- );
+ const { unmount } = render( , {
+ container: document.body.appendChild(
+ document.createElement( 'div' )
+ ),
+ } );
// Change activeElement.
switchFocusTo.focus();
expect( document.activeElement ).toBe( switchFocusTo );
// Should keep focus on switchFocusTo, because it is not within HOC.
- mountedComposite.unmount();
+ unmount();
expect( document.activeElement ).toBe( switchFocusTo );
} );
it( 'should switch focus back when unmounted while having focus', () => {
- const wrapper = mount( );
- wrapper
- .find( 'textarea' )
- .at( 0 )
- .simulate( 'focus' );
+ const { container, unmount } = render( , {
+ container: document.body.appendChild(
+ document.createElement( 'div' )
+ ),
+ } );
+
+ const textarea = container.querySelector( 'textarea' );
+ textarea.focus();
+ expect( document.activeElement ).toBe( textarea );
// Should return to the activeElement saved with this component.
- wrapper.unmount();
+ unmount();
expect( document.activeElement ).toBe( activeElement );
} );
it( 'should switch focus to the most recent still-available focus target', () => {
- const container = document.createElement( 'div' );
- document.body.appendChild( container );
- const wrapper = mount(
- createElement(
- ( props ) => (
-
-
- { props.renderSecondInput && (
-
- ) }
- { props.renderComposite && }
-
+ const TestComponent = ( props ) => (
+
+
+ { props.renderSecondInput && }
+ { props.renderComposite && }
+
+ );
+
+ const { container, rerender } = render(
+ ,
+ {
+ container: document.body.appendChild(
+ document.createElement( 'div' )
),
- { renderSecondInput: true }
- ),
- { attachTo: container }
+ }
);
- function focus( selector ) {
- const childWrapper = wrapper.find( selector );
- const childNode = childWrapper.getDOMNode();
- childWrapper.simulate( 'focus', { target: childNode } );
- }
+ const firstInput = container.querySelector( 'input[name="first"]' );
+ firstInput.focus();
- focus( 'input[name="first"]' );
- jest.spyOn(
- wrapper.find( 'input[name="first"]' ).getDOMNode(),
- 'focus'
+ const secondInput = container.querySelector(
+ 'input[name="second"]'
);
- focus( 'input[name="second"]' );
- wrapper.setProps( { renderComposite: true } );
- focus( 'textarea' );
- wrapper.setProps( { renderSecondInput: false } );
- wrapper.setProps( { renderComposite: false } );
-
- expect(
- wrapper.find( 'input[name="first"]' ).getDOMNode().focus
- ).toHaveBeenCalled();
+ secondInput.focus();
+
+ expect( document.activeElement ).toBe( secondInput );
+
+ rerender( );
+ const textarea = container.querySelector( 'textarea' );
+ textarea.focus();
+
+ expect( document.activeElement ).toBe( textarea );
+
+ rerender( );
+
+ expect( document.activeElement ).toBe( textarea );
+
+ rerender( );
+
+ expect( document.activeElement ).toBe( firstInput );
} );
} );
} );
diff --git a/packages/components/src/higher-order/with-notices/index.js b/packages/components/src/higher-order/with-notices/index.js
index 4806d6d8d6254c..0a1280438282cb 100644
--- a/packages/components/src/higher-order/with-notices/index.js
+++ b/packages/components/src/higher-order/with-notices/index.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import uuid from 'uuid/v4';
+import { v4 as uuid } from 'uuid';
/**
* WordPress dependencies
diff --git a/packages/components/src/index.js b/packages/components/src/index.js
index e02dde7f7217df..f5142afb2f86e0 100644
--- a/packages/components/src/index.js
+++ b/packages/components/src/index.js
@@ -62,6 +62,7 @@ export { default as Modal } from './modal';
export { default as ScrollLock } from './scroll-lock';
export { NavigableMenu, TabbableContainer } from './navigable-container';
export { default as Notice } from './notice';
+export { default as __experimentalNumberControl } from './number-control';
export { default as NoticeList } from './notice/list';
export { default as Panel } from './panel';
export { default as PanelBody } from './panel/body';
@@ -70,6 +71,8 @@ export { default as PanelRow } from './panel/row';
export { default as Placeholder } from './placeholder';
export { default as Popover } from './popover';
export { default as QueryControls } from './query-controls';
+export { default as __experimentalRadio } from './radio';
+export { default as __experimentalRadioGroup } from './radio-group';
export { default as RadioControl } from './radio-control';
export { default as RangeControl } from './range-control';
export { default as ResizableBox } from './resizable-box';
@@ -80,6 +83,7 @@ export { default as Snackbar } from './snackbar';
export { default as SnackbarList } from './snackbar/list';
export { default as Spinner } from './spinner';
export { default as TabPanel } from './tab-panel';
+export { default as __experimentalText } from './text';
export { default as TextControl } from './text-control';
export { default as TextareaControl } from './textarea-control';
export { default as TextHighlight } from './text-highlight';
@@ -91,6 +95,7 @@ export { default as ToolbarGroup } from './toolbar-group';
export { default as __experimentalToolbarItem } from './toolbar-item';
export { default as Tooltip } from './tooltip';
export { default as TreeSelect } from './tree-select';
+export { default as __experimentalUnitControl } from './unit-control';
export { default as VisuallyHidden } from './visually-hidden';
export { default as IsolatedEventContainer } from './isolated-event-container';
export {
@@ -113,4 +118,3 @@ export {
} from './higher-order/with-focus-return';
export { default as withNotices } from './higher-order/with-notices';
export { default as withSpokenMessages } from './higher-order/with-spoken-messages';
-export * from './text';
diff --git a/packages/components/src/index.native.js b/packages/components/src/index.native.js
index 58a0ad7765cbc2..5e213eddb10baa 100644
--- a/packages/components/src/index.native.js
+++ b/packages/components/src/index.native.js
@@ -30,11 +30,14 @@ export { default as TextareaControl } from './textarea-control';
export { default as PanelBody } from './panel/body';
export { default as PanelActions } from './panel/actions';
export { default as Button } from './button';
+export { default as __experimentalText } from './text';
export { default as TextControl } from './text-control';
export { default as ToggleControl } from './toggle-control';
export { default as SelectControl } from './select-control';
export { default as RangeControl } from './range-control';
+export { default as ResizableBox } from './resizable-box';
export { default as UnsupportedFooterControl } from './unsupported-footer-control';
+export { default as QueryControls } from './query-controls';
// Higher-Order Components
export { default as withConstrainedTabbing } from './higher-order/with-constrained-tabbing';
@@ -44,6 +47,7 @@ export { default as withFocusOutside } from './higher-order/with-focus-outside';
export { default as withFocusReturn } from './higher-order/with-focus-return';
export { default as withNotices } from './higher-order/with-notices';
export { default as withSpokenMessages } from './higher-order/with-spoken-messages';
+export * from './text';
// Mobile Components
export { default as BottomSheet } from './mobile/bottom-sheet';
@@ -53,7 +57,6 @@ export { default as KeyboardAwareFlatList } from './mobile/keyboard-aware-flat-l
export { default as ModalHeaderBar } from './mobile/modal-header-bar';
export { default as Picker } from './mobile/picker';
export { default as ReadableContentView } from './mobile/readable-content-view';
-export { default as StepperControl } from './mobile/stepper-control';
export { default as CycleSelectControl } from './mobile/cycle-select-control';
export { default as ImageWithFocalPoint } from './mobile/image-with-focalpoint';
export { default as LinearGradient } from './mobile/linear-gradient';
diff --git a/packages/components/src/menu-items-choice/README.md b/packages/components/src/menu-items-choice/README.md
index bd294f35663894..9a5e42210ae959 100644
--- a/packages/components/src/menu-items-choice/README.md
+++ b/packages/components/src/menu-items-choice/README.md
@@ -63,11 +63,11 @@ const MyMenuItemsChoice = withState( {
choices: [
{
value: 'visual',
- label: 'Visual Editor',
+ label: 'Visual editor',
},
{
value: 'text',
- label: 'Code Editor',
+ label: 'Code editor',
},
],
} )( ( { mode, choices, setState } ) => (
diff --git a/packages/components/src/menu-items-choice/index.js b/packages/components/src/menu-items-choice/index.js
index 06be9158ff7b45..299eb2b743f198 100644
--- a/packages/components/src/menu-items-choice/index.js
+++ b/packages/components/src/menu-items-choice/index.js
@@ -1,3 +1,8 @@
+/**
+ * External dependencies
+ */
+import { noop } from 'lodash';
+
/**
* WordPress dependencies
*/
@@ -8,7 +13,12 @@ import { check } from '@wordpress/icons';
*/
import MenuItem from '../menu-item';
-export default function MenuItemsChoice( { choices = [], onSelect, value } ) {
+export default function MenuItemsChoice( {
+ choices = [],
+ onHover = noop,
+ onSelect,
+ value,
+} ) {
return choices.map( ( item ) => {
const isSelected = value === item.value;
return (
@@ -24,6 +34,8 @@ export default function MenuItemsChoice( { choices = [], onSelect, value } ) {
onSelect( item.value );
}
} }
+ onMouseEnter={ () => onHover( item.value ) }
+ onMouseLeave={ () => onHover( null ) }
>
{ item.label }
diff --git a/packages/components/src/mobile/bottom-sheet/cell.native.js b/packages/components/src/mobile/bottom-sheet/cell.native.js
index e1bea1ac3bea34..50d11a85017151 100644
--- a/packages/components/src/mobile/bottom-sheet/cell.native.js
+++ b/packages/components/src/mobile/bottom-sheet/cell.native.js
@@ -9,12 +9,13 @@ import {
I18nManager,
AccessibilityInfo,
} from 'react-native';
-import { isEmpty } from 'lodash';
+import { isEmpty, get } from 'lodash';
/**
* WordPress dependencies
*/
import { Icon } from '@wordpress/components';
+import { check } from '@wordpress/icons';
import { Component } from '@wordpress/element';
import { __, _x, sprintf } from '@wordpress/i18n';
import { withPreferredColorScheme } from '@wordpress/compose';
@@ -87,6 +88,7 @@ class BottomSheetCell extends Component {
accessibilityHint,
accessibilityRole,
disabled = false,
+ activeOpacity,
onPress,
label,
value,
@@ -98,8 +100,10 @@ class BottomSheetCell extends Component {
cellContainerStyle = {},
cellRowContainerStyle = {},
onChangeValue,
+ onSubmit,
children,
editable = true,
+ isSelected = false,
separatorType,
style = {},
getStylesFromColorScheme,
@@ -127,7 +131,7 @@ class BottomSheetCell extends Component {
? cellLabelLeftAlignNoIconStyle
: cellLabelCenteredStyle;
const defaultLabelStyle =
- showValue || icon !== undefined || customActionButton
+ showValue || customActionButton || icon
? cellLabelStyle
: defaultMissingIconAndValue;
@@ -187,7 +191,10 @@ class BottomSheetCell extends Component {
case 'none':
return undefined;
case undefined:
- return showValue ? leftMarginStyle : defaultSeparatorStyle;
+ if ( showValue && icon !== undefined ) {
+ return leftMarginStyle;
+ }
+ return defaultSeparatorStyle;
}
};
@@ -223,6 +230,7 @@ class BottomSheetCell extends Component {
}
onFocus={ startEditing }
onBlur={ finishEditing }
+ onSubmitEditing={ onSubmit }
keyboardType={ this.typeToKeyboardType( type, step ) }
{ ...valueProps }
/>
@@ -268,6 +276,11 @@ class BottomSheetCell extends Component {
this.state.isScreenReaderEnabled && accessible ? 'none' : 'auto';
const { title, handler } = customActionButton || {};
+ const opacity =
+ activeOpacity !== undefined
+ ? activeOpacity
+ : get( platformStyles, 'activeOpacity.opacity' );
+
return (
@@ -300,6 +314,7 @@ class BottomSheetCell extends Component {
icon={ icon }
size={ 24 }
color={ iconStyle.color }
+ isPressed={ false }
/>
) }
+ { isSelected && (
+
+ ) }
{ showValue && getValueComponent() }
{ children }
diff --git a/packages/components/src/mobile/bottom-sheet/cellStyles.android.scss b/packages/components/src/mobile/bottom-sheet/cellStyles.android.scss
index 4feb815ba9bd07..0c823db8c3fc90 100644
--- a/packages/components/src/mobile/bottom-sheet/cellStyles.android.scss
+++ b/packages/components/src/mobile/bottom-sheet/cellStyles.android.scss
@@ -5,3 +5,7 @@
.separatorMarginLeft {
margin-left: 56px;
}
+
+.isSelected {
+ color: $blue-wordpress;
+}
diff --git a/packages/components/src/mobile/bottom-sheet/cellStyles.ios.scss b/packages/components/src/mobile/bottom-sheet/cellStyles.ios.scss
index 45b97213d1768f..6cb9dead68b6f7 100644
--- a/packages/components/src/mobile/bottom-sheet/cellStyles.ios.scss
+++ b/packages/components/src/mobile/bottom-sheet/cellStyles.ios.scss
@@ -5,3 +5,11 @@
.separatorMarginLeft {
margin-left: 36px;
}
+
+.isSelected {
+ color: $blue-wordpress;
+}
+
+.activeOpacity {
+ opacity: 1;
+}
diff --git a/packages/components/src/mobile/bottom-sheet/index.native.js b/packages/components/src/mobile/bottom-sheet/index.native.js
index 4df6fc064a0884..826356958c9b71 100644
--- a/packages/components/src/mobile/bottom-sheet/index.native.js
+++ b/packages/components/src/mobile/bottom-sheet/index.native.js
@@ -13,6 +13,7 @@ import {
} from 'react-native';
import Modal from 'react-native-modal';
import SafeArea from 'react-native-safe-area';
+import { subscribeAndroidModalClosed } from 'react-native-gutenberg-bridge';
/**
* WordPress dependencies
@@ -67,6 +68,14 @@ class BottomSheet extends Component {
}
componentDidMount() {
+ if ( Platform.OS === 'android' ) {
+ this.androidModalClosedSubscription = subscribeAndroidModalClosed(
+ () => {
+ this.props.onClose();
+ }
+ );
+ }
+
this.keyboardWillShowListener = Keyboard.addListener(
'keyboardWillShow',
this.keyboardWillShow
@@ -85,6 +94,9 @@ class BottomSheet extends Component {
}
componentWillUnmount() {
+ if ( this.androidModalClosedSubscription ) {
+ this.androidModalClosedSubscription.remove();
+ }
if ( this.safeAreaEventSubscription === null ) {
return;
}
diff --git a/packages/components/src/mobile/bottom-sheet/range-cell.native.js b/packages/components/src/mobile/bottom-sheet/range-cell.native.js
index 717ab84232a097..96867a38630719 100644
--- a/packages/components/src/mobile/bottom-sheet/range-cell.native.js
+++ b/packages/components/src/mobile/bottom-sheet/range-cell.native.js
@@ -133,6 +133,7 @@ class BottomSheetRangeCell extends Component {
}
announceCurrentValue( value ) {
+ /* translators: %s: current cell value. */
const announcement = sprintf( __( 'Current value is %s' ), value );
AccessibilityInfo.announceForAccessibility( announcement );
}
@@ -182,6 +183,7 @@ class BottomSheetRangeCell extends Component {
accessibilityRole={ 'none' }
value={ '' }
editable={ false }
+ activeOpacity={ 1 }
accessible={ accessible }
onPress={ this.onCellPress }
accessibilityLabel={ accessibilityLabel }
diff --git a/packages/components/src/mobile/bottom-sheet/stepper-cell/stepper.ios.js b/packages/components/src/mobile/bottom-sheet/stepper-cell/stepper.ios.js
index a688bd46dc5c9a..e226b8adb4b20f 100644
--- a/packages/components/src/mobile/bottom-sheet/stepper-cell/stepper.ios.js
+++ b/packages/components/src/mobile/bottom-sheet/stepper-cell/stepper.ios.js
@@ -49,12 +49,7 @@ function Stepper( {
onPressOut={ onPressOut }
style={ [ buttonStyle, isMaxValue ? { opacity: 0.4 } : null ] }
>
-
+
);
diff --git a/packages/components/src/mobile/bottom-sheet/stepper-cell/style.native.scss b/packages/components/src/mobile/bottom-sheet/stepper-cell/style.native.scss
index 0be9b711f2d5f9..597bb22dc726e7 100644
--- a/packages/components/src/mobile/bottom-sheet/stepper-cell/style.native.scss
+++ b/packages/components/src/mobile/bottom-sheet/stepper-cell/style.native.scss
@@ -12,6 +12,7 @@
}
.cellRowStyles {
+ flex-shrink: 1;
min-height: 48px;
align-items: center;
justify-content: space-between;
@@ -63,8 +64,3 @@
.valueTextDark {
color: $light-opacity-200;
}
-
-.plus {
- margin-top: 4px;
- margin-right: 1px;
-}
diff --git a/packages/components/src/mobile/bottom-sheet/styles.native.scss b/packages/components/src/mobile/bottom-sheet/styles.native.scss
index 04f1651bfc795a..4550fb21d0c52d 100644
--- a/packages/components/src/mobile/bottom-sheet/styles.native.scss
+++ b/packages/components/src/mobile/bottom-sheet/styles.native.scss
@@ -93,6 +93,7 @@
flex-direction: row;
min-height: 48;
align-items: center;
+ justify-content: space-between;
}
.clipToBounds {
@@ -112,7 +113,7 @@
.cellRowContainer {
flex-direction: row;
align-items: center;
- flex-shrink: 1;
+ flex-shrink: 0;
}
.cellIcon {
@@ -137,7 +138,7 @@
font-size: 17px;
color: #2e4453;
flex: 1;
- margin-left: 12px;
+ margin-left: 0;
}
.cellValue {
diff --git a/packages/components/src/mobile/image-with-focalpoint/index.native.js b/packages/components/src/mobile/image-with-focalpoint/index.native.js
index 0e542eaad82770..440b8477ff2bcd 100644
--- a/packages/components/src/mobile/image-with-focalpoint/index.native.js
+++ b/packages/components/src/mobile/image-with-focalpoint/index.native.js
@@ -27,7 +27,7 @@ const ImageWithFocalPoint = ( { focalPoint, url } ) => {
} );
} );
}
- }, [] );
+ }, [ url ] );
const onContainerLayout = ( event ) => {
const { height, width } = event.nativeEvent.layout;
@@ -97,18 +97,10 @@ const ImageWithFocalPoint = ( { focalPoint, url } ) => {
return (
(
{
this.scrollViewRef = ref;
@@ -48,6 +50,7 @@ export const KeyboardAwareFlatList = ( {
onKeyboardWillShow={ () => {
this.keyboardWillShowIndicator = true;
} }
+ scrollEnabled={ listProps.scrollEnabled }
onScroll={ ( event ) => {
this.latestContentOffsetY = event.nativeEvent.contentOffset.y;
} }
diff --git a/packages/components/src/mobile/modal-header-bar/styles.native.scss b/packages/components/src/mobile/modal-header-bar/styles.native.scss
index 688f941586f145..4ee1ebe584704d 100644
--- a/packages/components/src/mobile/modal-header-bar/styles.native.scss
+++ b/packages/components/src/mobile/modal-header-bar/styles.native.scss
@@ -8,7 +8,7 @@
}
.subtitleBar {
- height: 64px;
+ height: 56px;
}
.leftContainer {
@@ -56,5 +56,5 @@
}
.separatorDark {
- background-color: $gray-70;
+ background-color: #2d2d2d;
}
diff --git a/packages/components/src/mobile/readable-content-view/index.native.js b/packages/components/src/mobile/readable-content-view/index.native.js
index a25048b0b5dffa..ec1f67a4d98f89 100644
--- a/packages/components/src/mobile/readable-content-view/index.native.js
+++ b/packages/components/src/mobile/readable-content-view/index.native.js
@@ -8,14 +8,15 @@ import { View, Dimensions } from 'react-native';
*/
import styles from './style.scss';
-const ReadableContentView = ( { reversed, children } ) => (
+const ReadableContentView = ( { reversed, children, style } ) => (
{ children }
diff --git a/packages/components/src/mobile/stepper-control/README.md b/packages/components/src/mobile/stepper-control/README.md
deleted file mode 100644
index f66bce6171fc2f..00000000000000
--- a/packages/components/src/mobile/stepper-control/README.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# StepperControl
-
-`StepperControl` shows a stepper control to change a value wrapped in a `StepperCell` component.
-
-## Usage
-
-Usage example
-
-```jsx
-import { StepperControl } from '@wordpress/components';
-import { more } from '@wordpress/icons';
-
-function Stepper( { onChange, value } ) {
- return (
-
- );
-}
-```
-
-## Props
-
-### max
-
-Maximum value of the stepper.
-
-- Type: `Number`
-- Required: Yes
-- Platform: Mobile
-
-### min
-
-Minimum value of the stepper.
-
-- Type: `Number`
-- Required: Yes
-- Platform: Mobile
-
-### step
-
-Step increment value.
-
-- Type: `Number`
-- Required: No
-- Platform: Mobile
-
-### value
-
-Current value of the stepper.
-
-- Type: `Number`
-- Required: Yes
-- Platform: Mobile
-
-### onChange
-
-Callback called when the value has changed
-
-- Type: `Function`
-- Required: Yes
-- Platform: Mobile
-
-The argument of the callback is the updated value as a `Number`.
diff --git a/packages/components/src/mobile/stepper-control/index.native.js b/packages/components/src/mobile/stepper-control/index.native.js
deleted file mode 100644
index 5cc565f3937824..00000000000000
--- a/packages/components/src/mobile/stepper-control/index.native.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Internal dependencies
- */
-import StepperCell from '../bottom-sheet/stepper-cell';
-
-function StepperControl( {
- icon,
- label,
- max,
- min,
- onChange,
- separatorType,
- step,
- value,
-} ) {
- return (
-
- );
-}
-
-export default StepperControl;
diff --git a/packages/components/src/navigable-container/test/menu.js b/packages/components/src/navigable-container/test/menu.js
index eed4b235c91b4c..97609943740b80 100644
--- a/packages/components/src/navigable-container/test/menu.js
+++ b/packages/components/src/navigable-container/test/menu.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import { mount } from 'enzyme';
+import { fireEvent, render } from '@testing-library/react';
import { each } from 'lodash';
/**
@@ -14,8 +14,8 @@ import { UP, DOWN, LEFT, RIGHT, SPACE } from '@wordpress/keycodes';
*/
import { NavigableMenu } from '../menu';
-function simulateVisible( wrapper, selector ) {
- const elements = wrapper.getDOMNode().querySelectorAll( selector );
+function simulateVisible( container, selector ) {
+ const elements = container.querySelectorAll( selector );
each( elements, ( elem ) => {
elem.getClientRects = () => [
'trick-jsdom-into-having-size-for-element-rect',
@@ -23,7 +23,7 @@ function simulateVisible( wrapper, selector ) {
} );
}
-function fireKeyDown( container, keyCode, shiftKey ) {
+function fireKeyDown( node, keyCode, shiftKey ) {
const interaction = {
stopped: false,
};
@@ -35,7 +35,7 @@ function fireKeyDown( container, keyCode, shiftKey ) {
event.stopImmediatePropagation = () => {
interaction.stopped = true;
};
- container.getDOMNode().dispatchEvent( event );
+ fireEvent( node, event );
return interaction;
}
@@ -43,7 +43,7 @@ function fireKeyDown( container, keyCode, shiftKey ) {
describe( 'NavigableMenu', () => {
it( 'vertical: should navigate by up and down', () => {
let currentIndex = 0;
- const wrapper = mount(
+ const { container, getByRole } = render(
/*
Disabled because of our rule restricting literal IDs, preferring
`withInstanceId`. In this case, it's fine to use literal IDs.
@@ -71,17 +71,17 @@ describe( 'NavigableMenu', () => {
/* eslint-enable no-restricted-syntax */
);
- simulateVisible( wrapper, '*' );
+ simulateVisible( container, '*' );
- const container = wrapper.find( 'div' );
- wrapper
- .getDOMNode()
- .querySelector( '#btn1' )
- .focus();
+ container.querySelector( '#btn1' ).focus();
// Navigate options
function assertKeyDown( keyCode, expectedActiveIndex, expectedStop ) {
- const interaction = fireKeyDown( container, keyCode, false );
+ const interaction = fireKeyDown(
+ getByRole( 'menu' ),
+ keyCode,
+ false
+ );
expect( currentIndex ).toBe( expectedActiveIndex );
expect( interaction.stopped ).toBe( expectedStop );
}
@@ -101,7 +101,7 @@ describe( 'NavigableMenu', () => {
it( 'vertical: should navigate by up and down, and stop at edges', () => {
let currentIndex = 0;
- const wrapper = mount(
+ const { container, getByRole } = render(
/*
Disabled because of our rule restricting literal IDs, preferring
`withInstanceId`. In this case, it's fine to use literal IDs.
@@ -125,17 +125,17 @@ describe( 'NavigableMenu', () => {
/* eslint-enable no-restricted-syntax */
);
- simulateVisible( wrapper, '*' );
+ simulateVisible( container, '*' );
- const container = wrapper.find( 'div' );
- wrapper
- .getDOMNode()
- .querySelector( '#btn1' )
- .focus();
+ container.querySelector( '#btn1' ).focus();
// Navigate options
function assertKeyDown( keyCode, expectedActiveIndex, expectedStop ) {
- const interaction = fireKeyDown( container, keyCode, false );
+ const interaction = fireKeyDown(
+ getByRole( 'menu' ),
+ keyCode,
+ false
+ );
expect( currentIndex ).toBe( expectedActiveIndex );
expect( interaction.stopped ).toBe( expectedStop );
}
@@ -153,7 +153,7 @@ describe( 'NavigableMenu', () => {
it( 'horizontal: should navigate by left and right', () => {
let currentIndex = 0;
- const wrapper = mount(
+ const { container, getByRole } = render(
/*
Disabled because of our rule restricting literal IDs, preferring
`withInstanceId`. In this case, it's fine to use literal IDs.
@@ -181,17 +181,17 @@ describe( 'NavigableMenu', () => {
/* eslint-enable no-restricted-syntax */
);
- simulateVisible( wrapper, '*' );
+ simulateVisible( container, '*' );
- const container = wrapper.find( 'div' );
- wrapper
- .getDOMNode()
- .querySelector( '#btn1' )
- .focus();
+ container.querySelector( '#btn1' ).focus();
// Navigate options
function assertKeyDown( keyCode, expectedActiveIndex, expectedStop ) {
- const interaction = fireKeyDown( container, keyCode, false );
+ const interaction = fireKeyDown(
+ getByRole( 'menu' ),
+ keyCode,
+ false
+ );
expect( currentIndex ).toBe( expectedActiveIndex );
expect( interaction.stopped ).toBe( expectedStop );
}
@@ -211,7 +211,7 @@ describe( 'NavigableMenu', () => {
it( 'horizontal: should navigate by left and right, and stop at edges', () => {
let currentIndex = 0;
- const wrapper = mount(
+ const { container, getByRole } = render(
/*
Disabled because of our rule restricting literal IDs, preferring
`withInstanceId`. In this case, it's fine to use literal IDs.
@@ -235,17 +235,17 @@ describe( 'NavigableMenu', () => {
/* eslint-enable no-restricted-syntax */
);
- simulateVisible( wrapper, '*' );
+ simulateVisible( container, '*' );
- const container = wrapper.find( 'div' );
- wrapper
- .getDOMNode()
- .querySelector( '#btn1' )
- .focus();
+ container.querySelector( '#btn1' ).focus();
// Navigate options
function assertKeyDown( keyCode, expectedActiveIndex, expectedStop ) {
- const interaction = fireKeyDown( container, keyCode, false );
+ const interaction = fireKeyDown(
+ getByRole( 'menu' ),
+ keyCode,
+ false
+ );
expect( currentIndex ).toBe( expectedActiveIndex );
expect( interaction.stopped ).toBe( expectedStop );
}
@@ -263,7 +263,7 @@ describe( 'NavigableMenu', () => {
it( 'both: should navigate by up/down and left/right', () => {
let currentIndex = 0;
- const wrapper = mount(
+ const { container, getByRole } = render(
/*
Disabled because of our rule restricting literal IDs, preferring
`withInstanceId`. In this case, it's fine to use literal IDs.
@@ -280,17 +280,13 @@ describe( 'NavigableMenu', () => {
/* eslint-enable no-restricted-syntax */
);
- simulateVisible( wrapper, '*' );
+ simulateVisible( container, '*' );
- const container = wrapper.find( 'div' );
- wrapper
- .getDOMNode()
- .querySelector( '#btn1' )
- .focus();
+ container.querySelector( '#btn1' ).focus();
// Navigate options
function assertKeyDown( keyCode, expectedActiveIndex, expectedStop ) {
- const interaction = fireKeyDown( container, keyCode );
+ const interaction = fireKeyDown( getByRole( 'menu' ), keyCode );
expect( currentIndex ).toBe( expectedActiveIndex );
expect( interaction.stopped ).toBe( expectedStop );
}
diff --git a/packages/components/src/navigable-container/test/tabbable.js b/packages/components/src/navigable-container/test/tabbable.js
index 323cad39f4dc22..127a91ea9a847a 100644
--- a/packages/components/src/navigable-container/test/tabbable.js
+++ b/packages/components/src/navigable-container/test/tabbable.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import { mount } from 'enzyme';
+import { fireEvent, render } from '@testing-library/react';
import { each } from 'lodash';
/**
@@ -14,8 +14,8 @@ import { TAB, SPACE } from '@wordpress/keycodes';
*/
import { TabbableContainer } from '../tabbable';
-function simulateVisible( wrapper, selector ) {
- const elements = wrapper.getDOMNode().querySelectorAll( selector );
+function simulateVisible( container, selector ) {
+ const elements = container.querySelectorAll( selector );
each( elements, ( elem ) => {
elem.getClientRects = () => [
'trick-jsdom-into-having-size-for-element-rect',
@@ -23,7 +23,7 @@ function simulateVisible( wrapper, selector ) {
} );
}
-function fireKeyDown( container, keyCode, shiftKey ) {
+function fireKeyDown( node, keyCode, shiftKey ) {
const interaction = {
stopped: false,
};
@@ -35,7 +35,7 @@ function fireKeyDown( container, keyCode, shiftKey ) {
event.stopImmediatePropagation = () => {
interaction.stopped = true;
};
- container.getDOMNode().dispatchEvent( event );
+ fireEvent( node, event );
return interaction;
}
@@ -43,7 +43,7 @@ function fireKeyDown( container, keyCode, shiftKey ) {
describe( 'TabbableContainer', () => {
it( 'should navigate by keypresses', () => {
let currentIndex = 0;
- const wrapper = mount(
+ const { container } = render(
/*
Disabled because of our rule restricting literal IDs, preferring
`withInstanceId`. In this case, it's fine to use literal IDs.
@@ -71,13 +71,9 @@ describe( 'TabbableContainer', () => {
/* eslint-enable no-restricted-syntax */
);
- simulateVisible( wrapper, '*' );
+ simulateVisible( container, '*' );
- const container = wrapper.find( 'div.wrapper' );
- wrapper
- .getDOMNode()
- .querySelector( '#section1' )
- .focus();
+ container.querySelector( '#section1' ).focus();
// Navigate options
function assertKeyDown(
@@ -86,7 +82,11 @@ describe( 'TabbableContainer', () => {
expectedActiveIndex,
expectedStop
) {
- const interaction = fireKeyDown( container, keyCode, shiftKey );
+ const interaction = fireKeyDown(
+ container.querySelector( '.wrapper' ),
+ keyCode,
+ shiftKey
+ );
expect( currentIndex ).toBe( expectedActiveIndex );
expect( interaction.stopped ).toBe( expectedStop );
}
@@ -104,7 +104,7 @@ describe( 'TabbableContainer', () => {
it( 'should navigate by keypresses and stop at edges', () => {
let currentIndex = 0;
- const wrapper = mount(
+ const { container } = render(
/*
Disabled because of our rule restricting literal IDs, preferring
`withInstanceId`. In this case, it's fine to use literal IDs.
@@ -128,13 +128,9 @@ describe( 'TabbableContainer', () => {
/* eslint-enable no-restricted-syntax */
);
- simulateVisible( wrapper, '*' );
+ simulateVisible( container, '*' );
- const container = wrapper.find( 'div.wrapper' );
- wrapper
- .getDOMNode()
- .querySelector( '#section1' )
- .focus();
+ container.querySelector( '#section1' ).focus();
// Navigate options
function assertKeyDown(
@@ -143,7 +139,11 @@ describe( 'TabbableContainer', () => {
expectedActiveIndex,
expectedStop
) {
- const interaction = fireKeyDown( container, keyCode, shiftKey );
+ const interaction = fireKeyDown(
+ container.querySelector( '.wrapper' ),
+ keyCode,
+ shiftKey
+ );
expect( currentIndex ).toBe( expectedActiveIndex );
expect( interaction.stopped ).toBe( expectedStop );
}
diff --git a/packages/components/src/notice/stories/index.js b/packages/components/src/notice/stories/index.js
new file mode 100644
index 00000000000000..598bc420fbf950
--- /dev/null
+++ b/packages/components/src/notice/stories/index.js
@@ -0,0 +1,71 @@
+/**
+ * External dependencies
+ */
+import { boolean, select, text } from '@storybook/addon-knobs';
+
+/**
+ * Internal dependencies
+ */
+import Notice from '../';
+
+export default {
+ title: 'Components/Notice',
+ component: Notice,
+};
+
+export const _default = () => {
+ const status = select(
+ 'Status',
+ {
+ Warning: 'warning',
+ Success: 'success',
+ Error: 'error',
+ Info: 'info',
+ },
+ 'info'
+ );
+ const isDismissible = boolean( 'Is Dismissible', true );
+
+ return (
+
+ This is a notice.
+
+ );
+};
+
+export const withCustomSpokenMessage = () => {
+ const status = select(
+ 'Status',
+ {
+ Warning: 'warning',
+ Success: 'success',
+ Error: 'error',
+ Info: 'info',
+ },
+ 'info'
+ );
+ const isDismissible = boolean( 'Is Dismissible', true );
+ const politeness = select(
+ 'Politeness',
+ {
+ Assertive: 'assertive',
+ Polite: 'polite',
+ },
+ 'assertive'
+ );
+ const spokenMessage = text(
+ 'Spoken Message',
+ 'This is a notice with a custom spoken message'
+ );
+
+ return (
+
+ This is a notice.
+
+ );
+};
diff --git a/packages/components/src/notice/style.scss b/packages/components/src/notice/style.scss
index d69edcc61d8000..3ffb738ebbe07b 100644
--- a/packages/components/src/notice/style.scss
+++ b/packages/components/src/notice/style.scss
@@ -79,12 +79,5 @@
display: block;
margin-left: 0;
margin-top: $grid-unit-10;
-
- // Beyond mobile, align the action button on the right to use the space, and reduce margins so they don't add too much extra line-height.
- @include break-medium() {
- float: right;
- margin-top: -$grid-unit-05;
- margin-bottom: -$grid-unit-05;
- }
}
}
diff --git a/packages/components/src/number-control/README.md b/packages/components/src/number-control/README.md
new file mode 100644
index 00000000000000..218ae241a63888
--- /dev/null
+++ b/packages/components/src/number-control/README.md
@@ -0,0 +1,29 @@
+# NumberControl
+
+NumberControl is an enhanced HTML [`input[type="number]`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/number) element.
+
+## Usage
+
+```jsx
+import { __experimentalNumberControl as NumberControl } from '@wordpress/components';
+
+const Example = () => {
+ const [value, setValue] = useState(10);
+
+ return (
+
+ )
+};
+```
+
+## Props
+
+Name | Type | Default | Description
+--- | --- | --- | ---
+`isShiftStepEnabled` | `boolean` | `true` | Determines if the unit `` is tabbable.
+`shiftStep` | `number` | `10` | Amount to increment by when the `shift` key is held down.
\ No newline at end of file
diff --git a/packages/components/src/number-control/index.js b/packages/components/src/number-control/index.js
new file mode 100644
index 00000000000000..33914140975b06
--- /dev/null
+++ b/packages/components/src/number-control/index.js
@@ -0,0 +1,79 @@
+/**
+ * External dependencies
+ */
+import { clamp, noop } from 'lodash';
+import classNames from 'classnames';
+
+/**
+ * WordPress dependencies
+ */
+import { UP, DOWN } from '@wordpress/keycodes';
+
+export default function NumberControl( {
+ className,
+ isShiftStepEnabled = true,
+ max = Infinity,
+ min = -Infinity,
+ onChange = noop,
+ onKeyDown = noop,
+ shiftStep = 10,
+ step = 1,
+ ...props
+} ) {
+ const baseValue = clamp( 0, min, max );
+
+ const handleOnKeyDown = ( event ) => {
+ onKeyDown( event );
+ const { value } = event.target;
+
+ const isEmpty = value === '';
+ const enableShift = event.shiftKey && isShiftStepEnabled;
+
+ const incrementalValue = enableShift
+ ? parseFloat( shiftStep )
+ : parseFloat( step );
+ let nextValue = isEmpty ? baseValue : value;
+
+ // Convert to a number to use math
+ nextValue = parseFloat( nextValue );
+
+ switch ( event.keyCode ) {
+ case UP:
+ event.preventDefault();
+
+ nextValue = nextValue + incrementalValue;
+ nextValue = clamp( nextValue, min, max );
+
+ onChange( nextValue.toString(), { event } );
+
+ break;
+
+ case DOWN:
+ event.preventDefault();
+
+ nextValue = nextValue - incrementalValue;
+ nextValue = clamp( nextValue, min, max );
+
+ onChange( nextValue.toString(), { event } );
+
+ break;
+ }
+ };
+
+ const handleOnChange = ( event ) => {
+ onChange( event.target.value, { event } );
+ };
+
+ const classes = classNames( 'component-number-control', className );
+
+ return (
+
+ );
+}
diff --git a/packages/components/src/number-control/stories/index.js b/packages/components/src/number-control/stories/index.js
new file mode 100644
index 00000000000000..b35af6a74eb11f
--- /dev/null
+++ b/packages/components/src/number-control/stories/index.js
@@ -0,0 +1,35 @@
+/**
+ * External dependencies
+ */
+import { boolean, number } from '@storybook/addon-knobs';
+
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import NumberControl from '../';
+
+export default {
+ title: 'Components/NumberControl',
+ component: NumberControl,
+};
+
+function Example() {
+ const [ value, setValue ] = useState( '' );
+
+ const props = {
+ isShiftStepEnabled: boolean( 'isShiftStepEnabled', true ),
+ shiftStep: number( 'shiftStep', 10 ),
+ step: number( 'step', 1 ),
+ };
+
+ return ;
+}
+
+export const _default = () => {
+ return ;
+};
diff --git a/packages/components/src/number-control/test/index.js b/packages/components/src/number-control/test/index.js
new file mode 100644
index 00000000000000..c946ba12aeb048
--- /dev/null
+++ b/packages/components/src/number-control/test/index.js
@@ -0,0 +1,303 @@
+/**
+ * External dependencies
+ */
+import { render, unmountComponentAtNode } from 'react-dom';
+import { act, Simulate } from 'react-dom/test-utils';
+
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+import { UP, DOWN } from '@wordpress/keycodes';
+
+/**
+ * Internal dependencies
+ */
+import NumberControl from '../';
+
+let container = null;
+
+function getInput() {
+ return container.querySelector( 'input' );
+}
+
+beforeEach( () => {
+ container = document.createElement( 'div' );
+ document.body.appendChild( container );
+} );
+
+afterEach( () => {
+ unmountComponentAtNode( container );
+ container.remove();
+ container = null;
+} );
+
+function StatefulNumberControl( props ) {
+ const [ value, setValue ] = useState( props.value );
+ const handleOnChange = ( v ) => setValue( v );
+
+ return (
+
+ );
+}
+
+describe( 'NumberControl', () => {
+ describe( 'Basic rendering', () => {
+ it( 'should render', () => {
+ act( () => {
+ render( , container );
+ } );
+
+ const input = getInput();
+
+ expect( input ).not.toBeNull();
+ } );
+
+ it( 'should render custom className', () => {
+ act( () => {
+ render( , container );
+ } );
+
+ const input = getInput();
+
+ expect( input.classList.contains( 'hello' ) ).toBe( true );
+ } );
+ } );
+
+ describe( 'onChange handling', () => {
+ it( 'should provide onChange callback with string value', () => {
+ const spy = jest.fn();
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const input = getInput();
+
+ input.value = 10;
+ Simulate.change( input );
+
+ expect( spy.mock.calls[ 0 ][ 0 ] ).toBe( '10' );
+ } );
+ } );
+
+ describe( 'Key UP interactions', () => {
+ it( 'should fire onKeyDown callback', () => {
+ const spy = jest.fn();
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const input = getInput();
+
+ Simulate.keyDown( input, { keyCode: UP } );
+
+ expect( spy ).toHaveBeenCalled();
+ } );
+
+ it( 'should increment by step on key UP press', () => {
+ act( () => {
+ render( , container );
+ } );
+
+ const input = getInput();
+
+ Simulate.keyDown( input, { keyCode: UP } );
+
+ expect( input.value ).toBe( '6' );
+ } );
+
+ it( 'should increment from a negative value', () => {
+ act( () => {
+ render( , container );
+ } );
+
+ const input = getInput();
+
+ Simulate.keyDown( input, { keyCode: UP } );
+
+ expect( input.value ).toBe( '-4' );
+ } );
+
+ it( 'should increment by shiftStep on key UP + shift press', () => {
+ act( () => {
+ render( , container );
+ } );
+
+ const input = getInput();
+
+ Simulate.keyDown( input, { keyCode: UP, shiftKey: true } );
+
+ expect( input.value ).toBe( '15' );
+ } );
+
+ it( 'should increment by custom shiftStep on key UP + shift press', () => {
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const input = getInput();
+
+ Simulate.keyDown( input, { keyCode: UP, shiftKey: true } );
+
+ expect( input.value ).toBe( '105' );
+ } );
+
+ it( 'should increment but be limited by max on shiftStep', () => {
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const input = getInput();
+
+ Simulate.keyDown( input, { keyCode: UP, shiftKey: true } );
+
+ expect( input.value ).toBe( '99' );
+ } );
+
+ it( 'should not increment by shiftStep if disabled', () => {
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const input = getInput();
+
+ Simulate.keyDown( input, { keyCode: UP, shiftKey: true } );
+
+ expect( input.value ).toBe( '6' );
+ } );
+ } );
+
+ describe( 'Key DOWN interactions', () => {
+ it( 'should fire onKeyDown callback', () => {
+ const spy = jest.fn();
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const input = getInput();
+
+ Simulate.keyDown( input, { keyCode: DOWN } );
+
+ expect( spy ).toHaveBeenCalled();
+ } );
+
+ it( 'should decrement by step on key DOWN press', () => {
+ act( () => {
+ render( , container );
+ } );
+
+ const input = getInput();
+
+ Simulate.keyDown( input, { keyCode: DOWN } );
+
+ expect( input.value ).toBe( '4' );
+ } );
+
+ it( 'should decrement from a negative value', () => {
+ act( () => {
+ render( , container );
+ } );
+
+ const input = getInput();
+
+ Simulate.keyDown( input, { keyCode: DOWN } );
+
+ expect( input.value ).toBe( '-6' );
+ } );
+
+ it( 'should decrement by shiftStep on key DOWN + shift press', () => {
+ act( () => {
+ render( , container );
+ } );
+
+ const input = getInput();
+
+ Simulate.keyDown( input, { keyCode: DOWN, shiftKey: true } );
+
+ expect( input.value ).toBe( '-5' );
+ } );
+
+ it( 'should decrement by custom shiftStep on key DOWN + shift press', () => {
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const input = getInput();
+
+ Simulate.keyDown( input, { keyCode: DOWN, shiftKey: true } );
+
+ expect( input.value ).toBe( '-95' );
+ } );
+
+ it( 'should decrement but be limited by min on shiftStep', () => {
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const input = getInput();
+
+ Simulate.keyDown( input, { keyCode: DOWN, shiftKey: true } );
+
+ expect( input.value ).toBe( '4' );
+ } );
+
+ it( 'should not decrement by shiftStep if disabled', () => {
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const input = getInput();
+
+ Simulate.keyDown( input, { keyCode: DOWN, shiftKey: true } );
+
+ expect( input.value ).toBe( '4' );
+ } );
+ } );
+} );
diff --git a/packages/components/src/panel/body.native.js b/packages/components/src/panel/body.native.js
index 87c5eeb60bac7f..36126ea76a9f5b 100644
--- a/packages/components/src/panel/body.native.js
+++ b/packages/components/src/panel/body.native.js
@@ -19,10 +19,10 @@ export class PanelBody extends Component {
}
render() {
- const { children, title } = this.props;
+ const { children, title, style = {} } = this.props;
return (
-
+
{ title && (
{ title }
) }
diff --git a/packages/components/src/panel/style.scss b/packages/components/src/panel/style.scss
index 944186713453d9..fa53a3ceb130f4 100644
--- a/packages/components/src/panel/style.scss
+++ b/packages/components/src/panel/style.scss
@@ -70,8 +70,8 @@
// Hover States
.components-panel__body > .components-panel__body-title:hover {
// Override the default button hover style
- background: $light-gray-200 !important;
- border: none !important;
+ background: $light-gray-200;
+ border: none;
}
.components-panel__body-toggle.components-button {
@@ -82,20 +82,15 @@
font-weight: 600;
text-align: left;
color: $dark-gray-900;
- @include menu-style__neutral;
+ border: none;
+ box-shadow: none;
transition: 0.1s background ease-in-out;
@include reduce-motion("transition");
height: auto;
- &:focus:not(:disabled):not([aria-disabled="true"]) {
- @include menu-style__focus;
- }
-
- &:hover {
- // Override the default button hover style
- background: transparent !important;
- border: none !important;
- box-shadow: none !important;
+ &:focus {
+ box-shadow: inset 0 0 0 $border-width-focus $theme-color;
+ border-radius: 0;
}
.components-panel__arrow {
diff --git a/packages/components/src/placeholder/index.js b/packages/components/src/placeholder/index.js
index 251690a0a8bb7c..d37b3566f24300 100644
--- a/packages/components/src/placeholder/index.js
+++ b/packages/components/src/placeholder/index.js
@@ -2,7 +2,11 @@
* External dependencies
*/
import classnames from 'classnames';
-import useResizeAware from 'react-resize-aware';
+
+/**
+ * WordPress dependencies
+ */
+import { useResizeObserver } from '@wordpress/compose';
/**
* Internal dependencies
@@ -26,9 +30,9 @@ function Placeholder( {
isColumnLayout,
...additionalProps
} ) {
- const [ resizeListener, { width } ] = useResizeAware();
+ const [ resizeListener, { width } ] = useResizeObserver();
- // Since `useResizeAware` will report a width of `null` until after the
+ // Since `useResizeObserver` will report a width of `null` until after the
// first render, avoid applying any modifier classes until width is known.
let modifierClassNames;
if ( typeof width === 'number' ) {
diff --git a/packages/components/src/placeholder/style.scss b/packages/components/src/placeholder/style.scss
index 04efa290269387..2feaa22804b09b 100644
--- a/packages/components/src/placeholder/style.scss
+++ b/packages/components/src/placeholder/style.scss
@@ -22,7 +22,7 @@
// Block UI appearance.
border-radius: $radius-block-ui;
background-color: $white;
- box-shadow: 0 0 0 $border-width $dark-gray-primary;
+ box-shadow: inset 0 0 0 $border-width $dark-gray-primary;
outline: 1px solid transparent; // Shown for Windows 10 High Contrast mode.
.components-base-control__label {
diff --git a/packages/components/src/placeholder/test/index.js b/packages/components/src/placeholder/test/index.js
index cf14e596469c9c..a0c50d8a1bf96f 100644
--- a/packages/components/src/placeholder/test/index.js
+++ b/packages/components/src/placeholder/test/index.js
@@ -2,23 +2,24 @@
* External dependencies
*/
import { shallow } from 'enzyme';
-import useResizeAware from 'react-resize-aware';
/**
* WordPress dependencies
*/
import { more } from '@wordpress/icons';
+import { useResizeObserver } from '@wordpress/compose';
/**
* Internal dependencies
*/
import Placeholder from '../';
-jest.mock( 'react-resize-aware' );
-
describe( 'Placeholder', () => {
beforeEach( () => {
- useResizeAware.mockReturnValue( [
, { width: 320 } ] );
+ useResizeObserver.mockReturnValue( [
+
,
+ { width: 320 },
+ ] );
} );
describe( 'basic rendering', () => {
@@ -109,8 +110,8 @@ describe( 'Placeholder', () => {
} );
describe( 'resize aware', () => {
- it( 'should not assign modifier class in first-pass `null` width from `useResizeAware`', () => {
- useResizeAware.mockReturnValue( [
+ it( 'should not assign modifier class in first-pass `null` width from `useResizeObserver`', () => {
+ useResizeObserver.mockReturnValue( [
,
{ width: 320 },
] );
@@ -123,7 +124,7 @@ describe( 'Placeholder', () => {
} );
it( 'should assign modifier class', () => {
- useResizeAware.mockReturnValue( [
+ useResizeObserver.mockReturnValue( [
,
{ width: null },
] );
diff --git a/packages/components/src/popover/README.md b/packages/components/src/popover/README.md
index be0eca3d773580..6dc54e4e1f53cb 100644
--- a/packages/components/src/popover/README.md
+++ b/packages/components/src/popover/README.md
@@ -127,11 +127,22 @@ Opt-in prop to show popovers fullscreen on mobile, pass `false` in this prop to
### anchorRect
-A custom `DOMRect` object at which to position the popover.
+A custom `DOMRect` object at which to position the popover. `anchorRect` is used when the position (custom `DOMRect` object) of the popover needs to be fixed at one location all the time.
- Type: `DOMRect`
- Required: No
+### getAnchorRect
+
+A callback function which is used to override the anchor value computation algorithm. `anchorRect` will take precedence over this prop, if both are passed together.
+
+If you need the `DOMRect` object i.e., the position of popover to be calculated on every time, the popover re-renders, then use `getAnchorRect`.
+
+`getAnchorRect` callback function receives a reference to the popover anchor element as a function parameter and it should return a `DOMRect` objcet.
+
+- Type: `Function`
+- Required: No
+
## Methods
### refresh
diff --git a/packages/components/src/popover/index.js b/packages/components/src/popover/index.js
index 2e06f907de8a75..13aa4b34dfe669 100644
--- a/packages/components/src/popover/index.js
+++ b/packages/components/src/popover/index.js
@@ -233,10 +233,11 @@ const Popover = ( {
children,
className,
noArrow = true,
+ isAlternate,
// Disable reason: We generate the `...contentProps` rest as remainder
// of props which aren't explicitly handled by this component.
/* eslint-disable no-unused-vars */
- position = 'top',
+ position = 'bottom right',
range,
focusOnMount = 'firstElement',
anchorRef,
@@ -270,6 +271,7 @@ const Popover = ( {
useEffect( () => {
if ( isExpanded ) {
setClass( containerRef.current, 'is-without-arrow', noArrow );
+ setClass( containerRef.current, 'is-alternate', isAlternate );
setAttribute( containerRef.current, 'data-x-axis' );
setAttribute( containerRef.current, 'data-y-axis' );
setStyle( containerRef.current, 'top' );
@@ -392,6 +394,7 @@ const Popover = ( {
'is-without-arrow',
noArrow || ( xAxis === 'center' && yAxis === 'middle' )
);
+ setClass( containerRef.current, 'is-alternate', isAlternate );
setAttribute( containerRef.current, 'data-x-axis', xAxis );
setAttribute( containerRef.current, 'data-y-axis', yAxis );
setStyle(
@@ -575,6 +578,7 @@ const Popover = ( {
{
'is-expanded': isExpanded,
'is-without-arrow': noArrow,
+ 'is-alternate': isAlternate,
}
) }
{ ...contentProps }
diff --git a/packages/components/src/popover/style.scss b/packages/components/src/popover/style.scss
index 7ece47bcdb9d79..74a57d17197d29 100644
--- a/packages/components/src/popover/style.scss
+++ b/packages/components/src/popover/style.scss
@@ -140,6 +140,23 @@ $arrow-size: 8px;
align-items: center;
display: flex;
}
+
+ // Add spacing.
+ &.is-from-top {
+ margin-top: $grid-unit-15;
+ }
+
+ &.is-from-bottom {
+ margin-top: -$grid-unit-15;
+ }
+
+ &.is-from-left:not(.is-from-top):not(.is-from-bottom) {
+ margin-left: $grid-unit-15;
+ }
+
+ &.is-from-right:not(.is-from-top):not(.is-from-bottom) {
+ margin-right: $grid-unit-15;
+ }
}
.components-popover__content {
@@ -149,6 +166,12 @@ $arrow-size: 8px;
box-shadow: $shadow-popover;
border-radius: $radius-block-ui;
+ // Alternate treatment for popovers that put them at elevation zero with high contrast.
+ .is-alternate & {
+ border: $border-width solid $dark-gray-primary;
+ box-shadow: none;
+ }
+
.components-popover & {
position: absolute;
height: auto;
diff --git a/packages/components/src/popover/test/index.js b/packages/components/src/popover/test/index.js
index 8db3d9292cee3d..d46c54cd03a94f 100644
--- a/packages/components/src/popover/test/index.js
+++ b/packages/components/src/popover/test/index.js
@@ -1,26 +1,13 @@
/**
* External dependencies
*/
-import TestUtils from 'react-dom/test-utils';
-
-/**
- * WordPress dependencies
- */
-import { Component } from '@wordpress/element';
+import { act, render } from '@testing-library/react';
/**
* Internal dependencies
*/
import Popover from '../';
-jest.useFakeTimers();
-
-class PopoverWrapper extends Component {
- render() {
- return ;
- }
-}
-
describe( 'Popover', () => {
afterEach( () => {
if ( document.activeElement ) {
@@ -34,61 +21,50 @@ describe( 'Popover', () => {
document.dispatchEvent( new window.KeyboardEvent( 'keydown' ) );
document.dispatchEvent( new window.KeyboardEvent( 'keyup' ) );
+ expect( document.activeElement ).toBe( document.body );
+
// An ideal test here would mount with an input child and focus the
// child, but in context of JSDOM the inputs are not visible and
// are therefore skipped as tabbable, defaulting to popover.
- let wrapper;
- TestUtils.act( () => {
- wrapper = TestUtils.renderIntoDocument( );
+ let result;
+ act( () => {
+ result = render( );
jest.advanceTimersByTime( 1 );
-
- const content = TestUtils.findRenderedDOMComponentWithClass(
- wrapper,
- 'components-popover__content'
- );
- expect( document.activeElement ).toBe( content );
} );
+
+ expect( document.activeElement ).toBe(
+ result.container.querySelector( '.components-popover__content' )
+ );
} );
it( 'should allow focus-on-open behavior to be disabled', () => {
- const activeElement = document.activeElement;
- TestUtils.act( () => {
- TestUtils.renderIntoDocument( );
+ expect( document.activeElement ).toBe( document.body );
- jest.advanceTimersByTime( 1 );
+ act( () => {
+ render( );
- expect( document.activeElement ).toBe( activeElement );
+ jest.advanceTimersByTime( 1 );
} );
+
+ expect( document.activeElement ).toBe( document.body );
} );
it( 'should render content', () => {
- let wrapper;
- TestUtils.act( () => {
- wrapper = TestUtils.renderIntoDocument(
- Hello
- );
+ let result;
+ act( () => {
+ result = render( Hello );
} );
- const content = TestUtils.findRenderedDOMComponentWithTag(
- wrapper,
- 'span'
- );
- expect( content ).toMatchSnapshot();
+ expect( result.container.querySelector( 'span' ) ).toMatchSnapshot();
} );
it( 'should pass additional props to portaled element', () => {
- let wrapper;
- TestUtils.act( () => {
- wrapper = TestUtils.renderIntoDocument(
- Hello
- );
+ let result;
+ act( () => {
+ result = render( Hello );
} );
- const content = TestUtils.findRenderedDOMComponentWithTag(
- wrapper,
- 'span'
- );
- expect( content ).toMatchSnapshot();
+ expect( result.container.querySelector( 'span' ) ).toMatchSnapshot();
} );
} );
diff --git a/packages/components/src/query-controls/category-select.js b/packages/components/src/query-controls/category-select.js
index b6e11839de990a..e0b2291b6e9f00 100644
--- a/packages/components/src/query-controls/category-select.js
+++ b/packages/components/src/query-controls/category-select.js
@@ -10,6 +10,7 @@ export default function CategorySelect( {
categoriesList,
selectedCategoryId,
onChange,
+ ...props
} ) {
const termsTree = buildTermsTree( categoriesList );
return (
@@ -17,6 +18,7 @@ export default function CategorySelect( {
{ ...{ label, noOptionLabel, onChange } }
tree={ termsTree }
selectedId={ selectedCategoryId }
+ { ...props }
/>
);
}
diff --git a/packages/components/src/query-controls/index.js b/packages/components/src/query-controls/index.js
index e0b54e3e8a0272..a1a1a2bc4a4cf9 100644
--- a/packages/components/src/query-controls/index.js
+++ b/packages/components/src/query-controls/index.js
@@ -6,15 +6,15 @@ import { __ } from '@wordpress/i18n';
/**
* Internal dependencies
*/
-import { RangeControl, SelectControl } from '../';
-import CategorySelect from './category-select';
+import { RangeControl, SelectControl, FormTokenField } from '../';
const DEFAULT_MIN_ITEMS = 1;
const DEFAULT_MAX_ITEMS = 100;
+const MAX_CATEGORIES_SUGGESTIONS = 20;
export default function QueryControls( {
- categoriesList,
- selectedCategoryId,
+ categorySuggestions,
+ selectedCategories,
numberOfItems,
order,
orderBy,
@@ -63,15 +63,21 @@ export default function QueryControls( {
/>
),
onCategoryChange && (
- ( {
+ id: item.id,
+ value: item.name || item.value,
+ } ) )
+ }
+ suggestions={ Object.keys( categorySuggestions ) }
onChange={ onCategoryChange }
+ maxSuggestions={ MAX_CATEGORIES_SUGGESTIONS }
/>
),
+
onNumberOfItemsChange && (
{
+ const [ newOrderBy, newOrder ] = value.split( '/' );
+ if ( newOrder !== order ) {
+ onOrderChange( newOrder );
+ }
+ if ( newOrderBy !== orderBy ) {
+ onOrderByChange( newOrderBy );
+ }
+ } }
+ { ...{ separatorType: 'fullWidth' } }
+ />
+ ),
+ onCategoryChange && (
+
+ ),
+ onNumberOfItemsChange && (
+
+ ),
+ ];
+}
diff --git a/packages/components/src/radio-context/index.js b/packages/components/src/radio-context/index.js
new file mode 100644
index 00000000000000..58a7783dcb84e0
--- /dev/null
+++ b/packages/components/src/radio-context/index.js
@@ -0,0 +1,11 @@
+/**
+ * WordPress dependencies
+ */
+import { createContext } from '@wordpress/element';
+
+const RadioContext = createContext( {
+ state: null,
+ setState: () => {},
+} );
+
+export default RadioContext;
diff --git a/packages/components/src/radio-control/README.md b/packages/components/src/radio-control/README.md
index 2a55a81718fb15..f08f7da87b4953 100644
--- a/packages/components/src/radio-control/README.md
+++ b/packages/components/src/radio-control/README.md
@@ -121,3 +121,4 @@ A function that receives the value of the new option that is being selected as i
* To select one or more items from a set, use the `CheckboxControl` component.
* To toggle a single setting on or off, use the `ToggleControl` component.
+* To format as a button group, use the `RadioGroup` component.
diff --git a/packages/components/src/radio-group/README.md b/packages/components/src/radio-group/README.md
new file mode 100644
index 00000000000000..7c6eab29b0bf1e
--- /dev/null
+++ b/packages/components/src/radio-group/README.md
@@ -0,0 +1,87 @@
+# RadioGroup
+
+Use a RadioGroup component when you want users to select one option from a small set of options.
+
+
+
+## Table of contents
+
+1. [Design guidelines](#design-guidelines)
+2. [Development guidelines](#development-guidelines)
+3. [Related components](#related-components)
+
+## Design guidelines
+
+### Usage
+
+#### Selected action
+
+Only one option in a radio group can be selected and active at a time. Selecting one option deselects any other.
+
+### Best practices
+
+Radio groups should:
+
+- **Be clearly and accurately labeled.**
+- **Clearly communicate that clicking or tapping will trigger an action.**
+- **Use established colors appropriately.** For example, only use red buttons for actions that are difficult or impossible to undo.
+- **Have consistent locations in the interface.**
+- **Have a default option already selected.**
+
+### States
+
+#### Active and available radio groups
+
+A radio group’s state makes it clear which option is active. Hover and focus states express the available selection options for buttons in a button group.
+
+#### Disabled radio groups
+
+Radio groups that cannot be selected can either be given a disabled state, or be hidden.
+
+## Development guidelines
+
+### Usage
+
+#### Controlled
+
+```jsx
+import { Radio, RadioGroup } from '@wordpress/components';
+import { useState } from '@wordpress/element';
+
+const MyControlledRadioRadioGroup = () => {
+ const [ checked, setChecked ] = useState( '25' );
+ return (
+
+ 25%
+ 50%
+ 75%
+ 100%
+
+ );
+};
+```
+
+#### Uncontrolled
+
+When using the RadioGroup component as an uncontrolled component, the default value can be set with the `defaultChecked` prop.
+
+```jsx
+import { Radio, RadioGroup } from '@wordpress/components';
+import { useState } from '@wordpress/element';
+
+const MyUncontrolledRadioRadioGroup = () => {
+ return (
+
+ 25%
+ 50%
+ 75%
+ 100%
+
+ );
+};
+```
+
+## Related components
+
+- For simple buttons that are related, use a `ButtonGroup` component.
+- For traditional radio options, use a `RadioControl` component.
diff --git a/packages/components/src/radio-group/index.js b/packages/components/src/radio-group/index.js
new file mode 100644
index 00000000000000..11f24605297923
--- /dev/null
+++ b/packages/components/src/radio-group/index.js
@@ -0,0 +1,53 @@
+/**
+ * External dependencies
+ */
+import { useRadioState, RadioGroup as ReakitRadioGroup } from 'reakit/Radio';
+
+/**
+ * WordPress dependencies
+ */
+import { forwardRef } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import ButtonGroup from '../button-group';
+import RadioContext from '../radio-context';
+
+function RadioGroup(
+ {
+ accessibilityLabel,
+ checked,
+ defaultChecked,
+ disabled,
+ onChange,
+ ...props
+ },
+ ref
+) {
+ const radioState = useRadioState( {
+ state: defaultChecked,
+ baseId: props.id,
+ } );
+ const radioContext = {
+ ...radioState,
+ disabled,
+ // controlled or uncontrolled
+ state: checked || radioState.state,
+ setState: onChange || radioState.setState,
+ };
+
+ return (
+
+
+
+ );
+}
+
+export default forwardRef( RadioGroup );
diff --git a/packages/components/src/radio-group/stories/index.js b/packages/components/src/radio-group/stories/index.js
new file mode 100644
index 00000000000000..5844cd82016b57
--- /dev/null
+++ b/packages/components/src/radio-group/stories/index.js
@@ -0,0 +1,71 @@
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import Radio from '../../radio';
+import RadioGroup from '../';
+
+export default { title: 'Components/RadioGroup', component: RadioGroup };
+
+export const _default = () => {
+ /* eslint-disable no-restricted-syntax */
+ return (
+
+ Option 1
+ Option 2
+ Option 3
+
+ );
+ /* eslint-enable no-restricted-syntax */
+};
+
+export const disabled = () => {
+ /* eslint-disable no-restricted-syntax */
+ return (
+
+ Option 1
+ Option 2
+ Option 3
+
+ );
+ /* eslint-enable no-restricted-syntax */
+};
+
+const ControlledRadioGroupWithState = () => {
+ const [ checked, setChecked ] = useState( 'option2' );
+
+ /* eslint-disable no-restricted-syntax */
+ return (
+
+ Option 1
+ Option 2
+ Option 3
+
+ );
+ /* eslint-enable no-restricted-syntax */
+};
+
+export const controlled = () => {
+ return ;
+};
diff --git a/packages/components/src/radio/index.js b/packages/components/src/radio/index.js
new file mode 100644
index 00000000000000..6d7305002e3fce
--- /dev/null
+++ b/packages/components/src/radio/index.js
@@ -0,0 +1,36 @@
+/**
+ * External dependencies
+ */
+import { Radio as ReakitRadio } from 'reakit/Radio';
+
+/**
+ * WordPress dependencies
+ */
+import { useContext, forwardRef } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import Button from '../button';
+import RadioContext from '../radio-context';
+
+function Radio( { children, value, ...props }, ref ) {
+ const radioContext = useContext( RadioContext );
+ const checked = radioContext.state === value;
+
+ return (
+
+ { children || value }
+
+ );
+}
+
+export default forwardRef( Radio );
diff --git a/packages/components/src/radio/stories/index.js b/packages/components/src/radio/stories/index.js
new file mode 100644
index 00000000000000..b64c35ed7ba17f
--- /dev/null
+++ b/packages/components/src/radio/stories/index.js
@@ -0,0 +1,20 @@
+/**
+ * Internal dependencies
+ */
+import RadioGroup from '../../radio-group';
+import Radio from '../';
+
+export default { title: 'Components/Radio', component: Radio };
+
+export const _default = () => {
+ // Radio components must be a descendent of a RadioGroup component.
+ /* eslint-disable no-restricted-syntax */
+ return (
+ // id is required for server side rendering
+
+ Option 1
+ Option 2
+
+ );
+ /* eslint-enable no-restricted-syntax */
+};
diff --git a/packages/components/src/range-control/README.md b/packages/components/src/range-control/README.md
index ea1bd196d53eb0..a014b31d6ede9e 100644
--- a/packages/components/src/range-control/README.md
+++ b/packages/components/src/range-control/README.md
@@ -294,6 +294,14 @@ Define if separator line under/above control row should be disabled or full widt
- Required: No
- Platform: Mobile
+#### type
+
+Define if the value selection should present a stepper control or a slider control in the bottom sheet on mobile. To use the stepper set the type value as `stepper`. Defaults to slider if no option is provided.
+
+- Type: `String`
+- Required: No
+- Platform: Mobile
+
## Related components
- To collect a numerical input in a text field, use the `TextControl` component.
diff --git a/packages/components/src/range-control/index.js b/packages/components/src/range-control/index.js
index 365eb921e85efa..d718dec1a229a0 100644
--- a/packages/components/src/range-control/index.js
+++ b/packages/components/src/range-control/index.js
@@ -2,7 +2,7 @@
* External dependencies
*/
import classnames from 'classnames';
-import { clamp, noop } from 'lodash';
+import { clamp, isFinite, noop } from 'lodash';
/**
* WordPress dependencies
@@ -18,7 +18,11 @@ import BaseControl from '../base-control';
import Button from '../button';
import Icon from '../icon';
import { color } from '../utils/colors';
-import { useControlledRangeValue, useDebouncedHoverInteraction } from './utils';
+import {
+ floatClamp,
+ useControlledRangeValue,
+ useDebouncedHoverInteraction,
+} from './utils';
import RangeRail from './rail';
import SimpleTooltip from './tooltip';
import {
@@ -42,6 +46,7 @@ const BaseRangeControl = forwardRef(
allowReset = false,
beforeIcon,
className,
+ currentInput,
color: colorProp = color( 'blue.wordpress.700' ),
disabled = false,
help,
@@ -54,12 +59,12 @@ const BaseRangeControl = forwardRef(
onBlur = noop,
onChange = noop,
onFocus = noop,
- onMouseEnter = noop,
+ onMouseMove = noop,
onMouseLeave = noop,
renderTooltipContent = ( v ) => v,
showTooltip: showTooltipProp,
step = 1,
- value: valueProp = 0,
+ value: valueProp,
withInputField = true,
...props
},
@@ -67,7 +72,9 @@ const BaseRangeControl = forwardRef(
) => {
const isRTL = useRtl();
- const sliderValue = initialPosition || valueProp;
+ const sliderValue =
+ valueProp !== undefined ? valueProp : initialPosition;
+
const [ value, setValue ] = useControlledRangeValue( {
min,
max,
@@ -75,7 +82,6 @@ const BaseRangeControl = forwardRef(
} );
const [ showTooltip, setShowTooltip ] = useState( showTooltipProp );
const [ isFocused, setIsFocused ] = useState( false );
- const originalValueRef = useRef( value );
const inputRef = useRef();
@@ -90,7 +96,17 @@ const BaseRangeControl = forwardRef(
const isCurrentlyFocused = inputRef.current?.matches( ':focus' );
const isThumbFocused = ! disabled && isFocused;
- const fillValue = ( ( value - min ) / ( max - min ) ) * 100;
+ const isValueReset = value === null;
+ const currentValue = value !== undefined ? value : currentInput;
+
+ const inputSliderValue = isValueReset ? '' : currentValue;
+
+ const rangeFillValue = isValueReset
+ ? floatClamp( max / 2, min, max )
+ : value;
+
+ const calculatedFillValue = ( ( value - min ) / ( max - min ) ) * 100;
+ const fillValue = isValueReset ? 50 : calculatedFillValue;
const fillValueOffset = `${ clamp( fillValue, 0, 100 ) }%`;
const classes = classnames( 'components-range-control', className );
@@ -103,24 +119,30 @@ const BaseRangeControl = forwardRef(
const id = `inspector-range-control-${ instanceId }`;
const describedBy = !! help ? `${ id }__help` : undefined;
- const enableTooltip = showTooltipProp !== false;
+ const enableTooltip = showTooltipProp !== false && isFinite( value );
const handleOnChange = ( event ) => {
- if ( ! event.target.checkValidity() ) {
+ if (
+ event.target.checkValidity &&
+ ! event.target.checkValidity()
+ ) {
return;
}
const nextValue = parseFloat( event.target.value );
+ if ( isNaN( nextValue ) ) {
+ handleOnReset();
+ return;
+ }
+
setValue( nextValue );
onChange( nextValue );
};
const handleOnReset = () => {
- const nextValue = originalValueRef.current;
-
- setValue( nextValue );
- onChange( nextValue );
+ setValue( null );
+ onChange( undefined );
};
const handleShowTooltip = () => setShowTooltip( true );
@@ -141,7 +163,7 @@ const BaseRangeControl = forwardRef(
const hoverInteractions = useDebouncedHoverInteraction( {
onShow: handleShowTooltip,
onHide: handleHideTooltip,
- onMouseEnter,
+ onMouseMove,
onMouseLeave,
} );
@@ -188,19 +210,21 @@ const BaseRangeControl = forwardRef(
step={ step }
tabIndex={ 0 }
type="range"
- value={ value }
+ value={ inputSliderValue }
/>
@@ -211,7 +235,6 @@ const BaseRangeControl = forwardRef(
{ enableTooltip && (
) }
{ allowReset && (
+ );
+ }
const id = `inspector-range-control-${ instanceId }`;
-
const currentInputValue = currentInput === null ? value : currentInput;
-
const initialSliderValue = isFinite( currentInputValue )
? currentInputValue
: initialPosition;
diff --git a/packages/components/src/range-control/rail.js b/packages/components/src/range-control/rail.js
index 0eea30a0d8762b..111cf8d96972d7 100644
--- a/packages/components/src/range-control/rail.js
+++ b/packages/components/src/range-control/rail.js
@@ -1,7 +1,3 @@
-/**
- * External dependencies
- */
-import { isUndefined } from 'lodash';
/**
* Internal dependencies
*/
@@ -9,6 +5,7 @@ import RangeMark from './mark';
import { MarksWrapper, Rail } from './styles/range-control-styles';
export default function RangeRail( {
+ disabled = false,
marks = false,
min = 0,
max = 100,
@@ -18,9 +15,10 @@ export default function RangeRail( {
} ) {
return (
<>
-
+
{ marks && (
{ marksData.map( ( mark ) => (
-
+
) ) }
);
@@ -64,7 +74,7 @@ function useMarks( { marks, min = 0, max = 100, step = 1, value = 0 } ) {
} ) );
const enhancedMarks = marksArray.map( ( mark, index ) => {
- const markValue = ! isUndefined( mark.value ) ? mark.value : value;
+ const markValue = mark.value !== undefined ? mark.value : value;
const key = `mark-${ index }`;
const isFilled = markValue * step <= value;
diff --git a/packages/components/src/range-control/stories/index.js b/packages/components/src/range-control/stories/index.js
index 44c7953ece94e9..c0e4877610c7a5 100644
--- a/packages/components/src/range-control/stories/index.js
+++ b/packages/components/src/range-control/stories/index.js
@@ -25,10 +25,11 @@ const RangeControlWithState = ( props ) => {
const DefaultExample = () => {
const [ isRtl, setIsRtl ] = useState( false );
+ const [ value, setValue ] = useState( undefined );
- const rtl = boolean( 'RTL', false );
const props = {
allowReset: boolean( 'allowReset', false ),
+ disabled: boolean( 'disabled', false ),
label: text( 'label', 'Range Label' ),
help: text( 'help', '' ),
min: number( 'min', 0 ),
@@ -39,8 +40,12 @@ const DefaultExample = () => {
beforeIcon: text( 'beforeIcon', '' ),
afterIcon: text( 'afterIcon', '' ),
withInputField: boolean( 'withInputField', true ),
+ value,
+ onChange: setValue,
};
+ const rtl = boolean( 'RTL', false );
+
useEffect( () => {
if ( rtl !== isRtl ) {
setIsRtl( rtl );
diff --git a/packages/components/src/range-control/styles/range-control-styles.js b/packages/components/src/range-control/styles/range-control-styles.js
index cdbf2af600b9db..d20af0055c917f 100644
--- a/packages/components/src/range-control/styles/range-control-styles.js
+++ b/packages/components/src/range-control/styles/range-control-styles.js
@@ -53,6 +53,13 @@ export const AfterIconWrapper = styled.span`
${rtl( { marginLeft: 16 } )}
`;
+const disabledRailBackgroundColor = ( { disabled } ) => {
+ if ( ! disabled ) return '';
+ return css( {
+ backgroundColor: color( 'lightGray.400' ),
+ } );
+};
+
export const Rail = styled.span`
background-color: ${color( 'lightGray.600' )};
box-sizing: border-box;
@@ -64,8 +71,17 @@ export const Rail = styled.span`
position: absolute;
margin-top: 14px;
top: 0;
+
+ ${disabledRailBackgroundColor};
`;
+const disabledBackgroundColor = ( { disabled } ) => {
+ if ( ! disabled ) return '';
+ return css( {
+ backgroundColor: color( 'lightGray.800' ),
+ } );
+};
+
export const Track = styled.span`
background-color: currentColor;
border-radius: 1px;
@@ -76,6 +92,8 @@ export const Track = styled.span`
position: absolute;
margin-top: 14px;
top: 0;
+
+ ${disabledBackgroundColor};
`;
export const MarksWrapper = styled.span`
@@ -101,6 +119,7 @@ export const Mark = styled.span`
width: 1px;
${markFill};
+ ${disabledBackgroundColor};
`;
const markLabelFill = ( { isFilled } ) => {
@@ -229,6 +248,7 @@ export const Tooltip = styled.span`
min-width: 32px;
opacity: 0;
padding: 8px;
+ pointer-events: none;
position: absolute;
text-align: center;
transition: opacity 120ms ease;
diff --git a/packages/components/src/range-control/test/index.js b/packages/components/src/range-control/test/index.js
index 5f333b2a40676f..31c72383a0271e 100644
--- a/packages/components/src/range-control/test/index.js
+++ b/packages/components/src/range-control/test/index.js
@@ -1,7 +1,8 @@
/**
* External dependencies
*/
-import TestUtils from 'react-dom/test-utils';
+import { render, unmountComponentAtNode } from 'react-dom';
+import TestUtils, { act, Simulate } from 'react-dom/test-utils';
/**
* Internal dependencies
@@ -14,6 +15,19 @@ import RangeControl from '../';
import { Component } from '@wordpress/element';
import { Dashicon } from '@wordpress/components';
+let container = null;
+
+beforeEach( () => {
+ container = document.createElement( 'div' );
+ document.body.appendChild( container );
+} );
+
+afterEach( () => {
+ unmountComponentAtNode( container );
+ container.remove();
+ container = null;
+} );
+
describe( 'RangeControl', () => {
class TestWrapper extends Component {
render() {
@@ -293,4 +307,192 @@ describe( 'RangeControl', () => {
expect( onChange ).toHaveBeenCalledWith( 0.225 );
} );
} );
+
+ describe( 'initialPosition / value', () => {
+ const getInputElement = ( wrapper ) =>
+ TestUtils.findRenderedDOMComponentWithClass(
+ wrapper,
+ 'components-range-control__slider'
+ );
+
+ it( 'renders initial rendered value of 50% of min/max, if no initialPosition or value is defined', () => {
+ const wrapper = getWrapper( { min: 0, max: 10 } );
+ const inputElement = getInputElement( wrapper );
+
+ expect( inputElement.value ).toBe( '5' );
+ } );
+
+ it( 'renders initialPosition if no value is provided', () => {
+ const wrapper = getWrapper( {
+ initialPosition: 50,
+ value: undefined,
+ } );
+ const inputElement = getInputElement( wrapper );
+
+ expect( inputElement.value ).toBe( '50' );
+ } );
+
+ it( 'renders value instead of initialPosition is provided', () => {
+ const wrapper = getWrapper( { initialPosition: 50, value: 10 } );
+ const inputElement = getInputElement( wrapper );
+
+ expect( inputElement.value ).toBe( '10' );
+ } );
+ } );
+
+ describe( 'input field', () => {
+ it( 'should render an input field by default', () => {
+ act( () => {
+ render( , container );
+ } );
+ const field = container.querySelector( 'input[type="number"]' );
+
+ expect( field ).toBeTruthy();
+ } );
+
+ it( 'should not render an input field, if disabled', () => {
+ act( () => {
+ render( , container );
+ } );
+ const field = container.querySelector( 'input[type="number"]' );
+
+ expect( field ).toBeFalsy();
+ } );
+
+ it( 'should render a zero value into input range and field', () => {
+ act( () => {
+ render( , container );
+ } );
+ const range = container.querySelector( 'input[type="range"]' );
+ const field = container.querySelector( 'input[type="number"]' );
+
+ expect( range.value ).toBe( '0' );
+ expect( field.value ).toBe( '0' );
+ } );
+
+ it( 'should update both field and range on change', () => {
+ act( () => {
+ render( , container );
+ } );
+ const range = container.querySelector( 'input[type="range"]' );
+ const field = container.querySelector( 'input[type="number"]' );
+
+ act( () => {
+ Simulate.change( range, { target: { value: 13 } } );
+ } );
+
+ expect( range.value ).toBe( '13' );
+ expect( field.value ).toBe( '13' );
+
+ act( () => {
+ Simulate.change( field, { target: { value: 7 } } );
+ } );
+
+ expect( range.value ).toBe( '7' );
+ expect( field.value ).toBe( '7' );
+ } );
+
+ it( 'should reset input values if next value is removed', () => {
+ act( () => {
+ render( , container );
+ } );
+ const range = container.querySelector( 'input[type="range"]' );
+ const field = container.querySelector( 'input[type="number"]' );
+
+ expect( range.value ).toBe( '13' );
+ expect( field.value ).toBe( '13' );
+
+ act( () => {
+ Simulate.change( field, { target: { value: undefined } } );
+ } );
+
+ // Reset to 50. Median value of min: 0, max: 100
+ expect( range.value ).toBe( '50' );
+ // Input field should be blank
+ expect( field.value ).toBe( '' );
+ } );
+ } );
+
+ describe( 'reset', () => {
+ class StatefulTestWrapper extends Component {
+ constructor( props ) {
+ super( props );
+ this.state = {
+ value: undefined,
+ };
+ this.handleOnChange = this.handleOnChange.bind( this );
+ }
+
+ handleOnChange( nextValue = this.props.resetFallbackValue ) {
+ this.setState( { value: nextValue } );
+ }
+
+ render() {
+ return (
+
+ );
+ }
+ }
+
+ const getStatefulWrapper = ( props = {} ) =>
+ TestUtils.renderIntoDocument(
+
+ );
+
+ const getInputElement = ( wrapper ) =>
+ TestUtils.findRenderedDOMComponentWithClass(
+ wrapper,
+ 'components-range-control__slider'
+ );
+
+ it( 'resets to a custom fallback value, defined by a parent component', () => {
+ const wrapper = getStatefulWrapper( {
+ initialPosition: 50,
+ value: 10,
+ allowReset: true,
+ resetFallbackValue: 33,
+ } );
+
+ const resetButton = TestUtils.findRenderedDOMComponentWithClass(
+ wrapper,
+ 'components-range-control__reset'
+ );
+
+ act( () => {
+ TestUtils.Simulate.click( resetButton );
+ } );
+
+ const inputElement = getInputElement( wrapper );
+
+ expect( inputElement.value ).toBe( '33' );
+ } );
+
+ it( 'resets to a 50% of min/max value, of no initialPosition or value is defined', () => {
+ const wrapper = getStatefulWrapper( {
+ initialPosition: undefined,
+ value: 10,
+ min: 0,
+ max: 100,
+ allowReset: true,
+ resetFallbackValue: undefined,
+ } );
+
+ const resetButton = TestUtils.findRenderedDOMComponentWithClass(
+ wrapper,
+ 'components-range-control__reset'
+ );
+
+ act( () => {
+ TestUtils.Simulate.click( resetButton );
+ } );
+
+ const inputElement = getInputElement( wrapper );
+
+ expect( inputElement.value ).toBe( '50' );
+ } );
+ } );
} );
diff --git a/packages/components/src/range-control/utils.js b/packages/components/src/range-control/utils.js
index 4c39afebe99109..9d2aecfa5e7a70 100644
--- a/packages/components/src/range-control/utils.js
+++ b/packages/components/src/range-control/utils.js
@@ -11,35 +11,42 @@ import { useCallback, useRef, useEffect, useState } from '@wordpress/element';
/**
* A float supported clamp function for a specific value.
*
- * @param {number} value The value to clamp
+ * @param {number|null} value The value to clamp
* @param {number} min The minimum value
* @param {number} max The maxinum value
*
* @return {number} A (float) number
*/
-function floatClamp( value, min, max ) {
+export function floatClamp( value, min, max ) {
+ if ( ! isFinite( value ) ) {
+ return null;
+ }
+
return parseFloat( clamp( value, min, max ) );
}
/**
* Hook to store a clamped value, derived from props.
*/
-export function useControlledRangeValue( { min, max, value: valueProp = 0 } ) {
+export function useControlledRangeValue( { min, max, value: valueProp } ) {
const [ value, setValue ] = useState( floatClamp( valueProp, min, max ) );
const valueRef = useRef( value );
- const setClampValue = ( nextValue ) => {
- setValue( floatClamp( nextValue, min, max ) );
- };
+ const setClampValue = useCallback(
+ ( nextValue ) => {
+ setValue( floatClamp( nextValue, min, max ) );
+ },
+ [ setValue, min, max ]
+ );
useEffect( () => {
if ( valueRef.current !== valueProp ) {
setClampValue( valueProp );
valueRef.current = valueProp;
}
- }, [ valueProp, setClampValue ] );
+ }, [ valueProp, setValue ] );
- return [ value, setClampValue ];
+ return [ value, setValue ];
}
/**
@@ -49,7 +56,7 @@ export function useControlledRangeValue( { min, max, value: valueProp = 0 } ) {
export function useDebouncedHoverInteraction( {
onShow = noop,
onHide = noop,
- onMouseEnter = noop,
+ onMouseMove = noop,
onMouseLeave = noop,
timeout = 300,
} ) {
@@ -65,8 +72,8 @@ export function useDebouncedHoverInteraction( {
[ timeout ]
);
- const handleOnMouseEnter = useCallback( ( event ) => {
- onMouseEnter( event );
+ const handleOnMouseMove = useCallback( ( event ) => {
+ onMouseMove( event );
setDebouncedTimeout( () => {
if ( ! show ) {
@@ -92,7 +99,7 @@ export function useDebouncedHoverInteraction( {
} );
return {
- onMouseEnter: handleOnMouseEnter,
+ onMouseMove: handleOnMouseMove,
onMouseLeave: handleOnMouseLeave,
};
}
diff --git a/packages/components/src/resizable-box/index.native.js b/packages/components/src/resizable-box/index.native.js
new file mode 100644
index 00000000000000..8c152613064f80
--- /dev/null
+++ b/packages/components/src/resizable-box/index.native.js
@@ -0,0 +1,32 @@
+/**
+ * External dependencies
+ */
+import { View } from 'react-native';
+/**
+ * WordPress dependencies
+ */
+import { withPreferredColorScheme } from '@wordpress/compose';
+/**
+ * Internal dependencies
+ */
+import styles from './style.scss';
+
+function ResizableBox( props ) {
+ const { size, isSelected, getStylesFromColorScheme } = props;
+ const { height } = size;
+ const defaultStyle = getStylesFromColorScheme(
+ styles.staticSpacer,
+ styles.staticDarkSpacer
+ );
+ return (
+
+ );
+}
+
+export default withPreferredColorScheme( ResizableBox );
diff --git a/packages/components/src/resizable-box/style.native.scss b/packages/components/src/resizable-box/style.native.scss
new file mode 100644
index 00000000000000..2c47044df822d7
--- /dev/null
+++ b/packages/components/src/resizable-box/style.native.scss
@@ -0,0 +1,14 @@
+.staticSpacer {
+ height: 20px;
+ background-color: transparent;
+ border: $border-width dashed $light-gray-500;
+ border-radius: 1px;
+}
+
+.staticDarkSpacer {
+ border: $border-width dashed rgba($color: $light-gray-500, $alpha: 0.3);
+}
+
+.selectedSpacer {
+ border: $border-width * 2 solid $blue-30;
+}
diff --git a/packages/components/src/responsive-wrapper/index.js b/packages/components/src/responsive-wrapper/index.js
index d5214a2f1d5dca..ba919f5f7db112 100644
--- a/packages/components/src/responsive-wrapper/index.js
+++ b/packages/components/src/responsive-wrapper/index.js
@@ -7,6 +7,7 @@ import classnames from 'classnames';
* WordPress dependencies
*/
import { cloneElement, Children } from '@wordpress/element';
+import { useResizeObserver } from '@wordpress/compose';
function ResponsiveWrapper( {
naturalWidth,
@@ -14,15 +15,23 @@ function ResponsiveWrapper( {
children,
isInline = false,
} ) {
+ const [
+ containerResizeListener,
+ { width: containerWidth },
+ ] = useResizeObserver();
if ( Children.count( children ) !== 1 ) {
return null;
}
const imageStyle = {
- paddingBottom: ( naturalHeight / naturalWidth ) * 100 + '%',
+ paddingBottom:
+ naturalWidth < containerWidth
+ ? naturalHeight
+ : ( naturalHeight / naturalWidth ) * 100 + '%',
};
const TagName = isInline ? 'span' : 'div';
return (
+ { containerResizeListener }
{ cloneElement( children, {
className: classnames(
diff --git a/packages/components/src/responsive-wrapper/style.scss b/packages/components/src/responsive-wrapper/style.scss
index c51288172fbcba..b6a556bf3425d0 100644
--- a/packages/components/src/responsive-wrapper/style.scss
+++ b/packages/components/src/responsive-wrapper/style.scss
@@ -15,4 +15,5 @@
left: 0;
width: 100%;
height: 100%;
+ margin: auto;
}
diff --git a/packages/components/src/sandbox/index.js b/packages/components/src/sandbox/index.js
index c52bce90880fa5..2fe01d33f86dbc 100644
--- a/packages/components/src/sandbox/index.js
+++ b/packages/components/src/sandbox/index.js
@@ -77,6 +77,7 @@ class Sandbox extends Component {
}
const body = this.iframe.current.contentDocument.body;
+
if (
! forceRerender &&
null !== body.getAttribute( 'data-resizable-iframe-connected' )
@@ -232,7 +233,7 @@ class Sandbox extends Component {
title={ title }
className="components-sandbox"
sandbox="allow-scripts allow-same-origin allow-presentation"
- onLoad={ this.trySandbox }
+ onLoad={ () => this.trySandbox( false ) }
onFocus={ onFocus }
width={ Math.ceil( this.state.width ) }
height={ Math.ceil( this.state.height ) }
diff --git a/packages/components/src/sandbox/test/index.js b/packages/components/src/sandbox/test/index.js
index 7888082f49459a..4a8343fd5514f4 100644
--- a/packages/components/src/sandbox/test/index.js
+++ b/packages/components/src/sandbox/test/index.js
@@ -1,8 +1,7 @@
/**
* External dependencies
*/
-import ReactDOM from 'react-dom';
-import { act } from 'react-dom/test-utils';
+import { act, fireEvent, render } from '@testing-library/react';
/**
* WordPress dependencies
@@ -14,62 +13,67 @@ import { useState } from '@wordpress/element';
*/
import Sandbox from '../';
-let container;
+describe( 'Sandbox', () => {
+ const TestWrapper = () => {
+ const [ html, setHtml ] = useState(
+ ''
+ );
-const TestWrapper = () => {
- const [ html, setHtml ] = useState(
- ''
- );
+ const updateHtml = () => {
+ setHtml(
+ ''
+ );
+ };
- const updateHtml = () => {
- setHtml(
- ''
+ return (
+
+
+ Mock Button
+
+
+
);
};
- return (
-
-
- Mock Button
-
-
-
- );
-};
-
-beforeEach( () => {
- container = document.createElement( 'div' );
- document.body.appendChild( container );
-} );
-
-afterEach( () => {
- document.body.removeChild( container );
- container = null;
-} );
+ beforeAll( () => {
+ // MuatationObserver implmentation from JSDom does not work as intended
+ // with iframes so we need to ignore it for the time being.
+ jest.spyOn(
+ global.MutationObserver.prototype,
+ 'observe'
+ ).mockImplementation( () => {} );
+ } );
-it( 'should rerender with new emdeded content if html prop changes', () => {
- act( () => {
- ReactDOM.render( , container );
+ afterAll( () => {
+ global.MutationObserver.prototype.mockReset();
} );
- const button = container.querySelector( '.mock-button' );
- const iframe = container.querySelector( '.components-sandbox' );
+ it( 'should rerender with new emdeded content if html prop changes', () => {
+ let result;
+ act( () => {
+ result = render( );
+ } );
- let sandboxedIframe = iframe.contentWindow.document.body.querySelector(
- '.mock-iframe'
- );
+ const iframe = result.container.querySelector( '.components-sandbox' );
- expect( sandboxedIframe.src ).toEqual( 'https://super.embed/' );
+ let sandboxedIframe = iframe.contentWindow.document.body.querySelector(
+ '.mock-iframe'
+ );
- act( () => {
- button.dispatchEvent(
- new window.MouseEvent( 'click', { bubbles: true } )
+ expect( sandboxedIframe.getAttribute( 'src' ) ).toBe(
+ 'https://super.embed'
);
- } );
- sandboxedIframe = iframe.contentWindow.document.body.querySelector(
- '.mock-iframe'
- );
+ act( () => {
+ fireEvent.click( result.getByRole( 'button' ) );
+ } );
+
+ sandboxedIframe = iframe.contentWindow.document.body.querySelector(
+ '.mock-iframe'
+ );
- expect( sandboxedIframe.src ).toEqual( 'https://another.super.embed/' );
+ expect( sandboxedIframe.getAttribute( 'src' ) ).toBe(
+ 'https://another.super.embed'
+ );
+ } );
} );
diff --git a/packages/components/src/select-control/README.md b/packages/components/src/select-control/README.md
index 996756798b64b4..83073594c1dced 100644
--- a/packages/components/src/select-control/README.md
+++ b/packages/components/src/select-control/README.md
@@ -81,38 +81,42 @@ Use sentences in your menu.
Render a user interface to select the size of an image.
- import { SelectControl } from '@wordpress/components';
- import { withState } from '@wordpress/compose';
-
- const MySelectControl = withState( {
- size: '50%',
- } )( ( { size, setState } ) => (
- { setState( { size } ) } }
- />
- ) );
+```jsx
+import { SelectControl } from '@wordpress/components';
+import { withState } from '@wordpress/compose';
+
+const MySelectControl = withState( {
+ size: '50%',
+} )( ( { size, setState } ) => (
+ { setState( { size } ) } }
+ />
+) );
+```
Render a user interface to select multiple users from a list.
- { this.setState( { users } ) } }
- options={ [
- { value: null, label: 'Select a User', disabled: true },
- { value: 'a', label: 'User A' },
- { value: 'b', label: 'User B' },
- { value: 'c', label: 'User c' },
- ] }
- />
+```jsx
+ { this.setState( { users } ) } }
+ options={ [
+ { value: null, label: 'Select a User', disabled: true },
+ { value: 'a', label: 'User A' },
+ { value: 'b', label: 'User B' },
+ { value: 'c', label: 'User c' },
+ ] }
+/>
+```
### Props
diff --git a/packages/components/src/slot-fill/bubbles-virtually/slot-fill-provider.js b/packages/components/src/slot-fill/bubbles-virtually/slot-fill-provider.js
index d487d98fbfa9a1..6d4b046a6271cf 100644
--- a/packages/components/src/slot-fill/bubbles-virtually/slot-fill-provider.js
+++ b/packages/components/src/slot-fill/bubbles-virtually/slot-fill-provider.js
@@ -25,11 +25,10 @@ function useSlotRegistry() {
const unregisterSlot = useCallback( ( name, ref ) => {
setSlots( ( prevSlots ) => {
- // eslint-disable-next-line no-unused-vars
const { [ name ]: slot, ...nextSlots } = prevSlots;
// Make sure we're not unregistering a slot registered by another element
// See https://github.com/WordPress/gutenberg/pull/19242#issuecomment-590295412
- if ( slot.ref === ref ) {
+ if ( slot?.ref === ref ) {
return nextSlots;
}
return prevSlots;
diff --git a/packages/components/src/slot-fill/stories/index.js b/packages/components/src/slot-fill/stories/index.js
index 035defa5eb4f6e..2af19ecf012c31 100644
--- a/packages/components/src/slot-fill/stories/index.js
+++ b/packages/components/src/slot-fill/stories/index.js
@@ -16,9 +16,6 @@ import { Slot, Fill, Provider } from '../';
export default {
title: 'Components/SlotFill',
component: Slot,
- parameters: {
- storyshots: { disable: true },
- },
};
export const _default = () => {
diff --git a/packages/components/src/slot-fill/test/__snapshots__/slot.js.snap b/packages/components/src/slot-fill/test/__snapshots__/slot.js.snap
index 79b43ad4c65c07..5cffdf5ec3f6ca 100644
--- a/packages/components/src/slot-fill/test/__snapshots__/slot.js.snap
+++ b/packages/components/src/slot-fill/test/__snapshots__/slot.js.snap
@@ -1,128 +1,166 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Slot bubblesVirtually false should subsume another slot by the same name 1`] = `
-Array [
+
+
`;
exports[`Slot bubblesVirtually false should subsume another slot by the same name 2`] = `
-Array [
+
+
+`;
+
+exports[`Slot bubblesVirtually false should unmount two slots with the same name 1`] = `
+
`;
exports[`Slot bubblesVirtually true should subsume another slot by the same name 1`] = `
-Array [
+
,
-]
+
+ Content
+
+
+
`;
exports[`Slot bubblesVirtually true should subsume another slot by the same name 2`] = `
-Array [
+
,
+ />
,
-]
+
+ Content
+
+
+
+`;
+
+exports[`Slot bubblesVirtually true should unmount two slots with the same name 1`] = `
+
`;
exports[`Slot should re-render Slot when not bubbling virtually 1`] = `
-Array [
+
,
-]
+ />
+
`;
exports[`Slot should re-render Slot when not bubbling virtually 2`] = `
-Array [
+
,
-]
+ />
+
`;
exports[`Slot should render a Fill containing an array 1`] = `
`;
exports[`Slot should render a Fill containing an element 1`] = `
`;
exports[`Slot should render a string Fill 1`] = `
`;
exports[`Slot should render a string Fill with HTML wrapper when render props used 1`] = `
`;
-exports[`Slot should render empty Fills 1`] = `
`;
+exports[`Slot should render empty Fills 1`] = `
+
+`;
-exports[`Slot should render empty Fills without HTML wrapper when render props used 1`] = `
`;
+exports[`Slot should render empty Fills without HTML wrapper when render props used 1`] = `
+
+`;
exports[`Slot should render in expected order 1`] = `
-Array [
+
,
+ />
,
-]
+ />
+
`;
diff --git a/packages/components/src/slot-fill/test/slot.js b/packages/components/src/slot-fill/test/slot.js
index db935e6bc2ed29..398ea965924458 100644
--- a/packages/components/src/slot-fill/test/slot.js
+++ b/packages/components/src/slot-fill/test/slot.js
@@ -2,7 +2,7 @@
* External dependencies
*/
import { isEmpty } from 'lodash';
-import ReactTestRenderer from 'react-test-renderer';
+import { render, fireEvent } from '@testing-library/react';
/**
* Internal dependencies
@@ -38,33 +38,33 @@ class Filler extends Component {
describe( 'Slot', () => {
it( 'should render empty Fills', () => {
- const tree = ReactTestRenderer.create(
+ const { container } = render(
- ).toJSON();
+ );
- expect( tree ).toMatchSnapshot();
+ expect( container ).toMatchSnapshot();
} );
it( 'should render a string Fill', () => {
- const tree = ReactTestRenderer.create(
+ const { container } = render(
content
- ).toJSON();
+ );
- expect( tree ).toMatchSnapshot();
+ expect( container ).toMatchSnapshot();
} );
it( 'should render a Fill containing an element', () => {
- const tree = ReactTestRenderer.create(
+ const { container } = render(
@@ -73,13 +73,13 @@ describe( 'Slot', () => {
- ).toJSON();
+ );
- expect( tree ).toMatchSnapshot();
+ expect( container ).toMatchSnapshot();
} );
it( 'should render a Fill containing an array', () => {
- const tree = ReactTestRenderer.create(
+ const { container } = render(
@@ -88,15 +88,15 @@ describe( 'Slot', () => {
{ [
,
, 'text' ] }
- ).toJSON();
+ );
- expect( tree ).toMatchSnapshot();
+ expect( container ).toMatchSnapshot();
} );
it( 'calls the functions passed as the Slot’s fillProps in the Fill', () => {
const onClose = jest.fn();
- const testInstance = ReactTestRenderer.create(
+ const { getByText } = render(
@@ -107,15 +107,15 @@ describe( 'Slot', () => {
} }
- ).root;
+ );
- testInstance.findByType( 'button' ).props.onClick();
+ fireEvent.click( getByText( 'Click me' ) );
expect( onClose ).toHaveBeenCalledTimes( 1 );
} );
it( 'should render empty Fills without HTML wrapper when render props used', () => {
- const tree = ReactTestRenderer.create(
+ const { container } = render(
@@ -128,13 +128,13 @@ describe( 'Slot', () => {
- ).toJSON();
+ );
- expect( tree ).toMatchSnapshot();
+ expect( container ).toMatchSnapshot();
} );
it( 'should render a string Fill with HTML wrapper when render props used', () => {
- const tree = ReactTestRenderer.create(
+ const { container } = render(
@@ -145,13 +145,13 @@ describe( 'Slot', () => {
content
- ).toJSON();
+ );
- expect( tree ).toMatchSnapshot();
+ expect( container ).toMatchSnapshot();
} );
it( 'should re-render Slot when not bubbling virtually', () => {
- const testRenderer = ReactTestRenderer.create(
+ const { container, getByRole } = render(
@@ -160,15 +160,15 @@ describe( 'Slot', () => {
);
- expect( testRenderer.toJSON() ).toMatchSnapshot();
+ expect( container ).toMatchSnapshot();
- testRenderer.root.findByType( 'button' ).props.onClick();
+ fireEvent.click( getByRole( 'button' ) );
- expect( testRenderer.toJSON() ).toMatchSnapshot();
+ expect( container ).toMatchSnapshot();
} );
it( 'should render in expected order', () => {
- const testRenderer = ReactTestRenderer.create(
+ const { container, rerender } = render(
@@ -176,7 +176,7 @@ describe( 'Slot', () => {
);
- testRenderer.update(
+ rerender(
@@ -186,7 +186,7 @@ describe( 'Slot', () => {
);
- testRenderer.update(
+ rerender(
@@ -195,7 +195,7 @@ describe( 'Slot', () => {
);
- testRenderer.update(
+ rerender(
@@ -205,14 +205,14 @@ describe( 'Slot', () => {
);
- expect( testRenderer.toJSON() ).toMatchSnapshot();
+ expect( container ).toMatchSnapshot();
} );
describe.each( [ false, true ] )(
'bubblesVirtually %p',
( bubblesVirtually ) => {
it( 'should subsume another slot by the same name', () => {
- const testRenderer = ReactTestRenderer.create(
+ const { container, rerender } = render(
{
);
- testRenderer.update(
+ rerender(
{
);
- expect( testRenderer.toJSON() ).toMatchSnapshot();
+ expect( container ).toMatchSnapshot();
- testRenderer.update(
+ rerender(
@@ -258,7 +258,47 @@ describe( 'Slot', () => {
);
- expect( testRenderer.toJSON() ).toMatchSnapshot();
+ expect( container ).toMatchSnapshot();
+ } );
+
+ it( 'should unmount two slots with the same name', () => {
+ const { rerender, container } = render(
+
+
+
+
+
+
+
+ Content
+
+ );
+ rerender(
+
+
+
+
+
+ Content
+
+ );
+ rerender(
+
+
+
+ Content
+
+ );
+ expect( container ).toMatchSnapshot();
} );
}
);
diff --git a/packages/components/src/snackbar/index.js b/packages/components/src/snackbar/index.js
index 45b8bd8e24a946..4c5ae0ac7e5b05 100644
--- a/packages/components/src/snackbar/index.js
+++ b/packages/components/src/snackbar/index.js
@@ -77,7 +77,7 @@ function Snackbar(
tabIndex="0"
role="button"
onKeyPress={ onRemove }
- label={ __( 'Dismiss this notice' ) }
+ aria-label={ __( 'Dismiss this notice' ) }
>
{ children }
diff --git a/packages/components/src/style.scss b/packages/components/src/style.scss
index 66b4eeb4a7d65f..83e26e37cb09a4 100644
--- a/packages/components/src/style.scss
+++ b/packages/components/src/style.scss
@@ -41,6 +41,7 @@
@import "./select-control/style.scss";
@import "./snackbar/style.scss";
@import "./spinner/style.scss";
+@import "./tab-panel/style.scss";
@import "./text-control/style.scss";
@import "./textarea-control/style.scss";
@import "./tip/style.scss";
diff --git a/packages/components/src/tab-panel/index.js b/packages/components/src/tab-panel/index.js
index bdc40c637053b1..682ac3fcfe1029 100644
--- a/packages/components/src/tab-panel/index.js
+++ b/packages/components/src/tab-panel/index.js
@@ -78,9 +78,13 @@ class TabPanel extends Component {
>
{ tabs.map( ( tab ) => (
{ this.props.children( selectedTab ) }
diff --git a/packages/components/src/tab-panel/stories/index.js b/packages/components/src/tab-panel/stories/index.js
index 8647e3ddab24a9..3c15007f3aeadf 100644
--- a/packages/components/src/tab-panel/stories/index.js
+++ b/packages/components/src/tab-panel/stories/index.js
@@ -14,7 +14,6 @@ export const _default = () => {
return (
{
- if ( ! highlight.trim() ) {
+ const trimmedHighlightText = highlight.trim();
+
+ if ( ! trimmedHighlightText ) {
return text;
}
- const regex = new RegExp( `(${ escapeRegExp( highlight ) })`, 'gi' );
-
- return __experimentalCreateInterpolateElement(
- text.replace( regex, '$& ' ),
- {
- mark: ,
- }
+ const regex = new RegExp(
+ `(${ escapeRegExp( trimmedHighlightText ) })`,
+ 'gi'
);
+
+ return createInterpolateElement( text.replace( regex, '$& ' ), {
+ mark: ,
+ } );
};
export default TextHighlight;
diff --git a/packages/components/src/text/README.md b/packages/components/src/text/README.md
index 806c60d45a06bc..4a659b34fa4ccc 100644
--- a/packages/components/src/text/README.md
+++ b/packages/components/src/text/README.md
@@ -1,18 +1,54 @@
# Text
-A text component for styling text.
+A component for rendering text.
## Usage
```jsx
-import {Text} from '@wordpress/components';
+import { Text } from '@wordpress/components';
const HeroPanel = () => (
<>
- Hello World!
+
+ Hello World!
+
Greetings to you!
>
);
```
-> For most use-cases you can use this component instead of a `h1`, `h2`, `h3`, `h4`, `h5`, `h6` or `p`.
+## Props
+
+The component accepts the following props:
+
+#### as
+
+Determines the HTML selector for the text.
+
+For most use-cases you can use this component instead of a `h1`, `h2`, `h3`, `h4`, `h5`, `h6` or `p`.
+
+- Type: `String`
+- Required: No
+- Default: ''
+
+#### variant
+
+Determines the style for the text. Available variants:
+
+- `title`
+- `title.large`
+- `title.medium`
+- `title.small`
+- `subtitle`
+- `subtitle.large`
+- `subtitle.small`
+- `body`
+- `body.large`
+- `body.small`
+- `button`
+- `caption`
+- `label`
+
+* Type: `String`
+* Required: No
+* Default: 'body'
diff --git a/packages/components/src/text/index.js b/packages/components/src/text/index.js
index c4ae06e2b4f97f..e502e39a59c49a 100644
--- a/packages/components/src/text/index.js
+++ b/packages/components/src/text/index.js
@@ -1 +1,19 @@
-export * from './text.styles';
+/**
+ * External dependencies
+ */
+import styled from '@emotion/styled';
+
+/**
+ * Internal dependencies
+ */
+import { text } from './styles/text-mixins';
+
+const Text = styled.p(
+ `
+ box-sizing: border-box;
+ margin: 0;
+`,
+ text
+);
+
+export default Text;
diff --git a/packages/components/src/text/text.styles.native.js b/packages/components/src/text/index.native.js
similarity index 51%
rename from packages/components/src/text/text.styles.native.js
rename to packages/components/src/text/index.native.js
index 2304de2efa62f3..8a52d4056d5578 100644
--- a/packages/components/src/text/text.styles.native.js
+++ b/packages/components/src/text/index.native.js
@@ -6,6 +6,8 @@ import styled from '@emotion/native';
/**
* Internal dependencies
*/
-import { text } from './mixins';
+import { text } from './styles/text-mixins';
-export const __experimentalText = styled.Text( text );
+const Text = styled.Text( text );
+
+export default Text;
diff --git a/packages/components/src/text/stories/index.js b/packages/components/src/text/stories/index.js
index f1dca3b2c819b6..aeb3cd330fdd3a 100644
--- a/packages/components/src/text/stories/index.js
+++ b/packages/components/src/text/stories/index.js
@@ -1,10 +1,10 @@
/**
* Internal dependencies
*/
-import { __experimentalText as Text } from '../text.styles';
+import Text from '../index';
export default {
- title: 'Components/Experimental/Text',
+ title: 'Components/Text',
component: Text,
};
@@ -28,31 +28,3 @@ export const _default = () => (
Label
>
);
-
-export const TitleLarge = () => (
-
- Title Large
-
-);
-export const TitleMedium = () => (
-
- Title Medium
-
-);
-export const TitleSmall = () => (
-
- Title Small
-
-);
-
-export const Subtitle = () => Subtitle ;
-export const SubtitleSmall = () => (
- Subtitle Small
-);
-
-export const Body = () => Body ;
-export const BodySmall = () => Body Small ;
-
-export const Button = () => Button ;
-export const Caption = () => Caption ;
-export const Label = () => Label ;
diff --git a/packages/components/src/text/styles/emotion-css.js b/packages/components/src/text/styles/emotion-css.js
new file mode 100644
index 00000000000000..c86ee0154e7630
--- /dev/null
+++ b/packages/components/src/text/styles/emotion-css.js
@@ -0,0 +1,6 @@
+/**
+ * External dependencies
+ */
+import { css } from '@emotion/core';
+
+export default css;
diff --git a/packages/components/src/text/styles/emotion-css.native.js b/packages/components/src/text/styles/emotion-css.native.js
new file mode 100644
index 00000000000000..11ea92e4e705c3
--- /dev/null
+++ b/packages/components/src/text/styles/emotion-css.native.js
@@ -0,0 +1,6 @@
+/**
+ * External dependencies
+ */
+import { css } from '@emotion/native';
+
+export default css;
diff --git a/packages/components/src/text/font-family.js b/packages/components/src/text/styles/font-family.js
similarity index 100%
rename from packages/components/src/text/font-family.js
rename to packages/components/src/text/styles/font-family.js
diff --git a/packages/components/src/text/font-family.native.js b/packages/components/src/text/styles/font-family.native.js
similarity index 100%
rename from packages/components/src/text/font-family.native.js
rename to packages/components/src/text/styles/font-family.native.js
diff --git a/packages/components/src/text/mixins.js b/packages/components/src/text/styles/text-mixins.js
similarity index 87%
rename from packages/components/src/text/mixins.js
rename to packages/components/src/text/styles/text-mixins.js
index dfa3dfecc38979..d2463e80310a49 100644
--- a/packages/components/src/text/mixins.js
+++ b/packages/components/src/text/styles/text-mixins.js
@@ -1,11 +1,8 @@
-/**
- * External dependencies
- */
-import css from '@emotion/css';
/**
* Internal dependencies
*/
import { fontFamily } from './font-family';
+import css from './emotion-css';
const fontWeightNormal = `font-weight: 400;`;
const fontWeightSemibold = `font-weight: 600;`;
@@ -78,13 +75,13 @@ const label = `
`;
/**
- * @typedef {'title.large'|'title.medium'|'title.small'|'subtitle'|'subtitle.small'|'body'|'body.small'|'button'|'caption'|'label'} TextVariant
+ * @typedef {'title.large'|'title.medium'|'title.small'|'subtitle'|'subtitle.small'|'body'|'body.large'|'body.small'|'button'|'caption'|'label'} TextVariant
*/
/**
* @param {TextVariant} variantName
*/
-const variant = ( variantName ) => {
+const variant = ( variantName = 'body' ) => {
switch ( variantName ) {
case 'title.large':
return css`
@@ -114,6 +111,10 @@ const variant = ( variantName ) => {
`;
case 'body':
+ return css`
+ ${body}
+ `;
+ case 'body.large':
return css`
${body}
${bodyLarge}
@@ -137,7 +138,7 @@ const variant = ( variantName ) => {
/**
* @typedef {Object} TextProps
- * @property {TextVariant} variant
+ * @property {TextVariant} variant one of TextVariant to be used
*/
/**
diff --git a/packages/components/src/text/test/index.js b/packages/components/src/text/test/index.js
new file mode 100644
index 00000000000000..dfa504018ed5dd
--- /dev/null
+++ b/packages/components/src/text/test/index.js
@@ -0,0 +1,94 @@
+/**
+ * External dependencies
+ */
+import { render, unmountComponentAtNode } from 'react-dom';
+import { act } from 'react-dom/test-utils';
+
+/**
+ * Internal dependencies
+ */
+import Text from '../';
+
+let container = null;
+
+beforeEach( () => {
+ container = document.createElement( 'div' );
+ document.body.appendChild( container );
+} );
+
+afterEach( () => {
+ unmountComponentAtNode( container );
+ container.remove();
+ container = null;
+} );
+
+function getTextStyle( node ) {
+ const text = node || container.children[ 0 ];
+ return window.getComputedStyle( text );
+}
+
+describe( 'Text', () => {
+ describe( 'Basic rendering', () => {
+ it( 'should render', () => {
+ act( () => {
+ render( Hello , container );
+ } );
+
+ const [ text ] = container.children;
+
+ expect( text.innerHTML ).toBe( 'Hello' );
+ } );
+
+ it( 'should render as a , by default', () => {
+ act( () => {
+ render( , container );
+ } );
+
+ const [ text ] = container.children;
+
+ expect( text.tagName ).toBe( 'P' );
+ } );
+
+ it( 'should render as another selector, if specified', () => {
+ act( () => {
+ render(
+ <>
+
+
+
+
+ >,
+ container
+ );
+ } );
+
+ const [ h1, h2, span, div ] = container.children;
+
+ expect( h1.tagName ).toBe( 'H1' );
+ expect( h2.tagName ).toBe( 'H2' );
+ expect( span.tagName ).toBe( 'SPAN' );
+ expect( div.tagName ).toBe( 'DIV' );
+ } );
+ } );
+
+ describe( 'Variants', () => {
+ it( 'should render with specified variantion styles', () => {
+ act( () => {
+ render(
+ <>
+ Base
+ Title Large
+ Caption
+ >,
+ container
+ );
+ } );
+
+ const [ base, title, caption ] = container.children;
+
+ expect( getTextStyle( base ).fontSize ).toBeFalsy();
+ expect( getTextStyle( title ).fontSize ).toBe( '32px' );
+ expect( getTextStyle( caption ).fontSize ).toBe( '12px' );
+ } );
+ } );
+} );
diff --git a/packages/components/src/text/text.styles.js b/packages/components/src/text/text.styles.js
deleted file mode 100644
index 67545507f0d0b5..00000000000000
--- a/packages/components/src/text/text.styles.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * External dependencies
- */
-import styled from '@emotion/styled';
-
-/**
- * Internal dependencies
- */
-import { text } from './mixins';
-
-export const __experimentalText = styled.p( `margin: 0;`, text );
diff --git a/packages/components/src/toolbar-button/index.js b/packages/components/src/toolbar-button/index.js
index 4d56476caadc8b..347fd5fd0d7e60 100644
--- a/packages/components/src/toolbar-button/index.js
+++ b/packages/components/src/toolbar-button/index.js
@@ -48,8 +48,9 @@ function ToolbarButton( {
isPressed={ props.isActive }
disabled={ props.isDisabled }
{ ...extraProps }
- />
- { children }
+ >
+ { children }
+
);
}
diff --git a/packages/components/src/toolbar-button/stories/index.js b/packages/components/src/toolbar-button/stories/index.js
new file mode 100644
index 00000000000000..1bb0475003e161
--- /dev/null
+++ b/packages/components/src/toolbar-button/stories/index.js
@@ -0,0 +1,23 @@
+/**
+ * External dependencies
+ */
+import { text } from '@storybook/addon-knobs';
+
+/**
+ * Internal dependencies
+ */
+import { Toolbar } from '../../';
+import ToolbarButton from '../';
+
+export default { title: 'Components/ToolbarButton', component: ToolbarButton };
+
+export const _default = () => {
+ const label = text( 'Label', 'This is an example label.' );
+ const icon = text( 'Icon', 'wordpress' );
+
+ return (
+
+
+
+ );
+};
diff --git a/packages/components/src/toolbar-group/style.scss b/packages/components/src/toolbar-group/style.scss
index da98306f2c402f..a804663d4ef793 100644
--- a/packages/components/src/toolbar-group/style.scss
+++ b/packages/components/src/toolbar-group/style.scss
@@ -1,9 +1,10 @@
.components-toolbar-group {
- border: $border-width solid $light-gray-500;
+ min-height: $block-toolbar-height;
+ border-right: $border-width solid $dark-gray-primary;
background-color: $white;
- display: flex;
+ display: inline-flex;
flex-shrink: 0;
- margin-right: -$border-width;
+ flex-wrap: wrap;
& & {
border-width: 0;
@@ -16,11 +17,14 @@
// Legacy toolbar group
// External code references to it, so we can't change it?
.components-toolbar {
+ min-height: $block-toolbar-height;
margin: 0;
- border: $border-width solid $light-gray-500;
+ border: $border-width solid $dark-gray-primary;
+ border-radius: $radius-block-ui;
background-color: $white;
- display: flex;
+ display: inline-flex;
flex-shrink: 0;
+ flex-wrap: wrap;
}
div.components-toolbar {
@@ -54,3 +58,60 @@ div.components-toolbar {
}
}
}
+
+// Size multiple sequential buttons to be optically balanced.
+// Icons are 36px, as set by a 24px icon and 12px padding.
+.components-accessible-toolbar .components-toolbar-group > .components-button.components-button.has-icon,
+.components-toolbar div > .components-button.components-button.has-icon {
+ min-width: $block-toolbar-height - $grid-unit-15;
+ padding-left: $grid-unit-15 / 2; // 6px.
+ padding-right: $grid-unit-15 / 2;
+
+ svg {
+ min-width: $button-size-small; // This is the optimal icon size, and we size the whole button after this.
+ }
+
+ &::before {
+ left: 2px;
+ right: 2px;
+ }
+}
+
+// First button in a group.
+.components-accessible-toolbar .components-toolbar-group > .components-button:first-child.has-icon,
+.components-toolbar div:first-child .components-button.has-icon {
+ min-width: $block-toolbar-height - $grid-unit-15 / 2;
+ padding-left: $grid-unit-15 - $border-width;
+ padding-right: $grid-unit-15 / 2;
+
+ &::before {
+ left: $grid-unit-10;
+ right: 2px;
+ }
+}
+
+// Last button in a group.
+.components-accessible-toolbar .components-toolbar-group > .components-button:last-child.has-icon,
+.components-toolbar div:last-child .components-button.has-icon {
+ min-width: $block-toolbar-height - $grid-unit-15 / 2;
+ padding-left: $grid-unit-15 / 2;
+ padding-right: $grid-unit-15 - $border-width;
+
+ &::before {
+ left: 2px;
+ right: $grid-unit-10;
+ }
+}
+
+// Single buttons should remain 48px.
+.components-accessible-toolbar .components-toolbar-group > .components-button:first-child:last-child.has-icon,
+.components-toolbar div:first-child:last-child > .components-button.has-icon {
+ min-width: $block-toolbar-height;
+ padding-left: $grid-unit-15;
+ padding-right: $grid-unit-15;
+
+ &::before {
+ left: $grid-unit-10;
+ right: $grid-unit-10;
+ }
+}
diff --git a/packages/components/src/toolbar-group/test/index.js b/packages/components/src/toolbar-group/test/index.js
index c2aa53a165f17e..4bd6951caf477b 100644
--- a/packages/components/src/toolbar-group/test/index.js
+++ b/packages/components/src/toolbar-group/test/index.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import { mount } from 'enzyme';
+import { fireEvent, render } from '@testing-library/react';
/**
* Internal dependencies
@@ -11,13 +11,15 @@ import ToolbarGroup from '../';
describe( 'ToolbarGroup', () => {
describe( 'basic rendering', () => {
it( 'should render an empty node, when controls are not passed', () => {
- const wrapper = mount( );
- expect( wrapper.html() ).toBeNull();
+ const { container } = render( );
+
+ expect( container.innerHTML ).toBe( '' );
} );
it( 'should render an empty node, when controls are empty', () => {
- const wrapper = mount( );
- expect( wrapper.html() ).toBeNull();
+ const { container } = render( );
+
+ expect( container.innerHTML ).toBe( '' );
} );
it( 'should render a list of controls with buttons', () => {
@@ -30,15 +32,16 @@ describe( 'ToolbarGroup', () => {
isActive: false,
},
];
- const wrapper = mount( );
- const button = wrapper
- .find( '[aria-label="WordPress"]' )
- .hostNodes();
- expect( button.props() ).toMatchObject( {
- 'aria-label': 'WordPress',
- 'aria-pressed': false,
- type: 'button',
- } );
+
+ const { getByLabelText } = render(
+
+ );
+
+ const toolbarButton = getByLabelText( 'WordPress' );
+ expect( toolbarButton.getAttribute( 'aria-pressed' ) ).toBe(
+ 'false'
+ );
+ expect( toolbarButton.getAttribute( 'type' ) ).toBe( 'button' );
} );
it( 'should render a list of controls with buttons and active control', () => {
@@ -51,15 +54,16 @@ describe( 'ToolbarGroup', () => {
isActive: true,
},
];
- const wrapper = mount( );
- const button = wrapper
- .find( '[aria-label="WordPress"]' )
- .hostNodes();
- expect( button.props() ).toMatchObject( {
- 'aria-label': 'WordPress',
- 'aria-pressed': true,
- type: 'button',
- } );
+
+ const { getByLabelText } = render(
+
+ );
+
+ const toolbarButton = getByLabelText( 'WordPress' );
+ expect( toolbarButton.getAttribute( 'aria-pressed' ) ).toBe(
+ 'true'
+ );
+ expect( toolbarButton.getAttribute( 'type' ) ).toBe( 'button' );
} );
it( 'should render a nested list of controls with separator between', () => {
@@ -80,14 +84,15 @@ describe( 'ToolbarGroup', () => {
],
];
- const wrapper = mount( );
- const buttons = wrapper.find( 'button' ).hostNodes();
- const hasLeftDivider = wrapper
- .find( '.has-left-divider' )
- .hostNodes();
+ const { container, getAllByRole } = render(
+
+ );
+
+ const buttons = getAllByRole( 'button' );
expect( buttons ).toHaveLength( 2 );
- expect( hasLeftDivider ).toHaveLength( 1 );
- expect( hasLeftDivider.html() ).toContain( buttons.at( 1 ).html() );
+ expect(
+ container.querySelector( '.has-left-divider button' )
+ ).toBe( buttons[ 1 ] );
} );
it( 'should call the clickHandler on click.', () => {
@@ -100,11 +105,11 @@ describe( 'ToolbarGroup', () => {
isActive: true,
},
];
- const wrapper = mount( );
- const button = wrapper
- .find( '[aria-label="WordPress"]' )
- .hostNodes();
- button.simulate( 'click' );
+ const { getByLabelText } = render(
+
+ );
+
+ fireEvent.click( getByLabelText( 'WordPress' ) );
expect( clickHandler ).toHaveBeenCalledTimes( 1 );
} );
} );
diff --git a/packages/components/src/toolbar-group/toolbar-group-collapsed.native.js b/packages/components/src/toolbar-group/toolbar-group-collapsed.native.js
index a890645928854a..411a4e6edbd604 100644
--- a/packages/components/src/toolbar-group/toolbar-group-collapsed.native.js
+++ b/packages/components/src/toolbar-group/toolbar-group-collapsed.native.js
@@ -1,10 +1,36 @@
+/**
+ * External dependencies
+ */
+import { View } from 'react-native';
+/**
+ * WordPress dependencies
+ */
+import { withPreferredColorScheme } from '@wordpress/compose';
/**
* Internal dependencies
*/
import DropdownMenu from '../dropdown-menu';
+import styles from './style.scss';
-function ToolbarGroupCollapsed( { controls = [], ...props } ) {
- return ;
+function ToolbarGroupCollapsed( {
+ controls = [],
+ getStylesFromColorScheme,
+ passedStyle,
+ ...props
+} ) {
+ return (
+
+
+
+ );
}
-export default ToolbarGroupCollapsed;
+export default withPreferredColorScheme( ToolbarGroupCollapsed );
diff --git a/packages/components/src/toolbar/stories/index.js b/packages/components/src/toolbar/stories/index.js
index d4edace706f17a..2749329089b775 100644
--- a/packages/components/src/toolbar/stories/index.js
+++ b/packages/components/src/toolbar/stories/index.js
@@ -126,3 +126,57 @@ export const withoutGroup = () => {
);
};
/* eslint-enable no-restricted-syntax */
+
+export const toolbars = () => {
+ return (
+
+
+
Icon-only Toolbar
+
+
+
+
+
+
+
+
+
Text-only Toolbar
+
+ Bold Format
+ Italic Format
+ Link Format
+
+
+
+
+
Text and Icon Toolbar
+
+
+ Bold Format
+
+ Italic Format
+
+ Link Format
+
+
+
+
+
Single Icon Button Toolbar
+
+
+
+
+
+
+
Single Text Button toolbar
+
+ Bold Toolbar
+
+
+
+ );
+};
diff --git a/packages/components/src/toolbar/style.scss b/packages/components/src/toolbar/style.scss
index 2dc89b9b4e5f8f..fdbcccb3f20294 100644
--- a/packages/components/src/toolbar/style.scss
+++ b/packages/components/src/toolbar/style.scss
@@ -1,11 +1,106 @@
.components-accessible-toolbar {
- // Required for IE11.
display: inline-flex;
+ border: $border-width solid $dark-gray-primary;
+ border-radius: $radius-block-ui;
+ flex-shrink: 0;
- // IE11 doesn't read rules inside this query. They are applied only to modern browsers.
- @supports (position: sticky) {
- display: flex;
+ .components-toolbar-group:last-child {
+ border-right: none;
}
+}
- flex-shrink: 0;
+.components-accessible-toolbar,
+.components-toolbar {
+ .components-button {
+ position: relative;
+ height: $block-toolbar-height;
+ z-index: 1;
+
+ // Give all buttons extra padding to fit text.
+ padding-left: $grid-unit-20;
+ padding-right: $grid-unit-20;
+
+ // Don't show the focus inherited by the Button component.
+ &:focus:enabled {
+ box-shadow: none;
+ outline: none;
+ }
+
+ // Focus and toggle pseudo elements.
+ &::before {
+ content: "";
+ position: absolute;
+ display: block;
+ border-radius: $radius-block-ui;
+ height: 32px;
+ min-width: 32px;
+
+ // Position the focus rectangle.
+ left: $grid-unit-10;
+ right: $grid-unit-10;
+ z-index: -1;
+
+ // Animate in.
+ animation: components-button__appear-animation 0.1s ease;
+ animation-fill-mode: forwards;
+ @include reduce-motion("animation");
+ }
+
+ svg {
+ position: relative;
+
+ // Center the icon inside.
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ // Toggled style.
+ &.is-pressed {
+ background: transparent;
+
+ &:hover {
+ background: transparent;
+ }
+
+ &::before {
+ background: $dark-gray-primary;
+ }
+ }
+
+ // Focus style.
+ &:focus::before {
+ @include block-toolbar-button-style__focus();
+ }
+
+ // Ensure the icon buttons remain square.
+ &.has-icon {
+ // Reduce the default padding when a button only has an icon.
+ padding-left: $grid-unit-10;
+ padding-right: $grid-unit-10;
+ min-width: $block-toolbar-height;
+ justify-content: center;
+ }
+
+ // @todo: We should extract the tabs styles to the tabs component itself
+ &.components-tab-button {
+ font-weight: 500;
+
+ span {
+ display: inline-block;
+ padding-left: 0;
+ padding-right: 0;
+ position: relative;
+ }
+ }
+ }
+}
+
+
+@keyframes components-button__appear-animation {
+ from {
+ transform: scaleY(0);
+ }
+ to {
+ transform: scaleY(1);
+ }
}
diff --git a/packages/components/src/toolbar/test/index.js b/packages/components/src/toolbar/test/index.js
index 748d8a500fc600..d5de14b4a86c57 100644
--- a/packages/components/src/toolbar/test/index.js
+++ b/packages/components/src/toolbar/test/index.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import { mount } from 'enzyme';
+import { render } from '@testing-library/react';
/**
* Internal dependencies
@@ -12,51 +12,60 @@ import ToolbarButton from '../../toolbar-button';
describe( 'Toolbar', () => {
describe( 'basic rendering', () => {
it( 'should render a toolbar with toolbar buttons', () => {
- const wrapper = mount(
+ const { getByLabelText } = render(
);
- const control1 = wrapper.find( 'button[aria-label="control1"]' );
- const control2 = wrapper.find( 'button[aria-label="control1"]' );
- expect( control1 ).toHaveLength( 1 );
- expect( control2 ).toHaveLength( 1 );
+
+ expect(
+ getByLabelText( 'control1', { selector: 'button' } )
+ ).toBeTruthy();
+ expect(
+ getByLabelText( 'control2', { selector: 'button' } )
+ ).toBeTruthy();
} );
} );
describe( 'ToolbarGroup', () => {
it( 'should render an empty node, when controls are not passed', () => {
- const wrapper = mount( );
- expect( wrapper.html() ).toBeNull();
+ const { container } = render( );
+
+ expect( container.innerHTML ).toBe( '' );
} );
it( 'should render an empty node, when controls are empty', () => {
- const wrapper = mount( );
- expect( wrapper.html() ).toBeNull();
+ const { container } = render( );
+
+ expect( container.innerHTML ).toBe( '' );
} );
it( 'should render a list of controls with buttons', () => {
- const clickHandler = ( event ) => event;
const controls = [
{
icon: 'wordpress',
title: 'WordPress',
subscript: 'wp',
- onClick: clickHandler,
+ onClick: () => {},
isActive: false,
},
];
- const wrapper = mount( );
- const button = wrapper
- .find( '[aria-label="WordPress"]' )
- .hostNodes();
- expect( button.props() ).toMatchObject( {
- 'aria-label': 'WordPress',
- 'aria-pressed': false,
- 'data-subscript': 'wp',
- type: 'button',
- } );
+ const { getByLabelText } = render(
+
+ );
+
+ const toolbarButton = getByLabelText( 'WordPress' );
+ expect( toolbarButton.getAttribute( 'aria-label' ) ).toBe(
+ 'WordPress'
+ );
+ expect( toolbarButton.getAttribute( 'aria-pressed' ) ).toBe(
+ 'false'
+ );
+ expect( toolbarButton.getAttribute( 'data-subscript' ) ).toBe(
+ 'wp'
+ );
+ expect( toolbarButton.getAttribute( 'type' ) ).toBe( 'button' );
} );
} );
} );
diff --git a/packages/components/src/toolbar/toolbar-container.js b/packages/components/src/toolbar/toolbar-container.js
index d40843ddab3f3f..2ea7cfc7fee8c9 100644
--- a/packages/components/src/toolbar/toolbar-container.js
+++ b/packages/components/src/toolbar/toolbar-container.js
@@ -15,7 +15,9 @@ import ToolbarContext from '../toolbar-context';
function ToolbarContainer( { accessibilityLabel, ...props }, ref ) {
// https://reakit.io/docs/basic-concepts/#state-hooks
- const toolbarState = useToolbarState( { loop: true } );
+ // Passing baseId for server side rendering (which includes snapshots)
+ // If an id prop is passed to Toolbar, toolbar items will use it as a base for their ids
+ const toolbarState = useToolbarState( { loop: true, baseId: props.id } );
return (
// This will provide state for `ToolbarButton`'s
diff --git a/packages/components/src/tree-select/stories/index.js b/packages/components/src/tree-select/stories/index.js
new file mode 100644
index 00000000000000..c4f299bde2b4cf
--- /dev/null
+++ b/packages/components/src/tree-select/stories/index.js
@@ -0,0 +1,77 @@
+/**
+ * External dependencies
+ */
+import { boolean, object, text } from '@storybook/addon-knobs';
+
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import TreeSelect from '../';
+
+export default {
+ title: 'Components/TreeSelect',
+ component: TreeSelect,
+};
+
+const TreeSelectWithState = ( props ) => {
+ const [ selection, setSelection ] = useState();
+
+ return (
+
+ );
+};
+
+export const _default = () => {
+ const label = text( 'Label', 'Label Text' );
+ const noOptionLabel = text( 'No Option Label', 'No parent page' );
+ const hideLabelFromVision = boolean( 'Hide Label From Vision', false );
+ const help = text(
+ 'Help Text',
+ 'Help text to explain the select control.'
+ );
+ const tree = object( 'Tree', [
+ {
+ name: 'Page 1',
+ id: 'p1',
+ children: [
+ { name: 'Descend 1 of page 1', id: 'p11' },
+ { name: 'Descend 2 of page 1', id: 'p12' },
+ ],
+ },
+ {
+ name: 'Page 2',
+ id: 'p2',
+ children: [
+ {
+ name: 'Descend 1 of page 2',
+ id: 'p21',
+ children: [
+ {
+ name: 'Descend 1 of Descend 1 of page 2',
+ id: 'p211',
+ },
+ ],
+ },
+ ],
+ },
+ ] );
+
+ return (
+
+ );
+};
diff --git a/packages/components/src/unit-control/README.md b/packages/components/src/unit-control/README.md
new file mode 100644
index 00000000000000..79100d9cfe4fcb
--- /dev/null
+++ b/packages/components/src/unit-control/README.md
@@ -0,0 +1,37 @@
+# UnitControl
+
+UnitControl allows the user to set a value as well as a unit (e.g. `px`).
+
+## Usage
+
+```jsx
+import { __experimentalUnitControl as UnitControl } from '@wordpress/components';
+import { useState } from '@wordpress/element';
+
+const Example = () => {
+ const [value, setValue] = useState(10);
+ const [unit, setUnit] = useState('px');
+
+ return (
+
+ )
+};
+```
+
+## Props
+
+Name | Type | Default | Description
+--- | --- | --- | ---
+`isUnitSelectTabbable` | `boolean` | `true` | Determines if the unit `` is tabbable.
+`label` | `string` | | Aria label for the control.
+`onChange` | `Function` | `noop` | Callback when the `value` changes.
+`onUnitChange` | `Function` | `noop` | Callback when the `unit` changes.
+`size` | `string` | `default` | Determines the height of the control.
+`unit` | `string` | `px` | Current unit value.
+`units` | `Array` | | Collection of available units.
+`value` | `number` | | Current number value.
\ No newline at end of file
diff --git a/packages/components/src/unit-control/index.js b/packages/components/src/unit-control/index.js
new file mode 100644
index 00000000000000..7276b10141a55f
--- /dev/null
+++ b/packages/components/src/unit-control/index.js
@@ -0,0 +1,61 @@
+/**
+ * External dependencies
+ */
+import { isUndefined, noop } from 'lodash';
+import classnames from 'classnames';
+/**
+ * Internal dependencies
+ */
+import { Root, ValueInput } from './styles/unit-control-styles';
+import UnitSelectControl from './unit-select-control';
+import { CSS_UNITS } from './utils';
+
+export default function UnitControl( {
+ className,
+ isUnitSelectTabbable = true,
+ isResetValueOnUnitChange = true,
+ label,
+ onChange = noop,
+ onUnitChange = noop,
+ size = 'default',
+ style,
+ unit = 'px',
+ units = CSS_UNITS,
+ value,
+ ...props
+} ) {
+ const handleOnUnitChange = ( unitValue, changeProps ) => {
+ const { data } = changeProps;
+ onUnitChange( unitValue, changeProps );
+
+ if ( isResetValueOnUnitChange && ! isUndefined( data.default ) ) {
+ onChange( data.default, changeProps );
+ }
+ };
+
+ const classes = classnames( 'component-unit-control', className );
+
+ return (
+
+
+
+
+ );
+}
+
+UnitControl.__defaultUnits = CSS_UNITS;
diff --git a/packages/components/src/unit-control/stories/index.js b/packages/components/src/unit-control/stories/index.js
new file mode 100644
index 00000000000000..bf5680c6ae630f
--- /dev/null
+++ b/packages/components/src/unit-control/stories/index.js
@@ -0,0 +1,60 @@
+/**
+ * External dependencies
+ */
+import { boolean, number, select } from '@storybook/addon-knobs';
+import styled from '@emotion/styled';
+
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import UnitControl from '../';
+
+export default {
+ title: 'Components/UnitControl',
+ component: UnitControl,
+};
+
+function Example() {
+ const [ value, setValue ] = useState( '' );
+ const [ unit, setUnit ] = useState( 'px' );
+
+ const props = {
+ isShiftStepEnabled: boolean( 'isShiftStepEnabled', true ),
+ isUnitSelectTabbable: boolean( 'isUnitSelectTabbable', true ),
+ shiftStep: number( 'shiftStep', 10 ),
+ size: select(
+ 'size',
+ {
+ default: 'default',
+ small: 'small',
+ },
+ 'default'
+ ),
+ step: number( 'step', 1 ),
+ };
+
+ return (
+
+
+
+ );
+}
+
+export const _default = () => {
+ return ;
+};
+
+const ControlWrapperView = styled.div`
+ max-width: 80px;
+`;
diff --git a/packages/components/src/unit-control/styles/unit-control-styles.js b/packages/components/src/unit-control/styles/unit-control-styles.js
new file mode 100644
index 00000000000000..eb17bdf1d87fb8
--- /dev/null
+++ b/packages/components/src/unit-control/styles/unit-control-styles.js
@@ -0,0 +1,153 @@
+/**
+ * External dependencies
+ */
+import { css } from '@emotion/core';
+import styled from '@emotion/styled';
+/**
+ * Internal dependencies
+ */
+import { color, rtl } from '../../utils/style-mixins';
+import NumberControl from '../../number-control';
+
+export const Root = styled.div`
+ box-sizing: border-box;
+ position: relative;
+`;
+
+const fontSizeStyles = ( { size } ) => {
+ const sizes = {
+ default: null,
+ small: '11px',
+ };
+
+ const fontSize = sizes[ size ];
+
+ if ( ! fontSize ) return '';
+
+ return css`
+ @media ( min-width: 600px ) {
+ font-size: ${fontSize};
+ }
+ `;
+};
+
+const sizeStyles = ( { size } ) => {
+ const sizes = {
+ default: {
+ height: 30,
+ lineHeight: 30,
+ minHeight: 30,
+ },
+ small: {
+ height: 24,
+ lineHeight: 24,
+ minHeight: 24,
+ },
+ };
+
+ const style = sizes[ size ] || sizes.default;
+
+ return css( style );
+};
+
+// TODO: Resolve need to use &&& to increase specificity
+// https://github.com/WordPress/gutenberg/issues/18483
+
+export const ValueInput = styled( NumberControl )`
+ &&& {
+ appearance: none;
+ -moz-appearance: textfield;
+ box-sizing: border-box;
+ border: 1px solid ${color( 'ui.border' )};
+ border-radius: 2px;
+ padding: 3px 8px;
+ display: block;
+ width: 100%;
+
+ &::-webkit-outer-spin-button,
+ &::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+ }
+
+ ${rtl( { paddingRight: 20 } )}
+ ${fontSizeStyles};
+ ${sizeStyles};
+ }
+`;
+
+const unitSizeStyles = ( { size } ) => {
+ const sizes = {
+ default: {
+ top: 5,
+ height: 20,
+ minHeight: 20,
+ },
+ small: {
+ top: 4,
+ height: 16,
+ minHeight: 16,
+ },
+ };
+
+ return css( sizes[ size ] );
+};
+
+const baseUnitLabelStyles = ( props ) => {
+ return css`
+ appearance: none;
+ background: ${color( 'ui.background' )};
+ border-radius: 2px;
+ border: none;
+ box-sizing: border-box;
+ color: ${color( 'darkGray.500' )};
+ display: block;
+ font-size: 8px;
+ line-height: 1;
+ letter-spacing: -0.5px;
+ outline: none;
+ padding: 2px 2px;
+ position: absolute;
+ text-align-last: center;
+ text-transform: uppercase;
+ width: 22px;
+ z-index: 1;
+
+ ${rtl( { right: 4 } )()}
+ ${unitSizeStyles( props )}
+ `;
+};
+
+const unitLabelPaddingStyles = ( { size } ) => {
+ const sizes = {
+ default: '6px 2px',
+ small: '4px 2px',
+ };
+
+ return css( { padding: sizes[ size ] } );
+};
+
+export const UnitLabel = styled.div`
+ &&& {
+ ${baseUnitLabelStyles};
+ ${unitLabelPaddingStyles};
+ }
+`;
+
+export const UnitSelect = styled.select`
+ &&& {
+ ${baseUnitLabelStyles};
+ cursor: pointer;
+ border: 1px solid transparent;
+
+ &:hover {
+ background-color: ${color( 'lightGray.300' )};
+ }
+
+ &:focus {
+ border-color: ${color( 'ui.borderFocus' )};
+ outline: 2px solid transparent;
+ outline-offset: 0;
+ }
+ }
+`;
diff --git a/packages/components/src/unit-control/test/index.js b/packages/components/src/unit-control/test/index.js
new file mode 100644
index 00000000000000..32bad94884076d
--- /dev/null
+++ b/packages/components/src/unit-control/test/index.js
@@ -0,0 +1,283 @@
+/**
+ * External dependencies
+ */
+import { render, unmountComponentAtNode } from 'react-dom';
+import { act, Simulate } from 'react-dom/test-utils';
+
+/**
+ * WordPress dependencies
+ */
+import { UP, DOWN } from '@wordpress/keycodes';
+
+/**
+ * Internal dependencies
+ */
+import UnitControl from '../';
+
+let container = null;
+
+beforeEach( () => {
+ container = document.createElement( 'div' );
+ document.body.appendChild( container );
+} );
+
+afterEach( () => {
+ unmountComponentAtNode( container );
+ container.remove();
+ container = null;
+} );
+
+const getComponent = () => container.querySelector( '.component-unit-control' );
+const getInput = () =>
+ container.querySelector( '.component-unit-control__input' );
+const getSelect = () =>
+ container.querySelector( '.component-unit-control__select' );
+
+describe( 'UnitControl', () => {
+ describe( 'Basic rendering', () => {
+ it( 'should render', () => {
+ act( () => {
+ render( , container );
+ } );
+ const input = getInput();
+ const select = getSelect();
+
+ expect( input ).toBeTruthy();
+ expect( select ).toBeTruthy();
+ } );
+
+ it( 'should render custom className', () => {
+ act( () => {
+ render( , container );
+ } );
+
+ const el = getComponent();
+
+ expect( el.classList.contains( 'hello' ) ).toBe( true );
+ } );
+
+ it( 'should not render select, if units are disabled', () => {
+ act( () => {
+ render( , container );
+ } );
+ const input = getInput();
+ const select = getSelect();
+
+ expect( input ).toBeTruthy();
+ expect( select ).toBeFalsy();
+ } );
+ } );
+
+ describe( 'Value', () => {
+ it( 'should update value on change', () => {
+ let state = 50;
+ const setState = ( nextState ) => ( state = nextState );
+
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const input = getInput();
+
+ act( () => {
+ Simulate.change( input, { target: { value: 62 } } );
+ } );
+
+ expect( state ).toBe( 62 );
+ } );
+
+ it( 'should increment value on UP press', () => {
+ let state = 50;
+ const setState = ( nextState ) => ( state = nextState );
+
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const input = getInput();
+
+ act( () => {
+ Simulate.keyDown( input, { keyCode: UP } );
+ } );
+
+ expect( state ).toBe( '51' );
+ } );
+
+ it( 'should increment value on UP + SHIFT press, with step', () => {
+ let state = 50;
+ const setState = ( nextState ) => ( state = nextState );
+
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const input = getInput();
+
+ act( () => {
+ Simulate.keyDown( input, { keyCode: UP, shiftKey: true } );
+ } );
+
+ expect( state ).toBe( '60' );
+ } );
+
+ it( 'should decrement value on DOWN press', () => {
+ let state = 50;
+ const setState = ( nextState ) => ( state = nextState );
+
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const input = getInput();
+
+ act( () => {
+ Simulate.keyDown( input, { keyCode: DOWN } );
+ } );
+
+ expect( state ).toBe( '49' );
+ } );
+
+ it( 'should decrement value on DOWN + SHIFT press, with step', () => {
+ let state = 50;
+ const setState = ( nextState ) => ( state = nextState );
+
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const input = getInput();
+
+ act( () => {
+ Simulate.keyDown( input, { keyCode: DOWN, shiftKey: true } );
+ } );
+
+ expect( state ).toBe( '40' );
+ } );
+ } );
+
+ describe( 'Unit', () => {
+ it( 'should update unit value on change', () => {
+ let state = 'px';
+ const setState = ( nextState ) => ( state = nextState );
+
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const select = getSelect();
+
+ act( () => {
+ Simulate.change( select, { target: { value: 'em' } } );
+ } );
+
+ expect( state ).toBe( 'em' );
+ } );
+
+ it( 'should render customized units, if defined', () => {
+ const units = [
+ { value: 'pt', label: 'pt', default: 0 },
+ { value: 'vmax', label: 'vmax', default: 10 },
+ ];
+ act( () => {
+ render( , container );
+ } );
+
+ const select = getSelect();
+ const options = select.querySelectorAll( 'option' );
+
+ expect( options.length ).toBe( 2 );
+
+ const [ pt, vmax ] = options;
+
+ expect( pt.value ).toBe( 'pt' );
+ expect( vmax.value ).toBe( 'vmax' );
+ } );
+
+ it( 'should reset value on unit change, if unit has default value', () => {
+ let state = 50;
+ const setState = ( nextState ) => ( state = nextState );
+
+ const units = [
+ { value: 'pt', label: 'pt', default: 25 },
+ { value: 'vmax', label: 'vmax', default: 75 },
+ ];
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const select = getSelect();
+
+ act( () => {
+ Simulate.change( select, { target: { value: 'vmax' } } );
+ } );
+
+ expect( state ).toBe( 75 );
+
+ act( () => {
+ Simulate.change( select, { target: { value: 'pt' } } );
+ } );
+
+ expect( state ).toBe( 25 );
+ } );
+
+ it( 'should not reset value on unit change, if disabled', () => {
+ let state = 50;
+ const setState = ( nextState ) => ( state = nextState );
+
+ const units = [
+ { value: 'pt', label: 'pt', default: 25 },
+ { value: 'vmax', label: 'vmax', default: 75 },
+ ];
+ act( () => {
+ render(
+ ,
+ container
+ );
+ } );
+
+ const select = getSelect();
+
+ act( () => {
+ Simulate.change( select, { target: { value: 'vmax' } } );
+ } );
+
+ expect( state ).toBe( 50 );
+
+ act( () => {
+ Simulate.change( select, { target: { value: 'pt' } } );
+ } );
+
+ expect( state ).toBe( 50 );
+ } );
+ } );
+} );
diff --git a/packages/components/src/unit-control/unit-select-control.js b/packages/components/src/unit-control/unit-select-control.js
new file mode 100644
index 00000000000000..6844b5c959963a
--- /dev/null
+++ b/packages/components/src/unit-control/unit-select-control.js
@@ -0,0 +1,55 @@
+/**
+ * External dependencies
+ */
+import { noop, isEmpty } from 'lodash';
+import classnames from 'classnames';
+
+/**
+ * Internal dependencies
+ */
+import { UnitSelect, UnitLabel } from './styles/unit-control-styles';
+import { CSS_UNITS } from './utils';
+
+/**
+ * Renders a `select` if there are multiple units.
+ * Otherwise, renders a non-selectable label.
+ */
+export default function UnitSelectControl( {
+ className,
+ isTabbable = true,
+ options = CSS_UNITS,
+ onChange = noop,
+ size = 'default',
+ value = 'px',
+ ...props
+} ) {
+ if ( isEmpty( options ) || options.length === 1 || options === false ) {
+ return { value } ;
+ }
+
+ const handleOnChange = ( event ) => {
+ const { value: unitValue } = event.target;
+ const data = options.find( ( option ) => option.value === unitValue );
+
+ onChange( unitValue, { event, data } );
+ };
+
+ const classes = classnames( 'component-unit-control__select', className );
+
+ return (
+
+ { options.map( ( option ) => (
+
+ { option.label }
+
+ ) ) }
+
+ );
+}
diff --git a/packages/components/src/unit-control/utils.js b/packages/components/src/unit-control/utils.js
new file mode 100644
index 00000000000000..aa886479f27d2a
--- /dev/null
+++ b/packages/components/src/unit-control/utils.js
@@ -0,0 +1,8 @@
+export const CSS_UNITS = [
+ { value: 'px', label: 'px', default: 0 },
+ { value: '%', label: '%', default: 10 },
+ { value: 'em', label: 'em', default: 0 },
+ { value: 'rem', label: 'rem', default: 0 },
+ { value: 'vw', label: 'vw', default: 10 },
+ { value: 'vh', label: 'vh', default: 10 },
+];
diff --git a/packages/components/src/utils/colors-values.js b/packages/components/src/utils/colors-values.js
index 537a8e7810300b..7e152a4263cc8f 100644
--- a/packages/components/src/utils/colors-values.js
+++ b/packages/components/src/utils/colors-values.js
@@ -1,12 +1,44 @@
+/**
+ * External dependencies
+ */
+import { merge } from 'lodash';
+
/**
* Internal dependencies
*/
import { rgba } from './colors';
+
export const BASE = {
black: '#000',
white: '#fff',
};
+/**
+ * TODO: Continue to update values as "G2" design evolves.
+ *
+ * "G2" refers to the movement to advance the interface of the block editor.
+ * https://github.com/WordPress/gutenberg/issues/18667
+ */
+export const G2 = {
+ blue: {
+ medium: {
+ focus: '#007cba',
+ focusDark: '#fff',
+ },
+ },
+ darkGray: {
+ primary: '#1e1e1e',
+ },
+ mediumGray: {
+ text: '#757575',
+ },
+ lightGray: {
+ ui: '#949494',
+ secondary: '#ccc',
+ tertiary: '#e7e8e9',
+ },
+};
+
export const DARK_GRAY = {
900: '#191e23',
800: '#23282d',
@@ -101,15 +133,24 @@ export const ALERT = {
green: '#4ab866',
};
+// Namespaced values for raw colors hex codes
+export const UI = {
+ background: BASE.white,
+ border: BASE.black,
+ borderFocus: BLUE.medium.focus,
+};
+
export const COLORS = {
...BASE,
- darkGray: DARK_GRAY,
+ darkGray: merge( {}, DARK_GRAY, G2.darkGray ),
darkOpacity: DARK_OPACITY,
darkOpacityLight: DARK_OPACITY_LIGHT,
- lightGray: LIGHT_GRAY,
+ mediumGray: G2.mediumGray,
+ lightGray: merge( {}, LIGHT_GRAY, G2.lightGray ),
lightGrayLight: LIGHT_OPACITY_LIGHT,
- blue: BLUE,
+ blue: merge( {}, BLUE, G2.blue ),
alert: ALERT,
+ ui: UI,
};
export default COLORS;
diff --git a/packages/components/src/utils/reduce-motion.js b/packages/components/src/utils/reduce-motion.js
index b3651d494c66eb..16b79b37944309 100644
--- a/packages/components/src/utils/reduce-motion.js
+++ b/packages/components/src/utils/reduce-motion.js
@@ -2,7 +2,7 @@
* Allows users to opt-out of animations via OS-level preferences.
*
* @param {string} prop CSS Property name
- * @return {string}
+ * @return {string} Generated CSS code for the reduced style
*/
export function reduceMotion( prop = 'transition' ) {
let style;
diff --git a/packages/components/src/utils/rtl.js b/packages/components/src/utils/rtl.js
index 3fa6c3757737a9..bc312455baa3a6 100644
--- a/packages/components/src/utils/rtl.js
+++ b/packages/components/src/utils/rtl.js
@@ -2,48 +2,84 @@
* External dependencies
*/
import { css } from '@emotion/core';
+import { mapKeys } from 'lodash';
+const LOWER_LEFT_REGEXP = new RegExp( /-left/g );
+const LOWER_RIGHT_REGEXP = new RegExp( /-right/g );
+const UPPER_LEFT_REGEXP = new RegExp( /Left/g );
+const UPPER_RIGHT_REGEXP = new RegExp( /Right/g );
+
+/**
+ * Checks to see whether the document is set to rtl.
+ *
+ * @return {boolean} Whether document is RTL.
+ */
function getRtl() {
return !! ( document && document.documentElement.dir === 'rtl' );
}
/**
* Simple hook to retrieve RTL direction value
+ *
+ * @return {boolean} Whether document is RTL.
*/
export function useRtl() {
return getRtl();
}
+/**
+ * Flips a CSS property from left <-> right.
+ *
+ * @param {string} key The CSS property name.
+ *
+ * @return {string} The flipped CSS property name, if applicable.
+ */
+function getConvertedKey( key ) {
+ if ( key === 'left' ) {
+ return 'right';
+ }
+
+ if ( key === 'right' ) {
+ return 'left';
+ }
+
+ if ( LOWER_LEFT_REGEXP.test( key ) ) {
+ return key.replace( LOWER_LEFT_REGEXP, '-right' );
+ }
+
+ if ( LOWER_RIGHT_REGEXP.test( key ) ) {
+ return key.replace( LOWER_RIGHT_REGEXP, '-left' );
+ }
+
+ if ( UPPER_LEFT_REGEXP.test( key ) ) {
+ return key.replace( UPPER_LEFT_REGEXP, 'Right' );
+ }
+
+ if ( UPPER_RIGHT_REGEXP.test( key ) ) {
+ return key.replace( UPPER_RIGHT_REGEXP, 'Left' );
+ }
+
+ return key;
+}
+
/**
* An incredibly basic ltr -> rtl converter for style properties
*
* @param {Object} ltrStyles
+ *
* @return {Object} Converted ltr -> rtl styles
*/
-const convertLtrToRtl = ( ltrStyles = {} ) => {
- const nextStyles = {};
-
- for ( const key in ltrStyles ) {
- const value = ltrStyles[ key ];
- let nextKey = key;
- if ( /left/gi.test( key ) ) {
- nextKey = [ key.replace( 'left', 'right' ) ];
- }
- if ( /Left/gi.test( key ) ) {
- nextKey = [ key.replace( 'Left', 'Right' ) ];
- }
- nextStyles[ nextKey ] = value;
- }
-
- return nextStyles;
+export const convertLTRToRTL = ( ltrStyles = {} ) => {
+ return mapKeys( ltrStyles, ( _value, key ) => getConvertedKey( key ) );
};
/**
- * An incredibly basic ltr -> rtl style converter for CSS objects.
+ * A higher-order function that create an incredibly basic ltr -> rtl style converter for CSS objects.
*
* @param {Object} ltrStyles Ltr styles. Converts and renders from ltr -> rtl styles, if applicable.
* @param {null|Object} rtlStyles Rtl styles. Renders if provided.
- * @return {Object} Rendered CSS styles for Emotion's renderer
+ *
+ * @return {Function} A function to output CSS styles for Emotion's renderer
*/
export function rtl( ltrStyles = {}, rtlStyles ) {
return () => {
@@ -53,6 +89,6 @@ export function rtl( ltrStyles = {}, rtlStyles ) {
return isRtl ? css( rtlStyles ) : css( ltrStyles );
}
- return isRtl ? css( convertLtrToRtl( ltrStyles ) ) : css( ltrStyles );
+ return isRtl ? css( convertLTRToRTL( ltrStyles ) ) : css( ltrStyles );
};
}
diff --git a/packages/components/src/utils/test/rtl.js b/packages/components/src/utils/test/rtl.js
new file mode 100644
index 00000000000000..1e30162037087a
--- /dev/null
+++ b/packages/components/src/utils/test/rtl.js
@@ -0,0 +1,124 @@
+/**
+ * Internal dependencies
+ */
+import { convertLTRToRTL } from '../rtl';
+
+describe( 'convertLTRToRTL', () => {
+ it( 'converts (*)Left <-> (*)Right', () => {
+ const style = {
+ // left values
+ borderLeft: '10px solid red',
+ borderLeftColor: 'red',
+ borderLeftStyle: 'solid',
+ borderLeftWidth: 10,
+ borderTopLeftRadius: 10,
+ marginLeft: 10,
+ scrollMarginLeft: 10,
+ scrollPaddingLeft: 10,
+ // right values
+ paddingLeft: 10,
+ borderRight: '20px solid blue',
+ borderRightColor: 'blue',
+ borderRightStyle: 'dashed',
+ borderRightWidth: 20,
+ borderTopRightRadius: 20,
+ marginRight: 20,
+ paddingRight: 20,
+ scrollMarginRight: 20,
+ scrollPaddingRight: 20,
+ // edge cases
+ textCombineUpright: 'none',
+ };
+ const nextStyle = convertLTRToRTL( style );
+
+ expect( Object.keys( style ).length ).toBe(
+ Object.keys( nextStyle ).length
+ );
+
+ // Left -> Right
+ expect( nextStyle.borderRight ).toBe( '10px solid red' );
+ expect( nextStyle.borderRightColor ).toBe( 'red' );
+ expect( nextStyle.borderRightStyle ).toBe( 'solid' );
+ expect( nextStyle.borderRightWidth ).toBe( 10 );
+ expect( nextStyle.borderTopRightRadius ).toBe( 10 );
+ expect( nextStyle.marginRight ).toBe( 10 );
+ expect( nextStyle.paddingRight ).toBe( 10 );
+ expect( nextStyle.scrollMarginRight ).toBe( 10 );
+ expect( nextStyle.scrollPaddingRight ).toBe( 10 );
+
+ // Right -> Left
+ expect( nextStyle.borderLeft ).toBe( '20px solid blue' );
+ expect( nextStyle.borderLeftColor ).toBe( 'blue' );
+ expect( nextStyle.borderLeftStyle ).toBe( 'dashed' );
+ expect( nextStyle.borderLeftWidth ).toBe( 20 );
+ expect( nextStyle.borderTopLeftRadius ).toBe( 20 );
+ expect( nextStyle.marginLeft ).toBe( 20 );
+ expect( nextStyle.paddingLeft ).toBe( 20 );
+ expect( nextStyle.scrollMarginLeft ).toBe( 20 );
+ expect( nextStyle.scrollPaddingLeft ).toBe( 20 );
+
+ // Edge cases
+ expect( nextStyle.textCombineUpright ).toBe( 'none' );
+ } );
+
+ it( 'converts (*)left <-> (*)right', () => {
+ const style = {
+ // left values
+ 'border-left': '10px solid red',
+ 'border-left-color': 'red',
+ 'border-left-style': 'solid',
+ 'border-left-width': 10,
+ 'border-top-left-radius': 10,
+ 'margin-left': 10,
+ 'padding-left': 10,
+ 'scroll-margin-left': 10,
+ 'scroll-padding-left': 10,
+ left: 10,
+ // right values
+ 'border-right': '20px solid blue',
+ 'border-right-color': 'blue',
+ 'border-right-style': 'dashed',
+ 'border-right-width': 20,
+ 'border-top-right-radius': 20,
+ 'margin-right': 20,
+ 'padding-right': 20,
+ 'scroll-margin-right': 20,
+ 'scroll-padding-right': 20,
+ right: 20,
+ // edge cases
+ 'text-combine-upright': 'none',
+ };
+ const nextStyle = convertLTRToRTL( style );
+
+ expect( Object.keys( style ).length ).toBe(
+ Object.keys( nextStyle ).length
+ );
+
+ // left -> right
+ expect( nextStyle[ 'border-right' ] ).toBe( '10px solid red' );
+ expect( nextStyle[ 'border-right-color' ] ).toBe( 'red' );
+ expect( nextStyle[ 'border-right-style' ] ).toBe( 'solid' );
+ expect( nextStyle[ 'border-right-width' ] ).toBe( 10 );
+ expect( nextStyle[ 'border-top-right-radius' ] ).toBe( 10 );
+ expect( nextStyle[ 'margin-right' ] ).toBe( 10 );
+ expect( nextStyle[ 'padding-right' ] ).toBe( 10 );
+ expect( nextStyle[ 'scroll-margin-right' ] ).toBe( 10 );
+ expect( nextStyle[ 'scroll-padding-right' ] ).toBe( 10 );
+ expect( nextStyle.right ).toBe( 10 );
+
+ // right -> left
+ expect( nextStyle[ 'border-left' ] ).toBe( '20px solid blue' );
+ expect( nextStyle[ 'border-left-color' ] ).toBe( 'blue' );
+ expect( nextStyle[ 'border-left-style' ] ).toBe( 'dashed' );
+ expect( nextStyle[ 'border-left-width' ] ).toBe( 20 );
+ expect( nextStyle[ 'border-top-left-radius' ] ).toBe( 20 );
+ expect( nextStyle[ 'margin-left' ] ).toBe( 20 );
+ expect( nextStyle[ 'padding-left' ] ).toBe( 20 );
+ expect( nextStyle[ 'scroll-margin-left' ] ).toBe( 20 );
+ expect( nextStyle[ 'scroll-padding-left' ] ).toBe( 20 );
+ expect( nextStyle.left ).toBe( 20 );
+
+ // Edge cases
+ expect( nextStyle[ 'text-combine-upright' ] ).toBe( 'none' );
+ } );
+} );
diff --git a/packages/components/src/visually-hidden/index.js b/packages/components/src/visually-hidden/index.js
index 17ac119ad01ad1..9824ab5106b9be 100644
--- a/packages/components/src/visually-hidden/index.js
+++ b/packages/components/src/visually-hidden/index.js
@@ -1,3 +1,8 @@
+/**
+ * External dependencies
+ */
+import classnames from 'classnames';
+
/**
* Internal dependencies
*/
@@ -7,10 +12,10 @@ import { renderAsRenderProps } from './utils';
* VisuallyHidden component to render text out non-visually
* for use in devices such as a screen reader.
*/
-function VisuallyHidden( { as = 'div', ...props } ) {
+function VisuallyHidden( { as = 'div', className, ...props } ) {
return renderAsRenderProps( {
as,
- className: 'components-visually-hidden',
+ className: classnames( 'components-visually-hidden', className ),
...props,
} );
}
diff --git a/packages/components/src/visually-hidden/stories/index.js b/packages/components/src/visually-hidden/stories/index.js
index aaaa56991cc230..2b45ad1d15121c 100644
--- a/packages/components/src/visually-hidden/stories/index.js
+++ b/packages/components/src/visually-hidden/stories/index.js
@@ -18,3 +18,25 @@ export const _default = () => (
>
);
+
+export const withForwardedProps = () => (
+ <>
+ Additional props can be passed to VisuallyHidden and are forwarded to
+ the rendered element.{ ' ' }
+
+ Check out my data attribute!{ ' ' }
+
+ Inspect the HTML to see!
+ >
+);
+
+export const withAdditionalClassNames = () => (
+ <>
+ Additional class names passed to VisuallyHidden extend the component
+ class name.{ ' ' }
+
+ Check out my class!{ ' ' }
+
+ Inspect the HTML to see!
+ >
+);
diff --git a/packages/compose/README.md b/packages/compose/README.md
index b473af456e8eca..66e6d5dab88206 100644
--- a/packages/compose/README.md
+++ b/packages/compose/README.md
@@ -157,6 +157,30 @@ _Returns_
- `boolean`: Reduced motion preference value.
+# **useResizeObserver**
+
+Hook which allows to listen the resize event of any target element when it changes sizes.
+_Note: `useResizeObserver` will report `null` until after first render_
+
+_Usage_
+
+```js
+const App = () => {
+ const [ resizeListener, sizes ] = useResizeObserver();
+
+ return (
+
+ { resizeListener }
+ Your content here
+
+ );
+};
+```
+
+_Returns_
+
+- `Array`: An array of {Element} `resizeListener` and {?Object} `sizes` with properties `width` and `height`
+
# **useViewportMatch**
Returns true if the viewport matches the given query, or false otherwise.
@@ -164,7 +188,7 @@ Returns true if the viewport matches the given query, or false otherwise.
_Usage_
```js
-useViewportMatch( 'huge', <' );
+useViewportMatch( 'huge', '<' );
useViewportMatch( 'medium' );
```
diff --git a/packages/compose/package.json b/packages/compose/package.json
index 8f677e9c875209..105f18e00cb547 100644
--- a/packages/compose/package.json
+++ b/packages/compose/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/compose",
- "version": "3.11.0",
+ "version": "3.13.1",
"description": "WordPress higher-order components (HOCs).",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -23,11 +23,12 @@
"react-native": "src/index",
"sideEffects": false,
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/element": "file:../element",
"@wordpress/is-shallow-equal": "file:../is-shallow-equal",
"lodash": "^4.17.15",
- "mousetrap": "^1.6.2"
+ "mousetrap": "^1.6.2",
+ "react-resize-aware": "^3.0.0"
},
"publishConfig": {
"access": "public"
diff --git a/packages/compose/src/hooks/use-media-query/index.js b/packages/compose/src/hooks/use-media-query/index.js
index e863503ba940bc..63168c218a6e5f 100644
--- a/packages/compose/src/hooks/use-media-query/index.js
+++ b/packages/compose/src/hooks/use-media-query/index.js
@@ -10,7 +10,10 @@ import { useState, useEffect } from '@wordpress/element';
* @return {boolean} return value of the media query.
*/
export default function useMediaQuery( query ) {
- const [ match, setMatch ] = useState( false );
+ const [ match, setMatch ] = useState(
+ query && window.matchMedia( query ).matches
+ );
+
useEffect( () => {
if ( ! query ) {
return;
diff --git a/packages/compose/src/hooks/use-media-query/test/index.js b/packages/compose/src/hooks/use-media-query/test/index.js
index a256a4b440bec4..b6145debdfc6ca 100644
--- a/packages/compose/src/hooks/use-media-query/test/index.js
+++ b/packages/compose/src/hooks/use-media-query/test/index.js
@@ -33,6 +33,18 @@ describe( 'useMediaQuery', () => {
return `useMediaQuery: ${ queryResult }`;
};
+ it( 'should return true when query matches on the first render', async () => {
+ global.matchMedia.mockReturnValue( {
+ addListener,
+ removeListener,
+ matches: true,
+ } );
+
+ const root = create( );
+
+ expect( root.toJSON() ).toBe( 'useMediaQuery: true' );
+ } );
+
it( 'should return true when query matches', async () => {
global.matchMedia.mockReturnValue( {
addListener,
@@ -55,6 +67,13 @@ describe( 'useMediaQuery', () => {
} );
it( 'should correctly update the value when the query evaluation matches', async () => {
+ // first render
+ global.matchMedia.mockReturnValueOnce( {
+ addListener,
+ removeListener,
+ matches: true,
+ } );
+ // the query within useEffect
global.matchMedia.mockReturnValueOnce( {
addListener,
removeListener,
diff --git a/packages/compose/src/hooks/use-preferred-color-scheme-style/index.native.js b/packages/compose/src/hooks/use-preferred-color-scheme-style/index.native.js
new file mode 100644
index 00000000000000..5e6bfeb9e90d26
--- /dev/null
+++ b/packages/compose/src/hooks/use-preferred-color-scheme-style/index.native.js
@@ -0,0 +1,33 @@
+/**
+ * Internal dependencies
+ */
+import usePreferredColorScheme from '../use-preferred-color-scheme';
+
+/**
+ * Selects which of the passed style objects should be applied depending on the
+ * user's preferred color scheme.
+ *
+ * The "light" color schemed is assumed to be the default, and its styles are
+ * always applied. The "dark" styles will always extend those defined for the
+ * light case.
+ *
+ * @example
+ * const light = { padding: 10, backgroundColor: 'white' };
+ * const dark = { backgroundColor: 'black' };
+ * usePreferredColorSchemeStyle( light, dark);
+ * // On light mode:
+ * // => { padding: 10, backgroundColor: 'white' }
+ * // On dark mode:
+ * // => { padding: 10, backgroundColor: 'black' }
+ * @param {Object} lightStyle
+ * @param {Object} darkStyle
+ * @return {Object} the combined styles depending on the current color scheme
+ */
+const usePreferredColorSchemeStyle = ( lightStyle, darkStyle ) => {
+ const colorScheme = usePreferredColorScheme();
+ const isDarkMode = colorScheme === 'dark';
+
+ return isDarkMode ? { ...lightStyle, ...darkStyle } : lightStyle;
+};
+
+export default usePreferredColorSchemeStyle;
diff --git a/packages/compose/src/hooks/use-preferred-color-scheme/index.android.js b/packages/compose/src/hooks/use-preferred-color-scheme/index.android.js
new file mode 100644
index 00000000000000..6d81eeca5a0852
--- /dev/null
+++ b/packages/compose/src/hooks/use-preferred-color-scheme/index.android.js
@@ -0,0 +1,33 @@
+/**
+ * External dependencies
+ */
+import {
+ subscribePreferredColorScheme,
+ isInitialColorSchemeDark,
+} from 'react-native-gutenberg-bridge';
+/**
+ * WordPress dependencies
+ */
+import { useState, useEffect } from '@wordpress/element';
+
+/**
+ * Returns the color scheme value when it changes. Possible values: [ 'light', 'dark' ]
+ *
+ * @return {string} return current color scheme.
+ */
+const usePreferredColorScheme = function() {
+ const [ currentColorScheme, setCurrentColorScheme ] = useState(
+ isInitialColorSchemeDark ? 'dark' : 'light'
+ );
+ useEffect( () => {
+ subscribePreferredColorScheme( ( { isPreferredColorSchemeDark } ) => {
+ const colorScheme = isPreferredColorSchemeDark ? 'dark' : 'light';
+ if ( colorScheme !== currentColorScheme ) {
+ setCurrentColorScheme( colorScheme );
+ }
+ } );
+ } );
+ return currentColorScheme;
+};
+
+export default usePreferredColorScheme;
diff --git a/packages/compose/src/hooks/use-preferred-color-scheme/index.native.js b/packages/compose/src/hooks/use-preferred-color-scheme/index.ios.js
similarity index 100%
rename from packages/compose/src/hooks/use-preferred-color-scheme/index.native.js
rename to packages/compose/src/hooks/use-preferred-color-scheme/index.ios.js
diff --git a/packages/compose/src/hooks/use-resize-observer/index.js b/packages/compose/src/hooks/use-resize-observer/index.js
new file mode 100644
index 00000000000000..a46539e10438db
--- /dev/null
+++ b/packages/compose/src/hooks/use-resize-observer/index.js
@@ -0,0 +1,28 @@
+/**
+ * External dependencies
+ */
+import useResizeAware from 'react-resize-aware';
+
+/**
+ * Hook which allows to listen the resize event of any target element when it changes sizes.
+ * _Note: `useResizeObserver` will report `null` until after first render_
+ *
+ * @return {Array} An array of {Element} `resizeListener` and {?Object} `sizes` with properties `width` and `height`
+ *
+ * @example
+ *
+ * ```js
+ * const App = () => {
+ * const [ resizeListener, sizes ] = useResizeObserver();
+ *
+ * return (
+ *
+ * { resizeListener }
+ * Your content here
+ *
+ * );
+ * };
+ * ```
+ *
+ */
+export default useResizeAware;
diff --git a/packages/compose/src/hooks/use-resize-observer/index.native.js b/packages/compose/src/hooks/use-resize-observer/index.native.js
new file mode 100644
index 00000000000000..26e6f647f5b5a7
--- /dev/null
+++ b/packages/compose/src/hooks/use-resize-observer/index.native.js
@@ -0,0 +1,55 @@
+/**
+ * External dependencies
+ */
+import { View, StyleSheet } from 'react-native';
+/**
+ * WordPress dependencies
+ */
+import { useState, useCallback } from '@wordpress/element';
+
+/**
+ * Hook which allows to listen the resize event of any target element when it changes sizes.
+ *
+ * @return {Array} An array of {Element} `resizeListener` and {?Object} `sizes` with properties `width` and `height`
+ *
+ * @example
+ *
+ * ```js
+ * const App = () => {
+ * const [ resizeListener, sizes ] = useResizeObserver();
+ *
+ * return (
+ *
+ * { resizeListener }
+ * Your content here
+ *
+ * );
+ * };
+ * ```
+ *
+ */
+const useResizeObserver = () => {
+ const [ measurements, setMeasurements ] = useState( null );
+
+ const onLayout = useCallback( ( { nativeEvent } ) => {
+ const { width, height } = nativeEvent.layout;
+ setMeasurements( ( prevState ) => {
+ if (
+ ! prevState ||
+ prevState.width !== width ||
+ prevState.height !== height
+ ) {
+ return { width, height };
+ }
+ return prevState;
+ } );
+ }, [] );
+
+ const observer = (
+
+ );
+
+ return [ observer, measurements ];
+};
+
+export default useResizeObserver;
diff --git a/packages/compose/src/hooks/use-resize-observer/test/index.native.js b/packages/compose/src/hooks/use-resize-observer/test/index.native.js
new file mode 100644
index 00000000000000..4e4165cd6a4db1
--- /dev/null
+++ b/packages/compose/src/hooks/use-resize-observer/test/index.native.js
@@ -0,0 +1,50 @@
+/**
+ * External dependencies
+ */
+import { create, act } from 'react-test-renderer';
+import { View } from 'react-native';
+
+/**
+ * Internal dependencies
+ */
+import useResizeObserver from '../';
+
+const TestComponent = ( { onLayout } ) => {
+ const [ resizeObserver, sizes ] = useResizeObserver();
+
+ return (
+
+ { resizeObserver }
+
+ );
+};
+
+const renderWithOnLayout = ( component ) => {
+ const testComponent = create( component );
+
+ const mockNativeEvent = {
+ nativeEvent: {
+ layout: {
+ width: 300,
+ height: 500,
+ },
+ },
+ };
+
+ act( () => {
+ testComponent.toJSON().children[ 0 ].props.onLayout( mockNativeEvent );
+ } );
+
+ return testComponent.toJSON();
+};
+
+describe( 'useResizeObserver()', () => {
+ it( 'should return "{ width: 300, height: 500 }"', () => {
+ const component = renderWithOnLayout( );
+
+ expect( component.props.sizes ).toMatchObject( {
+ width: 300,
+ height: 500,
+ } );
+ } );
+} );
diff --git a/packages/compose/src/hooks/use-viewport-match/index.js b/packages/compose/src/hooks/use-viewport-match/index.js
index fc1500056c1e71..20f0cfcc90ca5e 100644
--- a/packages/compose/src/hooks/use-viewport-match/index.js
+++ b/packages/compose/src/hooks/use-viewport-match/index.js
@@ -63,7 +63,7 @@ const ViewportMatchWidthContext = createContext( null );
* @example
*
* ```js
- * useViewportMatch( 'huge', <' );
+ * useViewportMatch( 'huge', '<' );
* useViewportMatch( 'medium' );
* ```
*
diff --git a/packages/compose/src/index.js b/packages/compose/src/index.js
index 3a1aabde92cfef..083d41c3f92693 100644
--- a/packages/compose/src/index.js
+++ b/packages/compose/src/index.js
@@ -19,3 +19,4 @@ export { default as useKeyboardShortcut } from './hooks/use-keyboard-shortcut';
export { default as useMediaQuery } from './hooks/use-media-query';
export { default as useReducedMotion } from './hooks/use-reduced-motion';
export { default as useViewportMatch } from './hooks/use-viewport-match';
+export { default as useResizeObserver } from './hooks/use-resize-observer';
diff --git a/packages/compose/src/index.native.js b/packages/compose/src/index.native.js
index 6c1e89a35f8791..336f6814ebf5f1 100644
--- a/packages/compose/src/index.native.js
+++ b/packages/compose/src/index.native.js
@@ -6,3 +6,5 @@ export { default as withPreferredColorScheme } from './higher-order/with-preferr
// Hooks
export { default as usePreferredColorScheme } from './hooks/use-preferred-color-scheme';
+export { default as usePreferredColorSchemeStyle } from './hooks/use-preferred-color-scheme-style';
+export { default as useResizeObserver } from './hooks/use-resize-observer';
diff --git a/packages/core-data/README.md b/packages/core-data/README.md
index a2bb3ccbe6deeb..5e2d337eabea42 100644
--- a/packages/core-data/README.md
+++ b/packages/core-data/README.md
@@ -40,7 +40,7 @@ const MyAuthorsList = withSelect( ( select ) => ( {
The following set of dispatching action creators are available on the object returned by `wp.data.dispatch( 'core' )`:
-
+
# **addEntities**
@@ -86,6 +86,18 @@ _Returns_
- `Object`: Action object.
+# **receiveCurrentTheme**
+
+Returns an action object used in signalling that the current theme has been received.
+
+_Parameters_
+
+- _currentTheme_ `Object`: The current theme.
+
+_Returns_
+
+- `Object`: Action object.
+
# **receiveCurrentUser**
Returns an action used in signalling that the current user has been received.
@@ -211,13 +223,13 @@ _Parameters_
Action triggered to undo the last edit to
an entity record, if any.
-
+
## Selectors
The following selectors are available on the object returned by `wp.data.select( 'core' )`:
-
+
# **canUser**
@@ -284,6 +296,18 @@ _Returns_
- `?Array`: An array of autosaves for the post, or undefined if there is none.
+# **getCurrentTheme**
+
+Return the current theme.
+
+_Parameters_
+
+- _state_ `Object`: Data state.
+
+_Returns_
+
+- `Object`: The current theme.
+
# **getCurrentUser**
Returns the current user.
@@ -413,7 +437,7 @@ _Parameters_
_Returns_
-- `Array`: Records.
+- `?Array`: Records.
# **getLastEntitySaveError**
@@ -655,6 +679,6 @@ _Returns_
- `boolean`: Whether the entity record is saving or not.
-
+
diff --git a/packages/core-data/package.json b/packages/core-data/package.json
index 6f303ba4849b39..febff43a5c2533 100644
--- a/packages/core-data/package.json
+++ b/packages/core-data/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/core-data",
- "version": "2.12.1",
+ "version": "2.14.1",
"description": "Access to and manipulation of core WordPress entities.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -22,10 +22,11 @@
"module": "build-module/index.js",
"react-native": "src/index",
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/api-fetch": "file:../api-fetch",
"@wordpress/blocks": "file:../blocks",
"@wordpress/data": "file:../data",
+ "@wordpress/data-controls": "file:../data-controls",
"@wordpress/deprecated": "file:../deprecated",
"@wordpress/element": "file:../element",
"@wordpress/i18n": "file:../i18n",
diff --git a/packages/core-data/src/actions.js b/packages/core-data/src/actions.js
index dd4b10c3e2fda6..8a3de939904ce3 100644
--- a/packages/core-data/src/actions.js
+++ b/packages/core-data/src/actions.js
@@ -94,6 +94,20 @@ export function receiveEntityRecords(
};
}
+/**
+ * Returns an action object used in signalling that the current theme has been received.
+ *
+ * @param {Object} currentTheme The current theme.
+ *
+ * @return {Object} Action object.
+ */
+export function receiveCurrentTheme( currentTheme ) {
+ return {
+ type: 'RECEIVE_CURRENT_THEME',
+ currentTheme,
+ };
+}
+
/**
* Returns an action object used in signalling that the index has been received.
*
diff --git a/packages/core-data/src/entities.js b/packages/core-data/src/entities.js
index 98724751318527..8a9fa25ce3c648 100644
--- a/packages/core-data/src/entities.js
+++ b/packages/core-data/src/entities.js
@@ -22,6 +22,9 @@ export const defaultEntities = [
name: 'site',
kind: 'root',
baseURL: '/wp/v2/settings',
+ getTitle: ( record ) => {
+ return get( record, [ 'title' ], __( 'Site Title' ) );
+ },
},
{
label: __( 'Post Type' ),
@@ -60,6 +63,34 @@ export const defaultEntities = [
baseURL: '/wp/v2/users',
plural: 'users',
},
+ {
+ name: 'comment',
+ kind: 'root',
+ baseURL: '/wp/v2/comments',
+ plural: 'comments',
+ label: __( 'Comment' ),
+ },
+ {
+ name: 'menu',
+ kind: 'root',
+ baseURL: '/__experimental/menus',
+ plural: 'menus',
+ label: __( 'Menu' ),
+ },
+ {
+ name: 'menuItem',
+ kind: 'root',
+ baseURL: '/__experimental/menu-items',
+ plural: 'menuItems',
+ label: __( 'Menu Item' ),
+ },
+ {
+ name: 'menuLocation',
+ kind: 'root',
+ baseURL: '/__experimental/menu-locations',
+ plural: 'menuLocations',
+ label: __( 'Menu Location' ),
+ },
];
export const kinds = [
diff --git a/packages/core-data/src/reducer.js b/packages/core-data/src/reducer.js
index 932ae2959a0476..b324010b787fe2 100644
--- a/packages/core-data/src/reducer.js
+++ b/packages/core-data/src/reducer.js
@@ -102,6 +102,43 @@ export function taxonomies( state = [], action ) {
return state;
}
+/**
+ * Reducer managing the current theme.
+ *
+ * @param {string} state Current state.
+ * @param {Object} action Dispatched action.
+ *
+ * @return {string} Updated state.
+ */
+export function currentTheme( state = undefined, action ) {
+ switch ( action.type ) {
+ case 'RECEIVE_CURRENT_THEME':
+ return action.currentTheme.stylesheet;
+ }
+
+ return state;
+}
+
+/**
+ * Reducer managing installed themes.
+ *
+ * @param {Object} state Current state.
+ * @param {Object} action Dispatched action.
+ *
+ * @return {Object} Updated state.
+ */
+export function themes( state = {}, action ) {
+ switch ( action.type ) {
+ case 'RECEIVE_CURRENT_THEME':
+ return {
+ ...state,
+ [ action.currentTheme.stylesheet ]: action.currentTheme,
+ };
+ }
+
+ return state;
+}
+
/**
* Reducer managing theme supports data.
*
@@ -502,8 +539,10 @@ export function autosaves( state = {}, action ) {
export default combineReducers( {
terms,
users,
+ currentTheme,
currentUser,
taxonomies,
+ themes,
themeSupports,
entities,
undo,
diff --git a/packages/core-data/src/resolvers.js b/packages/core-data/src/resolvers.js
index b492a63e67e99e..a1c8ddaf33f63e 100644
--- a/packages/core-data/src/resolvers.js
+++ b/packages/core-data/src/resolvers.js
@@ -14,6 +14,7 @@ import deprecated from '@wordpress/deprecated';
*/
import {
receiveUserQuery,
+ receiveCurrentTheme,
receiveCurrentUser,
receiveEntityRecords,
receiveThemeSupports,
@@ -23,6 +24,7 @@ import {
} from './actions';
import { getKindEntities } from './entities';
import { apiFetch, resolveSelect } from './controls';
+import { ifNotResolved } from './utils';
/**
* Requests authors from the REST API.
@@ -61,6 +63,22 @@ export function* getEntityRecord( kind, name, key = '' ) {
yield receiveEntityRecords( kind, name, record );
}
+/**
+ * Requests an entity's record from the REST API.
+ */
+export const getRawEntityRecord = ifNotResolved(
+ getEntityRecord,
+ 'getEntityRecord'
+);
+
+/**
+ * Requests an entity's record from the REST API.
+ */
+export const getEditedEntityRecord = ifNotResolved(
+ getRawEntityRecord,
+ 'getRawEntityRecord'
+);
+
/**
* Requests the entity's records from the REST API.
*
@@ -91,6 +109,16 @@ getEntityRecords.shouldInvalidate = ( action, kind, name ) => {
);
};
+/**
+ * Requests the current theme.
+ */
+export function* getCurrentTheme() {
+ const activeThemes = yield apiFetch( {
+ path: '/wp/v2/themes?status=active',
+ } );
+ yield receiveCurrentTheme( activeThemes[ 0 ] );
+}
+
/**
* Requests theme supports data from the index.
*/
diff --git a/packages/core-data/src/selectors.js b/packages/core-data/src/selectors.js
index 94c09522f86313..815ff190315478 100644
--- a/packages/core-data/src/selectors.js
+++ b/packages/core-data/src/selectors.js
@@ -179,7 +179,7 @@ export const getRawEntityRecord = createSelector(
* @param {string} name Entity name.
* @param {?Object} query Optional terms query.
*
- * @return {Array} Records.
+ * @return {?Array} Records.
*/
export function getEntityRecords( state, kind, name, query ) {
const queriedState = get( state.entities.data, [
@@ -449,6 +449,17 @@ export function hasRedo( state ) {
return Boolean( getRedoEdit( state ) );
}
+/**
+ * Return the current theme.
+ *
+ * @param {Object} state Data state.
+ *
+ * @return {Object} The current theme.
+ */
+export function getCurrentTheme( state ) {
+ return state.themes[ state.currentTheme ];
+}
+
/**
* Return theme supports data in the index.
*
diff --git a/packages/core-data/src/utils/if-not-resolved.js b/packages/core-data/src/utils/if-not-resolved.js
new file mode 100644
index 00000000000000..2b3c25427f63f8
--- /dev/null
+++ b/packages/core-data/src/utils/if-not-resolved.js
@@ -0,0 +1,35 @@
+/**
+ * WordPress dependencies
+ */
+import { select } from '@wordpress/data-controls';
+
+/**
+ * Higher-order function which invokes the given resolver only if it has not
+ * already been resolved with the arguments passed to the enhanced function.
+ *
+ * This only considers resolution state, and notably does not support resolver
+ * custom `isFulfilled` behavior.
+ *
+ * @param {Function} resolver Original resolver.
+ * @param {string} selectorName Selector name associated with resolver.
+ *
+ * @return {Function} Enhanced resolver.
+ */
+const ifNotResolved = ( resolver, selectorName ) =>
+ /**
+ * @param {...any} args Original resolver arguments.
+ */
+ function* resolveIfNotResolved( ...args ) {
+ const hasStartedResolution = yield select(
+ 'core',
+ 'hasStartedResolution',
+ selectorName,
+ args
+ );
+
+ if ( ! hasStartedResolution ) {
+ yield* resolver( ...args );
+ }
+ };
+
+export default ifNotResolved;
diff --git a/packages/core-data/src/utils/index.js b/packages/core-data/src/utils/index.js
index 7adb57e48d5d7f..8605593479a65d 100644
--- a/packages/core-data/src/utils/index.js
+++ b/packages/core-data/src/utils/index.js
@@ -1,5 +1,6 @@
export { default as conservativeMapItem } from './conservative-map-item';
export { default as ifMatchingAction } from './if-matching-action';
+export { default as ifNotResolved } from './if-not-resolved';
export { default as onSubKey } from './on-sub-key';
export { default as replaceAction } from './replace-action';
export { default as withWeakMapCache } from './with-weak-map-cache';
diff --git a/packages/core-data/src/utils/test/if-not-resolved.js b/packages/core-data/src/utils/test/if-not-resolved.js
new file mode 100644
index 00000000000000..ff960687539fae
--- /dev/null
+++ b/packages/core-data/src/utils/test/if-not-resolved.js
@@ -0,0 +1,69 @@
+/**
+ * WordPress dependencies
+ */
+import { select } from '@wordpress/data-controls';
+
+/**
+ * Internal dependencies
+ */
+import ifNotResolved from '../if-not-resolved';
+
+jest.mock( '@wordpress/data-controls', () => ( {
+ select: jest.fn(),
+} ) );
+
+describe( 'ifNotResolved', () => {
+ beforeEach( () => {
+ select.mockReset();
+ } );
+
+ it( 'returns a new function', () => {
+ const originalResolver = () => {};
+
+ const resolver = ifNotResolved( originalResolver, 'originalResolver' );
+
+ expect( resolver ).toBeInstanceOf( Function );
+ } );
+
+ it( 'triggers original resolver if not already resolved', () => {
+ select.mockImplementation( ( _storeKey, selectorName ) => ( {
+ _nextValue:
+ selectorName === 'hasStartedResolution' ? false : undefined,
+ } ) );
+
+ const originalResolver = jest.fn().mockImplementation( function*() {} );
+
+ const resolver = ifNotResolved( originalResolver, 'originalResolver' );
+
+ const runResolver = resolver();
+
+ let next, nextValue;
+ do {
+ next = runResolver.next( nextValue );
+ nextValue = next.value?._nextValue;
+ } while ( ! next.done );
+
+ expect( originalResolver ).toHaveBeenCalledTimes( 1 );
+ } );
+
+ it( 'does not trigger original resolver if already resolved', () => {
+ select.mockImplementation( ( _storeKey, selectorName ) => ( {
+ _nextValue:
+ selectorName === 'hasStartedResolution' ? true : undefined,
+ } ) );
+
+ const originalResolver = jest.fn().mockImplementation( function*() {} );
+
+ const resolver = ifNotResolved( originalResolver, 'originalResolver' );
+
+ const runResolver = resolver();
+
+ let next, nextValue;
+ do {
+ next = runResolver.next( nextValue );
+ nextValue = next.value?._nextValue;
+ } while ( ! next.done );
+
+ expect( originalResolver ).toHaveBeenCalledTimes( 0 );
+ } );
+} );
diff --git a/packages/create-block/CHANGELOG.md b/packages/create-block/CHANGELOG.md
index ff9d8a371576ff..935db8124f3fd0 100644
--- a/packages/create-block/CHANGELOG.md
+++ b/packages/create-block/CHANGELOG.md
@@ -1,5 +1,17 @@
## Master
+## 0.10.0 (2020-04-01)
+
+### New Features
+
+- Added readme.txt file to the existing templates to make your entry in the plugin browser most useful ([#20694](https://github.com/WordPress/gutenberg/pull/20694)).
+- Added prompts for the `author`, `license` and `version` of the plugin ([#20694](https://github.com/WordPress/gutenberg/pull/20694)).
+
+### Bug Fixes
+
+- Make `version` prompt mandatory and provide validation against semantic versioning ([#20756](https://github.com/WordPress/gutenberg/pull/20756)).
+- Omit optional values in the scaffolded files when they aren't provided ([#20756](https://github.com/WordPress/gutenberg/pull/20756)).
+
## 0.8.3 (2020-02-26)
### Bug Fixes
diff --git a/packages/create-block/lib/init-wp-scripts.js b/packages/create-block/lib/init-wp-scripts.js
index 77acd4b90cd666..5ac01ea1733b0d 100644
--- a/packages/create-block/lib/init-wp-scripts.js
+++ b/packages/create-block/lib/init-wp-scripts.js
@@ -2,6 +2,7 @@
* External dependencies
*/
const { command } = require( 'execa' );
+const { isEmpty, omitBy } = require( 'lodash' );
const { join } = require( 'path' );
const writePkg = require( 'write-pkg' );
@@ -21,22 +22,28 @@ module.exports = async function( {
info( '' );
info( 'Creating a "package.json" file.' );
- await writePkg( cwd, {
- name: slug,
- version,
- description,
- author,
- license,
- main: 'build/index.js',
- scripts: {
- build: 'wp-scripts build',
- 'format:js': 'wp-scripts format-js',
- 'lint:css': 'wp-scripts lint-style',
- 'lint:js': 'wp-scripts lint-js',
- start: 'wp-scripts start',
- 'packages-update': 'wp-scripts packages-update',
- },
- } );
+ await writePkg(
+ cwd,
+ omitBy(
+ {
+ name: slug,
+ version,
+ description,
+ author,
+ license,
+ main: 'build/index.js',
+ scripts: {
+ build: 'wp-scripts build',
+ 'format:js': 'wp-scripts format-js',
+ 'lint:css': 'wp-scripts lint-style',
+ 'lint:js': 'wp-scripts lint-js',
+ start: 'wp-scripts start',
+ 'packages-update': 'wp-scripts packages-update',
+ },
+ },
+ isEmpty
+ )
+ );
info( '' );
info( 'Installing packages. It might take a couple of minutes.' );
diff --git a/packages/create-block/lib/prompts.js b/packages/create-block/lib/prompts.js
index 99d49120e2d6ed..5624f984f8292a 100644
--- a/packages/create-block/lib/prompts.js
+++ b/packages/create-block/lib/prompts.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-const { upperFirst } = require( 'lodash' );
+const { isEmpty, upperFirst } = require( 'lodash' );
const slug = {
type: 'input',
@@ -55,7 +55,7 @@ const dashicon = {
message:
'The dashicon to make it easier to identify your block (optional):',
validate( input ) {
- if ( ! /^[a-z][a-z0-9\-]*$/.test( input ) ) {
+ if ( ! isEmpty( input ) && ! /^[a-z][a-z0-9\-]*$/.test( input ) ) {
return 'Invalid dashicon name specified. Visit https://developer.wordpress.org/resource/dashicons/ to discover available names.';
}
@@ -73,6 +73,40 @@ const category = {
choices: [ 'common', 'embed', 'formatting', 'layout', 'widgets' ],
};
+const author = {
+ type: 'input',
+ name: 'author',
+ message:
+ 'The name of the plugin author (optional). Multiple authors may be listed using commas:',
+};
+
+const license = {
+ type: 'input',
+ name: 'license',
+ message: 'The short name of the plugin’s license (optional):',
+};
+
+const licenseURI = {
+ type: 'input',
+ name: 'licenseURI',
+ message: 'A link to the full text of the license (optional):',
+};
+
+const version = {
+ type: 'input',
+ name: 'version',
+ message: 'The current version number of the plugin:',
+ validate( input ) {
+ // Regular expression was copied from https://semver.org.
+ const validSemVerPattern = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
+ if ( ! validSemVerPattern.test( input ) ) {
+ return 'Invalid Semantic Version provided. Visit https://regex101.com/r/vkijKf/1/ to discover all valid patterns.';
+ }
+
+ return true;
+ },
+};
+
module.exports = {
slug,
namespace,
@@ -80,4 +114,8 @@ module.exports = {
description,
dashicon,
category,
+ author,
+ license,
+ licenseURI,
+ version,
};
diff --git a/packages/create-block/lib/scaffold.js b/packages/create-block/lib/scaffold.js
index 85186c15eb7172..be9b09588bde6c 100644
--- a/packages/create-block/lib/scaffold.js
+++ b/packages/create-block/lib/scaffold.js
@@ -25,6 +25,7 @@ module.exports = async function(
category,
author,
license,
+ licenseURI,
version,
}
) {
@@ -46,6 +47,7 @@ module.exports = async function(
version,
author,
license,
+ licenseURI,
textdomain: namespace,
};
await Promise.all(
diff --git a/packages/create-block/lib/templates.js b/packages/create-block/lib/templates.js
index da5ea63312a358..581e4ee1c48454 100644
--- a/packages/create-block/lib/templates.js
+++ b/packages/create-block/lib/templates.js
@@ -9,6 +9,7 @@ const dashicon = 'smiley';
const category = 'widgets';
const author = 'The WordPress Contributors';
const license = 'GPL-2.0-or-later';
+const licenseURI = 'https://www.gnu.org/licenses/gpl-2.0.html';
const version = '0.1.0';
const templates = {
@@ -23,6 +24,7 @@ const templates = {
category,
author,
license,
+ licenseURI,
version,
},
outputFiles: [
@@ -31,6 +33,7 @@ const templates = {
'index.js',
'$slug.php',
'style.css',
+ 'readme.txt',
],
},
esnext: {
@@ -44,6 +47,7 @@ const templates = {
category,
author,
license,
+ licenseURI,
version,
},
outputFiles: [
@@ -53,6 +57,7 @@ const templates = {
'src/index.js',
'$slug.php',
'style.css',
+ 'readme.txt',
],
wpScriptsEnabled: true,
},
diff --git a/packages/create-block/lib/templates/es5/$slug.php.mustache b/packages/create-block/lib/templates/es5/$slug.php.mustache
index 4a9a0c6bceaa6d..b46e0b8e9ec040 100644
--- a/packages/create-block/lib/templates/es5/$slug.php.mustache
+++ b/packages/create-block/lib/templates/es5/$slug.php.mustache
@@ -1,10 +1,19 @@
{
} );
} );
- it( 'resolves in expected order', ( done ) => {
+ it( 'resolves in expected order', async () => {
const actions = {
wait: () => ( { type: 'WAIT' } ),
receive: ( items ) => ( { type: 'RECEIVE', items } ),
@@ -74,21 +74,23 @@ describe( 'controls', () => {
},
} );
- registry.subscribe( () => {
- const isFinished = registry
- .select( 'store' )
- .hasFinishedResolution( 'getItems' );
- if ( isFinished ) {
- expect( registry.select( 'store' ).getItems() ).toEqual( [
- 1,
- 2,
- 3,
- ] );
- done();
- }
- } );
+ return new Promise( ( resolve ) => {
+ registry.subscribe( () => {
+ const isFinished = registry
+ .select( 'store' )
+ .hasFinishedResolution( 'getItems' );
+ if ( isFinished ) {
+ expect( registry.select( 'store' ).getItems() ).toEqual( [
+ 1,
+ 2,
+ 3,
+ ] );
+ }
+ resolve();
+ } );
- registry.select( 'store' ).getItems();
+ registry.select( 'store' ).getItems();
+ } );
} );
describe( 'selectors have expected value for the `hasResolver` property', () => {
it( 'when custom store has resolvers defined', () => {
diff --git a/packages/data/src/plugins/persistence/index.js b/packages/data/src/plugins/persistence/index.js
index 30ac60abbc3cc7..75fe54a394efed 100644
--- a/packages/data/src/plugins/persistence/index.js
+++ b/packages/data/src/plugins/persistence/index.js
@@ -246,6 +246,26 @@ persistencePlugin.__unstableMigrate = ( pluginOptions ) => {
} );
}
+ let editPostState = state[ 'core/edit-post' ];
+
+ // Default `fullscreenMode` to `false` if any persisted state had existed
+ // and the user hadn't made an explicit choice about fullscreen mode. This
+ // is needed since `fullscreenMode` previously did not have a default value
+ // and was implicitly false by its absence. It is now `true` by default, but
+ // this change is not intended to affect upgrades from earlier versions.
+ const hadPersistedState = Object.keys( state ).length > 0;
+ const hadFullscreenModePreference = has( state, [
+ 'core/edit-post',
+ 'preferences',
+ 'features',
+ 'fullscreenMode',
+ ] );
+ if ( hadPersistedState && ! hadFullscreenModePreference ) {
+ editPostState = merge( {}, editPostState, {
+ preferences: { features: { fullscreenMode: false } },
+ } );
+ }
+
// Migrate 'areTipsEnabled' from 'core/nux' to 'showWelcomeGuide' in 'core/edit-post'
const areTipsEnabled = get( state, [
'core/nux',
@@ -259,16 +279,17 @@ persistencePlugin.__unstableMigrate = ( pluginOptions ) => {
'welcomeGuide',
] );
if ( areTipsEnabled !== undefined && ! hasWelcomeGuide ) {
- persistence.set(
- 'core/edit-post',
- merge( state[ 'core/edit-post' ], {
- preferences: {
- features: {
- welcomeGuide: areTipsEnabled,
- },
+ editPostState = merge( {}, editPostState, {
+ preferences: {
+ features: {
+ welcomeGuide: areTipsEnabled,
},
- } )
- );
+ },
+ } );
+ }
+
+ if ( editPostState !== state[ 'core/edit-post' ] ) {
+ persistence.set( 'core/edit-post', editPostState );
}
};
diff --git a/packages/data/src/plugins/persistence/test/index.js b/packages/data/src/plugins/persistence/test/index.js
index 4d91648ce81da3..818f075640ae56 100644
--- a/packages/data/src/plugins/persistence/test/index.js
+++ b/packages/data/src/plugins/persistence/test/index.js
@@ -11,7 +11,7 @@ import objectStorage from '../storage/object';
import { createRegistry } from '../../../';
describe( 'persistence', () => {
- let registry, originalRegisterStore;
+ let registry;
beforeAll( () => {
jest.spyOn( objectStorage, 'setItem' );
@@ -21,18 +21,8 @@ describe( 'persistence', () => {
objectStorage.clear();
objectStorage.setItem.mockClear();
- // Since the exposed `registerStore` is a proxying function, mimic
- // intercept of original call by adding an initial plugin.
// TODO: Remove the `use` function in favor of `registerGenericStore`
- registry = createRegistry()
- .use( ( originalRegistry ) => {
- originalRegisterStore = jest.spyOn(
- originalRegistry,
- 'registerStore'
- );
- return {};
- } )
- .use( plugin, { storage: objectStorage } );
+ registry = createRegistry().use( plugin, { storage: objectStorage } );
} );
it( 'should not mutate options', () => {
@@ -181,17 +171,6 @@ describe( 'persistence', () => {
expect( registry.select( 'test' ).getState() ).toBe( 1 );
} );
- it( 'override values passed to registerStore', () => {
- const options = { persist: true, reducer() {} };
-
- registry.registerStore( 'test', options );
-
- expect( originalRegisterStore ).toHaveBeenCalledWith( 'test', {
- persist: true,
- reducer: expect.any( Function ),
- } );
- } );
-
it( 'should not persist if option not passed', () => {
const initialState = { foo: 'bar', baz: 'qux' };
function reducer( state = initialState, action ) {
diff --git a/packages/data/src/registry.js b/packages/data/src/registry.js
index adb11b40c75dfa..4f74d4cb1ea512 100644
--- a/packages/data/src/registry.js
+++ b/packages/data/src/registry.js
@@ -32,6 +32,8 @@ import createCoreDataStore from './store';
/**
* @typedef {Object} WPDataPlugin An object of registry function overrides.
+ *
+ * @property {Function} registerStore registers store.
*/
/**
diff --git a/packages/data/src/test/registry.js b/packages/data/src/test/registry.js
index 02242ecc5b283c..879050388a9512 100644
--- a/packages/data/src/test/registry.js
+++ b/packages/data/src/test/registry.js
@@ -396,7 +396,7 @@ describe( 'createRegistry', () => {
return promise;
} );
- it( 'should resolve promise non-action to dispatch', ( done ) => {
+ it( 'should resolve promise non-action to dispatch', () => {
let shouldThrow = false;
registry.registerStore( 'demo', {
reducer: ( state = 'OK' ) => {
@@ -417,9 +417,7 @@ describe( 'createRegistry', () => {
registry.select( 'demo' ).getValue();
- process.nextTick( () => {
- done();
- } );
+ return new Promise( ( resolve ) => process.nextTick( resolve ) );
} );
it( 'should not dispatch resolved promise action on subsequent selector calls', () => {
diff --git a/packages/date/README.md b/packages/date/README.md
index e45bb664c85519..954ea388ece67d 100644
--- a/packages/date/README.md
+++ b/packages/date/README.md
@@ -18,26 +18,40 @@ _This package assumes that your code will run in an **ES2015+** environment. If
# **date**
-Formats a date (like `date()` in PHP), in the site's timezone.
+Formats a date (like `date()` in PHP).
+
+_Related_
+
+-
+-
_Parameters_
- _dateFormat_ `string`: PHP-style formatting string. See php.net/date.
- _dateValue_ `(Date|string|Moment|null)`: Date object or string, parsable by moment.js.
+- _timezone_ `(string|number|null)`: Timezone to output result in or a UTC offset. Defaults to timezone from site.
_Returns_
-- `string`: Formatted date.
+- `string`: Formatted date in English.
# **dateI18n**
-Formats a date (like `date_i18n()` in PHP).
+Formats a date (like `wp_date()` in PHP), translating it into site's locale.
+
+Backward Compatibility Notice: if `timezone` is set to `true`, the function
+behaves like `gmdateI18n`.
+
+_Related_
+
+-
+-
_Parameters_
- _dateFormat_ `string`: PHP-style formatting string. See php.net/date.
- _dateValue_ `(Date|string|Moment|null)`: Date object or string, parsable by moment.js.
-- _gmt_ `boolean`: True for GMT/UTC, false for site's timezone.
+- _timezone_ `(string|number|boolean|null)`: Timezone to output result in or a UTC offset. Defaults to timezone from site. Notice: `boolean` is effectively deprecated, but still supported for backward compatibility reasons.
_Returns_
@@ -79,6 +93,20 @@ _Parameters_
_Returns_
+- `string`: Formatted date in English.
+
+# **gmdateI18n**
+
+Formats a date (like `wp_date()` in PHP), translating it into site's locale
+and using the UTC timezone.
+
+_Parameters_
+
+- _dateFormat_ `string`: PHP-style formatting string. See php.net/date.
+- _dateValue_ `(Date|string|Moment|null)`: Date object or string, parsable by moment.js.
+
+_Returns_
+
- `string`: Formatted date.
# **isInTheFuture**
diff --git a/packages/date/package.json b/packages/date/package.json
index c095c6a6a8aac9..7a17016a652555 100644
--- a/packages/date/package.json
+++ b/packages/date/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/date",
- "version": "3.8.0",
+ "version": "3.9.0",
"description": "Date module for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -21,7 +21,7 @@
"module": "build-module/index.js",
"react-native": "src/index",
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"moment": "^2.22.1",
"moment-timezone": "^0.5.16"
},
diff --git a/packages/date/src/index.js b/packages/date/src/index.js
index 6251e1c82c04bf..25697d8fadd596 100644
--- a/packages/date/src/index.js
+++ b/packages/date/src/index.js
@@ -9,6 +9,10 @@ import 'moment-timezone/moment-timezone-utils';
const WP_ZONE = 'WP';
+// This regular expression tests positive for UTC offsets as described in ISO 8601.
+// See: https://en.wikipedia.org/wiki/ISO_8601#Time_offsets_from_UTC
+const VALID_UTC_OFFSET = /^[+-][0-1][0-9](:?[0-9][0-9])?$/;
+
// Changes made here will likely need to be made in `lib/client-assets.php` as
// well because it uses the `setSettings()` function to change these settings.
let settings = {
@@ -318,10 +322,10 @@ const formatMap = {
/**
* Formats a date. Does not alter the date's timezone.
*
- * @param {string} dateFormat PHP-style formatting string.
- * See php.net/date.
- * @param {(Date|string|Moment|null)} dateValue Date object or string,
- * parsable by moment.js.
+ * @param {string} dateFormat PHP-style formatting string.
+ * See php.net/date.
+ * @param {Date|string|Moment|null} dateValue Date object or string,
+ * parsable by moment.js.
*
* @return {string} Formatted date.
*/
@@ -357,30 +361,35 @@ export function format( dateFormat, dateValue = new Date() ) {
}
/**
- * Formats a date (like `date()` in PHP), in the site's timezone.
+ * Formats a date (like `date()` in PHP).
*
- * @param {string} dateFormat PHP-style formatting string.
- * See php.net/date.
- * @param {(Date|string|Moment|null)} dateValue Date object or string,
- * parsable by moment.js.
+ * @param {string} dateFormat PHP-style formatting string.
+ * See php.net/date.
+ * @param {Date|string|Moment|null} dateValue Date object or string, parsable
+ * by moment.js.
+ * @param {string|number|null} timezone Timezone to output result in or a
+ * UTC offset. Defaults to timezone from
+ * site.
*
- * @return {string} Formatted date.
+ * @see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
+ * @see https://en.wikipedia.org/wiki/ISO_8601#Time_offsets_from_UTC
+ *
+ * @return {string} Formatted date in English.
*/
-export function date( dateFormat, dateValue = new Date() ) {
- const offset = settings.timezone.offset * HOUR_IN_MINUTES;
- const dateMoment = momentLib( dateValue ).utcOffset( offset, true );
+export function date( dateFormat, dateValue = new Date(), timezone ) {
+ const dateMoment = buildMoment( dateValue, timezone );
return format( dateFormat, dateMoment );
}
/**
* Formats a date (like `date()` in PHP), in the UTC timezone.
*
- * @param {string} dateFormat PHP-style formatting string.
- * See php.net/date.
- * @param {(Date|string|Moment|null)} dateValue Date object or string,
- * parsable by moment.js.
+ * @param {string} dateFormat PHP-style formatting string.
+ * See php.net/date.
+ * @param {Date|string|Moment|null} dateValue Date object or string,
+ * parsable by moment.js.
*
- * @return {string} Formatted date.
+ * @return {string} Formatted date in English.
*/
export function gmdate( dateFormat, dateValue = new Date() ) {
const dateMoment = momentLib( dateValue ).utc();
@@ -388,26 +397,54 @@ export function gmdate( dateFormat, dateValue = new Date() ) {
}
/**
- * Formats a date (like `date_i18n()` in PHP).
+ * Formats a date (like `wp_date()` in PHP), translating it into site's locale.
+ *
+ * Backward Compatibility Notice: if `timezone` is set to `true`, the function
+ * behaves like `gmdateI18n`.
+ *
+ * @param {string} dateFormat PHP-style formatting string.
+ * See php.net/date.
+ * @param {Date|string|Moment|null} dateValue Date object or string, parsable by
+ * moment.js.
+ * @param {string|number|boolean|null} timezone Timezone to output result in or a
+ * UTC offset. Defaults to timezone from
+ * site. Notice: `boolean` is effectively
+ * deprecated, but still supported for
+ * backward compatibility reasons.
*
- * @param {string} dateFormat PHP-style formatting string.
- * See php.net/date.
- * @param {(Date|string|Moment|null)} dateValue Date object or string,
- * parsable by moment.js.
- * @param {boolean} gmt True for GMT/UTC, false for
- * site's timezone.
+ * @see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
+ * @see https://en.wikipedia.org/wiki/ISO_8601#Time_offsets_from_UTC
*
* @return {string} Formatted date.
*/
-export function dateI18n( dateFormat, dateValue = new Date(), gmt = false ) {
- // Defaults.
- const offset = gmt ? 0 : settings.timezone.offset * HOUR_IN_MINUTES;
- // Convert to moment object.
- const dateMoment = momentLib( dateValue ).utcOffset( offset, true );
+export function dateI18n( dateFormat, dateValue = new Date(), timezone ) {
+ if ( true === timezone ) {
+ return gmdateI18n( dateFormat, dateValue );
+ }
+
+ if ( false === timezone ) {
+ timezone = undefined;
+ }
- // Set the locale.
+ const dateMoment = buildMoment( dateValue, timezone );
+ dateMoment.locale( settings.l10n.locale );
+ return format( dateFormat, dateMoment );
+}
+
+/**
+ * Formats a date (like `wp_date()` in PHP), translating it into site's locale
+ * and using the UTC timezone.
+ *
+ * @param {string} dateFormat PHP-style formatting string.
+ * See php.net/date.
+ * @param {Date|string|Moment|null} dateValue Date object or string,
+ * parsable by moment.js.
+ *
+ * @return {string} Formatted date.
+ */
+export function gmdateI18n( dateFormat, dateValue = new Date() ) {
+ const dateMoment = momentLib( dateValue ).utc();
dateMoment.locale( settings.l10n.locale );
- // Format and return.
return format( dateFormat, dateMoment );
}
@@ -440,4 +477,51 @@ export function getDate( dateString ) {
return momentLib.tz( dateString, WP_ZONE ).toDate();
}
+/**
+ * Creates a moment instance using the given timezone or, if none is provided, using global settings.
+ *
+ * @param {Date|string|Moment|null} dateValue Date object or string, parsable
+ * by moment.js.
+ * @param {string|number|null} timezone Timezone to output result in or a
+ * UTC offset. Defaults to timezone from
+ * site.
+ *
+ * @see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
+ * @see https://en.wikipedia.org/wiki/ISO_8601#Time_offsets_from_UTC
+ *
+ * @return {Moment} a moment instance.
+ */
+function buildMoment( dateValue, timezone = '' ) {
+ const dateMoment = momentLib( dateValue );
+
+ if ( timezone && ! isUTCOffset( timezone ) ) {
+ return dateMoment.tz( timezone );
+ }
+
+ if ( timezone && isUTCOffset( timezone ) ) {
+ return dateMoment.utcOffset( timezone );
+ }
+
+ if ( settings.timezone.string ) {
+ return dateMoment.tz( settings.timezone.string );
+ }
+
+ return dateMoment.utcOffset( settings.timezone.offset );
+}
+
+/**
+ * Returns whether a certain UTC offset is valid or not.
+ *
+ * @param {number|string} offset a UTC offset.
+ *
+ * @return {boolean} whether a certain UTC offset is valid or not.
+ */
+function isUTCOffset( offset ) {
+ if ( 'number' === typeof offset ) {
+ return true;
+ }
+
+ return VALID_UTC_OFFSET.test( offset );
+}
+
setupWPTimezone();
diff --git a/packages/date/src/test/index.js b/packages/date/src/test/index.js
index 69368b1fb630b5..d9b832e528ce6b 100644
--- a/packages/date/src/test/index.js
+++ b/packages/date/src/test/index.js
@@ -2,10 +2,14 @@
* Internal dependencies
*/
import {
- isInTheFuture,
+ __experimentalGetSettings,
+ date as dateNoI18n,
+ dateI18n,
getDate,
+ gmdate,
+ gmdateI18n,
+ isInTheFuture,
setSettings,
- __experimentalGetSettings,
} from '../';
describe( 'isInTheFuture', () => {
@@ -16,7 +20,7 @@ describe( 'isInTheFuture', () => {
expect( isInTheFuture( date ) ).toBe( true );
} );
- it( 'should return true if the date is in the past', () => {
+ it( 'should return false if the date is in the past', () => {
// Create a Date object 1 minute in the past.
const date = new Date( Number( getDate() ) - 1000 * 60 );
@@ -44,6 +48,433 @@ describe( 'isInTheFuture', () => {
} );
} );
+describe( 'Function date', () => {
+ it( 'should format date in English, ignoring locale settings', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different locale
+ const l10n = settings.l10n;
+ setSettings( {
+ ...settings,
+ l10n: {
+ ...l10n,
+ locale: 'es',
+ months: l10n.months.map( ( month ) => `es_${ month }` ),
+ monthsShort: l10n.monthsShort.map(
+ ( month ) => `es_${ month }`
+ ),
+ weekdays: l10n.weekdays.map( ( weekday ) => `es_${ weekday }` ),
+ weekdaysShort: l10n.weekdaysShort.map(
+ ( weekday ) => `es_${ weekday }`
+ ),
+ },
+ } );
+
+ // Check
+ const formattedDate = dateNoI18n(
+ 'F M l D',
+ '2019-06-18T11:00:00.000Z'
+ );
+ expect( formattedDate ).toBe( 'June Jun Tuesday Tue' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+
+ it( 'should format date into a date that uses site’s timezone, if no timezone was provided and there’s a site timezone set', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different timezone
+ setSettings( {
+ ...settings,
+ timezone: { offset: -4, string: 'America/New_York' },
+ } );
+
+ // Check
+ const winterFormattedDate = dateNoI18n(
+ 'Y-m-d H:i',
+ '2019-01-18T11:00:00.000Z'
+ );
+ expect( winterFormattedDate ).toBe( '2019-01-18 06:00' );
+
+ const summerFormattedDate = dateNoI18n(
+ 'Y-m-d H:i',
+ '2019-06-18T11:00:00.000Z'
+ );
+ expect( summerFormattedDate ).toBe( '2019-06-18 07:00' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+
+ it( 'should format date into a date that uses site’s UTC offset setting, if no timezone was provided and there isn’t a timezone set in the site', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different timezone
+ setSettings( {
+ ...settings,
+ timezone: { offset: -4, string: '' },
+ } );
+
+ // Check
+ const winterFormattedDate = dateNoI18n(
+ 'Y-m-d H:i',
+ '2019-01-18T11:00:00.000Z'
+ );
+ expect( winterFormattedDate ).toBe( '2019-01-18 07:00' );
+
+ const summerFormattedDate = dateNoI18n(
+ 'Y-m-d H:i',
+ '2019-06-18T11:00:00.000Z'
+ );
+ expect( summerFormattedDate ).toBe( '2019-06-18 07:00' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+
+ it( 'should format date into a date that uses the given timezone, if said timezone is valid', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different timezone
+ setSettings( {
+ ...settings,
+ timezone: { offset: -4, string: 'America/New_York' },
+ } );
+
+ // Check
+ const formattedDate = dateNoI18n(
+ 'Y-m-d H:i',
+ '2019-06-18T11:00:00.000Z',
+ 'Asia/Macau'
+ );
+ expect( formattedDate ).toBe( '2019-06-18 19:00' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+
+ it( 'should format date into a date that uses the given UTC offset, if given timezone is actually a UTC offset', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different timezone
+ setSettings( {
+ ...settings,
+ timezone: { offset: -4, string: 'America/New_York' },
+ } );
+
+ // Check
+ let formattedDate;
+ formattedDate = dateNoI18n(
+ 'Y-m-d H:i',
+ '2019-06-18T11:00:00.000Z',
+ '+08:00'
+ );
+ expect( formattedDate ).toBe( '2019-06-18 19:00' );
+
+ formattedDate = dateNoI18n(
+ 'Y-m-d H:i',
+ '2019-06-18T11:00:00.000Z',
+ 8
+ );
+ expect( formattedDate ).toBe( '2019-06-18 19:00' );
+
+ formattedDate = dateNoI18n(
+ 'Y-m-d H:i',
+ '2019-06-18T11:00:00.000Z',
+ 480
+ );
+ expect( formattedDate ).toBe( '2019-06-18 19:00' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+} );
+
+describe( 'Function gmdate', () => {
+ it( 'should format date in English, ignoring locale settings', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different locale
+ const l10n = settings.l10n;
+ setSettings( {
+ ...settings,
+ l10n: {
+ ...l10n,
+ locale: 'es',
+ months: l10n.months.map( ( month ) => `es_${ month }` ),
+ monthsShort: l10n.monthsShort.map(
+ ( month ) => `es_${ month }`
+ ),
+ weekdays: l10n.weekdays.map( ( weekday ) => `es_${ weekday }` ),
+ weekdaysShort: l10n.weekdaysShort.map(
+ ( weekday ) => `es_${ weekday }`
+ ),
+ },
+ } );
+
+ // Check
+ const formattedDate = gmdate( 'F M l D', '2019-06-18T11:00:00.000Z' );
+ expect( formattedDate ).toBe( 'June Jun Tuesday Tue' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+
+ it( 'should format date into a UTC date', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different timezone
+ setSettings( {
+ ...settings,
+ timezone: { offset: -4, string: 'America/New_York' },
+ } );
+
+ // Check
+ const formattedDate = gmdate( 'Y-m-d H:i', '2019-06-18T11:00:00.000Z' );
+ expect( formattedDate ).toBe( '2019-06-18 11:00' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+} );
+
+describe( 'Function dateI18n', () => {
+ it( 'should format date using locale settings', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different locale
+ const l10n = settings.l10n;
+ setSettings( {
+ ...settings,
+ l10n: {
+ ...l10n,
+ locale: 'es',
+ months: l10n.months.map( ( month ) => `es_${ month }` ),
+ monthsShort: l10n.monthsShort.map(
+ ( month ) => `es_${ month }`
+ ),
+ weekdays: l10n.weekdays.map( ( weekday ) => `es_${ weekday }` ),
+ weekdaysShort: l10n.weekdaysShort.map(
+ ( weekday ) => `es_${ weekday }`
+ ),
+ },
+ } );
+
+ // Check
+ const formattedDate = dateI18n(
+ 'F M l D',
+ '2019-06-18T11:00:00.000Z',
+ true
+ );
+ expect( formattedDate ).toBe( 'es_June es_Jun es_Tuesday es_Tue' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+
+ it( 'should format date into a date that uses site’s timezone, if no timezone was provided and there’s a site timezone set', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different timezone
+ setSettings( {
+ ...settings,
+ timezone: { offset: -4, string: 'America/New_York' },
+ } );
+
+ // Check
+ const winterFormattedDate = dateI18n(
+ 'Y-m-d H:i',
+ '2019-01-18T11:00:00.000Z'
+ );
+ expect( winterFormattedDate ).toBe( '2019-01-18 06:00' );
+
+ const summerFormattedDate = dateI18n(
+ 'Y-m-d H:i',
+ '2019-06-18T11:00:00.000Z'
+ );
+ expect( summerFormattedDate ).toBe( '2019-06-18 07:00' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+
+ it( 'should format date into a date that uses site’s UTC offset setting, if no timezone was provided and there isn’t a timezone set in the site', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different timezone
+ setSettings( {
+ ...settings,
+ timezone: { offset: -4, string: '' },
+ } );
+
+ // Check
+ const winterFormattedDate = dateI18n(
+ 'Y-m-d H:i',
+ '2019-01-18T11:00:00.000Z'
+ );
+ expect( winterFormattedDate ).toBe( '2019-01-18 07:00' );
+
+ const summerFormattedDate = dateI18n(
+ 'Y-m-d H:i',
+ '2019-06-18T11:00:00.000Z'
+ );
+ expect( summerFormattedDate ).toBe( '2019-06-18 07:00' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+
+ it( 'should format date into a date that uses the given timezone, if said timezone is valid', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different timezone
+ setSettings( {
+ ...settings,
+ timezone: { offset: -4, string: 'America/New_York' },
+ } );
+
+ // Check
+ const formattedDate = dateI18n(
+ 'Y-m-d H:i',
+ '2019-06-18T11:00:00.000Z',
+ 'Asia/Macau'
+ );
+ expect( formattedDate ).toBe( '2019-06-18 19:00' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+
+ it( 'should format date into a date that uses the given UTC offset, if given timezone is actually a UTC offset', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different timezone
+ setSettings( {
+ ...settings,
+ timezone: { offset: -4, string: 'America/New_York' },
+ } );
+
+ // Check
+ let formattedDate;
+ formattedDate = dateI18n(
+ 'Y-m-d H:i',
+ '2019-06-18T11:00:00.000Z',
+ '+08:00'
+ );
+ expect( formattedDate ).toBe( '2019-06-18 19:00' );
+
+ formattedDate = dateI18n( 'Y-m-d H:i', '2019-06-18T11:00:00.000Z', 8 );
+ expect( formattedDate ).toBe( '2019-06-18 19:00' );
+
+ formattedDate = dateI18n(
+ 'Y-m-d H:i',
+ '2019-06-18T11:00:00.000Z',
+ 480
+ );
+ expect( formattedDate ).toBe( '2019-06-18 19:00' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+
+ it( 'should format date into a UTC date if `gmt` is set to `true`', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different timezone
+ setSettings( {
+ ...settings,
+ timezone: { offset: -4, string: 'America/New_York' },
+ } );
+
+ // Check
+ const formattedDate = dateI18n(
+ 'Y-m-d H:i',
+ '2019-06-18T11:00:00.000Z',
+ true
+ );
+ expect( formattedDate ).toBe( '2019-06-18 11:00' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+
+ it( 'should format date into a date that uses site’s timezone if `gmt` is set to `false`', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different timezone
+ setSettings( {
+ ...settings,
+ timezone: { offset: -4, string: 'America/New_York' },
+ } );
+
+ // Check
+ const formattedDate = dateI18n(
+ 'Y-m-d H:i',
+ '2019-06-18T11:00:00.000Z',
+ false
+ );
+ expect( formattedDate ).toBe( '2019-06-18 07:00' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+} );
+
+describe( 'Function gmdateI18n', () => {
+ it( 'should format date using locale settings', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different locale
+ const l10n = settings.l10n;
+ setSettings( {
+ ...settings,
+ l10n: {
+ ...l10n,
+ locale: 'es',
+ months: l10n.months.map( ( month ) => `es_${ month }` ),
+ monthsShort: l10n.monthsShort.map(
+ ( month ) => `es_${ month }`
+ ),
+ weekdays: l10n.weekdays.map( ( weekday ) => `es_${ weekday }` ),
+ weekdaysShort: l10n.weekdaysShort.map(
+ ( weekday ) => `es_${ weekday }`
+ ),
+ },
+ } );
+
+ // Check
+ const formattedDate = gmdateI18n(
+ 'F M l D',
+ '2019-06-18T11:00:00.000Z'
+ );
+ expect( formattedDate ).toBe( 'es_June es_Jun es_Tuesday es_Tue' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+
+ it( 'should format date into a UTC date', () => {
+ const settings = __experimentalGetSettings();
+
+ // Simulate different timezone
+ setSettings( {
+ ...settings,
+ timezone: { offset: -4, string: 'America/New_York' },
+ } );
+
+ // Check
+ const formattedDate = gmdateI18n(
+ 'Y-m-d H:i',
+ '2019-06-18T11:00:00.000Z'
+ );
+ expect( formattedDate ).toBe( '2019-06-18 11:00' );
+
+ // Restore default settings
+ setSettings( settings );
+ } );
+} );
+
describe( 'Moment.js Localization', () => {
it( 'should change the relative time strings', () => {
const settings = __experimentalGetSettings();
diff --git a/packages/dependency-extraction-webpack-plugin/CHANGELOG.md b/packages/dependency-extraction-webpack-plugin/CHANGELOG.md
index b96a8339b0debc..8755a3340d97c2 100644
--- a/packages/dependency-extraction-webpack-plugin/CHANGELOG.md
+++ b/packages/dependency-extraction-webpack-plugin/CHANGELOG.md
@@ -1,10 +1,16 @@
## Master
+## 2.5.0 (2020-04-01)
+
+### New Features
+
+- The plugin now supports an optional `combinedOutputFile` option that is useful only when another `combineAssets` option is enabled. It allows providing a custom output file for the generated single assets file ([#20844](https://github.com/WordPress/gutenberg/pull/20844)).
+
## 2.3.0 (2020-02-21)
### New Features
-- The plugin now supports optional `combineAssets` options. When this flag is set to `true`, all information about assets is combined into a single `assets.(json|php)` file generated in the output directory ([#20330](https://github.com/WordPress/gutenberg/pull/20330)).
+- The plugin now supports optional `combineAssets` option. When this flag is set to `true`, all information about assets is combined into a single `assets.(json|php)` file generated in the output directory ([#20330](https://github.com/WordPress/gutenberg/pull/20330)).
## 2.0.0 (2019-09-16)
diff --git a/packages/dependency-extraction-webpack-plugin/README.md b/packages/dependency-extraction-webpack-plugin/README.md
index 58575c12b47dde..7c4dad1e501ed5 100644
--- a/packages/dependency-extraction-webpack-plugin/README.md
+++ b/packages/dependency-extraction-webpack-plugin/README.md
@@ -123,6 +123,13 @@ The output format for the generated asset file. There are two options available:
By default, one asset file is created for each entry point. When this flag is set to `true`, all information about assets is combined into a single `assets.(json|php)` file generated in the output directory.
+##### `combinedOutputFile`
+
+- Type: string
+- Default: `null`
+
+This option is useful only when the `combineAssets` option is enabled. It allows providing a custom output file for the generated single assets file. It's possible to provide a path that is relative to the output directory.
+
##### `useDefaults`
- Type: boolean
diff --git a/packages/dependency-extraction-webpack-plugin/index.js b/packages/dependency-extraction-webpack-plugin/index.js
index 12e048d4fe2593..89e9a26dbc4513 100644
--- a/packages/dependency-extraction-webpack-plugin/index.js
+++ b/packages/dependency-extraction-webpack-plugin/index.js
@@ -20,6 +20,7 @@ class DependencyExtractionWebpackPlugin {
this.options = Object.assign(
{
combineAssets: false,
+ combinedOutputFile: null,
injectPolyfill: false,
outputFormat: 'php',
useDefaults: true,
@@ -106,6 +107,7 @@ class DependencyExtractionWebpackPlugin {
compiler.hooks.emit.tap( this.constructor.name, ( compilation ) => {
const {
combineAssets,
+ combinedOutputFile,
injectPolyfill,
outputFormat,
} = this.options;
@@ -180,7 +182,8 @@ class DependencyExtractionWebpackPlugin {
const outputFolder = compiler.options.output.path;
const assetsFilePath = path.resolve(
outputFolder,
- 'assets.' + ( outputFormat === 'php' ? 'php' : 'json' )
+ combinedOutputFile ||
+ 'assets.' + ( outputFormat === 'php' ? 'php' : 'json' )
);
const assetsFilename = path.relative(
outputFolder,
diff --git a/packages/dependency-extraction-webpack-plugin/package.json b/packages/dependency-extraction-webpack-plugin/package.json
index 7e1c2f5f3cc6f5..85919790b795bf 100644
--- a/packages/dependency-extraction-webpack-plugin/package.json
+++ b/packages/dependency-extraction-webpack-plugin/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/dependency-extraction-webpack-plugin",
- "version": "2.3.0",
+ "version": "2.5.0",
"description": "Extract WordPress script dependencies from webpack bundles.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/dependency-extraction-webpack-plugin/util.js b/packages/dependency-extraction-webpack-plugin/util.js
index 5185c24682fb6d..e515f752094c63 100644
--- a/packages/dependency-extraction-webpack-plugin/util.js
+++ b/packages/dependency-extraction-webpack-plugin/util.js
@@ -1,5 +1,5 @@
const WORDPRESS_NAMESPACE = '@wordpress/';
-const BUNDLED_PACKAGES = [ '@wordpress/icons' ];
+const BUNDLED_PACKAGES = [ '@wordpress/icons', '@wordpress/interface' ];
/**
* Default request to global transformation
diff --git a/packages/deprecated/package.json b/packages/deprecated/package.json
index fd5b82f0a52da1..a1da68e6648d57 100644
--- a/packages/deprecated/package.json
+++ b/packages/deprecated/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/deprecated",
- "version": "2.7.0",
+ "version": "2.8.0",
"description": "Deprecation utility for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -22,7 +22,7 @@
"react-native": "src/index",
"sideEffects": false,
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/hooks": "file:../hooks"
},
"publishConfig": {
diff --git a/packages/docgen/README.md b/packages/docgen/README.md
index c62b96fc4e44b4..e39594cb4fc644 100644
--- a/packages/docgen/README.md
+++ b/packages/docgen/README.md
@@ -33,9 +33,9 @@ This command will generate a file named `entry-point-api.md` containing all the
* **--output** `(String)`: Output file that will contain the API documentation.
* **--to-section** `(String)`: Append generated documentation to this section in the Markdown output. To be used by the default Markdown formatter. Depends on `--output` and bypasses the custom `--formatter` passed, if any.
* **--to-token**: Embed generated documentation within the start and end tokens in the Markdown output. To be used by the default Markdown formatter.Depends on `--output` and bypasses the custom `--formatter` passed, if any.
- * Start token: ``
- * End token: ``
-* **--use-token** `(String)`: This options allows you to customize the string between the tokens. For example, `--use-token my-api` will look up for the start token `` and the end token ``. Depends on `--to-token`.
+ * Start token: <!-- START TOKEN(Autogenerated API docs) -->
+ * End token: <!-- END TOKEN(Autogenerated API docs) -->
+* **--use-token** `(String)`: This options allows you to customize the string between the tokens. For example, `--use-token my-api` will look up for the start token <!-- START TOKEN(my-api) --> and the end token <!-- END TOKEN(my-api) -->. Depends on `--to-token`.
* **--debug**: Run in debug mode, which outputs some intermediate files useful for debugging.
## Examples
diff --git a/packages/docgen/package.json b/packages/docgen/package.json
index d0fc143594a7c6..8ce4df2ccb83ee 100644
--- a/packages/docgen/package.json
+++ b/packages/docgen/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/docgen",
- "version": "1.7.0",
+ "version": "1.8.0",
"description": "Autogenerate public API documentation from exports and JSDoc comments.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
diff --git a/packages/docgen/src/test/fixtures/tags-function/code.js b/packages/docgen/src/test/fixtures/tags-function/code.js
index cbde0e0b9b0456..4e0bd9644fb90b 100644
--- a/packages/docgen/src/test/fixtures/tags-function/code.js
+++ b/packages/docgen/src/test/fixtures/tags-function/code.js
@@ -2,7 +2,7 @@
* A function that adds two parameters.
*
* @deprecated Use native addition instead.
- * @since v2
+ * @since 2.0.0
*
* @see addition
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators
diff --git a/packages/dom-ready/CHANGELOG.md b/packages/dom-ready/CHANGELOG.md
index 116d21d37d4214..5fd9d40b62cf4d 100644
--- a/packages/dom-ready/CHANGELOG.md
+++ b/packages/dom-ready/CHANGELOG.md
@@ -1,3 +1,11 @@
+## Master
+
+## 2.9.0 (2020-04-15)
+
+### New feature
+
+- Include TypeScript type declarations ([#18942](https://github.com/WordPress/gutenberg/pull/18942))
+
## 2.0.0 (2018-09-05)
### Breaking Change
diff --git a/packages/dom-ready/package.json b/packages/dom-ready/package.json
index 6fd51bdd0b7144..4525e71e5f0912 100644
--- a/packages/dom-ready/package.json
+++ b/packages/dom-ready/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/dom-ready",
- "version": "2.7.0",
+ "version": "2.9.0",
"description": "Execute callback after the DOM is loaded.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -20,9 +20,10 @@
"main": "build/index.js",
"module": "build-module/index.js",
"react-native": "src/index",
+ "types": "build-types",
"sideEffects": false,
"dependencies": {
- "@babel/runtime": "^7.8.3"
+ "@babel/runtime": "^7.9.2"
},
"publishConfig": {
"access": "public"
diff --git a/packages/dom-ready/tsconfig.json b/packages/dom-ready/tsconfig.json
new file mode 100644
index 00000000000000..3c2c31f506f132
--- /dev/null
+++ b/packages/dom-ready/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "declarationDir": "build-types"
+ },
+ "include": [ "src/**/*" ]
+}
diff --git a/packages/dom/README.md b/packages/dom/README.md
index d52e47552f342e..d45b8439915786 100644
--- a/packages/dom/README.md
+++ b/packages/dom/README.md
@@ -118,6 +118,19 @@ _Returns_
- `boolean`: True if at the horizontal edge, false if not.
+# **isNumberInput**
+
+Check whether the given element is an input field of type number
+and has a valueAsNumber
+
+_Parameters_
+
+- _element_ `HTMLElement`: The HTML element.
+
+_Returns_
+
+- `boolean`: True if the element is input and holds a number.
+
# **isTextField**
Check whether the given element is a text field, where text field is defined
diff --git a/packages/dom/package.json b/packages/dom/package.json
index e0199899bb23a3..73284a801a4e25 100644
--- a/packages/dom/package.json
+++ b/packages/dom/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/dom",
- "version": "2.8.0",
+ "version": "2.9.0",
"description": "DOM utilities module for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -23,7 +23,7 @@
"react-native": "src/index",
"sideEffects": false,
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"lodash": "^4.17.15"
},
"publishConfig": {
diff --git a/packages/dom/src/dom.js b/packages/dom/src/dom.js
index c1ae1fbc17395d..8271abe1efcd9f 100644
--- a/packages/dom/src/dom.js
+++ b/packages/dom/src/dom.js
@@ -469,6 +469,20 @@ export function isTextField( element ) {
}
}
+/**
+ * Check whether the given element is an input field of type number
+ * and has a valueAsNumber
+ *
+ * @param {HTMLElement} element The HTML element.
+ *
+ * @return {boolean} True if the element is input and holds a number.
+ */
+export function isNumberInput( element ) {
+ const { nodeName, type, valueAsNumber } = element;
+
+ return nodeName === 'INPUT' && type === 'number' && !! valueAsNumber;
+}
+
/**
* Check wether the current document has a selection.
* This checks both for focus in an input field and general text selection.
@@ -480,6 +494,10 @@ export function documentHasSelection() {
return true;
}
+ if ( isNumberInput( document.activeElement ) ) {
+ return true;
+ }
+
const selection = window.getSelection();
const range = selection.rangeCount ? selection.getRangeAt( 0 ) : null;
diff --git a/packages/dom/src/test/dom.js b/packages/dom/src/test/dom.js
index a2352d75efbd8a..eabb2ed968bd1a 100644
--- a/packages/dom/src/test/dom.js
+++ b/packages/dom/src/test/dom.js
@@ -6,6 +6,7 @@ import {
placeCaretAtHorizontalEdge,
isTextField,
__unstableStripHTML as stripHTML,
+ isNumberInput,
} from '../dom';
describe( 'DOM', () => {
@@ -143,6 +144,21 @@ describe( 'DOM', () => {
);
} );
+ it( 'should return false for empty input element of type number', () => {
+ const input = document.createElement( 'input' );
+ input.type = 'number';
+
+ expect( isNumberInput( input ) ).toBe( false );
+ } );
+
+ it( 'should return true for an input element of type number', () => {
+ const input = document.createElement( 'input' );
+ input.type = 'number';
+ input.valueAsNumber = 23;
+
+ expect( isNumberInput( input ) ).toBe( true );
+ } );
+
it( 'should return true for a contenteditable element', () => {
const div = document.createElement( 'div' );
diff --git a/packages/e2e-test-utils/CHANGELOG.md b/packages/e2e-test-utils/CHANGELOG.md
index f995fb1336bcf4..6d466ba2875021 100644
--- a/packages/e2e-test-utils/CHANGELOG.md
+++ b/packages/e2e-test-utils/CHANGELOG.md
@@ -1,3 +1,15 @@
+## Master
+
+## 4.5.0 (2020-04-15)
+
+### Enhancements
+
+- `visitAdminPage` will now throw an error (emit a test failure) when there are unexpected errors on hte page.
+
+### New Features
+
+- Added `getPageError` function, returning a promise which resolves to an error message present in the page, if any exists.
+
## 4.0.0 (2019-12-19)
### Breaking Changes
diff --git a/packages/e2e-test-utils/README.md b/packages/e2e-test-utils/README.md
index d397bce0bf6470..1e84e815f74dc3 100644
--- a/packages/e2e-test-utils/README.md
+++ b/packages/e2e-test-utils/README.md
@@ -72,6 +72,10 @@ _Parameters_
- _buttonLabel_ `string`: The label to search the button for.
+# **closeGlobalBlockInserter**
+
+Undocumented declaration.
+
# **createEmbeddingMatcher**
Creates a function to determine if a request is embedding a certain URL.
@@ -252,6 +256,21 @@ _Returns_
- `Promise`: Promise resolving with post content markup.
+# **getPageError**
+
+Returns a promise resolving to one of either a string or null. A string will
+be resolved if an error message is present in the contents of the page. If no
+error is present, a null value will be resolved instead. This requires the
+environment be configured to display errors.
+
+_Related_
+
+-
+
+_Returns_
+
+- `Promise`: Promise resolving to a string or null, depending whether a page error is present.
+
# **hasBlockSwitcher**
Returns a boolean indicating if the current selected block has a block switcher or not.
@@ -268,7 +287,6 @@ result that appears.
_Parameters_
- _searchTerm_ `string`: The text to search the inserter for.
-- _panelName_ `string`: The inserter panel to open (if it's closed by default).
# **installPlugin**
@@ -328,10 +346,6 @@ _Returns_
- `Promise`: Promise that uses `mockCheck` to see if a request should be mocked with `mock`, and optionally transforms the response with `responseObjectTransform`.
-# **openAllBlockInserterCategories**
-
-Opens all block inserter categories.
-
# **openDocumentSettingsSidebar**
Clicks on the button in the header which opens Document Settings sidebar when it is closed.
diff --git a/packages/e2e-test-utils/package.json b/packages/e2e-test-utils/package.json
index aad54b05d6515e..4136672e941879 100644
--- a/packages/e2e-test-utils/package.json
+++ b/packages/e2e-test-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/e2e-test-utils",
- "version": "4.3.1",
+ "version": "4.5.0",
"description": "End-To-End (E2E) test utils for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -28,7 +28,7 @@
"main": "build/index.js",
"module": "build-module/index.js",
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/keycodes": "file:../keycodes",
"@wordpress/url": "file:../url",
"lodash": "^4.17.15",
diff --git a/packages/e2e-test-utils/src/create-url.js b/packages/e2e-test-utils/src/create-url.js
index 5bc9e6df3a59d4..d608e75e306ae9 100644
--- a/packages/e2e-test-utils/src/create-url.js
+++ b/packages/e2e-test-utils/src/create-url.js
@@ -2,7 +2,6 @@
* External dependencies
*/
import { join } from 'path';
-import { URL } from 'url';
/**
* Internal dependencies
diff --git a/packages/e2e-test-utils/src/get-all-block-inserter-item-titles.js b/packages/e2e-test-utils/src/get-all-block-inserter-item-titles.js
index eb2802e879b559..b9bc3b058a0c1c 100644
--- a/packages/e2e-test-utils/src/get-all-block-inserter-item-titles.js
+++ b/packages/e2e-test-utils/src/get-all-block-inserter-item-titles.js
@@ -12,7 +12,7 @@ export async function getAllBlockInserterItemTitles() {
const inserterItemTitles = await page.evaluate( () => {
return Array.from(
document.querySelectorAll(
- '.block-editor-inserter__results .block-editor-block-types-list__item-title'
+ '.block-editor-inserter__block-list .block-editor-block-types-list__item-title'
)
).map( ( inserterItem ) => {
return inserterItem.innerText;
diff --git a/packages/e2e-test-utils/src/get-available-block-transforms.js b/packages/e2e-test-utils/src/get-available-block-transforms.js
index 1b3074f0c501a7..eeadabea18f360 100644
--- a/packages/e2e-test-utils/src/get-available-block-transforms.js
+++ b/packages/e2e-test-utils/src/get-available-block-transforms.js
@@ -22,5 +22,5 @@ export const getAvailableBlockTransforms = async () => {
return button.textContent;
}
);
- }, '.block-editor-block-types-list .block-editor-block-types-list__list-item button' );
+ }, '.block-editor-block-switcher__popover .block-editor-block-types-list .block-editor-block-types-list__list-item button' );
};
diff --git a/packages/e2e-test-utils/src/get-page-error.js b/packages/e2e-test-utils/src/get-page-error.js
new file mode 100644
index 00000000000000..0182119ce7e38e
--- /dev/null
+++ b/packages/e2e-test-utils/src/get-page-error.js
@@ -0,0 +1,25 @@
+/**
+ * Regular expression matching a displayed PHP error within a markup string.
+ *
+ * @see https://github.com/php/php-src/blob/598175e/main/main.c#L1257-L1297
+ *
+ * @type {RegExp}
+ */
+const REGEXP_PHP_ERROR = /()?(Fatal error|Recoverable fatal error|Warning|Parse error|Notice|Strict Standards|Deprecated|Unknown error)(<\/b>)?: (.*?) in (.*?) on line ()?\d+(<\/b>)?/;
+
+/**
+ * Returns a promise resolving to one of either a string or null. A string will
+ * be resolved if an error message is present in the contents of the page. If no
+ * error is present, a null value will be resolved instead. This requires the
+ * environment be configured to display errors.
+ *
+ * @see http://php.net/manual/en/function.error-reporting.php
+ *
+ * @return {Promise} Promise resolving to a string or null, depending
+ * whether a page error is present.
+ */
+export async function getPageError() {
+ const content = await page.content();
+ const match = content.match( REGEXP_PHP_ERROR );
+ return match ? match[ 0 ] : null;
+}
diff --git a/packages/e2e-test-utils/src/index.js b/packages/e2e-test-utils/src/index.js
index 136496058223b4..422eca76bee4a3 100644
--- a/packages/e2e-test-utils/src/index.js
+++ b/packages/e2e-test-utils/src/index.js
@@ -22,6 +22,7 @@ export { getAvailableBlockTransforms } from './get-available-block-transforms';
export { getBlockSetting } from './get-block-setting';
export { getEditedPostContent } from './get-edited-post-content';
export { hasBlockSwitcher } from './has-block-switcher';
+export { getPageError } from './get-page-error';
export { insertBlock } from './insert-block';
export { installPlugin } from './install-plugin';
export { isCurrentURL } from './is-current-url';
@@ -31,9 +32,11 @@ export {
enableFocusLossObservation,
disableFocusLossObservation,
} from './observe-focus-loss';
-export { openAllBlockInserterCategories } from './open-all-block-inserter-categories';
export { openDocumentSettingsSidebar } from './open-document-settings-sidebar';
-export { openGlobalBlockInserter } from './open-global-block-inserter';
+export {
+ openGlobalBlockInserter,
+ closeGlobalBlockInserter,
+} from './open-global-block-inserter';
export { openPublishPanel } from './open-publish-panel';
export { pressKeyTimes } from './press-key-times';
export { pressKeyWithModifier } from './press-key-with-modifier';
diff --git a/packages/e2e-test-utils/src/insert-block.js b/packages/e2e-test-utils/src/insert-block.js
index 4190d7c1136ce3..a3a31994165969 100644
--- a/packages/e2e-test-utils/src/insert-block.js
+++ b/packages/e2e-test-utils/src/insert-block.js
@@ -8,16 +8,9 @@ import { searchForBlock } from './search-for-block';
* result that appears.
*
* @param {string} searchTerm The text to search the inserter for.
- * @param {string} panelName The inserter panel to open (if it's closed by default).
*/
-export async function insertBlock( searchTerm, panelName = null ) {
+export async function insertBlock( searchTerm ) {
await searchForBlock( searchTerm );
- if ( panelName ) {
- const panelButton = (
- await page.$x( `//button[contains(text(), '${ panelName }')]` )
- )[ 0 ];
- await panelButton.click();
- }
const insertButton = (
await page.$x( `//button//span[contains(text(), '${ searchTerm }')]` )
)[ 0 ];
diff --git a/packages/e2e-test-utils/src/is-current-url.js b/packages/e2e-test-utils/src/is-current-url.js
index 80058d1225281f..002ce83b4c1e8b 100644
--- a/packages/e2e-test-utils/src/is-current-url.js
+++ b/packages/e2e-test-utils/src/is-current-url.js
@@ -1,8 +1,3 @@
-/**
- * External dependencies
- */
-import { URL } from 'url';
-
/**
* Internal dependencies
*/
diff --git a/packages/e2e-test-utils/src/mocks/create-embedding-matcher.js b/packages/e2e-test-utils/src/mocks/create-embedding-matcher.js
index 403b3a3911220d..754d7bc33068ed 100644
--- a/packages/e2e-test-utils/src/mocks/create-embedding-matcher.js
+++ b/packages/e2e-test-utils/src/mocks/create-embedding-matcher.js
@@ -1,7 +1,7 @@
/**
- * Internal dependencies
+ * External dependencies
*/
-import { createURLMatcher } from './create-url-matcher';
+import { join } from 'path';
/**
* Creates a function to determine if a request has a parameter with a certain value.
@@ -11,16 +11,24 @@ import { createURLMatcher } from './create-url-matcher';
* @return {Function} Function that determines if a request's query parameter is the specified value.
*/
function parameterEquals( parameterName, value ) {
- return ( request ) => {
- const url = request.url();
- const match = new RegExp( `.*${ parameterName }=([^&]+).*` ).exec(
- url
- );
- if ( ! match ) {
- return false;
- }
- return value === decodeURIComponent( match[ 1 ] );
- };
+ return ( request ) =>
+ new URL( request.url() ).searchParams.get( parameterName ) === value;
+}
+
+/**
+ * Creates a function to determine if a request is a REST request of a given
+ * path, accounting for variance in site permalink configuration.
+ *
+ * @param {string} path REST path to test.
+ *
+ * @return {Function} Function that determines if a request is a REST request of
+ * a given path, accounting for variance in site permalink
+ * configuration.
+ */
+function isRESTRoute( path ) {
+ return ( request ) =>
+ parameterEquals( 'rest_route', path )( request ) ||
+ new URL( request.url() ).pathname.endsWith( join( '/wp-json', path ) );
}
/**
@@ -31,6 +39,6 @@ function parameterEquals( parameterName, value ) {
*/
export function createEmbeddingMatcher( url ) {
return ( request ) =>
- createURLMatcher( 'oembed%2F1.0%2Fproxy' )( request ) &&
+ isRESTRoute( '/oembed/1.0/proxy' )( request ) &&
parameterEquals( 'url', url )( request );
}
diff --git a/packages/e2e-test-utils/src/open-all-block-inserter-categories.js b/packages/e2e-test-utils/src/open-all-block-inserter-categories.js
deleted file mode 100644
index 9b31a0cd36c4ae..00000000000000
--- a/packages/e2e-test-utils/src/open-all-block-inserter-categories.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * Opens all block inserter categories.
- */
-export async function openAllBlockInserterCategories() {
- const notOppenedCategorySelector =
- '.block-editor-inserter__results .components-panel__body:not(.is-opened)';
- let categoryPanel = await page.$( notOppenedCategorySelector );
- while ( categoryPanel !== null ) {
- await categoryPanel.click();
- categoryPanel = await page.$( notOppenedCategorySelector );
- }
-}
diff --git a/packages/e2e-test-utils/src/open-global-block-inserter.js b/packages/e2e-test-utils/src/open-global-block-inserter.js
index 5bbd83a0d86289..2e39325f763b21 100644
--- a/packages/e2e-test-utils/src/open-global-block-inserter.js
+++ b/packages/e2e-test-utils/src/open-global-block-inserter.js
@@ -2,8 +2,31 @@
* Opens the global block inserter.
*/
export async function openGlobalBlockInserter() {
- await page.click( '.edit-post-header [aria-label="Add block"]' );
- // Waiting here is necessary because sometimes the inserter takes more time to
- // render than Puppeteer takes to complete the 'click' action
- await page.waitForSelector( '.block-editor-inserter__menu' );
+ if ( ! ( await isGlobalInserterOpen() ) ) {
+ await toggleGlobalBlockInserter();
+
+ // Waiting here is necessary because sometimes the inserter takes more time to
+ // render than Puppeteer takes to complete the 'click' action
+ await page.waitForSelector( '.block-editor-inserter__menu' );
+ }
+}
+
+export async function closeGlobalBlockInserter() {
+ if ( await isGlobalInserterOpen() ) {
+ await toggleGlobalBlockInserter();
+ }
+}
+
+async function isGlobalInserterOpen() {
+ return await page.evaluate( () => {
+ return !! document.querySelector(
+ '.edit-post-header [aria-label="Add block"].is-pressed, .edit-site-header [aria-label="Add block"].is-pressed'
+ );
+ } );
+}
+
+async function toggleGlobalBlockInserter() {
+ await page.click(
+ '.edit-post-header [aria-label="Add block"], .edit-site-header [aria-label="Add block"]'
+ );
}
diff --git a/packages/e2e-test-utils/src/search-for-block.js b/packages/e2e-test-utils/src/search-for-block.js
index bf8b7cd1e74d4c..2763d98f614923 100644
--- a/packages/e2e-test-utils/src/search-for-block.js
+++ b/packages/e2e-test-utils/src/search-for-block.js
@@ -2,6 +2,7 @@
* Internal dependencies
*/
import { openGlobalBlockInserter } from './open-global-block-inserter';
+import { pressKeyWithModifier } from './press-key-with-modifier';
/**
* Search for block in the global inserter
@@ -10,5 +11,7 @@ import { openGlobalBlockInserter } from './open-global-block-inserter';
*/
export async function searchForBlock( searchTerm ) {
await openGlobalBlockInserter();
+ await page.focus( '.block-editor-inserter__search-input' );
+ await pressKeyWithModifier( 'primary', 'a' );
await page.keyboard.type( searchTerm );
}
diff --git a/packages/e2e-test-utils/src/test/get-page-error.js b/packages/e2e-test-utils/src/test/get-page-error.js
new file mode 100644
index 00000000000000..ef8c113372f35c
--- /dev/null
+++ b/packages/e2e-test-utils/src/test/get-page-error.js
@@ -0,0 +1,44 @@
+/**
+ * Internal dependencies
+ */
+import { getPageError } from '../get-page-error';
+
+describe( 'getPageError', () => {
+ let originalPage;
+
+ beforeEach( () => {
+ originalPage = global.page;
+ } );
+
+ afterEach( () => {
+ global.page = originalPage;
+ } );
+
+ it( 'resolves to null if there is no error', async () => {
+ global.page = {
+ content: () => 'Happy!',
+ };
+
+ expect( await getPageError() ).toBe( null );
+ } );
+
+ it.each( [
+ [
+ 'PHP, HTML',
+ 'Notice : Undefined property: WP_Block_Type_Registry::$x in /var/www/html/wp-content/plugins/gutenberg/lib/blocks.php on line 47 ',
+ ],
+ [
+ 'PHP, Plaintext',
+ 'Notice: Undefined property: WP_Block_Type_Registry::$x in /var/www/html/wp-content/plugins/gutenberg/lib/blocks.php on line 47',
+ ],
+ ] )(
+ 'resolves to the error message if there is an error (%s)',
+ async ( _variant, error ) => {
+ global.page = {
+ content: () => error,
+ };
+
+ expect( await getPageError() ).toBe( error );
+ }
+ );
+} );
diff --git a/packages/e2e-test-utils/src/transform-block-to.js b/packages/e2e-test-utils/src/transform-block-to.js
index f3aa8f97b2f523..8de1debe491a83 100644
--- a/packages/e2e-test-utils/src/transform-block-to.js
+++ b/packages/e2e-test-utils/src/transform-block-to.js
@@ -12,9 +12,10 @@ export async function transformBlockTo( name ) {
await switcherToggle.click();
// Find the block button option within the switcher popover.
- const switcher = await page.$( '.block-editor-block-switcher__container' );
const insertButton = (
- await switcher.$x( `//button[.='${ name }']` )
+ await page.$x(
+ `//*[contains(@class, "block-editor-block-switcher__popover")]//button[.='${ name }']`
+ )
)[ 0 ];
// Clicks may fail if the button is out of view. Assure it is before click.
diff --git a/packages/e2e-test-utils/src/visit-admin-page.js b/packages/e2e-test-utils/src/visit-admin-page.js
index ac74c4ce688182..8f4a6c7260d34a 100644
--- a/packages/e2e-test-utils/src/visit-admin-page.js
+++ b/packages/e2e-test-utils/src/visit-admin-page.js
@@ -9,6 +9,7 @@ import { join } from 'path';
import { createURL } from './create-url';
import { isCurrentURL } from './is-current-url';
import { loginUser } from './login-user';
+import { getPageError } from './get-page-error';
/**
* Visits admin page; if user is not logged in then it logging in it first, then visits admin page.
@@ -23,4 +24,9 @@ export async function visitAdminPage( adminPath, query ) {
await loginUser();
await visitAdminPage( adminPath, query );
}
+
+ const error = await getPageError();
+ if ( error ) {
+ throw new Error( 'Unexpected error in page content: ' + error );
+ }
}
diff --git a/packages/e2e-tests/config/performance-reporter.js b/packages/e2e-tests/config/performance-reporter.js
index f7bb05666054d5..32ea362973ed1f 100644
--- a/packages/e2e-tests/config/performance-reporter.js
+++ b/packages/e2e-tests/config/performance-reporter.js
@@ -1,9 +1,18 @@
const { readFileSync, existsSync } = require( 'fs' );
+const chalk = require( 'chalk' );
function average( array ) {
return array.reduce( ( a, b ) => a + b ) / array.length;
}
+function round( number, decimalPlaces = 2 ) {
+ const factor = Math.pow( 10, decimalPlaces );
+ return Math.round( number * factor ) / factor;
+}
+
+const title = chalk.bold;
+const success = chalk.bold.green;
+
class PerformanceReporter {
onRunComplete() {
const path = __dirname + '/../specs/performance/results.json';
@@ -13,16 +22,46 @@ class PerformanceReporter {
}
const results = readFileSync( path, 'utf8' );
- const { load, domcontentloaded, type } = JSON.parse( results );
+ const { load, domcontentloaded, type, focus } = JSON.parse( results );
+
+ if ( load && load.length ) {
+ // eslint-disable-next-line no-console
+ console.log( `
+${ title( 'Loading Time:' ) }
+Average time to load: ${ success( round( average( load ) ) + 'ms' ) }
+Average time to DOM content load: ${ success(
+ round( average( domcontentloaded ) ) + 'ms'
+ ) }` );
+ }
+
+ if ( type && type.length ) {
+ // eslint-disable-next-line no-console
+ console.log( `
+${ title( 'Typing Performance:' ) }
+Average time to type character: ${ success( round( average( type ) ) + 'ms' ) }
+Slowest time to type character: ${ success(
+ round( Math.max( ...type ) ) + 'ms'
+ ) }
+Fastest time to type character: ${ success(
+ round( Math.min( ...type ) ) + 'ms'
+ ) }` );
+ }
+
+ if ( focus && focus.length ) {
+ // eslint-disable-next-line no-console
+ console.log( `
+${ title( 'Block Selection Performance:' ) }
+Average time to select a block: ${ success( round( average( focus ) ) + 'ms' ) }
+Slowest time to select a block: ${ success(
+ round( Math.max( ...focus ) ) + 'ms'
+ ) }
+Fastest time to select a block: ${ success(
+ round( Math.min( ...focus ) ) + 'ms'
+ ) }` );
+ }
// eslint-disable-next-line no-console
- console.log( `
-Average time to load: ${ average( load ) }ms
-Average time to DOM content load: ${ average( domcontentloaded ) }ms
-Average time to type character: ${ average( type ) }ms
-Slowest time to type character: ${ Math.max( ...type ) }ms
-Fastest time to type character: ${ Math.min( ...type ) }ms
- ` );
+ console.log( '' );
}
}
diff --git a/packages/e2e-tests/config/setup-test-framework.js b/packages/e2e-tests/config/setup-test-framework.js
index d4f547a7190cc4..8a78279730d317 100644
--- a/packages/e2e-tests/config/setup-test-framework.js
+++ b/packages/e2e-tests/config/setup-test-framework.js
@@ -16,6 +16,7 @@ import {
switchUserToTest,
visitAdminPage,
} from '@wordpress/e2e-test-utils';
+import { addQueryArgs } from '@wordpress/url';
/**
* Timeout, in seconds, that the test should be allowed to run.
@@ -69,12 +70,17 @@ async function setupBrowser() {
/**
* Navigates to the post listing screen and bulk-trashes any posts which exist.
*
+ * @param {string} postType - String slug for type of post to trash.
+ *
* @return {Promise} Promise resolving once posts have been trashed.
*/
-async function trashExistingPosts() {
+export async function trashExistingPosts( postType = 'post' ) {
await switchUserToAdmin();
// Visit `/wp-admin/edit.php` so we can see a list of posts and delete them.
- await visitAdminPage( 'edit.php' );
+ const query = addQueryArgs( '', {
+ post_type: postType,
+ } ).slice( 1 );
+ await visitAdminPage( 'edit.php', query );
// If this selector doesn't exist there are no posts for us to delete.
const bulkSelector = await page.$( '#bulk-action-selector-top' );
@@ -228,6 +234,7 @@ async function runAxeTestsForBlockEditor() {
'dlitem',
'duplicate-id',
'label',
+ 'landmark-one-main',
'link-name',
'listitem',
'region',
diff --git a/packages/e2e-tests/fixtures/blocks/core__button__center.serialized.html b/packages/e2e-tests/fixtures/blocks/core__button__center.serialized.html
deleted file mode 100644
index 3d88c7ec1a551a..00000000000000
--- a/packages/e2e-tests/fixtures/blocks/core__button__center.serialized.html
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/packages/e2e-tests/fixtures/blocks/core__button__center.html b/packages/e2e-tests/fixtures/blocks/core__button__center__deprecated.html
similarity index 100%
rename from packages/e2e-tests/fixtures/blocks/core__button__center.html
rename to packages/e2e-tests/fixtures/blocks/core__button__center__deprecated.html
diff --git a/packages/e2e-tests/fixtures/blocks/core__button__center.json b/packages/e2e-tests/fixtures/blocks/core__button__center__deprecated.json
similarity index 100%
rename from packages/e2e-tests/fixtures/blocks/core__button__center.json
rename to packages/e2e-tests/fixtures/blocks/core__button__center__deprecated.json
diff --git a/packages/e2e-tests/fixtures/blocks/core__button__center.parsed.json b/packages/e2e-tests/fixtures/blocks/core__button__center__deprecated.parsed.json
similarity index 100%
rename from packages/e2e-tests/fixtures/blocks/core__button__center.parsed.json
rename to packages/e2e-tests/fixtures/blocks/core__button__center__deprecated.parsed.json
diff --git a/packages/e2e-tests/fixtures/blocks/core__button__center__deprecated.serialized.html b/packages/e2e-tests/fixtures/blocks/core__button__center__deprecated.serialized.html
new file mode 100644
index 00000000000000..5fee004c30ddd6
--- /dev/null
+++ b/packages/e2e-tests/fixtures/blocks/core__button__center__deprecated.serialized.html
@@ -0,0 +1,3 @@
+
+Help build Gutenberg
+
diff --git a/packages/e2e-tests/fixtures/blocks/core__button__squared.html b/packages/e2e-tests/fixtures/blocks/core__button__squared.html
index ddf0e54bc46cd3..d7a2b6f5f95908 100644
--- a/packages/e2e-tests/fixtures/blocks/core__button__squared.html
+++ b/packages/e2e-tests/fixtures/blocks/core__button__squared.html
@@ -1,3 +1,3 @@
-
-
+
+My button
diff --git a/packages/e2e-tests/fixtures/blocks/core__button__squared.json b/packages/e2e-tests/fixtures/blocks/core__button__squared.json
index aa0b51793a6465..f3aa8241d516f0 100644
--- a/packages/e2e-tests/fixtures/blocks/core__button__squared.json
+++ b/packages/e2e-tests/fixtures/blocks/core__button__squared.json
@@ -5,12 +5,16 @@
"isValid": true,
"attributes": {
"text": "My button",
- "align": "none",
- "customBackgroundColor": "#aa5a20",
- "customTextColor": "#1b9b6c",
+ "align": "none",
+ "style": {
+ "color": {
+ "background": "#aa5a20",
+ "text": "#1b9b6c"
+ }
+ },
"borderRadius": 0
},
"innerBlocks": [],
- "originalContent": ""
+ "originalContent": "My button "
}
]
diff --git a/packages/e2e-tests/fixtures/blocks/core__button__squared.parsed.json b/packages/e2e-tests/fixtures/blocks/core__button__squared.parsed.json
index 61facd925b7497..dc1ea8f2ca3470 100644
--- a/packages/e2e-tests/fixtures/blocks/core__button__squared.parsed.json
+++ b/packages/e2e-tests/fixtures/blocks/core__button__squared.parsed.json
@@ -2,14 +2,19 @@
{
"blockName": "core/button",
"attrs": {
- "customBackgroundColor": "#aa5a20",
- "customTextColor": "#1b9b6c",
- "className": "is-style-squared"
+ "align": "none",
+ "borderRadius": 0,
+ "style": {
+ "color": {
+ "background": "#aa5a20",
+ "text": "#1b9b6c"
+ }
+ }
},
"innerBlocks": [],
- "innerHTML": "\n\n",
+ "innerHTML": "\nMy button \n",
"innerContent": [
- "\n\n"
+ "\nMy button \n"
]
},
{
diff --git a/packages/e2e-tests/fixtures/blocks/core__button__squared.serialized.html b/packages/e2e-tests/fixtures/blocks/core__button__squared.serialized.html
index 3d492c6ee0fe81..d7a2b6f5f95908 100644
--- a/packages/e2e-tests/fixtures/blocks/core__button__squared.serialized.html
+++ b/packages/e2e-tests/fixtures/blocks/core__button__squared.serialized.html
@@ -1,3 +1,3 @@
-
-
+
+My button
diff --git a/packages/e2e-tests/fixtures/blocks/core__buttons.html b/packages/e2e-tests/fixtures/blocks/core__buttons.html
index e70af7acc72ad4..02f5487560cee4 100644
--- a/packages/e2e-tests/fixtures/blocks/core__buttons.html
+++ b/packages/e2e-tests/fixtures/blocks/core__buttons.html
@@ -1,11 +1,11 @@
diff --git a/packages/e2e-tests/fixtures/blocks/core__buttons.json b/packages/e2e-tests/fixtures/blocks/core__buttons.json
index 044daeb82101ac..d77d9752de37b0 100644
--- a/packages/e2e-tests/fixtures/blocks/core__buttons.json
+++ b/packages/e2e-tests/fixtures/blocks/core__buttons.json
@@ -13,7 +13,7 @@
"text": "My button 1"
},
"innerBlocks": [],
- "originalContent": ""
+ "originalContent": "My button 1 "
},
{
"clientId": "_clientId_1",
@@ -23,7 +23,7 @@
"text": "My button 2"
},
"innerBlocks": [],
- "originalContent": ""
+ "originalContent": "My button 2 "
}
],
"originalContent": " \n\t\n\n\t\n
"
diff --git a/packages/e2e-tests/fixtures/blocks/core__buttons.parsed.json b/packages/e2e-tests/fixtures/blocks/core__buttons.parsed.json
index b96b1f50db1fc9..ee9dd97313a48b 100644
--- a/packages/e2e-tests/fixtures/blocks/core__buttons.parsed.json
+++ b/packages/e2e-tests/fixtures/blocks/core__buttons.parsed.json
@@ -7,18 +7,18 @@
"blockName": "core/button",
"attrs": {},
"innerBlocks": [],
- "innerHTML": "\n\t\n\t",
+ "innerHTML": "\n\tMy button 1 \n\t",
"innerContent": [
- "\n\t\n\t"
+ "\n\tMy button 1 \n\t"
]
},
{
"blockName": "core/button",
"attrs": {},
"innerBlocks": [],
- "innerHTML": "\n\t\n\t",
+ "innerHTML": "\n\tMy button 2 \n\t",
"innerContent": [
- "\n\t\n\t"
+ "\n\tMy button 2 \n\t"
]
}
],
diff --git a/packages/e2e-tests/fixtures/blocks/core__buttons.serialized.html b/packages/e2e-tests/fixtures/blocks/core__buttons.serialized.html
index baf0a0226c066c..18eb4b31eda593 100644
--- a/packages/e2e-tests/fixtures/blocks/core__buttons.serialized.html
+++ b/packages/e2e-tests/fixtures/blocks/core__buttons.serialized.html
@@ -1,9 +1,9 @@
diff --git a/packages/e2e-tests/fixtures/blocks/core__columns.serialized.html b/packages/e2e-tests/fixtures/blocks/core__columns.serialized.html
index 664beb08154a7f..2b95373d1a7b83 100644
--- a/packages/e2e-tests/fixtures/blocks/core__columns.serialized.html
+++ b/packages/e2e-tests/fixtures/blocks/core__columns.serialized.html
@@ -1,5 +1,5 @@
-
+
Column One, Paragraph One
diff --git a/packages/e2e-tests/fixtures/blocks/core__cover__deprecated-5.html b/packages/e2e-tests/fixtures/blocks/core__cover__deprecated-5.html
new file mode 100644
index 00000000000000..5d0cea3342537c
--- /dev/null
+++ b/packages/e2e-tests/fixtures/blocks/core__cover__deprecated-5.html
@@ -0,0 +1,11 @@
+
+
+
diff --git a/packages/e2e-tests/fixtures/blocks/core__cover__deprecated-5.json b/packages/e2e-tests/fixtures/blocks/core__cover__deprecated-5.json
new file mode 100644
index 00000000000000..d333818e8c0525
--- /dev/null
+++ b/packages/e2e-tests/fixtures/blocks/core__cover__deprecated-5.json
@@ -0,0 +1,33 @@
+[
+ {
+ "clientId": "_clientId_0",
+ "name": "core/cover",
+ "isValid": true,
+ "attributes": {
+ "url": "data:image/jpeg;base64,/9j/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/yQALCAABAAEBAREA/8wABgAQEAX/2gAIAQEAAD8A0s8g/9k=",
+ "hasParallax": false,
+ "dimRatio": 50,
+ "backgroundType": "image",
+ "title": "",
+ "contentAlign": "center",
+ "gradient": "midnight"
+ },
+ "innerBlocks": [
+ {
+ "clientId": "_clientId_0",
+ "name": "core/paragraph",
+ "isValid": true,
+ "attributes": {
+ "align": "center",
+ "content": "Cover",
+ "dropCap": false,
+ "placeholder": "Write title…",
+ "fontSize": "large"
+ },
+ "innerBlocks": [],
+ "originalContent": "
Cover
"
+ }
+ ],
+ "originalContent": "
"
+ }
+]
diff --git a/packages/e2e-tests/fixtures/blocks/core__cover__deprecated-5.parsed.json b/packages/e2e-tests/fixtures/blocks/core__cover__deprecated-5.parsed.json
new file mode 100644
index 00000000000000..8603ab1cb601a9
--- /dev/null
+++ b/packages/e2e-tests/fixtures/blocks/core__cover__deprecated-5.parsed.json
@@ -0,0 +1,39 @@
+[
+ {
+ "blockName": "core/cover",
+ "attrs": {
+ "url": "data:image/jpeg;base64,/9j/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/yQALCAABAAEBAREA/8wABgAQEAX/2gAIAQEAAD8A0s8g/9k=",
+ "gradient": "midnight"
+ },
+ "innerBlocks": [
+ {
+ "blockName": "core/paragraph",
+ "attrs": {
+ "align": "center",
+ "placeholder": "Write title…",
+ "fontSize": "large"
+ },
+ "innerBlocks": [],
+ "innerHTML": "\n\t\t
Cover
\n\t\t",
+ "innerContent": [
+ "\n\t\t
Cover
\n\t\t"
+ ]
+ }
+ ],
+ "innerHTML": "\n
\n",
+ "innerContent": [
+ "\n
\n\t
\n\t
\n\t\t",
+ null,
+ "\n\t
\n
\n"
+ ]
+ },
+ {
+ "blockName": null,
+ "attrs": {},
+ "innerBlocks": [],
+ "innerHTML": "\n",
+ "innerContent": [
+ "\n"
+ ]
+ }
+]
diff --git a/packages/e2e-tests/fixtures/blocks/core__cover__deprecated-5.serialized.html b/packages/e2e-tests/fixtures/blocks/core__cover__deprecated-5.serialized.html
new file mode 100644
index 00000000000000..7f9380bbf08ec7
--- /dev/null
+++ b/packages/e2e-tests/fixtures/blocks/core__cover__deprecated-5.serialized.html
@@ -0,0 +1,5 @@
+
+
+
diff --git a/packages/e2e-tests/fixtures/blocks/core__group.html b/packages/e2e-tests/fixtures/blocks/core__group.html
index 09fd95cfc9d5a4..e5df0f2fce926a 100644
--- a/packages/e2e-tests/fixtures/blocks/core__group.html
+++ b/packages/e2e-tests/fixtures/blocks/core__group.html
@@ -1,4 +1,4 @@
-
+
diff --git a/packages/e2e-tests/fixtures/blocks/core__group.json b/packages/e2e-tests/fixtures/blocks/core__group.json
index 71d94f926dcccf..526a8d70fbcdfa 100644
--- a/packages/e2e-tests/fixtures/blocks/core__group.json
+++ b/packages/e2e-tests/fixtures/blocks/core__group.json
@@ -4,8 +4,9 @@
"name": "core/group",
"isValid": true,
"attributes": {
- "backgroundColor": "secondary",
- "align": "full"
+ "tagName": "div",
+ "align": "full",
+ "backgroundColor": "secondary"
},
"innerBlocks": [
{
diff --git a/packages/e2e-tests/fixtures/blocks/core__group.parsed.json b/packages/e2e-tests/fixtures/blocks/core__group.parsed.json
index bf2b50feb5fd1f..ba86ac5a02d6bd 100644
--- a/packages/e2e-tests/fixtures/blocks/core__group.parsed.json
+++ b/packages/e2e-tests/fixtures/blocks/core__group.parsed.json
@@ -2,8 +2,8 @@
{
"blockName": "core/group",
"attrs": {
- "backgroundColor": "secondary",
- "align": "full"
+ "align": "full",
+ "backgroundColor": "secondary"
},
"innerBlocks": [
{
diff --git a/packages/e2e-tests/fixtures/blocks/core__group.serialized.html b/packages/e2e-tests/fixtures/blocks/core__group.serialized.html
index 2c398b530dedc5..8ac236255f9f61 100644
--- a/packages/e2e-tests/fixtures/blocks/core__group.serialized.html
+++ b/packages/e2e-tests/fixtures/blocks/core__group.serialized.html
@@ -1,4 +1,4 @@
-
+
This is a group block.
diff --git a/packages/e2e-tests/fixtures/blocks/core__group__deprecated-2.json b/packages/e2e-tests/fixtures/blocks/core__group__deprecated-2.json
index 38addc059eec30..7bfd9dafac7069 100644
--- a/packages/e2e-tests/fixtures/blocks/core__group__deprecated-2.json
+++ b/packages/e2e-tests/fixtures/blocks/core__group__deprecated-2.json
@@ -4,7 +4,8 @@
"name": "core/group",
"isValid": true,
"attributes": {
- "textColor": "accent"
+ "textColor": "accent",
+ "tagName": "div"
},
"innerBlocks": [
{
diff --git a/packages/e2e-tests/fixtures/blocks/core__group__deprecated.html b/packages/e2e-tests/fixtures/blocks/core__group__deprecated.html
index bd111993515f16..9b71121607e437 100644
--- a/packages/e2e-tests/fixtures/blocks/core__group__deprecated.html
+++ b/packages/e2e-tests/fixtures/blocks/core__group__deprecated.html
@@ -1,4 +1,4 @@
-
+
test
diff --git a/packages/e2e-tests/fixtures/blocks/core__group__deprecated.json b/packages/e2e-tests/fixtures/blocks/core__group__deprecated.json
index c86392f55adb97..7f1f51c3644e40 100644
--- a/packages/e2e-tests/fixtures/blocks/core__group__deprecated.json
+++ b/packages/e2e-tests/fixtures/blocks/core__group__deprecated.json
@@ -6,7 +6,8 @@
"attributes": {
"backgroundColor": "lighter-blue",
"align": "full",
- "anchor": "test-id"
+ "anchor": "test-id",
+ "tagName": "div"
},
"innerBlocks": [
{
diff --git a/packages/e2e-tests/fixtures/blocks/core__group__deprecated.parsed.json b/packages/e2e-tests/fixtures/blocks/core__group__deprecated.parsed.json
index 20116913b718f1..09778708d0b9e3 100644
--- a/packages/e2e-tests/fixtures/blocks/core__group__deprecated.parsed.json
+++ b/packages/e2e-tests/fixtures/blocks/core__group__deprecated.parsed.json
@@ -2,8 +2,8 @@
{
"blockName": "core/group",
"attrs": {
- "backgroundColor": "lighter-blue",
- "align": "full"
+ "align": "full",
+ "backgroundColor": "lighter-blue"
},
"innerBlocks": [
{
diff --git a/packages/e2e-tests/fixtures/blocks/core__group__deprecated.serialized.html b/packages/e2e-tests/fixtures/blocks/core__group__deprecated.serialized.html
index 891c48e13ef040..b9f1dc3ba37e12 100644
--- a/packages/e2e-tests/fixtures/blocks/core__group__deprecated.serialized.html
+++ b/packages/e2e-tests/fixtures/blocks/core__group__deprecated.serialized.html
@@ -1,4 +1,4 @@
-
+
diff --git a/packages/e2e-tests/fixtures/blocks/core__heading__deprecated-3.json b/packages/e2e-tests/fixtures/blocks/core__heading__deprecated-3.json
index ba5b3079e888c4..d4d93c52448969 100644
--- a/packages/e2e-tests/fixtures/blocks/core__heading__deprecated-3.json
+++ b/packages/e2e-tests/fixtures/blocks/core__heading__deprecated-3.json
@@ -6,7 +6,11 @@
"attributes": {
"content": "Text",
"level": 2,
- "customTextColor": "#268ebb"
+ "style": {
+ "color": {
+ "text": "#268ebb"
+ }
+ }
},
"innerBlocks": [],
"originalContent": "
Text "
diff --git a/packages/e2e-tests/fixtures/blocks/core__heading__deprecated-3.serialized.html b/packages/e2e-tests/fixtures/blocks/core__heading__deprecated-3.serialized.html
index 7efa248386cefd..c2c4470e500f1e 100644
--- a/packages/e2e-tests/fixtures/blocks/core__heading__deprecated-3.serialized.html
+++ b/packages/e2e-tests/fixtures/blocks/core__heading__deprecated-3.serialized.html
@@ -1,3 +1,3 @@
-
+
Text
diff --git a/packages/e2e-tests/fixtures/blocks/core__post-comments.html b/packages/e2e-tests/fixtures/blocks/core__post-comments.html
new file mode 100644
index 00000000000000..624be4a845676f
--- /dev/null
+++ b/packages/e2e-tests/fixtures/blocks/core__post-comments.html
@@ -0,0 +1 @@
+
diff --git a/packages/e2e-tests/fixtures/blocks/core__post-comments.json b/packages/e2e-tests/fixtures/blocks/core__post-comments.json
new file mode 100644
index 00000000000000..7914b32791b3f1
--- /dev/null
+++ b/packages/e2e-tests/fixtures/blocks/core__post-comments.json
@@ -0,0 +1,10 @@
+[
+ {
+ "clientId": "_clientId_0",
+ "name": "core/post-comments",
+ "isValid": true,
+ "attributes": {},
+ "innerBlocks": [],
+ "originalContent": ""
+ }
+]
diff --git a/packages/e2e-tests/fixtures/blocks/core__post-comments.parsed.json b/packages/e2e-tests/fixtures/blocks/core__post-comments.parsed.json
new file mode 100644
index 00000000000000..546ccf8596c959
--- /dev/null
+++ b/packages/e2e-tests/fixtures/blocks/core__post-comments.parsed.json
@@ -0,0 +1,18 @@
+[
+ {
+ "blockName": "core/post-comments",
+ "attrs": {},
+ "innerBlocks": [],
+ "innerHTML": "",
+ "innerContent": []
+ },
+ {
+ "blockName": null,
+ "attrs": {},
+ "innerBlocks": [],
+ "innerHTML": "\n",
+ "innerContent": [
+ "\n"
+ ]
+ }
+]
diff --git a/packages/e2e-tests/fixtures/blocks/core__post-comments.serialized.html b/packages/e2e-tests/fixtures/blocks/core__post-comments.serialized.html
new file mode 100644
index 00000000000000..624be4a845676f
--- /dev/null
+++ b/packages/e2e-tests/fixtures/blocks/core__post-comments.serialized.html
@@ -0,0 +1 @@
+
diff --git a/packages/e2e-tests/package.json b/packages/e2e-tests/package.json
index 5e231fcfd765bc..26f21d0e9664f8 100644
--- a/packages/e2e-tests/package.json
+++ b/packages/e2e-tests/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/e2e-tests",
- "version": "1.12.5",
+ "version": "1.14.1",
"description": "End-To-End (E2E) tests for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -27,9 +27,10 @@
"@wordpress/jest-puppeteer-axe": "file:../jest-puppeteer-axe",
"@wordpress/scripts": "file:../scripts",
"@wordpress/url": "file:../url",
- "expect-puppeteer": "^4.3.0",
+ "chalk": "^4.0.0",
+ "expect-puppeteer": "^4.4.0",
"lodash": "^4.17.15",
- "uuid": "^3.3.2"
+ "uuid": "^7.0.2"
},
"peerDependencies": {
"jest": ">=24",
diff --git a/packages/e2e-tests/plugins/block-context.php b/packages/e2e-tests/plugins/block-context.php
new file mode 100644
index 00000000000000..13db6436630d30
--- /dev/null
+++ b/packages/e2e-tests/plugins/block-context.php
@@ -0,0 +1,63 @@
+ array(
+ 'recordId' => array(
+ 'type' => 'number',
+ 'default' => 0,
+ ),
+ ),
+ 'providesContext' => array(
+ 'gutenberg/recordId' => 'recordId',
+ ),
+ )
+ );
+
+ register_block_type(
+ 'gutenberg/test-context-consumer',
+ array(
+ 'context' => array( 'gutenberg/recordId' ),
+ 'render_callback' => function( $block ) {
+ $record_id = $block->context['gutenberg/recordId'];
+
+ if ( ! is_int( $record_id ) ) {
+ throw new Exception( 'Expected numeric recordId' );
+ }
+
+ return 'The record ID is: ' . filter_var( $record_id, FILTER_VALIDATE_INT );
+ },
+ )
+ );
+}
+add_action( 'init', 'gutenberg_test_register_context_blocks' );
diff --git a/packages/e2e-tests/plugins/block-context/index.js b/packages/e2e-tests/plugins/block-context/index.js
new file mode 100644
index 00000000000000..2ccd6c6059ce99
--- /dev/null
+++ b/packages/e2e-tests/plugins/block-context/index.js
@@ -0,0 +1,60 @@
+( function() {
+ const { createElement: el, Fragment } = wp.element;
+ const { registerBlockType } = wp.blocks;
+ const { InnerBlocks } = wp.blockEditor;
+
+ registerBlockType( 'gutenberg/test-context-provider', {
+ title: 'Test Context Provider',
+
+ // TODO: While redundant with server-side registration, it's required
+ // to assign this value since it is not picked in the implementation of
+ // `get_block_editor_server_block_settings`.
+ providesContext: {
+ 'gutenberg/recordId': 'recordId',
+ },
+
+ category: 'common',
+
+ edit( { attributes, setAttributes } ) {
+ return el(
+ Fragment,
+ null,
+ el( 'input', {
+ value: attributes.recordId,
+ onChange( event ) {
+ setAttributes( {
+ recordId: Number( event.currentTarget.value ),
+ } );
+ },
+ } ),
+ el( InnerBlocks, {
+ template: [ [ 'gutenberg/test-context-consumer', {} ] ],
+ templateLock: 'all',
+ } )
+ );
+ },
+
+ save() {
+ return el( InnerBlocks.Content );
+ },
+ } );
+
+ registerBlockType( 'gutenberg/test-context-consumer', {
+ title: 'Test Context Consumer',
+
+ // TODO: While redundant with server-side registration, it's required
+ // to assign this value since it is not picked in the implementation of
+ // `get_block_editor_server_block_settings`.
+ context: [ 'gutenberg/recordId' ],
+
+ category: 'common',
+
+ edit( { context } ) {
+ return 'The record ID is: ' + context[ 'gutenberg/recordId' ];
+ },
+
+ save() {
+ return null;
+ },
+ } );
+} )();
diff --git a/packages/e2e-tests/plugins/inner-blocks-allowed-blocks/index.js b/packages/e2e-tests/plugins/inner-blocks-allowed-blocks/index.js
index f6f61c27d5c82c..f85721b0d15e78 100644
--- a/packages/e2e-tests/plugins/inner-blocks-allowed-blocks/index.js
+++ b/packages/e2e-tests/plugins/inner-blocks-allowed-blocks/index.js
@@ -4,19 +4,20 @@
const { createElement: el } = wp.element;
const { InnerBlocks } = wp.blockEditor;
const __ = wp.i18n.__;
- const divProps = { className: 'product', style: { outline: '1px solid gray', padding: 5 } };
+ const divProps = {
+ className: 'product',
+ style: { outline: '1px solid gray', padding: 5 },
+ };
const template = [
[ 'core/image' ],
[ 'core/paragraph', { placeholder: __( 'Add a description' ) } ],
- [ 'core/quote' ]
+ [ 'core/quote' ],
];
const allowedBlocksWhenSingleEmptyChild = [ 'core/image', 'core/list' ];
const allowedBlocksWhenMultipleChildren = [ 'core/gallery', 'core/video' ];
const save = function() {
- return el( 'div', divProps,
- el( InnerBlocks.Content )
- );
+ return el( 'div', divProps, el( InnerBlocks.Content ) );
};
registerBlockType( 'test/allowed-blocks-unset', {
title: 'Allowed Blocks Unset',
@@ -24,9 +25,7 @@
category: 'common',
edit() {
- return el( 'div', divProps,
- el( InnerBlocks, { template } )
- );
+ return el( 'div', divProps, el( InnerBlocks, { template } ) );
},
save,
@@ -38,20 +37,19 @@
category: 'common',
edit() {
- return el( 'div', divProps,
- el(
- InnerBlocks,
- {
- template,
- allowedBlocks: [
- 'core/button',
- 'core/gallery',
- 'core/list',
- 'core/media-text',
- 'core/quote',
- ],
- }
- )
+ return el(
+ 'div',
+ divProps,
+ el( InnerBlocks, {
+ template,
+ allowedBlocks: [
+ 'core/button',
+ 'core/gallery',
+ 'core/list',
+ 'core/media-text',
+ 'core/quote',
+ ],
+ } )
);
},
@@ -69,19 +67,21 @@
numberOfChildren: getBlockOrder( ownProps.clientId ).length,
};
} )( function( props ) {
- return el( 'div', divProps,
- el(
- InnerBlocks,
- {
- allowedBlocks: props.numberOfChildren < 2 ?
- allowedBlocksWhenSingleEmptyChild :
- allowedBlocksWhenMultipleChildren,
- }
- )
+ return el(
+ 'div',
+ {
+ ...divProps,
+ 'data-number-of-children': props.numberOfChildren,
+ },
+ el( InnerBlocks, {
+ allowedBlocks:
+ props.numberOfChildren < 2
+ ? allowedBlocksWhenSingleEmptyChild
+ : allowedBlocksWhenMultipleChildren,
+ } )
);
} ),
save,
} );
-
} )();
diff --git a/packages/e2e-tests/plugins/plugins-api/sidebar.js b/packages/e2e-tests/plugins/plugins-api/sidebar.js
index 5ce92bcd4e09a2..5258cd01179d5d 100644
--- a/packages/e2e-tests/plugins/plugins-api/sidebar.js
+++ b/packages/e2e-tests/plugins/plugins-api/sidebar.js
@@ -18,7 +18,7 @@
function SidebarContents( props ) {
return el(
PanelBody,
- {},
+ { className: 'sidebar-title-plugin-panel' },
el(
PanelRow,
{},
diff --git a/packages/e2e-tests/specs/editor/blocks/__snapshots__/buttons.test.js.snap b/packages/e2e-tests/specs/editor/blocks/__snapshots__/buttons.test.js.snap
index 66f803ddcf139f..08a92e1fd8820f 100644
--- a/packages/e2e-tests/specs/editor/blocks/__snapshots__/buttons.test.js.snap
+++ b/packages/e2e-tests/specs/editor/blocks/__snapshots__/buttons.test.js.snap
@@ -3,7 +3,7 @@
exports[`Buttons can jump to the link editor using the keyboard shortcut 1`] = `
"
"
`;
@@ -11,7 +11,7 @@ exports[`Buttons can jump to the link editor using the keyboard shortcut 1`] = `
exports[`Buttons dismisses link editor when escape is pressed 1`] = `
"
"
`;
@@ -19,7 +19,7 @@ exports[`Buttons dismisses link editor when escape is pressed 1`] = `
exports[`Buttons has focus on button content 1`] = `
"
"
`;
diff --git a/packages/e2e-tests/specs/editor/blocks/__snapshots__/heading.test.js.snap b/packages/e2e-tests/specs/editor/blocks/__snapshots__/heading.test.js.snap
index e63f85de4cf19c..c8edb2f56cf352 100644
--- a/packages/e2e-tests/specs/editor/blocks/__snapshots__/heading.test.js.snap
+++ b/packages/e2e-tests/specs/editor/blocks/__snapshots__/heading.test.js.snap
@@ -13,7 +13,7 @@ exports[`Heading can be created by prefixing number sign and a space 1`] = `
`;
exports[`Heading it should correctly apply custom colors 1`] = `
-"
+"
Heading
"
`;
@@ -43,3 +43,15 @@ exports[`Heading should create a paragraph block below when pressing enter at th
"
`;
+
+exports[`Heading should not work with the list input rule 1`] = `
+"
+
1. H
+"
+`;
+
+exports[`Heading should work with the format input rules 1`] = `
+"
+
code
+"
+`;
diff --git a/packages/e2e-tests/specs/editor/blocks/classic.test.js b/packages/e2e-tests/specs/editor/blocks/classic.test.js
index b8295c64d53df1..2e2f1274878166 100644
--- a/packages/e2e-tests/specs/editor/blocks/classic.test.js
+++ b/packages/e2e-tests/specs/editor/blocks/classic.test.js
@@ -4,7 +4,7 @@
import path from 'path';
import fs from 'fs';
import os from 'os';
-import uuid from 'uuid/v4';
+import { v4 as uuid } from 'uuid';
/**
* WordPress dependencies
diff --git a/packages/e2e-tests/specs/editor/blocks/columns.test.js b/packages/e2e-tests/specs/editor/blocks/columns.test.js
index 6255f6c5c5ac8d..294c2de3be44f7 100644
--- a/packages/e2e-tests/specs/editor/blocks/columns.test.js
+++ b/packages/e2e-tests/specs/editor/blocks/columns.test.js
@@ -5,8 +5,8 @@ import {
createNewPost,
getAllBlockInserterItemTitles,
insertBlock,
- openAllBlockInserterCategories,
openGlobalBlockInserter,
+ closeGlobalBlockInserter,
} from '@wordpress/e2e-test-utils';
describe( 'Columns', () => {
@@ -16,6 +16,7 @@ describe( 'Columns', () => {
it( 'restricts all blocks inside the columns block', async () => {
await insertBlock( 'Columns' );
+ await closeGlobalBlockInserter();
await page.click( '[aria-label="Two columns; equal split"]' );
await page.click( '[aria-label="Block navigation"]' );
const columnBlockMenuItem = (
@@ -25,7 +26,6 @@ describe( 'Columns', () => {
)[ 0 ];
await columnBlockMenuItem.click();
await openGlobalBlockInserter();
- await openAllBlockInserterCategories();
expect( await getAllBlockInserterItemTitles() ).toHaveLength( 0 );
} );
} );
diff --git a/packages/e2e-tests/specs/editor/blocks/heading.test.js b/packages/e2e-tests/specs/editor/blocks/heading.test.js
index a2a8259ade54e4..0732102750712e 100644
--- a/packages/e2e-tests/specs/editor/blocks/heading.test.js
+++ b/packages/e2e-tests/specs/editor/blocks/heading.test.js
@@ -36,6 +36,20 @@ describe( 'Heading', () => {
expect( await getEditedPostContent() ).toMatchSnapshot();
} );
+ it( 'should not work with the list input rule', async () => {
+ await clickBlockAppender();
+ await page.keyboard.type( '## 1. H' );
+
+ expect( await getEditedPostContent() ).toMatchSnapshot();
+ } );
+
+ it( 'should work with the format input rules', async () => {
+ await clickBlockAppender();
+ await page.keyboard.type( '## `code`' );
+
+ expect( await getEditedPostContent() ).toMatchSnapshot();
+ } );
+
it( 'should create a paragraph block above when pressing enter at the start', async () => {
await page.keyboard.press( 'Enter' );
await page.keyboard.type( '## a' );
diff --git a/packages/e2e-tests/specs/editor/blocks/image.test.js b/packages/e2e-tests/specs/editor/blocks/image.test.js
index 51c4987857898f..c98ac89daf14af 100644
--- a/packages/e2e-tests/specs/editor/blocks/image.test.js
+++ b/packages/e2e-tests/specs/editor/blocks/image.test.js
@@ -4,7 +4,7 @@
import path from 'path';
import fs from 'fs';
import os from 'os';
-import uuid from 'uuid/v4';
+import { v4 as uuid } from 'uuid';
/**
* WordPress dependencies
@@ -14,6 +14,7 @@ import {
getEditedPostContent,
createNewPost,
clickButton,
+ openDocumentSettingsSidebar,
} from '@wordpress/e2e-test-utils';
async function upload( selector ) {
@@ -31,7 +32,9 @@ async function upload( selector ) {
const tmpFileName = path.join( os.tmpdir(), filename + '.png' );
fs.copyFileSync( testImagePath, tmpFileName );
await inputElement.uploadFile( tmpFileName );
- await page.waitForSelector( '.wp-block-image img[src^="http"]' );
+ await page.waitForSelector(
+ `.wp-block-image img[src$="${ filename }.png"]`
+ );
return filename;
}
@@ -59,6 +62,7 @@ describe( 'Image', () => {
);
expect( await getEditedPostContent() ).toMatch( regex1 );
+ await openDocumentSettingsSidebar();
await page.click( '[aria-label="Image Size"] button' );
const regex2 = new RegExp(
diff --git a/packages/e2e-tests/specs/editor/blocks/table.test.js b/packages/e2e-tests/specs/editor/blocks/table.test.js
index 680416980067d5..96bb008e613df3 100644
--- a/packages/e2e-tests/specs/editor/blocks/table.test.js
+++ b/packages/e2e-tests/specs/editor/blocks/table.test.js
@@ -12,6 +12,7 @@ import {
createNewPost,
getEditedPostContent,
insertBlock,
+ openDocumentSettingsSidebar,
} from '@wordpress/e2e-test-utils';
const createButtonLabel = 'Create Table';
@@ -99,6 +100,7 @@ describe( 'Table', () => {
it( 'allows header and footer rows to be switched on and off', async () => {
await insertBlock( 'Table' );
+ await openDocumentSettingsSidebar();
const headerSwitchSelector = "//label[text()='Header section']";
const footerSwitchSelector = "//label[text()='Footer section']";
@@ -144,6 +146,7 @@ describe( 'Table', () => {
it( 'allows adding and deleting columns across the table header, body and footer', async () => {
await insertBlock( 'Table' );
+ await openDocumentSettingsSidebar();
// Create the table.
await clickButton( createButtonLabel );
@@ -217,6 +220,7 @@ describe( 'Table', () => {
// Testing for regressions of https://github.com/WordPress/gutenberg/issues/14904.
it( 'allows cells to be selected when the cell area outside of the RichText is clicked', async () => {
await insertBlock( 'Table' );
+ await openDocumentSettingsSidebar();
// Create the table.
await clickButton( createButtonLabel );
diff --git a/packages/e2e-tests/specs/editor/plugins/__snapshots__/plugins-api.test.js.snap b/packages/e2e-tests/specs/editor/plugins/__snapshots__/plugins-api.test.js.snap
index f823deeb3965f8..e30da101c25883 100644
--- a/packages/e2e-tests/specs/editor/plugins/__snapshots__/plugins-api.test.js.snap
+++ b/packages/e2e-tests/specs/editor/plugins/__snapshots__/plugins-api.test.js.snap
@@ -2,6 +2,6 @@
exports[`Using Plugins API Document Setting Custom Panel Should render a custom panel inside Document Setting sidebar 1`] = `"My Custom Panel"`;
-exports[`Using Plugins API Sidebar Medium screen Should open plugins sidebar using More Menu item and render content 1`] = `"
"`;
+exports[`Using Plugins API Sidebar Medium screen Should open plugins sidebar using More Menu item and render content 1`] = `"
"`;
-exports[`Using Plugins API Sidebar Should open plugins sidebar using More Menu item and render content 1`] = `"
"`;
+exports[`Using Plugins API Sidebar Should open plugins sidebar using More Menu item and render content 1`] = `"
"`;
diff --git a/packages/e2e-tests/specs/editor/plugins/block-context.test.js b/packages/e2e-tests/specs/editor/plugins/block-context.test.js
new file mode 100644
index 00000000000000..8f287bbb59add4
--- /dev/null
+++ b/packages/e2e-tests/specs/editor/plugins/block-context.test.js
@@ -0,0 +1,108 @@
+/**
+ * External dependencies
+ */
+import { last } from 'lodash';
+
+/**
+ * WordPress dependencies
+ */
+import {
+ activatePlugin,
+ createNewPost,
+ deactivatePlugin,
+ insertBlock,
+ saveDraft,
+} from '@wordpress/e2e-test-utils';
+
+async function openPreviewPage( editorPage ) {
+ let openTabs = await browser.pages();
+ const expectedTabsCount = openTabs.length + 1;
+ await editorPage.click( '.editor-post-preview__button-toggle' );
+ await editorPage.waitFor( '.editor-post-preview__button-external' );
+ await editorPage.click( '.editor-post-preview__button-external' );
+
+ // Wait for the new tab to open.
+ while ( openTabs.length < expectedTabsCount ) {
+ await editorPage.waitFor( 1 );
+ openTabs = await browser.pages();
+ }
+
+ const previewPage = last( openTabs );
+ // Wait for the preview to load. We can't do interstitial detection here,
+ // because it might load too quickly for us to pick up, so we wait for
+ // the preview to load by waiting for the content to appear.
+ await previewPage.waitForSelector( '.entry-content' );
+ return previewPage;
+}
+
+describe( 'Block context', () => {
+ beforeAll( async () => {
+ await activatePlugin( 'gutenberg-test-block-context' );
+ } );
+
+ beforeEach( async () => {
+ await createNewPost();
+ } );
+
+ afterAll( async () => {
+ await deactivatePlugin( 'gutenberg-test-block-context' );
+ } );
+
+ test( 'Block context propagates to inner blocks', async () => {
+ await insertBlock( 'Test Context Provider' );
+
+ // Inserting the context provider block should select the first inner
+ // block of the template. Verify the contents of the consumer.
+ let innerBlockText = await page.evaluate(
+ () => document.activeElement.textContent
+ );
+ expect( innerBlockText ).toBe( 'The record ID is: 0' );
+
+ // Change the attribute value associated with the context.
+ await page.keyboard.press( 'ArrowUp' );
+ await page.keyboard.type( '123' );
+
+ // Verify propagated context changes.
+ await page.keyboard.press( 'ArrowDown' );
+ innerBlockText = await page.evaluate(
+ () => document.activeElement.textContent
+ );
+ expect( innerBlockText ).toBe( 'The record ID is: 123' );
+ } );
+
+ test( 'Block context is reflected in the preview', async () => {
+ await insertBlock( 'Test Context Provider' );
+ const editorPage = page;
+ const previewPage = await openPreviewPage( editorPage );
+
+ // Check default context values are populated.
+ let content = await previewPage.$eval(
+ '.entry-content',
+ ( contentWrapper ) => contentWrapper.textContent.trim()
+ );
+ expect( content ).toBe( 'The record ID is: 0' );
+
+ // Return to editor to change context value to non-default.
+ await editorPage.bringToFront();
+ await editorPage.focus(
+ '[data-type="gutenberg/test-context-provider"] input'
+ );
+ await editorPage.keyboard.press( 'ArrowRight' );
+ await editorPage.keyboard.type( '123' );
+ await editorPage.waitForSelector( '.editor-post-save-draft' ); // Not entirely clear why it's asynchronous, but likely React scheduling prioritizing keyboard event and deferring the UI update.
+ await saveDraft();
+
+ // Check non-default context values are populated.
+ await previewPage.bringToFront();
+ await previewPage.reload();
+ content = await previewPage.$eval(
+ '.entry-content',
+ ( contentWrapper ) => contentWrapper.textContent.trim()
+ );
+ expect( content ).toBe( 'The record ID is: 123' );
+
+ // Clean up
+ await editorPage.bringToFront();
+ await previewPage.close();
+ } );
+} );
diff --git a/packages/e2e-tests/specs/editor/plugins/block-icons.test.js b/packages/e2e-tests/specs/editor/plugins/block-icons.test.js
index 2e5bcf666bb2bc..fd506d98fb3f7a 100644
--- a/packages/e2e-tests/specs/editor/plugins/block-icons.test.js
+++ b/packages/e2e-tests/specs/editor/plugins/block-icons.test.js
@@ -8,10 +8,11 @@ import {
insertBlock,
pressKeyWithModifier,
searchForBlock,
+ openDocumentSettingsSidebar,
} from '@wordpress/e2e-test-utils';
const INSERTER_BUTTON_SELECTOR =
- '.components-popover__content .block-editor-block-types-list__item';
+ '.block-editor-inserter__block-list .block-editor-block-types-list__item';
const INSERTER_ICON_WRAPPER_SELECTOR = `${ INSERTER_BUTTON_SELECTOR } .block-editor-block-types-list__item-icon`;
const INSERTER_ICON_SELECTOR = `${ INSERTER_BUTTON_SELECTOR } .block-editor-block-icon`;
const INSPECTOR_ICON_SELECTOR = '.edit-post-sidebar .block-editor-block-icon';
@@ -89,6 +90,7 @@ describe( 'Correctly Renders Block Icons on Inserter and Inspector', () => {
it( 'Renders correctly the icon on the inspector', async () => {
await insertBlock( blockTitle );
+ await openDocumentSettingsSidebar();
await selectFirstBlock();
validateIcon( await getInnerHTML( INSPECTOR_ICON_SELECTOR ) );
} );
@@ -127,6 +129,7 @@ describe( 'Correctly Renders Block Icons on Inserter and Inspector', () => {
it( 'Renders the icon in the inspector with the correct colors', async () => {
await insertBlock( blockTitle );
+ await openDocumentSettingsSidebar();
await selectFirstBlock();
validateDashIcon( await getInnerHTML( INSPECTOR_ICON_SELECTOR ) );
expect(
@@ -153,6 +156,7 @@ describe( 'Correctly Renders Block Icons on Inserter and Inspector', () => {
it( 'Renders correctly the icon on the inspector', async () => {
await insertBlock( blockTitle );
+ await openDocumentSettingsSidebar();
await selectFirstBlock();
validateSvgIcon( await getInnerHTML( INSPECTOR_ICON_SELECTOR ) );
expect(
diff --git a/packages/e2e-tests/specs/editor/plugins/container-blocks.test.js b/packages/e2e-tests/specs/editor/plugins/container-blocks.test.js
index 94b8a34cc21256..e6d162eb18520c 100644
--- a/packages/e2e-tests/specs/editor/plugins/container-blocks.test.js
+++ b/packages/e2e-tests/specs/editor/plugins/container-blocks.test.js
@@ -44,7 +44,7 @@ describe( 'InnerBlocks Template Sync', () => {
paragraphToAdd,
blockSlug
);
- // Press "Enter" inside the Code Editor to fire the `onChange` event for the new value.
+ // Press "Enter" inside the code editor to fire the `onChange` event for the new value.
await page.click( '.editor-post-text-editor' );
await pressKeyWithModifier( 'primary', 'A' );
await page.keyboard.press( 'ArrowRight' );
diff --git a/packages/e2e-tests/specs/editor/plugins/inner-blocks-allowed-blocks.test.js b/packages/e2e-tests/specs/editor/plugins/inner-blocks-allowed-blocks.test.js
index 5d5318b97337c4..1e02d4369f1b3b 100644
--- a/packages/e2e-tests/specs/editor/plugins/inner-blocks-allowed-blocks.test.js
+++ b/packages/e2e-tests/specs/editor/plugins/inner-blocks-allowed-blocks.test.js
@@ -7,8 +7,8 @@ import {
deactivatePlugin,
getAllBlockInserterItemTitles,
insertBlock,
- openAllBlockInserterCategories,
openGlobalBlockInserter,
+ closeGlobalBlockInserter,
} from '@wordpress/e2e-test-utils';
describe( 'Allowed Blocks Setting on InnerBlocks ', () => {
@@ -30,11 +30,11 @@ describe( 'Allowed Blocks Setting on InnerBlocks ', () => {
const parentBlockSelector = '[data-type="test/allowed-blocks-unset"]';
const childParagraphSelector = `${ parentBlockSelector } ${ paragraphSelector }`;
await insertBlock( 'Allowed Blocks Unset' );
+ await closeGlobalBlockInserter();
await page.waitForSelector( childParagraphSelector );
await page.click( childParagraphSelector );
await openGlobalBlockInserter();
- await openAllBlockInserterCategories();
- expect(
+ await expect(
( await getAllBlockInserterItemTitles() ).length
).toBeGreaterThan( 20 );
} );
@@ -43,10 +43,10 @@ describe( 'Allowed Blocks Setting on InnerBlocks ', () => {
const parentBlockSelector = '[data-type="test/allowed-blocks-set"]';
const childParagraphSelector = `${ parentBlockSelector } ${ paragraphSelector }`;
await insertBlock( 'Allowed Blocks Set' );
+ await closeGlobalBlockInserter();
await page.waitForSelector( childParagraphSelector );
await page.click( childParagraphSelector );
await openGlobalBlockInserter();
- await openAllBlockInserterCategories();
expect( await getAllBlockInserterItemTitles() ).toEqual( [
'Button',
'Gallery',
@@ -58,12 +58,12 @@ describe( 'Allowed Blocks Setting on InnerBlocks ', () => {
it( 'correctly applies dynamic allowed blocks restrictions', async () => {
await insertBlock( 'Allowed Blocks Dynamic' );
+ await closeGlobalBlockInserter();
const parentBlockSelector = '[data-type="test/allowed-blocks-dynamic"]';
const blockAppender = '.block-list-appender button';
const appenderSelector = `${ parentBlockSelector } ${ blockAppender }`;
await page.waitForSelector( appenderSelector );
await page.click( appenderSelector );
- await openAllBlockInserterCategories();
expect( await getAllBlockInserterItemTitles() ).toEqual( [
'Image',
'List',
@@ -73,8 +73,9 @@ describe( 'Allowed Blocks Setting on InnerBlocks ', () => {
)[ 0 ];
await insertButton.click();
await insertBlock( 'Image' );
+ await closeGlobalBlockInserter();
+ await page.waitForSelector( '.product[data-number-of-children="2"]' );
await page.click( appenderSelector );
- await openAllBlockInserterCategories();
expect( await getAllBlockInserterItemTitles() ).toEqual( [
'Gallery',
'Video',
diff --git a/packages/e2e-tests/specs/editor/plugins/inner-blocks-render-appender.test.js b/packages/e2e-tests/specs/editor/plugins/inner-blocks-render-appender.test.js
index ad27838a4a8ed1..137ac319a6800a 100644
--- a/packages/e2e-tests/specs/editor/plugins/inner-blocks-render-appender.test.js
+++ b/packages/e2e-tests/specs/editor/plugins/inner-blocks-render-appender.test.js
@@ -8,10 +8,10 @@ import {
getAllBlockInserterItemTitles,
getEditedPostContent,
insertBlock,
- openAllBlockInserterCategories,
+ closeGlobalBlockInserter,
} from '@wordpress/e2e-test-utils';
-const INSERTER_RESULTS_SELECTOR = '.block-editor-inserter__results';
+const INSERTER_RESULTS_SELECTOR = '.block-editor-inserter__block-list';
const QUOTE_INSERT_BUTTON_SELECTOR = '//button[.="Quote"]';
const APPENDER_SELECTOR = '.my-custom-awesome-appender';
const DYNAMIC_APPENDER_SELECTOR = 'my-dynamic-blocks-appender';
@@ -32,6 +32,7 @@ describe( 'RenderAppender prop of InnerBlocks ', () => {
it( 'Users can customize the appender and can still insert blocks using exposed components', async () => {
// Insert the InnerBlocks renderAppender block.
await insertBlock( 'InnerBlocks renderAppender' );
+ await closeGlobalBlockInserter();
// Wait for the custom block appender to appear.
await page.waitForSelector( APPENDER_SELECTOR );
// Verify if the custom block appender text is the expected one.
@@ -46,8 +47,6 @@ describe( 'RenderAppender prop of InnerBlocks ', () => {
await page.click(
`${ APPENDER_SELECTOR } .block-editor-button-block-appender`
);
- await openAllBlockInserterCategories();
-
// Verify if the blocks the custom inserter is rendering are the expected ones.
expect( await getAllBlockInserterItemTitles() ).toEqual( [
'Quote',
@@ -69,6 +68,7 @@ describe( 'RenderAppender prop of InnerBlocks ', () => {
it( 'Users can dynamically customize the appender', async () => {
// Insert the InnerBlocks renderAppender dynamic block.
await insertBlock( 'InnerBlocks renderAppender dynamic' );
+ await closeGlobalBlockInserter();
// Wait for the custom dynamic block appender to appear.
await page.waitForSelector( '.' + DYNAMIC_APPENDER_SELECTOR );
@@ -81,7 +81,6 @@ describe( 'RenderAppender prop of InnerBlocks ', () => {
// Open the inserter of our custom block appender and expand all the categories.
const blockAppenderButtonSelector = `.${ DYNAMIC_APPENDER_SELECTOR } .block-editor-button-block-appender`;
await page.click( blockAppenderButtonSelector );
- await openAllBlockInserterCategories();
// Verify if the blocks the custom inserter is rendering are the expected ones.
expect( await getAllBlockInserterItemTitles() ).toEqual( [
diff --git a/packages/e2e-tests/specs/editor/plugins/innerblocks-locking-all-embed.js b/packages/e2e-tests/specs/editor/plugins/innerblocks-locking-all-embed.js
index c0f081976ecfe3..a0a83fbf90e616 100644
--- a/packages/e2e-tests/specs/editor/plugins/innerblocks-locking-all-embed.js
+++ b/packages/e2e-tests/specs/editor/plugins/innerblocks-locking-all-embed.js
@@ -6,14 +6,32 @@ import {
createNewPost,
deactivatePlugin,
insertBlock,
+ createEmbeddingMatcher,
+ createJSONResponse,
+ setUpResponseMocking,
} from '@wordpress/e2e-test-utils';
+const MOCK_RESPONSES = [
+ {
+ match: createEmbeddingMatcher( 'https://twitter.com/wordpress' ),
+ onRequestMatch: createJSONResponse( {
+ url: 'https://twitter.com/wordpress',
+ html: '
Mock success response.
',
+ type: 'rich',
+ provider_name: 'Twitter',
+ provider_url: 'https://twitter.com',
+ version: '1.0',
+ } ),
+ },
+];
+
describe( 'Embed block inside a locked all parent', () => {
beforeAll( async () => {
await activatePlugin( 'gutenberg-test-innerblocks-locking-all-embed' );
} );
beforeEach( async () => {
+ await setUpResponseMocking( MOCK_RESPONSES );
await createNewPost();
} );
@@ -30,7 +48,7 @@ describe( 'Embed block inside a locked all parent', () => {
await page.waitForSelector( embedInputSelector );
await page.click( embedInputSelector );
// This URL should not have a trailing slash.
- await page.keyboard.type( 'https://twitter.com/WordPress' );
+ await page.keyboard.type( 'https://twitter.com/wordpress' );
await page.keyboard.press( 'Enter' );
// The twitter block should appear correctly.
await page.waitForSelector( 'figure.wp-block-embed' );
diff --git a/packages/e2e-tests/specs/editor/plugins/plugins-api.test.js b/packages/e2e-tests/specs/editor/plugins/plugins-api.test.js
index 627d3a7493f078..f4a385885e09f9 100644
--- a/packages/e2e-tests/specs/editor/plugins/plugins-api.test.js
+++ b/packages/e2e-tests/specs/editor/plugins/plugins-api.test.js
@@ -67,6 +67,9 @@ describe( 'Using Plugins API', () => {
} );
describe( 'Sidebar', () => {
+ const SIDEBAR_PINNED_ITEM_BUTTON =
+ '.interface-pinned-items button[aria-label="Sidebar title plugin"]';
+ const SIDEBAR_PANEL_SELECTOR = '.sidebar-title-plugin-panel';
it( 'Should open plugins sidebar using More Menu item and render content', async () => {
await clickOnMoreMenuItem( 'Sidebar title plugin' );
@@ -77,6 +80,36 @@ describe( 'Using Plugins API', () => {
expect( pluginSidebarContent ).toMatchSnapshot();
} );
+ it( 'Should be pinned by default and can be opened and closed using pinned items', async () => {
+ const sidebarPinnedItem = await page.$(
+ SIDEBAR_PINNED_ITEM_BUTTON
+ );
+ expect( sidebarPinnedItem ).not.toBeNull();
+ await sidebarPinnedItem.click();
+ expect( await page.$( SIDEBAR_PANEL_SELECTOR ) ).not.toBeNull();
+ await sidebarPinnedItem.click();
+ expect( await page.$( SIDEBAR_PANEL_SELECTOR ) ).toBeNull();
+ } );
+
+ it( 'Can be pinned and unpinned', async () => {
+ await ( await page.$( SIDEBAR_PINNED_ITEM_BUTTON ) ).click();
+ const unpinButton = await page.$(
+ 'button[aria-label="Unpin from toolbar"]'
+ );
+ await unpinButton.click();
+ expect( await page.$( SIDEBAR_PINNED_ITEM_BUTTON ) ).toBeNull();
+ await page.click(
+ '.interface-complementary-area-header button[aria-label="Close plugin"]'
+ );
+ await page.reload();
+ expect( await page.$( SIDEBAR_PINNED_ITEM_BUTTON ) ).toBeNull();
+ await clickOnMoreMenuItem( 'Sidebar title plugin' );
+ await page.click( 'button[aria-label="Pin to toolbar"]' );
+ expect( await page.$( SIDEBAR_PINNED_ITEM_BUTTON ) ).not.toBeNull();
+ await page.reload();
+ expect( await page.$( SIDEBAR_PINNED_ITEM_BUTTON ) ).not.toBeNull();
+ } );
+
it( 'Should close plugins sidebar using More Menu item', async () => {
await clickOnMoreMenuItem( 'Sidebar title plugin' );
diff --git a/packages/e2e-tests/specs/editor/various/__snapshots__/block-hierarchy-navigation.test.js.snap b/packages/e2e-tests/specs/editor/various/__snapshots__/block-hierarchy-navigation.test.js.snap
index 4ee1d7710bbe18..14f85661ea22e0 100644
--- a/packages/e2e-tests/specs/editor/various/__snapshots__/block-hierarchy-navigation.test.js.snap
+++ b/packages/e2e-tests/specs/editor/various/__snapshots__/block-hierarchy-navigation.test.js.snap
@@ -49,3 +49,15 @@ exports[`Navigating the block hierarchy should navigate using the block hierarch
"
`;
+
+exports[`Navigating the block hierarchy should select the wrapper div for a group 1`] = `
+"
+
+
just a paragraph
+
+
+
+
+
+"
+`;
diff --git a/packages/e2e-tests/specs/editor/various/__snapshots__/duplicating-blocks.test.js.snap b/packages/e2e-tests/specs/editor/various/__snapshots__/duplicating-blocks.test.js.snap
new file mode 100644
index 00000000000000..bb8192de22cb94
--- /dev/null
+++ b/packages/e2e-tests/specs/editor/various/__snapshots__/duplicating-blocks.test.js.snap
@@ -0,0 +1,21 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Duplicating blocks should duplicate blocks using the block settings menu 1`] = `
+"
+
Clone me
+
+
+
+
Clone me
+"
+`;
+
+exports[`Duplicating blocks should duplicate blocks using the keyboard shortcut 1`] = `
+"
+
Clone me
+
+
+
+
Clone me
+"
+`;
diff --git a/packages/e2e-tests/specs/editor/various/__snapshots__/font-size-picker.test.js.snap b/packages/e2e-tests/specs/editor/various/__snapshots__/font-size-picker.test.js.snap
index 90f0c982aeca9e..bc58980c7ce536 100644
--- a/packages/e2e-tests/specs/editor/various/__snapshots__/font-size-picker.test.js.snap
+++ b/packages/e2e-tests/specs/editor/various/__snapshots__/font-size-picker.test.js.snap
@@ -1,7 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Font Size Picker should apply a custom font size using the font size input 1`] = `
-"
+"
Paragraph to be made \\"small\\"
"
`;
diff --git a/packages/e2e-tests/specs/editor/various/a11y.test.js b/packages/e2e-tests/specs/editor/various/a11y.test.js
index 0ca44d7fb7114a..a25b5d9760c3ce 100644
--- a/packages/e2e-tests/specs/editor/various/a11y.test.js
+++ b/packages/e2e-tests/specs/editor/various/a11y.test.js
@@ -23,7 +23,7 @@ describe( 'a11y', () => {
':focus',
( focusedElement ) => {
return focusedElement.classList.contains(
- 'block-editor-inserter__toggle'
+ 'edit-post-header-toolbar__inserter-toggle'
);
}
);
diff --git a/packages/e2e-tests/specs/editor/various/adding-blocks.test.js b/packages/e2e-tests/specs/editor/various/adding-blocks.test.js
index ed5244c50c189a..65fd287650b462 100644
--- a/packages/e2e-tests/specs/editor/various/adding-blocks.test.js
+++ b/packages/e2e-tests/specs/editor/various/adding-blocks.test.js
@@ -6,8 +6,8 @@ import {
insertBlock,
getEditedPostContent,
pressKeyTimes,
- switchEditorModeTo,
setBrowserViewport,
+ closeGlobalBlockInserter,
} from '@wordpress/e2e-test-utils';
/** @typedef {import('puppeteer').ElementHandle} ElementHandle */
@@ -42,7 +42,7 @@ describe( 'adding blocks', () => {
// Click below editor to focus last field (block appender)
await clickAtBottom(
- await page.$( '.block-editor-editor-skeleton__content' )
+ await page.$( '.interface-interface-skeleton__content' )
);
expect( await page.$( '[data-type="core/paragraph"]' ) ).not.toBeNull();
await page.keyboard.type( 'Paragraph block' );
@@ -92,6 +92,7 @@ describe( 'adding blocks', () => {
// Unselect blocks to avoid conflicts with the inbetween inserter
await page.click( '.editor-post-title__input' );
+ await closeGlobalBlockInserter();
// Using the between inserter
const insertionPoint = await page.$( '[data-type="core/quote"]' );
@@ -111,16 +112,14 @@ describe( 'adding blocks', () => {
() =>
document.activeElement &&
document.activeElement.classList.contains(
- 'block-editor-inserter__search'
+ 'block-editor-inserter__search-input'
)
);
await page.keyboard.type( 'para' );
- await pressKeyTimes( 'Tab', 3 );
+ await pressKeyTimes( 'Tab', 4 );
await page.keyboard.press( 'Enter' );
await page.keyboard.type( 'Second paragraph' );
- await switchEditorModeTo( 'Code' );
-
expect( await getEditedPostContent() ).toMatchSnapshot();
} );
@@ -137,7 +136,7 @@ describe( 'adding blocks', () => {
() => document.activeElement.classList
);
expect( Object.values( activeElementClassList ) ).toContain(
- 'block-editor-inserter__search'
+ 'block-editor-inserter__search-input'
);
// Try using the up arrow key (vertical navigation triggers the issue described in #9583).
@@ -148,29 +147,30 @@ describe( 'adding blocks', () => {
() => document.activeElement.classList
);
expect( Object.values( activeElementClassList ) ).toContain(
- 'block-editor-inserter__search'
+ 'block-editor-inserter__search-input'
);
- // Tab to the block search results
+ // Tab to the block list
+ await page.keyboard.press( 'Tab' );
await page.keyboard.press( 'Tab' );
- // Expect the search results to be the active element.
+ // Expect the block list to be the active element.
activeElementClassList = await page.evaluate(
() => document.activeElement.classList
);
expect( Object.values( activeElementClassList ) ).toContain(
- 'block-editor-inserter__results'
+ 'block-editor-block-types-list__item'
);
// Try using the up arrow key
await page.keyboard.press( 'ArrowUp' );
- // Expect the search results to still be the active element.
+ // Expect the block list to still be the active element.
activeElementClassList = await page.evaluate(
() => document.activeElement.classList
);
expect( Object.values( activeElementClassList ) ).toContain(
- 'block-editor-inserter__results'
+ 'block-editor-block-types-list__item'
);
// Press escape to close the block inserter.
diff --git a/packages/e2e-tests/specs/editor/various/adding-inline-tokens.test.js b/packages/e2e-tests/specs/editor/various/adding-inline-tokens.test.js
index 0049bdd1d5c3f2..6c1017c6d53589 100644
--- a/packages/e2e-tests/specs/editor/various/adding-inline-tokens.test.js
+++ b/packages/e2e-tests/specs/editor/various/adding-inline-tokens.test.js
@@ -4,7 +4,7 @@
import path from 'path';
import fs from 'fs';
import os from 'os';
-import uuid from 'uuid/v4';
+import { v4 as uuid } from 'uuid';
/**
* WordPress dependencies
diff --git a/packages/e2e-tests/specs/editor/various/block-hierarchy-navigation.test.js b/packages/e2e-tests/specs/editor/various/block-hierarchy-navigation.test.js
index 643998905e00e3..63ae6d57ecd1fb 100644
--- a/packages/e2e-tests/specs/editor/various/block-hierarchy-navigation.test.js
+++ b/packages/e2e-tests/specs/editor/various/block-hierarchy-navigation.test.js
@@ -7,6 +7,7 @@ import {
getEditedPostContent,
pressKeyTimes,
pressKeyWithModifier,
+ openDocumentSettingsSidebar,
} from '@wordpress/e2e-test-utils';
async function openBlockNavigator() {
@@ -43,6 +44,7 @@ describe( 'Navigating the block hierarchy', () => {
await columnsBlockMenuItem.click();
// Tweak the columns count.
+ await openDocumentSettingsSidebar();
await page.focus(
'.block-editor-block-inspector .components-range-control__number[aria-label="Columns"]'
);
@@ -73,6 +75,7 @@ describe( 'Navigating the block hierarchy', () => {
it( 'should navigate block hierarchy using only the keyboard', async () => {
await insertBlock( 'Columns' );
+ await openDocumentSettingsSidebar();
await page.click( '[aria-label="Two columns; equal split"]' );
// Add a paragraph in the first column.
@@ -91,7 +94,7 @@ describe( 'Navigating the block hierarchy', () => {
await pressKeyWithModifier( 'ctrl', '`' );
await pressKeyWithModifier( 'ctrl', '`' );
await pressKeyWithModifier( 'ctrl', '`' );
- await pressKeyTimes( 'Tab', 4 );
+ await pressKeyTimes( 'Tab', 5 );
// Tweak the columns count by increasing it by one.
await page.keyboard.press( 'ArrowRight' );
@@ -135,4 +138,42 @@ describe( 'Navigating the block hierarchy', () => {
expect( await getEditedPostContent() ).toMatchSnapshot();
} );
+
+ it( 'should select the wrapper div for a group ', async () => {
+ // Insert a group block
+ await insertBlock( 'Group' );
+
+ // Insert some random blocks.
+ // The last block shouldn't be a textual block.
+ await page.click( '.block-list-appender .block-editor-inserter' );
+ const paragraphMenuItem = (
+ await page.$x( `//button//span[contains(text(), 'Paragraph')]` )
+ )[ 0 ];
+ await paragraphMenuItem.click();
+ await page.keyboard.type( 'just a paragraph' );
+ await insertBlock( 'Separator' );
+
+ // Check the Group block content
+ expect( await getEditedPostContent() ).toMatchSnapshot();
+
+ // Unselect the blocks
+ await page.click( '.editor-post-title' );
+
+ // Try selecting the group block using the block navigation
+ await page.click( '[aria-label="Block navigation"]' );
+ const groupMenuItem = (
+ await page.$x(
+ "//button[contains(@class,'block-editor-block-navigation__item') and contains(text(), 'Group')]"
+ )
+ )[ 0 ];
+ await groupMenuItem.click();
+
+ // The group block's wrapper should be selected.
+ const isGroupBlockSelected = await page.evaluate(
+ () =>
+ document.activeElement.getAttribute( 'data-type' ) ===
+ 'core/group'
+ );
+ expect( isGroupBlockSelected ).toBe( true );
+ } );
} );
diff --git a/packages/e2e-tests/specs/editor/various/block-switcher.test.js b/packages/e2e-tests/specs/editor/various/block-switcher.test.js
index 12c40442195160..c330f8680af551 100644
--- a/packages/e2e-tests/specs/editor/various/block-switcher.test.js
+++ b/packages/e2e-tests/specs/editor/various/block-switcher.test.js
@@ -9,7 +9,7 @@ import {
pressKeyWithModifier,
} from '@wordpress/e2e-test-utils';
-describe( 'adding blocks', () => {
+describe( 'Block Switcher', () => {
beforeEach( async () => {
await createNewPost();
} );
diff --git a/packages/e2e-tests/specs/editor/various/convert-block-type.test.js b/packages/e2e-tests/specs/editor/various/convert-block-type.test.js
index 2c71a3d3a139f2..101a40b6dd2299 100644
--- a/packages/e2e-tests/specs/editor/various/convert-block-type.test.js
+++ b/packages/e2e-tests/specs/editor/various/convert-block-type.test.js
@@ -17,8 +17,7 @@ describe( 'Code block', () => {
const code = 'print "Hello Dolly!"';
await insertBlock( 'Code' );
-
- await page.type( '.block-editor-block-list__block textarea', code );
+ await page.keyboard.type( code );
// Verify the content starts out as a Code block.
const originalPostContent = await getEditedPostContent();
diff --git a/packages/e2e-tests/specs/editor/various/duplicating-blocks.test.js b/packages/e2e-tests/specs/editor/various/duplicating-blocks.test.js
new file mode 100644
index 00000000000000..a5aadb7766a793
--- /dev/null
+++ b/packages/e2e-tests/specs/editor/various/duplicating-blocks.test.js
@@ -0,0 +1,49 @@
+/**
+ * WordPress dependencies
+ */
+import {
+ createNewPost,
+ insertBlock,
+ getEditedPostContent,
+ clickBlockToolbarButton,
+ pressKeyWithModifier,
+} from '@wordpress/e2e-test-utils';
+
+describe( 'Duplicating blocks', () => {
+ beforeEach( async () => {
+ await createNewPost();
+ } );
+
+ it( 'should duplicate blocks using the block settings menu', async () => {
+ await insertBlock( 'Paragraph' );
+ await page.keyboard.type( 'Clone me' );
+
+ // Select the test we just typed
+ // This doesn't do anything but we previously had a duplicationi bug
+ // When the selection was not collapsed
+ await pressKeyWithModifier( 'primary', 'a' );
+
+ await clickBlockToolbarButton( 'More options' );
+ const duplicateButton = await page.waitForXPath(
+ '//button[text()="Duplicate"]'
+ );
+ await duplicateButton.click();
+
+ expect( await getEditedPostContent() ).toMatchSnapshot();
+ } );
+
+ it( 'should duplicate blocks using the keyboard shortcut', async () => {
+ await insertBlock( 'Paragraph' );
+ await page.keyboard.type( 'Clone me' );
+
+ // Select the test we just typed
+ // This doesn't do anything but we previously had a duplicationi bug
+ // When the selection was not collapsed
+ await pressKeyWithModifier( 'primary', 'a' );
+
+ // Duplicate using the keyboard shortccut
+ await pressKeyWithModifier( 'primaryShift', 'd' );
+
+ expect( await getEditedPostContent() ).toMatchSnapshot();
+ } );
+} );
diff --git a/packages/e2e-tests/specs/editor/various/editor-modes.test.js b/packages/e2e-tests/specs/editor/various/editor-modes.test.js
index 15d767cd6cc2c9..6aef17cd69594d 100644
--- a/packages/e2e-tests/specs/editor/various/editor-modes.test.js
+++ b/packages/e2e-tests/specs/editor/various/editor-modes.test.js
@@ -146,7 +146,7 @@ describe( 'Editing modes (visual/HTML)', () => {
// The inserter is disabled
const disabledInserter = await page.$(
- '.block-editor-inserter > button:disabled, .block-editor-inserter > button[aria-disabled="true"]'
+ '.edit-post-header-toolbar__inserter-toggle:disabled, .edit-post-header-toolbar__inserter-toggle[aria-disabled="true"]'
);
expect( disabledInserter ).not.toBeNull();
} );
diff --git a/packages/e2e-tests/specs/editor/various/embedding.test.js b/packages/e2e-tests/specs/editor/various/embedding.test.js
index b33a24fd787208..9e30ec116f3c37 100644
--- a/packages/e2e-tests/specs/editor/various/embedding.test.js
+++ b/packages/e2e-tests/specs/editor/various/embedding.test.js
@@ -307,7 +307,7 @@ describe( 'Embedding content', () => {
await page.keyboard.type( 'Hello there!' );
await publishPost();
const postUrl = await page.$eval(
- '[id^=inspector-text-control-]',
+ '.editor-post-publish-panel [id^=inspector-text-control-]',
( el ) => el.value
);
diff --git a/packages/e2e-tests/specs/editor/various/is-typing.test.js b/packages/e2e-tests/specs/editor/various/is-typing.test.js
new file mode 100644
index 00000000000000..8161118d65944d
--- /dev/null
+++ b/packages/e2e-tests/specs/editor/various/is-typing.test.js
@@ -0,0 +1,99 @@
+/**
+ * WordPress dependencies
+ */
+import { clickBlockAppender, createNewPost } from '@wordpress/e2e-test-utils';
+
+describe( 'isTyping', () => {
+ beforeEach( async () => {
+ await createNewPost();
+ } );
+
+ it( 'should hide the toolbar when typing', async () => {
+ const blockToolbarSelector = '.block-editor-block-toolbar';
+
+ await clickBlockAppender();
+
+ // Type in a paragraph
+ await page.keyboard.type( 'Type' );
+
+ // Toolbar is hidden
+ let blockToolbar = await page.$( blockToolbarSelector );
+ expect( blockToolbar ).toBe( null );
+
+ // Moving the mouse shows the toolbar
+ await page.mouse.move( 0, 0 );
+ await page.mouse.move( 10, 10 );
+
+ // Toolbar is visible
+ blockToolbar = await page.$( blockToolbarSelector );
+ expect( blockToolbar ).not.toBe( null );
+
+ // Typing again hides the toolbar
+ await page.keyboard.type( ' and continue' );
+
+ // Toolbar is hidden again
+ blockToolbar = await page.$( blockToolbarSelector );
+ expect( blockToolbar ).toBe( null );
+ } );
+
+ it( 'should not close the dropdown when typing in it', async () => {
+ // Adds a Dropdown with an input to all blocks
+ await page.evaluate( () => {
+ const { Dropdown, Button, Fill } = wp.components;
+ const { createElement: el, Fragment } = wp.element;
+ function AddDropdown( BlockListBlock ) {
+ return ( props ) => {
+ return el(
+ Fragment,
+ {},
+ el(
+ Fill,
+ { name: 'BlockControls' },
+ el( Dropdown, {
+ renderToggle: ( { onToggle } ) =>
+ el(
+ Button,
+ {
+ onClick: onToggle,
+ className: 'dropdown-open',
+ },
+ 'Open Dropdown'
+ ),
+ renderContent: () =>
+ el( 'input', {
+ className: 'dropdown-input',
+ } ),
+ } )
+ ),
+ el( BlockListBlock, props )
+ );
+ };
+ }
+
+ wp.hooks.addFilter(
+ 'editor.BlockListBlock',
+ 'e2e-test/add-dropdown',
+ AddDropdown
+ );
+ } );
+
+ await clickBlockAppender();
+
+ // Type in a paragraph
+ await page.keyboard.type( 'Type' );
+
+ // Show Toolbar
+ await page.mouse.move( 0, 0 );
+ await page.mouse.move( 10, 10 );
+
+ // Open the dropdown
+ await page.click( '.dropdown-open' );
+
+ // Type inside the dropdown's input
+ await page.type( '.dropdown-input', 'Random' );
+
+ // The input should still be visible
+ const input = await page.$( '.dropdown-input' );
+ expect( input ).not.toBe( null );
+ } );
+} );
diff --git a/packages/e2e-tests/specs/editor/various/keyboard-navigable-blocks.test.js b/packages/e2e-tests/specs/editor/various/keyboard-navigable-blocks.test.js
index 7226e0750e5726..8f7d6818d380d3 100644
--- a/packages/e2e-tests/specs/editor/various/keyboard-navigable-blocks.test.js
+++ b/packages/e2e-tests/specs/editor/various/keyboard-navigable-blocks.test.js
@@ -22,6 +22,7 @@ const navigateToContentEditorTop = async () => {
// Use 'Ctrl+`' to return to the top of the editor
await pressKeyWithModifier( 'ctrl', '`' );
await pressKeyWithModifier( 'ctrl', '`' );
+ await pressKeyWithModifier( 'ctrl', '`' );
};
const tabThroughParagraphBlock = async ( paragraphText ) => {
@@ -38,7 +39,7 @@ const tabThroughParagraphBlock = async ( paragraphText ) => {
).toBe( paragraphText );
await page.keyboard.press( 'Tab' );
- await expect( await getActiveLabel() ).toBe( 'Document' );
+ await expect( await getActiveLabel() ).toBe( 'Open document settings' );
};
const tabThroughBlockMoverControl = async () => {
@@ -133,7 +134,7 @@ describe( 'Order of block keyboard navigation', () => {
);
await page.keyboard.press( 'Tab' );
- await expect( await getActiveLabel() ).toBe( 'Document (selected)' );
+ await expect( await getActiveLabel() ).toBe( 'Open document settings' );
} );
it( 'allows tabbing in navigation mode if no block is selected (reverse)', async () => {
@@ -149,7 +150,7 @@ describe( 'Order of block keyboard navigation', () => {
await page.evaluate( () => {
document.querySelector( '.edit-post-visual-editor' ).focus();
document
- .querySelector( '.block-editor-editor-skeleton__sidebar' )
+ .querySelector( '.interface-interface-skeleton__sidebar' )
.focus();
} );
diff --git a/packages/e2e-tests/specs/editor/various/links.test.js b/packages/e2e-tests/specs/editor/various/links.test.js
index 8d6c27869cd72e..2cea8226880537 100644
--- a/packages/e2e-tests/specs/editor/various/links.test.js
+++ b/packages/e2e-tests/specs/editor/various/links.test.js
@@ -9,12 +9,6 @@ import {
pressKeyWithModifier,
} from '@wordpress/e2e-test-utils';
-/**
- * The modifier keys needed to invoke a 'select the next word' keyboard shortcut.
- *
- * @type {string}
- */
-
describe( 'Links', () => {
beforeEach( async () => {
await createNewPost();
@@ -26,6 +20,42 @@ describe( 'Links', () => {
);
};
+ it( 'will use Post title as link text if link to existing post is created without any text selected', async () => {
+ const titleText = 'Post to create a link to';
+ await createPostWithTitle( titleText );
+
+ await createNewPost();
+ await clickBlockAppender();
+
+ // Now in a new post and try to create a link from an autocomplete suggestion using the keyboard.
+ await page.keyboard.type( 'Here comes a link: ' );
+
+ // Press Cmd+K to insert a link
+ await pressKeyWithModifier( 'primary', 'K' );
+
+ // Wait for the URL field to auto-focus
+ await waitForAutoFocus();
+ expect(
+ await page.$(
+ '.components-popover__content .block-editor-link-control'
+ )
+ ).not.toBeNull();
+
+ // Trigger the autocomplete suggestion list and select the first suggestion.
+ await page.keyboard.type( titleText.substr( 0, titleText.length - 2 ) );
+ await page.waitForSelector( '.block-editor-link-control__search-item' );
+ await page.keyboard.press( 'ArrowDown' );
+
+ await page.keyboard.press( 'Enter' );
+
+ const actualText = await page.evaluate(
+ () =>
+ document.querySelector( '.block-editor-rich-text__editable a' )
+ .textContent
+ );
+ expect( actualText ).toBe( titleText );
+ } );
+
it( 'can be created by selecting text and clicking Link', async () => {
// Create a block with some text
await clickBlockAppender();
@@ -170,6 +200,9 @@ describe( 'Links', () => {
// Click on the Submit button
await page.keyboard.press( 'Enter' );
+
+ // Reselect the link.
+ await pressKeyWithModifier( 'shiftAlt', 'ArrowLeft' );
};
it( 'can be edited', async () => {
@@ -460,13 +493,6 @@ describe( 'Links', () => {
await waitForAutoFocus();
await page.keyboard.type( 'w.org' );
- // Insert the link
- await page.keyboard.press( 'Enter' );
-
- // Navigate back to the popover
- await pressKeyWithModifier( 'primary', 'k' );
- await waitForAutoFocus();
-
// Navigate to and toggle the "Open in new tab" checkbox.
await page.keyboard.press( 'Tab' );
await page.keyboard.press( 'Tab' );
@@ -478,7 +504,8 @@ describe( 'Links', () => {
// Close dialog. Expect that "Open in new tab" would have been applied
// immediately.
- await page.keyboard.press( 'Escape' );
+ await page.keyboard.press( 'Tab' );
+ await page.keyboard.press( 'Enter' );
expect( await getEditedPostContent() ).toMatchSnapshot();
@@ -489,9 +516,10 @@ describe( 'Links', () => {
//
// See: https://github.com/WordPress/gutenberg/pull/15573
- // Collapse selection.
+ // Move caret back into the link.
await page.keyboard.press( 'ArrowLeft' );
- await page.keyboard.press( 'ArrowRight' );
+ await page.keyboard.press( 'ArrowLeft' );
+
// Edit link.
await pressKeyWithModifier( 'primary', 'k' );
await waitForAutoFocus();
@@ -502,6 +530,10 @@ describe( 'Links', () => {
await page.keyboard.press( 'Enter' );
// Navigate back to the popover
+ await page.keyboard.press( 'ArrowLeft' );
+ await page.keyboard.press( 'ArrowLeft' );
+
+ // Navigate back to inputs to verify appears as changed.
await pressKeyWithModifier( 'primary', 'k' );
await waitForAutoFocus();
diff --git a/packages/e2e-tests/specs/editor/various/preview.test.js b/packages/e2e-tests/specs/editor/various/preview.test.js
index 53130fe8d2eba6..c45e7cced2e7b4 100644
--- a/packages/e2e-tests/specs/editor/various/preview.test.js
+++ b/packages/e2e-tests/specs/editor/various/preview.test.js
@@ -2,7 +2,6 @@
* External dependencies
*/
import { last } from 'lodash';
-import { parse } from 'url';
/**
* WordPress dependencies
@@ -187,9 +186,9 @@ describe( 'Preview', () => {
expect( previewTitle ).toBe( 'Hello World! And more.' );
// Published preview URL should include ID and nonce parameters.
- const { query } = parse( previewPage.url(), true );
- expect( query ).toHaveProperty( 'preview_id' );
- expect( query ).toHaveProperty( 'preview_nonce' );
+ const { searchParams } = new URL( previewPage.url() );
+ expect( searchParams.has( 'preview_id' ) ).toBe( true );
+ expect( searchParams.has( 'preview_nonce' ) ).toBe( true );
// Return to editor. Previewing already-autosaved preview tab should
// reuse the opened tab, skipping interstitial. This resolves an edge
diff --git a/packages/e2e-tests/specs/editor/various/rich-text.test.js b/packages/e2e-tests/specs/editor/various/rich-text.test.js
index cd3fa85e62fdcf..e29475984b7f88 100644
--- a/packages/e2e-tests/specs/editor/various/rich-text.test.js
+++ b/packages/e2e-tests/specs/editor/various/rich-text.test.js
@@ -7,6 +7,7 @@ import {
insertBlock,
clickBlockAppender,
pressKeyWithModifier,
+ openDocumentSettingsSidebar,
} from '@wordpress/e2e-test-utils';
describe( 'RichText', () => {
@@ -22,6 +23,7 @@ describe( 'RichText', () => {
//
// See: https://github.com/WordPress/gutenberg/issues/3091
await insertBlock( 'Heading' );
+ await openDocumentSettingsSidebar();
await page.click( '[aria-label="Heading 3"]' );
expect( await getEditedPostContent() ).toMatchSnapshot();
diff --git a/packages/e2e-tests/specs/editor/various/sidebar-permalink-panel.test.js b/packages/e2e-tests/specs/editor/various/sidebar-permalink-panel.test.js
index 33a58782fa64b6..84992f997efab7 100644
--- a/packages/e2e-tests/specs/editor/various/sidebar-permalink-panel.test.js
+++ b/packages/e2e-tests/specs/editor/various/sidebar-permalink-panel.test.js
@@ -6,7 +6,6 @@ import {
createNewPost,
deactivatePlugin,
findSidebarPanelWithTitle,
- openDocumentSettingsSidebar,
publishPost,
} from '@wordpress/e2e-test-utils';
@@ -23,21 +22,8 @@ describe( 'Sidebar Permalink Panel', () => {
await deactivatePlugin( 'gutenberg-test-custom-post-types' );
} );
- it( 'should not render permalink sidebar panel while the post is new', async () => {
+ it( 'should allow permalink sidebar panel to be removed', async () => {
await createNewPost();
- await openDocumentSettingsSidebar();
- expect(
- await findSidebarPanelWithTitle( 'Permalink' )
- ).toBeUndefined();
- } );
-
- it( 'should render permalink sidebar panel after the post is published and allow its removal', async () => {
- await createNewPost();
- await page.keyboard.type( 'aaaaa' );
- await publishPost();
- // Start editing again.
- await page.type( '.editor-post-title__input', ' (Updated)' );
- expect( await findSidebarPanelWithTitle( 'Permalink' ) ).toBeDefined();
await page.evaluate( () => {
const { removeEditorPanel } = wp.data.dispatch( 'core/edit-post' );
removeEditorPanel( 'post-link' );
diff --git a/packages/e2e-tests/specs/editor/various/sidebar.test.js b/packages/e2e-tests/specs/editor/various/sidebar.test.js
index ab2043f17b887a..a9d4dfdd2135e2 100644
--- a/packages/e2e-tests/specs/editor/various/sidebar.test.js
+++ b/packages/e2e-tests/specs/editor/various/sidebar.test.js
@@ -87,8 +87,7 @@ describe( 'Sidebar', () => {
await setBrowserViewport( 'large' );
- const sidebarsDesktop = await page.$$( SIDEBAR_SELECTOR );
- expect( sidebarsDesktop ).toHaveLength( 1 );
+ await page.waitForSelector( SIDEBAR_SELECTOR );
} );
it( 'should preserve tab order while changing active tab', async () => {
diff --git a/packages/e2e-tests/specs/editor/various/writing-flow.test.js b/packages/e2e-tests/specs/editor/various/writing-flow.test.js
index d06176cc7de460..7a379731f8789a 100644
--- a/packages/e2e-tests/specs/editor/various/writing-flow.test.js
+++ b/packages/e2e-tests/specs/editor/various/writing-flow.test.js
@@ -39,7 +39,9 @@ describe( 'Writing Flow', () => {
await page.keyboard.press( 'Enter' );
await page.click( ':focus [aria-label="Two columns; equal split"]' );
await page.click( ':focus .block-editor-button-block-appender' );
- await page.waitForSelector( ':focus.block-editor-inserter__search' );
+ await page.waitForSelector(
+ ':focus.block-editor-inserter__search-input'
+ );
await page.keyboard.type( 'Paragraph' );
await pressKeyTimes( 'Tab', 3 ); // Tab to paragraph result.
await page.keyboard.press( 'Enter' ); // Insert paragraph.
@@ -50,7 +52,9 @@ describe( 'Writing Flow', () => {
// is a temporary solution.
await page.focus( '.wp-block[data-type="core/column"]:nth-child(2)' );
await page.click( ':focus .block-editor-button-block-appender' );
- await page.waitForSelector( ':focus.block-editor-inserter__search' );
+ await page.waitForSelector(
+ ':focus.block-editor-inserter__search-input'
+ );
await page.keyboard.type( 'Paragraph' );
await pressKeyTimes( 'Tab', 3 ); // Tab to paragraph result.
await page.keyboard.press( 'Enter' ); // Insert paragraph.
diff --git a/packages/e2e-tests/specs/experiments/__snapshots__/navigation.test.js.snap b/packages/e2e-tests/specs/experiments/__snapshots__/navigation.test.js.snap
index 9bef34b8e46192..e41ca54dee0304 100644
--- a/packages/e2e-tests/specs/experiments/__snapshots__/navigation.test.js.snap
+++ b/packages/e2e-tests/specs/experiments/__snapshots__/navigation.test.js.snap
@@ -1,7 +1,7 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Navigation allows a navigation menu to be created from an empty menu using a mixture of internal and external links 1`] = `
-"
+"
@@ -9,7 +9,7 @@ exports[`Navigation allows a navigation menu to be created from an empty menu us
`;
exports[`Navigation allows a navigation menu to be created using existing pages 1`] = `
-"
+"
@@ -19,7 +19,7 @@ exports[`Navigation allows a navigation menu to be created using existing pages
`;
exports[`Navigation allows pages to be created from the navigation block and their links added to menu 1`] = `
-"
+"
"
`;
diff --git a/packages/e2e-tests/specs/experiments/multi-entity-saving.test.js b/packages/e2e-tests/specs/experiments/multi-entity-saving.test.js
new file mode 100644
index 00000000000000..cae32494289f7b
--- /dev/null
+++ b/packages/e2e-tests/specs/experiments/multi-entity-saving.test.js
@@ -0,0 +1,192 @@
+/**
+ * WordPress dependencies
+ */
+import {
+ createNewPost,
+ insertBlock,
+ disablePrePublishChecks,
+ publishPostWithPrePublishChecksDisabled,
+ visitAdminPage,
+} from '@wordpress/e2e-test-utils';
+import { addQueryArgs } from '@wordpress/url';
+
+/**
+ * Internal dependencies
+ */
+import {
+ enableExperimentalFeatures,
+ disableExperimentalFeatures,
+} from '../../experimental-features';
+import { trashExistingPosts } from '../../config/setup-test-framework';
+
+describe( 'Multi-entity save flow', () => {
+ // Selectors.
+ const checkedBoxSelector = '.components-checkbox-control__checked';
+ const checkboxInputSelector = '.components-checkbox-control__input';
+ const demoTemplateSelector = '//button[contains(., "front-page")]';
+ const draftSavedSelector = '.editor-post-saved-state.is-saved';
+ const entitiesSaveSelector = '.editor-entities-saved-states__save-button';
+ const multiSaveSelector =
+ '.editor-post-publish-button__button.has-changes-dot';
+ const savePostSelector = '.editor-post-publish-button__button';
+ const disabledSavePostSelector = `${ savePostSelector }[aria-disabled=true]`;
+ const enabledSavePostSelector = `${ savePostSelector }[aria-disabled=false]`;
+ const saveSiteSelector = '.edit-site-save-button__button';
+ const activeSaveSiteSelector = `${ saveSiteSelector }[aria-disabled=false]`;
+ const disabledSaveSiteSelector = `${ saveSiteSelector }[aria-disabled=true]`;
+ const templateDropdownSelector =
+ '.components-dropdown-menu__toggle[aria-label="Switch Template"]';
+ const templatePartSelector = '*[data-type="core/template-part"]';
+ const activatedTemplatePartSelector = `${ templatePartSelector } .block-editor-inner-blocks`;
+
+ // Reusable assertions across Post/Site editors.
+ const assertAllBoxesChecked = async () => {
+ const checkedBoxes = await page.$$( checkedBoxSelector );
+ const checkboxInputs = await page.$$( checkboxInputSelector );
+ expect( checkedBoxes.length - checkboxInputs.length ).toBe( 0 );
+ };
+ // Setup & Teardown.
+ const requiredExperiments = [
+ '#gutenberg-full-site-editing',
+ '#gutenberg-full-site-editing-demo',
+ ];
+ beforeAll( async () => {
+ await enableExperimentalFeatures( requiredExperiments );
+ await trashExistingPosts( 'wp_template' );
+ await trashExistingPosts( 'wp_template_part' );
+ } );
+ afterAll( async () => {
+ await disableExperimentalFeatures( requiredExperiments );
+ } );
+
+ describe( 'Post Editor', () => {
+ // Reusable assertions inside Post editor.
+ const assertMultiSaveEnabled = async () => {
+ const multiSaveButton = await page.waitForSelector(
+ multiSaveSelector
+ );
+ expect( multiSaveButton ).not.toBeNull();
+ };
+ const assertMultiSaveDisabled = async () => {
+ const multiSaveButton = await page.$( multiSaveSelector );
+ expect( multiSaveButton ).toBeNull();
+ };
+
+ describe( 'Pre-Publish state', () => {
+ it( 'Should not trigger multi-entity save button with only post edited', async () => {
+ await createNewPost();
+ await disablePrePublishChecks();
+ // Edit the page some.
+ await page.click( '.editor-post-title' );
+ await page.keyboard.type( 'Test Post...' );
+ await page.keyboard.press( 'Enter' );
+
+ await assertMultiSaveDisabled();
+ } );
+
+ it( 'Should trigger multi-entity save button once template part edited', async () => {
+ // Create new template part.
+ await insertBlock( 'Template Part' );
+ await page.keyboard.type( 'test-template-part' );
+ await page.keyboard.press( 'Tab' );
+ await page.keyboard.type( 'test-theme' );
+ await page.keyboard.press( 'Tab' );
+ await page.keyboard.press( 'Enter' );
+
+ // Make some changes in new Template Part.
+ await page.waitForSelector( activatedTemplatePartSelector );
+ await page.click( templatePartSelector );
+ await page.keyboard.type( 'some words...' );
+
+ await assertMultiSaveEnabled();
+ } );
+
+ it( 'Clicking should open modal with boxes checked by default', async () => {
+ await page.click( savePostSelector );
+ await assertAllBoxesChecked();
+ } );
+
+ it( 'Saving should result in items being saved', async () => {
+ await page.click( entitiesSaveSelector );
+
+ // Verify post is saved.
+ const draftSaved = await page.waitForSelector(
+ draftSavedSelector
+ );
+ expect( draftSaved ).not.toBeNull();
+
+ // Verify template part is saved.
+ await assertMultiSaveDisabled();
+ } );
+ } );
+
+ describe( 'Published state', () => {
+ it( 'Update button disabled after publish', async () => {
+ await publishPostWithPrePublishChecksDisabled();
+ const disabledSaveButton = await page.$(
+ disabledSavePostSelector
+ );
+ expect( disabledSaveButton ).not.toBeNull();
+ } );
+
+ it( 'Update button enabled after editing post', async () => {
+ await page.click( '.editor-post-title' );
+ await page.keyboard.type( '...more title!' );
+
+ // Verify update button is enabled.
+ const enabledSaveButton = await page.$(
+ enabledSavePostSelector
+ );
+ expect( enabledSaveButton ).not.toBeNull();
+
+ // Verify is not for multi-entity saving.
+ await assertMultiSaveDisabled();
+ } );
+
+ it( 'Multi-save button triggered after editing template part.', async () => {
+ await page.click( templatePartSelector );
+ await page.keyboard.type( '...some more words...' );
+ await page.keyboard.press( 'Enter' );
+ await assertMultiSaveEnabled();
+ } );
+ } );
+ } );
+
+ describe( 'Site Editor', () => {
+ it( 'Should be enabled after edits', async () => {
+ // Navigate to site editor.
+ const query = addQueryArgs( '', {
+ page: 'gutenberg-edit-site',
+ } ).slice( 1 );
+ await visitAdminPage( 'admin.php', query );
+
+ // Ensure we are on 'front-page' demo template.
+ await page.click( templateDropdownSelector );
+ const [ demoTemplateButton ] = await page.$x(
+ demoTemplateSelector
+ );
+ await demoTemplateButton.click();
+
+ // Insert a new template part placeholder.
+ await insertBlock( 'Template Part' );
+
+ const enabledButton = await page.waitForSelector(
+ activeSaveSiteSelector
+ );
+ expect( enabledButton ).not.toBeNull();
+ } );
+
+ it( 'Clicking button should open modal with boxes checked', async () => {
+ await page.click( activeSaveSiteSelector );
+ await assertAllBoxesChecked();
+ } );
+
+ it( 'Saving should result in items being saved', async () => {
+ await page.click( entitiesSaveSelector );
+ const disabledButton = await page.waitForSelector(
+ disabledSaveSiteSelector
+ );
+ expect( disabledButton ).not.toBeNull();
+ } );
+ } );
+} );
diff --git a/packages/e2e-tests/specs/experiments/navigation.test.js b/packages/e2e-tests/specs/experiments/navigation.test.js
index fc11a057968fa2..dab5989d0439ab 100644
--- a/packages/e2e-tests/specs/experiments/navigation.test.js
+++ b/packages/e2e-tests/specs/experiments/navigation.test.js
@@ -77,9 +77,10 @@ async function mockCreatePageResponse( title, slug ) {
/**
* Interacts with the LinkControl to perform a search and select a returned suggestion
*
- * @param {string} url What will be typed in the search input
- * @param {string} label What the resulting label will be in the creating Navigation Link Block after the block is created.
- * @param {string} type What kind of suggestion should be clicked, ie. 'url', 'create', or 'entity'
+ * @param {Object} link link object to be tested
+ * @param {string} link.url What will be typed in the search input
+ * @param {string} link.label What the resulting label will be in the creating Navigation Link Block after the block is created.
+ * @param {string} link.type What kind of suggestion should be clicked, ie. 'url', 'create', or 'entity'
*/
async function updateActiveNavigationLink( { url, label, type } ) {
const typeClasses = {
diff --git a/packages/e2e-tests/specs/performance/performance.test.js b/packages/e2e-tests/specs/performance/performance.test.js
index 0bdc172682fafc..9360c98a6d313e 100644
--- a/packages/e2e-tests/specs/performance/performance.test.js
+++ b/packages/e2e-tests/specs/performance/performance.test.js
@@ -2,7 +2,7 @@
* External dependencies
*/
import { join } from 'path';
-import { existsSync, readFileSync, writeFileSync } from 'fs';
+import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'fs';
/**
* WordPress dependencies
@@ -19,8 +19,67 @@ function readFile( filePath ) {
: '';
}
+function deleteFile( filePath ) {
+ if ( existsSync( filePath ) ) {
+ unlinkSync( filePath );
+ }
+}
+
+function isKeyEvent( item ) {
+ return (
+ item.cat === 'devtools.timeline' &&
+ item.name === 'EventDispatch' &&
+ item.dur &&
+ item.args &&
+ item.args.data
+ );
+}
+
+function isKeyDownEvent( item ) {
+ return isKeyEvent( item ) && item.args.data.type === 'keydown';
+}
+
+function isKeyPressEvent( item ) {
+ return isKeyEvent( item ) && item.args.data.type === 'keypress';
+}
+
+function isKeyUpEvent( item ) {
+ return isKeyEvent( item ) && item.args.data.type === 'keyup';
+}
+
+function isFocusEvent( item ) {
+ return isKeyEvent( item ) && item.args.data.type === 'focus';
+}
+
+function getEventDurationsForType( trace, filterFunction ) {
+ return trace.traceEvents
+ .filter( filterFunction )
+ .map( ( item ) => item.dur / 1000 );
+}
+
+function getTypingEventDurations( trace ) {
+ return [
+ getEventDurationsForType( trace, isKeyDownEvent ),
+ getEventDurationsForType( trace, isKeyPressEvent ),
+ getEventDurationsForType( trace, isKeyUpEvent ),
+ ];
+}
+
+function getSelectionEventDurations( trace ) {
+ return [ getEventDurationsForType( trace, isFocusEvent ) ];
+}
+
+jest.setTimeout( 1000000 );
+
describe( 'Performance', () => {
- it( '1000 paragraphs', async () => {
+ it( 'Loading, typing and selecting blocks', async () => {
+ const results = {
+ load: [],
+ domcontentloaded: [],
+ type: [],
+ focus: [],
+ };
+
const html = readFile(
join( __dirname, '../../assets/large-post.html' )
);
@@ -42,42 +101,94 @@ describe( 'Performance', () => {
}, html );
await saveDraft();
- const results = {
- load: [],
- domcontentloaded: [],
- type: [],
- };
-
let i = 1;
- let startTime;
-
- await page.on( 'load', () =>
- results.load.push( new Date() - startTime )
- );
- await page.on( 'domcontentloaded', () =>
- results.domcontentloaded.push( new Date() - startTime )
- );
+ // Measuring loading time
while ( i-- ) {
- startTime = new Date();
await page.reload( { waitUntil: [ 'domcontentloaded', 'load' ] } );
+ const timings = JSON.parse(
+ await page.evaluate( () =>
+ JSON.stringify( window.performance.timing )
+ )
+ );
+ const {
+ navigationStart,
+ domContentLoadedEventEnd,
+ loadEventEnd,
+ } = timings;
+ results.load.push( loadEventEnd - navigationStart );
+ results.domcontentloaded.push(
+ domContentLoadedEventEnd - navigationStart
+ );
}
+ // Measuring typing performance
await insertBlock( 'Paragraph' );
-
i = 200;
-
+ const traceFile = __dirname + '/trace.json';
+ await page.tracing.start( {
+ path: traceFile,
+ screenshots: false,
+ categories: [ 'devtools.timeline' ],
+ } );
while ( i-- ) {
- startTime = new Date();
await page.keyboard.type( 'x' );
- results.type.push( new Date() - startTime );
}
+ await page.tracing.stop();
+ let traceResults = JSON.parse( readFile( traceFile ) );
+ const [
+ keyDownEvents,
+ keyPressEvents,
+ keyUpEvents,
+ ] = getTypingEventDurations( traceResults );
+
+ if (
+ keyDownEvents.length === keyPressEvents.length &&
+ keyPressEvents.length === keyUpEvents.length
+ ) {
+ for ( let j = 0; j < keyDownEvents.length; j++ ) {
+ results.type.push(
+ keyDownEvents[ j ] + keyPressEvents[ j ] + keyUpEvents[ j ]
+ );
+ }
+ }
+
+ // Measuring block selection performance
+ await createNewPost();
+ await page.evaluate( () => {
+ const { createBlock } = window.wp.blocks;
+ const { dispatch } = window.wp.data;
+ const blocks = window.lodash
+ .times( 1000 )
+ .map( () => createBlock( 'core/paragraph' ) );
+ dispatch( 'core/block-editor' ).resetBlocks( blocks );
+ } );
+
+ const paragraphs = await page.$$( '.wp-block' );
+
+ await page.tracing.start( {
+ path: traceFile,
+ screenshots: false,
+ categories: [ 'devtools.timeline' ],
+ } );
+ for ( let j = 0; j < 10; j++ ) {
+ await paragraphs[ j ].click();
+ }
+
+ await page.tracing.stop();
+
+ traceResults = JSON.parse( readFile( traceFile ) );
+ const [ focusEvents ] = getSelectionEventDurations( traceResults );
+ results.focus = focusEvents;
+
writeFileSync(
__dirname + '/results.json',
JSON.stringify( results, null, 2 )
);
+ deleteFile( traceFile );
+
expect( true ).toBe( true );
} );
} );
diff --git a/packages/edit-navigation/.npmrc b/packages/edit-navigation/.npmrc
new file mode 100644
index 00000000000000..43c97e719a5a82
--- /dev/null
+++ b/packages/edit-navigation/.npmrc
@@ -0,0 +1 @@
+package-lock=false
diff --git a/packages/edit-navigation/README.md b/packages/edit-navigation/README.md
new file mode 100644
index 00000000000000..b4df65e94c0ce4
--- /dev/null
+++ b/packages/edit-navigation/README.md
@@ -0,0 +1,5 @@
+- Package name
+- Package description
+- Installation details
+- Usage example
+- `Code is Poetry` logo (`
`)
diff --git a/packages/edit-navigation/package.json b/packages/edit-navigation/package.json
new file mode 100644
index 00000000000000..65b58dfcbebdc1
--- /dev/null
+++ b/packages/edit-navigation/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "@wordpress/edit-navigation",
+ "version": "1.0.0-beta.2",
+ "private": true,
+ "description": "Module for the Navigation page in WordPress.",
+ "author": "The WordPress Contributors",
+ "license": "GPL-2.0-or-later",
+ "keywords": [
+ "wordpress"
+ ],
+ "homepage": "https://github.com/WordPress/gutenberg/tree/master/packages/edit-navigation/README.md",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/WordPress/gutenberg.git",
+ "directory": "packages/edit-navigation"
+ },
+ "bugs": {
+ "url": "https://github.com/WordPress/gutenberg/issues"
+ },
+ "main": "build/index.js",
+ "module": "build-module/index.js",
+ "react-native": "src/index",
+ "dependencies": {
+ "@babel/runtime": "^7.9.2",
+ "@wordpress/block-editor": "file:../block-editor",
+ "@wordpress/block-library": "file:../block-library",
+ "@wordpress/blocks": "file:../blocks",
+ "@wordpress/components": "file:../components",
+ "@wordpress/compose": "file:../compose",
+ "@wordpress/data": "file:../data",
+ "@wordpress/data-controls": "file:../data-controls",
+ "@wordpress/dom-ready": "file:../dom-ready",
+ "@wordpress/element": "file:../element",
+ "@wordpress/hooks": "file:../hooks",
+ "@wordpress/i18n": "file:../i18n",
+ "@wordpress/keyboard-shortcuts": "file:../keyboard-shortcuts",
+ "@wordpress/media-utils": "file:../media-utils",
+ "@wordpress/notices": "file:../notices",
+ "classnames": "^2.2.5",
+ "lodash": "^4.17.15",
+ "rememo": "^3.0.0"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/edit-navigation/src/components/layout/index.js b/packages/edit-navigation/src/components/layout/index.js
new file mode 100644
index 00000000000000..8459c6d45349f3
--- /dev/null
+++ b/packages/edit-navigation/src/components/layout/index.js
@@ -0,0 +1,60 @@
+/**
+ * WordPress dependencies
+ */
+import {
+ DropZoneProvider,
+ FocusReturnProvider,
+ Popover,
+ SlotFillProvider,
+ TabPanel,
+} from '@wordpress/components';
+import { __ } from '@wordpress/i18n';
+
+/**
+ * Internal dependencies
+ */
+import MenusEditor from '../menus-editor';
+import MenuLocationsEditor from '../menu-locations-editor';
+
+export default function Layout( { blockEditorSettings } ) {
+ return (
+ <>
+
+
+
+ { /* */ }
+
+ { ( tab ) => (
+ <>
+ { tab.name === 'menus' && (
+
+ ) }
+ { tab.name === 'menu-locations' && (
+
+ ) }
+ >
+ ) }
+
+
+
+
+
+ >
+ );
+}
diff --git a/packages/edit-navigation/src/components/layout/style.scss b/packages/edit-navigation/src/components/layout/style.scss
new file mode 100644
index 00000000000000..b533f3cd3b20a3
--- /dev/null
+++ b/packages/edit-navigation/src/components/layout/style.scss
@@ -0,0 +1,12 @@
+.edit-navigation-layout__tab-panel {
+ // Matches the padding-left applied by default to the `#wpcontent` element.
+ margin-right: 10px;
+
+ @include break-medium {
+ margin-right: 20px;
+ }
+
+ .components-tab-panel__tabs {
+ margin-bottom: 10px;
+ }
+}
diff --git a/packages/edit-navigation/src/components/menu-editor/block-editor-panel.js b/packages/edit-navigation/src/components/menu-editor/block-editor-panel.js
new file mode 100644
index 00000000000000..3e1a2885b464d9
--- /dev/null
+++ b/packages/edit-navigation/src/components/menu-editor/block-editor-panel.js
@@ -0,0 +1,71 @@
+/**
+ * External dependencies
+ */
+import classnames from 'classnames';
+
+/**
+ * WordPress dependencies
+ */
+import {
+ BlockList,
+ BlockToolbar,
+ NavigableToolbar,
+ ObserveTyping,
+ WritingFlow,
+} from '@wordpress/block-editor';
+import { Button, Panel, PanelBody, Popover } from '@wordpress/components';
+import { useSelect } from '@wordpress/data';
+import { __ } from '@wordpress/i18n';
+
+export default function BlockEditorPanel( { saveBlocks } ) {
+ const { isNavigationModeActive, hasSelectedBlock } = useSelect(
+ ( select ) => {
+ const {
+ isNavigationMode,
+ getBlockSelectionStart,
+ getBlock,
+ } = select( 'core/block-editor' );
+
+ const selectionStartClientId = getBlockSelectionStart();
+
+ return {
+ isNavigationModeActive: isNavigationMode(),
+ hasSelectedBlock:
+ !! selectionStartClientId &&
+ !! getBlock( selectionStartClientId ),
+ };
+ },
+ []
+ );
+
+ return (
+
+ { __( 'Save navigation' ) }
+
+ }
+ >
+
+
+ { hasSelectedBlock && }
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/packages/edit-navigation/src/components/menu-editor/index.js b/packages/edit-navigation/src/components/menu-editor/index.js
new file mode 100644
index 00000000000000..3e8297bdf54038
--- /dev/null
+++ b/packages/edit-navigation/src/components/menu-editor/index.js
@@ -0,0 +1,47 @@
+/**
+ * WordPress dependencies
+ */
+import {
+ BlockEditorKeyboardShortcuts,
+ BlockEditorProvider,
+} from '@wordpress/block-editor';
+import { useViewportMatch } from '@wordpress/compose';
+
+/**
+ * Internal dependencies
+ */
+import useNavigationBlocks from './use-navigation-blocks';
+import MenuEditorShortcuts from './shortcuts';
+import BlockEditorPanel from './block-editor-panel';
+import NavigationStructurePanel from './navigation-structure-panel';
+
+export default function MenuEditor( { menuId, blockEditorSettings } ) {
+ const [ blocks, setBlocks, saveBlocks ] = useNavigationBlocks( menuId );
+ const isLargeViewport = useViewportMatch( 'medium' );
+
+ return (
+
+
+
+
+ setBlocks( updatedBlocks ) }
+ onChange={ ( updatedBlocks ) => setBlocks( updatedBlocks ) }
+ settings={ {
+ ...blockEditorSettings,
+ templateLock: 'all',
+ hasFixedToolbar: true,
+ } }
+ >
+
+
+
+
+
+
+ );
+}
diff --git a/packages/edit-navigation/src/components/menu-editor/navigation-structure-panel.js b/packages/edit-navigation/src/components/menu-editor/navigation-structure-panel.js
new file mode 100644
index 00000000000000..147e894bcd95e1
--- /dev/null
+++ b/packages/edit-navigation/src/components/menu-editor/navigation-structure-panel.js
@@ -0,0 +1,27 @@
+/**
+ * WordPress dependencies
+ */
+import { __experimentalBlockNavigationList } from '@wordpress/block-editor';
+import { Panel, PanelBody } from '@wordpress/components';
+import { __ } from '@wordpress/i18n';
+
+export default function NavigationStructurePanel( { blocks, initialOpen } ) {
+ return (
+
+
+ { !! blocks.length && (
+ <__experimentalBlockNavigationList
+ blocks={ blocks }
+ selectedBlockClientId={ blocks[ 0 ].clientId }
+ selectBlock={ () => {} }
+ showNestedBlocks
+ showAppender
+ />
+ ) }
+
+
+ );
+}
diff --git a/packages/edit-navigation/src/components/menu-editor/shortcuts.js b/packages/edit-navigation/src/components/menu-editor/shortcuts.js
new file mode 100644
index 00000000000000..96889b67a8daa9
--- /dev/null
+++ b/packages/edit-navigation/src/components/menu-editor/shortcuts.js
@@ -0,0 +1,43 @@
+/**
+ * WordPress dependencies
+ */
+import { useEffect, useCallback } from '@wordpress/element';
+import { useDispatch } from '@wordpress/data';
+import { useShortcut } from '@wordpress/keyboard-shortcuts';
+import { __ } from '@wordpress/i18n';
+
+function MenuEditorShortcuts( { saveBlocks } ) {
+ useShortcut(
+ 'core/edit-navigation/save-menu',
+ useCallback( ( event ) => {
+ event.preventDefault();
+ saveBlocks();
+ } ),
+ {
+ bindGlobal: true,
+ }
+ );
+
+ return null;
+}
+
+function RegisterMenuEditorShortcuts() {
+ const { registerShortcut } = useDispatch( 'core/keyboard-shortcuts' );
+ useEffect( () => {
+ registerShortcut( {
+ name: 'core/edit-navigation/save-menu',
+ category: 'global',
+ description: __( 'Save the menu currently being edited.' ),
+ keyCombination: {
+ modifier: 'primary',
+ character: 's',
+ },
+ } );
+ }, [ registerShortcut ] );
+
+ return null;
+}
+
+MenuEditorShortcuts.Register = RegisterMenuEditorShortcuts;
+
+export default MenuEditorShortcuts;
diff --git a/packages/edit-navigation/src/components/menu-editor/style.scss b/packages/edit-navigation/src/components/menu-editor/style.scss
new file mode 100644
index 00000000000000..aa7a3d98b33f55
--- /dev/null
+++ b/packages/edit-navigation/src/components/menu-editor/style.scss
@@ -0,0 +1,68 @@
+.edit-navigation-menu-editor {
+ display: grid;
+ align-items: self-start;
+ grid-gap: 10px;
+
+ @include break-medium {
+ grid-template-columns: 280px 1fr;
+ }
+
+ // Make the block list take up the full width of the panel.
+ .block-editor-block-list__layout.is-root-container {
+ padding: 0;
+ }
+}
+
+.edit-navigation-menu-editor__block-editor-toolbar {
+ height: 46px;
+ margin-bottom: 12px;
+ border: 1px solid #e2e4e7;
+
+ // Borders around toolbar segments.
+ .components-toolbar {
+ background: none;
+ // IE11 has thick paddings without this.
+ line-height: 0;
+
+ // These margins make the buttons themselves overlap the chrome of the toolbar.
+ // This helps make them square, and maximize the hit area.
+ margin-top: -$border-width;
+ margin-bottom: -$border-width;
+
+ // The component is born with a border, but we only need some of them.
+ border: 0;
+
+ // Add a border after item groups to show as separator in the block toolbar.
+ border-right: $border-width solid $light-gray-500;
+ }
+
+
+ // When entering navigation mode, hide the toolbar, but do so in a way where the
+ // outer container retains its height to avoid the blocks moving upwards.
+ &.is-hidden {
+ border-color: transparent;
+
+ .block-editor-block-toolbar {
+ display: none;
+ }
+ }
+}
+
+.edit-navigation-menu-editor__navigation-structure-panel {
+ // IE11 requires the column to be explicity declared.
+ grid-column: 1;
+
+ // Make panels collapsible in IE. The IE analogue of align-items: self-start;.
+ -ms-grid-row-align: start;
+}
+
+.edit-navigation-menu-editor__block-editor-panel {
+ @include break-medium {
+ // IE11 requires the column to be explicity declared.
+ // Only shift this into the second column on desktop.
+ grid-column: 2;
+ }
+
+ // Make panels collapsible in IE. The IE analogue of align-items: self-start;.
+ -ms-grid-row-align: start;
+}
diff --git a/packages/edit-navigation/src/components/menu-editor/use-navigation-blocks.js b/packages/edit-navigation/src/components/menu-editor/use-navigation-blocks.js
new file mode 100644
index 00000000000000..3dc27c54a7644d
--- /dev/null
+++ b/packages/edit-navigation/src/components/menu-editor/use-navigation-blocks.js
@@ -0,0 +1,98 @@
+/**
+ * External dependencies
+ */
+import { isEqual, difference } from 'lodash';
+
+/**
+ * WordPress dependencies
+ */
+import { createBlock } from '@wordpress/blocks';
+import { useSelect, useDispatch } from '@wordpress/data';
+import { useState, useRef, useEffect } from '@wordpress/element';
+
+function createBlockFromMenuItem( menuItem ) {
+ return createBlock( 'core/navigation-link', {
+ label: menuItem.title.raw,
+ url: menuItem.url,
+ } );
+}
+
+function createMenuItemAttributesFromBlock( block ) {
+ return {
+ title: block.attributes.label,
+ url: block.attributes.url,
+ };
+}
+
+export default function useNavigationBlocks( menuId ) {
+ const menuItems = useSelect(
+ ( select ) => select( 'core' ).getMenuItems( { menus: menuId } ),
+ [ menuId ]
+ );
+
+ const { saveMenuItem } = useDispatch( 'core' );
+
+ const [ blocks, setBlocks ] = useState( [] );
+
+ const menuItemsRef = useRef( {} );
+
+ useEffect( () => {
+ if ( ! menuItems ) {
+ return;
+ }
+
+ menuItemsRef.current = {};
+
+ const innerBlocks = [];
+
+ for ( const menuItem of menuItems ) {
+ const block = createBlockFromMenuItem( menuItem );
+ menuItemsRef.current[ block.clientId ] = menuItem;
+ innerBlocks.push( block );
+ }
+
+ setBlocks( [ createBlock( 'core/navigation', {}, innerBlocks ) ] );
+ }, [ menuItems ] );
+
+ const saveBlocks = () => {
+ const { innerBlocks } = blocks[ 0 ];
+
+ for ( const block of innerBlocks ) {
+ const menuItem = menuItemsRef.current[ block.clientId ];
+
+ if ( ! menuItem ) {
+ saveMenuItem( {
+ ...createMenuItemAttributesFromBlock( block ),
+ menus: menuId,
+ } );
+ continue;
+ }
+
+ if (
+ ! isEqual(
+ block.attributes,
+ createBlockFromMenuItem( menuItem ).attributes
+ )
+ ) {
+ saveMenuItem( {
+ ...menuItem,
+ ...createMenuItemAttributesFromBlock( block ),
+ menus: menuId, // Gotta do this because REST API doesn't like receiving an array here. Maybe a bug in the REST API?
+ } );
+ }
+ }
+
+ const deletedClientIds = difference(
+ Object.keys( menuItemsRef.current ),
+ innerBlocks.map( ( block ) => block.clientId )
+ );
+
+ // Disable reason, this code will eventually be implemented.
+ // eslint-disable-next-line no-unused-vars
+ for ( const clientId of deletedClientIds ) {
+ // TODO - delete menu items.
+ }
+ };
+
+ return [ blocks, setBlocks, saveBlocks ];
+}
diff --git a/packages/edit-navigation/src/components/menu-locations-editor/index.js b/packages/edit-navigation/src/components/menu-locations-editor/index.js
new file mode 100644
index 00000000000000..4d69195006cc74
--- /dev/null
+++ b/packages/edit-navigation/src/components/menu-locations-editor/index.js
@@ -0,0 +1,3 @@
+export default function MenuLocationsEditor() {
+ return <>Menu locations editor>;
+}
diff --git a/packages/edit-navigation/src/components/menus-editor/index.js b/packages/edit-navigation/src/components/menus-editor/index.js
new file mode 100644
index 00000000000000..b3513b1115044b
--- /dev/null
+++ b/packages/edit-navigation/src/components/menus-editor/index.js
@@ -0,0 +1,54 @@
+/**
+ * WordPress dependencies
+ */
+import { useSelect } from '@wordpress/data';
+import { useState, useEffect } from '@wordpress/element';
+import { Card, CardBody, Spinner, SelectControl } from '@wordpress/components';
+import { __ } from '@wordpress/i18n';
+
+/**
+ * Internal dependencies
+ */
+import MenuEditor from '../menu-editor';
+
+export default function MenusEditor( { blockEditorSettings } ) {
+ const menus = useSelect( ( select ) => select( 'core' ).getMenus() );
+
+ const [ menuId, setMenuId ] = useState( 0 );
+
+ useEffect( () => {
+ if ( menus?.length ) {
+ setMenuId( menus[ 0 ].id );
+ }
+ }, [ menus ] );
+
+ if ( ! menus ) {
+ return
;
+ }
+
+ return (
+ <>
+
+
+ ( {
+ value: menu.id,
+ label: menu.name,
+ } ) ) }
+ onChange={ ( selectedMenuId ) =>
+ setMenuId( selectedMenuId )
+ }
+ />
+
+
+ { !! menuId && (
+
+ ) }
+ >
+ );
+}
diff --git a/packages/edit-navigation/src/components/menus-editor/style.scss b/packages/edit-navigation/src/components/menus-editor/style.scss
new file mode 100644
index 00000000000000..8276863c97f964
--- /dev/null
+++ b/packages/edit-navigation/src/components/menus-editor/style.scss
@@ -0,0 +1,17 @@
+.edit-navigation-menus-editor__menu-selection-card {
+ margin-bottom: 10px;
+}
+
+.edit-navigation-menus-editor__menu-select-control {
+ @include break-small {
+ .components-base-control__field {
+ display: flex;
+ flex-direction: row;
+ align-items: baseline;
+ margin-bottom: 0;
+ }
+ .components-base-control__label {
+ margin-right: 1ch;
+ }
+ }
+}
diff --git a/packages/edit-navigation/src/index.js b/packages/edit-navigation/src/index.js
new file mode 100644
index 00000000000000..4d3b0005c00672
--- /dev/null
+++ b/packages/edit-navigation/src/index.js
@@ -0,0 +1,24 @@
+/**
+ * WordPress dependencies
+ */
+import {
+ registerCoreBlocks,
+ __experimentalRegisterExperimentalCoreBlocks,
+} from '@wordpress/block-library';
+import { render } from '@wordpress/element';
+
+/**
+ * Internal dependencies
+ */
+import Layout from './components/layout';
+
+export function initialize( id, settings ) {
+ registerCoreBlocks();
+ if ( process.env.GUTENBERG_PHASE === 2 ) {
+ __experimentalRegisterExperimentalCoreBlocks( settings );
+ }
+ render(
+
,
+ document.getElementById( id )
+ );
+}
diff --git a/packages/edit-navigation/src/style.scss b/packages/edit-navigation/src/style.scss
new file mode 100644
index 00000000000000..1e907633b0724f
--- /dev/null
+++ b/packages/edit-navigation/src/style.scss
@@ -0,0 +1,3 @@
+@import "./components/layout/style.scss";
+@import "./components/menu-editor/style.scss";
+@import "./components/menus-editor/style.scss";
diff --git a/packages/edit-post/README.md b/packages/edit-post/README.md
index 641bb89209f185..5a1908b8cc05a9 100644
--- a/packages/edit-post/README.md
+++ b/packages/edit-post/README.md
@@ -438,10 +438,6 @@ _Parameters_
- _props.isPinnable_ `[boolean]`: Whether to allow to pin sidebar to toolbar.
- _props.icon_ `[WPBlockTypeIconRender]`: The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element, to be rendered when the sidebar is pinned to toolbar.
-_Returns_
-
-- `WPComponent`: Plugin sidebar component.
-
# **PluginSidebarMoreMenuItem**
Renders a menu item in `Plugins` group in `More Menu` drop down,
diff --git a/packages/edit-post/package.json b/packages/edit-post/package.json
index 4c52f19aae99c2..153c5b771ef17b 100644
--- a/packages/edit-post/package.json
+++ b/packages/edit-post/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/edit-post",
- "version": "3.13.4",
+ "version": "3.15.1",
"description": "Edit Post module for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -21,7 +21,7 @@
"module": "build-module/index.js",
"react-native": "src/index",
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/a11y": "file:../a11y",
"@wordpress/api-fetch": "file:../api-fetch",
"@wordpress/block-editor": "file:../block-editor",
@@ -31,11 +31,13 @@
"@wordpress/compose": "file:../compose",
"@wordpress/core-data": "file:../core-data",
"@wordpress/data": "file:../data",
+ "@wordpress/data-controls": "file:../data-controls",
"@wordpress/editor": "file:../editor",
"@wordpress/element": "file:../element",
"@wordpress/hooks": "file:../hooks",
"@wordpress/i18n": "file:../i18n",
"@wordpress/icons": "file:../icons",
+ "@wordpress/interface": "file:../interface",
"@wordpress/keyboard-shortcuts": "file:../keyboard-shortcuts",
"@wordpress/keycodes": "file:../keycodes",
"@wordpress/media-utils": "file:../media-utils",
@@ -46,7 +48,7 @@
"@wordpress/viewport": "file:../viewport",
"classnames": "^2.2.5",
"lodash": "^4.17.15",
- "memize": "^1.0.5",
+ "memize": "^1.1.0",
"refx": "^3.0.0",
"rememo": "^3.0.0"
},
diff --git a/packages/edit-post/src/components/block-settings-menu/plugin-block-settings-menu-item.js b/packages/edit-post/src/components/block-settings-menu/plugin-block-settings-menu-item.js
index b23a62b33655a2..f87ddf23923e06 100644
--- a/packages/edit-post/src/components/block-settings-menu/plugin-block-settings-menu-item.js
+++ b/packages/edit-post/src/components/block-settings-menu/plugin-block-settings-menu-item.js
@@ -38,7 +38,8 @@ const shouldRenderItem = ( selectedBlocks, allowedBlocks ) =>
* @param {string} props.label The menu item text.
* @param {Function} props.onClick Callback function to be executed when the user click the menu item.
*
- * @example
ES5
+ * @example
+ *
ES5
* ```js
* // Using ES5 syntax
* var __ = wp.i18n.__;
@@ -61,7 +62,8 @@ const shouldRenderItem = ( selectedBlocks, allowedBlocks ) =>
* }
* ```
*
- * @example
ESNext
+ * @example
+ *
ESNext
* ```jsx
* // Using ESNext syntax
* import { __ } from wp.i18n;
diff --git a/packages/edit-post/src/components/header/fullscreen-mode-close/index.js b/packages/edit-post/src/components/header/fullscreen-mode-close/index.js
index 63869c6ac30b72..27cadc4f67b365 100644
--- a/packages/edit-post/src/components/header/fullscreen-mode-close/index.js
+++ b/packages/edit-post/src/components/header/fullscreen-mode-close/index.js
@@ -8,15 +8,9 @@ import { get } from 'lodash';
*/
import { useSelect } from '@wordpress/data';
import { Button } from '@wordpress/components';
-import { Path, SVG } from '@wordpress/primitives';
import { __ } from '@wordpress/i18n';
import { addQueryArgs } from '@wordpress/url';
-
-const wordPressLogo = (
-
-
-
-);
+import { wordpress } from '@wordpress/icons';
function FullscreenModeClose() {
const { isActive, postType } = useSelect( ( select ) => {
@@ -37,7 +31,7 @@ function FullscreenModeClose() {
return (
-
+ { isInserterVisible && (
+
+ ) }
diff --git a/packages/edit-post/src/components/header/header-toolbar/index.native.js b/packages/edit-post/src/components/header/header-toolbar/index.native.js
index e23cb7067cd6ac..08c49b0c0d63ac 100644
--- a/packages/edit-post/src/components/header/header-toolbar/index.native.js
+++ b/packages/edit-post/src/components/header/header-toolbar/index.native.js
@@ -25,7 +25,6 @@ import {
import styles from './style.scss';
function HeaderToolbar( {
- hasFixedToolbar,
hasRedo,
hasUndo,
redo,
@@ -56,29 +55,27 @@ function HeaderToolbar( {
alwaysBounceHorizontal={ false }
contentContainerStyle={ styles.scrollableContent }
>
-
-
- { /* TODO: replace with EditorHistoryRedo and EditorHistoryUndo */ }
-
-
-
- { hasFixedToolbar && }
+
+ { /* TODO: replace with EditorHistoryRedo and EditorHistoryUndo */ }
+
+
+
{ showKeyboardHideButton && (
@@ -100,9 +97,6 @@ export default compose( [
withSelect( ( select ) => ( {
hasRedo: select( 'core/editor' ).hasEditorRedo(),
hasUndo: select( 'core/editor' ).hasEditorUndo(),
- hasFixedToolbar: select( 'core/edit-post' ).isFeatureActive(
- 'fixedToolbar'
- ),
// This setting (richEditingEnabled) should not live in the block editor's setting.
showInserter:
select( 'core/edit-post' ).getEditorMode() === 'visual' &&
diff --git a/packages/edit-post/src/components/header/header-toolbar/style.native.scss b/packages/edit-post/src/components/header/header-toolbar/style.native.scss
index 9210ce5506d620..62b5f667a190b7 100644
--- a/packages/edit-post/src/components/header/header-toolbar/style.native.scss
+++ b/packages/edit-post/src/components/header/header-toolbar/style.native.scss
@@ -1,6 +1,6 @@
.container {
- height: 44px;
+ height: $mobile-header-toolbar-height;
flex-direction: row;
background-color: #fff;
border-top-color: #e9eff3;
diff --git a/packages/edit-post/src/components/header/header-toolbar/style.scss b/packages/edit-post/src/components/header/header-toolbar/style.scss
index 95053f6808e137..ba3e478348f865 100644
--- a/packages/edit-post/src/components/header/header-toolbar/style.scss
+++ b/packages/edit-post/src/components/header/header-toolbar/style.scss
@@ -11,6 +11,10 @@
}
}
+ > .edit-post-header-toolbar__inserter-toggle {
+ display: inline-flex;
+ }
+
// Hide table of contents and block navigation on mobile.
.block-editor-block-navigation {
display: none;
@@ -75,3 +79,7 @@
}
}
}
+
+.edit-post-header-toolbar__inserter-toggle {
+ margin-right: $grid-unit-10;
+}
diff --git a/packages/edit-post/src/components/header/index.js b/packages/edit-post/src/components/header/index.js
index 347a673d0ff2f3..c356909e9684fe 100644
--- a/packages/edit-post/src/components/header/index.js
+++ b/packages/edit-post/src/components/header/index.js
@@ -6,6 +6,7 @@ import { Button } from '@wordpress/components';
import { PostPreviewButton, PostSavedState } from '@wordpress/editor';
import { useSelect, useDispatch } from '@wordpress/data';
import { cog } from '@wordpress/icons';
+import { PinnedItems } from '@wordpress/interface';
/**
* Internal dependencies
@@ -13,11 +14,10 @@ import { cog } from '@wordpress/icons';
import FullscreenModeClose from './fullscreen-mode-close';
import HeaderToolbar from './header-toolbar';
import MoreMenu from './more-menu';
-import PinnedPlugins from './pinned-plugins';
import PostPublishButtonOrToggle from './post-publish-button-or-toggle';
import PreviewOptions from '../preview-options';
-function Header() {
+function Header( { onToggleInserter, isInserterOpen } ) {
const {
shortcut,
hasActiveMetaboxes,
@@ -60,7 +60,10 @@ function Header() {
-
+
{ ! isPublishSidebarOpened && (
@@ -94,7 +97,7 @@ function Header() {
aria-expanded={ isEditorSidebarOpened }
shortcut={ shortcut }
/>
-
+
diff --git a/packages/edit-post/src/components/header/index.native.js b/packages/edit-post/src/components/header/index.native.js
index 727061f24aa465..787c35b527a2ab 100644
--- a/packages/edit-post/src/components/header/index.native.js
+++ b/packages/edit-post/src/components/header/index.native.js
@@ -7,6 +7,7 @@ import { Keyboard } from 'react-native';
* WordPress dependencies
*/
import { Component } from '@wordpress/element';
+import '@wordpress/interface';
/**
* Internal dependencies
diff --git a/packages/edit-post/src/components/header/mode-switcher/index.js b/packages/edit-post/src/components/header/mode-switcher/index.js
index 78a522470f729a..5ee3ec93747978 100644
--- a/packages/edit-post/src/components/header/mode-switcher/index.js
+++ b/packages/edit-post/src/components/header/mode-switcher/index.js
@@ -42,6 +42,10 @@ function ModeSwitcher() {
);
const { switchEditorMode } = useDispatch( 'core/edit-post' );
+ if ( ! isRichEditingEnabled || ! isCodeEditingEnabled ) {
+ return null;
+ }
+
const choices = MODES.map( ( choice ) => {
if ( choice.value !== mode ) {
return { ...choice, shortcut };
@@ -49,10 +53,6 @@ function ModeSwitcher() {
return choice;
} );
- if ( ! isRichEditingEnabled || ! isCodeEditingEnabled ) {
- return null;
- }
-
return (
(
-
- { ( fills ) =>
- ! isEmpty( fills ) && (
- { fills }
- )
- }
-
-);
-
-export default PinnedPlugins;
diff --git a/packages/edit-post/src/components/header/pinned-plugins/style.scss b/packages/edit-post/src/components/header/pinned-plugins/style.scss
deleted file mode 100644
index f8020c349699ad..00000000000000
--- a/packages/edit-post/src/components/header/pinned-plugins/style.scss
+++ /dev/null
@@ -1,45 +0,0 @@
-.edit-post-pinned-plugins {
- display: none;
-
- @include break-small() {
- display: flex;
- }
-
- .components-button {
- margin-left: 4px;
-
- &.is-pressed {
- margin-left: 5px;
- }
-
- svg {
- max-width: 24px;
- max-height: 24px;
- }
- }
-
- // Colorize plugin icons to ensure contrast and cohesion, but allow plugin developers to override.
- .components-button:not(.is-pressed) svg,
- .components-button:not(.is-pressed) svg * {
- stroke: $dark-gray-primary;
- fill: $dark-gray-primary;
- stroke-width: 0; // !important is omitted here, so stroke-only icons can override easily.
- }
-
- // Forcefully colorize hover and toggled plugin icon states to ensure legibility and consistency.
- .components-button.is-pressed svg,
- .components-button.is-pressed svg *,
- .components-button.is-pressed:hover svg,
- .components-button.is-pressed:hover svg * {
- stroke: $white !important;
- fill: $white !important;
- stroke-width: 0; // !important is omitted here, so stroke-only icons can override easily.
- }
-
- .components-button:hover svg,
- .components-button:hover svg * {
- stroke: $blue-medium-focus !important;
- fill: $blue-medium-focus !important;
- stroke-width: 0; // !important is omitted here, so stroke-only icons can override easily.
- }
-}
diff --git a/packages/edit-post/src/components/header/plugin-more-menu-item/index.js b/packages/edit-post/src/components/header/plugin-more-menu-item/index.js
index fa8d21caf7759b..ebcef732abeab4 100644
--- a/packages/edit-post/src/components/header/plugin-more-menu-item/index.js
+++ b/packages/edit-post/src/components/header/plugin-more-menu-item/index.js
@@ -36,7 +36,8 @@ const PluginMoreMenuItem = ( { onClick = noop, ...props } ) => (
* @param {Function} [props.onClick=noop] The callback function to be executed when the user clicks the menu item.
* @param {...*} [props.other] Any additional props are passed through to the underlying [MenuItem](/packages/components/src/menu-item/README.md) component.
*
- * @example ES5
+ * @example
+ * ES5
* ```js
* // Using ES5 syntax
* var __ = wp.i18n.__;
@@ -59,7 +60,8 @@ const PluginMoreMenuItem = ( { onClick = noop, ...props } ) => (
* }
* ```
*
- * @example ESNext
+ * @example
+ * ESNext
* ```jsx
* // Using ESNext syntax
* import { __ } from '@wordpress/i18n';
diff --git a/packages/edit-post/src/components/header/plugin-more-menu-item/test/__snapshots__/index.js.snap b/packages/edit-post/src/components/header/plugin-more-menu-item/test/__snapshots__/index.js.snap
index d847aadaff72ca..44ebe7ba7b2138 100644
--- a/packages/edit-post/src/components/header/plugin-more-menu-item/test/__snapshots__/index.js.snap
+++ b/packages/edit-post/src/components/header/plugin-more-menu-item/test/__snapshots__/index.js.snap
@@ -22,9 +22,9 @@ exports[`PluginMoreMenuItem renders menu item as button properly 1`] = `
type="button"
>
ES5
+ * @example
+ * ES5
* ```js
* // Using ES5 syntax
* var __ = wp.i18n.__;
@@ -55,7 +56,8 @@ const PluginSidebarMoreMenuItem = ( {
* }
* ```
*
- * @example ESNext
+ * @example
+ * ESNext
* ```jsx
* // Using ESNext syntax
* import { __ } from '@wordpress/i18n';
diff --git a/packages/edit-post/src/components/header/style.scss b/packages/edit-post/src/components/header/style.scss
index a476cb050d73f5..25b693ecb0bc81 100644
--- a/packages/edit-post/src/components/header/style.scss
+++ b/packages/edit-post/src/components/header/style.scss
@@ -34,38 +34,37 @@
.edit-post-header__toolbar {
display: flex;
flex-grow: 1;
- padding-left: $grid-unit-30;
+ padding-left: $grid-unit-10;
+
+ @include break-small() {
+ padding-left: $grid-unit-30;
+ }
+
+ .table-of-contents {
+ display: none;
+
+ @include break-small() {
+ display: block;
+ }
+ }
}
.edit-post-header__settings {
display: inline-flex;
align-items: center;
flex-wrap: wrap;
- padding-right: $grid-unit-20;
+ padding-right: $grid-unit-05;
+
+ @include break-small () {
+ padding-right: $grid-unit-20;
+ }
}
/**
* Buttons in the Toolbar
*/
-
-.edit-post-header__toolbar {
- .block-editor-inserter__toggle {
- // Special dimensions for this button.
- min-width: 32px;
- height: 32px;
- margin-right: $grid-unit-10;
- }
-}
-
-
.edit-post-header__settings {
- // Header toggle buttons.
- .components-button.is-pressed {
- color: $white;
- background: $dark-gray-primary;
- }
-
// Adjust button paddings to scale better to mobile.
.components-button.editor-post-save-draft,
.editor-post-saved-state,
diff --git a/packages/edit-post/src/components/keyboard-shortcuts/index.js b/packages/edit-post/src/components/keyboard-shortcuts/index.js
index d261551e43113b..3e2e4938cc7f19 100644
--- a/packages/edit-post/src/components/keyboard-shortcuts/index.js
+++ b/packages/edit-post/src/components/keyboard-shortcuts/index.js
@@ -30,6 +30,7 @@ function KeyboardShortcuts() {
switchEditorMode,
openGeneralSidebar,
closeGeneralSidebar,
+ toggleFeature,
} = useDispatch( 'core/edit-post' );
const { registerShortcut } = useDispatch( 'core/keyboard-shortcuts' );
@@ -37,13 +38,23 @@ function KeyboardShortcuts() {
registerShortcut( {
name: 'core/edit-post/toggle-mode',
category: 'global',
- description: __( 'Switch between Visual editor and Code editor.' ),
+ description: __( 'Switch between visual editor and code editor.' ),
keyCombination: {
modifier: 'secondary',
character: 'm',
},
} );
+ registerShortcut( {
+ name: 'core/edit-post/toggle-fullscreen',
+ category: 'global',
+ description: __( 'Toggle fullscreen mode.' ),
+ keyCombination: {
+ modifier: 'secondary',
+ character: 'f',
+ },
+ } );
+
registerShortcut( {
name: 'core/edit-post/toggle-block-navigation',
category: 'global',
@@ -120,6 +131,16 @@ function KeyboardShortcuts() {
}
);
+ useShortcut(
+ 'core/edit-post/toggle-fullscreen',
+ () => {
+ toggleFeature( 'fullscreenMode' );
+ },
+ {
+ bindGlobal: true,
+ }
+ );
+
useShortcut(
'core/edit-post/toggle-sidebar',
( event ) => {
diff --git a/packages/edit-post/src/components/layout/index.js b/packages/edit-post/src/components/layout/index.js
index 99bdd87a457b62..c25ace812ff87c 100644
--- a/packages/edit-post/src/components/layout/index.js
+++ b/packages/edit-post/src/components/layout/index.js
@@ -17,7 +17,7 @@ import {
import { useSelect, useDispatch } from '@wordpress/data';
import {
BlockBreadcrumb,
- __experimentalEditorSkeleton as EditorSkeleton,
+ __experimentalLibrary as Library,
} from '@wordpress/block-editor';
import {
Button,
@@ -28,6 +28,13 @@ import {
import { useViewportMatch } from '@wordpress/compose';
import { PluginArea } from '@wordpress/plugins';
import { __ } from '@wordpress/i18n';
+import {
+ ComplementaryArea,
+ FullscreenMode,
+ InterfaceSkeleton,
+} from '@wordpress/interface';
+import { useState, useEffect } from '@wordpress/element';
+import { close } from '@wordpress/icons';
/**
* Internal dependencies
@@ -38,25 +45,31 @@ import EditPostKeyboardShortcuts from '../keyboard-shortcuts';
import KeyboardShortcutHelpModal from '../keyboard-shortcut-help-modal';
import ManageBlocksModal from '../manage-blocks-modal';
import OptionsModal from '../options-modal';
-import FullscreenMode from '../fullscreen-mode';
import BrowserURL from '../browser-url';
import Header from '../header';
import SettingsSidebar from '../sidebar/settings-sidebar';
-import Sidebar from '../sidebar';
import MetaBoxes from '../meta-boxes';
import PluginPostPublishPanel from '../sidebar/plugin-post-publish-panel';
import PluginPrePublishPanel from '../sidebar/plugin-pre-publish-panel';
import WelcomeGuide from '../welcome-guide';
+const interfaceLabels = {
+ leftSidebar: __( 'Block Library' ),
+};
+
function Layout() {
+ const [ isInserterOpen, setIsInserterOpen ] = useState( false );
const isMobileViewport = useViewportMatch( 'medium', '<' );
+ const isHugeViewport = useViewportMatch( 'huge', '>=' );
const {
closePublishSidebar,
openGeneralSidebar,
+ closeGeneralSidebar,
togglePublishSidebar,
} = useDispatch( 'core/edit-post' );
const {
mode,
+ isFullscreenActive,
isRichEditingEnabled,
editorSidebarOpened,
pluginSidebarOpened,
@@ -81,6 +94,9 @@ function Layout() {
publishSidebarOpened: select(
'core/edit-post'
).isPublishSidebarOpened(),
+ isFullscreenActive: select( 'core/edit-post' ).isFeatureActive(
+ 'fullscreenMode'
+ ),
mode: select( 'core/edit-post' ).getEditorMode(),
isRichEditingEnabled: select( 'core/editor' ).getEditorSettings()
.richEditingEnabled,
@@ -108,9 +124,21 @@ function Layout() {
hasBlockSelected ? 'edit-post/block' : 'edit-post/document'
);
+ // Inserter and Sidebars are mutually exclusive
+ useEffect( () => {
+ if ( sidebarIsOpened && ! isHugeViewport ) {
+ setIsInserterOpen( false );
+ }
+ }, [ sidebarIsOpened, isHugeViewport ] );
+ useEffect( () => {
+ if ( isInserterOpen && ! isHugeViewport ) {
+ closeGeneralSidebar();
+ }
+ }, [ isInserterOpen, isHugeViewport ] );
+
return (
<>
-
+
@@ -118,9 +146,42 @@ function Layout() {
- }
+ labels={ interfaceLabels }
+ header={
+
) }
-
+
>
)
}
@@ -172,7 +233,7 @@ function Layout() {
)
}
- publish={
+ actions={
publishSidebarOpened ? (
- { showPageTemplatePicker && (
- <__experimentalPageTemplatePicker />
+ { isTemplatePickerAvailable && (
+ <__experimentalPageTemplatePicker
+ visible={ isTemplatePickerVisible }
+ />
) }
@@ -168,5 +171,5 @@ export default compose( [
};
} ),
withPreferredColorScheme,
- __experimentalWithPageTemplatePickerVisible,
+ __experimentalWithPageTemplatePicker,
] )( Layout );
diff --git a/packages/edit-post/src/components/layout/style.scss b/packages/edit-post/src/components/layout/style.scss
index cdc970e42ef1e7..340284a8613b15 100644
--- a/packages/edit-post/src/components/layout/style.scss
+++ b/packages/edit-post/src/components/layout/style.scss
@@ -15,7 +15,7 @@
.edit-post-layout .components-editor-notices__snackbar {
position: fixed;
right: 0;
- bottom: 20px;
+ bottom: 40px;
padding-left: 16px;
padding-right: 16px;
}
@@ -57,7 +57,7 @@
}
}
-.block-editor-editor-skeleton__sidebar > div {
+.interface-interface-skeleton__sidebar > div {
height: 100%;
}
@@ -82,10 +82,10 @@
display: flex;
justify-content: center;
- .block-editor-editor-skeleton__publish:focus &,
- .block-editor-editor-skeleton__publish:focus-within &,
- .block-editor-editor-skeleton__sidebar:focus &,
- .block-editor-editor-skeleton__sidebar:focus-within & {
+ .interface-interface-skeleton__actions:focus &,
+ .interface-interface-skeleton__actions:focus-within &,
+ .interface-interface-skeleton__actions:focus &,
+ .interface-interface-skeleton__actions:focus-within & {
top: auto;
bottom: 0;
}
@@ -104,26 +104,34 @@
font-size: $default-font-size;
padding: 0 ($grid-unit-15 + 6px);
}
+}
- .table-of-contents {
- margin: auto 0 0 auto;
- }
-
- .table-of-contents .components-button {
- height: $button-size-small;
- padding: 0;
+.edit-post-layout .interface-interface-skeleton__content {
+ background-color: $light-gray-700;
+}
- &:focus {
- box-shadow: inset 0 0 0 2px color($theme-color);
+.edit-post-layout__inserter-panel {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+}
- // Windows High Contrast mode will show this outline, but not the box-shadow.
- outline: 1px solid transparent;
+.edit-post-layout__inserter-panel-header {
+ padding-top: $grid-unit-10;
+ padding-right: $grid-unit-10;
+ display: flex;
+ justify-content: flex-end;
- }
+ @include break-medium() {
+ display: none;
}
}
-.edit-post-layout .block-editor-editor-skeleton__content {
- background-color: $light-gray-700;
-}
+.edit-post-layout__inserter-panel-content {
+ // Leave space for the close button
+ height: calc(100% - #{$button-size} - #{$grid-unit-10});
+ @include break-medium() {
+ height: 100%;
+ }
+}
diff --git a/packages/edit-post/src/components/manage-blocks-modal/manager.js b/packages/edit-post/src/components/manage-blocks-modal/manager.js
index bdb8349be888f7..41eba0b4f97e9a 100644
--- a/packages/edit-post/src/components/manage-blocks-modal/manager.js
+++ b/packages/edit-post/src/components/manage-blocks-modal/manager.js
@@ -52,9 +52,10 @@ function BlockManager( {
{ !! numberOfHiddenBlocks && (
{ sprintf(
+ /* translators: %d: number of blocks. */
_n(
- '%1$d block is disabled.',
- '%1$d blocks are disabled.',
+ '%d block is disabled.',
+ '%d blocks are disabled.',
numberOfHiddenBlocks
),
numberOfHiddenBlocks
diff --git a/packages/edit-post/src/components/options-modal/options/test/__snapshots__/enable-custom-fields.js.snap b/packages/edit-post/src/components/options-modal/options/test/__snapshots__/enable-custom-fields.js.snap
index fd30201bd3b8d6..eb27081e91dc8f 100644
--- a/packages/edit-post/src/components/options-modal/options/test/__snapshots__/enable-custom-fields.js.snap
+++ b/packages/edit-post/src/components/options-modal/options/test/__snapshots__/enable-custom-fields.js.snap
@@ -22,9 +22,9 @@ exports[`EnableCustomFieldsOption renders a checked checkbox and a confirmation
value="1"
/>
{
- switch ( deviceType ) {
- case 'Tablet':
- return __( 'Tablet' );
- case 'Mobile':
- return __( 'Mobile' );
- default:
- return __( 'Desktop' );
- }
- };
-
const isSaveable = useSelect( ( select ) => {
return select( 'core/editor' ).isEditedPostSaveable();
}, [] );
@@ -77,15 +66,13 @@ export default function PreviewOptions( {
aria-expanded={ isOpen }
disabled={ ! isSaveable }
>
- { translateDropdownButtonText() }
-
- { downArrow }
-
+ { __( 'Preview' ) }
+ { downArrow }
) }
renderContent={ () => (
<>
-
+
setPreviewDeviceType( 'Desktop' ) }
@@ -119,8 +106,8 @@ export default function PreviewOptions( {
forcePreviewLink={ forcePreviewLink }
textContent={
<>
- { __( 'Preview externally' ) }
+ { __( 'Preview in new tab' ) }
>
}
/>
diff --git a/packages/edit-post/src/components/preview-options/style.scss b/packages/edit-post/src/components/preview-options/style.scss
index 0d523c297a330b..de88a83faa7b2b 100644
--- a/packages/edit-post/src/components/preview-options/style.scss
+++ b/packages/edit-post/src/components/preview-options/style.scss
@@ -1,18 +1,20 @@
.editor-post-preview__dropdown {
display: none;
margin-right: $grid-unit-15;
- box-shadow: inset 0 0 0 $border-width $light-gray-secondary;
- border-radius: $radius-block-ui;
padding: 0;
}
.editor-post-preview__button-toggle {
display: flex;
justify-content: space-between;
- padding: 0 0 0 $grid-unit-15;
+ padding: 0 $grid-unit-10 0 $grid-unit-15;
&:focus:not(:disabled) {
- box-shadow: inset 0 0 0 1px $white, 0 0 0 2px color($theme-color);
+ box-shadow: inset 0 0 0 1px $white, 0 0 0 $border-width-focus $theme-color;
+ }
+
+ svg {
+ margin-left: $grid-unit-05;
}
}
@@ -24,15 +26,6 @@
}
}
-.editor-post-preview__button-separator {
- border-left: $border-width solid $light-gray-secondary;
- padding: 6px;
- margin-left: $grid-unit-15;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
.editor-post-preview__dropdown-content {
.components-popover__content {
overflow-y: visible;
@@ -53,11 +46,15 @@
}
.editor-post-preview__button-external {
- padding-left: $button-size-small + $grid-unit-10 + $grid-unit-10;
+ padding-left: $grid-unit-10;
margin-right: auto;
width: 100%;
display: flex;
- justify-content: space-between;
+ justify-content: flex-start;
+
+ svg {
+ margin-right: $grid-unit-10;
+ }
}
@include break-small() {
diff --git a/packages/edit-post/src/components/sidebar/index.js b/packages/edit-post/src/components/sidebar/index.js
deleted file mode 100644
index e6175b72b2685a..00000000000000
--- a/packages/edit-post/src/components/sidebar/index.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * External dependencies
- */
-import classnames from 'classnames';
-
-/**
- * WordPress dependencies
- */
-import {
- createSlotFill,
- withFocusReturn,
- Animate,
-} from '@wordpress/components';
-import { withSelect } from '@wordpress/data';
-import { ifCondition, compose } from '@wordpress/compose';
-
-const { Fill, Slot } = createSlotFill( 'Sidebar' );
-
-/**
- * Renders a sidebar with its content.
- *
- * @return {Object} The rendered sidebar.
- */
-function Sidebar( { children, className } ) {
- return (
-
- { children }
-
- );
-}
-
-Sidebar = withFocusReturn( {
- onFocusReturn() {
- const button = document.querySelector(
- '.edit-post-header__settings [aria-label="Settings"]'
- );
- if ( button ) {
- button.focus();
- return false;
- }
- },
-} )( Sidebar );
-
-function AnimatedSidebarFill( props ) {
- return (
-
-
- { () => }
-
-
- );
-}
-
-const WrappedSidebar = compose(
- withSelect( ( select, { name } ) => ( {
- isActive:
- select( 'core/edit-post' ).getActiveGeneralSidebarName() === name,
- } ) ),
- ifCondition( ( { isActive } ) => isActive )
-)( AnimatedSidebarFill );
-
-WrappedSidebar.Slot = Slot;
-
-export default WrappedSidebar;
diff --git a/packages/edit-post/src/components/sidebar/plugin-document-setting-panel/index.js b/packages/edit-post/src/components/sidebar/plugin-document-setting-panel/index.js
index 757e4965e5d991..56133e8162aad6 100644
--- a/packages/edit-post/src/components/sidebar/plugin-document-setting-panel/index.js
+++ b/packages/edit-post/src/components/sidebar/plugin-document-setting-panel/index.js
@@ -59,7 +59,8 @@ const PluginDocumentSettingFill = ( {
* @param {string} [props.title] The title of the panel
* @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element, to be rendered when the sidebar is pinned to toolbar.
*
- * @example ES5
+ * @example
+ * ES5
* ```js
* // Using ES5 syntax
* var el = wp.element.createElement;
@@ -83,7 +84,8 @@ const PluginDocumentSettingFill = ( {
* } );
* ```
*
- * @example ESNext
+ * @example
+ * ESNext
* ```jsx
* // Using ESNext syntax
* const { registerPlugin } = wp.plugins;
diff --git a/packages/edit-post/src/components/sidebar/plugin-post-publish-panel/index.js b/packages/edit-post/src/components/sidebar/plugin-post-publish-panel/index.js
index 43d1fc2d1eaac4..73fabe8a32f48b 100644
--- a/packages/edit-post/src/components/sidebar/plugin-post-publish-panel/index.js
+++ b/packages/edit-post/src/components/sidebar/plugin-post-publish-panel/index.js
@@ -35,7 +35,8 @@ const PluginPostPublishPanelFill = ( {
* @param {boolean} [props.initialOpen=false] Whether to have the panel initially opened. When no title is provided it is always opened.
* @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element, to be rendered when the sidebar is pinned to toolbar.
*
- * @example ES5
+ * @example
+ * ES5
* ```js
* // Using ES5 syntax
* var __ = wp.i18n.__;
@@ -54,7 +55,8 @@ const PluginPostPublishPanelFill = ( {
* }
* ```
*
- * @example ESNext
+ * @example
+ * ESNext
* ```jsx
* // Using ESNext syntax
* const { __ } = wp.i18n;
diff --git a/packages/edit-post/src/components/sidebar/plugin-post-status-info/index.js b/packages/edit-post/src/components/sidebar/plugin-post-status-info/index.js
index 10259358e764f9..b43199112901b1 100644
--- a/packages/edit-post/src/components/sidebar/plugin-post-status-info/index.js
+++ b/packages/edit-post/src/components/sidebar/plugin-post-status-info/index.js
@@ -17,7 +17,8 @@ export const { Fill, Slot } = createSlotFill( 'PluginPostStatusInfo' );
* @param {Object} props Component properties.
* @param {string} [props.className] An optional class name added to the row.
*
- * @example ES5
+ * @example
+ * ES5
* ```js
* // Using ES5 syntax
* var __ = wp.i18n.__;
@@ -34,7 +35,8 @@ export const { Fill, Slot } = createSlotFill( 'PluginPostStatusInfo' );
* }
* ```
*
- * @example ESNext
+ * @example
+ * ESNext
* ```jsx
* // Using ESNext syntax
* const { __ } = wp.i18n;
diff --git a/packages/edit-post/src/components/sidebar/plugin-pre-publish-panel/index.js b/packages/edit-post/src/components/sidebar/plugin-pre-publish-panel/index.js
index db6900995db37d..8f39c8e1ee5313 100644
--- a/packages/edit-post/src/components/sidebar/plugin-pre-publish-panel/index.js
+++ b/packages/edit-post/src/components/sidebar/plugin-pre-publish-panel/index.js
@@ -38,7 +38,8 @@ const PluginPrePublishPanelFill = ( {
* icon slug string, or an SVG WP element, to be rendered when
* the sidebar is pinned to toolbar.
*
- * @example ES5
+ * @example
+ * ES5
* ```js
* // Using ES5 syntax
* var __ = wp.i18n.__;
@@ -57,7 +58,8 @@ const PluginPrePublishPanelFill = ( {
* }
* ```
*
- * @example ESNext
+ * @example
+ * ESNext
* ```jsx
* // Using ESNext syntax
* const { __ } = wp.i18n;
diff --git a/packages/edit-post/src/components/sidebar/plugin-sidebar/index.js b/packages/edit-post/src/components/sidebar/plugin-sidebar/index.js
index deb007a37d82dc..3034d5bab9165f 100644
--- a/packages/edit-post/src/components/sidebar/plugin-sidebar/index.js
+++ b/packages/edit-post/src/components/sidebar/plugin-sidebar/index.js
@@ -1,71 +1,9 @@
/**
* WordPress dependencies
*/
-import { Button, Panel } from '@wordpress/components';
-import { withDispatch, withSelect } from '@wordpress/data';
+import { ComplementaryArea } from '@wordpress/interface';
+import { useSelect } from '@wordpress/data';
import { __ } from '@wordpress/i18n';
-import { withPluginContext } from '@wordpress/plugins';
-import { compose } from '@wordpress/compose';
-import { starEmpty, starFilled } from '@wordpress/icons';
-
-/**
- * Internal dependencies
- */
-import PinnedPlugins from '../../header/pinned-plugins';
-import Sidebar from '../';
-import SidebarHeader from '../sidebar-header';
-
-function PluginSidebar( props ) {
- const {
- children,
- className,
- icon,
- isActive,
- isPinnable = true,
- isPinned,
- sidebarName,
- title,
- togglePin,
- toggleSidebar,
- } = props;
-
- return (
- <>
- { isPinnable && (
-
- { isPinned && (
-
- ) }
-
- ) }
-
-
- { title }
- { isPinnable && (
-
- ) }
-
- { children }
-
- >
- );
-}
/**
* Renders a sidebar when activated. The contents within the `PluginSidebar` will appear as content within the sidebar.
@@ -84,7 +22,8 @@ function PluginSidebar( props ) {
* @param {boolean} [props.isPinnable=true] Whether to allow to pin sidebar to toolbar.
* @param {WPBlockTypeIconRender} [props.icon=inherits from the plugin] The [Dashicon](https://developer.wordpress.org/resource/dashicons/) icon slug string, or an SVG WP element, to be rendered when the sidebar is pinned to toolbar.
*
- * @example ES5
+ * @example
+ * ES5
* ```js
* // Using ES5 syntax
* var __ = wp.i18n.__;
@@ -110,7 +49,8 @@ function PluginSidebar( props ) {
* }
* ```
*
- * @example ESNext
+ * @example
+ * ESNext
* ```jsx
* // Using ESNext syntax
* import { __ } from '@wordpress/i18n';
@@ -130,44 +70,26 @@ function PluginSidebar( props ) {
*
* );
* ```
- *
- * @return {WPComponent} Plugin sidebar component.
*/
-export default compose(
- withPluginContext( ( context, ownProps ) => {
+export default function PluginSidebarEditPost( { className, ...props } ) {
+ const { postTitle, shortcut } = useSelect( ( select ) => {
return {
- icon: ownProps.icon || context.icon,
- sidebarName: `${ context.name }/${ ownProps.name }`,
+ postTitle: select( 'core/editor' ).getEditedPostAttribute(
+ 'title'
+ ),
+ shortcut: select(
+ 'core/keyboard-shortcuts'
+ ).getShortcutRepresentation( 'core/edit-post/toggle-sidebar' ),
};
- } ),
- withSelect( ( select, { sidebarName } ) => {
- const { getActiveGeneralSidebarName, isPluginItemPinned } = select(
- 'core/edit-post'
- );
-
- return {
- isActive: getActiveGeneralSidebarName() === sidebarName,
- isPinned: isPluginItemPinned( sidebarName ),
- };
- } ),
- withDispatch( ( dispatch, { isActive, sidebarName } ) => {
- const {
- closeGeneralSidebar,
- openGeneralSidebar,
- togglePinnedPluginItem,
- } = dispatch( 'core/edit-post' );
-
- return {
- togglePin() {
- togglePinnedPluginItem( sidebarName );
- },
- toggleSidebar() {
- if ( isActive ) {
- closeGeneralSidebar();
- } else {
- openGeneralSidebar( sidebarName );
- }
- },
- };
- } )
-)( PluginSidebar );
+ } );
+ return (
+
+ );
+}
diff --git a/packages/edit-post/src/components/sidebar/post-link/index.js b/packages/edit-post/src/components/sidebar/post-link/index.js
index b1f295a62080c1..5bf5b6bba6997b 100644
--- a/packages/edit-post/src/components/sidebar/post-link/index.js
+++ b/packages/edit-post/src/components/sidebar/post-link/index.js
@@ -27,24 +27,18 @@ function PostLink( {
editPermalink,
forceEmptyField,
setState,
- postTitle,
postSlug,
- postID,
postTypeLabel,
} ) {
const { prefix, suffix } = permalinkParts;
let prefixElement, postNameElement, suffixElement;
- const currentSlug =
- safeDecodeURIComponent( postSlug ) ||
- cleanForSlug( postTitle ) ||
- postID;
if ( isEditable ) {
prefixElement = prefix && (
{ prefix }
);
- postNameElement = currentSlug && (
+ postNameElement = postSlug && (
- { currentSlug }
+ { postSlug }
);
suffixElement = suffix && (
@@ -62,7 +56,7 @@ function PostLink( {
{
editPermalink( newValue );
// When we delete the field the permalink gets
@@ -100,9 +94,9 @@ function PostLink( {
) }
-
+
{ postTypeLabel || __( 'View post' ) }
-
+
{
const {
- isEditedPostNew,
isPermalinkEditable,
getCurrentPost,
isCurrentPostPublished,
getPermalinkParts,
getEditedPostAttribute,
+ getEditedPostSlug,
} = select( 'core/editor' );
const { isEditorPanelEnabled, isEditorPanelOpened } = select(
'core/edit-post'
);
const { getPostType } = select( 'core' );
- const { link, id } = getCurrentPost();
+ const { link } = getCurrentPost();
const postTypeName = getEditedPostAttribute( 'type' );
const postType = getPostType( postTypeName );
return {
- isNew: isEditedPostNew(),
postLink: link,
isEditable: isPermalinkEditable(),
isPublished: isCurrentPostPublished(),
@@ -153,19 +146,13 @@ export default compose( [
permalinkParts: getPermalinkParts(),
isEnabled: isEditorPanelEnabled( PANEL_NAME ),
isViewable: get( postType, [ 'viewable' ], false ),
- postTitle: getEditedPostAttribute( 'title' ),
- postSlug: getEditedPostAttribute( 'slug' ),
- postID: id,
+ postSlug: safeDecodeURIComponent( getEditedPostSlug() ),
postTypeLabel: get( postType, [ 'labels', 'view_item' ] ),
};
} ),
- ifCondition(
- ( { isEnabled, isNew, postLink, isViewable, permalinkParts } ) => {
- return (
- isEnabled && ! isNew && postLink && isViewable && permalinkParts
- );
- }
- ),
+ ifCondition( ( { isEnabled, postLink, isViewable, permalinkParts } ) => {
+ return isEnabled && postLink && isViewable && permalinkParts;
+ } ),
withDispatch( ( dispatch ) => {
const { toggleEditorPanelOpened } = dispatch( 'core/edit-post' );
const { editPost } = dispatch( 'core/editor' );
diff --git a/packages/edit-post/src/components/sidebar/post-link/style.scss b/packages/edit-post/src/components/sidebar/post-link/style.scss
index efe6ecce4af395..ab442190b61e61 100644
--- a/packages/edit-post/src/components/sidebar/post-link/style.scss
+++ b/packages/edit-post/src/components/sidebar/post-link/style.scss
@@ -3,6 +3,7 @@
}
.edit-post-post-link__preview-label {
+ font-weight: 400;
margin: 0;
}
diff --git a/packages/edit-post/src/components/sidebar/settings-header/index.js b/packages/edit-post/src/components/sidebar/settings-header/index.js
index 4f2a2d4ebe9ff2..b4317b9217906f 100644
--- a/packages/edit-post/src/components/sidebar/settings-header/index.js
+++ b/packages/edit-post/src/components/sidebar/settings-header/index.js
@@ -5,11 +5,6 @@ import { Button } from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import { withDispatch } from '@wordpress/data';
-/**
- * Internal dependencies
- */
-import SidebarHeader from '../sidebar-header';
-
const SettingsHeader = ( {
openDocumentSettings,
openBlockSettings,
@@ -30,35 +25,30 @@ const SettingsHeader = ( {
: // translators: ARIA label for the Settings Sidebar tab, not selected.
[ __( 'Block' ), '' ];
+ /* Use a list so screen readers will announce how many tabs there are. */
return (
-
- { /* Use a list so screen readers will announce how many tabs there are. */ }
-
-
-
- { __( 'Document' ) }
-
-
-
-
- { blockLabel }
-
-
-
-
+
+
+
+ { __( 'Document' ) }
+
+
+
+
+ { blockLabel }
+
+
+
);
};
diff --git a/packages/edit-post/src/components/sidebar/settings-header/style.scss b/packages/edit-post/src/components/sidebar/settings-header/style.scss
index 5411341b547e3c..04684bc06b4232 100644
--- a/packages/edit-post/src/components/sidebar/settings-header/style.scss
+++ b/packages/edit-post/src/components/sidebar/settings-header/style.scss
@@ -13,6 +13,8 @@
}
.components-button.edit-post-sidebar__panel-tab {
+ border-radius: 0;
+ height: 50px - $border-width;
background: transparent;
border: none;
box-shadow: none;
@@ -22,9 +24,6 @@
margin-left: 0;
font-weight: 400;
color: $dark-gray-900;
- @include square-style__neutral;
- transition: box-shadow 0.1s linear;
- @include reduce-motion("transition");
// This pseudo-element "duplicates" the tab label and sets the text to bold.
// This ensures that the tab doesn't change width when selected.
@@ -40,7 +39,8 @@
}
&.is-active {
- box-shadow: inset 0 -4px theme(outlines);
+ // The transparent shadow ensures no jumpiness when focus animates on an active tab.
+ box-shadow: inset 0 0 0 $border-width-focus transparent, inset 0 0 -$border-width-tab 0 0 $theme-color;
font-weight: 600;
position: relative;
@@ -52,12 +52,15 @@
bottom: 1px;
right: 0;
left: 0;
- border-bottom: 4px solid transparent;
+ border-bottom: $border-width-tab solid transparent;
}
}
&:focus {
- background-color: transparent;
- @include square-style__focus;
+ box-shadow: inset 0 0 0 $border-width-focus $theme-color;
+ }
+
+ &.is-active:focus {
+ box-shadow: inset 0 0 0 $border-width-focus $theme-color, inset 0 0 -$border-width-tab 0 0 $theme-color;
}
}
diff --git a/packages/edit-post/src/components/sidebar/settings-sidebar/index.js b/packages/edit-post/src/components/sidebar/settings-sidebar/index.js
index df162808e438d5..befb270be4f668 100644
--- a/packages/edit-post/src/components/sidebar/settings-sidebar/index.js
+++ b/packages/edit-post/src/components/sidebar/settings-sidebar/index.js
@@ -1,15 +1,11 @@
/**
* WordPress dependencies
*/
-import { Panel } from '@wordpress/components';
-import { compose, ifCondition } from '@wordpress/compose';
-import { withSelect } from '@wordpress/data';
import { BlockInspector } from '@wordpress/block-editor';
/**
* Internal dependencies
*/
-import Sidebar from '../';
import SettingsHeader from '../settings-header';
import PostStatus from '../post-status';
import LastRevision from '../last-revision';
@@ -21,11 +17,31 @@ import DiscussionPanel from '../discussion-panel';
import PageAttributes from '../page-attributes';
import MetaBoxes from '../../meta-boxes';
import PluginDocumentSettingPanel from '../plugin-document-setting-panel';
+import PluginSidebarEditPost from '../../sidebar/plugin-sidebar';
+import { __ } from '@wordpress/i18n';
+import { useSelect } from '@wordpress/data';
-const SettingsSidebar = ( { sidebarName } ) => (
-
-
-
+const SettingsSidebar = () => {
+ const sidebarName = useSelect(
+ ( select ) =>
+ select( 'core/interface' ).getActiveComplementaryArea(
+ 'core/edit-post'
+ ),
+ []
+ );
+ if (
+ ! [ 'edit-post/document', 'edit-post/block' ].includes( sidebarName )
+ ) {
+ return null;
+ }
+ return (
+ }
+ closeLabel={ __( 'Close settings' ) }
+ headerClassName="edit-post-sidebar__panel-tabs"
+ isPinnable={ false }
+ >
{ sidebarName === 'edit-post/document' && (
<>
@@ -41,20 +57,8 @@ const SettingsSidebar = ( { sidebarName } ) => (
>
) }
{ sidebarName === 'edit-post/block' && }
-
-
-);
+
+ );
+};
-export default compose(
- withSelect( ( select ) => {
- const { getActiveGeneralSidebarName, isEditorSidebarOpened } = select(
- 'core/edit-post'
- );
-
- return {
- isEditorSidebarOpened: isEditorSidebarOpened(),
- sidebarName: getActiveGeneralSidebarName(),
- };
- } ),
- ifCondition( ( { isEditorSidebarOpened } ) => isEditorSidebarOpened )
-)( SettingsSidebar );
+export default SettingsSidebar;
diff --git a/packages/edit-post/src/components/sidebar/sidebar-header/index.js b/packages/edit-post/src/components/sidebar/sidebar-header/index.js
deleted file mode 100644
index 84bd69b07e7048..00000000000000
--- a/packages/edit-post/src/components/sidebar/sidebar-header/index.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * External dependencies
- */
-import classnames from 'classnames';
-
-/**
- * WordPress dependencies
- */
-import { __ } from '@wordpress/i18n';
-import { Button } from '@wordpress/components';
-import { useDispatch, useSelect } from '@wordpress/data';
-import { close } from '@wordpress/icons';
-
-const SidebarHeader = ( { children, className, closeLabel } ) => {
- const { shortcut, title } = useSelect(
- ( select ) => ( {
- shortcut: select(
- 'core/keyboard-shortcuts'
- ).getShortcutRepresentation( 'core/edit-post/toggle-sidebar' ),
- title: select( 'core/editor' ).getEditedPostAttribute( 'title' ),
- } ),
- []
- );
- const { closeGeneralSidebar } = useDispatch( 'core/edit-post' );
-
- return (
- <>
-
-
- { title || __( '(no title)' ) }
-
-
-
-
- { children }
-
-
- >
- );
-};
-
-export default SidebarHeader;
diff --git a/packages/edit-post/src/components/sidebar/style.scss b/packages/edit-post/src/components/sidebar/style.scss
index f960c6757c3033..d3be8c5f30caa5 100644
--- a/packages/edit-post/src/components/sidebar/style.scss
+++ b/packages/edit-post/src/components/sidebar/style.scss
@@ -1,107 +1,3 @@
-.edit-post-sidebar {
- background: $white;
- color: $dark-gray-500;
- overflow: visible;
-
- @include break-small() {
- z-index: auto;
- height: 100%;
- overflow: auto;
- -webkit-overflow-scrolling: touch;
- }
-
- @include break-medium() {
- width: $sidebar-width;
- }
-
- > .components-panel {
- border-left: none;
- border-right: none;
- overflow: auto;
- -webkit-overflow-scrolling: touch;
- height: auto;
- max-height: calc(100vh - #{ $admin-bar-height-big + $panel-header-height + $panel-header-height });
- margin-top: -1px;
- margin-bottom: -1px;
- position: relative;
-
- @include break-small() {
- overflow: visible;
- height: auto;
- max-height: none;
- }
- }
-
- > .components-panel .components-panel__header {
- position: fixed;
- z-index: z-index(".components-panel__header");
- top: 0;
- left: 0;
- right: 0;
- height: $panel-header-height;
-
- @include break-small() {
- position: inherit;
- top: auto;
- left: auto;
- right: auto;
- }
- }
-
- p {
- margin-top: 0;
- }
-
- h2,
- h3 {
- font-size: $default-font-size;
- color: $dark-gray-500;
- margin-bottom: 1.5em;
- }
-
- hr {
- border-top: none;
- border-bottom: 1px solid $light-gray-500;
- margin: 1.5em 0;
- }
-
- div.components-toolbar {
- box-shadow: none;
- margin-bottom: 1.5em;
- &:last-child {
- margin-bottom: 0;
- }
- }
-
- p + div.components-toolbar {
- margin-top: -1em;
- }
-
- .block-editor-skip-to-selected-block:focus {
- top: auto;
- right: 10px;
- bottom: 10px;
- left: auto;
- }
-}
-
-/* Text Editor specific */
-.components-panel__header.edit-post-sidebar__header {
- background: $white;
- padding-right: $panel-padding / 2;
-
- .edit-post-sidebar__title {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- width: 100%;
- }
-
- @include break-medium() {
- display: none;
- }
-}
-
.components-panel__header.edit-post-sidebar__panel-tabs {
justify-content: flex-start;
padding-left: 0;
@@ -118,40 +14,3 @@
}
}
}
-
-.edit-post-sidebar__panel-tab {
- background: transparent;
- border: none;
- border-radius: 0;
- box-shadow: none;
- cursor: pointer;
- height: 50px;
- padding: 3px 15px; // Use padding to offset the is-active border, this benefits Windows High Contrast mode
- margin-left: 0;
- font-weight: 400;
- @include square-style__neutral;
- transition: box-shadow 0.1s linear;
- @include reduce-motion("transition");
-
- &.is-active {
- box-shadow: inset 0 -3px theme(outlines);
- font-weight: 600;
- position: relative;
-
- // This border appears in Windows High Contrast mode instead of the box-shadow.
- &::before {
- content: "";
- position: absolute;
- top: 0;
- bottom: 1px;
- right: 0;
- left: 0;
- border-bottom: 3px solid transparent;
- }
- }
-
- &:focus:not(:disabled) {
- @include square-style__focus;
- box-shadow: none;
- }
-}
diff --git a/packages/edit-post/src/components/text-editor/index.js b/packages/edit-post/src/components/text-editor/index.js
index 4a8b4381990f0d..28293076ef7908 100644
--- a/packages/edit-post/src/components/text-editor/index.js
+++ b/packages/edit-post/src/components/text-editor/index.js
@@ -24,7 +24,7 @@ function TextEditor( { onExit, isRichEditingEnabled } ) {
icon={ close }
shortcut={ displayShortcut.secondary( 'm' ) }
>
- { __( 'Exit Code Editor' ) }
+ { __( 'Exit code editor' ) }
diff --git a/packages/edit-post/src/components/text-editor/style.scss b/packages/edit-post/src/components/text-editor/style.scss
index 4188b0a21f3436..368c843a72f465 100644
--- a/packages/edit-post/src/components/text-editor/style.scss
+++ b/packages/edit-post/src/components/text-editor/style.scss
@@ -5,7 +5,7 @@
flex-grow: 1;
// Always show outlines in code editor
- .editor-post-title__block {
+ .editor-post-title {
textarea {
border: $border-width solid $light-gray-500;
margin-bottom: $block-spacing;
@@ -16,20 +16,8 @@
border: $border-width solid $black;
}
}
- }
-
- .editor-post-permalink {
- margin-top: -6px;
- // Hide the thick left border in the code editor.
- box-shadow: none;
- border: none;
- outline: $border-width solid $dark-gray-primary;
- }
-
- @include break-small() {
- .editor-post-title,
- .editor-post-title__block {
+ @include break-small() {
padding: 0;
}
}
@@ -38,7 +26,7 @@
padding-top: $block-toolbar-height + $grid-unit-10;
}
-// Exit Code Editor toolbar.
+// Exit code editor toolbar.
.edit-post-text-editor__toolbar {
position: absolute;
top: $grid-unit-10;
diff --git a/packages/edit-post/src/components/visual-editor/index.js b/packages/edit-post/src/components/visual-editor/index.js
index b34d8a1375b66c..9929a6699674f3 100644
--- a/packages/edit-post/src/components/visual-editor/index.js
+++ b/packages/edit-post/src/components/visual-editor/index.js
@@ -39,7 +39,9 @@ function VisualEditor() {
-
+
diff --git a/packages/edit-post/src/components/visual-editor/style.native.scss b/packages/edit-post/src/components/visual-editor/style.native.scss
index 77c87b662c0bbe..223cbacd08bd6b 100644
--- a/packages/edit-post/src/components/visual-editor/style.native.scss
+++ b/packages/edit-post/src/components/visual-editor/style.native.scss
@@ -5,8 +5,6 @@
border-right-width: $block-selected-border-width;
border-radius: 4px;
border-style: solid;
- margin-left: $block-selected-margin;
- margin-right: $block-selected-margin;
}
.blockHolderFocused {
diff --git a/packages/edit-post/src/components/visual-editor/style.scss b/packages/edit-post/src/components/visual-editor/style.scss
index b29292d18308af..0093354ef12e00 100644
--- a/packages/edit-post/src/components/visual-editor/style.scss
+++ b/packages/edit-post/src/components/visual-editor/style.scss
@@ -36,46 +36,27 @@
height: 0;
}
-// The base width of blocks
-.edit-post-visual-editor .block-editor-block-list__block {
- margin-left: auto;
- margin-right: auto;
-}
-
+// Ideally this wrapper div is not needed but if we waant to match the positionning of blocks
+// .block-editor-block-list__layout and block-editor-block-list__block
+// We need to have two DOM elements.
+.edit-post-visual-editor__post-title-wrapper {
+ // This padding is needed to match the block root container padding
+ padding-left: $block-padding;
+ padding-right: $block-padding;
-// The base width of the title should match that of blocks even if it isn't a block.
-// @todo: This duplicates CSS from line 49 in block-list/style.scss, and should be
-// removed when the Title field becomes an actual block.
-.editor-post-title {
- // Beyond the mobile breakpoint, compensate for side UI.
@include break-small() {
- padding-left: $block-padding + $block-side-ui-width + $block-padding + $border-width * 2;
- padding-right: $block-padding + $block-side-ui-width + $block-padding + $border-width * 2;
+ padding-left: $block-side-ui-width;
+ padding-right: $block-side-ui-width;
}
-}
-
-.edit-post-visual-editor .editor-post-title__block {
- // Center.
- margin-left: auto;
- margin-right: auto;
- // Apply default block margin below the post title.
- // This ensures the first block on the page is in a good position.
- // This rule can be retired once the title becomes an actual block.
- margin-bottom: ($block-padding * 2) + $block-spacing; // This matches 2em in the vanilla style.
+ .editor-post-title {
+ // Center.
+ margin-left: auto;
+ margin-right: auto;
- // Stack borders.
- > div {
- margin-left: 0;
- margin-right: 0;
- }
-
- // Stretch to mimic outline padding on desktop.
- // Note that we can't target the textarea as it can't be stretched.
- @include break-small() {
- > div {
- margin-left: -$block-padding - $block-side-ui-clearance;
- margin-right: -$block-padding - $block-side-ui-clearance;
- }
+ // Apply default block margin below the post title.
+ // This ensures the first block on the page is in a good position.
+ // This rule can be retired once the title becomes an actual block.
+ margin-bottom: ($block-padding * 2) + $block-spacing; // This matches 2em in the vanilla style.
}
}
diff --git a/packages/edit-post/src/components/welcome-guide/images.js b/packages/edit-post/src/components/welcome-guide/images.js
index e9823943c82b8e..f809e54ce40d7b 100644
--- a/packages/edit-post/src/components/welcome-guide/images.js
+++ b/packages/edit-post/src/components/welcome-guide/images.js
@@ -6,7 +6,7 @@ import { __ } from '@wordpress/i18n';
export const CanvasImage = ( props ) => (
);
@@ -14,7 +14,7 @@ export const CanvasImage = ( props ) => (
export const EditorImage = ( props ) => (
);
@@ -22,7 +22,7 @@ export const EditorImage = ( props ) => (
export const BlockLibraryImage = ( props ) => (
);
@@ -30,7 +30,7 @@ export const BlockLibraryImage = ( props ) => (
export const DocumentationImage = ( props ) => (
);
@@ -38,7 +38,7 @@ export const DocumentationImage = ( props ) => (
export const InserterIconImage = ( props ) => (
);
diff --git a/packages/edit-post/src/components/welcome-guide/index.js b/packages/edit-post/src/components/welcome-guide/index.js
index 7f350e44e3e5d9..ad58758315cb30 100644
--- a/packages/edit-post/src/components/welcome-guide/index.js
+++ b/packages/edit-post/src/components/welcome-guide/index.js
@@ -4,7 +4,7 @@
import { useSelect, useDispatch } from '@wordpress/data';
import { ExternalLink, Guide, GuidePage } from '@wordpress/components';
import { __ } from '@wordpress/i18n';
-import { __experimentalCreateInterpolateElement } from '@wordpress/element';
+import { createInterpolateElement } from '@wordpress/element';
/**
* Internal dependencies
@@ -67,7 +67,7 @@ export default function WelcomeGuide() {
- { __experimentalCreateInterpolateElement(
+ { createInterpolateElement(
__(
'All of the blocks available to you live in the block library. You’ll find it wherever you see the icon.'
),
diff --git a/packages/edit-post/src/index.js b/packages/edit-post/src/index.js
index 086553ee738b61..1d5475c63535f8 100644
--- a/packages/edit-post/src/index.js
+++ b/packages/edit-post/src/index.js
@@ -113,14 +113,14 @@ export function initializeEditor(
// Without this hack the browser scrolls the mobile toolbar off-screen.
// Once supported in Safari we can replace this in favor of preventScroll.
// For details see issue #18632 and PR #18686
- // Specifically, we scroll `block-editor-editor-skeleton__body` to enable a fixed top toolbar.
+ // Specifically, we scroll `interface-interface-skeleton__body` to enable a fixed top toolbar.
// But Mobile Safari forces the `html` element to scroll upwards, hiding the toolbar.
const isIphone = window.navigator.userAgent.indexOf( 'iPhone' ) !== -1;
if ( isIphone ) {
window.addEventListener( 'scroll', function( event ) {
const editorScrollContainer = document.getElementsByClassName(
- 'block-editor-editor-skeleton__body'
+ 'interface-interface-skeleton__body'
)[ 0 ];
if ( event.target === document ) {
// Scroll element into view by scrolling the editor container by the same amount
diff --git a/packages/edit-post/src/plugins/block-patterns/index.js b/packages/edit-post/src/plugins/block-patterns/index.js
deleted file mode 100644
index e9018bbfd3ed91..00000000000000
--- a/packages/edit-post/src/plugins/block-patterns/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * WordPress dependencies
- */
-import { layout } from '@wordpress/icons';
-import { __ } from '@wordpress/i18n';
-import { __experimentalBlockPatterns as BlockPatternsList } from '@wordpress/block-editor';
-import { useSelect } from '@wordpress/data';
-
-/**
- * Internal dependencies
- */
-import PluginSidebar from '../../components/sidebar/plugin-sidebar';
-import PluginSidebarMoreMenuItem from '../../components/header/plugin-sidebar-more-menu-item';
-
-function BlockPatterns() {
- const { __experimentalBlockPatterns: blockPatterns = [] } = useSelect(
- ( select ) => {
- return select( 'core/editor' ).getEditorSettings();
- },
- []
- );
-
- return (
- <>
-
-
-
-
- { __( 'Block Patterns' ) }
-
- >
- );
-}
-
-export default BlockPatterns;
diff --git a/packages/edit-post/src/plugins/index.js b/packages/edit-post/src/plugins/index.js
index 87853d4493481b..cbdc9b2bb7ace7 100644
--- a/packages/edit-post/src/plugins/index.js
+++ b/packages/edit-post/src/plugins/index.js
@@ -14,13 +14,11 @@ import ManageBlocksMenuItem from './manage-blocks-menu-item';
import KeyboardShortcutsHelpMenuItem from './keyboard-shortcuts-help-menu-item';
import ToolsMoreMenuGroup from '../components/header/tools-more-menu-group';
import WelcomeGuideMenuItem from './welcome-guide-menu-item';
-import BlockPatterns from './block-patterns';
registerPlugin( 'edit-post', {
render() {
return (
<>
-
{ ( { onClose } ) => (
<>
@@ -43,7 +41,8 @@ registerPlugin( 'edit-post', {
href={ __(
'https://wordpress.org/support/article/wordpress-editor/'
) }
- target="_new"
+ target="_blank"
+ rel="noopener noreferrer"
>
{ __( 'Help' ) }
diff --git a/packages/edit-post/src/store/actions.js b/packages/edit-post/src/store/actions.js
index eec8afd6b38240..33140b34f7d09d 100644
--- a/packages/edit-post/src/store/actions.js
+++ b/packages/edit-post/src/store/actions.js
@@ -3,29 +3,38 @@
*/
import { castArray } from 'lodash';
+/**
+ * WordPress dependencies
+ */
+import { dispatch } from '@wordpress/data-controls';
+
/**
* Returns an action object used in signalling that the user opened an editor sidebar.
*
- * @param {string} name Sidebar name to be opened.
+ * @param {?string} name Sidebar name to be opened.
*
- * @return {Object} Action object.
+ * @yield {Object} Action object.
*/
-export function openGeneralSidebar( name ) {
- return {
- type: 'OPEN_GENERAL_SIDEBAR',
- name,
- };
+export function* openGeneralSidebar( name ) {
+ yield dispatch(
+ 'core/interface',
+ 'enableComplementaryArea',
+ 'core/edit-post',
+ name
+ );
}
/**
* Returns an action object signalling that the user closed the sidebar.
*
- * @return {Object} Action object.
+ * @yield {Object} Action object.
*/
-export function closeGeneralSidebar() {
- return {
- type: 'CLOSE_GENERAL_SIDEBAR',
- };
+export function* closeGeneralSidebar() {
+ yield dispatch(
+ 'core/interface',
+ 'disableComplementaryArea',
+ 'core/edit-post'
+ );
}
/**
diff --git a/packages/edit-post/src/store/defaults.js b/packages/edit-post/src/store/defaults.js
index 1b90986e222a9a..64435c05ce74c1 100644
--- a/packages/edit-post/src/store/defaults.js
+++ b/packages/edit-post/src/store/defaults.js
@@ -1,6 +1,5 @@
export const PREFERENCES_DEFAULTS = {
editorMode: 'visual',
- isGeneralSidebarDismissed: false,
panels: {
'post-status': {
opened: true,
@@ -11,7 +10,6 @@ export const PREFERENCES_DEFAULTS = {
welcomeGuide: true,
fullscreenMode: true,
},
- pinnedPluginItems: {},
hiddenBlockTypes: [],
preferredStyleVariations: {},
localAutosaveInterval: 15,
diff --git a/packages/edit-post/src/store/defaults.native.js b/packages/edit-post/src/store/defaults.native.js
deleted file mode 100644
index 7ac420b872cadc..00000000000000
--- a/packages/edit-post/src/store/defaults.native.js
+++ /dev/null
@@ -1,14 +0,0 @@
-export const PREFERENCES_DEFAULTS = {
- editorMode: 'visual',
- isGeneralSidebarDismissed: true,
- panels: {
- 'post-status': {
- opened: true,
- },
- },
- features: {
- fixedToolbar: true,
- },
- pinnedPluginItems: {},
- hiddenBlockTypes: [],
-};
diff --git a/packages/edit-post/src/store/index.js b/packages/edit-post/src/store/index.js
index 4560fd12d46bbb..de84aaf3062ab0 100644
--- a/packages/edit-post/src/store/index.js
+++ b/packages/edit-post/src/store/index.js
@@ -2,6 +2,7 @@
* WordPress dependencies
*/
import { registerStore } from '@wordpress/data';
+import { controls as dataControls } from '@wordpress/data-controls';
/**
* Internal dependencies
@@ -17,7 +18,10 @@ const store = registerStore( STORE_KEY, {
reducer,
actions,
selectors,
- controls,
+ controls: {
+ ...dataControls,
+ ...controls,
+ },
persist: [ 'preferences' ],
} );
diff --git a/packages/edit-post/src/store/reducer.js b/packages/edit-post/src/store/reducer.js
index 27e5c29493976a..6f77bb46e0937b 100644
--- a/packages/edit-post/src/store/reducer.js
+++ b/packages/edit-post/src/store/reducer.js
@@ -13,13 +13,6 @@ import { combineReducers } from '@wordpress/data';
*/
import { PREFERENCES_DEFAULTS } from './defaults';
-/**
- * The default active general sidebar: The "Document" tab.
- *
- * @type {string}
- */
-export const DEFAULT_ACTIVE_GENERAL_SIDEBAR = 'edit-post/document';
-
/**
* Higher-order reducer creator which provides the given initial state for the
* original reducer.
@@ -55,15 +48,6 @@ export const preferences = flow( [
combineReducers,
createWithInitialState( PREFERENCES_DEFAULTS ),
] )( {
- isGeneralSidebarDismissed( state, action ) {
- switch ( action.type ) {
- case 'OPEN_GENERAL_SIDEBAR':
- case 'CLOSE_GENERAL_SIDEBAR':
- return action.type === 'CLOSE_GENERAL_SIDEBAR';
- }
-
- return state;
- },
panels( state, action ) {
switch ( action.type ) {
case 'TOGGLE_PANEL_ENABLED': {
@@ -111,19 +95,6 @@ export const preferences = flow( [
return state;
},
- pinnedPluginItems( state, action ) {
- if ( action.type === 'TOGGLE_PINNED_PLUGIN_ITEM' ) {
- return {
- ...state,
- [ action.pluginName ]: ! get(
- state,
- [ action.pluginName ],
- true
- ),
- };
- }
- return state;
- },
hiddenBlockTypes( state, action ) {
switch ( action.type ) {
case 'SHOW_BLOCK_TYPES':
@@ -181,27 +152,6 @@ export function removedPanels( state = [], action ) {
return state;
}
-/**
- * Reducer returning the next active general sidebar state. The active general
- * sidebar is a unique name to identify either an editor or plugin sidebar.
- *
- * @param {?string} state Current state.
- * @param {Object} action Action object.
- *
- * @return {?string} Updated state.
- */
-export function activeGeneralSidebar(
- state = DEFAULT_ACTIVE_GENERAL_SIDEBAR,
- action
-) {
- switch ( action.type ) {
- case 'OPEN_GENERAL_SIDEBAR':
- return action.name;
- }
-
- return state;
-}
-
/**
* Reducer for storing the name of the open modal, or null if no modal is open.
*
@@ -294,7 +244,6 @@ const metaBoxes = combineReducers( {
} );
export default combineReducers( {
- activeGeneralSidebar,
activeModal,
metaBoxes,
preferences,
diff --git a/packages/edit-post/src/store/selectors.js b/packages/edit-post/src/store/selectors.js
index d2742fb3fe181c..fd99d43279462c 100644
--- a/packages/edit-post/src/store/selectors.js
+++ b/packages/edit-post/src/store/selectors.js
@@ -4,6 +4,11 @@
import createSelector from 'rememo';
import { get, includes, some, flatten, values } from 'lodash';
+/**
+ * WordPress dependencies
+ */
+import { createRegistrySelector } from '@wordpress/data';
+
/**
* Returns the current editing mode.
*
@@ -22,14 +27,17 @@ export function getEditorMode( state ) {
*
* @return {boolean} Whether the editor sidebar is opened.
*/
-export function isEditorSidebarOpened( state ) {
- const activeGeneralSidebar = getActiveGeneralSidebarName( state );
-
- return includes(
- [ 'edit-post/document', 'edit-post/block' ],
- activeGeneralSidebar
- );
-}
+export const isEditorSidebarOpened = createRegistrySelector(
+ ( select ) => () => {
+ const activeGeneralSidebar = select(
+ 'core/interface'
+ ).getActiveComplementaryArea( 'core/edit-post' );
+ return includes(
+ [ 'edit-post/document', 'edit-post/block' ],
+ activeGeneralSidebar
+ );
+ }
+);
/**
* Returns true if the plugin sidebar is opened.
@@ -37,10 +45,20 @@ export function isEditorSidebarOpened( state ) {
* @param {Object} state Global application state
* @return {boolean} Whether the plugin sidebar is opened.
*/
-export function isPluginSidebarOpened( state ) {
- const activeGeneralSidebar = getActiveGeneralSidebarName( state );
- return !! activeGeneralSidebar && ! isEditorSidebarOpened( state );
-}
+export const isPluginSidebarOpened = createRegistrySelector(
+ ( select ) => () => {
+ const activeGeneralSidebar = select(
+ 'core/interface'
+ ).getActiveComplementaryArea( 'core/edit-post' );
+ return (
+ !! activeGeneralSidebar &&
+ ! includes(
+ [ 'edit-post/document', 'edit-post/block' ],
+ activeGeneralSidebar
+ )
+ );
+ }
+);
/**
* Returns the current active general sidebar name, or null if there is no
@@ -56,19 +74,13 @@ export function isPluginSidebarOpened( state ) {
*
* @return {?string} Active general sidebar name.
*/
-export function getActiveGeneralSidebarName( state ) {
- // Dismissal takes precedent.
- const isDismissed = getPreference(
- state,
- 'isGeneralSidebarDismissed',
- false
- );
- if ( isDismissed ) {
- return null;
+export const getActiveGeneralSidebarName = createRegistrySelector(
+ ( select ) => () => {
+ return select( 'core/interface' ).getActiveComplementaryArea(
+ 'core/edit-post'
+ );
}
-
- return state.activeGeneralSidebar;
-}
+);
/**
* Returns the preferences (these preferences are persisted locally).
@@ -187,11 +199,14 @@ export function isFeatureActive( state, feature ) {
*
* @return {boolean} Whether the plugin item is pinned.
*/
-export function isPluginItemPinned( state, pluginName ) {
- const pinnedPluginItems = getPreference( state, 'pinnedPluginItems', {} );
-
- return get( pinnedPluginItems, [ pluginName ], true );
-}
+export const isPluginItemPinned = createRegistrySelector(
+ ( select ) => ( pluginName ) => {
+ return select( 'core/interface' ).isItemPinned(
+ 'core/edit-post',
+ pluginName
+ );
+ }
+);
/**
* Returns an array of active meta box locations.
diff --git a/packages/edit-post/src/store/test/actions.js b/packages/edit-post/src/store/test/actions.js
index 07dc4b81ece682..31877f378bb286 100644
--- a/packages/edit-post/src/store/test/actions.js
+++ b/packages/edit-post/src/store/test/actions.js
@@ -5,37 +5,16 @@ import {
toggleEditorPanelEnabled,
toggleEditorPanelOpened,
removeEditorPanel,
- openGeneralSidebar,
- closeGeneralSidebar,
openPublishSidebar,
closePublishSidebar,
togglePublishSidebar,
openModal,
closeModal,
toggleFeature,
- togglePinnedPluginItem,
requestMetaBoxUpdates,
} from '../actions';
describe( 'actions', () => {
- describe( 'openGeneralSidebar', () => {
- it( 'should return OPEN_GENERAL_SIDEBAR action', () => {
- const name = 'plugin/my-name';
- expect( openGeneralSidebar( name ) ).toEqual( {
- type: 'OPEN_GENERAL_SIDEBAR',
- name,
- } );
- } );
- } );
-
- describe( 'closeGeneralSidebar', () => {
- it( 'should return CLOSE_GENERAL_SIDEBAR action', () => {
- expect( closeGeneralSidebar() ).toEqual( {
- type: 'CLOSE_GENERAL_SIDEBAR',
- } );
- } );
- } );
-
describe( 'openPublishSidebar', () => {
it( 'should return an OPEN_PUBLISH_SIDEBAR action', () => {
expect( openPublishSidebar() ).toEqual( {
@@ -115,17 +94,6 @@ describe( 'actions', () => {
} );
} );
- describe( 'togglePinnedPluginItem', () => {
- it( 'should return TOGGLE_PINNED_PLUGIN_ITEM action', () => {
- const pluginName = 'foo/bar';
-
- expect( togglePinnedPluginItem( pluginName ) ).toEqual( {
- type: 'TOGGLE_PINNED_PLUGIN_ITEM',
- pluginName,
- } );
- } );
- } );
-
describe( 'requestMetaBoxUpdates', () => {
it( 'should return the REQUEST_META_BOX_UPDATES action', () => {
expect( requestMetaBoxUpdates() ).toEqual( {
diff --git a/packages/edit-post/src/store/test/reducer.js b/packages/edit-post/src/store/test/reducer.js
index b21be5ff26d9ba..59a966024bf920 100644
--- a/packages/edit-post/src/store/test/reducer.js
+++ b/packages/edit-post/src/store/test/reducer.js
@@ -7,9 +7,7 @@ import deepFreeze from 'deep-freeze';
* Internal dependencies
*/
import {
- DEFAULT_ACTIVE_GENERAL_SIDEBAR,
preferences,
- activeGeneralSidebar,
activeModal,
isSavingMetaBoxes,
metaBoxLocations,
@@ -25,30 +23,6 @@ describe( 'state', () => {
expect( state ).toEqual( PREFERENCES_DEFAULTS );
} );
- it( 'should set the general sidebar dismissed', () => {
- const original = deepFreeze( preferences( undefined, {} ) );
- const state = preferences( original, {
- type: 'OPEN_GENERAL_SIDEBAR',
- name: 'edit-post/document',
- } );
-
- expect( state.isGeneralSidebarDismissed ).toBe( false );
- } );
-
- it( 'should set the general sidebar undismissed', () => {
- const original = deepFreeze(
- preferences( undefined, {
- type: 'OPEN_GENERAL_SIDEBAR',
- name: 'edit-post/document',
- } )
- );
- const state = preferences( original, {
- type: 'CLOSE_GENERAL_SIDEBAR',
- } );
-
- expect( state.isGeneralSidebarDismissed ).toBe( true );
- } );
-
it( 'should disable panels by default', () => {
const original = deepFreeze( {
panels: {},
@@ -186,48 +160,6 @@ describe( 'state', () => {
expect( state.features ).toEqual( { chicken: false } );
} );
- describe( 'pinnedPluginItems', () => {
- const initialState = deepFreeze( {
- pinnedPluginItems: {
- 'foo/enabled': true,
- 'foo/disabled': false,
- },
- } );
-
- it( 'should disable a pinned plugin flag when the value does not exist', () => {
- const state = preferences( initialState, {
- type: 'TOGGLE_PINNED_PLUGIN_ITEM',
- pluginName: 'foo/does-not-exist',
- } );
-
- expect( state.pinnedPluginItems[ 'foo/does-not-exist' ] ).toBe(
- false
- );
- } );
-
- it( 'should disable a pinned plugin flag when it is enabled', () => {
- const state = preferences( initialState, {
- type: 'TOGGLE_PINNED_PLUGIN_ITEM',
- pluginName: 'foo/enabled',
- } );
-
- expect( state.pinnedPluginItems[ 'foo/enabled' ] ).toBe(
- false
- );
- } );
-
- it( 'should enable a pinned plugin flag when it is disabled', () => {
- const state = preferences( initialState, {
- type: 'TOGGLE_PINNED_PLUGIN_ITEM',
- pluginName: 'foo/disabled',
- } );
-
- expect( state.pinnedPluginItems[ 'foo/disabled' ] ).toBe(
- true
- );
- } );
- } );
-
describe( 'hiddenBlockTypes', () => {
it( 'concatenates unique names on disable', () => {
const original = deepFreeze( {
@@ -257,24 +189,6 @@ describe( 'state', () => {
} );
} );
- describe( 'activeGeneralSidebar', () => {
- it( 'should default to the default active sidebar', () => {
- const state = activeGeneralSidebar( undefined, {} );
-
- expect( state ).toBe( DEFAULT_ACTIVE_GENERAL_SIDEBAR );
- } );
-
- it( 'should set the general sidebar', () => {
- const original = activeGeneralSidebar( undefined, {} );
- const state = activeGeneralSidebar( original, {
- type: 'OPEN_GENERAL_SIDEBAR',
- name: 'edit-post/document',
- } );
-
- expect( state ).toBe( 'edit-post/document' );
- } );
- } );
-
describe( 'activeModal', () => {
it( 'should default to null', () => {
const state = activeModal( undefined, {} );
diff --git a/packages/edit-post/src/store/test/selectors.js b/packages/edit-post/src/store/test/selectors.js
index 4da4686fc0379e..f2b349890602ae 100644
--- a/packages/edit-post/src/store/test/selectors.js
+++ b/packages/edit-post/src/store/test/selectors.js
@@ -9,13 +9,9 @@ import deepFreeze from 'deep-freeze';
import {
getEditorMode,
getPreference,
- isEditorSidebarOpened,
isEditorPanelOpened,
isModalActive,
isFeatureActive,
- isPluginSidebarOpened,
- getActiveGeneralSidebarName,
- isPluginItemPinned,
hasMetaBoxes,
isSavingMetaBoxes,
getActiveMetaBoxLocations,
@@ -71,114 +67,6 @@ describe( 'selectors', () => {
} );
} );
- describe( 'isEditorSidebarOpened', () => {
- it( 'should return false when the editor sidebar is not opened', () => {
- const state = {
- preferences: {
- isGeneralSidebarDismissed: true,
- },
- activeGeneralSidebar: null,
- };
-
- expect( isEditorSidebarOpened( state ) ).toBe( false );
- } );
-
- it( 'should return false when the editor sidebar is assigned but not opened', () => {
- const state = {
- preferences: {
- isGeneralSidebarDismissed: true,
- },
- activeGeneralSidebar: 'edit-post/document',
- };
-
- expect( isEditorSidebarOpened( state ) ).toBe( false );
- } );
-
- it( 'should return false when the plugin sidebar is opened', () => {
- const state = {
- preferences: {
- isGeneralSidebarDismissed: false,
- },
- activeGeneralSidebar: 'my-plugin/my-sidebar',
- };
-
- expect( isEditorSidebarOpened( state ) ).toBe( false );
- } );
-
- it( 'should return true when the editor sidebar is opened', () => {
- const state = {
- preferences: {
- isGeneralSidebarDismissed: false,
- },
- activeGeneralSidebar: 'edit-post/document',
- };
-
- expect( isEditorSidebarOpened( state ) ).toBe( true );
- } );
- } );
-
- describe( 'isPluginSidebarOpened', () => {
- it( 'should return false when the plugin sidebar is not opened', () => {
- const state = {
- preferences: {
- isGeneralSidebarDismissed: true,
- },
- activeGeneralSidebar: null,
- };
-
- expect( isPluginSidebarOpened( state ) ).toBe( false );
- } );
-
- it( 'should return false when the editor sidebar is opened', () => {
- const state = {
- preferences: {
- isGeneralSidebarDismissed: false,
- },
- activeGeneralSidebar: 'edit-post/document',
- };
-
- expect( isPluginSidebarOpened( state ) ).toBe( false );
- } );
-
- it( 'should return true when the plugin sidebar is opened', () => {
- const name = 'plugin-sidebar/my-plugin/my-sidebar';
- const state = {
- preferences: {
- isGeneralSidebarDismissed: false,
- },
- activeGeneralSidebar: name,
- };
-
- expect( isPluginSidebarOpened( state ) ).toBe( true );
- } );
- } );
-
- describe( 'getActiveGeneralSidebarName', () => {
- it( 'returns null if dismissed', () => {
- const state = {
- preferences: {
- isGeneralSidebarDismissed: true,
- },
- activeGeneralSidebar: 'edit-post/block',
- };
-
- expect( getActiveGeneralSidebarName( state ) ).toBe( null );
- } );
-
- it( 'returns active general sidebar', () => {
- const state = {
- preferences: {
- isGeneralSidebarDismissed: false,
- },
- activeGeneralSidebar: 'edit-post/block',
- };
-
- expect( getActiveGeneralSidebarName( state ) ).toBe(
- 'edit-post/block'
- );
- } );
- } );
-
describe( 'isModalActive', () => {
it( 'returns true if the provided name matches the value in the preferences activeModal property', () => {
const state = {
@@ -394,29 +282,6 @@ describe( 'selectors', () => {
} );
} );
- describe( 'isPluginItemPinned', () => {
- const state = {
- preferences: {
- pinnedPluginItems: {
- 'foo/pinned': true,
- 'foo/unpinned': false,
- },
- },
- };
-
- it( 'should return true if the flag is not set for the plugin item', () => {
- expect( isPluginItemPinned( state, 'foo/unknown' ) ).toBe( true );
- } );
-
- it( 'should return true if plugin item is not pinned', () => {
- expect( isPluginItemPinned( state, 'foo/pinned' ) ).toBe( true );
- } );
-
- it( 'should return false if plugin item item is unpinned', () => {
- expect( isPluginItemPinned( state, 'foo/unpinned' ) ).toBe( false );
- } );
- } );
-
describe( 'hasMetaBoxes', () => {
it( 'should return true if there are active meta boxes', () => {
const state = {
diff --git a/packages/edit-post/src/style.scss b/packages/edit-post/src/style.scss
index 651619f60da066..4e6fea9f88bee4 100644
--- a/packages/edit-post/src/style.scss
+++ b/packages/edit-post/src/style.scss
@@ -1,11 +1,11 @@
$footer-height: $button-size-small;
-@import "./components/fullscreen-mode/style.scss";
+@import "../../interface/src/style.scss";
+
@import "./components/header/style.scss";
@import "./components/header/fullscreen-mode-close/style.scss";
@import "./components/header/header-toolbar/style.scss";
@import "./components/header/more-menu/style.scss";
-@import "./components/header/pinned-plugins/style.scss";
@import "./components/keyboard-shortcut-help-modal/style.scss";
@import "./components/layout/style.scss";
@import "./components/manage-blocks-modal/style.scss";
@@ -20,7 +20,6 @@ $footer-height: $button-size-small;
@import "./components/sidebar/post-status/style.scss";
@import "./components/sidebar/post-visibility/style.scss";
@import "./components/sidebar/settings-header/style.scss";
-@import "./components/sidebar/sidebar-header/style.scss";
@import "./components/text-editor/style.scss";
@import "./components/visual-editor/style.scss";
@import "./components/options-modal/style.scss";
diff --git a/packages/edit-site/package.json b/packages/edit-site/package.json
index ead9fd11e0c64e..bc80f6a174cd24 100644
--- a/packages/edit-site/package.json
+++ b/packages/edit-site/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/edit-site",
- "version": "1.3.2",
+ "version": "1.5.1",
"description": "Edit Site Page module for WordPress.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -20,7 +20,7 @@
"module": "build-module/index.js",
"react-native": "src/index",
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/block-editor": "file:../block-editor",
"@wordpress/block-library": "file:../block-library",
"@wordpress/blocks": "file:../blocks",
@@ -32,8 +32,12 @@
"@wordpress/element": "file:../element",
"@wordpress/hooks": "file:../hooks",
"@wordpress/i18n": "file:../i18n",
+ "@wordpress/icons": "file:../icons",
+ "@wordpress/interface": "file:../interface",
"@wordpress/media-utils": "file:../media-utils",
"@wordpress/notices": "file:../notices",
+ "@wordpress/plugins": "file:../plugins",
+ "@wordpress/primitives": "file:../primitives",
"@wordpress/url": "file:../url",
"file-saver": "^2.0.2",
"jszip": "^3.2.2",
diff --git a/packages/edit-site/src/components/block-editor/style.scss b/packages/edit-site/src/components/block-editor/style.scss
index c0e285bc77546d..a1872f964f952d 100644
--- a/packages/edit-site/src/components/block-editor/style.scss
+++ b/packages/edit-site/src/components/block-editor/style.scss
@@ -1,4 +1,14 @@
.edit-site-block-editor__block-list {
padding-bottom: $grid-unit-30;
padding-top: $grid-unit-30 + 5;
+
+ padding-left: $block-padding;
+ padding-right: $block-padding;
+
+ // Full-wide. (to account for the padddings added above)
+ .block-editor-block-list__block[data-align="full"],
+ .block-editor-block-list__block.alignfull {
+ margin-left: -$block-padding;
+ margin-right: -$block-padding;
+ }
}
diff --git a/packages/edit-site/src/components/editor/index.js b/packages/edit-site/src/components/editor/index.js
index 7db674bbe71757..66640b22f41e6f 100644
--- a/packages/edit-site/src/components/editor/index.js
+++ b/packages/edit-site/src/components/editor/index.js
@@ -15,8 +15,12 @@ import {
FocusReturnProvider,
} from '@wordpress/components';
import { EntityProvider } from '@wordpress/core-data';
-import { __experimentalEditorSkeleton as EditorSkeleton } from '@wordpress/block-editor';
+import {
+ BlockBreadcrumb,
+ __unstableEditorStyles as EditorStyles,
+} from '@wordpress/block-editor';
import { useViewportMatch } from '@wordpress/compose';
+import { FullscreenMode, InterfaceSkeleton } from '@wordpress/interface';
/**
* Internal dependencies
@@ -47,35 +51,49 @@ function Editor( { settings: _settings } ) {
settings,
setSettings,
] );
+
+ const { isFullscreenActive } = useSelect( ( select ) => {
+ return {
+ isFullscreenActive: select( 'core/edit-site' ).isFeatureActive(
+ 'fullscreenMode'
+ ),
+ };
+ }, [] );
+
return template ? (
-
-
-
-
-
-
- }
- header={ }
- content={
- <>
-
-
-
- >
- }
- />
-
-
-
+ <>
+
+
+
+
+
+
+
+
+ }
+ header={ }
+ content={
+ <>
+
+
+
+ >
+ }
+ footer={ }
+ />
+
+
+
+
-
-
-
+
+
+ >
) : null;
}
export default Editor;
diff --git a/packages/edit-site/src/components/header/feature-toggle/index.js b/packages/edit-site/src/components/header/feature-toggle/index.js
new file mode 100644
index 00000000000000..dec13c805690bf
--- /dev/null
+++ b/packages/edit-site/src/components/header/feature-toggle/index.js
@@ -0,0 +1,52 @@
+/**
+ * External dependencies
+ */
+import { flow } from 'lodash';
+
+/**
+ * WordPress dependencies
+ */
+import { useSelect, useDispatch } from '@wordpress/data';
+import { MenuItem, withSpokenMessages } from '@wordpress/components';
+import { __ } from '@wordpress/i18n';
+import { check } from '@wordpress/icons';
+
+function FeatureToggle( {
+ feature,
+ label,
+ info,
+ messageActivated,
+ messageDeactivated,
+ speak,
+} ) {
+ const speakMessage = () => {
+ if ( isActive ) {
+ speak( messageDeactivated || __( 'Feature deactivated' ) );
+ } else {
+ speak( messageActivated || __( 'Feature activated' ) );
+ }
+ };
+
+ const isActive = useSelect( ( select ) => {
+ return select( 'core/edit-site' ).isFeatureActive( feature );
+ }, [] );
+
+ const { toggleFeature } = useDispatch( 'core/edit-site' );
+
+ return (
+
+ { label }
+
+ );
+}
+
+export default withSpokenMessages( FeatureToggle );
diff --git a/packages/edit-site/src/components/header/fullscreen-mode-close/index.js b/packages/edit-site/src/components/header/fullscreen-mode-close/index.js
new file mode 100644
index 00000000000000..e5a14f30af66b0
--- /dev/null
+++ b/packages/edit-site/src/components/header/fullscreen-mode-close/index.js
@@ -0,0 +1,35 @@
+/**
+ * WordPress dependencies
+ */
+import { useSelect } from '@wordpress/data';
+import { Button } from '@wordpress/components';
+import { Path, SVG } from '@wordpress/primitives';
+import { __ } from '@wordpress/i18n';
+
+const wordPressLogo = (
+
+
+
+);
+
+function FullscreenModeClose() {
+ const isActive = useSelect( ( select ) => {
+ return select( 'core/edit-site' ).isFeatureActive( 'fullscreenMode' );
+ }, [] );
+
+ if ( ! isActive ) {
+ return null;
+ }
+
+ return (
+
+ );
+}
+
+export default FullscreenModeClose;
diff --git a/packages/edit-site/src/components/header/fullscreen-mode-close/style.scss b/packages/edit-site/src/components/header/fullscreen-mode-close/style.scss
new file mode 100644
index 00000000000000..e8b4eb7b781ccd
--- /dev/null
+++ b/packages/edit-site/src/components/header/fullscreen-mode-close/style.scss
@@ -0,0 +1,29 @@
+.edit-site-fullscreen-mode-close.has-icon {
+ // Do not show the toolbar icon on small screens,
+ // when Fullscreen Mode is not an option in the "More" menu.
+ display: none;
+
+ @include break-medium() {
+ display: flex;
+ align-items: center;
+ align-self: stretch;
+ border: none;
+ background: #23282e; // WP-admin gray.
+ color: $white;
+ border-radius: 0;
+ height: auto;
+ width: $header-height;
+
+ &:hover {
+ background: #32373d; // WP-admin light-gray.
+ }
+
+ &:active {
+ color: $white;
+ }
+
+ &:focus {
+ box-shadow: inset 0 0 0 $border-width-focus $theme-color, inset 0 0 0 3px $white;
+ }
+ }
+}
diff --git a/packages/edit-site/src/components/header/index.js b/packages/edit-site/src/components/header/index.js
index 78c7090d732015..867dc74ed1d15e 100644
--- a/packages/edit-site/src/components/header/index.js
+++ b/packages/edit-site/src/components/header/index.js
@@ -2,15 +2,24 @@
* WordPress dependencies
*/
import { useCallback } from '@wordpress/element';
-import { BlockNavigationDropdown, ToolSelector } from '@wordpress/block-editor';
+import {
+ BlockNavigationDropdown,
+ ToolSelector,
+ Inserter,
+} from '@wordpress/block-editor';
+import { PinnedItems } from '@wordpress/interface';
/**
* Internal dependencies
*/
import { useEditorContext } from '../editor';
+import FullscreenModeClose from './fullscreen-mode-close';
+import MoreMenu from './more-menu';
import TemplateSwitcher from '../template-switcher';
import SaveButton from '../save-button';
+const inserterToggleProps = { isPrimary: true };
+
export default function Header() {
const { settings, setSettings } = useEditorContext();
const setActiveTemplateId = useCallback(
@@ -42,7 +51,13 @@ export default function Header() {
);
return (
+
);
diff --git a/packages/edit-site/src/components/header/more-menu/index.js b/packages/edit-site/src/components/header/more-menu/index.js
new file mode 100644
index 00000000000000..c762ffa60d8946
--- /dev/null
+++ b/packages/edit-site/src/components/header/more-menu/index.js
@@ -0,0 +1,43 @@
+/**
+ * WordPress dependencies
+ */
+import { __, _x } from '@wordpress/i18n';
+import { DropdownMenu, MenuGroup } from '@wordpress/components';
+
+/**
+ * Internal dependencies
+ */
+import FeatureToggle from '../feature-toggle';
+import { moreVertical } from '@wordpress/icons';
+
+const POPOVER_PROPS = {
+ className: 'edit-site-more-menu__content',
+ position: 'bottom left',
+};
+const TOGGLE_PROPS = {
+ tooltipPosition: 'bottom',
+};
+
+const MoreMenu = () => (
+
+ { () => (
+
+
+
+ ) }
+
+);
+
+export default MoreMenu;
diff --git a/packages/edit-site/src/components/header/more-menu/style.scss b/packages/edit-site/src/components/header/more-menu/style.scss
new file mode 100644
index 00000000000000..6151efb026a189
--- /dev/null
+++ b/packages/edit-site/src/components/header/more-menu/style.scss
@@ -0,0 +1,29 @@
+.edit-site-more-menu {
+ margin-left: -4px;
+
+ // the padding and margin of the more menu is intentionally non-standard
+ .components-button {
+ width: auto;
+ padding: 0 2px;
+ }
+
+ @include break-small() {
+ margin-left: 4px;
+
+ .components-button {
+ padding: 0 4px;
+ }
+ }
+}
+
+.edit-site-more-menu__content .components-popover__content {
+ min-width: 260px;
+
+ .components-dropdown-menu__menu {
+ padding: 0;
+ }
+}
+
+.components-popover.edit-site-more-menu__content {
+ z-index: z-index(".components-popover.edit-site-more-menu__content");
+}
diff --git a/packages/edit-site/src/components/header/style.scss b/packages/edit-site/src/components/header/style.scss
index 43b1422aa1251c..80c91d2880b8ec 100644
--- a/packages/edit-site/src/components/header/style.scss
+++ b/packages/edit-site/src/components/header/style.scss
@@ -3,18 +3,22 @@
display: flex;
height: $header-height;
justify-content: space-between;
- padding: $grid-unit-10;
box-sizing: border-box;
}
-.edit-site-header__toolbar,
-.edit-site-header__actions {
+.edit-site-header__toolbar {
display: flex;
+ flex-grow: 1;
+ padding-left: $grid-unit-10;
& > * {
margin-left: 5px;
}
}
+.edit-site-header__actions {
+ display: flex;
+ margin-right: 8px;
+}
.edit-site-header__actions-more-menu {
margin-left: -4px;
diff --git a/packages/edit-site/src/components/save-button/index.js b/packages/edit-site/src/components/save-button/index.js
index 410f8d5970d399..28af9be05d723b 100644
--- a/packages/edit-site/src/components/save-button/index.js
+++ b/packages/edit-site/src/components/save-button/index.js
@@ -53,12 +53,13 @@ export default function SaveButton() {
const disabled = ! isDirty || isSaving;
const [ isOpen, setIsOpen ] = useState( false );
- const open = useCallback( setIsOpen.bind( null, true ), [] );
- const close = useCallback( setIsOpen.bind( null, false ), [] );
+ const open = useCallback( () => setIsOpen( true ), [] );
+ const close = useCallback( () => setIsOpen( false ), [] );
return (
<>
-
+ <>
+
+
-
-
+
+
+ Global Styles area
+
+ >
);
}
diff --git a/packages/edit-site/src/components/template-switcher/index.js b/packages/edit-site/src/components/template-switcher/index.js
index ea8947360c6710..d9e59a243bec90 100644
--- a/packages/edit-site/src/components/template-switcher/index.js
+++ b/packages/edit-site/src/components/template-switcher/index.js
@@ -6,33 +6,29 @@ import { useSelect } from '@wordpress/data';
import { useState, useCallback } from '@wordpress/element';
import {
Tooltip,
- Icon,
DropdownMenu,
MenuGroup,
MenuItemsChoice,
MenuItem,
} from '@wordpress/components';
+import { plus } from '@wordpress/icons';
/**
* Internal dependencies
*/
import AddTemplate from '../add-template';
+import TemplatePreview from './preview';
function TemplateLabel( { template } ) {
return (
-
+ <>
{ template.slug }{ ' ' }
{ template.status !== 'auto-draft' && (
-
-
-
+
) }
-
+ >
);
}
@@ -45,10 +41,18 @@ export default function TemplateSwitcher( {
onActiveTemplatePartIdChange,
onAddTemplateId,
} ) {
- const { templates, templateParts } = useSelect(
+ const [ hoveredTemplate, setHoveredTemplate ] = useState();
+ const onHoverTemplate = ( id ) => {
+ setHoveredTemplate( { id, type: 'template' } );
+ };
+ const onHoverTemplatePart = ( id ) => {
+ setHoveredTemplate( { id, type: 'template-part' } );
+ };
+ const { currentTheme, templates, templateParts } = useSelect(
( select ) => {
- const { getEntityRecord } = select( 'core' );
+ const { getCurrentTheme, getEntityRecord } = select( 'core' );
return {
+ currentTheme: getCurrentTheme(),
templates: ids.map( ( id ) => {
const template = getEntityRecord(
'postType',
@@ -59,10 +63,10 @@ export default function TemplateSwitcher( {
label: template ? (
) : (
- __( 'loading…' )
+ __( 'Loading…' )
),
value: id,
- slug: template ? template.slug : __( 'loading…' ),
+ slug: template ? template.slug : __( 'Loading…' ),
};
} ),
templateParts: templatePartIds.map( ( id ) => {
@@ -75,10 +79,10 @@ export default function TemplateSwitcher( {
label: template ? (
) : (
- __( 'loading…' )
+ __( 'Loading…' )
),
value: id,
- slug: template ? template.slug : __( 'loading…' ),
+ slug: template ? template.slug : __( 'Loading…' ),
};
} ),
};
@@ -89,7 +93,11 @@ export default function TemplateSwitcher( {
return (
<>
{
onClose();
setIsAddTemplateOpen( true );
@@ -123,8 +132,16 @@ export default function TemplateSwitcher( {
choices={ templateParts }
value={ isTemplatePart ? activeId : undefined }
onSelect={ onActiveTemplatePartIdChange }
+ onHover={ onHoverTemplatePart }
/>
+
+ { currentTheme.name }
+
+ { !! hoveredTemplate?.id && (
+
+ ) }
+
>
) }
diff --git a/packages/edit-site/src/components/template-switcher/preview.js b/packages/edit-site/src/components/template-switcher/preview.js
new file mode 100644
index 00000000000000..b1761f7b502b81
--- /dev/null
+++ b/packages/edit-site/src/components/template-switcher/preview.js
@@ -0,0 +1,33 @@
+/**
+ * WordPress dependencies
+ */
+import { parse } from '@wordpress/blocks';
+import { useSelect } from '@wordpress/data';
+import { BlockPreview } from '@wordpress/block-editor';
+import { useMemo } from '@wordpress/element';
+
+function TemplatePreview( { item } ) {
+ const template = useSelect(
+ ( select ) => {
+ return select( 'core' ).getEntityRecord(
+ 'postType',
+ item.type === 'template' ? 'wp_template' : 'wp_template_part',
+ item.id
+ );
+ },
+ [ item ]
+ );
+ const blocks = useMemo(
+ () => ( template ? parse( template?.content?.raw || '' ) : [] ),
+ [ template ]
+ );
+ return (
+
+ { !! blocks && (
+
+ ) }
+
+ );
+}
+
+export default TemplatePreview;
diff --git a/packages/edit-site/src/components/template-switcher/style.scss b/packages/edit-site/src/components/template-switcher/style.scss
index f0d135db7fd52b..592bb25c84bf4f 100644
--- a/packages/edit-site/src/components/template-switcher/style.scss
+++ b/packages/edit-site/src/components/template-switcher/style.scss
@@ -1,15 +1,48 @@
-.edit-site-template-switcher__label {
+.edit-site-template-switcher__popover .components-popover__content {
+ overflow: visible;
+}
+
+.edit-site-template-switcher__popover .components-menu-item__button {
position: relative;
- width: 100%;
}
-.edit-site-template-switcher__label-customized-icon-container {
+.edit-site-template-switcher__label-customized-dot {
position: absolute;
- right: 5px;
- top: 0;
- width: 10px;
+ right: 4px;
+ top: 50%;
+ margin-top: -4px;
+ width: 8px;
+ height: 8px;
+ display: block;
+ background: $theme-color;
+ border-radius: 50%;
}
.edit-site-template-switcher__label-customized-icon-icon {
width: 100%;
}
+
+/*
+ * This doesn't contain anything but it's needed because of dropdown jumpiness
+ * when there's a div after the last menu group.
+ */
+.edit-site-template-switcher__footer {
+ margin-bottom: -$grid-unit-15;
+}
+
+.edit-site-template-switcher__preview {
+ display: none;
+ border: $border-width solid $light-gray-secondary;
+ width: 300px;
+ padding: $grid-unit-20;
+ background: $white;
+ box-shadow: $shadow-popover;
+ border-radius: $radius-block-ui;
+ position: absolute;
+ top: -$border-width;
+ left: calc(100% + #{$grid-unit-15});
+
+ @include break-medium {
+ display: block;
+ }
+}
diff --git a/packages/edit-site/src/index.js b/packages/edit-site/src/index.js
index 369f1df5801020..1a6bb78d47ad79 100644
--- a/packages/edit-site/src/index.js
+++ b/packages/edit-site/src/index.js
@@ -12,6 +12,7 @@ import { render } from '@wordpress/element';
* Internal dependencies
*/
import './hooks';
+import './store';
import Editor from './components/editor';
/**
diff --git a/packages/edit-site/src/store/actions.js b/packages/edit-site/src/store/actions.js
new file mode 100644
index 00000000000000..d2f2692f194791
--- /dev/null
+++ b/packages/edit-site/src/store/actions.js
@@ -0,0 +1,13 @@
+/**
+ * Returns an action object used to toggle a feature flag.
+ *
+ * @param {string} feature Feature name.
+ *
+ * @return {Object} Action object.
+ */
+export function toggleFeature( feature ) {
+ return {
+ type: 'TOGGLE_FEATURE',
+ feature,
+ };
+}
diff --git a/packages/edit-site/src/store/constants.js b/packages/edit-site/src/store/constants.js
new file mode 100644
index 00000000000000..27b051950e603b
--- /dev/null
+++ b/packages/edit-site/src/store/constants.js
@@ -0,0 +1,6 @@
+/**
+ * The identifier for the data store.
+ *
+ * @type {string}
+ */
+export const STORE_KEY = 'core/edit-site';
diff --git a/packages/edit-site/src/store/controls.js b/packages/edit-site/src/store/controls.js
new file mode 100644
index 00000000000000..912ab065436504
--- /dev/null
+++ b/packages/edit-site/src/store/controls.js
@@ -0,0 +1,14 @@
+/**
+ * WordPress dependencies
+ */
+import { createRegistryControl } from '@wordpress/data';
+
+const controls = {
+ SELECT: createRegistryControl(
+ ( registry ) => ( { storeName, selectorName, args } ) => {
+ return registry.select( storeName )[ selectorName ]( ...args );
+ }
+ ),
+};
+
+export default controls;
diff --git a/packages/edit-site/src/store/defaults.js b/packages/edit-site/src/store/defaults.js
new file mode 100644
index 00000000000000..b7f95f64d6cfb8
--- /dev/null
+++ b/packages/edit-site/src/store/defaults.js
@@ -0,0 +1,5 @@
+export const PREFERENCES_DEFAULTS = {
+ features: {
+ fullscreenMode: true,
+ },
+};
diff --git a/packages/edit-post/src/store/index.native.js b/packages/edit-site/src/store/index.js
similarity index 63%
rename from packages/edit-post/src/store/index.native.js
rename to packages/edit-site/src/store/index.js
index 10355071bd454a..8f3ad27fcdb8fe 100644
--- a/packages/edit-post/src/store/index.native.js
+++ b/packages/edit-site/src/store/index.js
@@ -7,20 +7,17 @@ import { registerStore } from '@wordpress/data';
* Internal dependencies
*/
import reducer from './reducer';
-import applyMiddlewares from './middlewares';
import * as actions from './actions';
import * as selectors from './selectors';
+import controls from './controls';
import { STORE_KEY } from './constants';
const store = registerStore( STORE_KEY, {
reducer,
actions,
selectors,
+ controls,
persist: [ 'preferences' ],
} );
-applyMiddlewares( store );
-// Do not dispatch INIT for mobile as its effect currently only deals with
-// setting up the sidebar and we don't need/support it at the moment for mobile
-
export default store;
diff --git a/packages/edit-site/src/store/reducer.js b/packages/edit-site/src/store/reducer.js
new file mode 100644
index 00000000000000..d8fd6157e6e595
--- /dev/null
+++ b/packages/edit-site/src/store/reducer.js
@@ -0,0 +1,53 @@
+/**
+ * External dependencies
+ */
+import { flow } from 'lodash';
+
+/**
+ * WordPress dependencies
+ */
+import { combineReducers } from '@wordpress/data';
+
+/**
+ * Internal dependencies
+ */
+import { PREFERENCES_DEFAULTS } from './defaults';
+
+/**
+ * Higher-order reducer creator which provides the given initial state for the
+ * original reducer.
+ *
+ * @param {*} initialState Initial state to provide to reducer.
+ *
+ * @return {Function} Higher-order reducer.
+ */
+const createWithInitialState = ( initialState ) => ( reducer ) => {
+ return ( state = initialState, action ) => reducer( state, action );
+};
+
+/**
+ * Reducer returning the user preferences.
+ *
+ * @param {Object} state Current state.
+ *
+ * @return {Object} Updated state.
+ */
+export const preferences = flow( [
+ combineReducers,
+ createWithInitialState( PREFERENCES_DEFAULTS ),
+] )( {
+ features( state, action ) {
+ if ( action.type === 'TOGGLE_FEATURE' ) {
+ return {
+ ...state,
+ [ action.feature ]: ! state[ action.feature ],
+ };
+ }
+
+ return state;
+ },
+} );
+
+export default combineReducers( {
+ preferences,
+} );
diff --git a/packages/edit-site/src/store/selectors.js b/packages/edit-site/src/store/selectors.js
new file mode 100644
index 00000000000000..0cc6f860f87c5e
--- /dev/null
+++ b/packages/edit-site/src/store/selectors.js
@@ -0,0 +1,16 @@
+/**
+ * External dependencies
+ */
+import { get } from 'lodash';
+
+/**
+ * Returns whether the given feature is enabled or not.
+ *
+ * @param {Object} state Global application state.
+ * @param {string} feature Feature slug.
+ *
+ * @return {boolean} Is active.
+ */
+export function isFeatureActive( state, feature ) {
+ return get( state.preferences.features, [ feature ], false );
+}
diff --git a/packages/edit-site/src/store/test/actions.js b/packages/edit-site/src/store/test/actions.js
new file mode 100644
index 00000000000000..c2a7d440207fb9
--- /dev/null
+++ b/packages/edit-site/src/store/test/actions.js
@@ -0,0 +1,16 @@
+/**
+ * Internal dependencies
+ */
+import { toggleFeature } from '../actions';
+
+describe( 'actions', () => {
+ describe( 'toggleFeature', () => {
+ it( 'should return TOGGLE_FEATURE action', () => {
+ const feature = 'name';
+ expect( toggleFeature( feature ) ).toEqual( {
+ type: 'TOGGLE_FEATURE',
+ feature,
+ } );
+ } );
+ } );
+} );
diff --git a/packages/edit-site/src/store/test/reducer.js b/packages/edit-site/src/store/test/reducer.js
new file mode 100644
index 00000000000000..687eca3d39a1ab
--- /dev/null
+++ b/packages/edit-site/src/store/test/reducer.js
@@ -0,0 +1,32 @@
+/**
+ * External dependencies
+ */
+import deepFreeze from 'deep-freeze';
+
+/**
+ * Internal dependencies
+ */
+import { preferences } from '../reducer';
+import { PREFERENCES_DEFAULTS } from '../defaults';
+
+describe( 'state', () => {
+ describe( 'preferences()', () => {
+ it( 'should apply all defaults', () => {
+ const state = preferences( undefined, {} );
+
+ expect( state ).toEqual( PREFERENCES_DEFAULTS );
+ } );
+
+ it( 'should toggle a feature flag', () => {
+ const state = preferences(
+ deepFreeze( { features: { chicken: true } } ),
+ {
+ type: 'TOGGLE_FEATURE',
+ feature: 'chicken',
+ }
+ );
+
+ expect( state.features ).toEqual( { chicken: false } );
+ } );
+ } );
+} );
diff --git a/packages/edit-site/src/store/test/selectors.js b/packages/edit-site/src/store/test/selectors.js
new file mode 100644
index 00000000000000..82424b3658948b
--- /dev/null
+++ b/packages/edit-site/src/store/test/selectors.js
@@ -0,0 +1,51 @@
+/**
+ * Internal dependencies
+ */
+import { isFeatureActive } from '../selectors';
+
+describe( 'selectors', () => {
+ describe( 'isFeatureActive', () => {
+ it( 'is tolerant to an undefined features preference', () => {
+ // See: https://github.com/WordPress/gutenberg/issues/14580
+ const state = {
+ preferences: {},
+ };
+
+ expect( isFeatureActive( state, 'chicken' ) ).toBe( false );
+ } );
+
+ it( 'should return true if feature is active', () => {
+ const state = {
+ preferences: {
+ features: {
+ chicken: true,
+ },
+ },
+ };
+
+ expect( isFeatureActive( state, 'chicken' ) ).toBe( true );
+ } );
+
+ it( 'should return false if feature is not active', () => {
+ const state = {
+ preferences: {
+ features: {
+ chicken: false,
+ },
+ },
+ };
+
+ expect( isFeatureActive( state, 'chicken' ) ).toBe( false );
+ } );
+
+ it( 'should return false if feature is not referred', () => {
+ const state = {
+ preferences: {
+ features: {},
+ },
+ };
+
+ expect( isFeatureActive( state, 'chicken' ) ).toBe( false );
+ } );
+ } );
+} );
diff --git a/packages/edit-site/src/style.scss b/packages/edit-site/src/style.scss
index d0214003ad311b..a2a4c6023f3403 100644
--- a/packages/edit-site/src/style.scss
+++ b/packages/edit-site/src/style.scss
@@ -1,5 +1,9 @@
+@import "../../interface/src/style.scss";
+
@import "./components/block-editor/style.scss";
@import "./components/header/style.scss";
+@import "./components/header/fullscreen-mode-close/style.scss";
+@import "./components/header/more-menu/style.scss";
@import "./components/notices/style.scss";
@import "./components/sidebar/style.scss";
@import "./components/template-switcher/style.scss";
@@ -10,7 +14,7 @@ html.wp-toolbar {
background: $white;
}
-body.gutenberg_page_gutenberg-edit-site {
+body.toplevel_page_gutenberg-edit-site {
@include wp-admin-reset(".edit-site");
}
@@ -40,6 +44,12 @@ body.gutenberg_page_gutenberg-edit-site {
> .components-navigate-regions {
height: 100%;
}
+
+ // Todo: Remove this rule when edit site gets support
+ // for opening unpinned sidebar items.
+ .interface-complementary-area__pin-unpin-item.components-button {
+ display: none;
+ }
}
/**
diff --git a/packages/edit-widgets/package.json b/packages/edit-widgets/package.json
index 81454065c8e774..d84bccbd764555 100644
--- a/packages/edit-widgets/package.json
+++ b/packages/edit-widgets/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/edit-widgets",
- "version": "0.12.3",
+ "version": "0.14.1",
"private": true,
"description": "Widgets Page module for WordPress..",
"author": "The WordPress Contributors",
@@ -21,7 +21,7 @@
"module": "build-module/index.js",
"react-native": "src/index",
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/block-editor": "file:../block-editor",
"@wordpress/block-library": "file:../block-library",
"@wordpress/blocks": "file:../blocks",
@@ -32,6 +32,7 @@
"@wordpress/element": "file:../element",
"@wordpress/hooks": "file:../hooks",
"@wordpress/i18n": "file:../i18n",
+ "@wordpress/interface": "file:../interface",
"@wordpress/media-utils": "file:../media-utils",
"@wordpress/notices": "file:../notices",
"lodash": "^4.17.15",
diff --git a/packages/edit-widgets/src/components/layout/index.js b/packages/edit-widgets/src/components/layout/index.js
index 5f5c4424b3909c..97b6c6b2ea9d8a 100644
--- a/packages/edit-widgets/src/components/layout/index.js
+++ b/packages/edit-widgets/src/components/layout/index.js
@@ -8,11 +8,9 @@ import {
FocusReturnProvider,
} from '@wordpress/components';
import { useState } from '@wordpress/element';
-import {
- BlockEditorKeyboardShortcuts,
- __experimentalEditorSkeleton as EditorSkeleton,
-} from '@wordpress/block-editor';
+import { BlockEditorKeyboardShortcuts } from '@wordpress/block-editor';
import { useViewportMatch } from '@wordpress/compose';
+import { InterfaceSkeleton } from '@wordpress/interface';
/**
* Internal dependencies
@@ -32,7 +30,7 @@ function Layout( { blockEditorSettings } ) {
- }
sidebar={ ! isMobile && }
content={
diff --git a/packages/edit-widgets/src/components/widget-area/style.scss b/packages/edit-widgets/src/components/widget-area/style.scss
index 2f1160bd17c77b..248f5d4e4ff856 100644
--- a/packages/edit-widgets/src/components/widget-area/style.scss
+++ b/packages/edit-widgets/src/components/widget-area/style.scss
@@ -2,11 +2,6 @@
max-width: $widget-area-width;
margin: 0 auto 30px;
- // Reduce padding inside widget areas
- .block-editor-block-list__layout {
- padding-left: $block-side-ui-width + $block-padding;
- padding-right: $block-side-ui-width + $block-padding;
- }
// By default the default block appender inserter has a negative position,
// but given that on the widget screen we have 0 padding we need to remove the negative position.
.block-editor-default-block-appender .block-editor-inserter,
diff --git a/packages/edit-widgets/src/style.scss b/packages/edit-widgets/src/style.scss
index 86ee2bd54c3c69..41cc5979e9dd6e 100644
--- a/packages/edit-widgets/src/style.scss
+++ b/packages/edit-widgets/src/style.scss
@@ -1,3 +1,5 @@
+@import "../../interface/src/style.scss";
+
@import "./components/customizer-edit-widgets-initializer/style.scss";
@import "./components/header/style.scss";
@import "./components/layout/style.scss";
@@ -49,7 +51,7 @@ body.gutenberg_page_gutenberg-widgets {
}
- .block-editor-editor-skeleton__content {
+ .interface-interface-skeleton__content {
background-color: #f1f1f1;
}
}
diff --git a/packages/editor/package.json b/packages/editor/package.json
index c2d282ccee463d..53c8e2a88fb407 100644
--- a/packages/editor/package.json
+++ b/packages/editor/package.json
@@ -1,6 +1,6 @@
{
"name": "@wordpress/editor",
- "version": "9.12.3",
+ "version": "9.14.1",
"description": "Building blocks for WordPress editors.",
"author": "The WordPress Contributors",
"license": "GPL-2.0-or-later",
@@ -21,7 +21,7 @@
"module": "build-module/index.js",
"react-native": "src/index",
"dependencies": {
- "@babel/runtime": "^7.8.3",
+ "@babel/runtime": "^7.9.2",
"@wordpress/api-fetch": "file:../api-fetch",
"@wordpress/autop": "file:../autop",
"@wordpress/blob": "file:../blob",
@@ -52,7 +52,7 @@
"@wordpress/wordcount": "file:../wordcount",
"classnames": "^2.2.5",
"lodash": "^4.17.15",
- "memize": "^1.0.5",
+ "memize": "^1.1.0",
"react-autosize-textarea": "^3.0.2",
"redux-optimist": "^1.0.0",
"refx": "^3.0.0",
diff --git a/packages/editor/src/components/autocompleters/index.js b/packages/editor/src/components/autocompleters/index.js
index 8b494925b94cce..5cec8914cf8516 100644
--- a/packages/editor/src/components/autocompleters/index.js
+++ b/packages/editor/src/components/autocompleters/index.js
@@ -1,2 +1 @@
-export { default as blockAutocompleter } from './block';
export { default as userAutocompleter } from './user';
diff --git a/packages/editor/src/components/autocompleters/style.scss b/packages/editor/src/components/autocompleters/style.scss
index c48cc9f05d14a6..1d20b34eeb8709 100644
--- a/packages/editor/src/components/autocompleters/style.scss
+++ b/packages/editor/src/components/autocompleters/style.scss
@@ -1,9 +1,3 @@
-.editor-autocompleters__block {
- .block-editor-block-icon {
- margin-right: 8px;
- }
-}
-
.editor-autocompleters__user {
.editor-autocompleters__no-avatar::before {
/* stylelint-disable */
diff --git a/packages/editor/src/components/document-outline/style.scss b/packages/editor/src/components/document-outline/style.scss
index c02f815eb6f09a..52e1a9e5b91fbd 100644
--- a/packages/editor/src/components/document-outline/style.scss
+++ b/packages/editor/src/components/document-outline/style.scss
@@ -51,13 +51,17 @@
padding: 2px 5px 2px 1px;
color: $dark-gray-800;
text-align: left;
+ border-radius: $radius-block-ui;
&:disabled {
cursor: default;
}
&:focus {
- @include button-style__focus-active;
+ box-shadow: 0 0 0 $border-width-focus $theme-color;
+
+ // Windows High Contrast mode will show this outline, but not the box-shadow.
+ outline: 2px solid transparent;
}
}
diff --git a/packages/editor/src/components/editor-notices/style.scss b/packages/editor/src/components/editor-notices/style.scss
index 14ea34748cce53..b9687bc87de866 100644
--- a/packages/editor/src/components/editor-notices/style.scss
+++ b/packages/editor/src/components/editor-notices/style.scss
@@ -35,4 +35,8 @@
.components-editor-notices__snackbar {
width: 100%;
+ @include break-medium() {
+ width: fit-content;
+ width: -moz-fit-content;
+ }
}
diff --git a/packages/editor/src/components/entities-saved-states/index.js b/packages/editor/src/components/entities-saved-states/index.js
index be2d8a804eb7fe..460823f3bcf856 100644
--- a/packages/editor/src/components/entities-saved-states/index.js
+++ b/packages/editor/src/components/entities-saved-states/index.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import { some } from 'lodash';
+import { some, groupBy } from 'lodash';
/**
* WordPress dependencies
@@ -12,48 +12,69 @@ import { useSelect, useDispatch } from '@wordpress/data';
import { useState } from '@wordpress/element';
function EntityRecordState( { record, checked, onChange } ) {
- const entity = useSelect(
- ( select ) => select( 'core' ).getEntity( record.kind, record.name ),
- [ record.kind, record.name ]
- );
-
return (
- { entity.label }
- { !! record.title && (
- <>
- { ': ' }
-
- { record.title || __( 'Untitled' ) }
-
- >
- ) }
- >
- }
- checked={ ! checked }
+ label={ { record.title || __( 'Untitled' ) } }
+ checked={ checked }
onChange={ onChange }
/>
);
}
-export default function EntitiesSavedStates( {
- isOpen,
- onRequestClose,
- ignoredForSave = [],
-} ) {
+function EntityTypeList( { list, unselectedEntities, setUnselectedEntities } ) {
+ const firstRecord = list[ 0 ];
+ const entity = useSelect(
+ ( select ) =>
+ select( 'core' ).getEntity( firstRecord.kind, firstRecord.name ),
+ [ firstRecord.kind, firstRecord.name ]
+ );
+
+ return (
+
+
{ entity.label }
+ { list.map( ( record ) => {
+ return (
+
+ elt.kind === record.kind &&
+ elt.name === record.name &&
+ elt.key === record.key
+ )
+ }
+ onChange={ ( value ) =>
+ setUnselectedEntities( record, value )
+ }
+ />
+ );
+ } ) }
+
+ );
+}
+
+export default function EntitiesSavedStates( { isOpen, onRequestClose } ) {
const dirtyEntityRecords = useSelect(
( select ) => select( 'core' ).__experimentalGetDirtyEntityRecords(),
[]
);
const { saveEditedEntityRecord } = useDispatch( 'core' );
- const [ unsavedEntityRecords, _setUnsavedEntityRecords ] = useState( [] );
- const setUnsavedEntityRecords = ( { kind, name, key }, checked ) => {
+ // To group entities by type.
+ const partitionedSavables = Object.values(
+ groupBy( dirtyEntityRecords, 'name' )
+ );
+
+ // Unchecked entities to be ignored by save function.
+ const [ unselectedEntities, _setUnselectedEntities ] = useState( [] );
+
+ const setUnselectedEntities = ( { kind, name, key }, checked ) => {
if ( checked ) {
- _setUnsavedEntityRecords(
- unsavedEntityRecords.filter(
+ _setUnselectedEntities(
+ unselectedEntities.filter(
( elt ) =>
elt.kind !== kind ||
elt.name !== name ||
@@ -61,17 +82,18 @@ export default function EntitiesSavedStates( {
)
);
} else {
- _setUnsavedEntityRecords( [
- ...unsavedEntityRecords,
+ _setUnselectedEntities( [
+ ...unselectedEntities,
{ kind, name, key },
] );
}
};
+
const saveCheckedEntities = () => {
const entitiesToSave = dirtyEntityRecords.filter(
( { kind, name, key } ) => {
return ! some(
- ignoredForSave.concat( unsavedEntityRecords ),
+ unselectedEntities,
( elt ) =>
elt.kind === kind &&
elt.name === name &&
@@ -86,6 +108,7 @@ export default function EntitiesSavedStates( {
onRequestClose( entitiesToSave );
};
+
return (
isOpen && (
onRequestClose() }
contentLabel={ __( 'Select items to save.' ) }
>
- { dirtyEntityRecords.map( ( record ) => {
+ { partitionedSavables.map( ( list ) => {
return (
-
- elt.kind === record.kind &&
- elt.name === record.name &&
- elt.key === record.key
- )
- }
- onChange={ ( value ) =>
- setUnsavedEntityRecords( record, value )
- }
+
);
} ) }
@@ -118,7 +131,7 @@ export default function EntitiesSavedStates( {
isPrimary
disabled={
dirtyEntityRecords.length -
- unsavedEntityRecords.length ===
+ unselectedEntities.length ===
0
}
onClick={ saveCheckedEntities }
diff --git a/packages/editor/src/components/entities-saved-states/style.scss b/packages/editor/src/components/entities-saved-states/style.scss
index 6751b3ef2673b8..6a04c3db879c89 100644
--- a/packages/editor/src/components/entities-saved-states/style.scss
+++ b/packages/editor/src/components/entities-saved-states/style.scss
@@ -3,3 +3,9 @@
margin-left: auto;
margin-right: 0;
}
+.editor-entities-saved-states__entity-type-list {
+ h2 {
+ font-size: 18px;
+ margin: 20px 0 10px;
+ }
+}
diff --git a/packages/editor/src/components/post-last-revision/index.js b/packages/editor/src/components/post-last-revision/index.js
index b24f0f3ac0c1cc..643b6c1a4700a6 100644
--- a/packages/editor/src/components/post-last-revision/index.js
+++ b/packages/editor/src/components/post-last-revision/index.js
@@ -24,6 +24,7 @@ function LastRevision( { lastRevisionId, revisionsCount } ) {
icon={ backup }
>
{ sprintf(
+ /* translators: %d: number of revisions */
_n( '%d Revision', '%d Revisions', revisionsCount ),
revisionsCount
) }
diff --git a/packages/editor/src/components/post-last-revision/style.scss b/packages/editor/src/components/post-last-revision/style.scss
index 1976ec65496006..d9fd35f16edb5c 100644
--- a/packages/editor/src/components/post-last-revision/style.scss
+++ b/packages/editor/src/components/post-last-revision/style.scss
@@ -7,19 +7,17 @@
}
}
-// Needs specificity
-.components-button:not(:disabled):not([aria-disabled="true"]).editor-post-last-revision__title {
+.components-button.editor-post-last-revision__title {
height: auto;
&:hover,
&:active {
// Override the default button hover style
- background: $light-gray-200 !important;
- border: none !important;
- box-shadow: none !important;
+ background: $light-gray-200;
}
&:focus {
- @include menu-style__focus;
+ box-shadow: inset 0 0 0 $border-width-focus $theme-color;
+ border-radius: 0;
}
}
diff --git a/packages/editor/src/components/post-permalink/editor.js b/packages/editor/src/components/post-permalink/editor.js
deleted file mode 100644
index a09ee66ed984a8..00000000000000
--- a/packages/editor/src/components/post-permalink/editor.js
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * WordPress dependencies
- */
-import { withDispatch, withSelect } from '@wordpress/data';
-import { Component } from '@wordpress/element';
-import { __ } from '@wordpress/i18n';
-import { Button } from '@wordpress/components';
-import { compose } from '@wordpress/compose';
-
-/**
- * Internal dependencies
- */
-import { cleanForSlug } from '../../utils/url';
-
-class PostPermalinkEditor extends Component {
- constructor( { permalinkParts, slug } ) {
- super( ...arguments );
-
- this.state = {
- editedPostName: slug || permalinkParts.postName,
- };
-
- this.onSavePermalink = this.onSavePermalink.bind( this );
- }
-
- onSavePermalink( event ) {
- const postName = cleanForSlug( this.state.editedPostName );
-
- event.preventDefault();
-
- this.props.onSave();
-
- if ( postName === this.props.postName ) {
- return;
- }
-
- this.props.editPost( {
- slug: postName,
- } );
-
- this.setState( {
- editedPostName: postName,
- } );
- }
-
- render() {
- const { prefix, suffix } = this.props.permalinkParts;
- const { editedPostName } = this.state;
-
- /* eslint-disable jsx-a11y/no-autofocus */
- // Autofocus is allowed here, as this mini-UI is only loaded when the user clicks to open it.
- return (
-
- );
- /* eslint-enable jsx-a11y/no-autofocus */
- }
-}
-
-export default compose( [
- withSelect( ( select ) => {
- const { getPermalinkParts } = select( 'core/editor' );
- return {
- permalinkParts: getPermalinkParts(),
- };
- } ),
- withDispatch( ( dispatch ) => {
- const { editPost } = dispatch( 'core/editor' );
- return { editPost };
- } ),
-] )( PostPermalinkEditor );
diff --git a/packages/editor/src/components/post-permalink/index.js b/packages/editor/src/components/post-permalink/index.js
deleted file mode 100644
index 98108178f5f55a..00000000000000
--- a/packages/editor/src/components/post-permalink/index.js
+++ /dev/null
@@ -1,182 +0,0 @@
-/**
- * External dependencies
- */
-import classnames from 'classnames';
-import { get } from 'lodash';
-
-/**
- * WordPress dependencies
- */
-import { withDispatch, withSelect } from '@wordpress/data';
-import { Component } from '@wordpress/element';
-import { __ } from '@wordpress/i18n';
-import { compose } from '@wordpress/compose';
-import { ClipboardButton, Button, ExternalLink } from '@wordpress/components';
-import { safeDecodeURI, safeDecodeURIComponent } from '@wordpress/url';
-import { link as linkIcon } from '@wordpress/icons';
-
-/**
- * Internal dependencies
- */
-import PostPermalinkEditor from './editor.js';
-import { cleanForSlug } from '../../utils/url';
-
-class PostPermalink extends Component {
- constructor() {
- super( ...arguments );
-
- this.addVisibilityCheck = this.addVisibilityCheck.bind( this );
- this.onVisibilityChange = this.onVisibilityChange.bind( this );
-
- this.state = {
- isCopied: false,
- isEditingPermalink: false,
- };
- }
-
- addVisibilityCheck() {
- window.addEventListener( 'visibilitychange', this.onVisibilityChange );
- }
-
- onVisibilityChange() {
- const { isEditable, refreshPost } = this.props;
- // If the user just returned after having clicked the "Change Permalinks" button,
- // fetch a new copy of the post from the server, just in case they enabled permalinks.
- if ( ! isEditable && 'visible' === document.visibilityState ) {
- refreshPost();
- }
- }
-
- componentDidUpdate( prevProps, prevState ) {
- // If we've just stopped editing the permalink, focus on the new permalink.
- if ( prevState.isEditingPermalink && ! this.state.isEditingPermalink ) {
- this.linkElement.focus();
- }
- }
-
- componentWillUnmount() {
- window.removeEventListener(
- 'visibilitychange',
- this.addVisibilityCheck
- );
- }
-
- render() {
- const {
- isEditable,
- isNew,
- isPublished,
- isViewable,
- permalinkParts,
- postLink,
- postSlug,
- postID,
- postTitle,
- } = this.props;
-
- if ( isNew || ! isViewable || ! permalinkParts || ! postLink ) {
- return null;
- }
-
- const { isCopied, isEditingPermalink } = this.state;
- const ariaLabel = isCopied
- ? __( 'Permalink copied' )
- : __( 'Copy the permalink' );
-
- const { prefix, suffix } = permalinkParts;
- const slug =
- safeDecodeURIComponent( postSlug ) ||
- cleanForSlug( postTitle ) ||
- postID;
- const samplePermalink = isEditable ? prefix + slug + suffix : prefix;
-
- return (
-
-
this.setState( { isCopied: true } ) }
- aria-disabled={ isCopied }
- icon={ linkIcon }
- />
-
-
- { __( 'Permalink:' ) }
-
-
- { ! isEditingPermalink && (
-
- ( this.linkElement = linkElement )
- }
- >
- { safeDecodeURI( samplePermalink ) }
-
-
- ) }
-
- { isEditingPermalink && (
-
- this.setState( { isEditingPermalink: false } )
- }
- />
- ) }
-
- { isEditable && ! isEditingPermalink && (
-
- this.setState( { isEditingPermalink: true } )
- }
- >
- { __( 'Edit' ) }
-
- ) }
-
- );
- }
-}
-
-export default compose( [
- withSelect( ( select ) => {
- const {
- isEditedPostNew,
- isPermalinkEditable,
- getCurrentPost,
- getPermalinkParts,
- getEditedPostAttribute,
- isCurrentPostPublished,
- } = select( 'core/editor' );
- const { getPostType } = select( 'core' );
-
- const { id, link } = getCurrentPost();
-
- const postTypeName = getEditedPostAttribute( 'type' );
- const postType = getPostType( postTypeName );
-
- return {
- isNew: isEditedPostNew(),
- postLink: link,
- permalinkParts: getPermalinkParts(),
- postSlug: getEditedPostAttribute( 'slug' ),
- isEditable: isPermalinkEditable(),
- isPublished: isCurrentPostPublished(),
- postTitle: getEditedPostAttribute( 'title' ),
- postID: id,
- isViewable: get( postType, [ 'viewable' ], false ),
- };
- } ),
- withDispatch( ( dispatch ) => {
- const { refreshPost } = dispatch( 'core/editor' );
- return { refreshPost };
- } ),
-] )( PostPermalink );
diff --git a/packages/editor/src/components/post-permalink/style.scss b/packages/editor/src/components/post-permalink/style.scss
deleted file mode 100644
index 241250696123cf..00000000000000
--- a/packages/editor/src/components/post-permalink/style.scss
+++ /dev/null
@@ -1,140 +0,0 @@
-.editor-post-permalink {
- display: inline-flex;
- align-items: center;
- flex-wrap: wrap;
- padding: $grid-unit-10 $grid-unit-10 0;
- font-family: $default-font;
- font-size: $default-font-size;
- white-space: nowrap;
- background-clip: padding-box;
-
- // Block UI appearance.
- border: $border-width solid $dark-gray-primary;
- border-radius: $radius-block-ui;
- background-color: $white;
-
- // Put toolbar snugly to edge on mobile.
- margin-left: -$block-padding - $border-width; // This hides the border off the edge of the screen.
- margin-right: -$block-padding - $border-width;
- @include break-mobile() {
- padding: $grid-unit-05;
- }
- @include break-small() {
- margin-left: -$border-width;
- margin-right: -$border-width;
- }
-
- // Increase specificity to override margins set on label element.
- &.editor-post-permalink > * {
- margin-bottom: $grid-unit-10;
-
- @include break-mobile() {
- margin-bottom: 0;
- }
- }
-
- // Prevent button shrinking in IE11 when other items have a 100% flex basis.
- // This should be safe to apply in all browsers because we don't want these
- // buttons to shrink anyway.
- button {
- flex-shrink: 0;
- }
-}
-
-.editor-post-permalink__copy {
- border-radius: 4px;
- padding: 6px;
-}
-
-.editor-post-permalink__copy.is-copied {
- opacity: 0.3;
-}
-
-.editor-post-permalink__label {
- margin: 0 10px 0 5px;
- font-weight: 600;
-}
-
-.editor-post-permalink__link {
- color: $dark-gray-200;
- text-decoration: underline;
- margin-right: 10px;
- flex-grow: 1;
- overflow: hidden;
- position: relative;
- white-space: nowrap;
- text-align: left;
-}
-
-.editor-post-permalink-editor {
- width: 100%;
- min-width: 20%;
- display: inline-flex;
- align-items: center;
-
- .editor-post-permalink__editor-container {
- flex: 0 1 100%;
- display: flex;
- overflow: hidden; // This enables serious flex shrinking.
- padding: $border-width 0; // Necessary for the overflow to not crop the focus style.
-
- .editor-post-permalink-editor__prefix {
- flex: 1 1 auto;
-
- @include break-small {
- flex: 1 0 auto;
- }
- }
-
- .editor-post-permalink-editor__edit {
- flex: 1 1 100%;
- }
- }
-
- // Higher specificity required to override core margin styles.
- .editor-post-permalink-editor__save {
- margin-left: auto;
- }
-}
-
-.editor-post-permalink-editor__prefix {
- color: $dark-gray-300;
- min-width: 20%;
- overflow: hidden;
- position: relative;
- white-space: nowrap;
- text-overflow: ellipsis;
-}
-
-.editor-post-permalink input[type="text"].editor-post-permalink-editor__edit {
- // Input fields are created with inherent widths.
- // By supplying both a (any) width and a min-width, we allow it to scale in a flex container.
- min-width: 10%;
- width: 100%;
- margin: 0 3px;
- padding: 2px 4px;
-}
-
-.editor-post-permalink-editor__suffix {
- color: $dark-gray-300;
- margin-right: 6px;
- flex: 0 0 0%;
-}
-
-.editor-post-permalink-editor__prefix {
- text-align: left;
-}
-
-/* rtl:begin:ignore */
-.editor-post-permalink__link {
- text-align: left;
-}
-.editor-post-permalink__editor-container,
-.editor-post-permalink__link {
- direction: ltr;
-}
-.editor-post-permalink__link::after {
- @include long-content-fade($direction:right, $size: 20%, $edge: 0);
-}
-/* rtl:end:ignore */
-
diff --git a/packages/editor/src/components/post-preview-button/index.js b/packages/editor/src/components/post-preview-button/index.js
index 9226451b3aef32..60689f4d424c98 100644
--- a/packages/editor/src/components/post-preview-button/index.js
+++ b/packages/editor/src/components/post-preview-button/index.js
@@ -8,7 +8,7 @@ import classnames from 'classnames';
* WordPress dependencies
*/
import { Component, createRef, renderToString } from '@wordpress/element';
-import { Button, Path, SVG } from '@wordpress/components';
+import { Button, Path, SVG, VisuallyHidden } from '@wordpress/components';
import { __, _x } from '@wordpress/i18n';
import { withSelect, withDispatch } from '@wordpress/data';
import { ifCondition, compose } from '@wordpress/compose';
@@ -207,10 +207,10 @@ export class PostPreviewButton extends Component {
{ this.props.textContent
? this.props.textContent
: _x( 'Preview', 'imperative verb' ) }
-
+
{ /* translators: accessibility text */
__( '(opens in a new tab)' ) }
-
+
);
}
diff --git a/packages/editor/src/components/post-preview-button/test/__snapshots__/index.js.snap b/packages/editor/src/components/post-preview-button/test/__snapshots__/index.js.snap
index 43be77565caa5e..e03484534e4ab0 100644
--- a/packages/editor/src/components/post-preview-button/test/__snapshots__/index.js.snap
+++ b/packages/editor/src/components/post-preview-button/test/__snapshots__/index.js.snap
@@ -10,11 +10,11 @@ exports[`PostPreviewButton render() should render currentPostLink otherwise 1`]
target="wp-preview-1"
>
Preview
-
(opens in a new tab)
-
+
`;
@@ -28,10 +28,10 @@ exports[`PostPreviewButton render() should render previewLink if provided 1`] =
target="wp-preview-1"
>
Preview
-
(opens in a new tab)
-
+
`;
diff --git a/packages/editor/src/components/post-publish-button/index.js b/packages/editor/src/components/post-publish-button/index.js
index 6405ae571a3db8..c2383f52c19afb 100644
--- a/packages/editor/src/components/post-publish-button/index.js
+++ b/packages/editor/src/components/post-publish-button/index.js
@@ -3,7 +3,6 @@
*/
import { noop, get, some } from 'lodash';
import classnames from 'classnames';
-import memoize from 'memize';
/**
* WordPress dependencies
@@ -33,12 +32,6 @@ export class PostPublishButton extends Component {
this.state = {
entitiesSavedStatesCallback: false,
};
- this.createIgnoredForSave = memoize(
- ( postType, postId ) => [
- { kind: 'postType', name: postType, key: postId },
- ],
- { maxSize: 1 }
- );
}
componentDidMount() {
if ( this.props.focusOnMount ) {
@@ -102,8 +95,6 @@ export class PostPublishButton extends Component {
onToggle,
visibility,
hasNonPostEntityChanges,
- postType,
- postId,
} = this.props;
const { entitiesSavedStatesCallback } = this.state;
@@ -182,10 +173,6 @@ export class PostPublishButton extends Component {
) }
{
onUpdatePostFormat={ onUpdatePostFormat }
suggestedPostFormat={ suggestion.id }
suggestionText={ sprintf(
+ /* translators: %s: post format */
__( 'Apply the "%1$s" format.' ),
suggestion.caption
) }
diff --git a/packages/editor/src/components/post-publish-panel/postpublish.js b/packages/editor/src/components/post-publish-panel/postpublish.js
index 21ea2144d052f0..c7aa69bddb20cd 100644
--- a/packages/editor/src/components/post-publish-panel/postpublish.js
+++ b/packages/editor/src/components/post-publish-panel/postpublish.js
@@ -23,6 +23,26 @@ import { decodeEntities } from '@wordpress/html-entities';
*/
import PostScheduleLabel from '../post-schedule/label';
+const POSTNAME = '%postname%';
+
+/**
+ * Returns URL for a future post.
+ *
+ * @param {Object} post Post object.
+ *
+ * @return {string} PostPublish URL.
+ */
+
+const getFuturePostUrl = ( post ) => {
+ const { slug } = post;
+
+ if ( post.permalink_template.includes( POSTNAME ) ) {
+ return post.permalink_template.replace( POSTNAME, slug );
+ }
+
+ return post.permalink_template;
+};
+
class PostPublishPanelPostpublish extends Component {
constructor() {
super( ...arguments );
@@ -65,6 +85,8 @@ class PostPublishPanelPostpublish extends Component {
const { children, isScheduled, post, postType } = this.props;
const postLabel = get( postType, [ 'labels', 'singular_name' ] );
const viewPostLabel = get( postType, [ 'labels', 'view_item' ] );
+ const link =
+ post.status === 'future' ? getFuturePostUrl( post ) : post.link;
const postPublishNonLinkHeader = isScheduled ? (
<>
@@ -78,7 +100,7 @@ class PostPublishPanelPostpublish extends Component {
return (
-
+
{ decodeEntities( post.title ) || __( '(no title)' ) }
{ ' ' }
{ postPublishNonLinkHeader }
@@ -95,19 +117,19 @@ class PostPublishPanelPostpublish extends Component {
__( '%s address' ),
postLabel
) }
- value={ safeDecodeURIComponent( post.link ) }
+ value={ safeDecodeURIComponent( link ) }
onFocus={ this.onSelectInput }
/>
{ ! isScheduled && (
-
+
{ viewPostLabel }
) }
{ this.state.showCopyConfirmation
diff --git a/packages/editor/src/components/post-publish-panel/style.scss b/packages/editor/src/components/post-publish-panel/style.scss
index aaadde5f80884a..93904e14fdbbcb 100644
--- a/packages/editor/src/components/post-publish-panel/style.scss
+++ b/packages/editor/src/components/post-publish-panel/style.scss
@@ -14,9 +14,9 @@
.editor-post-publish-panel__header {
background: $white;
- padding-left: 8px;
- padding-right: 8px;
- height: $header-height;
+ padding-left: $grid-unit-10;
+ padding-right: $grid-unit-10;
+ height: $header-height + $border-width;
border-bottom: $border-width solid $light-gray-500;
display: flex;
align-items: center;
@@ -24,7 +24,7 @@
.components-button.has-icon {
position: absolute;
- right: 8px;
+ right: $grid-unit-10;
}
}
@@ -78,12 +78,6 @@
.editor-post-visibility__dialog-legend {
display: none;
}
-
- // The DateTime component has an intrinsic padding in order for the horizontal scrolling to function inside a popover.
- // We unset that here when used inline.
- .components-datetime {
- padding: 0;
- }
}
.post-publish-panel__postpublish .components-panel__body {
diff --git a/packages/editor/src/components/post-publish-panel/test/__snapshots__/index.js.snap b/packages/editor/src/components/post-publish-panel/test/__snapshots__/index.js.snap
index 39124b699590bb..e31518a8c63542 100644
--- a/packages/editor/src/components/post-publish-panel/test/__snapshots__/index.js.snap
+++ b/packages/editor/src/components/post-publish-panel/test/__snapshots__/index.js.snap
@@ -13,7 +13,6 @@ exports[`PostPublishPanel should render the post-publish panel if the post is pu
Published
-
{ __( 'Type text or HTML' ) }
-
+