From 15863a8e3670b3105bf5451dd119505b4c83e4cb Mon Sep 17 00:00:00 2001 From: Dennis Snell Date: Thu, 26 Jan 2023 15:48:28 -0700 Subject: [PATCH 01/23] Introduce HTML Tag Processor This commit pulls in the HTML Tag Processor from the Gutenbeg repository. The Tag Processor attempts to be an HTML5-spec-compliant parser that provides the ability in PHP to find specific HTML tags and then add, remove, or update attributes on that tag. It provides a safe and reliable way to modify the attribute on HTML tags. ```php // Add missing `rel` attribute to links. $p = new WP_HTML_Tag_Processor( $block_content ); if ( $p->next_tag( 'A' ) && empty( $p->get_attribute( 'rel' ) ) ) { $p->set_attribute( 'noopener nofollow' ); } return $p->get_updated_html(); ``` Introduced originally in WordPress/Gutenberg#42485 and developed within the Gutenberg repository, this HTML parsing system was built in order to address a persistent need (properly modifying HTML tag attributes) and was motivated after a sequence of block editor defects which stemmed from mismatches between actual HTML code and expectectations for HTML input running through existing naive string-search-based solutions. The Tag Processor is intended to operate fast enough to avoid being an obstacle on page render while using as little memory overhead as possible. It is practically a zero-memory-overhead system, and only allocates memory as changes to the input HTML document are enqueued, releasing that memory when flushing those changes to the document, moving on to find the next tag, or flushing its entire output via `get_updated_html()`. Rigor has been taken to ensure that the Tag Processor will not be consfused by unexpected or non-normative HTML input, including issues arising from quoting, from different syntax rules within ``, `<textarea>`, and `<script>` tags, from the appearance of rare but legitimate comment and XML-like regions, and from a variety of syntax abnormalities such as unbalanced tags, incomplete syntax, and overlapping tags. The Tag Processor is constrained to parsing an HTML document as a stream of tokens. It will not build an HTML tree or generate a DOM representation of a document. It is designed to start at the beginning of an HTML document and linearly scan through it, potentially modifying that document as it scans. It has no access to the markup inside or around tags and it has no ability to determine which tag openers and tag closers belong to each other, or determine the nesting depth of a given tag. It includes a primitive bookmarking system to remember tags it has previously visited. These bookmarks refer to specific tags, not to string offsets, and continue to point to the same place in the document as edits are applied. By asking the Tag Processor to seek to a given bookmark it's possible to back up and continue processsing again content that has already been traversed. Attribute values are sanitized with `esc_attr()` and rendered as double-quoted attributes. On read they are unescaped and unquoted. Authors wishing to rely on the Tag Processor therefore are free to pass around data as normal strings. Convenience methods for adding and removing CSS class names exist in order to remove the need to process the `class` attribute. ```php // Update heading block class names $p = new WP_HTML_Tag_Processor( $html ); while ( $p->next_tag() ) { switch ( $p->get_tag() ) { case 'H1': case 'H2': case 'H3': case 'H4': case 'H5': case 'H6': $p->remove_class( 'wp-heading' ); $p->add_class( 'wp-block-heading' ); break; } return $p->get_updated_html(); ``` The Tag Processor is intended to be a reliable low-level library for traversing HTML documents and higher-level APIs are to be built upon it. Immediately, and in Core Gutenberg blocks it is meant to replace HTML modification that currently relies on RegExp patterns and simpler string replacements. See the following for examples of such replacement: https://github.com/WordPress/gutenberg/pull/44600/commits/13157844ac9aa4307a7a1e3abc54d0f7b0c333cd https://github.com/WordPress/gutenberg/pull/45469/files#diff-dcd9e1f9b87ca63efe9f1e834b4d3048778d3eca41aa39c636f8b16a5bb452d2L46 https://github.com/WordPress/gutenberg/pull/46625 Co-Authored-By: Adam Zielinski <adam@adamziel.com> Co-Authored-By: Bernie Reiter <ockham@raz.or.at> Co-Authored-By: Grzegorz Ziolkowski <grzegorz@gziolo.pl> --- .../class-wp-html-attribute-token.php | 93 + src/wp-includes/class-wp-html-span.php | 56 + .../class-wp-html-tag-processor.php | 2047 +++++++++++++++++ .../class-wp-html-text-replacement.php | 63 + src/wp-includes/wp-html.php | 34 + src/wp-settings.php | 1 + .../html/wpHtmlTagProcessorBookmarks.php | 370 +++ .../tests/html/wpHtmlTagProcessorTest.php | 1908 +++++++++++++++ 8 files changed, 4572 insertions(+) create mode 100644 src/wp-includes/class-wp-html-attribute-token.php create mode 100644 src/wp-includes/class-wp-html-span.php create mode 100644 src/wp-includes/class-wp-html-tag-processor.php create mode 100644 src/wp-includes/class-wp-html-text-replacement.php create mode 100644 src/wp-includes/wp-html.php create mode 100644 tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php create mode 100644 tests/phpunit/tests/html/wpHtmlTagProcessorTest.php diff --git a/src/wp-includes/class-wp-html-attribute-token.php b/src/wp-includes/class-wp-html-attribute-token.php new file mode 100644 index 0000000000000..21147e30bfe1f --- /dev/null +++ b/src/wp-includes/class-wp-html-attribute-token.php @@ -0,0 +1,93 @@ +<?php +/** + * HTML Tag Processor: Attribute token structure class. + * + * @package WordPress + * @subpackage HTML + * @since 6.2.0 + */ + +if ( ! class_exists( 'WP_HTML_Attribute_Token' ) ) : + +/** + * Data structure for the attribute token that allows to drastically improve performance. + * + * This class is for internal usage of the WP_HTML_Tag_Processor class. + * + * @access private + * @since 6.2.0 + * + * @see WP_HTML_Tag_Processor + */ +class WP_HTML_Attribute_Token { + /** + * Attribute name. + * + * @since 6.2.0 + * @var string + */ + public $name; + + /** + * Attribute value. + * + * @since 6.2.0 + * @var int + */ + public $value_starts_at; + + /** + * How many bytes the value occupies in the input HTML. + * + * @since 6.2.0 + * @var int + */ + public $value_length; + + /** + * The string offset where the attribute name starts. + * + * @since 6.2.0 + * @var int + */ + public $start; + + /** + * The string offset after the attribute value or its name. + * + * @since 6.2.0 + * @var int + */ + public $end; + + /** + * Whether the attribute is a boolean attribute with value `true`. + * + * @since 6.2.0 + * @var bool + */ + public $is_true; + + /** + * Constructor. + * + * @since 6.2.0 + * + * @param string $name Attribute name. + * @param int $value_start Attribute value. + * @param int $value_length Number of bytes attribute value spans. + * @param int $start The string offset where the attribute name starts. + * @param int $end The string offset after the attribute value or its name. + * @param bool $is_true Whether the attribute is a boolean attribute with true value. + */ + public function __construct( $name, $value_start, $value_length, $start, $end, $is_true ) { + $this->name = $name; + $this->value_starts_at = $value_start; + $this->value_length = $value_length; + $this->start = $start; + $this->end = $end; + $this->is_true = $is_true; + } +} + +endif; diff --git a/src/wp-includes/class-wp-html-span.php b/src/wp-includes/class-wp-html-span.php new file mode 100644 index 0000000000000..376e391dc1c44 --- /dev/null +++ b/src/wp-includes/class-wp-html-span.php @@ -0,0 +1,56 @@ +<?php +/** + * HTML Span: Represents a textual span inside an HTML document. + * + * @package WordPress + * @subpackage HTML + * @since 6.2.0 + */ + +if ( ! class_exists( 'WP_HTML_Span' ) ) : + +/** + * Represents a textual span inside an HTML document. + * + * This is a two-tuple in disguise, used to avoid the memory + * overhead involved in using an array for the same purpose. + * + * This class is for internal usage of the WP_HTML_Tag_Processor class. + * + * @access private + * @since 6.2.0 + * + * @see WP_HTML_Tag_Processor + */ +class WP_HTML_Span { + /** + * Byte offset into document where span begins. + * + * @since 6.2.0 + * @var int + */ + public $start; + + /** + * Byte offset into document where span ends. + * + * @since 6.2.0 + * @var int + */ + public $end; + + /** + * Constructor. + * + * @since 6.2.0 + * + * @param int $start Byte offset into document where replacement span begins. + * @param int $end Byte offset into document where replacement span ends. + */ + public function __construct( $start, $end ) { + $this->start = $start; + $this->end = $end; + } +} + +endif; diff --git a/src/wp-includes/class-wp-html-tag-processor.php b/src/wp-includes/class-wp-html-tag-processor.php new file mode 100644 index 0000000000000..24e67a3adc83f --- /dev/null +++ b/src/wp-includes/class-wp-html-tag-processor.php @@ -0,0 +1,2047 @@ +<?php +/** + * Scans through an HTML document to find specific tags, then + * transforms those tags by adding, removing, or updating the + * values of the HTML attributes within that tag (opener). + * + * Does not fully parse HTML or _recurse_ into the HTML structure + * Instead this scans linearly through a document and only parses + * the HTML tag openers. + * + * @TODO: Unify language around "currently-opened tag." + * @TODO: Organize unit test cases into normative tests, edge-case tests, regression tests. + * @TODO: Clean up attribute token class after is_true addition + * @TODO: Prune whitespace when removing classes/attributes: e.g. "a b c" -> "c" not " c" + * @TODO: Skip over `/` in attributes area, split attribute names by `/` + * @TODO: Decode HTML references/entities in class names when matching. + * E.g. match having class `1<"2` needs to recognize `class="1<"2"`. + * @TODO: Decode character references in `get_attribute()` + * @TODO: Properly escape attribute value in `set_attribute()` + * @TODO: Add slow mode to escape character entities in CSS class names? + * (This requires a custom decoder since `html_entity_decode()` + * doesn't handle attribute character reference decoding rules. + * + * @package WordPress + * @subpackage HTML + * @since 6.2.0 + */ + +if ( ! class_exists( 'WP_HTML_Tag_Processor' ) ) : + +/** + * Processes an input HTML document by applying a specified set + * of patches to that input. Tokenizes HTML but does not fully + * parse the input document. + * + * ## Usage + * + * Use of this class requires three steps: + * + * 1. Create a new class instance with your input HTML document. + * 2. Find the tag(s) you are looking for. + * 3. Request changes to the attributes in those tag(s). + * + * Example: + * ```php + * $tags = new WP_HTML_Tag_Processor( $html ); + * if ( $tags->next_tag( [ 'tag_name' => 'option' ] ) ) { + * $tags->set_attribute( 'selected', true ); + * } + * ``` + * + * ### Finding tags + * + * The `next_tag()` function moves the internal cursor through + * your input HTML document until it finds a tag meeting any of + * the supplied restrictions in the optional query argument. If + * no argument is provided then it will find the next HTML tag, + * regardless of what kind it is. + * + * If you want to _find whatever the next tag is_: + * ```php + * $tags->next_tag(); + * ``` + * + * | Goal | Query | + * |-----------------------------------------------------------|----------------------------------------------------------------------------| + * | Find any tag. | `$tags->next_tag();` | + * | Find next image tag. | `$tags->next_tag( [ 'tag_name' => 'img' ] );` | + * | Find next tag containing the `fullwidth` CSS class. | `$tags->next_tag( [ 'class_name' => 'fullwidth' ] );` | + * | Find next image tag containing the `fullwidth` CSS class. | `$tags->next_tag( [ 'tag_name' => 'img', 'class_name' => 'fullwidth' ] );` | + * + * If a tag was found meeting your criteria then `next_tag()` + * will return `true` and you can proceed to modify it. If it + * returns `false`, however, it failed to find the tag and + * moved the cursor to the end of the file. + * + * Once the cursor reaches the end of the file the processor + * is done and if you want to reach an earlier tag you will + * need to recreate the processor and start over. The internal + * cursor can only proceed forward, never backing up. + * + * #### Custom queries + * + * Sometimes it's necessary to further inspect an HTML tag than + * the query syntax here permits. In these cases one may further + * inspect the search results using the read-only functions + * provided by the processor or external state or variables. + * + * Example: + * ```php + * // Paint up to the first five DIV or SPAN tags marked with the "jazzy" style. + * $remaining_count = 5; + * while ( $remaining_count > 0 && $tags->next_tag() ) { + * if ( + * ( 'DIV' === $tags->get_tag() || 'SPAN' === $tags->get_tag() ) && + * 'jazzy' === $tags->get_attribute( 'data-style' ) + * ) { + * $tags->add_class( 'theme-style-everest-jazz' ); + * $remaining_count--; + * } + * } + * ``` + * + * `get_attribute()` will return `null` if the attribute wasn't present + * on the tag when it was called. It may return `""` (the empty string) + * in cases where the attribute was present but its value was empty. + * For boolean attributes, those whose name is present but no value is + * given, it will return `true` (the only way to set `false` for an + * attribute is to remove it). + * + * ### Modifying HTML attributes for a found tag + * + * Once you've found the start of an opening tag you can modify + * any number of the attributes on that tag. You can set a new + * value for an attribute, remove the entire attribute, or do + * nothing and move on to the next opening tag. + * + * Example: + * ```php + * if ( $tags->next_tag( [ 'class' => 'wp-group-block' ] ) ) { + * $tags->set_attribute( 'title', 'This groups the contained content.' ); + * $tags->remove_attribute( 'data-test-id' ); + * } + * ``` + * + * If `set_attribute()` is called for an existing attribute it will + * overwrite the existing value. Similarly, calling `remove_attribute()` + * for a non-existing attribute has no effect on the document. Both + * of these methods are safe to call without knowing if a given attribute + * exists beforehand. + * + * ### Modifying CSS classes for a found tag + * + * The tag processor treats the `class` attribute as a special case. + * Because it's a common operation to add or remove CSS classes you + * can do so using this interface. + * + * As with attribute values, adding or removing CSS classes is a safe + * operation that doesn't require checking if the attribute or class + * exists before making changes. If removing the only class then the + * entire `class` attribute will be removed. + * + * Example: + * ```php + * // from `<span>Yippee!</span>` + * // to `<span class="is-active">Yippee!</span>` + * $tags->add_class( 'is-active' ); + * + * // from `<span class="excited">Yippee!</span>` + * // to `<span class="excited is-active">Yippee!</span>` + * $tags->add_class( 'is-active' ); + * + * // from `<span class="is-active heavy-accent">Yippee!</span>` + * // to `<span class="is-active heavy-accent">Yippee!</span>` + * $tags->add_class( 'is-active' ); + * + * // from `<input type="text" class="is-active rugby not-disabled" length="24">` + * // to `<input type="text" class="is-active not-disabled" length="24"> + * $tags->remove_class( 'rugby' ); + * + * // from `<input type="text" class="rugby" length="24">` + * // to `<input type="text" length="24"> + * $tags->remove_class( 'rugby' ); + * + * // from `<input type="text" length="24">` + * // to `<input type="text" length="24"> + * $tags->remove_class( 'rugby' ); + * ``` + * + * ## Design limitations + * + * @TODO: Expand this section + * + * - No nesting: cannot match open and close tag. + * - Class names are not decoded if they contain character references. + * + * @since 6.2.0 + */ +class WP_HTML_Tag_Processor { + /** + * The maximum number of bookmarks allowed to exist at + * any given time. + * + * @see set_bookmark(); + * @since 6.2.0 + * @var int + */ + const MAX_BOOKMARKS = 10; + + /** + * Maximum number of times seek() can be called. + * Prevents accidental infinite loops. + * + * @see seek() + * @since 6.2.0 + * @var int + */ + const MAX_SEEK_OPS = 1000; + + /** + * The HTML document to parse. + * + * @since 6.2.0 + * @var string + */ + private $html; + + /** + * The last query passed to next_tag(). + * + * @since 6.2.0 + * @var array|null + */ + private $last_query; + + /** + * The tag name this processor currently scans for. + * + * @since 6.2.0 + * @var string|null + */ + private $sought_tag_name; + + /** + * The CSS class name this processor currently scans for. + * + * @since 6.2.0 + * @var string|null + */ + private $sought_class_name; + + /** + * The match offset this processor currently scans for. + * + * @since 6.2.0 + * @var int|null + */ + private $sought_match_offset; + + /** + * Whether to visit tag closers, e.g. </div>, when walking an input document. + * + * @since 6.2.0 + * @var boolean + */ + private $stop_on_tag_closers; + + /** + * The updated HTML document. + * + * @since 6.2.0 + * @var string + */ + private $updated_html = ''; + + /** + * How many bytes from the original HTML document were already read. + * + * @since 6.2.0 + * @var int + */ + private $parsed_bytes = 0; + + /** + * How many bytes from the original HTML document were already treated + * with the requested replacements. + * + * @since 6.2.0 + * @var int + */ + private $updated_bytes = 0; + + /** + * Byte offset in input document where current tag name starts. + * + * Example: + * ``` + * <div id="test">... + * 01234 + * - tag name starts at 1 + * ``` + * + * @since 6.2.0 + * @var ?int + */ + private $tag_name_starts_at; + + /** + * Byte length of current tag name. + * + * Example: + * ``` + * <div id="test">... + * 01234 + * --- tag name length is 3 + * ``` + * + * @since 6.2.0 + * @var ?int + */ + private $tag_name_length; + + /** + * Byte offset in input document where current tag token ends. + * + * Example: + * ``` + * <div id="test">... + * 0 1 | + * 01234567890123456 + * --- tag name ends at 14 + * ``` + * + * @since 6.2.0 + * @var ?int + */ + private $tag_ends_at; + + /** + * Whether the current tag is an opening tag, e.g. <div>, or a closing tag, e.g. </div>. + * + * @var boolean + */ + private $is_closing_tag; + + /** + * Lazily-built index of attributes found within an HTML tag, keyed by the attribute name. + * + * Example: + * <code> + * // supposing the parser is working through this content + * // and stops after recognizing the `id` attribute + * // <div id="test-4" class=outline title="data:text/plain;base64=asdk3nk1j3fo8"> + * // ^ parsing will continue from this point + * $this->attributes = [ + * 'id' => new WP_HTML_Attribute_Match( 'id', null, 6, 17 ) + * ]; + * + * // when picking up parsing again, or when asking to find the + * // `class` attribute we will continue and add to this array + * $this->attributes = [ + * 'id' => new WP_HTML_Attribute_Match( 'id', null, 6, 17 ), + * 'class' => new WP_HTML_Attribute_Match( 'class', 'outline', 18, 32 ) + * ]; + * + * // Note that only the `class` attribute value is stored in the index. + * // That's because it is the only value used by this class at the moment. + * </code> + * + * @since 6.2.0 + * @var WP_HTML_Attribute_Token[] + */ + private $attributes = array(); + + /** + * Which class names to add or remove from a tag. + * + * These are tracked separately from attribute updates because they are + * semantically distinct, whereas this interface exists for the common + * case of adding and removing class names while other attributes are + * generally modified as with DOM `setAttribute` calls. + * + * When modifying an HTML document these will eventually be collapsed + * into a single lexical update to replace the `class` attribute. + * + * Example: + * <code> + * // Add the `wp-block-group` class, remove the `wp-group` class. + * $classname_updates = [ + * // Indexed by a comparable class name + * 'wp-block-group' => WP_HTML_Tag_Processor::ADD_CLASS, + * 'wp-group' => WP_HTML_Tag_Processor::REMOVE_CLASS + * ]; + * </code> + * + * @since 6.2.0 + * @var bool[] + */ + private $classname_updates = array(); + + /** + * Tracks a semantic location in the original HTML which + * shifts with updates as they are applied to the document. + * + * @since 6.2.0 + * @var WP_HTML_Span[] + */ + private $bookmarks = array(); + + const ADD_CLASS = true; + const REMOVE_CLASS = false; + const SKIP_CLASS = null; + + /** + * Lexical replacements to apply to input HTML document. + * + * HTML modifications collapse into lexical replacements in order to + * provide an efficient mechanism to update documents lazily and in + * order to support a variety of semantic modifications without + * building a complicated parsing machinery. That is, it's up to + * the calling class to generate the lexical modification from the + * semantic change requested. + * + * Example: + * <code> + * // Replace an attribute stored with a new value, indices + * // sourced from the lazily-parsed HTML recognizer. + * $start = $attributes['src']->start; + * $end = $attributes['src']->end; + * $modifications[] = new WP_HTML_Text_Replacement( $start, $end, get_the_post_thumbnail_url() ); + * + * // Correspondingly, something like this + * // will appear in the replacements array. + * $replacements = [ + * WP_HTML_Text_Replacement( 14, 28, 'https://my-site.my-domain/wp-content/uploads/2014/08/kittens.jpg' ) + * ]; + * </code> + * + * @since 6.2.0 + * @var WP_HTML_Text_Replacement[] + */ + private $lexical_updates = array(); + + /** + * Tracks how many times we've performed a `seek()` + * so that we can prevent accidental infinite loops. + * + * @see seek + * @since 6.2.0 + * @var int + */ + private $seek_count = 0; + + /** + * Constructor. + * + * @since 6.2.0 + * + * @param string $html HTML to process. + */ + public function __construct( $html ) { + $this->html = $html; + } + + /** + * Finds the next tag matching the $query. + * + * @since 6.2.0 + * + * @param array|string $query { + * Which tag name to find, having which class, etc. + * + * @type string|null $tag_name Which tag to find, or `null` for "any tag." + * @type int|null $match_offset Find the Nth tag matching all search criteria. + * 0 for "first" tag, 2 for "third," etc. + * Defaults to first tag. + * @type string|null $class_name Tag must contain this whole class name to match. + * } + * @return boolean Whether a tag was matched. + */ + public function next_tag( $query = null ) { + $this->parse_query( $query ); + $already_found = 0; + + do { + if ( $this->parsed_bytes >= strlen( $this->html ) ) { + return false; + } + + /* + * Unfortunately we can't try to search for only the tag name we want because that might + * lead us to skip over other tags and lose track of our place. So we need to search for + * _every_ tag and then check after we find one if it's the one we are looking for. + */ + if ( false === $this->parse_next_tag() ) { + $this->parsed_bytes = strlen( $this->html ); + + return false; + } + + while ( $this->parse_next_attribute() ) { + continue; + } + + $tag_ends_at = strpos( $this->html, '>', $this->parsed_bytes ); + if ( false === $tag_ends_at ) { + return false; + } + $this->tag_ends_at = $tag_ends_at; + $this->parsed_bytes = $tag_ends_at; + + if ( $this->matches() ) { + ++$already_found; + } + + // Avoid copying the tag name string when possible. + $t = $this->html[ $this->tag_name_starts_at ]; + if ( 's' === $t || 'S' === $t || 't' === $t || 'T' === $t ) { + $tag_name = $this->get_tag(); + + if ( 'SCRIPT' === $tag_name && ! $this->skip_script_data() ) { + $this->parsed_bytes = strlen( $this->html ); + return false; + } elseif ( + ( 'TEXTAREA' === $tag_name || 'TITLE' === $tag_name ) && + ! $this->skip_rcdata( $tag_name ) + ) { + $this->parsed_bytes = strlen( $this->html ); + return false; + } + } + } while ( $already_found < $this->sought_match_offset ); + + return true; + } + + + /** + * Sets a bookmark in the HTML document. + * + * Bookmarks represent specific places or tokens in the HTML + * document, such as a tag opener or closer. When applying + * edits to a document, such as setting an attribute, the + * text offsets of that token may shift; the bookmark is + * kept updated with those shifts and remains stable unless + * the entire span of text in which the token sits is removed. + * + * Release bookmarks when they are no longer needed. + * + * Example: + * ``` + * <main><h2>Surprising fact you may not know!</h2></main> + * ^ ^ + * \-|-- this `H2` opener bookmark tracks the token + * + * <main class="clickbait"><h2>Surprising fact you may no… + * ^ ^ + * \-|-- it shifts with edits + * ``` + * + * Bookmarks provide the ability to seek to a previously-scanned + * place in the HTML document. This avoids the need to re-scan + * the entire thing. + * + * Example: + * ``` + * <ul><li>One</li><li>Two</li><li>Three</li></ul> + * ^^^^ + * want to note this last item + * + * $p = new WP_HTML_Tag_Processor( $html ); + * $in_list = false; + * while ( $p->next_tag( [ 'tag_closers' => $in_list ? 'visit' : 'skip' ] ) ) { + * if ( 'UL' === $p->get_tag() ) { + * if ( $p->is_tag_closer() ) { + * $in_list = false; + * $p->set_bookmark( 'resume' ); + * if ( $p->seek( 'last-li' ) ) { + * $p->add_class( 'last-li' ); + * } + * $p->seek( 'resume' ); + * $p->release_bookmark( 'last-li' ); + * $p->release_bookmark( 'resume' ); + * } else { + * $in_list = true; + * } + * } + * + * if ( 'LI' === $p->get_tag() ) { + * $p->set_bookmark( 'last-li' ); + * } + * } + * ``` + * + * Because bookmarks maintain their position they don't + * expose any internal offsets for the HTML document + * and can't be used with normal string functions. + * + * Because bookmarks allocate memory and require processing + * for every applied update they are limited and require + * a name. They should not be created inside a loop. + * + * Bookmarks are a powerful tool to enable complicated behavior; + * consider double-checking that you need this tool if you are + * reaching for it, as inappropriate use could lead to broken + * HTML structure or unwanted processing overhead. + * + * @param string $name Identifies this particular bookmark. + * @return false|void + * @throws Exception Throws on invalid bookmark name if WP_DEBUG set. + */ + public function set_bookmark( $name ) { + if ( null === $this->tag_name_starts_at ) { + return false; + } + + if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= self::MAX_BOOKMARKS ) { + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + throw new Exception( "Tried to jump to a non-existent HTML bookmark {$name}." ); + } + return false; + } + + $this->bookmarks[ $name ] = new WP_HTML_Span( + $this->tag_name_starts_at - 1, + $this->tag_ends_at + ); + + return true; + } + + + /** + * Removes a bookmark if you no longer need to use it. + * + * Releasing a bookmark frees up the small performance + * overhead they require, mainly in the form of compute + * costs when modifying the document. + * + * @param string $name Name of the bookmark to remove. + * @return bool + */ + public function release_bookmark( $name ) { + if ( ! array_key_exists( $name, $this->bookmarks ) ) { + return false; + } + + unset( $this->bookmarks[ $name ] ); + + return true; + } + + + /** + * Skips the contents of the title and textarea tags until an appropriate + * tag closer is found. + * + * @see https://html.spec.whatwg.org/multipage/parsing.html#rcdata-state + * @param string $tag_name – the lowercase tag name which will close the RCDATA region. + * @since 6.2.0 + */ + private function skip_rcdata( $tag_name ) { + $html = $this->html; + $doc_length = strlen( $html ); + $tag_length = strlen( $tag_name ); + + $at = $this->parsed_bytes; + + while ( false !== $at && $at < $doc_length ) { + $at = strpos( $this->html, '</', $at ); + + // If we have no possible tag closer then fail. + if ( false === $at || ( $at + $tag_length ) >= $doc_length ) { + $this->parsed_bytes = $doc_length; + return false; + } + + $at += 2; + + /* + * We have to find a case-insensitive match to the tag name. + * Note also that since tag names are limited to US-ASCII + * characters we can ignore any kind of Unicode normalizing + * forms when comparing. If we get a non-ASCII character it + * will never be a match. + */ + for ( $i = 0; $i < $tag_length; $i++ ) { + $tag_char = $tag_name[ $i ]; + $html_char = $html[ $at + $i ]; + + if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) { + $at += $i; + continue 2; + } + } + + $at += $tag_length; + $this->parsed_bytes = $at; + + /* + * Ensure we terminate the tag name, otherwise we might, + * for example, accidentally match the sequence + * "</textarearug>" for "</textarea>". + */ + $c = $html[ $at ]; + if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) { + continue; + } + + while ( $this->parse_next_attribute() ) { + continue; + } + $at = $this->parsed_bytes; + if ( $at >= strlen( $this->html ) ) { + return false; + } + + if ( '>' === $html[ $at ] || '/' === $html[ $at ] ) { + ++$this->parsed_bytes; + return true; + } + } + + return false; + } + + /** + * Skips the contents of <script> tags. + * + * @since 6.2.0 + */ + private function skip_script_data() { + $state = 'unescaped'; + $html = $this->html; + $doc_length = strlen( $html ); + $at = $this->parsed_bytes; + + while ( false !== $at && $at < $doc_length ) { + $at += strcspn( $html, '-<', $at ); + + /* + * Regardless of the state we're in, a "-->" + * will break out of it and bring us back + * into the normal unescaped script mode. + */ + if ( + $at + 2 < $doc_length && + '-' === $html[ $at ] && + '-' === $html[ $at + 1 ] && + '>' === $html[ $at + 2 ] + ) { + $at += 3; + $state = 'unescaped'; + continue; + } + + // Everything past here has to start with "<". + if ( $at + 1 >= $doc_length || '<' !== $html[ $at++ ] ) { + continue; + } + + /* + * On the other hand, "<!--" only enters the + * escaped mode if we aren't already there. + * + * Inside the escaped modes it's ignored and + * shouldn't ever pull us out of double-escaped + * and back into escaped. + * + * We'll continue parsing past it regardless of + * our state though to avoid backtracking once + * we recognize the snippet. + */ + if ( + $at + 2 < $doc_length && + '!' === $html[ $at ] && + '-' === $html[ $at + 1 ] && + '-' === $html[ $at + 2 ] + ) { + $at += 3; + $state = 'unescaped' === $state ? 'escaped' : $state; + continue; + } + + if ( '/' === $html[ $at ] ) { + $is_closing = true; + ++$at; + } else { + $is_closing = false; + } + + /* + * At this point we're only examining state-changes based off of + * the <script> or </script> tags, so if we're not seeing the + * start of one of these tokens we can proceed to the next + * potential match in the text. + */ + if ( ! ( + $at + 6 < $doc_length && + ( 's' === $html[ $at ] || 'S' === $html[ $at ] ) && + ( 'c' === $html[ $at + 1 ] || 'C' === $html[ $at + 1 ] ) && + ( 'r' === $html[ $at + 2 ] || 'R' === $html[ $at + 2 ] ) && + ( 'i' === $html[ $at + 3 ] || 'I' === $html[ $at + 3 ] ) && + ( 'p' === $html[ $at + 4 ] || 'P' === $html[ $at + 4 ] ) && + ( 't' === $html[ $at + 5 ] || 'T' === $html[ $at + 5 ] ) + ) ) { + ++$at; + continue; + } + + /* + * We also have to make sure we terminate the script tag opener/closer + * to avoid making partial matches on strings like `<script123`. + */ + if ( $at + 6 >= $doc_length ) { + continue; + } + $at += 6; + $c = $html[ $at ]; + if ( ' ' !== $c && "\t" !== $c && "\r" !== $c && "\n" !== $c && '/' !== $c && '>' !== $c ) { + ++$at; + continue; + } + + if ( 'escaped' === $state && ! $is_closing ) { + $state = 'double-escaped'; + continue; + } + + if ( 'double-escaped' === $state && $is_closing ) { + $state = 'escaped'; + continue; + } + + if ( $is_closing ) { + $this->parsed_bytes = $at; + if ( $this->parsed_bytes >= $doc_length ) { + return false; + } + + while ( $this->parse_next_attribute() ) { + continue; + } + + if ( '>' === $html[ $this->parsed_bytes ] ) { + ++$this->parsed_bytes; + return true; + } + } + + ++$at; + } + + return false; + } + + /** + * Parses the next tag. + * + * @since 6.2.0 + */ + private function parse_next_tag() { + $this->after_tag(); + + $html = $this->html; + $doc_length = strlen( $html ); + $at = $this->parsed_bytes; + + while ( false !== $at && $at < $doc_length ) { + $at = strpos( $html, '<', $at ); + if ( false === $at ) { + return false; + } + + if ( '/' === $this->html[ $at + 1 ] ) { + $this->is_closing_tag = true; + $at++; + } else { + $this->is_closing_tag = false; + } + + /* + * HTML tag names must start with [a-zA-Z] otherwise they are not tags. + * For example, "<3" is rendered as text, not a tag opener. This means + * if we have at least one letter following the "<" then we _do_ have + * a tag opener and can process it as such. This is more common than + * HTML comments, DOCTYPE tags, and other structure starting with "<" + * so it's good to check first for the presence of the tag. + * + * Reference: + * * https://html.spec.whatwg.org/multipage/parsing.html#data-state + * * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state + */ + $tag_name_prefix_length = strspn( $html, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', $at + 1 ); + if ( $tag_name_prefix_length > 0 ) { + ++$at; + $this->tag_name_length = $tag_name_prefix_length + strcspn( $html, " \t\f\r\n/>", $at + $tag_name_prefix_length ); + $this->tag_name_starts_at = $at; + $this->parsed_bytes = $at + $this->tag_name_length; + return true; + } + + // If we didn't find a tag opener, and we can't be + // transitioning into different markup states, then + // we can abort because there aren't any more tags. + if ( $at + 1 >= strlen( $html ) ) { + return false; + } + + // <! transitions to markup declaration open state + // https://html.spec.whatwg.org/multipage/parsing.html#markup-declaration-open-state + if ( '!' === $html[ $at + 1 ] ) { + // <!-- transitions to a bogus comment state – we can skip to the nearest --> + // https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state + if ( + strlen( $html ) > $at + 3 && + '-' === $html[ $at + 2 ] && + '-' === $html[ $at + 3 ] + ) { + $closer_at = strpos( $html, '-->', $at + 4 ); + if ( false === $closer_at ) { + return false; + } + + $at = $closer_at + 3; + continue; + } + + // <![CDATA[ transitions to CDATA section state – we can skip to the nearest ]]> + // The CDATA is case-sensitive. + // https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state + if ( + strlen( $html ) > $at + 8 && + '[' === $html[ $at + 2 ] && + 'C' === $html[ $at + 3 ] && + 'D' === $html[ $at + 4 ] && + 'A' === $html[ $at + 5 ] && + 'T' === $html[ $at + 6 ] && + 'A' === $html[ $at + 7 ] && + '[' === $html[ $at + 8 ] + ) { + $closer_at = strpos( $html, ']]>', $at + 9 ); + if ( false === $closer_at ) { + return false; + } + + $at = $closer_at + 3; + continue; + } + + /* + * <!DOCTYPE transitions to DOCTYPE state – we can skip to the nearest > + * These are ASCII-case-insensitive. + * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state + */ + if ( + strlen( $html ) > $at + 8 && + 'D' === strtoupper( $html[ $at + 2 ] ) && + 'O' === strtoupper( $html[ $at + 3 ] ) && + 'C' === strtoupper( $html[ $at + 4 ] ) && + 'T' === strtoupper( $html[ $at + 5 ] ) && + 'Y' === strtoupper( $html[ $at + 6 ] ) && + 'P' === strtoupper( $html[ $at + 7 ] ) && + 'E' === strtoupper( $html[ $at + 8 ] ) + ) { + $closer_at = strpos( $html, '>', $at + 9 ); + if ( false === $closer_at ) { + return false; + } + + $at = $closer_at + 1; + continue; + } + + /* + * Anything else here is an incorrectly-opened comment and transitions + * to the bogus comment state - we can skip to the nearest >. + */ + $at = strpos( $html, '>', $at + 1 ); + continue; + } + + /* + * <? transitions to a bogus comment state – we can skip to the nearest > + * https://html.spec.whatwg.org/multipage/parsing.html#tag-open-state + */ + if ( '?' === $html[ $at + 1 ] ) { + $closer_at = strpos( $html, '>', $at + 2 ); + if ( false === $closer_at ) { + return false; + } + + $at = $closer_at + 1; + continue; + } + + ++$at; + } + + return false; + } + + /** + * Parses the next attribute. + * + * @since 6.2.0 + */ + private function parse_next_attribute() { + // Skip whitespace and slashes. + $this->parsed_bytes += strspn( $this->html, " \t\f\r\n/", $this->parsed_bytes ); + if ( $this->parsed_bytes >= strlen( $this->html ) ) { + return false; + } + + /* + * Treat the equal sign ("=") as a part of the attribute name if it is the + * first encountered byte: + * https://html.spec.whatwg.org/multipage/parsing.html#before-attribute-name-state + */ + $name_length = '=' === $this->html[ $this->parsed_bytes ] + ? 1 + strcspn( $this->html, "=/> \t\f\r\n", $this->parsed_bytes + 1 ) + : strcspn( $this->html, "=/> \t\f\r\n", $this->parsed_bytes ); + + // No attribute, just tag closer. + if ( 0 === $name_length || $this->parsed_bytes + $name_length >= strlen( $this->html ) ) { + return false; + } + + $attribute_start = $this->parsed_bytes; + $attribute_name = substr( $this->html, $attribute_start, $name_length ); + $this->parsed_bytes += $name_length; + if ( $this->parsed_bytes >= strlen( $this->html ) ) { + return false; + } + + $this->skip_whitespace(); + if ( $this->parsed_bytes >= strlen( $this->html ) ) { + return false; + } + + $has_value = '=' === $this->html[ $this->parsed_bytes ]; + if ( $has_value ) { + ++$this->parsed_bytes; + $this->skip_whitespace(); + if ( $this->parsed_bytes >= strlen( $this->html ) ) { + return false; + } + + switch ( $this->html[ $this->parsed_bytes ] ) { + case "'": + case '"': + $quote = $this->html[ $this->parsed_bytes ]; + $value_start = $this->parsed_bytes + 1; + $value_length = strcspn( $this->html, $quote, $value_start ); + $attribute_end = $value_start + $value_length + 1; + $this->parsed_bytes = $attribute_end; + break; + + default: + $value_start = $this->parsed_bytes; + $value_length = strcspn( $this->html, "> \t\f\r\n", $value_start ); + $attribute_end = $value_start + $value_length; + $this->parsed_bytes = $attribute_end; + } + } else { + $value_start = $this->parsed_bytes; + $value_length = 0; + $attribute_end = $attribute_start + $name_length; + } + + if ( $attribute_end >= strlen( $this->html ) ) { + return false; + } + + if ( $this->is_closing_tag ) { + return true; + } + + /* + * > There must never be two or more attributes on + * > the same start tag whose names are an ASCII + * > case-insensitive match for each other. + * - HTML 5 spec + * + * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive + */ + $comparable_name = strtolower( $attribute_name ); + + // If an attribute is listed many times, only use the first declaration and ignore the rest. + if ( ! array_key_exists( $comparable_name, $this->attributes ) ) { + $this->attributes[ $comparable_name ] = new WP_HTML_Attribute_Token( + $attribute_name, + $value_start, + $value_length, + $attribute_start, + $attribute_end, + ! $has_value + ); + } + + return $this->attributes[ $comparable_name ]; + } + + /** + * Move the pointer past any immediate successive whitespace. + * + * @since 6.2.0 + * + * @return void + */ + private function skip_whitespace() { + $this->parsed_bytes += strspn( $this->html, " \t\f\r\n", $this->parsed_bytes ); + } + + /** + * Applies attribute updates and cleans up once a tag is fully parsed. + * + * @since 6.2.0 + * + * @return void + */ + private function after_tag() { + $this->class_name_updates_to_attributes_updates(); + $this->apply_attributes_updates(); + $this->tag_name_starts_at = null; + $this->tag_name_length = null; + $this->tag_ends_at = null; + $this->is_closing_tag = null; + $this->attributes = array(); + } + + /** + * Converts class name updates into tag attributes updates + * (they are accumulated in different data formats for performance). + * + * @return void + * @since 6.2.0 + * + * @see $classname_updates + * @see $lexical_updates + */ + private function class_name_updates_to_attributes_updates() { + if ( count( $this->classname_updates ) === 0 ) { + return; + } + + $existing_class = $this->get_enqueued_attribute_value( 'class' ); + if ( null === $existing_class || true === $existing_class ) { + $existing_class = ''; + } + + if ( false === $existing_class && isset( $this->attributes['class'] ) ) { + $existing_class = substr( + $this->html, + $this->attributes['class']->value_starts_at, + $this->attributes['class']->value_length + ); + } + + if ( false === $existing_class ) { + $existing_class = ''; + } + + /** + * Updated "class" attribute value. + * + * This is incrementally built as we scan through the existing class + * attribute, omitting removed classes as we do so, and then appending + * added classes at the end. Only when we're done processing will the + * value contain the final new value. + + * @var string + */ + $class = ''; + + /** + * Tracks the cursor position in the existing class + * attribute value where we're currently parsing. + * + * @var integer + */ + $at = 0; + + /** + * Indicates if we have made any actual modifications to the existing + * class attribute value, used to short-circuit string copying. + * + * It's possible that we are intending to remove certain classes and + * add others in such a way that we don't modify the existing value + * because calls to `add_class()` and `remove_class()` occur + * independent of the input values sent to the WP_HTML_Tag_Processor. That is, we + * might call `remove_class()` for a class that isn't already present + * and we might call `add_class()` for one that is, in which case we + * wouldn't need to break apart the string and rebuild it. + * + * This flag is set upon the first change that requires a string update. + * + * @var boolean + */ + $modified = false; + + // Remove unwanted classes by only copying the new ones. + $existing_class_length = strlen( $existing_class ); + while ( $at < $existing_class_length ) { + // Skip to the first non-whitespace character. + $ws_at = $at; + $ws_length = strspn( $existing_class, " \t\f\r\n", $ws_at ); + $at += $ws_length; + + // Capture the class name – it's everything until the next whitespace. + $name_length = strcspn( $existing_class, " \t\f\r\n", $at ); + if ( 0 === $name_length ) { + // We're done, no more class names. + break; + } + + $name = substr( $existing_class, $at, $name_length ); + $at += $name_length; + + // If this class is marked for removal, start processing the next one. + $remove_class = ( + isset( $this->classname_updates[ $name ] ) && + self::REMOVE_CLASS === $this->classname_updates[ $name ] + ); + + // Once we've seen a class, we should never add it again. + if ( ! $remove_class ) { + $this->classname_updates[ $name ] = self::SKIP_CLASS; + } + + if ( $remove_class ) { + $modified = true; + continue; + } + + /* + * Otherwise, append it to the new "class" attribute value. + * + * By preserving the existing whitespace instead of only adding a single + * space (which is a valid transformation we can make) we'll introduce + * fewer changes to the HTML content and hopefully make comparing + * before/after easier for people trying to debug the modified output. + */ + $class .= substr( $existing_class, $ws_at, $ws_length ); + $class .= $name; + } + + // Add new classes by appending the ones we haven't already seen. + foreach ( $this->classname_updates as $name => $operation ) { + if ( self::ADD_CLASS === $operation ) { + $modified = true; + + $class .= strlen( $class ) > 0 ? ' ' : ''; + $class .= $name; + } + } + + $this->classname_updates = array(); + if ( ! $modified ) { + return; + } + + if ( strlen( $class ) > 0 ) { + $this->set_attribute( 'class', $class ); + } else { + $this->remove_attribute( 'class' ); + } + } + + /** + * Applies updates to attributes. + * + * @since 6.2.0 + */ + private function apply_attributes_updates() { + if ( ! count( $this->lexical_updates ) ) { + return; + } + + /* + * Attribute updates can be enqueued in any order but as we + * progress through the document to replace them we have to + * make our replacements in the order in which they are found + * in that document. + * + * Sorting the updates ensures we don't make our replacements + * out of order, which could otherwise lead to mangled output, + * partially-duplicate attributes, and overwritten attributes. + */ + usort( $this->lexical_updates, array( self::class, 'sort_start_ascending' ) ); + + foreach ( $this->lexical_updates as $diff ) { + $this->updated_html .= substr( $this->html, $this->updated_bytes, $diff->start - $this->updated_bytes ); + $this->updated_html .= $diff->text; + $this->updated_bytes = $diff->end; + } + + foreach ( $this->bookmarks as $bookmark ) { + /* + * As we loop through $this->lexical_updates, we keep comparing + * $bookmark->start and $bookmark->end to $diff->start. We can't + * change it and still expect the correct result, so let's accumulate + * the deltas separately and apply them all at once after the loop. + */ + $head_delta = 0; + $tail_delta = 0; + + foreach ( $this->lexical_updates as $diff ) { + $update_head = $bookmark->start >= $diff->start; + $update_tail = $bookmark->end >= $diff->start; + + if ( ! $update_head && ! $update_tail ) { + break; + } + + $delta = strlen( $diff->text ) - ( $diff->end - $diff->start ); + + if ( $update_head ) { + $head_delta += $delta; + } + + if ( $update_tail ) { + $tail_delta += $delta; + } + } + + $bookmark->start += $head_delta; + $bookmark->end += $tail_delta; + } + + $this->lexical_updates = array(); + } + + /** + * Move the current pointer in the Tag Processor to a given bookmark's location. + * + * In order to prevent accidental infinite loops, there's a + * maximum limit on the number of times seek() can be called. + * + * @param string $bookmark_name Jump to the place in the document identified by this bookmark name. + * @return bool + * @throws Exception Throws on invalid bookmark name if WP_DEBUG set. + */ + public function seek( $bookmark_name ) { + if ( ! array_key_exists( $bookmark_name, $this->bookmarks ) ) { + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + throw new Exception( 'Invalid bookmark name' ); + } + return false; + } + + if ( ++$this->seek_count > self::MAX_SEEK_OPS ) { + if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { + throw new Exception( 'Too many calls to seek() - this can lead to performance issues.' ); + } + return false; + } + + // Flush out any pending updates to the document. + $this->get_updated_html(); + + // Point this tag processor before the sought tag opener and consume it. + $this->parsed_bytes = $this->bookmarks[ $bookmark_name ]->start; + $this->updated_bytes = $this->parsed_bytes; + $this->updated_html = substr( $this->html, 0, $this->updated_bytes ); + return $this->next_tag(); + } + + /** + * Compare two WP_HTML_Text_Replacement objects. + * + * @since 6.2.0 + * + * @param WP_HTML_Text_Replacement $a First attribute update. + * @param WP_HTML_Text_Replacement $b Second attribute update. + * @return integer + */ + private static function sort_start_ascending( $a, $b ) { + $by_start = $a->start - $b->start; + if ( 0 !== $by_start ) { + return $by_start; + } + + $by_text = isset( $a->text, $b->text ) ? strcmp( $a->text, $b->text ) : 0; + if ( 0 !== $by_text ) { + return $by_text; + } + + /* + * We shouldn't ever get here because it would imply + * that we have two identical updates, or that we're + * trying to replace the same input text twice. Still + * we'll handle this sort to preserve determinism, + * which might come in handy when debugging. + */ + return $a->end - $b->end; + } + + /** + * Return the enqueued value for a given attribute, if one exists. + * + * Enqueued updates can take different data types: + * - If an update is enqueued and is boolean, the return will be `true` + * - If an update is otherwise enqueued, the return will be the string value of that update. + * - If an attribute is enqueued to be removed, the return will be `null` to indicate that. + * - If no updates are enqueued, the return will be `false` to differentiate from "removed." + * + * @since 6.2.0 + * + * @param string $comparable_name The attribute name in its comparable form. + * @return string|boolean|null Value of enqueued update if present, otherwise false. + */ + private function get_enqueued_attribute_value( $comparable_name ) { + if ( ! isset( $this->lexical_updates[ $comparable_name ] ) ) { + return false; + } + + $enqueued_text = $this->lexical_updates[ $comparable_name ]->text; + + // Removed attributes erase the entire span. + if ( '' === $enqueued_text ) { + return null; + } + + /* + * Boolean attribute updates are just the attribute name without a corresponding value. + * + * This value might differ from the given comparable name in that there could be leading + * or trailing whitespace, and that the casing follows the name given in `set_attribute`. + * + * Example: + * ``` + * $p->set_attribute( 'data-TEST-id', 'update' ); + * 'update' === $p->get_enqueued_attribute_value( 'data-test-id' ); + * ``` + * + * Here we detect this based on the absence of the `=`, which _must_ exist in any + * attribute containing a value, e.g. `<input type="text" enabled />`. + * ¹ ² + * 1. Attribute with a string value. + * 2. Boolean attribute whose value is `true`. + */ + $equals_at = strpos( $enqueued_text, '=' ); + if ( false === $equals_at ) { + return true; + } + + /* + * Finally, a normal update's value will appear after the `=` and + * be double-quoted, as performed incidentally by `set_attribute`. + * + * e.g. `type="text"` + * ¹² ³ + * 1. Equals is here. + * 2. Double-quoting starts one after the equals sign. + * 3. Double-quoting ends at the last character in the update. + */ + $enqueued_value = substr( $enqueued_text, $equals_at + 2, -1 ); + return html_entity_decode( $enqueued_value ); + } + + /** + * Returns the value of the parsed attribute in the currently-opened tag. + * + * Example: + * <code> + * $p = new WP_HTML_Tag_Processor( '<div enabled class="test" data-test-id="14">Test</div>' ); + * $p->next_tag( [ 'class_name' => 'test' ] ) === true; + * $p->get_attribute( 'data-test-id' ) === '14'; + * $p->get_attribute( 'enabled' ) === true; + * $p->get_attribute( 'aria-label' ) === null; + * + * $p->next_tag( [] ) === false; + * $p->get_attribute( 'class' ) === null; + * </code> + * + * @since 6.2.0 + * + * @param string $name Name of attribute whose value is requested. + * @return string|true|null Value of attribute or `null` if not available. + * Boolean attributes return `true`. + */ + public function get_attribute( $name ) { + if ( null === $this->tag_name_starts_at ) { + return null; + } + + $comparable = strtolower( $name ); + + /* + * For every attribute other than `class` we can perform a quick check if there's an + * enqueued lexical update whose value we should prefer over what's in the input HTML. + * + * The `class` attribute is special though because we expose the helpers `add_class` + * and `remove_class` which form a builder for the `class` attribute, so we have to + * additionally check if there are any enqueued class changes. If there are, we need + * to first flush them out so can report the full string value of the attribute. + */ + if ( 'class' === $name ) { + $this->class_name_updates_to_attributes_updates(); + } + + // If we have an update for this attribute, return the updated value. + $enqueued_value = $this->get_enqueued_attribute_value( $comparable ); + if ( false !== $enqueued_value ) { + return $enqueued_value; + } + + if ( ! isset( $this->attributes[ $comparable ] ) ) { + return null; + } + + $attribute = $this->attributes[ $comparable ]; + + /* + * This flag distinguishes an attribute with no value + * from an attribute with an empty string value. For + * unquoted attributes this could look very similar. + * It refers to whether an `=` follows the name. + * + * e.g. <div boolean-attribute empty-attribute=></div> + * ¹ ² + * 1. Attribute `boolean-attribute` is `true`. + * 2. Attribute `empty-attribute` is `""`. + */ + if ( true === $attribute->is_true ) { + return true; + } + + $raw_value = substr( $this->html, $attribute->value_starts_at, $attribute->value_length ); + + return html_entity_decode( $raw_value ); + } + + /** + * Returns the lowercase names of all attributes matching a given prefix in the currently-opened tag. + * + * Note that matching is case-insensitive. This is in accordance with the spec: + * + * > There must never be two or more attributes on + * > the same start tag whose names are an ASCII + * > case-insensitive match for each other. + * - HTML 5 spec + * + * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive + * + * Example: + * <code> + * $p = new WP_HTML_Tag_Processor( '<div data-ENABLED class="test" DATA-test-id="14">Test</div>' ); + * $p->next_tag( [ 'class_name' => 'test' ] ) === true; + * $p->get_attribute_names_with_prefix( 'data-' ) === array( 'data-enabled', 'data-test-id' ); + * + * $p->next_tag( [] ) === false; + * $p->get_attribute_names_with_prefix( 'data-' ) === null; + * </code> + * + * @since 6.2.0 + * + * @param string $prefix Prefix of requested attribute names. + * @return array|null List of attribute names, or `null` if not at a tag. + */ + function get_attribute_names_with_prefix( $prefix ) { + if ( $this->is_closing_tag || null === $this->tag_name_starts_at ) { + return null; + } + + $comparable = strtolower( $prefix ); + + $matches = array(); + foreach ( array_keys( $this->attributes ) as $attr_name ) { + if ( str_starts_with( $attr_name, $comparable ) ) { + $matches[] = $attr_name; + } + } + return $matches; + } + + /** + * Returns the lowercase name of the currently-opened tag. + * + * Example: + * <code> + * $p = new WP_HTML_Tag_Processor( '<DIV CLASS="test">Test</DIV>' ); + * $p->next_tag( [] ) === true; + * $p->get_tag() === 'DIV'; + * + * $p->next_tag( [] ) === false; + * $p->get_tag() === null; + * </code> + * + * @since 6.2.0 + * + * @return string|null Name of current tag in input HTML, or `null` if none currently open. + */ + public function get_tag() { + if ( null === $this->tag_name_starts_at ) { + return null; + } + + $tag_name = substr( $this->html, $this->tag_name_starts_at, $this->tag_name_length ); + + return strtoupper( $tag_name ); + } + + /** + * Indicates if the current tag token is a tag closer. + * + * Example: + * <code> + * $p = new WP_HTML_Tag_Processor( '<div></div>' ); + * $p->next_tag( [ 'tag_name' => 'div', 'tag_closers' => 'visit' ] ); + * $p->is_tag_closer() === false; + * + * $p->next_tag( [ 'tag_name' => 'div', 'tag_closers' => 'visit' ] ); + * $p->is_tag_closer() === true; + * </code> + * + * @return bool + */ + public function is_tag_closer() { + return $this->is_closing_tag; + } + + /** + * Updates or creates a new attribute on the currently matched tag with the value passed. + * + * For boolean attributes special handling is provided: + * - When `true` is passed as the value, then only the attribute name is added to the tag. + * - When `false` is passed, the attribute gets removed if it existed before. + * + * For string attributes, the value is escaped using the `esc_attr` function. + * + * @since 6.2.0 + * + * @param string $name The attribute name to target. + * @param string|boolean $value The new attribute value. + * @throws Exception When WP_DEBUG is true and the attribute name is invalid. + */ + public function set_attribute( $name, $value ) { + if ( $this->is_closing_tag || null === $this->tag_name_starts_at ) { + return false; + } + + /* + * Verify that the attribute name is allowable. In WP_DEBUG + * environments we want to crash quickly to alert developers + * of typos and issues; but in production we don't want to + * interrupt a normal page view, so we'll silently avoid + * updating the attribute in those cases. + * + * Of note, we're disallowing more characters than are strictly + * forbidden in HTML5. This is to prevent additional security + * risks deeper in the WordPress and plugin stack. Specifically + * we reject the less-than (<) greater-than (>) and ampersand (&). + * + * The use of a PCRE match allows us to look for specific Unicode + * code points without writing a UTF-8 decoder. Whereas scanning + * for one-byte characters is trivial (with `strcspn`), scanning + * for the longer byte sequences would be more complicated, and + * this shouldn't be in the hot path for execution so we can + * compromise on the efficiency at this point. + * + * @see https://html.spec.whatwg.org/#attributes-2 + */ + if ( preg_match( + '~[' . + // Syntax-like characters. + '"\'>&</ =' . + // Control characters. + '\x{00}-\x{1F}' . + // HTML noncharacters. + '\x{FDD0}-\x{FDEF}' . + '\x{FFFE}\x{FFFF}\x{1FFFE}\x{1FFFF}\x{2FFFE}\x{2FFFF}\x{3FFFE}\x{3FFFF}' . + '\x{4FFFE}\x{4FFFF}\x{5FFFE}\x{5FFFF}\x{6FFFE}\x{6FFFF}\x{7FFFE}\x{7FFFF}' . + '\x{8FFFE}\x{8FFFF}\x{9FFFE}\x{9FFFF}\x{AFFFE}\x{AFFFF}\x{BFFFE}\x{BFFFF}' . + '\x{CFFFE}\x{CFFFF}\x{DFFFE}\x{DFFFF}\x{EFFFE}\x{EFFFF}\x{FFFFE}\x{FFFFF}' . + '\x{10FFFE}\x{10FFFF}' . + ']~Ssu', + $name + ) ) { + if ( WP_DEBUG ) { + throw new Exception( 'Invalid attribute name' ); + } + + return; + } + + /* + * > The values "true" and "false" are not allowed on boolean attributes. + * > To represent a false value, the attribute has to be omitted altogether. + * - HTML5 spec, https://html.spec.whatwg.org/#boolean-attributes + */ + if ( false === $value ) { + $this->remove_attribute( $name ); + return; + } + + if ( true === $value ) { + $updated_attribute = $name; + } else { + $escaped_new_value = esc_attr( $value ); + $updated_attribute = "{$name}=\"{$escaped_new_value}\""; + } + + /* + * > There must never be two or more attributes on + * > the same start tag whose names are an ASCII + * > case-insensitive match for each other. + * - HTML 5 spec + * + * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive + */ + $comparable_name = strtolower( $name ); + + if ( isset( $this->attributes[ $comparable_name ] ) ) { + /* + * Update an existing attribute. + * + * Example – set attribute id to "new" in <div id="initial_id" />: + * <div id="initial_id"/> + * ^-------------^ + * start end + * replacement: `id="new"` + * + * Result: <div id="new"/> + */ + $existing_attribute = $this->attributes[ $comparable_name ]; + $this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement( + $existing_attribute->start, + $existing_attribute->end, + $updated_attribute + ); + } else { + /* + * Create a new attribute at the tag's name end. + * + * Example – add attribute id="new" to <div />: + * <div/> + * ^ + * start and end + * replacement: ` id="new"` + * + * Result: <div id="new"/> + */ + $this->lexical_updates[ $comparable_name ] = new WP_HTML_Text_Replacement( + $this->tag_name_starts_at + $this->tag_name_length, + $this->tag_name_starts_at + $this->tag_name_length, + ' ' . $updated_attribute + ); + } + + /* + * Any calls to update the `class` attribute directly should wipe out any + * enqueued class changes from `add_class` and `remove_class`. + */ + if ( 'class' === $comparable_name && ! empty( $this->classname_updates ) ) { + $this->classname_updates = array(); + } + } + + /** + * Removes an attribute of the currently matched tag. + * + * @since 6.2.0 + * + * @param string $name The attribute name to remove. + */ + public function remove_attribute( $name ) { + if ( $this->is_closing_tag ) { + return false; + } + + /* + * > There must never be two or more attributes on + * > the same start tag whose names are an ASCII + * > case-insensitive match for each other. + * - HTML 5 spec + * + * @see https://html.spec.whatwg.org/multipage/syntax.html#attributes-2:ascii-case-insensitive + */ + $name = strtolower( $name ); + + /* + * Any calls to update the `class` attribute directly should wipe out any + * enqueued class changes from `add_class` and `remove_class`. + */ + if ( 'class' === $name && count( $this->classname_updates ) !== 0 ) { + $this->classname_updates = array(); + } + + // If we updated an attribute we didn't originally have, remove the enqueued update and move on. + if ( ! isset( $this->attributes[ $name ] ) ) { + if ( isset( $this->lexical_updates[ $name ] ) ) { + unset( $this->lexical_updates[ $name ] ); + } + return false; + } + + /* + * Removes an existing tag attribute. + * + * Example – remove the attribute id from <div id="main"/>: + * <div id="initial_id"/> + * ^-------------^ + * start end + * replacement: `` + * + * Result: <div /> + */ + $this->lexical_updates[ $name ] = new WP_HTML_Text_Replacement( + $this->attributes[ $name ]->start, + $this->attributes[ $name ]->end, + '' + ); + } + + /** + * Adds a new class name to the currently matched tag. + * + * @since 6.2.0 + * + * @param string $class_name The class name to add. + */ + public function add_class( $class_name ) { + if ( $this->is_closing_tag ) { + return false; + } + + if ( null !== $this->tag_name_starts_at ) { + $this->classname_updates[ $class_name ] = self::ADD_CLASS; + } + } + + /** + * Removes a class name from the currently matched tag. + * + * @since 6.2.0 + * + * @param string $class_name The class name to remove. + */ + public function remove_class( $class_name ) { + if ( $this->is_closing_tag ) { + return false; + } + + if ( null !== $this->tag_name_starts_at ) { + $this->classname_updates[ $class_name ] = self::REMOVE_CLASS; + } + } + + /** + * Returns the string representation of the HTML Tag Processor. + * + * @since 6.2.0 + * @see get_updated_html + * + * @return string The processed HTML. + */ + public function __toString() { + return $this->get_updated_html(); + } + + /** + * Returns the string representation of the HTML Tag Processor. + * + * @since 6.2.0 + * + * @return string The processed HTML. + */ + public function get_updated_html() { + // Short-circuit if there are no new updates to apply. + if ( ! count( $this->classname_updates ) && ! count( $this->lexical_updates ) ) { + return $this->updated_html . substr( $this->html, $this->updated_bytes ); + } + + // Otherwise: apply the updates, rewind before the current tag, and parse it again. + $delta_between_updated_html_end_and_current_tag_end = substr( + $this->html, + $this->updated_bytes, + $this->tag_name_starts_at + $this->tag_name_length - $this->updated_bytes + ); + $updated_html_up_to_current_tag_name_end = $this->updated_html . $delta_between_updated_html_end_and_current_tag_end; + + // 1. Apply the attributes updates to the original HTML + $this->class_name_updates_to_attributes_updates(); + $this->apply_attributes_updates(); + + // 2. Replace the original HTML with the updated HTML + $this->html = $this->updated_html . substr( $this->html, $this->updated_bytes ); + $this->updated_html = $updated_html_up_to_current_tag_name_end; + $this->updated_bytes = strlen( $this->updated_html ); + + // 3. Point this tag processor at the original tag opener and consume it + + /* + * When we get here we're at the end of the tag name, and we want to rewind to before it + * <p>Previous HTML<em>More HTML</em></p> + * ^ | back up by the length of the tag name plus the opening < + * \<-/ back up by strlen("em") + 1 ==> 3 + */ + $this->parsed_bytes = strlen( $updated_html_up_to_current_tag_name_end ) - $this->tag_name_length - 1; + $this->next_tag(); + + return $this->html; + } + + /** + * Prepares tag search criteria from input interface. + * + * @since 6.2.0 + * + * @param array|string $query { + * Which tag name to find, having which class. + * + * @type string|null $tag_name Which tag to find, or `null` for "any tag." + * @type string|null $class_name Tag must contain this class name to match. + * @type string $tag_closers "visit" or "skip": whether to stop on tag closers, e.g. </div>. + * } + */ + private function parse_query( $query ) { + if ( null !== $query && $query === $this->last_query ) { + return; + } + + $this->last_query = $query; + $this->sought_tag_name = null; + $this->sought_class_name = null; + $this->sought_match_offset = 1; + $this->stop_on_tag_closers = false; + + // A single string value means "find the tag of this name". + if ( is_string( $query ) ) { + $this->sought_tag_name = $query; + return; + } + + // If not using the string interface we have to pass an associative array. + if ( ! is_array( $query ) ) { + return; + } + + if ( isset( $query['tag_name'] ) && is_string( $query['tag_name'] ) ) { + $this->sought_tag_name = $query['tag_name']; + } + + if ( isset( $query['class_name'] ) && is_string( $query['class_name'] ) ) { + $this->sought_class_name = $query['class_name']; + } + + if ( isset( $query['match_offset'] ) && is_int( $query['match_offset'] ) && 0 < $query['match_offset'] ) { + $this->sought_match_offset = $query['match_offset']; + } + + if ( isset( $query['tag_closers'] ) ) { + $this->stop_on_tag_closers = 'visit' === $query['tag_closers']; + } + } + + + /** + * Checks whether a given tag and its attributes match the search criteria. + * + * @since 6.2.0 + * + * @return boolean + */ + private function matches() { + if ( $this->is_closing_tag && ! $this->stop_on_tag_closers ) { + return false; + } + + // Do we match a case-insensitive HTML tag name? + if ( null !== $this->sought_tag_name ) { + /* + * String (byte) length lookup is fast. If they aren't the + * same length then they can't be the same string values. + */ + if ( strlen( $this->sought_tag_name ) !== $this->tag_name_length ) { + return false; + } + + /* + * Otherwise we have to check for each character if they + * are the same, and only `strtoupper()` if we have to. + * Presuming that most people will supply lowercase tag + * names and most HTML will contain lowercase tag names, + * most of the time this runs we shouldn't expect to + * actually run the case-folding comparison. + */ + for ( $i = 0; $i < $this->tag_name_length; $i++ ) { + $html_char = $this->html[ $this->tag_name_starts_at + $i ]; + $tag_char = $this->sought_tag_name[ $i ]; + + if ( $html_char !== $tag_char && strtoupper( $html_char ) !== $tag_char ) { + return false; + } + } + } + + $needs_class_name = null !== $this->sought_class_name; + + if ( $needs_class_name && ! isset( $this->attributes['class'] ) ) { + return false; + } + + // Do we match a byte-for-byte (case-sensitive and encoding-form-sensitive) class name? + if ( $needs_class_name ) { + $class_start = $this->attributes['class']->value_starts_at; + $class_end = $class_start + $this->attributes['class']->value_length; + $class_at = $class_start; + + /* + * We're going to have to jump through potential matches here because + * it's possible that we have classes containing the class name we're + * looking for. For instance, if we are looking for "even" we don't + * want to be confused when we come to the class "not-even." This is + * secured by ensuring that we find our sought-after class and that + * it's surrounded on both sides by proper boundaries. + * + * See https://html.spec.whatwg.org/#attributes-3 + * See https://html.spec.whatwg.org/#space-separated-tokens + */ + while ( + // phpcs:ignore WordPress.CodeAnalysis.AssignmentInCondition.FoundInWhileCondition + false !== ( $class_at = strpos( $this->html, $this->sought_class_name, $class_at ) ) && + $class_at < $class_end + ) { + /* + * Verify this class starts at a boundary. If it were at 0 we'd be at + * the start of the string and that would be fine, otherwise we have + * to start at a place where the preceding character is whitespace. + */ + if ( $class_at > $class_start ) { + $character = $this->html[ $class_at - 1 ]; + + if ( ' ' !== $character && "\t" !== $character && "\f" !== $character && "\r" !== $character && "\n" !== $character ) { + $class_at += strlen( $this->sought_class_name ); + continue; + } + } + + /* + * Similarly, verify this class ends at a boundary as well. Here we + * can end at the very end of the string value, otherwise we have + * to end at a place where the next character is whitespace. + */ + if ( $class_at + strlen( $this->sought_class_name ) < $class_end ) { + $character = $this->html[ $class_at + strlen( $this->sought_class_name ) ]; + + if ( ' ' !== $character && "\t" !== $character && "\f" !== $character && "\r" !== $character && "\n" !== $character ) { + $class_at += strlen( $this->sought_class_name ); + continue; + } + } + + return true; + } + + return false; + } + + return true; + } +} + +endif; + diff --git a/src/wp-includes/class-wp-html-text-replacement.php b/src/wp-includes/class-wp-html-text-replacement.php new file mode 100644 index 0000000000000..4461df473aadd --- /dev/null +++ b/src/wp-includes/class-wp-html-text-replacement.php @@ -0,0 +1,63 @@ +<?php +/** + * HTML Tag Processor: Text replacement class. + * + * @package WordPress + * @subpackage HTML + * @since 6.2.0 + */ + +if ( ! class_exists( 'WP_HTML_Text_Replacement' ) ) : + +/** + * Data structure used to replace existing content from start to end that allows to drastically improve performance. + * + * This class is for internal usage of the WP_HTML_Tag_Processor class. + * + * @access private + * @since 6.2.0 + * + * @see WP_HTML_Tag_Processor + */ +class WP_HTML_Text_Replacement { + /** + * Byte offset into document where replacement span begins. + * + * @since 6.2.0 + * @var int + */ + public $start; + + /** + * Byte offset into document where replacement span ends. + * + * @since 6.2.0 + * @var int + */ + public $end; + + /** + * Span of text to insert in document to replace existing content from start to end. + * + * @since 6.2.0 + * @var string + */ + public $text; + + /** + * Constructor. + * + * @since 6.2.0 + * + * @param int $start Byte offset into document where replacement span begins. + * @param int $end Byte offset into document where replacement span ends. + * @param string $text Span of text to insert in document to replace existing content from start to end. + */ + public function __construct( $start, $end, $text ) { + $this->start = $start; + $this->end = $end; + $this->text = $text; + } +} + +endif; diff --git a/src/wp-includes/wp-html.php b/src/wp-includes/wp-html.php new file mode 100644 index 0000000000000..1806643104794 --- /dev/null +++ b/src/wp-includes/wp-html.php @@ -0,0 +1,34 @@ +<?php +/** + * HTML parsing and modification API + * + * @since 6.2 + * + * @package WordPress + * @subpackage HTML + */ + +/* + * These helper classes are used by the Tag Processor for tracking + * content as it parses HTML documents. Using these helper classes + * instead of PHP arrays has a dramatic impact on performance, in + * terms of speed as well as memory use. + */ + +/** WP_HTML_Attribute_Token class */ +require_once ABSPATH . WPINC . '/class-wp-html-attribute-token.php'; + +/** WP_HTML_Span class */ +require_once ABSPATH . WPINC . '/class-wp-html-span.php'; + +/** WP_HTML_Text_Replacement class */ +require_once ABSPATH . WPINC . '/class-wp-html-text-replacement.php'; + +/* + * The WP_HTML_Tag_Processor is intended for linearly scanning through + * an HTML document, searching for HTML tags matching a given query, + * and adding, removing, or modifying attributes on those tags. + */ + +/** WP_HTML_Tag_Processor class */ +require_once ABSPATH . WPINC . '/class-wp-html-tag-processor.php'; diff --git a/src/wp-settings.php b/src/wp-settings.php index 3ed93b2f36629..5385a3356a8c8 100644 --- a/src/wp-settings.php +++ b/src/wp-settings.php @@ -234,6 +234,7 @@ require ABSPATH . WPINC . '/class-wp-oembed-controller.php'; require ABSPATH . WPINC . '/media.php'; require ABSPATH . WPINC . '/http.php'; +require ABSPATH . WPINC . '/wp-html.php'; require ABSPATH . WPINC . '/class-wp-http.php'; require ABSPATH . WPINC . '/class-wp-http-streams.php'; require ABSPATH . WPINC . '/class-wp-http-curl.php'; diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php b/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php new file mode 100644 index 0000000000000..c92d0023d16c2 --- /dev/null +++ b/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php @@ -0,0 +1,370 @@ +<?php +/** + * Unit tests covering WP_HTML_Tag_Processor bookmark functionality. + * + * @package WordPress + * @subpackage HTML + */ + +require_once ABSPATH . WPINC . '/wp-html.php'; + +/** + * @group html + * + * @coversDefaultClass WP_HTML_Tag_Processor + */ +class WP_HTML_Tag_Processor_Bookmark_Test extends WP_UnitTestCase { + + /** + * @ticket 56299 + * + * @covers set_bookmark + */ + public function test_set_bookmark() { + $p = new WP_HTML_Tag_Processor( '<ul><li>One</li><li>Two</li><li>Three</li></ul>' ); + $p->next_tag( 'li' ); + $this->assertTrue( $p->set_bookmark( 'first li' ), 'Could not allocate a "first li" bookmark.' ); + $p->next_tag( 'li' ); + $this->assertTrue( $p->set_bookmark( 'second li' ), 'Could not allocate a "second li" bookmark.' ); + $this->assertTrue( $p->set_bookmark( 'first li' ), 'Could not move the "first li" bookmark.' ); + } + + /** + * @ticket 56299 + * + * @covers release_bookmark + */ + public function test_release_bookmark() { + $p = new WP_HTML_Tag_Processor( '<ul><li>One</li><li>Two</li><li>Three</li></ul>' ); + $p->next_tag( 'li' ); + $this->assertFalse( $p->release_bookmark( 'first li' ), 'Released a non-existing bookmark.' ); + $p->set_bookmark( 'first li' ); + $this->assertTrue( $p->release_bookmark( 'first li' ), 'Could not release a bookmark.' ); + } + + /** + * @ticket 56299 + * + * @covers seek + * @covers set_bookmark + */ + public function test_seek() { + $p = new WP_HTML_Tag_Processor( '<ul><li>One</li><li>Two</li><li>Three</li></ul>' ); + $p->next_tag( 'li' ); + $p->set_bookmark( 'first li' ); + + $p->next_tag( 'li' ); + $p->set_attribute( 'foo-2', 'bar-2' ); + + $p->seek( 'first li' ); + $p->set_attribute( 'foo-1', 'bar-1' ); + + $this->assertEquals( + '<ul><li foo-1="bar-1">One</li><li foo-2="bar-2">Two</li><li>Three</li></ul>', + $p->get_updated_html() + ); + } + + /** + * WP_HTML_Tag_Processor used to test for the diffs affecting + * the adjusted bookmark position while simultaneously adjusting + * the bookmark in question. As a result, updating the bookmarks + * of a next tag while removing two subsequent attributes in + * a previous tag unfolded like this: + * + * 1. Check if the first removed attribute is before the bookmark: + * + * <button twenty_one_characters 7_chars></button><button></button> + * ^-------------------^ ^ + * diff applied here the bookmark is here + * + * (Yes it is) + * + * 2. Move the bookmark to the left by the attribute length: + * + * <button twenty_one_characters 7_chars></button><button></button> + * ^ + * the bookmark is here + * + * 3. Check if the second removed attribute is before the bookmark: + * + * <button twenty_one_characters 7_chars></button><button></button> + * ^ ^-----^ + * bookmark diff + * + * This time, it isn't! + * + * The fix in the WP_HTML_Tag_Processor involves doing all the checks + * before moving the bookmark. This test is here to guard us from + * the erroneous behavior accidentally returning one day. + * + * @ticket 56299 + * + * @covers seek + * @covers set_bookmark + * @covers apply_attributes_updates + */ + public function test_removing_long_attributes_doesnt_break_seek() { + $input = <<<HTML + <button twenty_one_characters 7_chars></button><button></button> +HTML; + $p = new WP_HTML_Tag_Processor( $input ); + $p->next_tag( 'button' ); + $p->set_bookmark( 'first' ); + $p->next_tag( 'button' ); + $p->set_bookmark( 'second' ); + + $this->assertTrue( + $p->seek( 'first' ), + 'Seek() to the first button has failed' + ); + $p->remove_attribute( 'twenty_one_characters' ); + $p->remove_attribute( '7_chars' ); + + $this->assertTrue( + $p->seek( 'second' ), + 'Seek() to the second button has failed' + ); + } + + /** + * @ticket 56299 + * + * @covers seek + * @covers set_bookmark + */ + public function test_bookmarks_complex_use_case() { + $input = <<<HTML +<div selected class="merge-message" checked> + <div class="select-menu d-inline-block"> + <div checked class="BtnGroup MixedCaseHTML position-relative" /> + <div checked class="BtnGroup MixedCaseHTML position-relative"> + <button type="button" class="merge-box-button btn-group-merge rounded-left-2 btn BtnGroup-item js-details-target hx_create-pr-button" aria-expanded="false" data-details-container=".js-merge-pr" disabled=""> + Merge pull request + </button> + + <button type="button" class="merge-box-button btn-group-squash rounded-left-2 btn BtnGroup-item js-details-target hx_create-pr-button" aria-expanded="false" data-details-container=".js-merge-pr" disabled=""> + Squash and merge + </button> + + <button type="button" class="merge-box-button btn-group-rebase rounded-left-2 btn BtnGroup-item js-details-target hx_create-pr-button" aria-expanded="false" data-details-container=".js-merge-pr" disabled=""> + Rebase and merge + </button> + + <button aria-label="Select merge method" disabled="disabled" type="button" data-view-component="true" class="select-menu-button btn BtnGroup-item"></button> + </div> + </div> +</div> +HTML; + $expected_output = <<<HTML +<div selected class="merge-message" checked> + <div class="select-menu d-inline-block"> + <div class="BtnGroup MixedCaseHTML position-relative" /> + <div checked class="BtnGroup MixedCaseHTML position-relative"> + <button type="submit" class="merge-box-button btn-group-merge rounded-left-2 btn BtnGroup-item js-details-target hx_create-pr-button" aria-expanded="false" data-details-container=".js-merge-pr" disabled=""> + Merge pull request + </button> + + <button class="hx_create-pr-button" aria-expanded="false" data-details-container=".js-merge-pr" disabled=""> + Squash and merge + </button> + + <button id="rebase-and-merge" disabled=""> + Rebase and merge + </button> + + <button id="last-button" ></button> + </div> + </div> +</div> +HTML; + $p = new WP_HTML_Tag_Processor( $input ); + $p->next_tag( 'div' ); + $p->next_tag( 'div' ); + $p->next_tag( 'div' ); + $p->set_bookmark( 'first div' ); + $p->next_tag( 'button' ); + $p->set_bookmark( 'first button' ); + $p->next_tag( 'button' ); + $p->set_bookmark( 'second button' ); + $p->next_tag( 'button' ); + $p->set_bookmark( 'third button' ); + $p->next_tag( 'button' ); + $p->set_bookmark( 'fourth button' ); + + $p->seek( 'first button' ); + $p->set_attribute( 'type', 'submit' ); + + $this->assertTrue( + $p->seek( 'third button' ), + 'Seek() to the third button failed' + ); + $p->remove_attribute( 'class' ); + $p->remove_attribute( 'type' ); + $p->remove_attribute( 'aria-expanded' ); + $p->set_attribute( 'id', 'rebase-and-merge' ); + $p->remove_attribute( 'data-details-container' ); + + $this->assertTrue( + $p->seek( 'first div' ), + 'Seek() to the first div failed' + ); + $p->set_attribute( 'checked', false ); + + $this->assertTrue( + $p->seek( 'fourth button' ), + 'Seek() to the fourth button failed' + ); + $p->set_attribute( 'id', 'last-button' ); + $p->remove_attribute( 'class' ); + $p->remove_attribute( 'type' ); + $p->remove_attribute( 'checked' ); + $p->remove_attribute( 'aria-label' ); + $p->remove_attribute( 'disabled' ); + $p->remove_attribute( 'data-view-component' ); + + $this->assertTrue( + $p->seek( 'second button' ), + 'Seek() to the second button failed' + ); + $p->remove_attribute( 'type' ); + $p->set_attribute( 'class', 'hx_create-pr-button' ); + + $this->assertEquals( + $expected_output, + $p->get_updated_html() + ); + } + + /** + * @ticket 56299 + * + * @covers seek + * @covers set_bookmark + */ + public function test_updates_bookmark_for_additions_after_both_sides() { + $p = new WP_HTML_Tag_Processor( '<div>First</div><div>Second</div>' ); + $p->next_tag(); + $p->set_bookmark( 'first' ); + $p->next_tag(); + $p->add_class( 'second' ); + + $p->seek( 'first' ); + $p->add_class( 'first' ); + + $this->assertEquals( + '<div class="first">First</div><div class="second">Second</div>', + $p->get_updated_html() + ); + } + + /** + * @ticket 56299 + * + * @covers seek + * @covers set_bookmark + */ + public function test_updates_bookmark_for_additions_before_both_sides() { + $p = new WP_HTML_Tag_Processor( '<div>First</div><div>Second</div>' ); + $p->next_tag(); + $p->set_bookmark( 'first' ); + $p->next_tag(); + $p->set_bookmark( 'second' ); + + $p->seek( 'first' ); + $p->add_class( 'first' ); + + $p->seek( 'second' ); + $p->add_class( 'second' ); + + $this->assertEquals( + '<div class="first">First</div><div class="second">Second</div>', + $p->get_updated_html() + ); + } + + /** + * @ticket 56299 + * + * @covers seek + * @covers set_bookmark + */ + public function test_updates_bookmark_for_deletions_after_both_sides() { + $p = new WP_HTML_Tag_Processor( '<div>First</div><div disabled>Second</div>' ); + $p->next_tag(); + $p->set_bookmark( 'first' ); + $p->next_tag(); + $p->remove_attribute( 'disabled' ); + + $p->seek( 'first' ); + $p->set_attribute( 'untouched', true ); + + $this->assertEquals( + /** @TODO: we shouldn't have to assert the extra space after removing the attribute. */ + '<div untouched>First</div><div >Second</div>', + $p->get_updated_html() + ); + } + + /** + * @ticket 56299 + * + * @covers seek + * @covers set_bookmark + */ + public function test_updates_bookmark_for_deletions_before_both_sides() { + $p = new WP_HTML_Tag_Processor( '<div disabled>First</div><div>Second</div>' ); + $p->next_tag(); + $p->set_bookmark( 'first' ); + $p->next_tag(); + $p->set_bookmark( 'second' ); + + $p->seek( 'first' ); + $p->remove_attribute( 'disabled' ); + + $p->seek( 'second' ); + $p->set_attribute( 'safe', true ); + + $this->assertEquals( + /** @TODO: we shouldn't have to assert the extra space after removing the attribute. */ + '<div >First</div><div safe>Second</div>', + $p->get_updated_html() + ); + } + + /** + * @ticket 56299 + * + * @covers set_bookmark + */ + public function test_limits_the_number_of_bookmarks() { + $p = new WP_HTML_Tag_Processor( '<ul><li>One</li><li>Two</li><li>Three</li></ul>' ); + $p->next_tag( 'li' ); + + $this->expectException( Exception::class ); + + for ( $i = 0;$i < WP_HTML_Tag_Processor::MAX_BOOKMARKS;$i++ ) { + $this->assertTrue( $p->set_bookmark( "bookmark $i" ), "Could not allocate the bookmark #$i" ); + } + + $this->assertFalse( $p->set_bookmark( 'final bookmark' ), "Allocated $i bookmarks, which is one above the limit." ); + } + + /** + * @ticket 56299 + * + * @covers seek + */ + public function test_limits_the_number_of_seek_calls() { + $p = new WP_HTML_Tag_Processor( '<ul><li>One</li><li>Two</li><li>Three</li></ul>' ); + $p->next_tag( 'li' ); + $p->set_bookmark( 'bookmark' ); + + $this->expectException( Exception::class ); + + for ( $i = 0; $i < WP_HTML_Tag_Processor::MAX_SEEK_OPS; $i++ ) { + $this->assertTrue( $p->seek( 'bookmark' ), 'Could not seek to the "bookmark"' ); + } + $this->assertFalse( $p->seek( 'bookmark' ), "$i-th seek() to the bookmark succeeded, even though it should exceed the allowed limit." ); + } +} diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php b/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php new file mode 100644 index 0000000000000..92f87099362ec --- /dev/null +++ b/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php @@ -0,0 +1,1908 @@ +<?php +/** + * Unit tests covering WP_HTML_Tag_Processor functionality. + * + * @package WordPress + * @subpackage HTML + */ + +require_once ABSPATH . WPINC . '/wp-html.php'; + +/** + * @group html + * + * @coversDefaultClass WP_HTML_Tag_Processor + */ +class WP_HTML_Tag_Processor_Test extends WP_UnitTestCase { + const HTML_SIMPLE = '<div id="first"><span id="second">Text</span></div>'; + const HTML_WITH_CLASSES = '<div class="main with-border" id="first"><span class="not-main bold with-border" id="second">Text</span></div>'; + const HTML_MALFORMED = '<div><span class="d-md-none" Notifications</span><span class="d-none d-md-inline">Back to notifications</span></div>'; + + /** + * @ticket 56299 + * + * @covers get_tag + */ + public function test_get_tag_returns_null_before_finding_tags() { + $p = new WP_HTML_Tag_Processor( '<div>Test</div>' ); + $this->assertNull( $p->get_tag() ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers get_tag + */ + public function test_get_tag_returns_null_when_not_in_open_tag() { + $p = new WP_HTML_Tag_Processor( '<div>Test</div>' ); + $this->assertFalse( $p->next_tag( 'p' ), 'Querying a non-existing tag did not return false' ); + $this->assertNull( $p->get_tag(), 'Accessing a non-existing tag did not return null' ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers get_tag + */ + public function test_get_tag_returns_open_tag_name() { + $p = new WP_HTML_Tag_Processor( '<div>Test</div>' ); + $this->assertTrue( $p->next_tag( 'div' ), 'Querying an existing tag did not return true' ); + $this->assertSame( 'DIV', $p->get_tag(), 'Accessing an existing tag name did not return "div"' ); + } + + /** + * @ticket 56299 + * + * @covers get_attribute + */ + public function test_get_attribute_returns_null_before_finding_tags() { + $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' ); + $this->assertNull( $p->get_attribute( 'class' ) ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers get_attribute + */ + public function test_get_attribute_returns_null_when_not_in_open_tag() { + $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' ); + $this->assertFalse( $p->next_tag( 'p' ), 'Querying a non-existing tag did not return false' ); + $this->assertNull( $p->get_attribute( 'class' ), 'Accessing an attribute of a non-existing tag did not return null' ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers get_attribute + */ + public function test_get_attribute_returns_null_when_in_closing_tag() { + $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' ); + $this->assertTrue( $p->next_tag( 'div' ), 'Querying an existing tag did not return true' ); + $this->assertTrue( $p->next_tag( array( 'tag_closers' => 'visit' ) ), 'Querying an existing closing tag did not return true' ); + $this->assertNull( $p->get_attribute( 'class' ), 'Accessing an attribute of a closing tag did not return null' ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers get_attribute + */ + public function test_get_attribute_returns_null_when_attribute_missing() { + $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' ); + $this->assertTrue( $p->next_tag( 'div' ), 'Querying an existing tag did not return true' ); + $this->assertNull( $p->get_attribute( 'test-id' ), 'Accessing a non-existing attribute did not return null' ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers get_attribute + */ + public function test_get_attribute_returns_attribute_value() { + $p = new WP_HTML_Tag_Processor( '<div class="test">Test</div>' ); + $this->assertTrue( $p->next_tag( 'div' ), 'Querying an existing tag did not return true' ); + $this->assertSame( 'test', $p->get_attribute( 'class' ), 'Accessing a class="test" attribute value did not return "test"' ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers get_attribute + */ + public function test_get_attribute_returns_true_for_boolean_attribute() { + $p = new WP_HTML_Tag_Processor( '<div enabled class="test">Test</div>' ); + $this->assertTrue( $p->next_tag( array( 'class_name' => 'test' ) ), 'Querying an existing tag did not return true' ); + $this->assertTrue( $p->get_attribute( 'enabled' ), 'Accessing a boolean "enabled" attribute value did not return true' ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers get_attribute + */ + public function test_get_attribute_returns_string_for_truthy_attributes() { + $p = new WP_HTML_Tag_Processor( '<div enabled=enabled checked=1 hidden="true" class="test">Test</div>' ); + $this->assertTrue( $p->next_tag( array() ), 'Querying an existing tag did not return true' ); + $this->assertSame( 'enabled', $p->get_attribute( 'enabled' ), 'Accessing a boolean "enabled" attribute value did not return true' ); + $this->assertSame( '1', $p->get_attribute( 'checked' ), 'Accessing a checked=1 attribute value did not return "1"' ); + $this->assertSame( 'true', $p->get_attribute( 'hidden' ), 'Accessing a hidden="true" attribute value did not return "true"' ); + } + + /** + * @ticket 56299 + * + * @covers WP_HTML_Tag_Processor::get_attribute + */ + public function test_get_attribute_decodes_html_character_references() { + $p = new WP_HTML_Tag_Processor( '<div id="the "grande" is < 32oz†"></div>' ); + $p->next_tag(); + $this->assertSame( 'the "grande" is < 32oz†', $p->get_attribute( 'id' ), 'HTML Attribute value was returned without decoding character references' ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers get_attribute + */ + public function test_attributes_parser_treats_slash_as_attribute_separator() { + $p = new WP_HTML_Tag_Processor( '<div a/b/c/d/e="test">Test</div>' ); + $this->assertTrue( $p->next_tag( array() ), 'Querying an existing tag did not return true' ); + $this->assertTrue( $p->get_attribute( 'a' ), 'Accessing an existing attribute did not return true' ); + $this->assertTrue( $p->get_attribute( 'b' ), 'Accessing an existing attribute did not return true' ); + $this->assertTrue( $p->get_attribute( 'c' ), 'Accessing an existing attribute did not return true' ); + $this->assertTrue( $p->get_attribute( 'd' ), 'Accessing an existing attribute did not return true' ); + $this->assertSame( 'test', $p->get_attribute( 'e' ), 'Accessing an existing e="test" did not return "test"' ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers get_attribute + */ + public function test_attributes_parser_is_case_insensitive() { + $p = new WP_HTML_Tag_Processor( '<div DATA-enabled="true" data-VISIBLE>Test</div>' ); + $p->next_tag(); + $p->get_attribute( 'data-enabled' ); + $this->assertEquals( 'true', $p->get_attribute( 'DATA-enabled' ), 'A case-insensitive get_attribute call did not return "true".' ); + $this->assertEquals( 'true', $p->get_attribute( 'data-enabled' ), 'A case-insensitive get_attribute call did not return "true".' ); + $this->assertEquals( 'true', $p->get_attribute( 'DATA-ENABLED' ), 'A case-insensitive get_attribute call did not return "true".' ); + $this->assertEquals( true, $p->get_attribute( 'data-VISIBLE' ), 'A case-insensitive get_attribute call did not return true.' ); + $this->assertEquals( true, $p->get_attribute( 'DATA-visible' ), 'A case-insensitive get_attribute call did not return true.' ); + $this->assertEquals( true, $p->get_attribute( 'dAtA-ViSiBlE' ), 'A case-insensitive get_attribute call did not return true.' ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers remove_attribute + */ + public function test_remove_attribute_is_case_insensitive() { + $p = new WP_HTML_Tag_Processor( '<div DATA-enabled="true">Test</div>' ); + $p->next_tag(); + $p->remove_attribute( 'data-enabled' ); + $this->assertEquals( '<div >Test</div>', $p->get_updated_html(), 'A case-insensitive remove_attribute call did not remove the attribute.' ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers set_attribute + */ + public function test_set_attribute_is_case_insensitive() { + $p = new WP_HTML_Tag_Processor( '<div DATA-enabled="true">Test</div>' ); + $p->next_tag(); + $p->set_attribute( 'data-enabled', 'abc' ); + $this->assertEquals( '<div data-enabled="abc">Test</div>', $p->get_updated_html(), 'A case-insensitive set_attribute call did not update the existing attribute.' ); + } + + /** + * @ticket 56299 + * + * @covers get_attribute_names_with_prefix + */ + public function test_get_attribute_names_with_prefix_returns_null_before_finding_tags() { + $p = new WP_HTML_Tag_Processor( '<div data-foo="bar">Test</div>' ); + $this->assertNull( $p->get_attribute_names_with_prefix( 'data-' ) ); + } + + /** + * @ticket 56299 + * + * @covers get_attribute_names_with_prefix + */ + public function test_get_attribute_names_with_prefix_returns_null_when_not_in_open_tag() { + $p = new WP_HTML_Tag_Processor( '<div data-foo="bar">Test</div>' ); + $p->next_tag( 'p' ); + $this->assertNull( $p->get_attribute_names_with_prefix( 'data-' ), 'Accessing attributes of a non-existing tag did not return null' ); + } + + /** + * @ticket 56299 + * + * @covers get_attribute_names_with_prefix + */ + public function test_get_attribute_names_with_prefix_returns_null_when_in_closing_tag() { + $p = new WP_HTML_Tag_Processor( '<div data-foo="bar">Test</div>' ); + $p->next_tag( 'div' ); + $p->next_tag( array( 'tag_closers' => 'visit' ) ); + $this->assertNull( $p->get_attribute_names_with_prefix( 'data-' ), 'Accessing attributes of a closing tag did not return null' ); + } + + /** + * @ticket 56299 + * + * @covers get_attribute_names_with_prefix + */ + public function test_get_attribute_names_with_prefix_returns_empty_array_when_no_attributes_present() { + $p = new WP_HTML_Tag_Processor( '<div>Test</div>' ); + $p->next_tag( 'div' ); + $this->assertSame( array(), $p->get_attribute_names_with_prefix( 'data-' ), 'Accessing the attributes on a tag without any did not return an empty array' ); + } + + /** + * @ticket 56299 + * + * @covers get_attribute_names_with_prefix + */ + public function test_get_attribute_names_with_prefix_returns_matching_attribute_names_in_lowercase() { + $p = new WP_HTML_Tag_Processor( '<div DATA-enabled class="test" data-test-ID="14">Test</div>' ); + $p->next_tag(); + $this->assertSame( + array( 'data-enabled', 'data-test-id' ), + $p->get_attribute_names_with_prefix( 'data-' ) + ); + } + + /** + * @ticket 56299 + * + * @covers set_attribute + * @covers get_updated_html + * @covers get_attribute_names_with_prefix + */ + public function test_get_attribute_names_with_prefix_returns_attribute_added_by_set_attribute() { + $p = new WP_HTML_Tag_Processor( '<div data-foo="bar">Test</div>' ); + $p->next_tag(); + $p->set_attribute( 'data-test-id', '14' ); + $this->assertSame( + '<div data-test-id="14" data-foo="bar">Test</div>', + $p->get_updated_html(), + "Updated HTML doesn't include attribute added via set_attribute" + ); + $this->assertSame( + array( 'data-test-id', 'data-foo' ), + $p->get_attribute_names_with_prefix( 'data-' ), + "Accessing attribute names doesn't find attribute added via set_attribute" + ); + } + + /** + * @ticket 56299 + * + * @covers __toString + */ + public function tostring_returns_updated_html() { + $p = new WP_HTML_Tag_Processor( '<hr id="remove" /><div enabled class="test">Test</div><span id="span-id"></span>' ); + $p->next_tag(); + $p->remove_attribute( 'id' ); + + $p->next_tag(); + $p->set_attribute( 'id', 'div-id-1' ); + $p->add_class( 'new_class_1' ); + + $this->assertEquals( + $p->get_updated_html(), + (string) $p + ); + } + + /** + * @ticket 56299 + * + * @covers get_updated_html + */ + public function test_get_updated_html_applies_the_updates_so_far_and_keeps_the_processor_on_the_current_tag() { + $p = new WP_HTML_Tag_Processor( '<hr id="remove" /><div enabled class="test">Test</div><span id="span-id"></span>' ); + $p->next_tag(); + $p->remove_attribute( 'id' ); + + $p->next_tag(); + $p->set_attribute( 'id', 'div-id-1' ); + $p->add_class( 'new_class_1' ); + $this->assertSame( + '<hr /><div id="div-id-1" enabled class="test new_class_1">Test</div><span id="span-id"></span>', + $p->get_updated_html(), + 'Calling get_updated_html after updating the attributes of the second tag returned different HTML than expected' + ); + + $p->set_attribute( 'id', 'div-id-2' ); + $p->add_class( 'new_class_2' ); + $this->assertSame( + '<hr /><div id="div-id-2" enabled class="test new_class_1 new_class_2">Test</div><span id="span-id"></span>', + $p->get_updated_html(), + 'Calling get_updated_html after updating the attributes of the second tag for the second time returned different HTML than expected' + ); + + $p->next_tag(); + $p->remove_attribute( 'id' ); + $this->assertSame( + '<hr /><div id="div-id-2" enabled class="test new_class_1 new_class_2">Test</div><span ></span>', + $p->get_updated_html(), + 'Calling get_updated_html after removing the id attribute of the third tag returned different HTML than expected' + ); + } + + /** + * @ticket 56299 + * + * @covers get_updated_html + */ + public function test_get_updated_html_without_updating_any_attributes_returns_the_original_html() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $this->assertSame( self::HTML_SIMPLE, $p->get_updated_html() ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + */ + public function test_next_tag_with_no_arguments_should_find_the_next_existing_tag() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $this->assertTrue( $p->next_tag(), 'Querying an existing tag did not return true' ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + */ + public function test_next_tag_should_return_false_for_a_non_existing_tag() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $this->assertFalse( $p->next_tag( 'p' ), 'Querying a non-existing tag did not return false' ); + } + + /** + * @covers next_tag + * @covers is_tag_closer + */ + public function test_next_tag_should_stop_on_closers_only_when_requested() { + $p = new WP_HTML_Tag_Processor( '<div><img /></div>' ); + $this->assertTrue( $p->next_tag( array( 'tag_name' => 'div' ) ), 'Did not find desired tag opener' ); + $this->assertFalse( $p->next_tag( array( 'tag_name' => 'div' ) ), 'Visited an unwanted tag, a tag closer' ); + + $p = new WP_HTML_Tag_Processor( '<div><img /></div>' ); + $p->next_tag( + array( + 'tag_name' => 'div', + 'tag_closers' => 'visit', + ) + ); + $this->assertFalse( $p->is_tag_closer(), 'Indicated a tag opener is a tag closer' ); + $this->assertTrue( + $p->next_tag( + array( + 'tag_name' => 'div', + 'tag_closers' => 'visit', + ) + ), + 'Did not stop at desired tag closer' + ); + $this->assertTrue( $p->is_tag_closer(), 'Indicated a tag closer is a tag opener' ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers get_updated_html + */ + public function test_set_attribute_on_a_non_existing_tag_does_not_change_the_markup() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $this->assertFalse( $p->next_tag( 'p' ), 'Querying a non-existing tag did not return false' ); + $this->assertFalse( $p->next_tag( 'div' ), 'Querying a non-existing tag did not return false' ); + $p->set_attribute( 'id', 'primary' ); + $this->assertSame( + self::HTML_SIMPLE, + $p->get_updated_html(), + 'Calling get_updated_html after updating a non-existing tag returned an HTML that was different from the original HTML' + ); + } + + public function test_attribute_ops_on_tag_closer_do_not_change_the_markup() { + $p = new WP_HTML_Tag_Processor( '<div id=3></div invalid-id=4>' ); + $p->next_tag( + array( + 'tag_name' => 'div', + 'tag_closers' => 'visit', + ) + ); + $this->assertFalse( $p->is_tag_closer(), 'Skipped tag opener' ); + $p->next_tag( + array( + 'tag_name' => 'div', + 'tag_closers' => 'visit', + ) + ); + $this->assertTrue( $p->is_tag_closer(), 'Skipped tag closer' ); + $this->assertFalse( $p->set_attribute( 'id', 'test' ), "Allowed setting an attribute on a tag closer when it shouldn't have" ); + $this->assertFalse( $p->remove_attribute( 'invalid-id' ), "Allowed removing an attribute on a tag closer when it shouldn't have" ); + $this->assertFalse( $p->add_class( 'sneaky' ), "Allowed adding a class on a tag closer when it shouldn't have" ); + $this->assertFalse( $p->remove_class( 'not-appearing-in-this-test' ), "Allowed removing a class on a tag closer when it shouldn't have" ); + $this->assertSame( + '<div id=3></div invalid-id=4>', + $p->get_updated_html(), + 'Calling get_updated_html after updating a non-existing tag returned an HTML that was different from the original HTML' + ); + } + + /** + * Passing a double quote inside of an attribute values could lead to an XSS attack as follows: + * + * <code> + * $p = new WP_HTML_Tag_Processor( '<div class="header"></div>' ); + * $p->next_tag(); + * $p->set_attribute('class', '" onclick="alert'); + * echo $p; + * // <div class="" onclick="alert"></div> + * </code> + * + * To prevent it, `set_attribute` calls `esc_attr()` on its given values. + * + * <code> + * <div class="" onclick="alert"></div> + * </code> + * + * @ticket 56299 + * + * @dataProvider data_set_attribute_escapable_values + * @covers set_attribute + */ + public function test_set_attribute_prevents_xss( $attribute_value ) { + $p = new WP_HTML_Tag_Processor( '<div></div>' ); + $p->next_tag(); + $p->set_attribute( 'test', $attribute_value ); + + /* + * Testing the escaping is hard using tools that properly parse + * HTML because they might interpret the escaped values. It's hard + * with tools that don't understand HTML because they might get + * confused by improperly-escaped values. + * + * For this test, since we control the input HTML we're going to + * do what looks like the opposite of what we want to be doing with + * this library but are only doing so because we have full control + * over the content and because we want to look at the raw values. + */ + $match = null; + preg_match( '~^<div test=(.*)></div>$~', $p->get_updated_html(), $match ); + list( , $actual_value ) = $match; + + $this->assertEquals( $actual_value, '"' . esc_attr( $attribute_value ) . '"' ); + } + + /** + * Data provider with HTML attribute values that might need escaping. + */ + public function data_set_attribute_escapable_values() { + return array( + array( '"' ), + array( '"' ), + array( '&' ), + array( '&' ), + array( '€' ), + array( "'" ), + array( '<>' ), + array( '"";' ), + array( '" onclick="alert(\'1\');"><span onclick=""></span><script>alert("1")</script>' ), + ); + } + + /** + * @ticket 56299 + * + * @covers set_attribute + * @covers get_updated_html + * @covers get_attribute + */ + public function test_set_attribute_with_a_non_existing_attribute_adds_a_new_attribute_to_the_markup() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->set_attribute( 'test-attribute', 'test-value' ); + $this->assertSame( + '<div test-attribute="test-value" id="first"><span id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not include attribute added via set_attribute()' + ); + $this->assertSame( + 'test-value', + $p->get_attribute( 'test-attribute' ), + 'get_attribute() (called after get_updated_html()) did not return attribute added via set_attribute()' + ); + } + + /** + * @ticket 56299 + * + * @covers set_attribute + * @covers get_updated_html + * @covers get_attribute + */ + public function test_get_attribute_returns_updated_values_before_they_are_updated() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->set_attribute( 'test-attribute', 'test-value' ); + $this->assertSame( + 'test-value', + $p->get_attribute( 'test-attribute' ), + 'get_attribute() (called before get_updated_html()) did not return attribute added via set_attribute()' + ); + $this->assertSame( + '<div test-attribute="test-value" id="first"><span id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not include attribute added via set_attribute()' + ); + } + + public function test_get_attribute_returns_updated_values_before_they_are_updated_with_different_name_casing() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->set_attribute( 'test-ATTribute', 'test-value' ); + $this->assertSame( + 'test-value', + $p->get_attribute( 'test-attribute' ), + 'get_attribute() (called before get_updated_html()) did not return attribute added via set_attribute()' + ); + $this->assertSame( + '<div test-ATTribute="test-value" id="first"><span id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not include attribute added via set_attribute()' + ); + } + + /** + * @ticket 56299 + * + * @covers add_class + * @covers get_updated_html + * @covers get_attribute + */ + public function test_get_attribute_reflects_added_class_names_before_they_are_updated() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->add_class( 'my-class' ); + $this->assertSame( + 'my-class', + $p->get_attribute( 'class' ), + 'get_attribute() (called before get_updated_html()) did not return class name added via add_class()' + ); + $this->assertSame( + '<div class="my-class" id="first"><span id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not include class name added via add_class()' + ); + } + + /** + * @ticket 56299 + * + * @covers add_class + * @covers get_updated_html + * @covers get_attribute + */ + public function test_get_attribute_reflects_added_class_names_before_they_are_updated_and_retains_classes_from_previous_add_class_calls() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->add_class( 'my-class' ); + $this->assertSame( + 'my-class', + $p->get_attribute( 'class' ), + 'get_attribute() (called before get_updated_html()) did not return class name added via add_class()' + ); + $p->add_class( 'my-other-class' ); + $this->assertSame( + 'my-class my-other-class', + $p->get_attribute( 'class' ), + 'get_attribute() (called before get_updated_html()) did not return class names added via subsequent add_class() calls' + ); + $this->assertSame( + '<div class="my-class my-other-class" id="first"><span id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not include class names added via subsequent add_class() calls' + ); + } + + /** + * @ticket 56299 + * + * @covers remove_attribute + * @covers get_attribute + * @covers get_updated_html + */ + public function test_get_attribute_reflects_removed_attribute_before_it_is_updated() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->remove_attribute( 'id' ); + $this->assertNull( + $p->get_attribute( 'id' ), + 'get_attribute() (called before get_updated_html()) returned attribute that was removed by remove_attribute()' + ); + $this->assertSame( + '<div ><span id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML includes attribute that was removed by remove_attribute()' + ); + } + + /** + * @ticket 56299 + * + * @covers set_attribute + * @covers remove_attribute + * @covers get_attribute + * @covers get_updated_html + */ + public function test_get_attribute_reflects_adding_and_then_removing_an_attribute_before_it_is_updated() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->set_attribute( 'test-attribute', 'test-value' ); + $p->remove_attribute( 'test-attribute' ); + $this->assertNull( + $p->get_attribute( 'test-attribute' ), + 'get_attribute() (called before get_updated_html()) returned attribute that was added via set_attribute() and then removed by remove_attribute()' + ); + $this->assertSame( + self::HTML_SIMPLE, + $p->get_updated_html(), + 'Updated HTML includes attribute that was added via set_attribute() and then removed by remove_attribute()' + ); + } + + /** + * @ticket 56299 + * + * @covers set_attribute + * @covers remove_attribute + * @covers get_attribute + * @covers get_updated_html + */ + public function test_get_attribute_reflects_setting_and_then_removing_an_existing_attribute_before_it_is_updated() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->set_attribute( 'id', 'test-value' ); + $p->remove_attribute( 'id' ); + $this->assertNull( + $p->get_attribute( 'id' ), + 'get_attribute() (called before get_updated_html()) returned attribute that was overwritten by set_attribute() and then removed by remove_attribute()' + ); + $this->assertSame( + '<div ><span id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML includes attribute that was overwritten by set_attribute() and then removed by remove_attribute()' + ); + } + + /** + * @ticket 56299 + * + * @covers remove_class + * @covers get_updated_html + * @covers get_attribute + */ + public function test_get_attribute_reflects_removed_class_names_before_they_are_updated() { + $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); + $p->next_tag(); + $p->remove_class( 'with-border' ); + $this->assertSame( + 'main', + $p->get_attribute( 'class' ), + 'get_attribute() (called before get_updated_html()) returned the wrong attribute after calling remove_attribute()' + ); + $this->assertSame( + '<div class="main" id="first"><span class="not-main bold with-border" id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML includes wrong attribute after calling remove_attribute()' + ); + } + + /** + * @ticket 56299 + * + * @covers add_class + * @covers remove_class + * @covers get_attribute + * @covers get_updated_html + */ + public function test_get_attribute_reflects_setting_and_then_removing_a_class_name_before_it_is_updated() { + $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); + $p->next_tag(); + $p->add_class( 'foo-class' ); + $p->remove_class( 'foo-class' ); + $this->assertSame( + 'main with-border', + $p->get_attribute( 'class' ), + 'get_attribute() (called before get_updated_html()) returned class name that was added via add_class() and then removed by remove_class()' + ); + $this->assertSame( + self::HTML_WITH_CLASSES, + $p->get_updated_html(), + 'Updated HTML includes class that was added via add_class() and then removed by remove_class()' + ); + } + + /** + * @ticket 56299 + * + * @covers add_class + * @covers remove_class + * @covers get_attribute + * @covers get_updated_html + */ + public function test_get_attribute_reflects_duplicating_and_then_removing_an_existing_class_name_before_it_is_updated() { + $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); + $p->next_tag(); + $p->add_class( 'with-border' ); + $p->remove_class( 'with-border' ); + $this->assertSame( + 'main', + $p->get_attribute( 'class' ), + 'get_attribute() (called before get_updated_html()) returned class name that was duplicated via add_class() and then removed by remove_class()' + ); + $this->assertSame( + '<div class="main" id="first"><span class="not-main bold with-border" id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML includes class that was duplicated via add_class() and then removed by remove_class()' + ); + } + + /** + * According to HTML spec, only the first instance of an attribute counts. + * The other ones are ignored. + * + * @ticket 56299 + * + * @covers set_attribute + * @covers get_updated_html + */ + public function test_update_first_when_duplicated_attribute() { + $p = new WP_HTML_Tag_Processor( '<div id="update-me" id="ignored-id"><span id="second">Text</span></div>' ); + $p->next_tag(); + $p->set_attribute( 'id', 'updated-id' ); + $this->assertSame( '<div id="updated-id" id="ignored-id"><span id="second">Text</span></div>', $p->get_updated_html() ); + } + + /** + * @ticket 56299 + * + * @covers set_attribute + * @covers get_updated_html + */ + public function test_set_attribute_with_an_existing_attribute_name_updates_its_value_in_the_markup() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->set_attribute( 'id', 'new-id' ); + $this->assertSame( '<div id="new-id"><span id="second">Text</span></div>', $p->get_updated_html() ); + } + + /** + * @ticket 56299 + * + * @covers set_attribute + * @covers get_updated_html + */ + public function test_next_tag_and_set_attribute_in_a_loop_update_all_tags_in_the_markup() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + while ( $p->next_tag() ) { + $p->set_attribute( 'data-foo', 'bar' ); + } + + $this->assertSame( '<div data-foo="bar" id="first"><span data-foo="bar" id="second">Text</span></div>', $p->get_updated_html() ); + } + + /** + * Removing an attribute that's listed many times, e.g. `<div id="a" id="b" />` should remove + * all its instances and output just `<div />`. + * + * Today, however, WP_HTML_Tag_Processor only removes the first such attribute. It seems like a corner case + * and introducing additional complexity to correctly handle this scenario doesn't seem to be worth it. + * Let's revisit if and when this becomes a problem. + * + * This test is in place to confirm this behavior, while incorrect, is well-defined. + * + * @ticket 56299 + * + * @covers remove_attribute + * @covers get_updated_html + */ + public function test_remove_first_when_duplicated_attribute() { + $p = new WP_HTML_Tag_Processor( '<div id="update-me" id="ignored-id"><span id="second">Text</span></div>' ); + $p->next_tag(); + $p->remove_attribute( 'id' ); + $this->assertSame( '<div id="ignored-id"><span id="second">Text</span></div>', $p->get_updated_html() ); + } + + /** + * @ticket 56299 + * + * @covers remove_attribute + * @covers get_updated_html + */ + public function test_remove_attribute_with_an_existing_attribute_name_removes_it_from_the_markup() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->remove_attribute( 'id' ); + $this->assertSame( '<div ><span id="second">Text</span></div>', $p->get_updated_html() ); + } + + /** + * @ticket 56299 + * + * @covers remove_attribute + * @covers get_updated_html + */ + public function test_remove_attribute_with_a_non_existing_attribute_name_does_not_change_the_markup() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->remove_attribute( 'no-such-attribute' ); + $this->assertSame( self::HTML_SIMPLE, $p->get_updated_html() ); + } + + /** + * @ticket 56299 + * + * @covers add_class + * @covers get_updated_html + * @covers get_attribute + */ + public function test_add_class_creates_a_class_attribute_when_there_is_none() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->add_class( 'foo-class' ); + $this->assertSame( + '<div class="foo-class" id="first"><span id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not include class name added via add_class()' + ); + $this->assertSame( + 'foo-class', + $p->get_attribute( 'class' ), + "get_attribute( 'class' ) did not return class name added via add_class()" + ); + } + + /** + * @ticket 56299 + * + * @covers add_class + * @covers get_updated_html + * @covers get_attribute + */ + public function test_calling_add_class_twice_creates_a_class_attribute_with_both_class_names_when_there_is_no_class_attribute() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->add_class( 'foo-class' ); + $p->add_class( 'bar-class' ); + $this->assertSame( + '<div class="foo-class bar-class" id="first"><span id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not include class names added via subsequent add_class() calls' + ); + $this->assertSame( + 'foo-class bar-class', + $p->get_attribute( 'class' ), + "get_attribute( 'class' ) did not return class names added via subsequent add_class() calls" + ); + } + + /** + * @ticket 56299 + * + * @covers remove_class + * @covers get_updated_html + * @covers get_attribute + */ + public function test_remove_class_does_not_change_the_markup_when_there_is_no_class_attribute() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->remove_class( 'foo-class' ); + $this->assertSame( + self::HTML_SIMPLE, + $p->get_updated_html(), + 'Updated HTML includes class name that was removed by remove_class()' + ); + $this->assertNull( + $p->get_attribute( 'class' ), + "get_attribute( 'class' ) did not return null for class name that was removed by remove_class()" + ); + } + + /** + * @ticket 56299 + * + * @covers add_class + * @covers get_updated_html + * @covers get_attribute + */ + public function test_add_class_appends_class_names_to_the_existing_class_attribute_when_one_already_exists() { + $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); + $p->next_tag(); + $p->add_class( 'foo-class' ); + $p->add_class( 'bar-class' ); + $this->assertSame( + '<div class="main with-border foo-class bar-class" id="first"><span class="not-main bold with-border" id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not reflect class names added to existing class attribute via subsequent add_class() calls' + ); + $this->assertSame( + 'main with-border foo-class bar-class', + $p->get_attribute( 'class' ), + "get_attribute( 'class' ) does not reflect class names added to existing class attribute via subsequent add_class() calls" + ); + } + + /** + * @ticket 56299 + * + * @covers remove_class + * @covers get_updated_html + * @covers get_attribute + */ + public function test_remove_class_removes_a_single_class_from_the_class_attribute_when_one_exists() { + $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); + $p->next_tag(); + $p->remove_class( 'main' ); + $this->assertSame( + '<div class=" with-border" id="first"><span class="not-main bold with-border" id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not reflect class name removed from existing class attribute via remove_class()' + ); + $this->assertSame( + ' with-border', + $p->get_attribute( 'class' ), + "get_attribute( 'class' ) does not reflect class name removed from existing class attribute via remove_class()" + ); + } + + /** + * @ticket 56299 + * + * @covers remove_class + * @covers get_updated_html + * @covers get_attribute + */ + public function test_calling_remove_class_with_all_listed_class_names_removes_the_existing_class_attribute_from_the_markup() { + $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); + $p->next_tag(); + $p->remove_class( 'main' ); + $p->remove_class( 'with-border' ); + $this->assertSame( + '<div id="first"><span class="not-main bold with-border" id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not reflect class attribute removed via subesequent remove_class() calls' + ); + $this->assertNull( + $p->get_attribute( 'class' ), + "get_attribute( 'class' ) did not return null for class attribute removed via subesequent remove_class() calls" + ); + } + + /** + * @ticket 56299 + * + * @covers add_class + * @covers get_updated_html + * @covers get_attribute + */ + public function test_add_class_does_not_add_duplicate_class_names() { + $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); + $p->next_tag(); + $p->add_class( 'with-border' ); + $this->assertSame( + '<div class="main with-border" id="first"><span class="not-main bold with-border" id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not reflect deduplicated class name added via add_class()' + ); + $this->assertSame( + 'main with-border', + $p->get_attribute( 'class' ), + "get_attribute( 'class' ) does not reflect deduplicated class name added via add_class()" + ); + } + + /** + * @ticket 56299 + * + * @covers add_class + * @covers get_updated_html + * @covers get_attribute + */ + public function test_add_class_preserves_class_name_order_when_a_duplicate_class_name_is_added() { + $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); + $p->next_tag(); + $p->add_class( 'main' ); + $this->assertSame( + '<div class="main with-border" id="first"><span class="not-main bold with-border" id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not reflect class name order after adding duplicated class name via add_class()' + ); + $this->assertSame( + 'main with-border', + $p->get_attribute( 'class' ), + "get_attribute( 'class' ) does not reflect class name order after adding duplicated class name added via add_class()" + ); + } + + /** + * @ticket 56299 + * + * @covers add_class + * @covers get_updated_html + * @covers get_attribute + */ + public function test_add_class_when_there_is_a_class_attribute_with_excessive_whitespaces() { + $p = new WP_HTML_Tag_Processor( + '<div class=" main with-border " id="first"><span class="not-main bold with-border" id="second">Text</span></div>' + ); + $p->next_tag(); + $p->add_class( 'foo-class' ); + $this->assertSame( + '<div class=" main with-border foo-class" id="first"><span class="not-main bold with-border" id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not reflect existing excessive whitespace after adding class name via add_class()' + ); + $this->assertSame( + ' main with-border foo-class', + $p->get_attribute( 'class' ), + "get_attribute( 'class' ) does not reflect existing excessive whitespace after adding class name via add_class()" + ); + } + + /** + * @ticket 56299 + * + * @covers remove_class + * @covers get_updated_html + * @covers get_attribute + */ + public function test_remove_class_preserves_whitespaces_when_there_is_a_class_attribute_with_excessive_whitespaces() { + $p = new WP_HTML_Tag_Processor( + '<div class=" main with-border " id="first"><span class="not-main bold with-border" id="second">Text</span></div>' + ); + $p->next_tag(); + $p->remove_class( 'with-border' ); + $this->assertSame( + '<div class=" main" id="first"><span class="not-main bold with-border" id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not reflect existing excessive whitespace after removing class name via remove_class()' + ); + $this->assertSame( + ' main', + $p->get_attribute( 'class' ), + "get_attribute( 'class' ) does not reflect existing excessive whitespace after removing class name via removing_class()" + ); + } + + /** + * @ticket 56299 + * + * @covers remove_class + * @covers get_updated_html + * @covers get_attribute + */ + public function test_removing_all_classes_removes_the_existing_class_attribute_from_the_markup_even_when_excessive_whitespaces_are_present() { + $p = new WP_HTML_Tag_Processor( + '<div class=" main with-border " id="first"><span class="not-main bold with-border" id="second">Text</span></div>' + ); + $p->next_tag(); + $p->remove_class( 'main' ); + $p->remove_class( 'with-border' ); + $this->assertSame( + '<div id="first"><span class="not-main bold with-border" id="second">Text</span></div>', + $p->get_updated_html(), + 'Updated HTML does not reflect removed class attribute after removing all class names via remove_class()' + ); + $this->assertNull( + $p->get_attribute( 'class' ), + "get_attribute( 'class' ) did not return null after removing all class names via remove_class()" + ); + } + + /** + * When add_class( $different_value ) is called _after_ set_attribute( 'class', $value ), the + * final class name should be "$value $different_value". In other words, the `add_class` call + * should append its class to the one(s) set by `set_attribute`. When `add_class( $different_value )` + * is called _before_ `set_attribute( 'class', $value )`, however, the final class name should be + * "$value" instead, as any direct updates to the `class` attribute supersede any changes enqueued + * via the class builder methods. + * + * @ticket 56299 + * + * @covers add_class + * @covers set_attribute + * @covers get_updated_html + * @covers get_attribute + */ + public function test_set_attribute_takes_priority_over_add_class() { + $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); + $p->next_tag(); + $p->add_class( 'add_class' ); + $p->set_attribute( 'class', 'set_attribute' ); + $this->assertSame( + '<div class="set_attribute" id="first"><span class="not-main bold with-border" id="second">Text</span></div>', + $p->get_updated_html(), + "Calling get_updated_html after updating first tag's attributes did not return the expected HTML" + ); + $this->assertSame( + 'set_attribute', + $p->get_attribute( 'class' ), + "Calling get_attribute after updating first tag's attributes did not return the expected class name" + ); + + $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); + $p->next_tag(); + $p->set_attribute( 'class', 'set_attribute' ); + $p->add_class( 'add_class' ); + $this->assertSame( + '<div class="set_attribute add_class" id="first"><span class="not-main bold with-border" id="second">Text</span></div>', + $p->get_updated_html(), + "Calling get_updated_html after updating first tag's attributes did not return the expected HTML" + ); + $this->assertSame( + 'set_attribute add_class', + $p->get_attribute( 'class' ), + "Calling get_attribute after updating first tag's attributes did not return the expected class name" + ); + } + + /** + * When add_class( $different_value ) is called _after_ set_attribute( 'class', $value ), the + * final class name should be "$value $different_value". In other words, the `add_class` call + * should append its class to the one(s) set by `set_attribute`. When `add_class( $different_value )` + * is called _before_ `set_attribute( 'class', $value )`, however, the final class name should be + * "$value" instead, as any direct updates to the `class` attribute supersede any changes enqueued + * via the class builder methods. + * + * This is still true if we read enqueued updates before calling `get_updated_html()`. + * + * @ticket 56299 + * + * @covers add_class + * @covers set_attribute + * @covers get_attribute + * @covers get_updated_html + */ + public function test_set_attribute_takes_priority_over_add_class_even_before_updating() { + $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); + $p->next_tag(); + $p->add_class( 'add_class' ); + $p->set_attribute( 'class', 'set_attribute' ); + $this->assertSame( + 'set_attribute', + $p->get_attribute( 'class' ), + "Calling get_attribute after updating first tag's attributes did not return the expected class name" + ); + $this->assertSame( + '<div class="set_attribute" id="first"><span class="not-main bold with-border" id="second">Text</span></div>', + $p->get_updated_html(), + "Calling get_updated_html after updating first tag's attributes did not return the expected HTML" + ); + + $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); + $p->next_tag(); + $p->set_attribute( 'class', 'set_attribute' ); + $p->add_class( 'add_class' ); + $this->assertSame( + 'set_attribute add_class', + $p->get_attribute( 'class' ), + "Calling get_attribute after updating first tag's attributes did not return the expected class name" + ); + $this->assertSame( + '<div class="set_attribute add_class" id="first"><span class="not-main bold with-border" id="second">Text</span></div>', + $p->get_updated_html(), + "Calling get_updated_html after updating first tag's attributes did not return the expected HTML" + ); + } + + /** + * @ticket 56299 + * + * @covers set_attribute + * @covers add_class + * @covers get_attribute + * @covers get_updated_html + */ + public function test_add_class_overrides_boolean_class_attribute() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->set_attribute( 'class', true ); + $p->add_class( 'add_class' ); + $this->assertSame( + '<div class="add_class" id="first"><span id="second">Text</span></div>', + $p->get_updated_html(), + "Updated HTML doesn't reflect class added via add_class that was originally set as boolean attribute" + ); + $this->assertSame( + 'add_class', + $p->get_attribute( 'class' ), + "get_attribute (called after get_updated_html()) doesn't reflect class added via add_class that was originally set as boolean attribute" + ); + } + + /** + * @ticket 56299 + * + * @covers set_attribute + * @covers add_class + * @covers get_attribute + * @covers get_updated_html + */ + public function test_add_class_overrides_boolean_class_attribute_even_before_updating() { + $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $p->next_tag(); + $p->set_attribute( 'class', true ); + $p->add_class( 'add_class' ); + $this->assertSame( + 'add_class', + $p->get_attribute( 'class' ), + "get_attribute (called before get_updated_html()) doesn't reflect class added via add_class that was originally set as boolean attribute" + ); + $this->assertSame( + '<div class="add_class" id="first"><span id="second">Text</span></div>', + $p->get_updated_html(), + "Updated HTML doesn't reflect class added via add_class that was originally set as boolean attribute" + ); + } + + /** + * @ticket 56299 + * + * @covers set_attribute + * @covers remove_attribute + * @covers add_class + * @covers remove_class + * @covers get_updated_html + */ + public function test_advanced_use_case() { + $input = <<<HTML +<div selected class="merge-message" checked> + <div class="select-menu d-inline-block"> + <div checked class="BtnGroup MixedCaseHTML position-relative" /> + <div checked class="BtnGroup MixedCaseHTML position-relative"> + <button type="button" class="merge-box-button btn-group-merge rounded-left-2 btn BtnGroup-item js-details-target hx_create-pr-button" aria-expanded="false" data-details-container=".js-merge-pr" disabled=""> + Merge pull request + </button> + + <button type="button" class="merge-box-button btn-group-squash rounded-left-2 btn BtnGroup-item js-details-target hx_create-pr-button" aria-expanded="false" data-details-container=".js-merge-pr" disabled=""> + Squash and merge + </button> + + <button type="button" class="merge-box-button btn-group-rebase rounded-left-2 btn BtnGroup-item js-details-target hx_create-pr-button" aria-expanded="false" data-details-container=".js-merge-pr" disabled=""> + Rebase and merge + </button> + + <button aria-label="Select merge method" disabled="disabled" type="button" data-view-component="true" class="select-menu-button btn BtnGroup-item"></button> + </div> + </div> +</div> +HTML; + + $expected_output = <<<HTML +<div data-details="{ "key": "value" }" selected class="merge-message is-processed" checked> + <div class="select-menu d-inline-block"> + <div checked class=" MixedCaseHTML position-relative button-group Another-Mixed-Case" /> + <div checked class=" MixedCaseHTML position-relative button-group Another-Mixed-Case"> + <button type="button" class="merge-box-button btn-group-merge rounded-left-2 btn BtnGroup-item js-details-target hx_create-pr-button" aria-expanded="false" data-details-container=".js-merge-pr" disabled=""> + Merge pull request + </button> + + <button type="button" class="merge-box-button btn-group-squash rounded-left-2 btn BtnGroup-item js-details-target hx_create-pr-button" aria-expanded="false" data-details-container=".js-merge-pr" disabled=""> + Squash and merge + </button> + + <button type="button" aria-expanded="false" data-details-container=".js-merge-pr" disabled=""> + Rebase and merge + </button> + + <button aria-label="Select merge method" disabled="disabled" type="button" data-view-component="true" class="select-menu-button btn BtnGroup-item"></button> + </div> + </div> +</div> +HTML; + + $p = new WP_HTML_Tag_Processor( $input ); + $this->assertTrue( $p->next_tag( 'div' ), 'Querying an existing tag did not return true' ); + $p->set_attribute( 'data-details', '{ "key": "value" }' ); + $p->add_class( 'is-processed' ); + $this->assertTrue( + $p->next_tag( + array( + 'tag_name' => 'div', + 'class_name' => 'BtnGroup', + ) + ), + 'Querying an existing tag did not return true' + ); + $p->remove_class( 'BtnGroup' ); + $p->add_class( 'button-group' ); + $p->add_class( 'Another-Mixed-Case' ); + $this->assertTrue( + $p->next_tag( + array( + 'tag_name' => 'div', + 'class_name' => 'BtnGroup', + ) + ), + 'Querying an existing tag did not return true' + ); + $p->remove_class( 'BtnGroup' ); + $p->add_class( 'button-group' ); + $p->add_class( 'Another-Mixed-Case' ); + $this->assertTrue( + $p->next_tag( + array( + 'tag_name' => 'button', + 'class_name' => 'btn', + 'match_offset' => 3, + ) + ), + 'Querying an existing tag did not return true' + ); + $p->remove_attribute( 'class' ); + $this->assertFalse( $p->next_tag( 'non-existent' ), 'Querying a non-existing tag did not return false' ); + $p->set_attribute( 'class', 'test' ); + $this->assertSame( $expected_output, $p->get_updated_html(), 'Calling get_updated_html after updating the attributes did not return the expected HTML' ); + } + + /** + * @ticket 56299 + * + * @covers remove_attribute + * @covers set_attribute + * @covers get_updated_html + */ + public function test_correctly_parses_html_attributes_wrapped_in_single_quotation_marks() { + $p = new WP_HTML_Tag_Processor( + '<div id=\'first\'><span id=\'second\'>Text</span></div>' + ); + $p->next_tag( + array( + 'tag_name' => 'div', + 'id' => 'first', + ) + ); + $p->remove_attribute( 'id' ); + $p->next_tag( + array( + 'tag_name' => 'span', + 'id' => 'second', + ) + ); + $p->set_attribute( 'id', 'single-quote' ); + $this->assertSame( + '<div ><span id="single-quote">Text</span></div>', + $p->get_updated_html() + ); + } + + /** + * @ticket 56299 + * + * @covers set_attribute + * @covers get_updated_html + */ + public function test_set_attribute_with_value_equals_to_true_adds_a_boolean_html_attribute_with_implicit_value() { + $p = new WP_HTML_Tag_Processor( + '<form action="/action_page.php"><input type="checkbox" name="vehicle" value="Bike"><label for="vehicle">I have a bike</label></form>' + ); + $p->next_tag( 'input' ); + $p->set_attribute( 'checked', true ); + $this->assertSame( + '<form action="/action_page.php"><input checked type="checkbox" name="vehicle" value="Bike"><label for="vehicle">I have a bike</label></form>', + $p->get_updated_html() + ); + } + + /** + * @ticket 56299 + * + * @covers set_attribute + * @covers get_updated_html + */ + public function test_setting_a_boolean_attribute_to_false_removes_it_from_the_markup() { + $p = new WP_HTML_Tag_Processor( + '<form action="/action_page.php"><input checked type="checkbox" name="vehicle" value="Bike"><label for="vehicle">I have a bike</label></form>' + ); + $p->next_tag( 'input' ); + $p->set_attribute( 'checked', false ); + $this->assertSame( + '<form action="/action_page.php"><input type="checkbox" name="vehicle" value="Bike"><label for="vehicle">I have a bike</label></form>', + $p->get_updated_html() + ); + } + + /** + * @ticket 56299 + * + * @covers set_attribute + * @covers get_updated_html + */ + public function test_setting_a_missing_attribute_to_false_does_not_change_the_markup() { + $html_input = '<form action="/action_page.php"><input type="checkbox" name="vehicle" value="Bike"><label for="vehicle">I have a bike</label></form>'; + $p = new WP_HTML_Tag_Processor( $html_input ); + $p->next_tag( 'input' ); + $p->set_attribute( 'checked', false ); + $this->assertSame( $html_input, $p->get_updated_html() ); + } + + /** + * @ticket 56299 + * + * @covers set_attribute + * @covers get_updated_html + */ + public function test_setting_a_boolean_attribute_to_a_string_value_adds_explicit_value_to_the_markup() { + $p = new WP_HTML_Tag_Processor( + '<form action="/action_page.php"><input checked type="checkbox" name="vehicle" value="Bike"><label for="vehicle">I have a bike</label></form>' + ); + $p->next_tag( 'input' ); + $p->set_attribute( 'checked', 'checked' ); + $this->assertSame( + '<form action="/action_page.php"><input checked="checked" type="checkbox" name="vehicle" value="Bike"><label for="vehicle">I have a bike</label></form>', + $p->get_updated_html() + ); + } + + /** + * @ticket 56299 + * + * @covers get_tag + * @covers next_tag + */ + public function test_unclosed_script_tag_should_not_cause_an_infinite_loop() { + $p = new WP_HTML_Tag_Processor( '<script>' ); + $p->next_tag(); + $this->assertSame( 'SCRIPT', $p->get_tag() ); + $p->next_tag(); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * + * @dataProvider data_script_state + */ + public function test_next_tag_ignores_the_contents_of_a_script_tag( $script_then_div ) { + $p = new WP_HTML_Tag_Processor( $script_then_div ); + $p->next_tag(); + $this->assertSame( 'SCRIPT', $p->get_tag(), 'The first found tag was not "script"' ); + $p->next_tag(); + $this->assertSame( 'DIV', $p->get_tag(), 'The second found tag was not "div"' ); + } + + /** + * Data provider for test_ignores_contents_of_a_script_tag(). + * + * @return array { + * @type array { + * @type string $script_then_div The HTML snippet containing script and div tags. + * } + * } + */ + public function data_script_state() { + $examples = array(); + + $examples['Simple script tag'] = array( + '<script><span class="d-none d-md-inline">Back to notifications</span></script><div></div>', + ); + + $examples['Simple uppercase script tag'] = array( + '<script><span class="d-none d-md-inline">Back to notifications</span></SCRIPT><div></div>', + ); + + $examples['Script with a comment opener inside should end at the next script tag closer (dash dash escaped state)'] = array( + '<script class="d-md-none"><!--</script><div></div>-->', + ); + + $examples['Script with a comment opener and a script tag opener inside should end two script tag closer later (double escaped state)'] = array( + '<script class="d-md-none"><!--<script><span1></script><span2></span2></script><div></div>-->', + ); + + $examples['Double escaped script with a tricky opener'] = array( + '<script class="d-md-none"><!--<script attr="</script>"></script>"><div></div>', + ); + + $examples['Double escaped script with a tricky closer'] = array( + '<script class="d-md-none"><!--<script><span></script attr="</script>"><div></div>', + ); + + $examples['Double escaped, then escaped, then double escaped'] = array( + '<script class="d-md-none"><!--<script></script><script></script><span></span></script><div></div>', + ); + + $examples['Script with a commented a script tag opener inside should at the next tag closer (dash dash escaped state)'] = array( + '<script class="d-md-none"><!--<script>--><span></script><div></div>-->', + ); + + $examples['Script closer with another script tag in closer attributes'] = array( + '<script><span class="d-none d-md-inline">Back to notifications</title</span></script <script><div></div>', + ); + + $examples['Script closer with attributes'] = array( + '<script class="d-md-none"><span class="d-none d-md-inline">Back to notifications</span></script id="test"><div></div>', + ); + + $examples['Script opener with title closer inside'] = array( + '<script class="d-md-none">
', + ); + + $examples['Complex script with many parsing states'] = array( + '-->
-->', + ); + return $examples; + } + + /** + * @ticket 56299 + * + * @covers next_tag + * + * @dataProvider data_rcdata_state + */ + public function test_next_tag_ignores_the_contents_of_a_rcdata_tag( $rcdata_then_div, $rcdata_tag ) { + $p = new WP_HTML_Tag_Processor( $rcdata_then_div ); + $p->next_tag(); + $this->assertSame( strtoupper( $rcdata_tag ), $p->get_tag(), "The first found tag was not '$rcdata_tag'" ); + $p->next_tag(); + $this->assertSame( 'DIV', $p->get_tag(), "The second found tag was not 'div'" ); + } + + /** + * Data provider for test_ignores_contents_of_a_rcdata_tag(). + * + * @return array { + * @type array { + * @type string $rcdata_then_div The HTML snippet containing RCDATA and div tags. + * @type string $rcdata_tag The RCDATA tag. + * } + * } + */ + public function data_rcdata_state() { + $examples = array(); + $examples['Simple textarea'] = array( + '
', + 'TEXTAREA', + ); + + $examples['Simple title'] = array( + '<span class="d-none d-md-inline">Back to notifications</title</span>
', + 'TITLE', + ); + + $examples['Comment opener inside a textarea tag should be ignored'] = array( + '
-->', + 'TEXTAREA', + ); + + $examples['Textarea closer with another textarea tag in closer attributes'] = array( + '
', + 'TEXTAREA', + ); + + $examples['Textarea closer with attributes'] = array( + '
', + 'TEXTAREA', + ); + + $examples['Textarea opener with title closer inside'] = array( + '
', + 'TEXTAREA', + ); + return $examples; + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers set_attribute + * @covers get_updated_html + */ + public function test_can_query_and_update_wrongly_nested_tags() { + $p = new WP_HTML_Tag_Processor( + '123

456789

' + ); + $p->next_tag( 'span' ); + $p->set_attribute( 'class', 'span-class' ); + $p->next_tag( 'p' ); + $p->set_attribute( 'class', 'p-class' ); + $this->assertSame( + '123

456789

', + $p->get_updated_html() + ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers remove_attribute + * @covers get_updated_html + */ + public function test_removing_attributes_works_even_in_malformed_html() { + $p = new WP_HTML_Tag_Processor( self::HTML_MALFORMED ); + $p->next_tag( 'span' ); + $p->remove_attribute( 'Notifications<' ); + $this->assertSame( + '
Back to notifications
', + $p->get_updated_html() + ); + } + + /** + * @ticket 56299 + * + * @covers next_Tag + * @covers set_attribute + * @covers get_updated_html + */ + public function test_updating_attributes_works_even_in_malformed_html_1() { + $p = new WP_HTML_Tag_Processor( self::HTML_MALFORMED ); + $p->next_tag( 'span' ); + $p->set_attribute( 'id', 'first' ); + $p->next_tag( 'span' ); + $p->set_attribute( 'id', 'second' ); + $this->assertSame( + '
Back to notifications
', + $p->get_updated_html() + ); + } + + /** + * @ticket 56299 + * + * @covers next_tag + * @covers set_attribute + * @covers add_class + * @covers get_updated_html + * + * @dataProvider data_malformed_tag + */ + public function test_updating_attributes_works_even_in_malformed_html_2( $html_input, $html_expected ) { + $p = new WP_HTML_Tag_Processor( $html_input ); + $p->next_tag(); + $p->set_attribute( 'foo', 'bar' ); + $p->add_class( 'firstTag' ); + $p->next_tag(); + $p->add_class( 'secondTag' ); + $this->assertSame( + $html_expected, + $p->get_updated_html() + ); + } + + /** + * Data provider for test_updates_when_malformed_tag(). + * + * @return array { + * @type array { + * @type string $html_input The input HTML snippet. + * @type string $html_expected The expected HTML snippet after processing. + * } + * } + */ + public function data_malformed_tag() { + $null_byte = chr( 0 ); + $examples = array(); + $examples['Invalid entity inside attribute value'] = array( + 'test', + 'test', + ); + + $examples['HTML tag opening inside attribute value'] = array( + '
This <is> a <strong is="true">thing.
test', + '
This <is> a <strong is="true">thing.
test', + ); + + $examples['HTML tag brackets in attribute values and data markup'] = array( + '
This <is> a <strong is="true">thing.
test', + '
This <is> a <strong is="true">thing.
test', + ); + + $examples['Single and double quotes in attribute value'] = array( + '

test', + '

test', + ); + + $examples['Unquoted attribute values'] = array( + '


test', + '
test', + ); + + $examples['Double-quotes escaped in double-quote attribute value'] = array( + '
test', + '
test', + ); + + $examples['Unquoted attribute value'] = array( + '
test', + '
test', + ); + + $examples['Unquoted attribute value with tag-like value'] = array( + '
>test', + '
>test', + ); + + $examples['Unquoted attribute value with tag-like value followed by tag-like data'] = array( + '
>test', + '
>test', + ); + + $examples['1'] = array( + '
test', + '
test', + ); + + $examples['2'] = array( + '
test', + '
test', + ); + + $examples['4'] = array( + '
test', + '
test', + ); + + $examples['5'] = array( + '
code>test', + '
code>test', + ); + + $examples['6'] = array( + '
test', + '
test', + ); + + $examples['7'] = array( + '
test', + '
test', + ); + + $examples['8'] = array( + '
id="test">test', + '
id="test">test', + ); + + $examples['9'] = array( + '
test', + '
test', + ); + + $examples['10'] = array( + 'test', + 'test', + ); + + $examples['11'] = array( + 'The applicative operator <* works well in Haskell; is what?test', + 'The applicative operator <* works well in Haskell; is what?test', + ); + + $examples['12'] = array( + '<3 is a heart but is a tag.test', + '<3 is a heart but is a tag.test', + ); + + $examples['13'] = array( + 'test', + 'test', + ); + + $examples['14'] = array( + 'test', + 'test', + ); + + $examples['15'] = array( + ' a HTML Tag]]>test', + ' a HTML Tag]]>test', + ); + + $examples['16'] = array( + '
test', + '
test', + ); + + $examples['17'] = array( + '
test', + '
test', + ); + + $examples['18'] = array( + '
test', + '
test', + ); + + $examples['19'] = array( + '
test', + '
test', + ); + + $examples['20'] = array( + '
test', + '
test', + ); + + $examples['21'] = array( + '
test', + '
test', + ); + + $examples['22'] = array( + '
test', + '
test', + ); + + $examples['23'] = array( + '
test', + '
test', + ); + + $examples['24'] = array( + '
test', + '
test', + ); + + $examples['25'] = array( + '
test', + '
test', + ); + + $examples['Multiple unclosed tags treated as a single tag'] = array( + << + test +HTML + , + << + test +HTML + , + ); + + $examples['27'] = array( + '
test', + '
test', + ); + + $examples['28'] = array( + '
test', + '
test', + ); + + return $examples; + } +} From 40e1cb3e794de8f000ff63c07887fe2b85071d91 Mon Sep 17 00:00:00 2001 From: Dennis Snell Date: Mon, 30 Jan 2023 13:29:05 -0700 Subject: [PATCH 02/23] Move class_exists calls to wp-html --- .../class-wp-html-attribute-token.php | 4 ---- src/wp-includes/class-wp-html-span.php | 4 ---- .../class-wp-html-tag-processor.php | 5 ---- .../class-wp-html-text-replacement.php | 4 ---- src/wp-includes/wp-html.php | 24 ++++++++++++------- 5 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/wp-includes/class-wp-html-attribute-token.php b/src/wp-includes/class-wp-html-attribute-token.php index 21147e30bfe1f..7b3d571872358 100644 --- a/src/wp-includes/class-wp-html-attribute-token.php +++ b/src/wp-includes/class-wp-html-attribute-token.php @@ -7,8 +7,6 @@ * @since 6.2.0 */ -if ( ! class_exists( 'WP_HTML_Attribute_Token' ) ) : - /** * Data structure for the attribute token that allows to drastically improve performance. * @@ -89,5 +87,3 @@ public function __construct( $name, $value_start, $value_length, $start, $end, $ $this->is_true = $is_true; } } - -endif; diff --git a/src/wp-includes/class-wp-html-span.php b/src/wp-includes/class-wp-html-span.php index 376e391dc1c44..39e603662b17b 100644 --- a/src/wp-includes/class-wp-html-span.php +++ b/src/wp-includes/class-wp-html-span.php @@ -7,8 +7,6 @@ * @since 6.2.0 */ -if ( ! class_exists( 'WP_HTML_Span' ) ) : - /** * Represents a textual span inside an HTML document. * @@ -52,5 +50,3 @@ public function __construct( $start, $end ) { $this->end = $end; } } - -endif; diff --git a/src/wp-includes/class-wp-html-tag-processor.php b/src/wp-includes/class-wp-html-tag-processor.php index 24e67a3adc83f..0c35e939cccae 100644 --- a/src/wp-includes/class-wp-html-tag-processor.php +++ b/src/wp-includes/class-wp-html-tag-processor.php @@ -26,8 +26,6 @@ * @since 6.2.0 */ -if ( ! class_exists( 'WP_HTML_Tag_Processor' ) ) : - /** * Processes an input HTML document by applying a specified set * of patches to that input. Tokenizes HTML but does not fully @@ -2042,6 +2040,3 @@ private function matches() { return true; } } - -endif; - diff --git a/src/wp-includes/class-wp-html-text-replacement.php b/src/wp-includes/class-wp-html-text-replacement.php index 4461df473aadd..e3ada169d76ef 100644 --- a/src/wp-includes/class-wp-html-text-replacement.php +++ b/src/wp-includes/class-wp-html-text-replacement.php @@ -7,8 +7,6 @@ * @since 6.2.0 */ -if ( ! class_exists( 'WP_HTML_Text_Replacement' ) ) : - /** * Data structure used to replace existing content from start to end that allows to drastically improve performance. * @@ -59,5 +57,3 @@ public function __construct( $start, $end, $text ) { $this->text = $text; } } - -endif; diff --git a/src/wp-includes/wp-html.php b/src/wp-includes/wp-html.php index 1806643104794..a0d238cef7823 100644 --- a/src/wp-includes/wp-html.php +++ b/src/wp-includes/wp-html.php @@ -15,14 +15,20 @@ * terms of speed as well as memory use. */ -/** WP_HTML_Attribute_Token class */ -require_once ABSPATH . WPINC . '/class-wp-html-attribute-token.php'; +if ( ! class_exists( 'WP_HTML_Attribute_Token' ) ) { + /** WP_HTML_Attribute_Token class */ + require_once ABSPATH . WPINC . '/class-wp-html-attribute-token.php'; +} -/** WP_HTML_Span class */ -require_once ABSPATH . WPINC . '/class-wp-html-span.php'; +if ( ! class_exists( 'WP_HTML_Span' ) ) { + /** WP_HTML_Span class */ + require_once ABSPATH . WPINC . '/class-wp-html-span.php'; +} -/** WP_HTML_Text_Replacement class */ -require_once ABSPATH . WPINC . '/class-wp-html-text-replacement.php'; +if ( ! class_exists( 'WP_HTML_Text_Replacement' ) ) { + /** WP_HTML_Text_Replacement class */ + require_once ABSPATH . WPINC . '/class-wp-html-text-replacement.php'; +} /* * The WP_HTML_Tag_Processor is intended for linearly scanning through @@ -30,5 +36,7 @@ * and adding, removing, or modifying attributes on those tags. */ -/** WP_HTML_Tag_Processor class */ -require_once ABSPATH . WPINC . '/class-wp-html-tag-processor.php'; +if ( ! class_exists( 'WP_HTML_Tag_Processor' ) ) { + /** WP_HTML_Tag_Processor class */ + require_once ABSPATH . WPINC . '/class-wp-html-tag-processor.php'; +} From 8b507e5417a2a64c6ac155444e44de2566d5d643 Mon Sep 17 00:00:00 2001 From: Dennis Snell Date: Mon, 30 Jan 2023 13:32:46 -0700 Subject: [PATCH 03/23] Mark helper classes `final` --- src/wp-includes/class-wp-html-attribute-token.php | 2 +- src/wp-includes/class-wp-html-span.php | 2 +- src/wp-includes/class-wp-html-text-replacement.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/class-wp-html-attribute-token.php b/src/wp-includes/class-wp-html-attribute-token.php index 7b3d571872358..05224f8549ef1 100644 --- a/src/wp-includes/class-wp-html-attribute-token.php +++ b/src/wp-includes/class-wp-html-attribute-token.php @@ -17,7 +17,7 @@ * * @see WP_HTML_Tag_Processor */ -class WP_HTML_Attribute_Token { +final class WP_HTML_Attribute_Token { /** * Attribute name. * diff --git a/src/wp-includes/class-wp-html-span.php b/src/wp-includes/class-wp-html-span.php index 39e603662b17b..2f902f3831f03 100644 --- a/src/wp-includes/class-wp-html-span.php +++ b/src/wp-includes/class-wp-html-span.php @@ -20,7 +20,7 @@ * * @see WP_HTML_Tag_Processor */ -class WP_HTML_Span { +final class WP_HTML_Span { /** * Byte offset into document where span begins. * diff --git a/src/wp-includes/class-wp-html-text-replacement.php b/src/wp-includes/class-wp-html-text-replacement.php index e3ada169d76ef..a8341ad33acfe 100644 --- a/src/wp-includes/class-wp-html-text-replacement.php +++ b/src/wp-includes/class-wp-html-text-replacement.php @@ -17,7 +17,7 @@ * * @see WP_HTML_Tag_Processor */ -class WP_HTML_Text_Replacement { +final class WP_HTML_Text_Replacement { /** * Byte offset into document where replacement span begins. * From 561acff5157b9db342244f066d7f5017a7e167a2 Mon Sep 17 00:00:00 2001 From: Dennis Snell Date: Mon, 30 Jan 2023 14:08:30 -0700 Subject: [PATCH 04/23] Updates from review feedback, mostly docs --- .../class-wp-html-tag-processor.php | 45 ++- .../html/wpHtmlTagProcessorBookmarks.php | 38 +- .../tests/html/wpHtmlTagProcessorTest.php | 376 ++++++++++-------- 3 files changed, 255 insertions(+), 204 deletions(-) diff --git a/src/wp-includes/class-wp-html-tag-processor.php b/src/wp-includes/class-wp-html-tag-processor.php index 0c35e939cccae..888271df150c6 100644 --- a/src/wp-includes/class-wp-html-tag-processor.php +++ b/src/wp-includes/class-wp-html-tag-processor.php @@ -239,7 +239,7 @@ class WP_HTML_Tag_Processor { * Whether to visit tag closers, e.g. , when walking an input document. * * @since 6.2.0 - * @var boolean + * @var bool */ private $stop_on_tag_closers; @@ -279,7 +279,7 @@ class WP_HTML_Tag_Processor { * ``` * * @since 6.2.0 - * @var ?int + * @var int|null */ private $tag_name_starts_at; @@ -294,7 +294,7 @@ class WP_HTML_Tag_Processor { * ``` * * @since 6.2.0 - * @var ?int + * @var int|null */ private $tag_name_length; @@ -310,14 +310,14 @@ class WP_HTML_Tag_Processor { * ``` * * @since 6.2.0 - * @var ?int + * @var int|null */ private $tag_ends_at; /** * Whether the current tag is an opening tag, e.g.
, or a closing tag, e.g.
. * - * @var boolean + * @var bool */ private $is_closing_tag; @@ -445,8 +445,8 @@ public function __construct( $html ) { * * @since 6.2.0 * - * @param array|string $query { - * Which tag name to find, having which class, etc. + * @param array|string|null $query { + * Optional. Which tag name to find, having which class, etc. Default is to find any tag. * * @type string|null $tag_name Which tag to find, or `null` for "any tag." * @type int|null $match_offset Find the Nth tag matching all search criteria. @@ -570,21 +570,23 @@ public function next_tag( $query = null ) { * } * ``` * - * Because bookmarks maintain their position they don't - * expose any internal offsets for the HTML document + * Because bookmarks maintain their position, they don't + * expose any internal offsets for the HTML document, * and can't be used with normal string functions. * * Because bookmarks allocate memory and require processing - * for every applied update they are limited and require + * for every applied update, they are limited and require * a name. They should not be created inside a loop. * - * Bookmarks are a powerful tool to enable complicated behavior; - * consider double-checking that you need this tool if you are + * Bookmarks are a powerful tool to enable complicated behavior. + * Consider double-checking that you need this tool if you are * reaching for it, as inappropriate use could lead to broken * HTML structure or unwanted processing overhead. * + * @since 6.2.0 + * * @param string $name Identifies this particular bookmark. - * @return false|void + * @return bool|void * @throws Exception Throws on invalid bookmark name if WP_DEBUG set. */ public function set_bookmark( $name ) { @@ -742,7 +744,7 @@ private function skip_script_data() { * escaped mode if we aren't already there. * * Inside the escaped modes it's ignored and - * shouldn't ever pull us out of double-escaped + * should never pull us out of double-escaped * and back into escaped. * * We'll continue parsing past it regardless of @@ -878,9 +880,11 @@ private function parse_next_tag() { return true; } - // If we didn't find a tag opener, and we can't be - // transitioning into different markup states, then - // we can abort because there aren't any more tags. + /* + * If we didn't find a tag opener, and we can't be + * transitioning into different markup states, then + * we can abort because there aren't any more tags. + */ if ( $at + 1 >= strlen( $html ) ) { return false; } @@ -1111,11 +1115,12 @@ private function after_tag() { * Converts class name updates into tag attributes updates * (they are accumulated in different data formats for performance). * - * @return void * @since 6.2.0 * * @see $classname_updates * @see $lexical_updates + * + * @return void */ private function class_name_updates_to_attributes_updates() { if ( count( $this->classname_updates ) === 0 ) { @@ -1155,7 +1160,7 @@ private function class_name_updates_to_attributes_updates() { * Tracks the cursor position in the existing class * attribute value where we're currently parsing. * - * @var integer + * @var int */ $at = 0; @@ -1173,7 +1178,7 @@ private function class_name_updates_to_attributes_updates() { * * This flag is set upon the first change that requires a string update. * - * @var boolean + * @var bool */ $modified = false; diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php b/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php index c92d0023d16c2..25a335453ccbc 100644 --- a/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php +++ b/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php @@ -18,7 +18,7 @@ class WP_HTML_Tag_Processor_Bookmark_Test extends WP_UnitTestCase { /** * @ticket 56299 * - * @covers set_bookmark + * @covers ::set_bookmark */ public function test_set_bookmark() { $p = new WP_HTML_Tag_Processor( '
  • One
  • Two
  • Three
' ); @@ -32,7 +32,7 @@ public function test_set_bookmark() { /** * @ticket 56299 * - * @covers release_bookmark + * @covers ::release_bookmark */ public function test_release_bookmark() { $p = new WP_HTML_Tag_Processor( '
  • One
  • Two
  • Three
' ); @@ -45,8 +45,8 @@ public function test_release_bookmark() { /** * @ticket 56299 * - * @covers seek - * @covers set_bookmark + * @covers ::seek + * @covers ::set_bookmark */ public function test_seek() { $p = new WP_HTML_Tag_Processor( '
  • One
  • Two
  • Three
' ); @@ -100,9 +100,9 @@ public function test_seek() { * * @ticket 56299 * - * @covers seek - * @covers set_bookmark - * @covers apply_attributes_updates + * @covers ::seek + * @covers ::set_bookmark + * @covers ::apply_attributes_updates */ public function test_removing_long_attributes_doesnt_break_seek() { $input = <<First
Second
' ); @@ -261,8 +261,8 @@ public function test_updates_bookmark_for_additions_after_both_sides() { /** * @ticket 56299 * - * @covers seek - * @covers set_bookmark + * @covers ::seek + * @covers ::set_bookmark */ public function test_updates_bookmark_for_additions_before_both_sides() { $p = new WP_HTML_Tag_Processor( '
First
Second
' ); @@ -286,8 +286,8 @@ public function test_updates_bookmark_for_additions_before_both_sides() { /** * @ticket 56299 * - * @covers seek - * @covers set_bookmark + * @covers ::seek + * @covers ::set_bookmark */ public function test_updates_bookmark_for_deletions_after_both_sides() { $p = new WP_HTML_Tag_Processor( '
First
Second
' ); @@ -309,8 +309,8 @@ public function test_updates_bookmark_for_deletions_after_both_sides() { /** * @ticket 56299 * - * @covers seek - * @covers set_bookmark + * @covers ::seek + * @covers ::set_bookmark */ public function test_updates_bookmark_for_deletions_before_both_sides() { $p = new WP_HTML_Tag_Processor( '
First
Second
' ); @@ -335,7 +335,7 @@ public function test_updates_bookmark_for_deletions_before_both_sides() { /** * @ticket 56299 * - * @covers set_bookmark + * @covers ::set_bookmark */ public function test_limits_the_number_of_bookmarks() { $p = new WP_HTML_Tag_Processor( '
  • One
  • Two
  • Three
' ); @@ -353,7 +353,7 @@ public function test_limits_the_number_of_bookmarks() { /** * @ticket 56299 * - * @covers seek + * @covers ::seek */ public function test_limits_the_number_of_seek_calls() { $p = new WP_HTML_Tag_Processor( '
  • One
  • Two
  • Three
' ); diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php b/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php index 92f87099362ec..e5a19e82dbde8 100644 --- a/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php +++ b/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php @@ -140,7 +140,7 @@ public function test_get_attribute_returns_string_for_truthy_attributes() { /** * @ticket 56299 * - * @covers WP_HTML_Tag_Processor::get_attribute + * @covers ::get_attribute */ public function test_get_attribute_decodes_html_character_references() { $p = new WP_HTML_Tag_Processor( '
' ); @@ -151,8 +151,8 @@ public function test_get_attribute_decodes_html_character_references() { /** * @ticket 56299 * - * @covers next_tag - * @covers get_attribute + * @covers ::next_tag + * @covers ::get_attribute */ public function test_attributes_parser_treats_slash_as_attribute_separator() { $p = new WP_HTML_Tag_Processor( '
Test
' ); @@ -167,26 +167,58 @@ public function test_attributes_parser_treats_slash_as_attribute_separator() { /** * @ticket 56299 * - * @covers next_tag - * @covers get_attribute + * @covers ::next_tag + * @covers ::get_attribute + * + * @dataProvider data_attribute_name_case_variants + * + * @param string $attribute_name Name of data-enabled attribute with case variations. */ - public function test_attributes_parser_is_case_insensitive() { - $p = new WP_HTML_Tag_Processor( '
Test
' ); + public function test_get_attribute_is_case_insensitive_for_attributes_with_values( $attribute_name ) { + $p = new WP_HTML_Tag_Processor( '
Test
' ); $p->next_tag(); - $p->get_attribute( 'data-enabled' ); - $this->assertEquals( 'true', $p->get_attribute( 'DATA-enabled' ), 'A case-insensitive get_attribute call did not return "true".' ); - $this->assertEquals( 'true', $p->get_attribute( 'data-enabled' ), 'A case-insensitive get_attribute call did not return "true".' ); - $this->assertEquals( 'true', $p->get_attribute( 'DATA-ENABLED' ), 'A case-insensitive get_attribute call did not return "true".' ); - $this->assertEquals( true, $p->get_attribute( 'data-VISIBLE' ), 'A case-insensitive get_attribute call did not return true.' ); - $this->assertEquals( true, $p->get_attribute( 'DATA-visible' ), 'A case-insensitive get_attribute call did not return true.' ); - $this->assertEquals( true, $p->get_attribute( 'dAtA-ViSiBlE' ), 'A case-insensitive get_attribute call did not return true.' ); + $this->assertSame( 'true', $p->get_attribute( $attribute_name ) ); } /** * @ticket 56299 * - * @covers next_tag - * @covers remove_attribute + * @covers ::next_tag + * @covers ::get_attribute + * + * @dataProvider data_attribute_name_case_variants + * + * @param string $attribute_name Name of data-enabled attribute with case variations. + */ + public function test_attributes_parser_is_case_insensitive_for_attributes_without_values( $attribute_name ) { + $p = new WP_HTML_Tag_Processor( '
Test
' ); + $p->next_tag(); + $this->assertTrue( $p->get_attribute( $attribute_name ) ); + } + + /** + * Data provider for attribute names in various casings. + * + * @return array { + * @type array { + * @type string $attribute_name Name of data-enabled attribute with case variations. + * } + * } + */ + public function data_attribute_name_case_variants() { + return array( + array( 'DATA-enabled' ), + array( 'data-enabled' ), + array( 'DATA-ENABLED' ), + array( 'DatA-EnABled' ), + ); + } + + /** + * @ticket 56299 + * + * @covers ::next_tag + * @covers ::remove_attribute */ public function test_remove_attribute_is_case_insensitive() { $p = new WP_HTML_Tag_Processor( '
Test
' ); @@ -198,8 +230,8 @@ public function test_remove_attribute_is_case_insensitive() { /** * @ticket 56299 * - * @covers next_tag - * @covers set_attribute + * @covers ::next_tag + * @covers ::set_attribute */ public function test_set_attribute_is_case_insensitive() { $p = new WP_HTML_Tag_Processor( '
Test
' ); @@ -211,7 +243,7 @@ public function test_set_attribute_is_case_insensitive() { /** * @ticket 56299 * - * @covers get_attribute_names_with_prefix + * @covers ::get_attribute_names_with_prefix */ public function test_get_attribute_names_with_prefix_returns_null_before_finding_tags() { $p = new WP_HTML_Tag_Processor( '
Test
' ); @@ -221,7 +253,7 @@ public function test_get_attribute_names_with_prefix_returns_null_before_finding /** * @ticket 56299 * - * @covers get_attribute_names_with_prefix + * @covers ::get_attribute_names_with_prefix */ public function test_get_attribute_names_with_prefix_returns_null_when_not_in_open_tag() { $p = new WP_HTML_Tag_Processor( '
Test
' ); @@ -232,7 +264,7 @@ public function test_get_attribute_names_with_prefix_returns_null_when_not_in_op /** * @ticket 56299 * - * @covers get_attribute_names_with_prefix + * @covers ::get_attribute_names_with_prefix */ public function test_get_attribute_names_with_prefix_returns_null_when_in_closing_tag() { $p = new WP_HTML_Tag_Processor( '
Test
' ); @@ -244,7 +276,7 @@ public function test_get_attribute_names_with_prefix_returns_null_when_in_closin /** * @ticket 56299 * - * @covers get_attribute_names_with_prefix + * @covers ::get_attribute_names_with_prefix */ public function test_get_attribute_names_with_prefix_returns_empty_array_when_no_attributes_present() { $p = new WP_HTML_Tag_Processor( '
Test
' ); @@ -255,7 +287,7 @@ public function test_get_attribute_names_with_prefix_returns_empty_array_when_no /** * @ticket 56299 * - * @covers get_attribute_names_with_prefix + * @covers ::get_attribute_names_with_prefix */ public function test_get_attribute_names_with_prefix_returns_matching_attribute_names_in_lowercase() { $p = new WP_HTML_Tag_Processor( '
Test
' ); @@ -269,9 +301,9 @@ public function test_get_attribute_names_with_prefix_returns_matching_attribute_ /** * @ticket 56299 * - * @covers set_attribute - * @covers get_updated_html - * @covers get_attribute_names_with_prefix + * @covers ::set_attribute + * @covers ::get_updated_html + * @covers ::get_attribute_names_with_prefix */ public function test_get_attribute_names_with_prefix_returns_attribute_added_by_set_attribute() { $p = new WP_HTML_Tag_Processor( '
Test
' ); @@ -292,9 +324,9 @@ public function test_get_attribute_names_with_prefix_returns_attribute_added_by_ /** * @ticket 56299 * - * @covers __toString + * @covers ::__toString */ - public function tostring_returns_updated_html() { + public function test_to_string_returns_updated_html() { $p = new WP_HTML_Tag_Processor( '
Test
' ); $p->next_tag(); $p->remove_attribute( 'id' ); @@ -312,7 +344,7 @@ public function tostring_returns_updated_html() { /** * @ticket 56299 * - * @covers get_updated_html + * @covers ::get_updated_html */ public function test_get_updated_html_applies_the_updates_so_far_and_keeps_the_processor_on_the_current_tag() { $p = new WP_HTML_Tag_Processor( '
Test
' ); @@ -348,7 +380,7 @@ public function test_get_updated_html_applies_the_updates_so_far_and_keeps_the_p /** * @ticket 56299 * - * @covers get_updated_html + * @covers ::get_updated_html */ public function test_get_updated_html_without_updating_any_attributes_returns_the_original_html() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -358,7 +390,7 @@ public function test_get_updated_html_without_updating_any_attributes_returns_th /** * @ticket 56299 * - * @covers next_tag + * @covers ::next_tag */ public function test_next_tag_with_no_arguments_should_find_the_next_existing_tag() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -368,7 +400,7 @@ public function test_next_tag_with_no_arguments_should_find_the_next_existing_ta /** * @ticket 56299 * - * @covers next_tag + * @covers ::next_tag */ public function test_next_tag_should_return_false_for_a_non_existing_tag() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -376,8 +408,10 @@ public function test_next_tag_should_return_false_for_a_non_existing_tag() { } /** - * @covers next_tag - * @covers is_tag_closer + * @ticket 56299 + * + * @covers ::next_tag + * @covers ::is_tag_closer */ public function test_next_tag_should_stop_on_closers_only_when_requested() { $p = new WP_HTML_Tag_Processor( '
' ); @@ -407,8 +441,8 @@ public function test_next_tag_should_stop_on_closers_only_when_requested() { /** * @ticket 56299 * - * @covers next_tag - * @covers get_updated_html + * @covers ::next_tag + * @covers ::get_updated_html */ public function test_set_attribute_on_a_non_existing_tag_does_not_change_the_markup() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -422,6 +456,16 @@ public function test_set_attribute_on_a_non_existing_tag_does_not_change_the_mar ); } + /** + * @ticket 56299 + * + * @covers ::is_tag_closer + * @covers ::set_attribute + * @covers ::remove_attribute + * @covers ::add_class + * @covers ::remove_class + * @covers ::get_updated_html + */ public function test_attribute_ops_on_tag_closer_do_not_change_the_markup() { $p = new WP_HTML_Tag_Processor( '
' ); $p->next_tag( @@ -469,7 +513,9 @@ public function test_attribute_ops_on_tag_closer_do_not_change_the_markup() { * @ticket 56299 * * @dataProvider data_set_attribute_escapable_values - * @covers set_attribute + * @covers ::set_attribute + * + * @param string $attribute_value Value with potential XSS exploit. */ public function test_set_attribute_prevents_xss( $attribute_value ) { $p = new WP_HTML_Tag_Processor( '
' ); @@ -514,9 +560,9 @@ public function data_set_attribute_escapable_values() { /** * @ticket 56299 * - * @covers set_attribute - * @covers get_updated_html - * @covers get_attribute + * @covers ::set_attribute + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_set_attribute_with_a_non_existing_attribute_adds_a_new_attribute_to_the_markup() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -537,9 +583,9 @@ public function test_set_attribute_with_a_non_existing_attribute_adds_a_new_attr /** * @ticket 56299 * - * @covers set_attribute - * @covers get_updated_html - * @covers get_attribute + * @covers ::set_attribute + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_get_attribute_returns_updated_values_before_they_are_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -576,9 +622,9 @@ public function test_get_attribute_returns_updated_values_before_they_are_update /** * @ticket 56299 * - * @covers add_class - * @covers get_updated_html - * @covers get_attribute + * @covers ::add_class + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_get_attribute_reflects_added_class_names_before_they_are_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -599,9 +645,9 @@ public function test_get_attribute_reflects_added_class_names_before_they_are_up /** * @ticket 56299 * - * @covers add_class - * @covers get_updated_html - * @covers get_attribute + * @covers ::add_class + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_get_attribute_reflects_added_class_names_before_they_are_updated_and_retains_classes_from_previous_add_class_calls() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -628,9 +674,9 @@ public function test_get_attribute_reflects_added_class_names_before_they_are_up /** * @ticket 56299 * - * @covers remove_attribute - * @covers get_attribute - * @covers get_updated_html + * @covers ::remove_attribute + * @covers ::get_attribute + * @covers ::get_updated_html */ public function test_get_attribute_reflects_removed_attribute_before_it_is_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -650,10 +696,10 @@ public function test_get_attribute_reflects_removed_attribute_before_it_is_updat /** * @ticket 56299 * - * @covers set_attribute - * @covers remove_attribute - * @covers get_attribute - * @covers get_updated_html + * @covers ::set_attribute + * @covers ::remove_attribute + * @covers ::get_attribute + * @covers ::get_updated_html */ public function test_get_attribute_reflects_adding_and_then_removing_an_attribute_before_it_is_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -674,10 +720,10 @@ public function test_get_attribute_reflects_adding_and_then_removing_an_attribut /** * @ticket 56299 * - * @covers set_attribute - * @covers remove_attribute - * @covers get_attribute - * @covers get_updated_html + * @covers ::set_attribute + * @covers ::remove_attribute + * @covers ::get_attribute + * @covers ::get_updated_html */ public function test_get_attribute_reflects_setting_and_then_removing_an_existing_attribute_before_it_is_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -698,9 +744,9 @@ public function test_get_attribute_reflects_setting_and_then_removing_an_existin /** * @ticket 56299 * - * @covers remove_class - * @covers get_updated_html - * @covers get_attribute + * @covers ::remove_class + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_get_attribute_reflects_removed_class_names_before_they_are_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); @@ -721,10 +767,10 @@ public function test_get_attribute_reflects_removed_class_names_before_they_are_ /** * @ticket 56299 * - * @covers add_class - * @covers remove_class - * @covers get_attribute - * @covers get_updated_html + * @covers ::add_class + * @covers ::remove_class + * @covers ::get_attribute + * @covers ::get_updated_html */ public function test_get_attribute_reflects_setting_and_then_removing_a_class_name_before_it_is_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); @@ -746,10 +792,10 @@ public function test_get_attribute_reflects_setting_and_then_removing_a_class_na /** * @ticket 56299 * - * @covers add_class - * @covers remove_class - * @covers get_attribute - * @covers get_updated_html + * @covers ::add_class + * @covers ::remove_class + * @covers ::get_attribute + * @covers ::get_updated_html */ public function test_get_attribute_reflects_duplicating_and_then_removing_an_existing_class_name_before_it_is_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); @@ -774,8 +820,8 @@ public function test_get_attribute_reflects_duplicating_and_then_removing_an_exi * * @ticket 56299 * - * @covers set_attribute - * @covers get_updated_html + * @covers ::set_attribute + * @covers ::get_updated_html */ public function test_update_first_when_duplicated_attribute() { $p = new WP_HTML_Tag_Processor( '
Text
' ); @@ -787,8 +833,8 @@ public function test_update_first_when_duplicated_attribute() { /** * @ticket 56299 * - * @covers set_attribute - * @covers get_updated_html + * @covers ::set_attribute + * @covers ::get_updated_html */ public function test_set_attribute_with_an_existing_attribute_name_updates_its_value_in_the_markup() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -800,8 +846,8 @@ public function test_set_attribute_with_an_existing_attribute_name_updates_its_v /** * @ticket 56299 * - * @covers set_attribute - * @covers get_updated_html + * @covers ::set_attribute + * @covers ::get_updated_html */ public function test_next_tag_and_set_attribute_in_a_loop_update_all_tags_in_the_markup() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -824,8 +870,8 @@ public function test_next_tag_and_set_attribute_in_a_loop_update_all_tags_in_the * * @ticket 56299 * - * @covers remove_attribute - * @covers get_updated_html + * @covers ::remove_attribute + * @covers ::get_updated_html */ public function test_remove_first_when_duplicated_attribute() { $p = new WP_HTML_Tag_Processor( '
Text
' ); @@ -837,8 +883,8 @@ public function test_remove_first_when_duplicated_attribute() { /** * @ticket 56299 * - * @covers remove_attribute - * @covers get_updated_html + * @covers ::remove_attribute + * @covers ::get_updated_html */ public function test_remove_attribute_with_an_existing_attribute_name_removes_it_from_the_markup() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -850,8 +896,8 @@ public function test_remove_attribute_with_an_existing_attribute_name_removes_it /** * @ticket 56299 * - * @covers remove_attribute - * @covers get_updated_html + * @covers ::remove_attribute + * @covers ::get_updated_html */ public function test_remove_attribute_with_a_non_existing_attribute_name_does_not_change_the_markup() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -863,9 +909,9 @@ public function test_remove_attribute_with_a_non_existing_attribute_name_does_no /** * @ticket 56299 * - * @covers add_class - * @covers get_updated_html - * @covers get_attribute + * @covers ::add_class + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_add_class_creates_a_class_attribute_when_there_is_none() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -886,9 +932,9 @@ public function test_add_class_creates_a_class_attribute_when_there_is_none() { /** * @ticket 56299 * - * @covers add_class - * @covers get_updated_html - * @covers get_attribute + * @covers ::add_class + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_calling_add_class_twice_creates_a_class_attribute_with_both_class_names_when_there_is_no_class_attribute() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -910,9 +956,9 @@ public function test_calling_add_class_twice_creates_a_class_attribute_with_both /** * @ticket 56299 * - * @covers remove_class - * @covers get_updated_html - * @covers get_attribute + * @covers ::remove_class + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_remove_class_does_not_change_the_markup_when_there_is_no_class_attribute() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -932,9 +978,9 @@ public function test_remove_class_does_not_change_the_markup_when_there_is_no_cl /** * @ticket 56299 * - * @covers add_class - * @covers get_updated_html - * @covers get_attribute + * @covers ::add_class + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_add_class_appends_class_names_to_the_existing_class_attribute_when_one_already_exists() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); @@ -956,9 +1002,9 @@ public function test_add_class_appends_class_names_to_the_existing_class_attribu /** * @ticket 56299 * - * @covers remove_class - * @covers get_updated_html - * @covers get_attribute + * @covers ::remove_class + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_remove_class_removes_a_single_class_from_the_class_attribute_when_one_exists() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); @@ -979,9 +1025,9 @@ public function test_remove_class_removes_a_single_class_from_the_class_attribut /** * @ticket 56299 * - * @covers remove_class - * @covers get_updated_html - * @covers get_attribute + * @covers ::remove_class + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_calling_remove_class_with_all_listed_class_names_removes_the_existing_class_attribute_from_the_markup() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); @@ -1002,9 +1048,9 @@ public function test_calling_remove_class_with_all_listed_class_names_removes_th /** * @ticket 56299 * - * @covers add_class - * @covers get_updated_html - * @covers get_attribute + * @covers ::add_class + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_add_class_does_not_add_duplicate_class_names() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); @@ -1025,9 +1071,9 @@ public function test_add_class_does_not_add_duplicate_class_names() { /** * @ticket 56299 * - * @covers add_class - * @covers get_updated_html - * @covers get_attribute + * @covers ::add_class + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_add_class_preserves_class_name_order_when_a_duplicate_class_name_is_added() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); @@ -1048,9 +1094,9 @@ public function test_add_class_preserves_class_name_order_when_a_duplicate_class /** * @ticket 56299 * - * @covers add_class - * @covers get_updated_html - * @covers get_attribute + * @covers ::add_class + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_add_class_when_there_is_a_class_attribute_with_excessive_whitespaces() { $p = new WP_HTML_Tag_Processor( @@ -1073,9 +1119,9 @@ public function test_add_class_when_there_is_a_class_attribute_with_excessive_wh /** * @ticket 56299 * - * @covers remove_class - * @covers get_updated_html - * @covers get_attribute + * @covers ::remove_class + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_remove_class_preserves_whitespaces_when_there_is_a_class_attribute_with_excessive_whitespaces() { $p = new WP_HTML_Tag_Processor( @@ -1098,9 +1144,9 @@ public function test_remove_class_preserves_whitespaces_when_there_is_a_class_at /** * @ticket 56299 * - * @covers remove_class - * @covers get_updated_html - * @covers get_attribute + * @covers ::remove_class + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_removing_all_classes_removes_the_existing_class_attribute_from_the_markup_even_when_excessive_whitespaces_are_present() { $p = new WP_HTML_Tag_Processor( @@ -1130,10 +1176,10 @@ public function test_removing_all_classes_removes_the_existing_class_attribute_f * * @ticket 56299 * - * @covers add_class - * @covers set_attribute - * @covers get_updated_html - * @covers get_attribute + * @covers ::add_class + * @covers ::set_attribute + * @covers ::get_updated_html + * @covers ::get_attribute */ public function test_set_attribute_takes_priority_over_add_class() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); @@ -1179,10 +1225,10 @@ public function test_set_attribute_takes_priority_over_add_class() { * * @ticket 56299 * - * @covers add_class - * @covers set_attribute - * @covers get_attribute - * @covers get_updated_html + * @covers ::add_class + * @covers ::set_attribute + * @covers ::get_attribute + * @covers ::get_updated_html */ public function test_set_attribute_takes_priority_over_add_class_even_before_updating() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); @@ -1219,10 +1265,10 @@ public function test_set_attribute_takes_priority_over_add_class_even_before_upd /** * @ticket 56299 * - * @covers set_attribute - * @covers add_class - * @covers get_attribute - * @covers get_updated_html + * @covers ::set_attribute + * @covers ::add_class + * @covers ::get_attribute + * @covers ::get_updated_html */ public function test_add_class_overrides_boolean_class_attribute() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -1244,10 +1290,10 @@ public function test_add_class_overrides_boolean_class_attribute() { /** * @ticket 56299 * - * @covers set_attribute - * @covers add_class - * @covers get_attribute - * @covers get_updated_html + * @covers ::set_attribute + * @covers ::add_class + * @covers ::get_attribute + * @covers ::get_updated_html */ public function test_add_class_overrides_boolean_class_attribute_even_before_updating() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -1269,11 +1315,11 @@ public function test_add_class_overrides_boolean_class_attribute_even_before_upd /** * @ticket 56299 * - * @covers set_attribute - * @covers remove_attribute - * @covers add_class - * @covers remove_class - * @covers get_updated_html + * @covers ::set_attribute + * @covers ::remove_attribute + * @covers ::add_class + * @covers ::remove_class + * @covers ::get_updated_html */ public function test_advanced_use_case() { $input = <<' ); @@ -1481,7 +1527,7 @@ public function test_unclosed_script_tag_should_not_cause_an_infinite_loop() { /** * @ticket 56299 * - * @covers next_tag + * @covers ::next_tag * * @dataProvider data_script_state */ @@ -1558,7 +1604,7 @@ public function data_script_state() { /** * @ticket 56299 * - * @covers next_tag + * @covers ::next_tag * * @dataProvider data_rcdata_state */ @@ -1617,9 +1663,9 @@ public function data_rcdata_state() { /** * @ticket 56299 * - * @covers next_tag - * @covers set_attribute - * @covers get_updated_html + * @covers ::next_tag + * @covers ::set_attribute + * @covers ::get_updated_html */ public function test_can_query_and_update_wrongly_nested_tags() { $p = new WP_HTML_Tag_Processor( @@ -1638,9 +1684,9 @@ public function test_can_query_and_update_wrongly_nested_tags() { /** * @ticket 56299 * - * @covers next_tag - * @covers remove_attribute - * @covers get_updated_html + * @covers ::next_tag + * @covers ::remove_attribute + * @covers ::get_updated_html */ public function test_removing_attributes_works_even_in_malformed_html() { $p = new WP_HTML_Tag_Processor( self::HTML_MALFORMED ); @@ -1655,9 +1701,9 @@ public function test_removing_attributes_works_even_in_malformed_html() { /** * @ticket 56299 * - * @covers next_Tag - * @covers set_attribute - * @covers get_updated_html + * @covers ::next_Tag + * @covers ::set_attribute + * @covers ::get_updated_html */ public function test_updating_attributes_works_even_in_malformed_html_1() { $p = new WP_HTML_Tag_Processor( self::HTML_MALFORMED ); @@ -1674,10 +1720,10 @@ public function test_updating_attributes_works_even_in_malformed_html_1() { /** * @ticket 56299 * - * @covers next_tag - * @covers set_attribute - * @covers add_class - * @covers get_updated_html + * @covers ::next_tag + * @covers ::set_attribute + * @covers ::add_class + * @covers ::get_updated_html * * @dataProvider data_malformed_tag */ From 57550e7440998d3046421572812b4d705c19257b Mon Sep 17 00:00:00 2001 From: hellofromtonya Date: Mon, 30 Jan 2023 15:39:48 -0600 Subject: [PATCH 05/23] WP_HTML_Tag_Processor_Test: test improvements * Rename data providers to match test per coding standard. * Restructure data provider datasets into a single array form for consistency. * Add `WP_HTML_Tag_Processor::` to @covers methods per coding standard. * Add empty line between set up and assertion groupings. * Moved well-formed HTML into separate test of updating attributes. * Replaced assertEquals() with assertSame(). --- .../tests/html/wpHtmlTagProcessorTest.php | 1048 +++++++++-------- 1 file changed, 585 insertions(+), 463 deletions(-) diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php b/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php index e5a19e82dbde8..29930029f724d 100644 --- a/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php +++ b/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php @@ -21,21 +21,23 @@ class WP_HTML_Tag_Processor_Test extends WP_UnitTestCase { /** * @ticket 56299 * - * @covers get_tag + * @covers WP_HTML_Tag_Processor::get_tag */ public function test_get_tag_returns_null_before_finding_tags() { $p = new WP_HTML_Tag_Processor( '
Test
' ); + $this->assertNull( $p->get_tag() ); } /** * @ticket 56299 * - * @covers next_tag - * @covers get_tag + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::get_tag */ public function test_get_tag_returns_null_when_not_in_open_tag() { $p = new WP_HTML_Tag_Processor( '
Test
' ); + $this->assertFalse( $p->next_tag( 'p' ), 'Querying a non-existing tag did not return false' ); $this->assertNull( $p->get_tag(), 'Accessing a non-existing tag did not return null' ); } @@ -43,11 +45,12 @@ public function test_get_tag_returns_null_when_not_in_open_tag() { /** * @ticket 56299 * - * @covers next_tag - * @covers get_tag + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::get_tag */ public function test_get_tag_returns_open_tag_name() { $p = new WP_HTML_Tag_Processor( '
Test
' ); + $this->assertTrue( $p->next_tag( 'div' ), 'Querying an existing tag did not return true' ); $this->assertSame( 'DIV', $p->get_tag(), 'Accessing an existing tag name did not return "div"' ); } @@ -55,21 +58,23 @@ public function test_get_tag_returns_open_tag_name() { /** * @ticket 56299 * - * @covers get_attribute + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_get_attribute_returns_null_before_finding_tags() { $p = new WP_HTML_Tag_Processor( '
Test
' ); + $this->assertNull( $p->get_attribute( 'class' ) ); } /** * @ticket 56299 * - * @covers next_tag - * @covers get_attribute + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_get_attribute_returns_null_when_not_in_open_tag() { $p = new WP_HTML_Tag_Processor( '
Test
' ); + $this->assertFalse( $p->next_tag( 'p' ), 'Querying a non-existing tag did not return false' ); $this->assertNull( $p->get_attribute( 'class' ), 'Accessing an attribute of a non-existing tag did not return null' ); } @@ -77,11 +82,12 @@ public function test_get_attribute_returns_null_when_not_in_open_tag() { /** * @ticket 56299 * - * @covers next_tag - * @covers get_attribute + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_get_attribute_returns_null_when_in_closing_tag() { $p = new WP_HTML_Tag_Processor( '
Test
' ); + $this->assertTrue( $p->next_tag( 'div' ), 'Querying an existing tag did not return true' ); $this->assertTrue( $p->next_tag( array( 'tag_closers' => 'visit' ) ), 'Querying an existing closing tag did not return true' ); $this->assertNull( $p->get_attribute( 'class' ), 'Accessing an attribute of a closing tag did not return null' ); @@ -90,11 +96,12 @@ public function test_get_attribute_returns_null_when_in_closing_tag() { /** * @ticket 56299 * - * @covers next_tag - * @covers get_attribute + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_get_attribute_returns_null_when_attribute_missing() { $p = new WP_HTML_Tag_Processor( '
Test
' ); + $this->assertTrue( $p->next_tag( 'div' ), 'Querying an existing tag did not return true' ); $this->assertNull( $p->get_attribute( 'test-id' ), 'Accessing a non-existing attribute did not return null' ); } @@ -102,11 +109,12 @@ public function test_get_attribute_returns_null_when_attribute_missing() { /** * @ticket 56299 * - * @covers next_tag - * @covers get_attribute + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_get_attribute_returns_attribute_value() { $p = new WP_HTML_Tag_Processor( '
Test
' ); + $this->assertTrue( $p->next_tag( 'div' ), 'Querying an existing tag did not return true' ); $this->assertSame( 'test', $p->get_attribute( 'class' ), 'Accessing a class="test" attribute value did not return "test"' ); } @@ -114,11 +122,12 @@ public function test_get_attribute_returns_attribute_value() { /** * @ticket 56299 * - * @covers next_tag - * @covers get_attribute + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_get_attribute_returns_true_for_boolean_attribute() { $p = new WP_HTML_Tag_Processor( '
Test
' ); + $this->assertTrue( $p->next_tag( array( 'class_name' => 'test' ) ), 'Querying an existing tag did not return true' ); $this->assertTrue( $p->get_attribute( 'enabled' ), 'Accessing a boolean "enabled" attribute value did not return true' ); } @@ -126,11 +135,12 @@ public function test_get_attribute_returns_true_for_boolean_attribute() { /** * @ticket 56299 * - * @covers next_tag - * @covers get_attribute + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_get_attribute_returns_string_for_truthy_attributes() { $p = new WP_HTML_Tag_Processor( '' ); + $this->assertTrue( $p->next_tag( array() ), 'Querying an existing tag did not return true' ); $this->assertSame( 'enabled', $p->get_attribute( 'enabled' ), 'Accessing a boolean "enabled" attribute value did not return true' ); $this->assertSame( '1', $p->get_attribute( 'checked' ), 'Accessing a checked=1 attribute value did not return "1"' ); @@ -145,17 +155,19 @@ public function test_get_attribute_returns_string_for_truthy_attributes() { public function test_get_attribute_decodes_html_character_references() { $p = new WP_HTML_Tag_Processor( '
' ); $p->next_tag(); + $this->assertSame( 'the "grande" is < 32oz†', $p->get_attribute( 'id' ), 'HTML Attribute value was returned without decoding character references' ); } /** * @ticket 56299 * - * @covers ::next_tag - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_attributes_parser_treats_slash_as_attribute_separator() { $p = new WP_HTML_Tag_Processor( '
Test
' ); + $this->assertTrue( $p->next_tag( array() ), 'Querying an existing tag did not return true' ); $this->assertTrue( $p->get_attribute( 'a' ), 'Accessing an existing attribute did not return true' ); $this->assertTrue( $p->get_attribute( 'b' ), 'Accessing an existing attribute did not return true' ); @@ -167,8 +179,8 @@ public function test_attributes_parser_treats_slash_as_attribute_separator() { /** * @ticket 56299 * - * @covers ::next_tag - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::get_attribute * * @dataProvider data_attribute_name_case_variants * @@ -177,14 +189,15 @@ public function test_attributes_parser_treats_slash_as_attribute_separator() { public function test_get_attribute_is_case_insensitive_for_attributes_with_values( $attribute_name ) { $p = new WP_HTML_Tag_Processor( '
Test
' ); $p->next_tag(); - $this->assertSame( 'true', $p->get_attribute( $attribute_name ) ); + + $this->assertSame( 'true', $p->get_attribute( $attribute_name ) ); } /** * @ticket 56299 * - * @covers ::next_tag - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::get_attribute * * @dataProvider data_attribute_name_case_variants * @@ -193,17 +206,14 @@ public function test_get_attribute_is_case_insensitive_for_attributes_with_value public function test_attributes_parser_is_case_insensitive_for_attributes_without_values( $attribute_name ) { $p = new WP_HTML_Tag_Processor( '
Test
' ); $p->next_tag(); - $this->assertTrue( $p->get_attribute( $attribute_name ) ); + + $this->assertTrue( $p->get_attribute( $attribute_name ) ); } /** - * Data provider for attribute names in various casings. + * Data provider. * - * @return array { - * @type array { - * @type string $attribute_name Name of data-enabled attribute with case variations. - * } - * } + * @return array[]. */ public function data_attribute_name_case_variants() { return array( @@ -217,33 +227,35 @@ public function data_attribute_name_case_variants() { /** * @ticket 56299 * - * @covers ::next_tag - * @covers ::remove_attribute + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::remove_attribute */ public function test_remove_attribute_is_case_insensitive() { $p = new WP_HTML_Tag_Processor( '
Test
' ); $p->next_tag(); $p->remove_attribute( 'data-enabled' ); - $this->assertEquals( '
Test
', $p->get_updated_html(), 'A case-insensitive remove_attribute call did not remove the attribute.' ); + + $this->assertSame( '
Test
', $p->get_updated_html(), 'A case-insensitive remove_attribute call did not remove the attribute.' ); } /** * @ticket 56299 * - * @covers ::next_tag - * @covers ::set_attribute + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::set_attribute */ public function test_set_attribute_is_case_insensitive() { $p = new WP_HTML_Tag_Processor( '
Test
' ); $p->next_tag(); $p->set_attribute( 'data-enabled', 'abc' ); - $this->assertEquals( '
Test
', $p->get_updated_html(), 'A case-insensitive set_attribute call did not update the existing attribute.' ); + + $this->assertSame( '
Test
', $p->get_updated_html(), 'A case-insensitive set_attribute call did not update the existing attribute.' ); } /** * @ticket 56299 * - * @covers ::get_attribute_names_with_prefix + * @covers WP_HTML_Tag_Processor::get_attribute_names_with_prefix */ public function test_get_attribute_names_with_prefix_returns_null_before_finding_tags() { $p = new WP_HTML_Tag_Processor( '
Test
' ); @@ -253,7 +265,7 @@ public function test_get_attribute_names_with_prefix_returns_null_before_finding /** * @ticket 56299 * - * @covers ::get_attribute_names_with_prefix + * @covers WP_HTML_Tag_Processor::get_attribute_names_with_prefix */ public function test_get_attribute_names_with_prefix_returns_null_when_not_in_open_tag() { $p = new WP_HTML_Tag_Processor( '
Test
' ); @@ -264,34 +276,37 @@ public function test_get_attribute_names_with_prefix_returns_null_when_not_in_op /** * @ticket 56299 * - * @covers ::get_attribute_names_with_prefix + * @covers WP_HTML_Tag_Processor::get_attribute_names_with_prefix */ public function test_get_attribute_names_with_prefix_returns_null_when_in_closing_tag() { $p = new WP_HTML_Tag_Processor( '
Test
' ); $p->next_tag( 'div' ); $p->next_tag( array( 'tag_closers' => 'visit' ) ); + $this->assertNull( $p->get_attribute_names_with_prefix( 'data-' ), 'Accessing attributes of a closing tag did not return null' ); } /** * @ticket 56299 * - * @covers ::get_attribute_names_with_prefix + * @covers WP_HTML_Tag_Processor::get_attribute_names_with_prefix */ public function test_get_attribute_names_with_prefix_returns_empty_array_when_no_attributes_present() { $p = new WP_HTML_Tag_Processor( '
Test
' ); $p->next_tag( 'div' ); + $this->assertSame( array(), $p->get_attribute_names_with_prefix( 'data-' ), 'Accessing the attributes on a tag without any did not return an empty array' ); } /** * @ticket 56299 * - * @covers ::get_attribute_names_with_prefix + * @covers WP_HTML_Tag_Processor::get_attribute_names_with_prefix */ public function test_get_attribute_names_with_prefix_returns_matching_attribute_names_in_lowercase() { $p = new WP_HTML_Tag_Processor( '
Test
' ); $p->next_tag(); + $this->assertSame( array( 'data-enabled', 'data-test-id' ), $p->get_attribute_names_with_prefix( 'data-' ) @@ -301,14 +316,15 @@ public function test_get_attribute_names_with_prefix_returns_matching_attribute_ /** * @ticket 56299 * - * @covers ::set_attribute - * @covers ::get_updated_html - * @covers ::get_attribute_names_with_prefix + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute_names_with_prefix */ public function test_get_attribute_names_with_prefix_returns_attribute_added_by_set_attribute() { $p = new WP_HTML_Tag_Processor( '
Test
' ); $p->next_tag(); $p->set_attribute( 'data-test-id', '14' ); + $this->assertSame( '
Test
', $p->get_updated_html(), @@ -324,7 +340,7 @@ public function test_get_attribute_names_with_prefix_returns_attribute_added_by_ /** * @ticket 56299 * - * @covers ::__toString + * @covers WP_HTML_Tag_Processor::__toString */ public function test_to_string_returns_updated_html() { $p = new WP_HTML_Tag_Processor( '
Test
' ); @@ -335,7 +351,7 @@ public function test_to_string_returns_updated_html() { $p->set_attribute( 'id', 'div-id-1' ); $p->add_class( 'new_class_1' ); - $this->assertEquals( + $this->assertSame( $p->get_updated_html(), (string) $p ); @@ -344,7 +360,7 @@ public function test_to_string_returns_updated_html() { /** * @ticket 56299 * - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_get_updated_html_applies_the_updates_so_far_and_keeps_the_processor_on_the_current_tag() { $p = new WP_HTML_Tag_Processor( '
Test
' ); @@ -354,6 +370,7 @@ public function test_get_updated_html_applies_the_updates_so_far_and_keeps_the_p $p->next_tag(); $p->set_attribute( 'id', 'div-id-1' ); $p->add_class( 'new_class_1' ); + $this->assertSame( '
Test
', $p->get_updated_html(), @@ -362,6 +379,7 @@ public function test_get_updated_html_applies_the_updates_so_far_and_keeps_the_p $p->set_attribute( 'id', 'div-id-2' ); $p->add_class( 'new_class_2' ); + $this->assertSame( '
Test
', $p->get_updated_html(), @@ -370,6 +388,7 @@ public function test_get_updated_html_applies_the_updates_so_far_and_keeps_the_p $p->next_tag(); $p->remove_attribute( 'id' ); + $this->assertSame( '
Test
', $p->get_updated_html(), @@ -384,37 +403,41 @@ public function test_get_updated_html_applies_the_updates_so_far_and_keeps_the_p */ public function test_get_updated_html_without_updating_any_attributes_returns_the_original_html() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $this->assertSame( self::HTML_SIMPLE, $p->get_updated_html() ); } /** * @ticket 56299 * - * @covers ::next_tag + * @covers WP_HTML_Tag_Processor::next_tag */ public function test_next_tag_with_no_arguments_should_find_the_next_existing_tag() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $this->assertTrue( $p->next_tag(), 'Querying an existing tag did not return true' ); } /** * @ticket 56299 * - * @covers ::next_tag + * @covers WP_HTML_Tag_Processor::next_tag */ public function test_next_tag_should_return_false_for_a_non_existing_tag() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $this->assertFalse( $p->next_tag( 'p' ), 'Querying a non-existing tag did not return false' ); } /** * @ticket 56299 * - * @covers ::next_tag - * @covers ::is_tag_closer + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::is_tag_closer */ public function test_next_tag_should_stop_on_closers_only_when_requested() { $p = new WP_HTML_Tag_Processor( '
' ); + $this->assertTrue( $p->next_tag( array( 'tag_name' => 'div' ) ), 'Did not find desired tag opener' ); $this->assertFalse( $p->next_tag( array( 'tag_name' => 'div' ) ), 'Visited an unwanted tag, a tag closer' ); @@ -425,6 +448,7 @@ public function test_next_tag_should_stop_on_closers_only_when_requested() { 'tag_closers' => 'visit', ) ); + $this->assertFalse( $p->is_tag_closer(), 'Indicated a tag opener is a tag closer' ); $this->assertTrue( $p->next_tag( @@ -441,14 +465,17 @@ public function test_next_tag_should_stop_on_closers_only_when_requested() { /** * @ticket 56299 * - * @covers ::next_tag - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_set_attribute_on_a_non_existing_tag_does_not_change_the_markup() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); + $this->assertFalse( $p->next_tag( 'p' ), 'Querying a non-existing tag did not return false' ); $this->assertFalse( $p->next_tag( 'div' ), 'Querying a non-existing tag did not return false' ); + $p->set_attribute( 'id', 'primary' ); + $this->assertSame( self::HTML_SIMPLE, $p->get_updated_html(), @@ -474,13 +501,16 @@ public function test_attribute_ops_on_tag_closer_do_not_change_the_markup() { 'tag_closers' => 'visit', ) ); + $this->assertFalse( $p->is_tag_closer(), 'Skipped tag opener' ); + $p->next_tag( array( 'tag_name' => 'div', 'tag_closers' => 'visit', ) ); + $this->assertTrue( $p->is_tag_closer(), 'Skipped tag closer' ); $this->assertFalse( $p->set_attribute( 'id', 'test' ), "Allowed setting an attribute on a tag closer when it shouldn't have" ); $this->assertFalse( $p->remove_attribute( 'invalid-id' ), "Allowed removing an attribute on a tag closer when it shouldn't have" ); @@ -512,10 +542,10 @@ public function test_attribute_ops_on_tag_closer_do_not_change_the_markup() { * * @ticket 56299 * - * @dataProvider data_set_attribute_escapable_values - * @covers ::set_attribute + * @dataProvider data_set_attribute_prevents_xss + * @covers WP_HTML_Tag_Processor::set_attribute * - * @param string $attribute_value Value with potential XSS exploit. + * @param string $attribute_value AValue with potential XSS exploit. */ public function test_set_attribute_prevents_xss( $attribute_value ) { $p = new WP_HTML_Tag_Processor( '
' ); @@ -528,22 +558,24 @@ public function test_set_attribute_prevents_xss( $attribute_value ) { * with tools that don't understand HTML because they might get * confused by improperly-escaped values. * - * For this test, since we control the input HTML we're going to - * do what looks like the opposite of what we want to be doing with - * this library but are only doing so because we have full control - * over the content and because we want to look at the raw values. + * Since the input HTML is known, the test will do what looks like + * the opposite of what is expected to be done with this library. + * But by doing so, the test (a) has full control over the + * content and (b) looks at the raw values. */ $match = null; preg_match( '~^
$~', $p->get_updated_html(), $match ); list( , $actual_value ) = $match; - $this->assertEquals( $actual_value, '"' . esc_attr( $attribute_value ) . '"' ); + $this->assertSame( '"' . esc_attr( $attribute_value ) . '"', $actual_value ); } /** - * Data provider with HTML attribute values that might need escaping. + * Data provider. + * + * @return string[][]. */ - public function data_set_attribute_escapable_values() { + public function data_set_attribute_prevents_xss() { return array( array( '"' ), array( '"' ), @@ -560,14 +592,15 @@ public function data_set_attribute_escapable_values() { /** * @ticket 56299 * - * @covers ::set_attribute - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_set_attribute_with_a_non_existing_attribute_adds_a_new_attribute_to_the_markup() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); $p->next_tag(); $p->set_attribute( 'test-attribute', 'test-value' ); + $this->assertSame( '
Text
', $p->get_updated_html(), @@ -583,14 +616,15 @@ public function test_set_attribute_with_a_non_existing_attribute_adds_a_new_attr /** * @ticket 56299 * - * @covers ::set_attribute - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_get_attribute_returns_updated_values_before_they_are_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); $p->next_tag(); $p->set_attribute( 'test-attribute', 'test-value' ); + $this->assertSame( 'test-value', $p->get_attribute( 'test-attribute' ), @@ -603,10 +637,18 @@ public function test_get_attribute_returns_updated_values_before_they_are_update ); } + /** + * @ticket 56299 + * + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::get_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html + */ public function test_get_attribute_returns_updated_values_before_they_are_updated_with_different_name_casing() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); $p->next_tag(); $p->set_attribute( 'test-ATTribute', 'test-value' ); + $this->assertSame( 'test-value', $p->get_attribute( 'test-attribute' ), @@ -622,14 +664,15 @@ public function test_get_attribute_returns_updated_values_before_they_are_update /** * @ticket 56299 * - * @covers ::add_class - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_get_attribute_reflects_added_class_names_before_they_are_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); $p->next_tag(); $p->add_class( 'my-class' ); + $this->assertSame( 'my-class', $p->get_attribute( 'class' ), @@ -645,20 +688,23 @@ public function test_get_attribute_reflects_added_class_names_before_they_are_up /** * @ticket 56299 * - * @covers ::add_class - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_get_attribute_reflects_added_class_names_before_they_are_updated_and_retains_classes_from_previous_add_class_calls() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); $p->next_tag(); $p->add_class( 'my-class' ); + $this->assertSame( 'my-class', $p->get_attribute( 'class' ), 'get_attribute() (called before get_updated_html()) did not return class name added via add_class()' ); + $p->add_class( 'my-other-class' ); + $this->assertSame( 'my-class my-other-class', $p->get_attribute( 'class' ), @@ -674,14 +720,15 @@ public function test_get_attribute_reflects_added_class_names_before_they_are_up /** * @ticket 56299 * - * @covers ::remove_attribute - * @covers ::get_attribute - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::remove_attribute + * @covers WP_HTML_Tag_Processor::get_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_get_attribute_reflects_removed_attribute_before_it_is_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); $p->next_tag(); $p->remove_attribute( 'id' ); + $this->assertNull( $p->get_attribute( 'id' ), 'get_attribute() (called before get_updated_html()) returned attribute that was removed by remove_attribute()' @@ -696,16 +743,17 @@ public function test_get_attribute_reflects_removed_attribute_before_it_is_updat /** * @ticket 56299 * - * @covers ::set_attribute - * @covers ::remove_attribute - * @covers ::get_attribute - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::remove_attribute + * @covers WP_HTML_Tag_Processor::get_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_get_attribute_reflects_adding_and_then_removing_an_attribute_before_it_is_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); $p->next_tag(); $p->set_attribute( 'test-attribute', 'test-value' ); $p->remove_attribute( 'test-attribute' ); + $this->assertNull( $p->get_attribute( 'test-attribute' ), 'get_attribute() (called before get_updated_html()) returned attribute that was added via set_attribute() and then removed by remove_attribute()' @@ -720,16 +768,17 @@ public function test_get_attribute_reflects_adding_and_then_removing_an_attribut /** * @ticket 56299 * - * @covers ::set_attribute - * @covers ::remove_attribute - * @covers ::get_attribute - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::remove_attribute + * @covers WP_HTML_Tag_Processor::get_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_get_attribute_reflects_setting_and_then_removing_an_existing_attribute_before_it_is_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); $p->next_tag(); $p->set_attribute( 'id', 'test-value' ); $p->remove_attribute( 'id' ); + $this->assertNull( $p->get_attribute( 'id' ), 'get_attribute() (called before get_updated_html()) returned attribute that was overwritten by set_attribute() and then removed by remove_attribute()' @@ -744,14 +793,15 @@ public function test_get_attribute_reflects_setting_and_then_removing_an_existin /** * @ticket 56299 * - * @covers ::remove_class - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::remove_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_get_attribute_reflects_removed_class_names_before_they_are_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); $p->next_tag(); $p->remove_class( 'with-border' ); + $this->assertSame( 'main', $p->get_attribute( 'class' ), @@ -767,16 +817,17 @@ public function test_get_attribute_reflects_removed_class_names_before_they_are_ /** * @ticket 56299 * - * @covers ::add_class - * @covers ::remove_class - * @covers ::get_attribute - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::remove_class + * @covers WP_HTML_Tag_Processor::get_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_get_attribute_reflects_setting_and_then_removing_a_class_name_before_it_is_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); $p->next_tag(); $p->add_class( 'foo-class' ); $p->remove_class( 'foo-class' ); + $this->assertSame( 'main with-border', $p->get_attribute( 'class' ), @@ -792,16 +843,17 @@ public function test_get_attribute_reflects_setting_and_then_removing_a_class_na /** * @ticket 56299 * - * @covers ::add_class - * @covers ::remove_class - * @covers ::get_attribute - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::remove_class + * @covers WP_HTML_Tag_Processor::get_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_get_attribute_reflects_duplicating_and_then_removing_an_existing_class_name_before_it_is_updated() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); $p->next_tag(); $p->add_class( 'with-border' ); $p->remove_class( 'with-border' ); + $this->assertSame( 'main', $p->get_attribute( 'class' ), @@ -820,21 +872,22 @@ public function test_get_attribute_reflects_duplicating_and_then_removing_an_exi * * @ticket 56299 * - * @covers ::set_attribute - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_update_first_when_duplicated_attribute() { $p = new WP_HTML_Tag_Processor( '
Text
' ); $p->next_tag(); $p->set_attribute( 'id', 'updated-id' ); + $this->assertSame( '
Text
', $p->get_updated_html() ); } /** * @ticket 56299 * - * @covers ::set_attribute - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_set_attribute_with_an_existing_attribute_name_updates_its_value_in_the_markup() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -846,8 +899,8 @@ public function test_set_attribute_with_an_existing_attribute_name_updates_its_v /** * @ticket 56299 * - * @covers ::set_attribute - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_next_tag_and_set_attribute_in_a_loop_update_all_tags_in_the_markup() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -870,53 +923,57 @@ public function test_next_tag_and_set_attribute_in_a_loop_update_all_tags_in_the * * @ticket 56299 * - * @covers ::remove_attribute - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::remove_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_remove_first_when_duplicated_attribute() { $p = new WP_HTML_Tag_Processor( '
Text
' ); $p->next_tag(); $p->remove_attribute( 'id' ); + $this->assertSame( '
Text
', $p->get_updated_html() ); } /** * @ticket 56299 * - * @covers ::remove_attribute - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::remove_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_remove_attribute_with_an_existing_attribute_name_removes_it_from_the_markup() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); $p->next_tag(); $p->remove_attribute( 'id' ); + $this->assertSame( '
Text
', $p->get_updated_html() ); } /** * @ticket 56299 * - * @covers ::remove_attribute - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::remove_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_remove_attribute_with_a_non_existing_attribute_name_does_not_change_the_markup() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); $p->next_tag(); $p->remove_attribute( 'no-such-attribute' ); + $this->assertSame( self::HTML_SIMPLE, $p->get_updated_html() ); } /** * @ticket 56299 * - * @covers ::add_class - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_add_class_creates_a_class_attribute_when_there_is_none() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); $p->next_tag(); $p->add_class( 'foo-class' ); + $this->assertSame( '
Text
', $p->get_updated_html(), @@ -932,15 +989,16 @@ public function test_add_class_creates_a_class_attribute_when_there_is_none() { /** * @ticket 56299 * - * @covers ::add_class - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_calling_add_class_twice_creates_a_class_attribute_with_both_class_names_when_there_is_no_class_attribute() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); $p->next_tag(); $p->add_class( 'foo-class' ); $p->add_class( 'bar-class' ); + $this->assertSame( '
Text
', $p->get_updated_html(), @@ -956,14 +1014,15 @@ public function test_calling_add_class_twice_creates_a_class_attribute_with_both /** * @ticket 56299 * - * @covers ::remove_class - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::remove_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_remove_class_does_not_change_the_markup_when_there_is_no_class_attribute() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); $p->next_tag(); $p->remove_class( 'foo-class' ); + $this->assertSame( self::HTML_SIMPLE, $p->get_updated_html(), @@ -978,15 +1037,16 @@ public function test_remove_class_does_not_change_the_markup_when_there_is_no_cl /** * @ticket 56299 * - * @covers ::add_class - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_add_class_appends_class_names_to_the_existing_class_attribute_when_one_already_exists() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); $p->next_tag(); $p->add_class( 'foo-class' ); $p->add_class( 'bar-class' ); + $this->assertSame( '
Text
', $p->get_updated_html(), @@ -1002,14 +1062,15 @@ public function test_add_class_appends_class_names_to_the_existing_class_attribu /** * @ticket 56299 * - * @covers ::remove_class - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::remove_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_remove_class_removes_a_single_class_from_the_class_attribute_when_one_exists() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); $p->next_tag(); $p->remove_class( 'main' ); + $this->assertSame( '
Text
', $p->get_updated_html(), @@ -1025,15 +1086,16 @@ public function test_remove_class_removes_a_single_class_from_the_class_attribut /** * @ticket 56299 * - * @covers ::remove_class - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::remove_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_calling_remove_class_with_all_listed_class_names_removes_the_existing_class_attribute_from_the_markup() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); $p->next_tag(); $p->remove_class( 'main' ); $p->remove_class( 'with-border' ); + $this->assertSame( '
Text
', $p->get_updated_html(), @@ -1048,14 +1110,15 @@ public function test_calling_remove_class_with_all_listed_class_names_removes_th /** * @ticket 56299 * - * @covers ::add_class - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_add_class_does_not_add_duplicate_class_names() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); $p->next_tag(); $p->add_class( 'with-border' ); + $this->assertSame( '
Text
', $p->get_updated_html(), @@ -1071,14 +1134,15 @@ public function test_add_class_does_not_add_duplicate_class_names() { /** * @ticket 56299 * - * @covers ::add_class - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_add_class_preserves_class_name_order_when_a_duplicate_class_name_is_added() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); $p->next_tag(); $p->add_class( 'main' ); + $this->assertSame( '
Text
', $p->get_updated_html(), @@ -1094,9 +1158,9 @@ public function test_add_class_preserves_class_name_order_when_a_duplicate_class /** * @ticket 56299 * - * @covers ::add_class - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_add_class_when_there_is_a_class_attribute_with_excessive_whitespaces() { $p = new WP_HTML_Tag_Processor( @@ -1104,6 +1168,7 @@ public function test_add_class_when_there_is_a_class_attribute_with_excessive_wh ); $p->next_tag(); $p->add_class( 'foo-class' ); + $this->assertSame( '
Text
', $p->get_updated_html(), @@ -1119,9 +1184,9 @@ public function test_add_class_when_there_is_a_class_attribute_with_excessive_wh /** * @ticket 56299 * - * @covers ::remove_class - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::remove_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_remove_class_preserves_whitespaces_when_there_is_a_class_attribute_with_excessive_whitespaces() { $p = new WP_HTML_Tag_Processor( @@ -1129,6 +1194,7 @@ public function test_remove_class_preserves_whitespaces_when_there_is_a_class_at ); $p->next_tag(); $p->remove_class( 'with-border' ); + $this->assertSame( '
Text
', $p->get_updated_html(), @@ -1144,9 +1210,9 @@ public function test_remove_class_preserves_whitespaces_when_there_is_a_class_at /** * @ticket 56299 * - * @covers ::remove_class - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::remove_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_removing_all_classes_removes_the_existing_class_attribute_from_the_markup_even_when_excessive_whitespaces_are_present() { $p = new WP_HTML_Tag_Processor( @@ -1176,10 +1242,10 @@ public function test_removing_all_classes_removes_the_existing_class_attribute_f * * @ticket 56299 * - * @covers ::add_class - * @covers ::set_attribute - * @covers ::get_updated_html - * @covers ::get_attribute + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html + * @covers WP_HTML_Tag_Processor::get_attribute */ public function test_set_attribute_takes_priority_over_add_class() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); @@ -1221,14 +1287,14 @@ public function test_set_attribute_takes_priority_over_add_class() { * "$value" instead, as any direct updates to the `class` attribute supersede any changes enqueued * via the class builder methods. * - * This is still true if we read enqueued updates before calling `get_updated_html()`. + * This is still true when reading enqueued updates before calling `get_updated_html()`. * * @ticket 56299 * - * @covers ::add_class - * @covers ::set_attribute - * @covers ::get_attribute - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::get_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_set_attribute_takes_priority_over_add_class_even_before_updating() { $p = new WP_HTML_Tag_Processor( self::HTML_WITH_CLASSES ); @@ -1265,10 +1331,10 @@ public function test_set_attribute_takes_priority_over_add_class_even_before_upd /** * @ticket 56299 * - * @covers ::set_attribute - * @covers ::add_class - * @covers ::get_attribute - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::get_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_add_class_overrides_boolean_class_attribute() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -1290,10 +1356,10 @@ public function test_add_class_overrides_boolean_class_attribute() { /** * @ticket 56299 * - * @covers ::set_attribute - * @covers ::add_class - * @covers ::get_attribute - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::get_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_add_class_overrides_boolean_class_attribute_even_before_updating() { $p = new WP_HTML_Tag_Processor( self::HTML_SIMPLE ); @@ -1315,11 +1381,11 @@ public function test_add_class_overrides_boolean_class_attribute_even_before_upd /** * @ticket 56299 * - * @covers ::set_attribute - * @covers ::remove_attribute - * @covers ::add_class - * @covers ::remove_class - * @covers ::get_updated_html + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::remove_attribute + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::remove_class + * @covers WP_HTML_Tag_Processor::get_updated_html */ public function test_advanced_use_case() { $input = <<>>>>>> 43ac2567fa (WP_HTML_Tag_Processor_Test: test improvements) */ public function test_setting_a_boolean_attribute_to_false_removes_it_from_the_markup() { $p = new WP_HTML_Tag_Processor( @@ -1482,8 +1553,13 @@ public function test_setting_a_boolean_attribute_to_false_removes_it_from_the_ma /** * @ticket 56299 * +<<<<<<< HEAD * @covers ::set_attribute * @covers ::get_updated_html +======= + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html +>>>>>>> 43ac2567fa (WP_HTML_Tag_Processor_Test: test improvements) */ public function test_setting_a_missing_attribute_to_false_does_not_change_the_markup() { $html_input = '
'; @@ -1496,8 +1572,13 @@ public function test_setting_a_missing_attribute_to_false_does_not_change_the_ma /** * @ticket 56299 * +<<<<<<< HEAD * @covers ::set_attribute * @covers ::get_updated_html +======= + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html +>>>>>>> 43ac2567fa (WP_HTML_Tag_Processor_Test: test improvements) */ public function test_setting_a_boolean_attribute_to_a_string_value_adds_explicit_value_to_the_markup() { $p = new WP_HTML_Tag_Processor( @@ -1514,8 +1595,13 @@ public function test_setting_a_boolean_attribute_to_a_string_value_adds_explicit /** * @ticket 56299 * +<<<<<<< HEAD * @covers ::get_tag * @covers ::next_tag +======= + * @covers WP_HTML_Tag_Processor::get_tag + * @covers WP_HTML_Tag_Processor::next_tag +>>>>>>> 43ac2567fa (WP_HTML_Tag_Processor_Test: test improvements) */ public function test_unclosed_script_tag_should_not_cause_an_infinite_loop() { $p = new WP_HTML_Tag_Processor( '
', - ); + public function data_next_tag_ignores_script_tag_contents() { + return array( + 'Simple script tag' => array( + '
', + ), - $examples['Simple uppercase script tag'] = array( - '
', - ); + 'Simple uppercase script tag' => array( + '
', + ), - $examples['Script with a comment opener inside should end at the next script tag closer (dash dash escaped state)'] = array( - '
-->', - ); + 'Script with a comment opener inside should end at the next script tag closer (dash dash escaped state)' => array( + '
-->', + ), - $examples['Script with a comment opener and a script tag opener inside should end two script tag closer later (double escaped state)'] = array( - '
-->', - ); + 'Script with a comment opener and a script tag opener inside should end two script tag closer later (double escaped state)' => array( + '
-->', + ), - $examples['Double escaped script with a tricky opener'] = array( - '">
', - ); + 'Double escaped script with a tricky opener' => array( + '">
', + ), - $examples['Double escaped script with a tricky closer'] = array( - '">
', - ); + 'Double escaped script with a tricky closer' => array( + '">
', + ), - $examples['Double escaped, then escaped, then double escaped'] = array( - '
', - ); + 'Double escaped, then escaped, then double escaped' => array( + '
', + ), - $examples['Script with a commented a script tag opener inside should at the next tag closer (dash dash escaped state)'] = array( - '
-->', - ); + 'Script with a commented a script tag opener inside should at the next tag closer (dash dash escaped state)' => array( + '
-->', + ), - $examples['Script closer with another script tag in closer attributes'] = array( - '
', - ); + 'Script closer with another script tag in closer attributes' => array( + '
', + ), - $examples['Script closer with attributes'] = array( - '
', - ); + 'Script closer with attributes' => array( + '
', + ), - $examples['Script opener with title closer inside'] = array( - '
', - ); + 'Script opener with title closer inside' => array( + '
', + ), - $examples['Complex script with many parsing states'] = array( - '-->
-->', + 'Complex script with many parsing states' => array( + '-->
-->', + ), ); - return $examples; } /** * @ticket 56299 * +<<<<<<< HEAD * @covers ::next_tag +======= + * @covers WP_HTML_Tag_Processor::next_tag +>>>>>>> 43ac2567fa (WP_HTML_Tag_Processor_Test: test improvements) * - * @dataProvider data_rcdata_state + * @dataProvider data_next_tag_ignores_contents_of_rcdata_tag + * + * @param string $rcdata_then_div HTML with RCDATA before a DIV. + * @param string $rcdata_tag RCDATA tag. */ - public function test_next_tag_ignores_the_contents_of_a_rcdata_tag( $rcdata_then_div, $rcdata_tag ) { + public function test_next_tag_ignores_contents_of_rcdata_tag( $rcdata_then_div, $rcdata_tag ) { $p = new WP_HTML_Tag_Processor( $rcdata_then_div ); $p->next_tag(); - $this->assertSame( strtoupper( $rcdata_tag ), $p->get_tag(), "The first found tag was not '$rcdata_tag'" ); + $this->assertSame( $rcdata_tag, $p->get_tag(), "The first found tag was not '$rcdata_tag'" ); $p->next_tag(); $this->assertSame( 'DIV', $p->get_tag(), "The second found tag was not 'div'" ); } /** - * Data provider for test_ignores_contents_of_a_rcdata_tag(). + * Data provider. * - * @return array { - * @type array { - * @type string $rcdata_then_div The HTML snippet containing RCDATA and div tags. - * @type string $rcdata_tag The RCDATA tag. - * } - * } + * @return array[] */ - public function data_rcdata_state() { - $examples = array(); - $examples['Simple textarea'] = array( - '
', - 'TEXTAREA', - ); - - $examples['Simple title'] = array( - '<span class="d-none d-md-inline">Back to notifications</title</span>
', - 'TITLE', - ); - - $examples['Comment opener inside a textarea tag should be ignored'] = array( - '
-->', - 'TEXTAREA', - ); - - $examples['Textarea closer with another textarea tag in closer attributes'] = array( - '
', - 'TEXTAREA', - ); - - $examples['Textarea closer with attributes'] = array( - '
', - 'TEXTAREA', - ); - - $examples['Textarea opener with title closer inside'] = array( - '
', - 'TEXTAREA', + public function data_next_tag_ignores_contents_of_rcdata_tag() { + return array( + 'simple textarea' => array( + 'rcdata_then_div' => '
', + 'rcdata_tag' => 'TEXTAREA', + ), + 'simple title' => array( + 'rcdata_then_div' => '<span class="d-none d-md-inline">Back to notifications</title</span>
', + 'rcdata_tag' => 'TITLE', + ), + 'comment opener inside a textarea tag should be ignored' => array( + 'rcdata_then_div' => '
-->', + 'rcdata_tag' => 'TEXTAREA', + ), + 'textarea closer with another textarea tag in closer attributes' => array( + 'rcdata_then_div' => '
', + 'rcdata_tag' => 'TEXTAREA', + ), + 'textarea closer with attributes' => array( + 'rcdata_then_div' => '
', + 'rcdata_tag' => 'TEXTAREA', + ), + 'textarea opener with title closer inside' => array( + 'rcdata_then_div' => '
', + 'rcdata_tag' => 'TEXTAREA', + ), ); - return $examples; } /** * @ticket 56299 * +<<<<<<< HEAD * @covers ::next_tag * @covers ::set_attribute * @covers ::get_updated_html +======= + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html +>>>>>>> 43ac2567fa (WP_HTML_Tag_Processor_Test: test improvements) */ public function test_can_query_and_update_wrongly_nested_tags() { $p = new WP_HTML_Tag_Processor( @@ -1684,11 +1774,17 @@ public function test_can_query_and_update_wrongly_nested_tags() { /** * @ticket 56299 * +<<<<<<< HEAD * @covers ::next_tag * @covers ::remove_attribute * @covers ::get_updated_html +======= + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::remove_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html +>>>>>>> 43ac2567fa (WP_HTML_Tag_Processor_Test: test improvements) */ - public function test_removing_attributes_works_even_in_malformed_html() { + public function test_removing_specific_attributes_in_malformed_html() { $p = new WP_HTML_Tag_Processor( self::HTML_MALFORMED ); $p->next_tag( 'span' ); $p->remove_attribute( 'Notifications<' ); @@ -1701,11 +1797,17 @@ public function test_removing_attributes_works_even_in_malformed_html() { /** * @ticket 56299 * +<<<<<<< HEAD * @covers ::next_Tag * @covers ::set_attribute * @covers ::get_updated_html +======= + * @covers WP_HTML_Tag_Processor::next_Tag + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::get_updated_html +>>>>>>> 43ac2567fa (WP_HTML_Tag_Processor_Test: test improvements) */ - public function test_updating_attributes_works_even_in_malformed_html_1() { + public function test_updating_specific_attributes_in_malformed_html() { $p = new WP_HTML_Tag_Processor( self::HTML_MALFORMED ); $p->next_tag( 'span' ); $p->set_attribute( 'id', 'first' ); @@ -1720,235 +1822,255 @@ public function test_updating_attributes_works_even_in_malformed_html_1() { /** * @ticket 56299 * +<<<<<<< HEAD * @covers ::next_tag * @covers ::set_attribute * @covers ::add_class * @covers ::get_updated_html +======= + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::get_updated_html +>>>>>>> 43ac2567fa (WP_HTML_Tag_Processor_Test: test improvements) + * + * @dataProvider data_updating_attributes * - * @dataProvider data_malformed_tag + * @param string $html HTML to process. + * @param string $expected Expected updated HTML. */ - public function test_updating_attributes_works_even_in_malformed_html_2( $html_input, $html_expected ) { - $p = new WP_HTML_Tag_Processor( $html_input ); + public function test_updating_attributes( $html, $expected ) { + $p = new WP_HTML_Tag_Processor( $html ); $p->next_tag(); $p->set_attribute( 'foo', 'bar' ); $p->add_class( 'firstTag' ); $p->next_tag(); $p->add_class( 'secondTag' ); + $this->assertSame( - $html_expected, + $expected, $p->get_updated_html() ); } /** - * Data provider for test_updates_when_malformed_tag(). + * Data provider. * - * @return array { - * @type array { - * @type string $html_input The input HTML snippet. - * @type string $html_expected The expected HTML snippet after processing. - * } - * } + * @return array[] */ - public function data_malformed_tag() { - $null_byte = chr( 0 ); - $examples = array(); - $examples['Invalid entity inside attribute value'] = array( - 'test', - 'test', - ); - - $examples['HTML tag opening inside attribute value'] = array( - '
This <is> a <strong is="true">thing.
test', - '
This <is> a <strong is="true">thing.
test', - ); - - $examples['HTML tag brackets in attribute values and data markup'] = array( - '
This <is> a <strong is="true">thing.
test', - '
This <is> a <strong is="true">thing.
test', - ); - - $examples['Single and double quotes in attribute value'] = array( - '

test', - '

test', - ); - - $examples['Unquoted attribute values'] = array( - '


test', - '
test', - ); - - $examples['Double-quotes escaped in double-quote attribute value'] = array( - '
test', - '
test', - ); - - $examples['Unquoted attribute value'] = array( - '
test', - '
test', - ); - - $examples['Unquoted attribute value with tag-like value'] = array( - '
>test', - '
>test', - ); - - $examples['Unquoted attribute value with tag-like value followed by tag-like data'] = array( - '
>test', - '
>test', - ); - - $examples['1'] = array( - '
test', - '
test', - ); - - $examples['2'] = array( - '
test', - '
test', - ); - - $examples['4'] = array( - '
test', - '
test', - ); - - $examples['5'] = array( - '
code>test', - '
code>test', - ); - - $examples['6'] = array( - '
test', - '
test', - ); - - $examples['7'] = array( - '
test', - '
test', - ); - - $examples['8'] = array( - '
id="test">test', - '
id="test">test', - ); - - $examples['9'] = array( - '
test', - '
test', - ); - - $examples['10'] = array( - 'test', - 'test', - ); - - $examples['11'] = array( - 'The applicative operator <* works well in Haskell; is what?test', - 'The applicative operator <* works well in Haskell; is what?test', - ); - - $examples['12'] = array( - '<3 is a heart but is a tag.test', - '<3 is a heart but is a tag.test', - ); - - $examples['13'] = array( - 'test', - 'test', - ); - - $examples['14'] = array( - 'test', - 'test', - ); - - $examples['15'] = array( - ' a HTML Tag]]>test', - ' a HTML Tag]]>test', - ); - - $examples['16'] = array( - '
test', - '
test', - ); - - $examples['17'] = array( - '
test', - '
test', - ); - - $examples['18'] = array( - '
test', - '
test', - ); - - $examples['19'] = array( - '
test', - '
test', - ); - - $examples['20'] = array( - '
test', - '
test', - ); - - $examples['21'] = array( - '
test', - '
test', - ); - - $examples['22'] = array( - '
test', - '
test', + public function data_updating_attributes() { + return array( + 'tags inside of a comment' => array( + 'input' => 'test', + 'expected' => 'test', + ), + 'does not parse <3' => array( + 'input' => '<3 is a heart but is a tag.test', + 'expected' => '<3 is a heart but is a tag.test', + ), + 'does not parse <*' => array( + 'input' => 'The applicative operator <* works well in Haskell; is what?test', + 'expected' => 'The applicative operator <* works well in Haskell; is what?test', + ), + ' in content' => array( + 'input' => 'test', + 'expected' => 'test', + ), + 'custom asdf attribute' => array( + 'input' => '
test', + 'expected' => '
test', + ), + 'custom data-* attribute' => array( + 'input' => '

Some content for a test

', + 'expected' => '

Some content for a test

', + ), + 'tag inside of CDATA' => array( + 'input' => ' a HTML Tag]]>test', + 'expected' => ' a HTML Tag]]>test', + ), ); + } - $examples['23'] = array( - '
test', - '
test', - ); + /** + * @ticket 56299 + * + * @covers WP_HTML_Tag_Processor::next_tag + * @covers WP_HTML_Tag_Processor::set_attribute + * @covers WP_HTML_Tag_Processor::add_class + * @covers WP_HTML_Tag_Processor::get_updated_html + * + * @dataProvider data_updating_attributes_in_malformed_html + * + * @param string $html HTML to process. + * @param string $expected Expected updated HTML. + */ + public function test_updating_attributes_in_malformed_html( $html, $expected ) { + $p = new WP_HTML_Tag_Processor( $html ); + $p->next_tag(); + $p->set_attribute( 'foo', 'bar' ); + $p->add_class( 'firstTag' ); + $p->next_tag(); + $p->add_class( 'secondTag' ); - $examples['24'] = array( - '
test', - '
test', + $this->assertSame( + $expected, + $p->get_updated_html() ); + } - $examples['25'] = array( - '
test', - '
test', - ); + /** + * Data provider. + * + * @return array[] + */ + public function data_updating_attributes_in_malformed_html() { + $null_byte = chr( 0 ); - $examples['Multiple unclosed tags treated as a single tag'] = array( - << - test + return array( + 'Invalid entity inside attribute value' => array( + 'input' => 'test', + 'expected' => 'test', + ), + 'HTML tag opening inside attribute value' => array( + 'input' => '
This <is> a <strong is="true">thing.
test', + 'expected' => '
This <is> a <strong is="true">thing.
test', + ), + 'HTML tag brackets in attribute values and data markup' => array( + 'input' => '
This <is> a <strong is="true">thing.
test', + 'expected' => '
This <is> a <strong is="true">thing.
test', + ), + 'Single and double quotes in attribute value' => array( + 'input' => '

test', + 'expected' => '

test', + ), + 'Unquoted attribute values' => array( + 'input' => '


test', + 'expected' => '
test', + ), + 'Double-quotes escaped in double-quote attribute value' => array( + 'input' => '
test', + 'expected' => '
test', + ), + 'Unquoted attribute value' => array( + 'input' => '
test', + 'expected' => '
test', + ), + 'Unquoted attribute value with tag-like value' => array( + 'input' => '
>test', + 'expected' => '
>test', + ), + 'Unquoted attribute value with tag-like value followed by tag-like data' => array( + 'input' => '
>test', + 'expected' => '
>test', + ), + 'id=&quo;code' => array( + 'input' => '
test', + 'expected' => '
test', + ), + 'id/test=5' => array( + 'input' => '
test', + 'expected' => '
test', + ), + '
as the id value' => array( + 'input' => '
test', + 'expected' => '
test', + ), + 'id=>code' => array( + 'input' => '
code>test', + 'expected' => '
code>test', + ), + 'id"quo="test"' => array( + 'input' => '
test', + 'expected' => '
test', + ), + 'id without double quotation marks around null byte' => array( + 'input' => '
test', + 'expected' => '
test', + ), + 'Unexpected > before an attribute' => array( + 'input' => '
id="test">test', + 'expected' => '
id="test">test', + ), + 'Unexpected = before an attribute' => array( + 'input' => '
test', + 'expected' => '
test', + ), + 'Unexpected === before an attribute' => array( + 'input' => '
test', + 'expected' => '
test', + ), + 'Missing closing data-tag tag' => array( + 'input' => 'The applicative operator <* works well in Haskell; is what?test', + 'expected' => 'The applicative operator <* works well in Haskell; is what?test', + ), + 'Missing closing t3 tag' => array( + 'input' => '<3 is a heart but is a tag.test', + 'expected' => '<3 is a heart but is a tag.test', + ), + 'invalid comment opening tag' => array( + 'input' => 'test', + 'expected' => 'test', + ), + '=asdf as attribute name' => array( + 'input' => '
test', + 'expected' => '
test', + ), + '== as attribute name with value' => array( + 'input' => '
test', + 'expected' => '
test', + ), + '=5 as attribute' => array( + 'input' => '
test', + 'expected' => '
test', + ), + '= as attribute' => array( + 'input' => '
test', + 'expected' => '
test', + ), + '== as attribute' => array( + 'input' => '
test', + 'expected' => '
test', + ), + '=== as attribute' => array( + 'input' => '
test', + 'expected' => '
test', + ), + 'unsupported disabled attribute' => array( + 'input' => '
test', + 'expected' => '
test', + ), + 'malformed custom attributes' => array( + 'input' => '
test', + 'expected' => '
test', + ), + 'Multiple unclosed tags treated as a single tag' => array( + 'input' => << + test HTML - , - << - test + , + 'expected' => << + test HTML - , - ); - - $examples['27'] = array( - '
test', - '
test', - ); - - $examples['28'] = array( - '
test', - '
test', + , + ), + '
' => array( + 'input' => '
test', + 'expected' => '
test', + ), + '
' => array( + 'input' => '
test', + 'expected' => '
test', + ), ); - - return $examples; } } From b708c6b618770c7e80981c93c0bd2ab9d73a7819 Mon Sep 17 00:00:00 2001 From: hellofromtonya Date: Mon, 30 Jan 2023 16:25:06 -0600 Subject: [PATCH 06/23] Load API files directly from wp-settings.php --- src/wp-includes/wp-html.php | 42 ------------------- src/wp-settings.php | 5 ++- .../html/wpHtmlTagProcessorBookmarks.php | 5 ++- .../tests/html/wpHtmlTagProcessorTest.php | 5 ++- 4 files changed, 12 insertions(+), 45 deletions(-) delete mode 100644 src/wp-includes/wp-html.php diff --git a/src/wp-includes/wp-html.php b/src/wp-includes/wp-html.php deleted file mode 100644 index a0d238cef7823..0000000000000 --- a/src/wp-includes/wp-html.php +++ /dev/null @@ -1,42 +0,0 @@ - Date: Mon, 30 Jan 2023 16:30:04 -0600 Subject: [PATCH 07/23] Tests: remove loading API files --- tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php | 5 ----- tests/phpunit/tests/html/wpHtmlTagProcessorTest.php | 5 ----- 2 files changed, 10 deletions(-) diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php b/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php index bcc584fe19971..3ee75eb140b52 100644 --- a/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php +++ b/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php @@ -6,11 +6,6 @@ * @subpackage HTML */ -require_once ABSPATH . WPINC . '/class-wp-html-attribute-token.php'; -require_once ABSPATH . WPINC . '/class-wp-html-span.php'; -require_once ABSPATH . WPINC . '/class-wp-html-text-replacement.php'; -require_once ABSPATH . WPINC . '/class-wp-html-tag-processor.php'; - /** * @group html * diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php b/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php index 5a42081307fc5..4c0915feca9b4 100644 --- a/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php +++ b/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php @@ -6,11 +6,6 @@ * @subpackage HTML */ -require_once ABSPATH . WPINC . '/class-wp-html-attribute-token.php'; -require_once ABSPATH . WPINC . '/class-wp-html-span.php'; -require_once ABSPATH . WPINC . '/class-wp-html-text-replacement.php'; -require_once ABSPATH . WPINC . '/class-wp-html-tag-processor.php'; - /** * @group html * From 8bdfae4022fe2a34021f2466302a4e8e776ae043 Mon Sep 17 00:00:00 2001 From: hellofromtonya Date: Mon, 30 Jan 2023 16:31:59 -0600 Subject: [PATCH 08/23] Renames test classes to coding standard Tests_{APIorGroup}_className. --- tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php | 2 +- tests/phpunit/tests/html/wpHtmlTagProcessorTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php b/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php index 3ee75eb140b52..4e1ea93053f93 100644 --- a/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php +++ b/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php @@ -11,7 +11,7 @@ * * @coversDefaultClass WP_HTML_Tag_Processor */ -class WP_HTML_Tag_Processor_Bookmark_Test extends WP_UnitTestCase { +class Tests_HTML_wpHtmlTagProcessor_Bookmark extends WP_UnitTestCase { /** * @ticket 56299 diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php b/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php index 4c0915feca9b4..265ac927b1ced 100644 --- a/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php +++ b/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php @@ -11,7 +11,7 @@ * * @coversDefaultClass WP_HTML_Tag_Processor */ -class WP_HTML_Tag_Processor_Test extends WP_UnitTestCase { +class Tests_HTML_wpHtmlTagProcessor extends WP_UnitTestCase { const HTML_SIMPLE = '
Text
'; const HTML_WITH_CLASSES = '
Text
'; const HTML_MALFORMED = '
Back to notifications
'; From bc170866527e6e7afb174f4ac8512e0150b54064 Mon Sep 17 00:00:00 2001 From: hellofromtonya Date: Mon, 30 Jan 2023 16:35:44 -0600 Subject: [PATCH 09/23] Renames test filenames to coding standard --- ...lTagProcessorBookmarks.php => wpHtmlTagProcessor-bookmark.php} | 0 .../html/{wpHtmlTagProcessorTest.php => wpHtmlTagProcessor.php} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename tests/phpunit/tests/html/{wpHtmlTagProcessorBookmarks.php => wpHtmlTagProcessor-bookmark.php} (100%) rename tests/phpunit/tests/html/{wpHtmlTagProcessorTest.php => wpHtmlTagProcessor.php} (100%) diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php b/tests/phpunit/tests/html/wpHtmlTagProcessor-bookmark.php similarity index 100% rename from tests/phpunit/tests/html/wpHtmlTagProcessorBookmarks.php rename to tests/phpunit/tests/html/wpHtmlTagProcessor-bookmark.php diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessorTest.php b/tests/phpunit/tests/html/wpHtmlTagProcessor.php similarity index 100% rename from tests/phpunit/tests/html/wpHtmlTagProcessorTest.php rename to tests/phpunit/tests/html/wpHtmlTagProcessor.php From 334e4155a3c210dd4a13bf8cf9817fec67cc4b7f Mon Sep 17 00:00:00 2001 From: hellofromtonya Date: Mon, 30 Jan 2023 17:08:10 -0600 Subject: [PATCH 10/23] Cleans HEADS from merge conflict from test file --- .../phpunit/tests/html/wpHtmlTagProcessor.php | 53 ------------------- 1 file changed, 53 deletions(-) diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessor.php b/tests/phpunit/tests/html/wpHtmlTagProcessor.php index 265ac927b1ced..730a4c017928b 100644 --- a/tests/phpunit/tests/html/wpHtmlTagProcessor.php +++ b/tests/phpunit/tests/html/wpHtmlTagProcessor.php @@ -1528,13 +1528,8 @@ public function test_set_attribute_with_value_equals_to_true_adds_a_boolean_html /** * @ticket 56299 * -<<<<<<< HEAD - * @covers ::set_attribute - * @covers ::get_updated_html -======= * @covers WP_HTML_Tag_Processor::set_attribute * @covers WP_HTML_Tag_Processor::get_updated_html ->>>>>>> 43ac2567fa (WP_HTML_Tag_Processor_Test: test improvements) */ public function test_setting_a_boolean_attribute_to_false_removes_it_from_the_markup() { $p = new WP_HTML_Tag_Processor( @@ -1551,13 +1546,8 @@ public function test_setting_a_boolean_attribute_to_false_removes_it_from_the_ma /** * @ticket 56299 * -<<<<<<< HEAD - * @covers ::set_attribute - * @covers ::get_updated_html -======= * @covers WP_HTML_Tag_Processor::set_attribute * @covers WP_HTML_Tag_Processor::get_updated_html ->>>>>>> 43ac2567fa (WP_HTML_Tag_Processor_Test: test improvements) */ public function test_setting_a_missing_attribute_to_false_does_not_change_the_markup() { $html_input = '
'; @@ -1570,13 +1560,8 @@ public function test_setting_a_missing_attribute_to_false_does_not_change_the_ma /** * @ticket 56299 * -<<<<<<< HEAD - * @covers ::set_attribute - * @covers ::get_updated_html -======= * @covers WP_HTML_Tag_Processor::set_attribute * @covers WP_HTML_Tag_Processor::get_updated_html ->>>>>>> 43ac2567fa (WP_HTML_Tag_Processor_Test: test improvements) */ public function test_setting_a_boolean_attribute_to_a_string_value_adds_explicit_value_to_the_markup() { $p = new WP_HTML_Tag_Processor( @@ -1593,13 +1578,8 @@ public function test_setting_a_boolean_attribute_to_a_string_value_adds_explicit /** * @ticket 56299 * -<<<<<<< HEAD - * @covers ::get_tag - * @covers ::next_tag -======= * @covers WP_HTML_Tag_Processor::get_tag * @covers WP_HTML_Tag_Processor::next_tag ->>>>>>> 43ac2567fa (WP_HTML_Tag_Processor_Test: test improvements) */ public function test_unclosed_script_tag_should_not_cause_an_infinite_loop() { $p = new WP_HTML_Tag_Processor( ' closer --- .../phpunit/tests/html/wpHtmlTagProcessor.php | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessor.php b/tests/phpunit/tests/html/wpHtmlTagProcessor.php index e375925f51f25..c98abe3de13a3 100644 --- a/tests/phpunit/tests/html/wpHtmlTagProcessor.php +++ b/tests/phpunit/tests/html/wpHtmlTagProcessor.php @@ -1714,6 +1714,39 @@ public function data_next_tag_ignores_contents_of_rcdata_tag() { ); } + /** + * @ticket 56299 + * + * @covers WP_HTML_Tag_Processor::next_tag + * + * @dataProvider data_skips_contents_of_script_and_rcdata_regions + * + * @param $input_html HTML with multiple divs, one of which carries the "target" attribute. + */ + public function test_skips_contents_of_script_and_rcdata_regions($input_html ) { + $p = new WP_HTML_Tag_Processor( $input_html ); + $p->next_tag( 'div' ); + + $this->assertTrue( $p->get_attribute( 'target' ) ); + } + + /** + * Data provider + * + * @return string[] + */ + public function data_skips_contents_of_script_and_rcdata_regions() { + return array( + 'Balanced SCRIPT tags' => '
', + 'Unexpected SCRIPT closer after DIV' => 'console.log("
")
', + 'Unexpected SCRIPT closer before DIV' => 'console.log("")
', + 'Missing SCRIPT closer' => '
', + 'TITLE before DIV' => '<div>
', + 'SCRIPT inside TITLE' => '<script><div>
', + 'TITLE in TEXTAREA' => '
', + ); + } + /** * @ticket 56299 * From 5c1a5d5529c1c8621cdec2fe78fa3c8598ced39c Mon Sep 17 00:00:00 2001 From: Dennis Snell Date: Wed, 1 Feb 2023 10:01:37 -0700 Subject: [PATCH 19/23] Update tests: fix data provider and remove Exception expectation --- .../tests/html/wpHtmlTagProcessor-bookmark.php | 4 ---- tests/phpunit/tests/html/wpHtmlTagProcessor.php | 16 ++++++++-------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessor-bookmark.php b/tests/phpunit/tests/html/wpHtmlTagProcessor-bookmark.php index a15c180362589..0b63f4dafd154 100644 --- a/tests/phpunit/tests/html/wpHtmlTagProcessor-bookmark.php +++ b/tests/phpunit/tests/html/wpHtmlTagProcessor-bookmark.php @@ -339,8 +339,6 @@ public function test_limits_the_number_of_bookmarks() { $p = new WP_HTML_Tag_Processor( '
  • One
  • Two
  • Three
' ); $p->next_tag( 'li' ); - $this->expectException( Exception::class ); - for ( $i = 0;$i < WP_HTML_Tag_Processor::MAX_BOOKMARKS;$i++ ) { $this->assertTrue( $p->set_bookmark( "bookmark $i" ), "Could not allocate the bookmark #$i" ); } @@ -358,8 +356,6 @@ public function test_limits_the_number_of_seek_calls() { $p->next_tag( 'li' ); $p->set_bookmark( 'bookmark' ); - $this->expectException( Exception::class ); - for ( $i = 0; $i < WP_HTML_Tag_Processor::MAX_SEEK_OPS; $i++ ) { $this->assertTrue( $p->seek( 'bookmark' ), 'Could not seek to the "bookmark"' ); } diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessor.php b/tests/phpunit/tests/html/wpHtmlTagProcessor.php index c98abe3de13a3..3bd965e637233 100644 --- a/tests/phpunit/tests/html/wpHtmlTagProcessor.php +++ b/tests/phpunit/tests/html/wpHtmlTagProcessor.php @@ -1733,17 +1733,17 @@ public function test_skips_contents_of_script_and_rcdata_regions($input_html ) { /** * Data provider * - * @return string[] + * @return array[] */ public function data_skips_contents_of_script_and_rcdata_regions() { return array( - 'Balanced SCRIPT tags' => '
', - 'Unexpected SCRIPT closer after DIV' => 'console.log("
")
', - 'Unexpected SCRIPT closer before DIV' => 'console.log("")
', - 'Missing SCRIPT closer' => '
', - 'TITLE before DIV' => '<div>
', - 'SCRIPT inside TITLE' => '<script><div>
', - 'TITLE in TEXTAREA' => '
', + 'Balanced SCRIPT tags' => array( '
' ), + 'Unexpected SCRIPT closer after DIV' => array( 'console.log("
")
' ), + 'Unexpected SCRIPT closer before DIV' => array( 'console.log("")
' ), + 'Missing SCRIPT closer' => array( '
' ), + 'TITLE before DIV' => array( '<div>
' ), + 'SCRIPT inside TITLE' => array( '<script><div>
' ), + 'TITLE in TEXTAREA' => array( '
' ), ); } From c50ffeec49c9250450c938f661cf30cac6a859d9 Mon Sep 17 00:00:00 2001 From: Dennis Snell Date: Wed, 1 Feb 2023 10:04:39 -0700 Subject: [PATCH 20/23] Lint issue --- tests/phpunit/tests/html/wpHtmlTagProcessor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessor.php b/tests/phpunit/tests/html/wpHtmlTagProcessor.php index 3bd965e637233..7f8ff0895f042 100644 --- a/tests/phpunit/tests/html/wpHtmlTagProcessor.php +++ b/tests/phpunit/tests/html/wpHtmlTagProcessor.php @@ -1723,7 +1723,7 @@ public function data_next_tag_ignores_contents_of_rcdata_tag() { * * @param $input_html HTML with multiple divs, one of which carries the "target" attribute. */ - public function test_skips_contents_of_script_and_rcdata_regions($input_html ) { + public function test_skips_contents_of_script_and_rcdata_regions( $input_html ) { $p = new WP_HTML_Tag_Processor( $input_html ); $p->next_tag( 'div' ); From 9a5ccf042e0e396a26a76cdd3ff2eb1dede70294 Mon Sep 17 00:00:00 2001 From: Dennis Snell Date: Wed, 1 Feb 2023 10:28:52 -0700 Subject: [PATCH 21/23] Fix broken tests --- src/wp-includes/html-api/class-wp-html-tag-processor.php | 4 ++-- tests/phpunit/tests/html/wpHtmlTagProcessor-bookmark.php | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/html-api/class-wp-html-tag-processor.php b/src/wp-includes/html-api/class-wp-html-tag-processor.php index e21214201dcef..ac004b524ca5d 100644 --- a/src/wp-includes/html-api/class-wp-html-tag-processor.php +++ b/src/wp-includes/html-api/class-wp-html-tag-processor.php @@ -554,7 +554,7 @@ public function next_tag( $query = null ) { * @TODO: Add unit test case and fix (if necessary) for RCDATA tag closer coming before RCDATA tag opener. */ $t = $this->html[ $this->tag_name_starts_at ]; - if ( 's' === $t || 'S' === $t || 't' === $t || 'T' === $t ) { + if ( ! $this->is_closing_tag && ( 's' === $t || 'S' === $t || 't' === $t || 'T' === $t ) ) { $tag_name = $this->get_tag(); if ( 'SCRIPT' === $tag_name && ! $this->skip_script_data() ) { @@ -663,7 +663,7 @@ public function set_bookmark( $name ) { if ( ! array_key_exists( $name, $this->bookmarks ) && count( $this->bookmarks ) >= self::MAX_BOOKMARKS ) { if ( WP_DEBUG ) { - trigger_error( "Tried to jump to a non-existent HTML bookmark {$name}.", E_USER_WARNING ); + trigger_error( "Too many bookmarks: cannot create '{$name}'", E_USER_WARNING ); } return false; } diff --git a/tests/phpunit/tests/html/wpHtmlTagProcessor-bookmark.php b/tests/phpunit/tests/html/wpHtmlTagProcessor-bookmark.php index 0b63f4dafd154..12c5917446de8 100644 --- a/tests/phpunit/tests/html/wpHtmlTagProcessor-bookmark.php +++ b/tests/phpunit/tests/html/wpHtmlTagProcessor-bookmark.php @@ -339,10 +339,11 @@ public function test_limits_the_number_of_bookmarks() { $p = new WP_HTML_Tag_Processor( '
  • One
  • Two
  • Three
' ); $p->next_tag( 'li' ); - for ( $i = 0;$i < WP_HTML_Tag_Processor::MAX_BOOKMARKS;$i++ ) { + for ( $i = 0; $i < WP_HTML_Tag_Processor::MAX_BOOKMARKS; $i++ ) { $this->assertTrue( $p->set_bookmark( "bookmark $i" ), "Could not allocate the bookmark #$i" ); } + $this->expectWarningMessageMatches( '/Too many bookmarks/' ); $this->assertFalse( $p->set_bookmark( 'final bookmark' ), "Allocated $i bookmarks, which is one above the limit." ); } @@ -359,6 +360,8 @@ public function test_limits_the_number_of_seek_calls() { for ( $i = 0; $i < WP_HTML_Tag_Processor::MAX_SEEK_OPS; $i++ ) { $this->assertTrue( $p->seek( 'bookmark' ), 'Could not seek to the "bookmark"' ); } + + $this->expectWarningMessageMatches( 'Too many calls to seek()' ); $this->assertFalse( $p->seek( 'bookmark' ), "$i-th seek() to the bookmark succeeded, even though it should exceed the allowed limit." ); } } From 0053f9ffc49738418004b6f3ac86684395f9d594 Mon Sep 17 00:00:00 2001 From: ntsekouras Date: Wed, 1 Feb 2023 20:00:23 +0200 Subject: [PATCH 22/23] Update the WordPress packages with Gutenberg 15.0.1 changes --- package-lock.json | 5442 ++++++++--------- package.json | 125 +- .../assets/script-loader-packages.min.php | 2 +- src/wp-includes/block-editor.php | 2 - src/wp-includes/blocks/archives.php | 11 +- src/wp-includes/blocks/archives/block.json | 1 + src/wp-includes/blocks/avatar.php | 2 +- src/wp-includes/blocks/avatar/block.json | 3 +- src/wp-includes/blocks/block.php | 3 +- src/wp-includes/blocks/block/block.json | 3 +- src/wp-includes/blocks/blocks-json.php | 2 +- src/wp-includes/blocks/button/block.json | 6 +- src/wp-includes/blocks/calendar.php | 25 +- src/wp-includes/blocks/calendar/block.json | 10 + src/wp-includes/blocks/categories.php | 2 +- src/wp-includes/blocks/categories/block.json | 1 + .../blocks/comment-author-name.php | 9 +- .../blocks/comment-author-name/block.json | 1 + src/wp-includes/blocks/comment-content.php | 9 +- .../blocks/comment-content/block.json | 1 + src/wp-includes/blocks/comment-date.php | 2 +- .../blocks/comment-date/block.json | 1 + src/wp-includes/blocks/comment-edit-link.php | 9 +- .../blocks/comment-edit-link/block.json | 1 + src/wp-includes/blocks/comment-reply-link.php | 11 +- .../blocks/comment-reply-link/block.json | 1 + src/wp-includes/blocks/comment-template.php | 5 +- .../blocks/comment-template/block.json | 9 +- .../comments-pagination-next/block.json | 1 + .../comments-pagination-numbers/block.json | 8 + .../comments-pagination-previous/block.json | 1 + .../blocks/comments-pagination.php | 5 +- .../blocks/comments-pagination/block.json | 1 + src/wp-includes/blocks/comments.php | 1 - src/wp-includes/blocks/comments/block.json | 5 + src/wp-includes/blocks/cover.php | 2 +- src/wp-includes/blocks/cover/block.json | 4 + src/wp-includes/blocks/embed/block.json | 18 +- src/wp-includes/blocks/gallery.php | 29 +- src/wp-includes/blocks/group/block.json | 10 +- src/wp-includes/blocks/heading.php | 52 + src/wp-includes/blocks/heading/block.json | 3 +- src/wp-includes/blocks/home-link.php | 2 +- src/wp-includes/blocks/home-link/block.json | 1 + src/wp-includes/blocks/html/block.json | 2 +- .../blocks/latest-comments/block.json | 7 +- src/wp-includes/blocks/latest-posts.php | 21 +- .../blocks/latest-posts/block.json | 14 + src/wp-includes/blocks/list-item/block.json | 15 +- src/wp-includes/blocks/loginout/block.json | 1 + src/wp-includes/blocks/navigation-link.php | 61 +- src/wp-includes/blocks/navigation-submenu.php | 42 +- src/wp-includes/blocks/navigation.php | 215 +- src/wp-includes/blocks/navigation/block.json | 6 + .../blocks/navigation/view-modal.asset.php | 2 +- .../navigation/view-modal.min.asset.php | 2 +- .../blocks/page-list-item/block.json | 52 + src/wp-includes/blocks/page-list.php | 39 +- src/wp-includes/blocks/page-list/block.json | 27 +- .../blocks/post-author-biography/block.json | 1 + src/wp-includes/blocks/post-author-name.php | 54 + .../blocks/post-author-name/block.json | 53 + src/wp-includes/blocks/post-author.php | 22 +- src/wp-includes/blocks/post-author/block.json | 9 + src/wp-includes/blocks/post-comments-form.php | 10 +- .../blocks/post-comments-form/block.json | 5 + src/wp-includes/blocks/post-content.php | 3 +- .../blocks/post-content/block.json | 4 + src/wp-includes/blocks/post-date.php | 13 +- src/wp-includes/blocks/post-date/block.json | 1 + src/wp-includes/blocks/post-excerpt.php | 9 +- .../blocks/post-excerpt/block.json | 1 + .../blocks/post-featured-image.php | 26 +- .../blocks/post-featured-image/block.json | 1 + .../blocks/post-navigation-link.php | 23 + .../blocks/post-navigation-link/block.json | 8 +- src/wp-includes/blocks/post-template.php | 5 +- .../blocks/post-template/block.json | 9 + src/wp-includes/blocks/post-terms.php | 9 +- src/wp-includes/blocks/post-terms/block.json | 5 + src/wp-includes/blocks/post-title.php | 14 +- src/wp-includes/blocks/post-title/block.json | 1 + src/wp-includes/blocks/query-no-results.php | 4 +- .../blocks/query-no-results/block.json | 1 + .../blocks/query-pagination-next/block.json | 1 + .../query-pagination-numbers/block.json | 1 + .../query-pagination-previous/block.json | 1 + src/wp-includes/blocks/query-pagination.php | 2 + .../blocks/query-pagination/block.json | 1 + src/wp-includes/blocks/query-title/block.json | 1 + src/wp-includes/blocks/query/block.json | 9 +- src/wp-includes/blocks/read-more.php | 11 +- src/wp-includes/blocks/read-more/block.json | 1 + .../blocks/require-dynamic-blocks.php | 2 + .../blocks/require-static-blocks.php | 2 +- src/wp-includes/blocks/rss.php | 2 +- src/wp-includes/blocks/rss/block.json | 1 + src/wp-includes/blocks/search.php | 4 +- src/wp-includes/blocks/search/block.json | 1 + src/wp-includes/blocks/site-logo/block.json | 1 + .../blocks/site-tagline/block.json | 3 +- src/wp-includes/blocks/site-title.php | 9 +- src/wp-includes/blocks/site-title/block.json | 4 +- src/wp-includes/blocks/social-link.php | 18 +- src/wp-includes/blocks/social-link/block.json | 4 + src/wp-includes/blocks/table/block.json | 30 + src/wp-includes/blocks/tag-cloud.php | 9 +- src/wp-includes/blocks/tag-cloud/block.json | 9 + src/wp-includes/blocks/template-part.php | 29 +- .../blocks/template-part/block.json | 1 + src/wp-includes/blocks/term-description.php | 12 +- .../blocks/term-description/block.json | 1 + src/wp-includes/class-wp-block-parser.php | 24 +- src/wp-includes/script-loader.php | 11 +- .../includes/unregister-blocks-hooks.php | 2 + 115 files changed, 3730 insertions(+), 3116 deletions(-) create mode 100644 src/wp-includes/blocks/heading.php create mode 100644 src/wp-includes/blocks/page-list-item/block.json create mode 100644 src/wp-includes/blocks/post-author-name.php create mode 100644 src/wp-includes/blocks/post-author-name/block.json diff --git a/package-lock.json b/package-lock.json index d271460d9649f..91a04b1108c50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,38 +23,44 @@ } }, "@babel/compat-data": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", - "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==", + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", + "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", "dev": true }, "@babel/core": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", - "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helpers": "^7.19.4", - "@babel/parser": "^7.19.6", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", + "json5": "^2.2.2", "semver": "^6.3.0" }, "dependencies": { "@babel/parser": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", - "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "semver": { @@ -85,12 +91,12 @@ } }, "@babel/generator": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", - "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", "dev": true, "requires": { - "@babel/types": "^7.19.4", + "@babel/types": "^7.20.7", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -128,39 +134,55 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", - "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.3", + "@babel/compat-data": "^7.20.5", "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "dependencies": { "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" } }, + "caniuse-lite": { + "version": "1.0.30001450", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", + "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", + "dev": true + }, "electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", + "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==", "dev": true }, "semver": { @@ -168,32 +190,39 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", - "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", + "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", - "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", + "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" + "regexpu-core": "^5.2.1" } }, "@babel/helper-define-polyfill-provider": { @@ -253,12 +282,12 @@ } }, "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", + "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", "dev": true, "requires": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.20.7" } }, "@babel/helper-module-imports": { @@ -270,19 +299,19 @@ } }, "@babel/helper-module-transforms": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", - "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.19.4", + "@babel/helper-simple-access": "^7.20.2", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" } }, "@babel/helper-optimise-call-expression": { @@ -295,9 +324,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", - "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==" + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" }, "@babel/helper-remap-async-to-generator": { "version": "7.18.9", @@ -312,34 +341,35 @@ } }, "@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" } }, "@babel/helper-simple-access": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", - "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "requires": { - "@babel/types": "^7.19.4" + "@babel/types": "^7.20.2" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dev": true, "requires": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.20.0" } }, "@babel/helper-split-export-declaration": { @@ -368,26 +398,26 @@ "dev": true }, "@babel/helper-wrap-function": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", - "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "dev": true, "requires": { "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" } }, "@babel/helpers": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", - "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.4", - "@babel/types": "^7.19.4" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" } }, "@babel/highlight": { @@ -428,24 +458,24 @@ } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz", - "integrity": "sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" } @@ -461,13 +491,13 @@ } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", + "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, @@ -502,12 +532,12 @@ } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, @@ -532,16 +562,16 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz", - "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.4", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-plugin-utils": "^7.19.0", + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" + "@babel/plugin-transform-parameters": "^7.20.7" } }, "@babel/plugin-proposal-optional-catch-binding": { @@ -555,13 +585,13 @@ } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", + "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, @@ -576,14 +606,14 @@ } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", + "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, @@ -652,12 +682,12 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-syntax-import-meta": { @@ -759,32 +789,32 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", + "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" } }, "@babel/plugin-transform-block-scoped-functions": { @@ -797,47 +827,48 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz", - "integrity": "sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==", + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.14.tgz", + "integrity": "sha512-sMPepQtsOs5fM1bwNvuJJHvaCfOEQfmc01FGw0ELlTpTJj5Ql/zuNRRldYhAPys4ghXdBIQJbRVYi44/7QflQQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-classes": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", - "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", + "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.19.0", + "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", + "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" } }, "@babel/plugin-transform-destructuring": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz", - "integrity": "sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", + "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-dotall-regex": { @@ -908,35 +939,35 @@ } }, "@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", + "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-identifier": "^7.19.1" } }, @@ -951,13 +982,13 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", - "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-new-target": { @@ -980,12 +1011,12 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", + "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-property-literals": { @@ -998,12 +1029,12 @@ } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz", - "integrity": "sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.20.2.tgz", + "integrity": "sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-react-display-name": { @@ -1016,16 +1047,16 @@ } }, "@babel/plugin-transform-react-jsx": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", - "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.13.tgz", + "integrity": "sha512-MmTZx/bkUrfJhhYAYt3Urjm+h8DQGrPrnKQ94jLo7NLuOU+T89a7IByhKmrb8SKhrIYIQ0FN0CHMbnFRen4qNw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.19.0" + "@babel/types": "^7.20.7" } }, "@babel/plugin-transform-react-jsx-development": { @@ -1048,13 +1079,13 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", + "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" } }, "@babel/plugin-transform-reserved-words": { @@ -1098,13 +1129,13 @@ } }, "@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" } }, "@babel/plugin-transform-sticky-regex": { @@ -1135,14 +1166,14 @@ } }, "@babel/plugin-transform-typescript": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.3.tgz", - "integrity": "sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz", + "integrity": "sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/plugin-syntax-typescript": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.20.12", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" } }, "@babel/plugin-transform-unicode-escapes": { @@ -1165,18 +1196,18 @@ } }, "@babel/preset-env": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.4.tgz", - "integrity": "sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.4", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-plugin-utils": "^7.19.0", + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-validator-option": "^7.18.6", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.19.1", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-class-static-block": "^7.18.6", "@babel/plugin-proposal-dynamic-import": "^7.18.6", @@ -1185,7 +1216,7 @@ "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.19.4", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", "@babel/plugin-proposal-optional-chaining": "^7.18.9", "@babel/plugin-proposal-private-methods": "^7.18.6", @@ -1196,7 +1227,7 @@ "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-import-assertions": "^7.20.0", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -1209,10 +1240,10 @@ "@babel/plugin-transform-arrow-functions": "^7.18.6", "@babel/plugin-transform-async-to-generator": "^7.18.6", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.19.4", - "@babel/plugin-transform-classes": "^7.19.0", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.19.4", + "@babel/plugin-transform-destructuring": "^7.20.2", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", @@ -1220,14 +1251,14 @@ "@babel/plugin-transform-function-name": "^7.18.9", "@babel/plugin-transform-literals": "^7.18.9", "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.0", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", "@babel/plugin-transform-modules-umd": "^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", "@babel/plugin-transform-new-target": "^7.18.6", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-parameters": "^7.20.1", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.18.6", "@babel/plugin-transform-reserved-words": "^7.18.6", @@ -1239,7 +1270,7 @@ "@babel/plugin-transform-unicode-escapes": "^7.18.10", "@babel/plugin-transform-unicode-regex": "^7.18.6", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.19.4", + "@babel/types": "^7.20.2", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", "babel-plugin-polyfill-regenerator": "^0.4.1", @@ -1294,80 +1325,69 @@ } }, "@babel/runtime": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz", - "integrity": "sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/runtime-corejs3": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.6.tgz", - "integrity": "sha512-oWNn1ZlGde7b4i/3tnixpH9qI0bOAACiUs+KEES4UUCnsPjVWFlWdLV/iwJuPC2qp3EowbAqsm+0XqNwnwYhxA==", - "dev": true, + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", "requires": { - "core-js-pure": "^3.25.1", - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "dependencies": { - "core-js-pure": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz", - "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==", - "dev": true + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" } } }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "dependencies": { "@babel/parser": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", - "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", "dev": true } } }, "@babel/traverse": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", - "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.6", + "@babel/generator": "^7.20.7", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.6", - "@babel/types": "^7.19.4", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "@babel/parser": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", - "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", "dev": true } } }, "@babel/types": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", - "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", "requires": { "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", @@ -1390,9 +1410,9 @@ } }, "@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", + "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==", "dev": true }, "@discoveryjs/json-ext": { @@ -1535,26 +1555,26 @@ "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" }, "@es-joy/jsdoccomment": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.20.1.tgz", - "integrity": "sha512-oeJK41dcdqkvdZy/HctKklJNkt/jh+av3PZARrZEl+fs/8HaHeeYoAvEwOV0u5I6bArTF17JEsTZMY359e/nfQ==", + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz", + "integrity": "sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg==", "dev": true, "requires": { - "comment-parser": "1.3.0", + "comment-parser": "1.3.1", "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "~2.2.3" + "jsdoc-type-pratt-parser": "~3.1.0" } }, "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.4.0", - "globals": "^13.15.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -1578,9 +1598,9 @@ } }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -1627,24 +1647,24 @@ "integrity": "sha512-TlQiXt/vS5ZwY0V3salvlyQzIzMGZEyw9inmJA25A8heL2kBVENbToiEc64R6ETNf5YHa2lwnc2I7iNHP9SqeQ==" }, "@floating-ui/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.0.1.tgz", - "integrity": "sha512-bO37brCPfteXQfFY0DyNDGB3+IMe4j150KFQcgJ5aBP295p9nBGeHEs/p0czrRbtlHq4Px/yoPXO/+dOCcF4uA==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.1.1.tgz", + "integrity": "sha512-PL7g3dhA4dHgZfujkuD8Q+tfJJynEtnNQSPzmucCnxMvkxf4cLBJw/ZYqZUn4HCh33U3WHrAfv2R2tbi9UCSmw==" }, "@floating-ui/dom": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.0.4.tgz", - "integrity": "sha512-maYJRv+sAXTy4K9mzdv0JPyNW5YPVHrqtY90tEdI6XNpuLOP26Ci2pfwPsKBA/Wh4Z3FX5sUrtUFTdMYj9v+ug==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.1.tgz", + "integrity": "sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==", "requires": { - "@floating-ui/core": "^1.0.1" + "@floating-ui/core": "^1.1.0" } }, "@floating-ui/react-dom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.0.0.tgz", - "integrity": "sha512-uiOalFKPG937UCLm42RxjESTWUVpbbatvlphQAU6bsv+ence6IoVG8JOUZcy8eW81NkU+Idiwvx10WFLmR4MIg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.2.2.tgz", + "integrity": "sha512-DbmFBLwFrZhtXgCI2ra7wXYT8L2BN4/4AMQKyu05qzsVji51tXOfF36VE2gpMB6nhJGHa85PdEg75FB4+vnLFQ==", "requires": { - "@floating-ui/dom": "^1.0.0" + "@floating-ui/dom": "^1.1.1" } }, "@hapi/hoek": { @@ -1663,14 +1683,25 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.6.tgz", - "integrity": "sha512-jJr+hPTJYKyDILJfhNSHsjiwXYf26Flsz8DvNndOsHs5pwSnpGUEy8yzF0JYhCEvTDdV2vuOK5tt8BVhwO5/hg==", + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "@humanwhocodes/module-importer": { @@ -2434,59 +2465,59 @@ "dev": true }, "@motionone/animation": { - "version": "10.14.0", - "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.14.0.tgz", - "integrity": "sha512-h+1sdyBP8vbxEBW5gPFDnj+m2DCqdlAuf2g6Iafb1lcMnqjsRXWlPw1AXgvUMXmreyhqmPbJqoNfIKdytampRQ==", + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz", + "integrity": "sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==", "requires": { - "@motionone/easing": "^10.14.0", - "@motionone/types": "^10.14.0", - "@motionone/utils": "^10.14.0", + "@motionone/easing": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", "tslib": "^2.3.1" } }, "@motionone/dom": { - "version": "10.12.0", - "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.12.0.tgz", - "integrity": "sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==", - "requires": { - "@motionone/animation": "^10.12.0", - "@motionone/generators": "^10.12.0", - "@motionone/types": "^10.12.0", - "@motionone/utils": "^10.12.0", + "version": "10.15.5", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.15.5.tgz", + "integrity": "sha512-Xc5avlgyh3xukU9tydh9+8mB8+2zAq+WlLsC3eEIp7Ax7DnXgY7Bj/iv0a4X2R9z9ZFZiaXK3BO0xMYHKbAAdA==", + "requires": { + "@motionone/animation": "^10.15.1", + "@motionone/generators": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", "hey-listen": "^1.0.8", "tslib": "^2.3.1" } }, "@motionone/easing": { - "version": "10.14.0", - "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.14.0.tgz", - "integrity": "sha512-2vUBdH9uWTlRbuErhcsMmt1jvMTTqvGmn9fHq8FleFDXBlHFs5jZzHJT9iw+4kR1h6a4SZQuCf72b9ji92qNYA==", + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.15.1.tgz", + "integrity": "sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==", "requires": { - "@motionone/utils": "^10.14.0", + "@motionone/utils": "^10.15.1", "tslib": "^2.3.1" } }, "@motionone/generators": { - "version": "10.14.0", - "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.14.0.tgz", - "integrity": "sha512-6kRHezoFfIjFN7pPpaxmkdZXD36tQNcyJe3nwVqwJ+ZfC0e3rFmszR8kp9DEVFs9QL/akWjuGPSLBI1tvz+Vjg==", + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.15.1.tgz", + "integrity": "sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==", "requires": { - "@motionone/types": "^10.14.0", - "@motionone/utils": "^10.14.0", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", "tslib": "^2.3.1" } }, "@motionone/types": { - "version": "10.14.0", - "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.14.0.tgz", - "integrity": "sha512-3bNWyYBHtVd27KncnJLhksMFQ5o2MSdk1cA/IZqsHtA9DnRM1SYgN01CTcJ8Iw8pCXF5Ocp34tyAjY7WRpOJJQ==" + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.15.1.tgz", + "integrity": "sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==" }, "@motionone/utils": { - "version": "10.14.0", - "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.14.0.tgz", - "integrity": "sha512-sLWBLPzRqkxmOTRzSaD3LFQXCPHvDzyHJ1a3VP9PRzBxyVd2pv51/gMOsdAcxQ9n+MIeGJnxzXBYplUHKj4jkw==", + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.15.1.tgz", + "integrity": "sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==", "requires": { - "@motionone/types": "^10.14.0", + "@motionone/types": "^10.15.1", "hey-listen": "^1.0.8", "tslib": "^2.3.1" } @@ -2616,53 +2647,53 @@ "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" }, "@react-spring/animated": { - "version": "9.5.5", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.5.5.tgz", - "integrity": "sha512-glzViz7syQ3CE6BQOwAyr75cgh0qsihm5lkaf24I0DfU63cMm/3+br299UEYkuaHNmfDfM414uktiPlZCNJbQA==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.6.1.tgz", + "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==", "requires": { - "@react-spring/shared": "~9.5.5", - "@react-spring/types": "~9.5.5" + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" } }, "@react-spring/core": { - "version": "9.5.5", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.5.5.tgz", - "integrity": "sha512-shaJYb3iX18Au6gkk8ahaF0qx0LpS0Yd+ajb4asBaAQf6WPGuEdJsbsNSgei1/O13JyEATsJl20lkjeslJPMYA==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.6.1.tgz", + "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==", "requires": { - "@react-spring/animated": "~9.5.5", - "@react-spring/rafz": "~9.5.5", - "@react-spring/shared": "~9.5.5", - "@react-spring/types": "~9.5.5" + "@react-spring/animated": "~9.6.1", + "@react-spring/rafz": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" } }, "@react-spring/rafz": { - "version": "9.5.5", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.5.5.tgz", - "integrity": "sha512-F/CLwB0d10jL6My5vgzRQxCNY2RNyDJZedRBK7FsngdCmzoq3V4OqqNc/9voJb9qRC2wd55oGXUeXv2eIaFmsw==" + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.6.1.tgz", + "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==" }, "@react-spring/shared": { - "version": "9.5.5", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.5.5.tgz", - "integrity": "sha512-YwW70Pa/YXPOwTutExHZmMQSHcNC90kJOnNR4G4mCDNV99hE98jWkIPDOsgqbYx3amIglcFPiYKMaQuGdr8dyQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.6.1.tgz", + "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==", "requires": { - "@react-spring/rafz": "~9.5.5", - "@react-spring/types": "~9.5.5" + "@react-spring/rafz": "~9.6.1", + "@react-spring/types": "~9.6.1" } }, "@react-spring/types": { - "version": "9.5.5", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.5.5.tgz", - "integrity": "sha512-7I/qY8H7Enwasxr4jU6WmtNK+RZ4Z/XvSlDvjXFVe7ii1x0MoSlkw6pD7xuac8qrHQRm9BTcbZNyeeKApYsvCg==" + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.6.1.tgz", + "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==" }, "@react-spring/web": { - "version": "9.5.5", - "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.5.5.tgz", - "integrity": "sha512-+moT8aDX/ho/XAhU+HRY9m0LVV9y9CK6NjSRaI+30Re150pB3iEip6QfnF4qnhSCQ5drpMF0XRXHgOTY/xbtFw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.6.1.tgz", + "integrity": "sha512-X2zR6q2Z+FjsWfGAmAXlQaoUHbPmfuCaXpuM6TcwXPpLE1ZD4A1eys/wpXboFQmDkjnrlTmKvpVna1MjWpZ5Hw==", "requires": { - "@react-spring/animated": "~9.5.5", - "@react-spring/core": "~9.5.5", - "@react-spring/shared": "~9.5.5", - "@react-spring/types": "~9.5.5" + "@react-spring/animated": "~9.6.1", + "@react-spring/core": "~9.6.1", + "@react-spring/shared": "~9.6.1", + "@react-spring/types": "~9.6.1" } }, "@sideway/formula": { @@ -2720,9 +2751,9 @@ "dev": true }, "@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.0.tgz", - "integrity": "sha512-Cp1JR1IPrQNvPRbkfcPmax52iunBC+eQDyBce8feOIIbVH6ZpVhErYoJtPWRBj2rKi4Wi9HvCm1+L1UD6QlBmg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", + "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", "dev": true }, "@svgr/babel-plugin-remove-jsx-attribute": { @@ -2738,60 +2769,60 @@ "dev": true }, "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.0.tgz", - "integrity": "sha512-XWm64/rSPUCQ+MFyA9lhMO+w8bOZvkTvovRIU1lpIy63ysPaVAFtxjQiZj+S7QaLaLGUXkSkf8WZsaN+QPo/gA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", + "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", "dev": true }, "@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.0.tgz", - "integrity": "sha512-JIF2D2ltiWFGlTw2fJ9jJg1fNT9rWjOD2Cf0/xzeW6Z2LIRQTHcRHxpZq359+SRWtEPsCXEWV2Xmd+DMBj6dBw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", + "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", "dev": true }, "@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.0.tgz", - "integrity": "sha512-uuo0FfLP4Nu2zncOcoUFDzZdXWma2bxkTGk0etRThs4/PghvPIGaW8cPhCg6yJ8zpaauWcKV0wZtzKlJRCtVzg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", + "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", "dev": true }, "@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.0.tgz", - "integrity": "sha512-VMRWyOmrV+DaEFPgP3hZMsFgs2g87ojs3txw0Rx8iz6Nf/E3UoHUwTqpkSCWd3Hsnc9gMOY9+wl6+/Ycleh1sw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", + "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", "dev": true }, "@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.0.tgz", - "integrity": "sha512-b67Ul3SelaqvGEEG/1B3VJ03KUtGFgRQjRLCCjdttMQLcYa9l/izQFEclNFx53pNqhijUMNKHPhGMY/CWGVKig==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", + "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", "dev": true }, "@svgr/babel-preset": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.0.tgz", - "integrity": "sha512-UWM98PKVuMqw2UZo8YO3erI6nF1n7/XBYTXBqR0QhZP7HTjYK6QxFNvPfIshddy1hBdzhVpkf148Vg8xiVOtyg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", + "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", "dev": true, "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^6.5.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^6.5.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.0", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.0", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.0", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.0", - "@svgr/babel-plugin-transform-svg-component": "^6.5.0" + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", + "@svgr/babel-plugin-remove-jsx-attribute": "*", + "@svgr/babel-plugin-remove-jsx-empty-expression": "*", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", + "@svgr/babel-plugin-transform-svg-component": "^6.5.1" } }, "@svgr/core": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.0.tgz", - "integrity": "sha512-jIbu36GMjfK8HCCQitkfVVeQ2vSXGfq0ef0GO9HUxZGjal6Kvpkk4PwpkFP+OyCzF+skQFT9aWrUqekT3pKF8w==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", + "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", "dev": true, "requires": { - "@babel/core": "^7.18.5", - "@svgr/babel-preset": "^6.5.0", - "@svgr/plugin-jsx": "^6.5.0", + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", "camelcase": "^6.2.0", "cosmiconfig": "^7.0.1" }, @@ -2805,13 +2836,13 @@ } }, "@svgr/hast-util-to-babel-ast": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.0.tgz", - "integrity": "sha512-PPy94U/EiPQ2dY0b4jEqj4QOdDRq6DG7aTHjpGaL8HlKSHkpU1DpjfywCXTJqtOdCo2FywjWvg0U2FhqMeUJaA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", + "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", "dev": true, "requires": { - "@babel/types": "^7.18.4", - "entities": "^4.3.0" + "@babel/types": "^7.20.0", + "entities": "^4.4.0" }, "dependencies": { "entities": { @@ -2823,21 +2854,21 @@ } }, "@svgr/plugin-jsx": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.0.tgz", - "integrity": "sha512-1CHMqOBKoNk/ZPU+iGXKcQPC6q9zaD7UOI99J+BaGY5bdCztcf5bZyi0QZSDRJtCQpdofeVv7XfBYov2mtl0Pw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", + "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", "dev": true, "requires": { - "@babel/core": "^7.18.5", - "@svgr/babel-preset": "^6.5.0", - "@svgr/hast-util-to-babel-ast": "^6.5.0", + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/hast-util-to-babel-ast": "^6.5.1", "svg-parser": "^2.0.4" } }, "@svgr/plugin-svgo": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.0.tgz", - "integrity": "sha512-8Zv1Yyv6I7HlIqrqGFM0sDKQrhjbfNZJawR8UjIaVWSb0tKZP1Ra6ymhqIFu6FT6kDRD0Ct5NlQZ10VUujSspw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", + "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", "dev": true, "requires": { "cosmiconfig": "^7.0.1", @@ -2947,19 +2978,19 @@ } }, "@svgr/webpack": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.0.tgz", - "integrity": "sha512-rM/Z4pwMhqvAXEHoHIlE4SeTb0ToQNmJuBdiHwhP2ZtywyX6XqrgCv2WX7K/UCgNYJgYbekuylgyjnuLUHTcZQ==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", + "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", "dev": true, "requires": { - "@babel/core": "^7.18.5", - "@babel/plugin-transform-react-constant-elements": "^7.17.12", - "@babel/preset-env": "^7.18.2", - "@babel/preset-react": "^7.17.12", - "@babel/preset-typescript": "^7.17.12", - "@svgr/core": "^6.5.0", - "@svgr/plugin-jsx": "^6.5.0", - "@svgr/plugin-svgo": "^6.5.0" + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-constant-elements": "^7.18.12", + "@babel/preset-env": "^7.19.4", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@svgr/core": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "@svgr/plugin-svgo": "^6.5.1" } }, "@tannin/compile": { @@ -3002,16 +3033,24 @@ "dev": true }, "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" + }, + "dependencies": { + "@babel/parser": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", + "dev": true + } } }, "@types/babel__generator": { @@ -3034,9 +3073,9 @@ } }, "@types/babel__traverse": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz", - "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -3061,15 +3100,6 @@ "@types/node": "*" } }, - "@types/cheerio": { - "version": "0.22.31", - "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.31.tgz", - "integrity": "sha512-Kt7Cdjjdi2XWSfrZ53v4Of0wG3ZcmaegFXjMmz9tfNrZSkzzo36G0AL1YqSdcIA78Etjt6E609pt5h1xnQkPUw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -3116,21 +3146,21 @@ "dev": true }, "@types/express": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "version": "4.17.16", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.16.tgz", + "integrity": "sha512-LkKpqRZ7zqXJuvoELakaFYuETHjZkSol8EV6cNnyishutDBCCdv6+dsKPbKkCcIk57qRphOLY5sEgClw1bO3gA==", "dev": true, "requires": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", + "@types/express-serve-static-core": "^4.17.31", "@types/qs": "*", "@types/serve-static": "*" } }, "@types/express-serve-static-core": { - "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "version": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", "dev": true, "requires": { "@types/node": "*", @@ -3149,9 +3179,9 @@ } }, "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, "requires": { "@types/node": "*" @@ -3208,11 +3238,6 @@ "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", "dev": true }, - "@types/lodash": { - "version": "4.14.186", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz", - "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==" - }, "@types/markdown-it": { "version": "12.2.3", "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", @@ -3248,9 +3273,9 @@ "dev": true }, "@types/mousetrap": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.9.tgz", - "integrity": "sha512-HUAiN65VsRXyFCTicolwb5+I7FM6f72zjMWr+ajGk+YTvzBgXqa2A5U7d+rtsouAkunJ5U4Sb5lNJjo9w+nmXg==" + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.11.tgz", + "integrity": "sha512-F0oAily9Q9QQpv9JKxKn0zMKfOo36KHCW7myYsmUyf2t0g+sBTbG3UleTPoguHdE1z3GLFr3p7/wiOio52QFjQ==" }, "@types/node": { "version": "14.14.20", @@ -3270,9 +3295,9 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", "dev": true }, "@types/prop-types": { @@ -3299,9 +3324,9 @@ "dev": true }, "@types/react": { - "version": "17.0.51", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.51.tgz", - "integrity": "sha512-YMddzAE+nSH04BiTJ5GydTxk0/3hckqyuOclg0s6zQYj/XzfRVNzHZAFwZb5SCSavkzTYUtcq/gwjLnvt2Y4cg==", + "version": "18.0.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.27.tgz", + "integrity": "sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3309,11 +3334,11 @@ } }, "@types/react-dom": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.17.tgz", - "integrity": "sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg==", + "version": "18.0.10", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz", + "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==", "requires": { - "@types/react": "^17" + "@types/react": "*" } }, "@types/retry": { @@ -3328,9 +3353,9 @@ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "@types/semver": { - "version": "7.3.12", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", - "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, "@types/serve-index": { @@ -3438,18 +3463,18 @@ } }, "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", "dev": true, "requires": { "@types/node": "*" } }, "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -3472,16 +3497,18 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.41.0.tgz", - "integrity": "sha512-DXUS22Y57/LAFSg3x7Vi6RNAuLpTXwxB9S2nIA7msBb/Zt8p7XqMwdpdc1IU7CkOQUPgAqR5fWvxuKCbneKGmA==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz", + "integrity": "sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.41.0", - "@typescript-eslint/type-utils": "5.41.0", - "@typescript-eslint/utils": "5.41.0", + "@typescript-eslint/scope-manager": "5.50.0", + "@typescript-eslint/type-utils": "5.50.0", + "@typescript-eslint/utils": "5.50.0", "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" @@ -3513,24 +3540,15 @@ } } }, - "@typescript-eslint/experimental-utils": { - "version": "5.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.41.0.tgz", - "integrity": "sha512-/qxT2Kd2q/A22JVIllvws4rvc00/3AT4rAo/0YgEN28y+HPhbJbk6X4+MAHEoZzpNyAOugIT7D/OLnKBW8FfhA==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "5.41.0" - } - }, "@typescript-eslint/parser": { - "version": "5.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.41.0.tgz", - "integrity": "sha512-HQVfix4+RL5YRWZboMD1pUfFN8MpRH4laziWkkAzyO1fvNOY/uinZcvo3QiFJVS/siNHupV8E5+xSwQZrl6PZA==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz", + "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.41.0", - "@typescript-eslint/types": "5.41.0", - "@typescript-eslint/typescript-estree": "5.41.0", + "@typescript-eslint/scope-manager": "5.50.0", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/typescript-estree": "5.50.0", "debug": "^4.3.4" }, "dependencies": { @@ -3552,23 +3570,23 @@ } }, "@typescript-eslint/scope-manager": { - "version": "5.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.41.0.tgz", - "integrity": "sha512-xOxPJCnuktUkY2xoEZBKXO5DBCugFzjrVndKdUnyQr3+9aDWZReKq9MhaoVnbL+maVwWJu/N0SEtrtEUNb62QQ==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz", + "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.41.0", - "@typescript-eslint/visitor-keys": "5.41.0" + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0" } }, "@typescript-eslint/type-utils": { - "version": "5.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.41.0.tgz", - "integrity": "sha512-L30HNvIG6A1Q0R58e4hu4h+fZqaO909UcnnPbwKiN6Rc3BUEx6ez2wgN7aC0cBfcAjZfwkzE+E2PQQ9nEuoqfA==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz", + "integrity": "sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.41.0", - "@typescript-eslint/utils": "5.41.0", + "@typescript-eslint/typescript-estree": "5.50.0", + "@typescript-eslint/utils": "5.50.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3591,19 +3609,19 @@ } }, "@typescript-eslint/types": { - "version": "5.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.41.0.tgz", - "integrity": "sha512-5BejraMXMC+2UjefDvrH0Fo/eLwZRV6859SXRg+FgbhA0R0l6lDqDGAQYhKbXhPN2ofk2kY5sgGyLNL907UXpA==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz", + "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.41.0.tgz", - "integrity": "sha512-SlzFYRwFSvswzDSQ/zPkIWcHv8O5y42YUskko9c4ki+fV6HATsTODUPbRbcGDFYP86gaJL5xohUEytvyNNcXWg==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz", + "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==", "dev": true, "requires": { - "@typescript-eslint/types": "5.41.0", - "@typescript-eslint/visitor-keys": "5.41.0", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/visitor-keys": "5.50.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3647,16 +3665,16 @@ } }, "@typescript-eslint/utils": { - "version": "5.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.41.0.tgz", - "integrity": "sha512-QlvfwaN9jaMga9EBazQ+5DDx/4sAdqDkcs05AsQHMaopluVCUyu1bTRUVKzXbgjDlrRAQrYVoi/sXJ9fmG+KLQ==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz", + "integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.41.0", - "@typescript-eslint/types": "5.41.0", - "@typescript-eslint/typescript-estree": "5.41.0", + "@typescript-eslint/scope-manager": "5.50.0", + "@typescript-eslint/types": "5.50.0", + "@typescript-eslint/typescript-estree": "5.50.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -3674,12 +3692,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.41.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.41.0.tgz", - "integrity": "sha512-vilqeHj267v8uzzakbm13HkPMl7cbYpKVjgFWZPIOHIJHZtinvypUhJ5xBXfWYg4eFKqztbMMpOgFpT9Gfx4fw==", + "version": "5.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz", + "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.41.0", + "@typescript-eslint/types": "5.50.0", "eslint-visitor-keys": "^3.3.0" }, "dependencies": { @@ -3692,16 +3710,16 @@ } }, "@use-gesture/core": { - "version": "10.2.22", - "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.2.22.tgz", - "integrity": "sha512-Ek0JZFYfk+hicLmoG094gm3YOuDMBNckHb988e59YOZoAkETT8dQSzT+g3QkSHSiP1m5wFXAGPSgxvOuwvGKHQ==" + "version": "10.2.24", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.2.24.tgz", + "integrity": "sha512-ZL7F9mgOn3Qlnp6QLI9jaOfcvqrx6JPE/BkdVSd8imveaFTm/a3udoO6f5Us/1XtqnL4347PsIiK6AtCvMHk2Q==" }, "@use-gesture/react": { - "version": "10.2.22", - "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.2.22.tgz", - "integrity": "sha512-ECo7ig16SxBE06ENIURO1woKEB6TC8qY3a0rugJjQ2f1o0Tj28xS/eYNyJuqzQB5YT0q5IrF7ZFpbx1p/5ohYA==", + "version": "10.2.24", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.2.24.tgz", + "integrity": "sha512-rAZ8Nnpu1g4eFzqCPlaq+TppJpMy0dTpYOQx5KpfoBF4P3aWnCqwj7eKxcmdIb1NJKpIJj50DPugUH4mq5cpBg==", "requires": { - "@use-gesture/core": "10.2.22" + "@use-gesture/core": "10.2.24" } }, "@webassemblyjs/ast": { @@ -3871,60 +3889,26 @@ "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", "dev": true }, - "@wojtekmaj/enzyme-adapter-react-17": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.6.7.tgz", - "integrity": "sha512-B+byiwi/T1bx5hcj9wc0fUL5Hlb5giSXJzcnEfJVl2j6dGV2NJfcxDBYX0WWwIxlzNiFz8kAvlkFWI2y/nscZQ==", - "dev": true, - "requires": { - "@wojtekmaj/enzyme-adapter-utils": "^0.1.4", - "enzyme-shallow-equal": "^1.0.0", - "has": "^1.0.0", - "prop-types": "^15.7.0", - "react-is": "^17.0.0", - "react-test-renderer": "^17.0.0" - }, - "dependencies": { - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - } - } - }, - "@wojtekmaj/enzyme-adapter-utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-utils/-/enzyme-adapter-utils-0.1.4.tgz", - "integrity": "sha512-ARGIQSIIv3oBia1m5Ihn1VU0FGmft6KPe39SBKTb8p7LSXO23YI4kNtc4M/cKoIY7P+IYdrZcgMObvedyjoSQA==", - "dev": true, - "requires": { - "function.prototype.name": "^1.1.0", - "has": "^1.0.0", - "object.fromentries": "^2.0.0", - "prop-types": "^15.7.0" - } - }, "@wordpress/a11y": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-3.17.1.tgz", - "integrity": "sha512-VQx191AnuZ5QlO26oCULslykGfNIF5s9N5CXAW1I6KUqBxEOO964rUhumf8tWeB+5nrVgwBES6AkApdpfV00oQ==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-3.26.0.tgz", + "integrity": "sha512-IPHDWifS++iMgRM/2EEND3S0BQrSCm8AuWKCGNvfw97OBbKaGf2Z4E6/gLnGp9bILXeBJeTJMWhwJFL02qF0fg==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/dom-ready": "^3.17.1", - "@wordpress/i18n": "^4.17.1" + "@wordpress/dom-ready": "^3.26.0", + "@wordpress/i18n": "^4.26.0" } }, "@wordpress/annotations": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/@wordpress/annotations/-/annotations-2.17.3.tgz", - "integrity": "sha512-l/nVrNi78c6w7Hf+YWfLlIfS0WMSQtQGXgj1rp3ZJZp78cW2ofN7w5axSMD8iGkz660/J2GefZlhw/fDG6awkQ==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/annotations/-/annotations-2.26.0.tgz", + "integrity": "sha512-Vry8wWuMzJRejpBhlCjzOlHttzsGGg3A8iW0fYAe9R9apx+FHtfJ3xk4JqH4CSmkbHT5nCShh6qrirpPVWkT6g==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/data": "^7.1.3", - "@wordpress/hooks": "^3.17.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/rich-text": "^5.15.3", + "@wordpress/data": "^8.3.0", + "@wordpress/hooks": "^3.26.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/rich-text": "^6.3.0", "rememo": "^4.0.0", "uuid": "^8.3.0" }, @@ -3937,33 +3921,33 @@ } }, "@wordpress/api-fetch": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-6.14.1.tgz", - "integrity": "sha512-geEktCZzde3yXoX+TkSJGay1Rw0lz4HlPjsHoKMRZa9luxquksPFP/ASDF9HvWThxGOyv9tzZd7oEveJeTmssg==", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-6.23.0.tgz", + "integrity": "sha512-97S92W62DUNu8M1pReAzlC2RQyYlFUwPwkZS0zEiOWOespe3paZRU0qYW2ko7+FWfGXf+wxK7OfDu01w2hgn3A==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^4.17.1", - "@wordpress/url": "^3.18.1" + "@wordpress/i18n": "^4.26.0", + "@wordpress/url": "^3.27.0" } }, "@wordpress/autop": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-3.17.1.tgz", - "integrity": "sha512-RGduB833OnnW17Wow8irTlHZK1Pq4ja9w4KMnGwyVhNsAcvIjGf3OSVm0+dUZKJvIpacrbcyVKQ9G3llXVe/Kg==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-3.26.0.tgz", + "integrity": "sha512-GahkYRq/Hs+nqHwduQex6itBBm46eLShmT+Gkf2SXiZvarSE+a0MccifB0zCaWKNIzxawa6HkbgvuYk2QlT2Fg==", "requires": { "@babel/runtime": "^7.16.0" } }, "@wordpress/babel-plugin-import-jsx-pragma": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@wordpress/babel-plugin-import-jsx-pragma/-/babel-plugin-import-jsx-pragma-4.3.0.tgz", - "integrity": "sha512-7AnWnpItOqH5YEcFA3RgxeOlb96R8KDWDPAZjZ6TpsdOVjFynT8H3Buc4v127BHmxuxKGyd2vxPIQIzC9dLzOw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-plugin-import-jsx-pragma/-/babel-plugin-import-jsx-pragma-4.9.0.tgz", + "integrity": "sha512-ejG0lyO8UmMsCydNLfHM2mX6s1IoCtIJ0mHoQ/AKtzetr9PbJRIdQgpIA876zXW46wd0WJE3V+kjEZPDzeEvDA==", "dev": true }, "@wordpress/babel-preset-default": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-7.1.1.tgz", - "integrity": "sha512-+7lSYvodz+oJFCuEswhCui8yg4ekH0pZ5aSDerTKaRD7LKvbjeqQv/UbDFVsZI42BfNIEQ9hhDl8TMyrhjiyIA==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-7.10.0.tgz", + "integrity": "sha512-4psTNav+VcxZAkWnHfq6ePFSDDGOvmc2p0KjHygi03NCZgWBy3cnlRr/Vy736ZQ7CM98YLsYYKBG/3sWdk3n2A==", "dev": true, "requires": { "@babel/core": "^7.16.0", @@ -3972,26 +3956,32 @@ "@babel/preset-env": "^7.16.0", "@babel/preset-typescript": "^7.16.0", "@babel/runtime": "^7.16.0", - "@wordpress/babel-plugin-import-jsx-pragma": "^4.0.1", - "@wordpress/browserslist-config": "^5.0.1", - "@wordpress/element": "^4.15.1", - "@wordpress/warning": "^2.17.1", + "@wordpress/babel-plugin-import-jsx-pragma": "^4.9.0", + "@wordpress/browserslist-config": "^5.9.0", + "@wordpress/element": "^5.3.0", + "@wordpress/warning": "^2.26.0", "browserslist": "^4.17.6", "core-js": "^3.19.1" }, "dependencies": { "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" } }, + "caniuse-lite": { + "version": "1.0.30001450", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", + "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", + "dev": true + }, "electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", @@ -3999,92 +3989,95 @@ "dev": true }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", + "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==", "dev": true } } }, "@wordpress/base-styles": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-4.11.0.tgz", - "integrity": "sha512-KGHGtOP8q4u3DhlDsw4mMxlcnqxFPMsPa2GrbFBFgFEMeC/v9XMJAAY97V93D5Tbz1JaWBXjQHI+FwPFuyvCHQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-4.17.0.tgz", + "integrity": "sha512-QDdW5PzPNzSOAudlkeMIuwlGxmQSmnJAulD11f4d/OPwfU+KMk3hYr6QS3nzFghlT6IDwcwwlNE6BgoN772G4A==", "dev": true }, "@wordpress/blob": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-3.17.1.tgz", - "integrity": "sha512-rvGG93lTeWHxbhFpKDqRtLcZCC+ZsjtpaDHdOhBdehA+eCvFTcflkU8dZOtAdZJNQZKKJZWy63caD05OUw+Y1Q==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-3.26.0.tgz", + "integrity": "sha512-zxsxvFXmPUtZeJutmeqtK3P5wZ2h+owmgS1dSDQzAoJeYUypZhe9zYhNPiQ9xB1JffxPWhegJ04OS3eqIYlZxA==", "requires": { "@babel/runtime": "^7.16.0" } }, "@wordpress/block-directory": { - "version": "3.15.12", - "resolved": "https://registry.npmjs.org/@wordpress/block-directory/-/block-directory-3.15.12.tgz", - "integrity": "sha512-pcrjkDFRehae4Q9ZwYa7dXHwSaGgJl5iDHDavNIEdNeH3xFZi3KzWvumwSWtUWqM19W8EiekTR0T2qQytnKKvw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-directory/-/block-directory-4.3.0.tgz", + "integrity": "sha512-x6/jqrd81r2HmxgpNtyftbSF7hvl3g/wyYEAhPBaXEXEkN15rZmjB0IXpVznc8Abpdw5noypjOr5bVINfITC+A==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^3.17.1", - "@wordpress/api-fetch": "^6.14.1", - "@wordpress/block-editor": "^10.0.10", - "@wordpress/blocks": "^11.16.4", - "@wordpress/components": "^21.0.7", - "@wordpress/compose": "^5.15.2", - "@wordpress/core-data": "^5.0.4", - "@wordpress/data": "^7.1.3", - "@wordpress/edit-post": "^6.14.12", - "@wordpress/editor": "^12.16.10", - "@wordpress/element": "^4.15.1", - "@wordpress/hooks": "^3.17.1", - "@wordpress/html-entities": "^3.17.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", - "@wordpress/notices": "^3.17.3", - "@wordpress/plugins": "^4.15.2", - "@wordpress/url": "^3.18.1", - "change-case": "^4.1.2", - "lodash": "^4.17.21" + "@wordpress/a11y": "^3.26.0", + "@wordpress/api-fetch": "^6.23.0", + "@wordpress/block-editor": "^11.3.0", + "@wordpress/blocks": "^12.3.0", + "@wordpress/components": "^23.3.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/core-data": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/edit-post": "^7.3.0", + "@wordpress/editor": "^13.3.0", + "@wordpress/element": "^5.3.0", + "@wordpress/hooks": "^3.26.0", + "@wordpress/html-entities": "^3.26.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/icons": "^9.17.0", + "@wordpress/notices": "^3.26.0", + "@wordpress/plugins": "^5.3.0", + "@wordpress/url": "^3.27.0", + "change-case": "^4.1.2" } }, "@wordpress/block-editor": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-10.0.10.tgz", - "integrity": "sha512-U1X+wmpAQcJ1Bc7Lq/EghOQERhdgGIw7SfDLbjNg28/H06a4lg8ntYb9gTuney7dRTz90iAPeqggZpTPN20p1A==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-11.3.0.tgz", + "integrity": "sha512-kavB0v7rM3BvwEzVdrjVeTArPo5EdKx5HA4l+uM6xVTNAGolGV9mhnMULTzqV1MwRssHKfPuHtKb2sTc1gt3Jw==", "requires": { "@babel/runtime": "^7.16.0", "@react-spring/web": "^9.4.5", - "@wordpress/a11y": "^3.17.1", - "@wordpress/api-fetch": "^6.14.1", - "@wordpress/blob": "^3.17.1", - "@wordpress/blocks": "^11.16.4", - "@wordpress/components": "^21.0.7", - "@wordpress/compose": "^5.15.2", - "@wordpress/data": "^7.1.3", - "@wordpress/date": "^4.17.1", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/dom": "^3.17.2", - "@wordpress/element": "^4.15.1", - "@wordpress/hooks": "^3.17.1", - "@wordpress/html-entities": "^3.17.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", - "@wordpress/is-shallow-equal": "^4.17.1", - "@wordpress/keyboard-shortcuts": "^3.15.3", - "@wordpress/keycodes": "^3.17.1", - "@wordpress/notices": "^3.17.3", - "@wordpress/rich-text": "^5.15.3", - "@wordpress/shortcode": "^3.17.1", - "@wordpress/style-engine": "^1.0.3", - "@wordpress/token-list": "^2.17.1", - "@wordpress/url": "^3.18.1", - "@wordpress/warning": "^2.17.1", - "@wordpress/wordcount": "^3.17.1", + "@wordpress/a11y": "^3.26.0", + "@wordpress/api-fetch": "^6.23.0", + "@wordpress/blob": "^3.26.0", + "@wordpress/blocks": "^12.3.0", + "@wordpress/components": "^23.3.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/date": "^4.26.0", + "@wordpress/deprecated": "^3.26.0", + "@wordpress/dom": "^3.26.0", + "@wordpress/element": "^5.3.0", + "@wordpress/escape-html": "^2.26.0", + "@wordpress/experiments": "^0.8.0", + "@wordpress/hooks": "^3.26.0", + "@wordpress/html-entities": "^3.26.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/icons": "^9.17.0", + "@wordpress/is-shallow-equal": "^4.26.0", + "@wordpress/keyboard-shortcuts": "^4.3.0", + "@wordpress/keycodes": "^3.26.0", + "@wordpress/notices": "^3.26.0", + "@wordpress/rich-text": "^6.3.0", + "@wordpress/shortcode": "^3.26.0", + "@wordpress/style-engine": "^1.9.0", + "@wordpress/token-list": "^2.26.0", + "@wordpress/url": "^3.27.0", + "@wordpress/warning": "^2.26.0", + "@wordpress/wordcount": "^3.26.0", + "change-case": "^4.1.2", "classnames": "^2.3.1", "colord": "^2.7.0", "diff": "^4.0.2", "dom-scroll-into-view": "^1.2.1", + "fast-deep-equal": "^3.1.3", "inherits": "^2.0.3", "lodash": "^4.17.21", "react-autosize-textarea": "^7.1.0", @@ -4095,41 +4088,45 @@ } }, "@wordpress/block-library": { - "version": "7.14.12", - "resolved": "https://registry.npmjs.org/@wordpress/block-library/-/block-library-7.14.12.tgz", - "integrity": "sha512-iw3ndfgsbMTf7RMhXumH3Fsj40va73u/EdiE9E9I+EXO72YU/deEMt0BImkfZrnp4AF21ji4zFItLUBt+b/GMQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-library/-/block-library-8.3.0.tgz", + "integrity": "sha512-K8np/gFfcikEuwC6bMDlvh0O7Eq8/7/a+uX6eNTry9QuoLhWzNPI0d9oNOgwKDBJmTtKmf5K4LRjuBIozTHs8g==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^3.17.1", - "@wordpress/api-fetch": "^6.14.1", - "@wordpress/autop": "^3.17.1", - "@wordpress/blob": "^3.17.1", - "@wordpress/block-editor": "^10.0.10", - "@wordpress/blocks": "^11.16.4", - "@wordpress/components": "^21.0.7", - "@wordpress/compose": "^5.15.2", - "@wordpress/core-data": "^5.0.4", - "@wordpress/data": "^7.1.3", - "@wordpress/date": "^4.17.1", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/dom": "^3.17.2", - "@wordpress/element": "^4.15.1", - "@wordpress/hooks": "^3.17.1", - "@wordpress/html-entities": "^3.17.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", - "@wordpress/keycodes": "^3.17.1", - "@wordpress/notices": "^3.17.3", - "@wordpress/primitives": "^3.15.1", - "@wordpress/reusable-blocks": "^3.15.10", - "@wordpress/rich-text": "^5.15.3", - "@wordpress/server-side-render": "^3.15.7", - "@wordpress/url": "^3.18.1", - "@wordpress/viewport": "^4.15.3", + "@wordpress/a11y": "^3.26.0", + "@wordpress/api-fetch": "^6.23.0", + "@wordpress/autop": "^3.26.0", + "@wordpress/blob": "^3.26.0", + "@wordpress/block-editor": "^11.3.0", + "@wordpress/blocks": "^12.3.0", + "@wordpress/components": "^23.3.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/core-data": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/date": "^4.26.0", + "@wordpress/deprecated": "^3.26.0", + "@wordpress/dom": "^3.26.0", + "@wordpress/element": "^5.3.0", + "@wordpress/escape-html": "^2.26.0", + "@wordpress/experiments": "^0.8.0", + "@wordpress/hooks": "^3.26.0", + "@wordpress/html-entities": "^3.26.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/icons": "^9.17.0", + "@wordpress/keycodes": "^3.26.0", + "@wordpress/notices": "^3.26.0", + "@wordpress/primitives": "^3.24.0", + "@wordpress/reusable-blocks": "^4.3.0", + "@wordpress/rich-text": "^6.3.0", + "@wordpress/server-side-render": "^4.3.0", + "@wordpress/url": "^3.27.0", + "@wordpress/viewport": "^5.3.0", "change-case": "^4.1.2", "classnames": "^2.3.1", "colord": "^2.7.0", - "fast-average-color": "^4.3.0", + "escape-html": "^1.0.3", + "fast-average-color": "^9.1.1", + "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21", "memize": "^1.1.0", "micromodal": "^0.4.10", @@ -4137,33 +4134,35 @@ } }, "@wordpress/block-serialization-default-parser": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-4.17.1.tgz", - "integrity": "sha512-BmR8HUowTMXHiyCtNIr1VZ2emzFvk8A7DtnGTuvMOy2EQ+9oHfqJbVb9Lv1vSAoaa77GtoPNoGaUqE3yfp4C4w==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-4.26.0.tgz", + "integrity": "sha512-kCND8ER9VVC7iOZFx2fQXeLn0lWCom5hkcJQ9Td44LUG52rXg0xKFN1HAQwlPNY1T206FBLdtjl1HklQZFWxSw==", "requires": { "@babel/runtime": "^7.16.0" } }, "@wordpress/blocks": { - "version": "11.16.4", - "resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-11.16.4.tgz", - "integrity": "sha512-Pmcy8qldy1T8+QGQ8m5jRERITVVGEBpEeNycj7pJJm5+KuPKl3eqtuSCsCXdYwUdfYeOputNBYiwha/hp+Va/A==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-12.3.0.tgz", + "integrity": "sha512-dIs4Cmn48AuWFZxRgR+Jxvsdi1+l/1GVYEX/gtkVXGbNholuY4E3Hvo5kN6wlgG6V/K98zcpnsj2NfYv7MS88g==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/autop": "^3.17.1", - "@wordpress/blob": "^3.17.1", - "@wordpress/block-serialization-default-parser": "^4.17.1", - "@wordpress/data": "^7.1.3", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/dom": "^3.17.2", - "@wordpress/element": "^4.15.1", - "@wordpress/hooks": "^3.17.1", - "@wordpress/html-entities": "^3.17.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/is-shallow-equal": "^4.17.1", - "@wordpress/shortcode": "^3.17.1", + "@wordpress/autop": "^3.26.0", + "@wordpress/blob": "^3.26.0", + "@wordpress/block-serialization-default-parser": "^4.26.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/deprecated": "^3.26.0", + "@wordpress/dom": "^3.26.0", + "@wordpress/element": "^5.3.0", + "@wordpress/hooks": "^3.26.0", + "@wordpress/html-entities": "^3.26.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/is-shallow-equal": "^4.26.0", + "@wordpress/shortcode": "^3.26.0", "change-case": "^4.1.2", "colord": "^2.7.0", + "fast-deep-equal": "^3.1.3", "hpq": "^1.3.0", "is-plain-object": "^5.0.0", "lodash": "^4.17.21", @@ -4188,15 +4187,15 @@ } }, "@wordpress/browserslist-config": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-5.3.0.tgz", - "integrity": "sha512-FIhYWu36TrZ49W+knaRwhw3Q+cxaTDEzSaiE83qMDeAPJytT/UaedoJULt5MfxUtfaKLmUa8bPjSFORxoxwbvQ==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-5.9.0.tgz", + "integrity": "sha512-VC1QK741SRfrfsq2SdWHlkuDo7ZSXD7LFbK0dU6lOnuUt3f01HTU05NfcrC6uWCaoMP87MPDCQVaWTygNSFirQ==", "dev": true }, "@wordpress/components": { - "version": "21.0.7", - "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-21.0.7.tgz", - "integrity": "sha512-SRiOrKZMwi546qS8K6CctHwVqRkdEGZRXBG67U4xQjtMkGy+4mrbXvs4LTpF/2FwYzk+kQN5X185XsjXliwxEA==", + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-23.3.0.tgz", + "integrity": "sha512-qRl5fCkyPQ+odHiskWROdlj/EYv6XUZ9pB+wcg9JY96Rk0oQvDwPnObYxZwMdmYOCUiFiXOzowT3ZAKSjjJZ3g==", "requires": { "@babel/runtime": "^7.16.0", "@emotion/cache": "^11.7.1", @@ -4207,28 +4206,30 @@ "@emotion/utils": "^1.0.0", "@floating-ui/react-dom": "^1.0.0", "@use-gesture/react": "^10.2.6", - "@wordpress/a11y": "^3.17.1", - "@wordpress/compose": "^5.15.2", - "@wordpress/date": "^4.17.1", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/dom": "^3.17.2", - "@wordpress/element": "^4.15.1", - "@wordpress/escape-html": "^2.17.1", - "@wordpress/hooks": "^3.17.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", - "@wordpress/is-shallow-equal": "^4.17.1", - "@wordpress/keycodes": "^3.17.1", - "@wordpress/primitives": "^3.15.1", - "@wordpress/rich-text": "^5.15.3", - "@wordpress/warning": "^2.17.1", + "@wordpress/a11y": "^3.26.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/date": "^4.26.0", + "@wordpress/deprecated": "^3.26.0", + "@wordpress/dom": "^3.26.0", + "@wordpress/element": "^5.3.0", + "@wordpress/escape-html": "^2.26.0", + "@wordpress/hooks": "^3.26.0", + "@wordpress/html-entities": "^3.26.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/icons": "^9.17.0", + "@wordpress/is-shallow-equal": "^4.26.0", + "@wordpress/keycodes": "^3.26.0", + "@wordpress/primitives": "^3.24.0", + "@wordpress/rich-text": "^6.3.0", + "@wordpress/warning": "^2.26.0", "change-case": "^4.1.2", "classnames": "^2.3.1", "colord": "^2.7.0", "date-fns": "^2.28.0", "dom-scroll-into-view": "^1.2.1", "downshift": "^6.0.15", - "framer-motion": "^6.2.8", + "fast-deep-equal": "^3.1.3", + "framer-motion": "^7.6.1", "gradient-parser": "^0.1.5", "highlight-words-core": "^1.2.2", "lodash": "^4.17.21", @@ -4238,7 +4239,8 @@ "reakit": "^1.3.8", "remove-accents": "^0.4.2", "use-lilius": "^2.0.1", - "uuid": "^8.3.0" + "uuid": "^8.3.0", + "valtio": "^1.7.0" }, "dependencies": { "uuid": { @@ -4249,43 +4251,43 @@ } }, "@wordpress/compose": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-5.15.2.tgz", - "integrity": "sha512-q1qcCqQHjKRrfuTta4gekZlR1DareAx0+mi82Pl1sxkccQU741GgKmC2aJeyZAHbK0Rb/LzSop2fwJaG4rqNlQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-6.3.0.tgz", + "integrity": "sha512-VenvmENQGbuKyer+oy4Ij/qzhZfvdzyW8WCfn1cjcNYvU7WuoHhwvNxZ4Cvtwo0WiTyeV1+bgMUwkAjXtpqkdw==", "requires": { "@babel/runtime": "^7.16.0", - "@types/lodash": "^4.14.172", "@types/mousetrap": "^1.6.8", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/dom": "^3.17.2", - "@wordpress/element": "^4.15.1", - "@wordpress/is-shallow-equal": "^4.17.1", - "@wordpress/keycodes": "^3.17.1", - "@wordpress/priority-queue": "^2.17.2", + "@wordpress/deprecated": "^3.26.0", + "@wordpress/dom": "^3.26.0", + "@wordpress/element": "^5.3.0", + "@wordpress/is-shallow-equal": "^4.26.0", + "@wordpress/keycodes": "^3.26.0", + "@wordpress/priority-queue": "^2.26.0", "change-case": "^4.1.2", "clipboard": "^2.0.8", - "lodash": "^4.17.21", "mousetrap": "^1.6.5", "use-memo-one": "^1.1.1" } }, "@wordpress/core-data": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-5.0.4.tgz", - "integrity": "sha512-/exKM6CM9iIkNY8KdpBcBx+bAj5lgnCNZ4HEPvHlavtSeFbWo+6DLZdp6p2j7eGgvQKz9ok1z5Z+WJn2yV41vw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-6.3.0.tgz", + "integrity": "sha512-j8O533AQu/DELIlVrulT46NI5DjaQONnbJGlfTO5n60XDUB2C6rMKlqTFKMY4gBr4iuuImRYFnpYuZWq0CvI0w==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^6.14.1", - "@wordpress/blocks": "^11.16.4", - "@wordpress/data": "^7.1.3", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/element": "^4.15.1", - "@wordpress/html-entities": "^3.17.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/is-shallow-equal": "^4.17.1", - "@wordpress/url": "^3.18.1", + "@wordpress/api-fetch": "^6.23.0", + "@wordpress/blocks": "^12.3.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/deprecated": "^3.26.0", + "@wordpress/element": "^5.3.0", + "@wordpress/html-entities": "^3.26.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/is-shallow-equal": "^4.26.0", + "@wordpress/url": "^3.27.0", "change-case": "^4.1.2", "equivalent-key-map": "^0.2.2", + "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21", "memize": "^1.1.0", "rememo": "^4.0.0", @@ -4300,46 +4302,48 @@ } }, "@wordpress/customize-widgets": { - "version": "3.14.12", - "resolved": "https://registry.npmjs.org/@wordpress/customize-widgets/-/customize-widgets-3.14.12.tgz", - "integrity": "sha512-s5zZzkg5gZnunwS1ZOHXrCnxIUl1CpYdiEX5vVYZT5UpbvLtk5HiOAsoXtAZoIJfIKKPjNPugFTHSi8VL3vWZw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/customize-widgets/-/customize-widgets-4.3.0.tgz", + "integrity": "sha512-54WSSZ5eAVbV3qSvt+eSdAW+3tcL6Wl/J/WL9bsUcPK5gxuLq9eJ9pkSNlC1+PMYa/HAQnwwhpgiovicWlj/jg==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/block-editor": "^10.0.10", - "@wordpress/block-library": "^7.14.12", - "@wordpress/blocks": "^11.16.4", - "@wordpress/components": "^21.0.7", - "@wordpress/compose": "^5.15.2", - "@wordpress/core-data": "^5.0.4", - "@wordpress/data": "^7.1.3", - "@wordpress/dom": "^3.17.2", - "@wordpress/element": "^4.15.1", - "@wordpress/hooks": "^3.17.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", - "@wordpress/interface": "^4.16.7", - "@wordpress/is-shallow-equal": "^4.17.1", - "@wordpress/keyboard-shortcuts": "^3.15.3", - "@wordpress/keycodes": "^3.17.1", - "@wordpress/media-utils": "^4.8.1", - "@wordpress/preferences": "^2.9.7", - "@wordpress/widgets": "^2.15.10", + "@wordpress/block-editor": "^11.3.0", + "@wordpress/block-library": "^8.3.0", + "@wordpress/blocks": "^12.3.0", + "@wordpress/components": "^23.3.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/core-data": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/dom": "^3.26.0", + "@wordpress/element": "^5.3.0", + "@wordpress/experiments": "^0.8.0", + "@wordpress/hooks": "^3.26.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/icons": "^9.17.0", + "@wordpress/interface": "^5.3.0", + "@wordpress/is-shallow-equal": "^4.26.0", + "@wordpress/keyboard-shortcuts": "^4.3.0", + "@wordpress/keycodes": "^3.26.0", + "@wordpress/media-utils": "^4.17.0", + "@wordpress/preferences": "^3.3.0", + "@wordpress/widgets": "^3.3.0", "classnames": "^2.3.1", - "lodash": "^4.17.21" + "fast-deep-equal": "^3.1.3" } }, "@wordpress/data": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-7.1.3.tgz", - "integrity": "sha512-8xD8LT65vMXbYKg+e+o1I0XTBFb+MxwlaCbgTDkLDv1P3wWq5C4sn9Lxns8DyQI3gyi1dDI9323F1sIB8eZKrg==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-8.3.0.tgz", + "integrity": "sha512-cKpZXI3jJW4iuH3pCJYzwAMAVwRrk9iSK4rQz5H0sGWAzedd0+n6yUVTWUVhoihpCdfgqVkVRoCOQ9Diek0hBA==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/compose": "^5.15.2", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/element": "^4.15.1", - "@wordpress/is-shallow-equal": "^4.17.1", - "@wordpress/priority-queue": "^2.17.2", - "@wordpress/redux-routine": "^4.17.1", + "@wordpress/compose": "^6.3.0", + "@wordpress/deprecated": "^3.26.0", + "@wordpress/element": "^5.3.0", + "@wordpress/experiments": "^0.8.0", + "@wordpress/is-shallow-equal": "^4.26.0", + "@wordpress/priority-queue": "^2.26.0", + "@wordpress/redux-routine": "^4.26.0", "equivalent-key-map": "^0.2.2", "is-plain-object": "^5.0.0", "is-promise": "^4.0.0", @@ -4357,81 +4361,73 @@ } }, "@wordpress/data-controls": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/@wordpress/data-controls/-/data-controls-2.17.3.tgz", - "integrity": "sha512-AkcEsEUNrVuPWoG9d1uxiQcmKGOLyROvHeAWJoGdlgLMEZVU1u7iLeMMG6HmIa2XDNAWZlAtPOuF+MRPcEoucg==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/data-controls/-/data-controls-2.26.0.tgz", + "integrity": "sha512-Hb2FfS5Tqxt2i2Gu+SAVAt5MbBHehS5VNBxvp6yg5Fevkt+0fXBtpTNI8IF0rQOK9S82NjT2B2RXmaFNA+yhng==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^6.14.1", - "@wordpress/data": "^7.1.3", - "@wordpress/deprecated": "^3.17.1" + "@wordpress/api-fetch": "^6.23.0", + "@wordpress/data": "^8.3.0", + "@wordpress/deprecated": "^3.26.0" } }, "@wordpress/date": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-4.17.1.tgz", - "integrity": "sha512-HvQ2em66WXuawFZKHkmv1SLTOQnPfTZalpXKXkS3b9hB2i7RYKRH/QiTOMFxQ/Iv5QxTm7Cl0uNWp3JKt5Bgfw==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-4.26.0.tgz", + "integrity": "sha512-49czY1/R2s0d2bJTaYftAxkcjgg49XNZEg5Rs91AT0qoio56hAdkuIElJLVVjzPLxXA975WnvYp2mnaBHN75mw==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/deprecated": "^3.17.1", + "@wordpress/deprecated": "^3.26.0", "moment": "^2.22.1", "moment-timezone": "^0.5.31" } }, "@wordpress/dependency-extraction-webpack-plugin": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-4.0.2.tgz", - "integrity": "sha512-pbB7Za3rljnCMDnu9HYGeyX/OQfgKnCyD3bIHZAD1GgtiuJOOeW91rXDa1uA+/HWMqDzf8xGqYiS84otszsksg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-4.9.0.tgz", + "integrity": "sha512-p8pN330wQ6WEZhkt3Jva/fVc/79J4LpZi8TpH0X+770YKrhI429YZIenFriQiM72iaWK3Q+gaYziM4bndP+s8w==", "dev": true, "requires": { - "json2php": "^0.0.4", + "json2php": "^0.0.5", "webpack-sources": "^3.2.2" - }, - "dependencies": { - "json2php": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.4.tgz", - "integrity": "sha512-hFzejhs28f70sGnutcsRS459MnAsjRVI85RgPAL1KQIZEpjiDitc27CZv4IgOtaR86vrqOVlu9vJNew2XyTH4g==", - "dev": true - } } }, "@wordpress/deprecated": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-3.17.1.tgz", - "integrity": "sha512-871rBeb0yW9H7YeM18wnPIe2kJSv8ym4eaM/g0v91SAZsKO4Lskea8WMeadya38J4Nejnre0ssPEBTQuDCI4Cw==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-3.26.0.tgz", + "integrity": "sha512-njxd5FkFG12QF0ekcEl96jlgcxQ38Z9l41BxHGAoT27ibO8LDOr08dEKjO8l+QXaKRiFlDLfg4iSVEuMQms1Gw==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/hooks": "^3.17.1" + "@wordpress/hooks": "^3.26.0" } }, "@wordpress/dom": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-3.17.2.tgz", - "integrity": "sha512-8wsfW+QEEX/p/SwQgBmKvGJtCGexxi0mqNrriN4h6b649vzdj7U6axkMEq+ugYFvEgeH90qQ5YPvQ70vblmYnQ==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-3.26.0.tgz", + "integrity": "sha512-Y404VmJFYeauZbOd+3Dz6WDgyRnYe8E6kfwhOyUijSg6CvEvwOqBeURJJVH9FTqVa/b027lrz3SdR1EXtM8Jpw==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/deprecated": "^3.17.1" + "@wordpress/deprecated": "^3.26.0" } }, "@wordpress/dom-ready": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-3.17.1.tgz", - "integrity": "sha512-tXoLSAsaJMMWr8vvVXBHw62bvRV2+tOlqNRXWHvkyVZmSFwKn+b2o1hs+XfDjZ2R1izt3Zc972lWvVC9UbGiuw==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-3.26.0.tgz", + "integrity": "sha512-ku51n9qjSjT33wi1NB0KRVZBa9KHpN9VrC4mMgEBsjtJGJeEMeaH2SJq556TcQPjEPl6OGGGmmA0qSCuRxNKoA==", "requires": { "@babel/runtime": "^7.16.0" } }, "@wordpress/e2e-test-utils": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils/-/e2e-test-utils-8.1.1.tgz", - "integrity": "sha512-OcSoKJH9ELd1CQYoFU/Ov3MgOvsrwyHazwPI9le2W5fcVEVpkFpFwLF8DVTOnhMdre0Z4pDhCie6otxgQiEeHA==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils/-/e2e-test-utils-9.3.0.tgz", + "integrity": "sha512-K2xqgqznU17mH/EJmoPRnoQazrjxbbzQtq/Lqs4fN5rDMzOFLjIQDkGHUTK5n0OyMuwfBM4/FgaX1W4u0qf0Mw==", "dev": true, "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^6.14.1", - "@wordpress/keycodes": "^3.17.1", - "@wordpress/url": "^3.18.1", + "@wordpress/api-fetch": "^6.23.0", + "@wordpress/keycodes": "^3.26.0", + "@wordpress/url": "^3.27.0", "change-case": "^4.1.2", "form-data": "^4.0.0", "node-fetch": "^2.6.0" @@ -4451,36 +4447,38 @@ } }, "@wordpress/edit-post": { - "version": "6.14.12", - "resolved": "https://registry.npmjs.org/@wordpress/edit-post/-/edit-post-6.14.12.tgz", - "integrity": "sha512-8m2TTf0nJTodmhX9Fv32HtP72r8vqfyoBVYVgfYIpOubquMESZpQnbrwmMksthE9wKrcKm/B3/J3SdxX03Cw6Q==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/edit-post/-/edit-post-7.3.0.tgz", + "integrity": "sha512-pvV/gfXMwcEWE2ilaL7nTCLws3SNMuCHRPC+EbV6ERsqswl8hhVsMcD5nV0vg5VZiqsG+wvjqGYqJKHHN/dPoA==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^3.17.1", - "@wordpress/api-fetch": "^6.14.1", - "@wordpress/block-editor": "^10.0.10", - "@wordpress/block-library": "^7.14.12", - "@wordpress/blocks": "^11.16.4", - "@wordpress/components": "^21.0.7", - "@wordpress/compose": "^5.15.2", - "@wordpress/core-data": "^5.0.4", - "@wordpress/data": "^7.1.3", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/editor": "^12.16.10", - "@wordpress/element": "^4.15.1", - "@wordpress/hooks": "^3.17.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", - "@wordpress/interface": "^4.16.7", - "@wordpress/keyboard-shortcuts": "^3.15.3", - "@wordpress/keycodes": "^3.17.1", - "@wordpress/media-utils": "^4.8.1", - "@wordpress/notices": "^3.17.3", - "@wordpress/plugins": "^4.15.2", - "@wordpress/preferences": "^2.9.7", - "@wordpress/url": "^3.18.1", - "@wordpress/viewport": "^4.15.3", - "@wordpress/warning": "^2.17.1", + "@wordpress/a11y": "^3.26.0", + "@wordpress/api-fetch": "^6.23.0", + "@wordpress/block-editor": "^11.3.0", + "@wordpress/block-library": "^8.3.0", + "@wordpress/blocks": "^12.3.0", + "@wordpress/components": "^23.3.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/core-data": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/deprecated": "^3.26.0", + "@wordpress/editor": "^13.3.0", + "@wordpress/element": "^5.3.0", + "@wordpress/experiments": "^0.8.0", + "@wordpress/hooks": "^3.26.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/icons": "^9.17.0", + "@wordpress/interface": "^5.3.0", + "@wordpress/keyboard-shortcuts": "^4.3.0", + "@wordpress/keycodes": "^3.26.0", + "@wordpress/media-utils": "^4.17.0", + "@wordpress/notices": "^3.26.0", + "@wordpress/plugins": "^5.3.0", + "@wordpress/preferences": "^3.3.0", + "@wordpress/url": "^3.27.0", + "@wordpress/viewport": "^5.3.0", + "@wordpress/warning": "^2.26.0", + "@wordpress/widgets": "^3.3.0", "classnames": "^2.3.1", "lodash": "^4.17.21", "memize": "^1.1.0", @@ -4488,112 +4486,122 @@ } }, "@wordpress/edit-site": { - "version": "4.14.14", - "resolved": "https://registry.npmjs.org/@wordpress/edit-site/-/edit-site-4.14.14.tgz", - "integrity": "sha512-gmkteOtJcxBdC6sAaRUQiJCFaLBKydsagYtSEQQ5EX6BDRnphns8Euurm8/UVqMSZetMFYxwXd1o7PdwIt3WeQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/edit-site/-/edit-site-5.3.0.tgz", + "integrity": "sha512-otpNM+JQDEYlWcfkbzX/XgdrH9kOZva0Gbqws2zlBKSklVgJNZWJVLmn6IHOu5cEzBrlWwC+cJE4bE6ukW+7tg==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^3.17.1", - "@wordpress/api-fetch": "^6.14.1", - "@wordpress/block-editor": "^10.0.10", - "@wordpress/block-library": "^7.14.12", - "@wordpress/blocks": "^11.16.4", - "@wordpress/components": "^21.0.7", - "@wordpress/compose": "^5.15.2", - "@wordpress/core-data": "^5.0.4", - "@wordpress/data": "^7.1.3", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/editor": "^12.16.10", - "@wordpress/element": "^4.15.1", - "@wordpress/hooks": "^3.17.1", - "@wordpress/html-entities": "^3.17.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", - "@wordpress/interface": "^4.16.7", - "@wordpress/keyboard-shortcuts": "^3.15.3", - "@wordpress/keycodes": "^3.17.1", - "@wordpress/media-utils": "^4.8.1", - "@wordpress/notices": "^3.17.3", - "@wordpress/plugins": "^4.15.2", - "@wordpress/preferences": "^2.9.7", - "@wordpress/reusable-blocks": "^3.15.10", - "@wordpress/style-engine": "^1.0.3", - "@wordpress/url": "^3.18.1", - "@wordpress/viewport": "^4.15.3", + "@wordpress/a11y": "^3.26.0", + "@wordpress/api-fetch": "^6.23.0", + "@wordpress/block-editor": "^11.3.0", + "@wordpress/block-library": "^8.3.0", + "@wordpress/blocks": "^12.3.0", + "@wordpress/components": "^23.3.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/core-data": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/deprecated": "^3.26.0", + "@wordpress/editor": "^13.3.0", + "@wordpress/element": "^5.3.0", + "@wordpress/experiments": "^0.8.0", + "@wordpress/hooks": "^3.26.0", + "@wordpress/html-entities": "^3.26.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/icons": "^9.17.0", + "@wordpress/interface": "^5.3.0", + "@wordpress/keyboard-shortcuts": "^4.3.0", + "@wordpress/keycodes": "^3.26.0", + "@wordpress/media-utils": "^4.17.0", + "@wordpress/notices": "^3.26.0", + "@wordpress/plugins": "^5.3.0", + "@wordpress/preferences": "^3.3.0", + "@wordpress/reusable-blocks": "^4.3.0", + "@wordpress/style-engine": "^1.9.0", + "@wordpress/url": "^3.27.0", + "@wordpress/viewport": "^5.3.0", + "@wordpress/widgets": "^3.3.0", "classnames": "^2.3.1", + "colord": "^2.9.2", "downloadjs": "^1.4.7", + "fast-deep-equal": "^3.1.3", "history": "^5.1.0", "lodash": "^4.17.21", + "memize": "^1.1.0", "react-autosize-textarea": "^7.1.0", "rememo": "^4.0.0" } }, "@wordpress/edit-widgets": { - "version": "4.14.12", - "resolved": "https://registry.npmjs.org/@wordpress/edit-widgets/-/edit-widgets-4.14.12.tgz", - "integrity": "sha512-a0+2oyG9qgFMk9Omhz7x2A1SKmUg7yanM3MBBljtTfhl5Ipt6uqal/lGiIaiGeAamTKh45g6j7mpGmwx2mTSFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/edit-widgets/-/edit-widgets-5.3.0.tgz", + "integrity": "sha512-FmGvZHLP6GNAMYG7FuL/smt3OhuZfsU87+hQzQ4xPa8dVcBTwD/xCBuGrbRk6LpDQXCFkpUMjWWrms5qtSmBlg==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^6.14.1", - "@wordpress/block-editor": "^10.0.10", - "@wordpress/block-library": "^7.14.12", - "@wordpress/blocks": "^11.16.4", - "@wordpress/components": "^21.0.7", - "@wordpress/compose": "^5.15.2", - "@wordpress/core-data": "^5.0.4", - "@wordpress/data": "^7.1.3", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/dom": "^3.17.2", - "@wordpress/element": "^4.15.1", - "@wordpress/hooks": "^3.17.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", - "@wordpress/interface": "^4.16.7", - "@wordpress/keyboard-shortcuts": "^3.15.3", - "@wordpress/keycodes": "^3.17.1", - "@wordpress/media-utils": "^4.8.1", - "@wordpress/notices": "^3.17.3", - "@wordpress/plugins": "^4.15.2", - "@wordpress/preferences": "^2.9.7", - "@wordpress/reusable-blocks": "^3.15.10", - "@wordpress/url": "^3.18.1", - "@wordpress/widgets": "^2.15.10", + "@wordpress/api-fetch": "^6.23.0", + "@wordpress/block-editor": "^11.3.0", + "@wordpress/block-library": "^8.3.0", + "@wordpress/blocks": "^12.3.0", + "@wordpress/components": "^23.3.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/core-data": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/deprecated": "^3.26.0", + "@wordpress/dom": "^3.26.0", + "@wordpress/element": "^5.3.0", + "@wordpress/experiments": "^0.8.0", + "@wordpress/hooks": "^3.26.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/icons": "^9.17.0", + "@wordpress/interface": "^5.3.0", + "@wordpress/keyboard-shortcuts": "^4.3.0", + "@wordpress/keycodes": "^3.26.0", + "@wordpress/media-utils": "^4.17.0", + "@wordpress/notices": "^3.26.0", + "@wordpress/plugins": "^5.3.0", + "@wordpress/preferences": "^3.3.0", + "@wordpress/reusable-blocks": "^4.3.0", + "@wordpress/url": "^3.27.0", + "@wordpress/widgets": "^3.3.0", "classnames": "^2.3.1" } }, "@wordpress/editor": { - "version": "12.16.10", - "resolved": "https://registry.npmjs.org/@wordpress/editor/-/editor-12.16.10.tgz", - "integrity": "sha512-qRC4TR+sPOAXV0zlx1XST9VsLwAOOWnXBYeFHbveU5sGZVY4/iCiEAHJ1ukLp3dbKtsLKG4tbsukl07kXc7zBQ==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/editor/-/editor-13.3.0.tgz", + "integrity": "sha512-mvMd0PQMs9e71IFaHQp+WFtPQJOGZEhdg2nhwQdxAuXO5K4VsIgbwBiSvtelbIpVnxAa8Bj+63Wp2dzOYTi3+A==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^3.17.1", - "@wordpress/api-fetch": "^6.14.1", - "@wordpress/blob": "^3.17.1", - "@wordpress/block-editor": "^10.0.10", - "@wordpress/blocks": "^11.16.4", - "@wordpress/components": "^21.0.7", - "@wordpress/compose": "^5.15.2", - "@wordpress/core-data": "^5.0.4", - "@wordpress/data": "^7.1.3", - "@wordpress/date": "^4.17.1", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/element": "^4.15.1", - "@wordpress/hooks": "^3.17.1", - "@wordpress/html-entities": "^3.17.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", - "@wordpress/keyboard-shortcuts": "^3.15.3", - "@wordpress/keycodes": "^3.17.1", - "@wordpress/media-utils": "^4.8.1", - "@wordpress/notices": "^3.17.3", - "@wordpress/preferences": "^2.9.7", - "@wordpress/reusable-blocks": "^3.15.10", - "@wordpress/rich-text": "^5.15.3", - "@wordpress/server-side-render": "^3.15.7", - "@wordpress/url": "^3.18.1", - "@wordpress/wordcount": "^3.17.1", + "@wordpress/a11y": "^3.26.0", + "@wordpress/api-fetch": "^6.23.0", + "@wordpress/blob": "^3.26.0", + "@wordpress/block-editor": "^11.3.0", + "@wordpress/blocks": "^12.3.0", + "@wordpress/components": "^23.3.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/core-data": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/date": "^4.26.0", + "@wordpress/deprecated": "^3.26.0", + "@wordpress/dom": "^3.26.0", + "@wordpress/element": "^5.3.0", + "@wordpress/experiments": "^0.8.0", + "@wordpress/hooks": "^3.26.0", + "@wordpress/html-entities": "^3.26.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/icons": "^9.17.0", + "@wordpress/keyboard-shortcuts": "^4.3.0", + "@wordpress/keycodes": "^3.26.0", + "@wordpress/media-utils": "^4.17.0", + "@wordpress/notices": "^3.26.0", + "@wordpress/preferences": "^3.3.0", + "@wordpress/reusable-blocks": "^4.3.0", + "@wordpress/rich-text": "^6.3.0", + "@wordpress/server-side-render": "^4.3.0", + "@wordpress/url": "^3.27.0", + "@wordpress/wordcount": "^3.26.0", "classnames": "^2.3.1", + "date-fns": "^2.28.0", + "escape-html": "^1.0.3", "lodash": "^4.17.21", "memize": "^1.1.0", "react-autosize-textarea": "^7.1.0", @@ -4602,51 +4610,76 @@ } }, "@wordpress/element": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-4.15.1.tgz", - "integrity": "sha512-Ut6zOMIbP99lWe7YIT/+Nhhu/P17uSBqau7AFK/oarrHicjlFmew5uc4olY5abdd3OtEpenGMq14vhuru47qGA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-5.3.0.tgz", + "integrity": "sha512-sgBrPm9suYx9sAtMLnfqgJem54Vew+BvVRpQoKQjpoXAKklGKSr52xOERek2TZQuZl/hMCCdvScrLIIW96UNAw==", "requires": { "@babel/runtime": "^7.16.0", - "@types/react": "^17.0.37", - "@types/react-dom": "^17.0.11", - "@wordpress/escape-html": "^2.17.1", + "@types/react": "^18.0.21", + "@types/react-dom": "^18.0.6", + "@wordpress/escape-html": "^2.26.0", "change-case": "^4.1.2", "is-plain-object": "^5.0.0", - "react": "^17.0.2", - "react-dom": "^17.0.2" + "react": "^18.2.0", + "react-dom": "^18.2.0" }, "dependencies": { "is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } } } }, "@wordpress/escape-html": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.17.1.tgz", - "integrity": "sha512-4Ymjqi5tdOyqoKw9rhqgHIdEd8W1hfFvk3Ws0LD40vup849iSxs59vnWGLJyH2WjF7ojGdX5H6RwGk81gFMN8w==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.26.0.tgz", + "integrity": "sha512-uWumpNH4hnmeepTw9K3gC5LmoZECom5L1P6HuZXYXyld8eU5L9p/JdvAPOwLmjffHyJO3hiB2JqYd+nKElbtrw==", "requires": { "@babel/runtime": "^7.16.0" } }, "@wordpress/eslint-plugin": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-13.4.0.tgz", - "integrity": "sha512-318QjzGildIdHJVAT26CFkYzoXW8w3RUTNzDJrJ+Hx9EHCg2TNOrUwW4rLwp9h32Gsw/QerhF9wzE/pueoYdYw==", + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-13.10.0.tgz", + "integrity": "sha512-FW3JryRMeUpdhbBi6n4bKPHoYUqwSZI/7jjmvObiUlr8uJfXRFRXfgYOCP8BiVjMyGDBpiMs95Fyf1QbQ79Img==", "dev": true, "requires": { "@babel/eslint-parser": "^7.16.0", "@typescript-eslint/eslint-plugin": "^5.3.0", "@typescript-eslint/parser": "^5.3.0", - "@wordpress/babel-preset-default": "^7.4.0", - "@wordpress/prettier-config": "^2.3.0", + "@wordpress/babel-preset-default": "^7.10.0", + "@wordpress/prettier-config": "^2.9.0", "cosmiconfig": "^7.0.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-import": "^2.25.2", - "eslint-plugin-jest": "^25.2.3", - "eslint-plugin-jsdoc": "^37.0.3", + "eslint-plugin-jest": "^27.2.1", + "eslint-plugin-jsdoc": "^39.6.9", "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-prettier": "^3.3.0", "eslint-plugin-react": "^7.27.0", @@ -4655,140 +4688,67 @@ "requireindex": "^1.2.0" }, "dependencies": { - "@wordpress/babel-preset-default": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-7.4.0.tgz", - "integrity": "sha512-7drcVBIajDE8s3At7yUr9UdHROYkfPYgR4OaG+EugDn9MzuDIEsGalnazDYwvjerLAwsf8S/S8o34bi6IrthYQ==", - "dev": true, - "requires": { - "@babel/core": "^7.16.0", - "@babel/plugin-transform-react-jsx": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.0", - "@babel/preset-env": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.0", - "@wordpress/babel-plugin-import-jsx-pragma": "^4.3.0", - "@wordpress/browserslist-config": "^5.3.0", - "@wordpress/element": "^4.18.0", - "@wordpress/warning": "^2.20.0", - "browserslist": "^4.17.6", - "core-js": "^3.19.1" - } - }, - "@wordpress/element": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-4.18.0.tgz", - "integrity": "sha512-+3gA4RTD/EDj1h2y/qikh+h0uCUxhShfM7QoDngKOBNSTZHqc0W2p6IMEe+AMdrmu8tyZboTJW/eONjUHE4n7g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.16.0", - "@types/react": "^17.0.37", - "@types/react-dom": "^17.0.11", - "@wordpress/escape-html": "^2.20.0", - "change-case": "^4.1.2", - "is-plain-object": "^5.0.0", - "react": "^17.0.2", - "react-dom": "^17.0.2" - } - }, - "@wordpress/escape-html": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.20.0.tgz", - "integrity": "sha512-bhHkFQrEkuJjhSB6OlQq/Kq+43k8E6JwUw/pCDAjJX2uU/DDG3tW3eftYn2ae7W23bPrNEs1/qULWzbaziPQnw==", + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { - "@babel/runtime": "^7.16.0" + "type-fest": "^0.20.2" } - }, - "@wordpress/warning": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-2.20.0.tgz", - "integrity": "sha512-swTE3rUbk00rddyrQo2sA6yojbzNYUXTntAHbfoF68AC53i7cFunB3Bcod+paDPGR0gq1mr3rfatrWHze8qz3Q==", - "dev": true - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "dev": true } } }, + "@wordpress/experiments": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@wordpress/experiments/-/experiments-0.8.0.tgz", + "integrity": "sha512-3IPbENoxHWjIe/fVSsbB6jh5kC94pqwe3sZsX+iLVV/ritGr0XVoML0pZLrM+8m+U4roTyGiD23Xq6mmBK7ykg==", + "requires": { + "@babel/runtime": "^7.16.0" + } + }, "@wordpress/format-library": { - "version": "3.15.10", - "resolved": "https://registry.npmjs.org/@wordpress/format-library/-/format-library-3.15.10.tgz", - "integrity": "sha512-145Hdgxx1YuR2Vj78dX4VoUbZ0pvhzwgCYgtFSoy4D7wB5BjZUwWpCO3HLUdCNfq0Yq6/4TlsiCiurgVsfkRpQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/format-library/-/format-library-4.3.0.tgz", + "integrity": "sha512-bBKuIOrRV6bGL9I6eI9we4PzGrqKY204UME4k/5qlXDC2z9nevtxXHcfJBN+6sMlWFdbulC4nfpfbAH44/6hOQ==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^3.17.1", - "@wordpress/block-editor": "^10.0.10", - "@wordpress/components": "^21.0.7", - "@wordpress/compose": "^5.15.2", - "@wordpress/data": "^7.1.3", - "@wordpress/element": "^4.15.1", - "@wordpress/html-entities": "^3.17.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", - "@wordpress/rich-text": "^5.15.3", - "@wordpress/url": "^3.18.1" + "@wordpress/a11y": "^3.26.0", + "@wordpress/block-editor": "^11.3.0", + "@wordpress/components": "^23.3.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/element": "^5.3.0", + "@wordpress/html-entities": "^3.26.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/icons": "^9.17.0", + "@wordpress/rich-text": "^6.3.0", + "@wordpress/url": "^3.27.0" } }, "@wordpress/hooks": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.17.1.tgz", - "integrity": "sha512-t079aqzZ4nJmUdnYfLpahlZsmrxd3MVV+UvQqwxppqxayqXkZP1F+e/KmehRCsD28IbP7R3LAfg+AGJ+SNhZQg==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.26.0.tgz", + "integrity": "sha512-NYFnKttKLdkr7OZMqqRgsuQy1LMHjK7tkrGO9NWgrGkvwsaWEIn0hI65za9/TJnUccEBMwl9knsiGA4Fwe7dAA==", "requires": { "@babel/runtime": "^7.16.0" } }, "@wordpress/html-entities": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-3.17.1.tgz", - "integrity": "sha512-iatXmkCs6C2N4DCFY08SCUqlGVRLxw1ejQ0CvIQ3aJV1LR5w4oYVHWm3+ac4wzUIK5bBucfCLWrTCmw/hDz3Uw==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-3.26.0.tgz", + "integrity": "sha512-F4C/tpVWx4I+ShYVinOPJxL7zGjUdT2D6WOT1hTDlvGi5M5wYtgQICs/9KcUf5uMThfu5Oz6Qzu/mqrlvLilQQ==", "requires": { "@babel/runtime": "^7.16.0" } }, "@wordpress/i18n": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-4.17.1.tgz", - "integrity": "sha512-LGtAEH0Z46eleGrj2juUTxU5nVFTkesQlJhWggcIMP8zgR9oAVwYNqxrGXCNCkw9QM9RyJdiAgRs1HJmoq/UUA==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-4.26.0.tgz", + "integrity": "sha512-W94aIByO+3YraI7fJbk+3STnz3e0hhrtBPPjKK1XvT4+3RZiKPaVN2Y8mvCCknbaAILCT+CixUBJOgq6m6bwjQ==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/hooks": "^3.17.1", + "@wordpress/hooks": "^3.26.0", "gettext-parser": "^1.3.1", "memize": "^1.1.0", "sprintf-js": "^1.1.1", @@ -4796,47 +4756,47 @@ } }, "@wordpress/icons": { - "version": "9.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-9.8.1.tgz", - "integrity": "sha512-T0+i4fDqX97/V1bXzffhm3OuzzD8l+6+6/XHibSTUNB96yulKxy7WUVzPv1zsrIvEOyWGFp1jQMbx8ylNAhm1g==", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-9.17.0.tgz", + "integrity": "sha512-bz906ftwaUgFFZB7/yrLswl43y4C14eEDhPamJ+3o45VwSr0yeKPFVNF1uOx/uNrRjihZnAyQaqs12/C7L27NQ==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/element": "^4.15.1", - "@wordpress/primitives": "^3.15.1" + "@wordpress/element": "^5.3.0", + "@wordpress/primitives": "^3.24.0" } }, "@wordpress/interface": { - "version": "4.16.7", - "resolved": "https://registry.npmjs.org/@wordpress/interface/-/interface-4.16.7.tgz", - "integrity": "sha512-VGnAAzJXL21Auasixqz2JfO4Mne/kSly3gLrMGG9KO6AUScBjHgii9YB4Arsz9oMaqom+KboO4jp/VLCL1+SoA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/interface/-/interface-5.3.0.tgz", + "integrity": "sha512-7WGXp1/a4YPKVYXTByOZ1GSqQMfftogIcw4Gb6wUsMItQcj1HCQHPbGxl7q0YAZZLEy5IzOpDKHks6KxPBypYg==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^3.17.1", - "@wordpress/components": "^21.0.7", - "@wordpress/compose": "^5.15.2", - "@wordpress/data": "^7.1.3", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/element": "^4.15.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", - "@wordpress/plugins": "^4.15.2", - "@wordpress/preferences": "^2.9.7", - "@wordpress/viewport": "^4.15.3", + "@wordpress/a11y": "^3.26.0", + "@wordpress/components": "^23.3.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/deprecated": "^3.26.0", + "@wordpress/element": "^5.3.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/icons": "^9.17.0", + "@wordpress/plugins": "^5.3.0", + "@wordpress/preferences": "^3.3.0", + "@wordpress/viewport": "^5.3.0", "classnames": "^2.3.1" } }, "@wordpress/is-shallow-equal": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-4.17.1.tgz", - "integrity": "sha512-KapoKQCp60Eaa/P9oaAXW9H6ml4Sys1i7ydnpSgWh1PFDXy95Omj7CoYn3ZwuujT+Vv8QzCarW+dOOjdm/oz3w==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-4.26.0.tgz", + "integrity": "sha512-NuCcnQs+UbMi8ZHLYHDeH+pC56CFrDfc1oD7y4J02RMcBZ+zwP1zg8XWDFC37r+KJM4Xy7lHThZq0nCIAKpjiw==", "requires": { "@babel/runtime": "^7.16.0" } }, "@wordpress/jest-console": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-6.3.0.tgz", - "integrity": "sha512-WnpXPqRNTo7OBnUEvC7mJufEZUNZXlScnRx3MHFOErzhCzed03t+x2hQHamhYpUrE2hZLwfKugN9WYDzh2mTtA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-6.9.0.tgz", + "integrity": "sha512-ppIbCF9WTF7Pg6zhAlUI1fa3kQFqv4ME9jhJrRMMHL3fkqKMSsR9RdP0auxPWd0/BvA98zS3KgaR7Zpq8CWgPQ==", "dev": true, "requires": { "@babel/runtime": "^7.16.0", @@ -4844,130 +4804,127 @@ } }, "@wordpress/jest-preset-default": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-9.1.0.tgz", - "integrity": "sha512-K8QwvAgpD8oW10ERejKyqxXCE43+QF3LmUlpDHBhRaMZsZGmcLAZBa1cOm7rcfeQ4jkg9uYv30Qp/NI30I3C5A==", + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-10.7.0.tgz", + "integrity": "sha512-rMf+HS75o06+teQTBkEH4R7RobaIwG4HoVvLnfuSan0EnkyqcXadQ1tyFNKPT8rA6nB/wJn649dibE1+UMSUpw==", "dev": true, "requires": { - "@wojtekmaj/enzyme-adapter-react-17": "^0.6.1", - "@wordpress/jest-console": "^6.1.0", - "babel-jest": "^27.4.5", - "enzyme": "^3.11.0", - "enzyme-to-json": "^3.4.4" + "@wordpress/jest-console": "^6.9.0", + "babel-jest": "^27.4.5" } }, "@wordpress/keyboard-shortcuts": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-3.15.3.tgz", - "integrity": "sha512-dZ0VkwXk5BWf2J01dW+UruXiDimd8j1eR+BcApz8O9q1DVEnwdv66c9aw3RAcbeCm1vRQra6STYOPZOyYz6gLw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-4.3.0.tgz", + "integrity": "sha512-8CCqWF43uW06xHXLG8FquassPKdOUw0NJC1GOOghMb7xgqe0SXeltfXHr7saTciVyyFCy6WYO4GYxbLWglTcOQ==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/data": "^7.1.3", - "@wordpress/element": "^4.15.1", - "@wordpress/keycodes": "^3.17.1", + "@wordpress/data": "^8.3.0", + "@wordpress/element": "^5.3.0", + "@wordpress/keycodes": "^3.26.0", "rememo": "^4.0.0" } }, "@wordpress/keycodes": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-3.17.1.tgz", - "integrity": "sha512-9N/AYmqt5WWVouYAFaw8cbmxmOOTJSph/lW+8/t3PABOzbNLE5B/cXACIhrvvwMhzt3TS371/NxF8sTPWKRJqw==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-3.26.0.tgz", + "integrity": "sha512-W0ljzR6dl6ugp94xN+QlzKe4l3WrzWW6TeiQN/1XAVUmQTsBhNTsudK0u8sDXwXvT79HLuSg2zIJsHwI2z1r/w==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^4.17.1", + "@wordpress/i18n": "^4.26.0", "change-case": "^4.1.2", "lodash": "^4.17.21" } }, "@wordpress/list-reusable-blocks": { - "version": "3.15.7", - "resolved": "https://registry.npmjs.org/@wordpress/list-reusable-blocks/-/list-reusable-blocks-3.15.7.tgz", - "integrity": "sha512-YxNGwMVyVL9tdzPVTlkvyPym2uwsCKZzDZyw8efOAkHcA07+b4KctTSsWYHH53czkJegHaAt6zX2VPbrRAHeCg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/list-reusable-blocks/-/list-reusable-blocks-4.3.0.tgz", + "integrity": "sha512-uGOExFW3llOPrud0IJcFRNnzdXZyg+kpEb/vq0xdb0TONcLxx5hfYVgxQqeFFnSkpuM1/CMIq+3YHV5ksDhIJw==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^6.14.1", - "@wordpress/components": "^21.0.7", - "@wordpress/compose": "^5.15.2", - "@wordpress/element": "^4.15.1", - "@wordpress/i18n": "^4.17.1", - "lodash": "^4.17.21" + "@wordpress/api-fetch": "^6.23.0", + "@wordpress/components": "^23.3.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/element": "^5.3.0", + "@wordpress/i18n": "^4.26.0", + "change-case": "^4.1.2" } }, "@wordpress/media-utils": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@wordpress/media-utils/-/media-utils-4.8.1.tgz", - "integrity": "sha512-jdXASGLQoKCDBCoz8yksXcXrDnRTLD/ADKsylK+oIuz4iw/UBwh+WDAiAtUYVfE4CF4IOY0JC5E/c/7ybwD0JA==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@wordpress/media-utils/-/media-utils-4.17.0.tgz", + "integrity": "sha512-N3stwXuvAGtmDcZWM6zzFa77L1rk5N8idUAaCbU74/TYRVpVl9OhjWY/KdEK7XWIE8zTy5bmEY7y733PcmbmPg==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^6.14.1", - "@wordpress/blob": "^3.17.1", - "@wordpress/element": "^4.15.1", - "@wordpress/i18n": "^4.17.1" + "@wordpress/api-fetch": "^6.23.0", + "@wordpress/blob": "^3.26.0", + "@wordpress/element": "^5.3.0", + "@wordpress/i18n": "^4.26.0" } }, "@wordpress/notices": { - "version": "3.17.3", - "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-3.17.3.tgz", - "integrity": "sha512-W3LS+F4XFwHUXR9TqctpW+zJYDRrpCLbVai2NI+HneAkFZEOb+khMzJcGJmCiZJGh5EhY5jfgUgWL3AcAbrtGA==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-3.26.0.tgz", + "integrity": "sha512-wf5VLyCp5YJGlSJ9tXRf6Xly0oTwthtO6PNUBbfwV4cPhM670CG/HCExhDDr+Llmnlrffd1Aih3St8PYjXsATQ==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^3.17.1", - "@wordpress/data": "^7.1.3" + "@wordpress/a11y": "^3.26.0", + "@wordpress/data": "^8.3.0" } }, "@wordpress/npm-package-json-lint-config": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-4.5.0.tgz", - "integrity": "sha512-UdPtZmvBKI6ygsLsGMxDJjt9H2S2M//rHSSHPMpy5nmLGft890c0+cQwoIPhJpGis3pC5r1Bh8zCrzVZqoBHVQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-4.11.0.tgz", + "integrity": "sha512-xqc/RH/djM3qNB0OEip8Jj81AsKKf4fQGoKkE6XVeTcpBwbNRyswj5uBHCmgBbN/OjEoXBxDokchg8P1IGHLpQ==", "dev": true }, "@wordpress/nux": { - "version": "5.15.7", - "resolved": "https://registry.npmjs.org/@wordpress/nux/-/nux-5.15.7.tgz", - "integrity": "sha512-8slrY+EfeR/qvVtV3X43tyk9sXi+RtCUQNNn6EQRNWFAgi2TLQZR9QOI0fNbqUHW7By39Jf3tGPZZLzBLeHbaw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@wordpress/nux/-/nux-6.0.0.tgz", + "integrity": "sha512-9zv7SpCnsoSWw3Gh7Am4TqlSRrA38MSZG8kkPa1RqfuTeonMS3ptIGFMu9I/gA4//+cNxYRW6NeWosZlhlDVlQ==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/components": "^21.0.7", - "@wordpress/compose": "^5.15.2", - "@wordpress/data": "^7.1.3", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/element": "^4.15.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", + "@wordpress/components": "^23.0.0", + "@wordpress/compose": "^6.0.0", + "@wordpress/data": "^8.0.0", + "@wordpress/deprecated": "^3.23.0", + "@wordpress/element": "^5.0.0", + "@wordpress/i18n": "^4.23.0", + "@wordpress/icons": "^9.14.0", "rememo": "^4.0.0" } }, "@wordpress/plugins": { - "version": "4.15.2", - "resolved": "https://registry.npmjs.org/@wordpress/plugins/-/plugins-4.15.2.tgz", - "integrity": "sha512-OUtfStK+WeV14wYByJQCtVnO7Vvcf3Cym45mavCLLk47nHo/bpvoUR+S77QN6t6CZUYdNMNP+5LIi/eKFxUUqg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/plugins/-/plugins-5.3.0.tgz", + "integrity": "sha512-BZIMDcWBIZJzFxPjxsWA2WmYT3GLj4m7lSotNEkcnvQxOjpH34kSky035M5Bz/ChL+GdDiVIuUmno4e5tlCudw==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/compose": "^5.15.2", - "@wordpress/element": "^4.15.1", - "@wordpress/hooks": "^3.17.1", - "@wordpress/icons": "^9.8.1", + "@wordpress/compose": "^6.3.0", + "@wordpress/element": "^5.3.0", + "@wordpress/hooks": "^3.26.0", + "@wordpress/icons": "^9.17.0", "memize": "^1.1.0" } }, "@wordpress/postcss-plugins-preset": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-4.4.0.tgz", - "integrity": "sha512-KAy+HqPbl/yHGsvWgzfRPonQM7hJ1Zy6ABuwFAk/gqTy2v28InBhyZLSVJAjxMgh0Cxfyfgn+XYIHwlzMTvTXg==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-4.10.0.tgz", + "integrity": "sha512-hurPICllpkAPlXbRkye7vsj4W+4LdhJhNoloSzgE9c7gWXmrlBFqk71G+6JrODmj2M9SIxBfth7Myn7VUfr2kQ==", "dev": true, "requires": { - "@wordpress/base-styles": "^4.11.0", + "@wordpress/base-styles": "^4.17.0", "autoprefixer": "^10.2.5" }, "dependencies": { "autoprefixer": { - "version": "10.4.12", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", - "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", "dev": true, "requires": { "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001407", + "caniuse-lite": "^1.0.30001426", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -4975,17 +4932,23 @@ } }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" } }, + "caniuse-lite": { + "version": "1.0.30001450", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", + "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", + "dev": true + }, "electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", @@ -4993,9 +4956,9 @@ "dev": true }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", + "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==", "dev": true }, "postcss-value-parser": { @@ -5007,57 +4970,57 @@ } }, "@wordpress/preferences": { - "version": "2.9.7", - "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-2.9.7.tgz", - "integrity": "sha512-DEcX6IjYbFO7/DU2LjNYM7Q51EOX0pKWrFkyqQhEht8dIxUrSiVSkNk/5Y1Pum/j5Dhjq85f4wKOPcrI/PNLog==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-3.3.0.tgz", + "integrity": "sha512-+Y6Xv6AvqW9ipbG+05Yg9BDh4Kd8Q8PiUZwRnBJ0ZdM8ZI61o6cF7XNcBCb8A2ciEK8UgljvnypYSSWkeKA42g==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^3.17.1", - "@wordpress/components": "^21.0.7", - "@wordpress/data": "^7.1.3", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", + "@wordpress/a11y": "^3.26.0", + "@wordpress/components": "^23.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/icons": "^9.17.0", "classnames": "^2.3.1" } }, "@wordpress/preferences-persistence": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@wordpress/preferences-persistence/-/preferences-persistence-1.9.1.tgz", - "integrity": "sha512-zOwT+9cOCeHt2Qa7I1yQBfV5duj1dC93BCmuuYDMGHkAqCZdy1IJaX64ZRIoEfl7cq/rtMM/UFWeXg4KIARluw==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@wordpress/preferences-persistence/-/preferences-persistence-1.18.0.tgz", + "integrity": "sha512-DskPA5yIGa6zJZvOE2scoZixf1Dz+oNUXXOfs51PTH/a0t1xt7hMvEWyql5H2TDeMeK/N2ckvid6m0oTsIO9+w==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^6.14.1" + "@wordpress/api-fetch": "^6.23.0" } }, "@wordpress/prettier-config": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-2.3.0.tgz", - "integrity": "sha512-eqeiUvwogvtVTFZ+H0ZRY2EZNBXiyw3XbqGbi4Om15yAaMrnlm8NfUow2yHepYKkW/wWVr1tqBFQN7gZBPtYCQ==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-2.9.0.tgz", + "integrity": "sha512-Y6Huuwr0XzVAREsALqQ+Il2SI5da0uTiysNd6Rq4hFPvjolsiFKCZYdniow6VpTXm5iVMGdKQIOoC3awSyTAXA==", "dev": true }, "@wordpress/primitives": { - "version": "3.15.1", - "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.15.1.tgz", - "integrity": "sha512-vt4SzpLv9u/LaOXV1j5x1KIbiOdCNB2C9ChbeyMsay89EhJ/qPVfahOwToOiVFyGPKn/uWAg05pwpsHoy8UVIQ==", + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.24.0.tgz", + "integrity": "sha512-VX5iS6VKdMRC+mkd5EOjeq3wfWITPRnTWzTHGH9ozYWHNukE9+yOkeLlmTpW1yTy/IZxSFDGg+vAMDe85lf9oA==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/element": "^4.15.1", + "@wordpress/element": "^5.3.0", "classnames": "^2.3.1" } }, "@wordpress/priority-queue": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-2.17.2.tgz", - "integrity": "sha512-MiaTOc5f74Zhrbdjs6qsxWt+ganrN1rcGQoVTfr0zDn28KBOOcF240p2P8QtpQB+h8dMbhkybJgXjoH7+5v5gg==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-2.26.0.tgz", + "integrity": "sha512-05/HC5hya6qKKxiydA7F/Gac97J5GzRCYU7tvCMtFKR0mY6ZQzxagq5i4az5W3mGTuB2X6PTXR5HhQ1c4fxnTQ==", "requires": { "@babel/runtime": "^7.16.0", "requestidlecallback": "^0.3.0" } }, "@wordpress/redux-routine": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-4.17.1.tgz", - "integrity": "sha512-wcDOtxncxZp7KzQ83Qf22bhEuS8TKgdGrKli18QXg+ekQAgWUzptUCuhBdGa70XXtDFBJ/ul+th/kR0O939O9Q==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-4.26.0.tgz", + "integrity": "sha512-CzkyU8+SD7ZrMcQGYyfVfuAJzK69td6YMx9yOYrHh/Ow2mImls2FdcNmQNGMBEAc8qXd9Ub+FyUMAui8IbFI4g==", "requires": { "@babel/runtime": "^7.16.0", "is-plain-object": "^5.0.0", @@ -5073,59 +5036,58 @@ } }, "@wordpress/reusable-blocks": { - "version": "3.15.10", - "resolved": "https://registry.npmjs.org/@wordpress/reusable-blocks/-/reusable-blocks-3.15.10.tgz", - "integrity": "sha512-biMo8OBPre9dLQMFZAbJmutyb7QXtYjjiUxy664gNS3uykUEOo0l90tMxbQHIi79hgZsP5towFqdvTYaZ4I2LA==", - "requires": { - "@wordpress/block-editor": "^10.0.10", - "@wordpress/blocks": "^11.16.4", - "@wordpress/components": "^21.0.7", - "@wordpress/core-data": "^5.0.4", - "@wordpress/data": "^7.1.3", - "@wordpress/element": "^4.15.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", - "@wordpress/notices": "^3.17.3", - "@wordpress/url": "^3.18.1" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/reusable-blocks/-/reusable-blocks-4.3.0.tgz", + "integrity": "sha512-eSbk9tgwsyStn/R8CX6ppFizCyM3sevdRcYa0qJIPn1f+iBuvSG52iMbEX9J6LxFwTMJcZctMEmy+gHhLBUGGw==", + "requires": { + "@wordpress/block-editor": "^11.3.0", + "@wordpress/blocks": "^12.3.0", + "@wordpress/components": "^23.3.0", + "@wordpress/core-data": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/element": "^5.3.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/icons": "^9.17.0", + "@wordpress/notices": "^3.26.0", + "@wordpress/url": "^3.27.0" } }, "@wordpress/rich-text": { - "version": "5.15.3", - "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-5.15.3.tgz", - "integrity": "sha512-ZXXmluAPzUSPOEpK86Yovx+mp3io8U/wBVBM+zJ7pU2bg0Gr2ziag48F24yHVZ+X+eQIJnjAyDX8ybjL5391ug==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-6.3.0.tgz", + "integrity": "sha512-lS/EVrke8AZEqvv+pWbZTEQaR+tAXUALO0vZfxpvv4XUopMa2bFVO6+ECwJ4gEy7iD7wRH1o5evvF0oPlsgHlg==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^3.17.1", - "@wordpress/compose": "^5.15.2", - "@wordpress/data": "^7.1.3", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/element": "^4.15.1", - "@wordpress/escape-html": "^2.17.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/keycodes": "^3.17.1", - "lodash": "^4.17.21", + "@wordpress/a11y": "^3.26.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/deprecated": "^3.26.0", + "@wordpress/element": "^5.3.0", + "@wordpress/escape-html": "^2.26.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/keycodes": "^3.26.0", "memize": "^1.1.0", "rememo": "^4.0.0" } }, "@wordpress/scripts": { - "version": "24.1.2", - "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-24.1.2.tgz", - "integrity": "sha512-+rKzwGerbZIYT1h155oRiR9RRKYFs56tQyKrQGdVhIyLO/r2OLavsbTZHeuMUviic073KJMuTGhiwUSuYzdpUg==", + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-25.3.0.tgz", + "integrity": "sha512-D6T+qI4UZRqfSxZK50ijxLFXMZm64INdkB8PZNfwN6lW5Tf/FWoA1sWxHWL7V5E6k08u5luSceibcNHeHIfRzA==", "dev": true, "requires": { "@babel/core": "^7.16.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.2", "@svgr/webpack": "^6.2.1", - "@wordpress/babel-preset-default": "^7.1.1", - "@wordpress/browserslist-config": "^5.0.1", - "@wordpress/dependency-extraction-webpack-plugin": "^4.0.2", - "@wordpress/eslint-plugin": "^13.1.1", - "@wordpress/jest-preset-default": "^9.0.1", - "@wordpress/npm-package-json-lint-config": "^4.2.1", - "@wordpress/postcss-plugins-preset": "^4.1.1", - "@wordpress/prettier-config": "^2.0.1", - "@wordpress/stylelint-config": "^21.0.1", + "@wordpress/babel-preset-default": "^7.10.0", + "@wordpress/browserslist-config": "^5.9.0", + "@wordpress/dependency-extraction-webpack-plugin": "^4.9.0", + "@wordpress/eslint-plugin": "^13.10.0", + "@wordpress/jest-preset-default": "^10.7.0", + "@wordpress/npm-package-json-lint-config": "^4.11.0", + "@wordpress/postcss-plugins-preset": "^4.10.0", + "@wordpress/prettier-config": "^2.9.0", + "@wordpress/stylelint-config": "^21.9.0", "adm-zip": "^0.5.9", "babel-jest": "^27.4.5", "babel-loader": "^8.2.3", @@ -5172,9 +5134,9 @@ }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -5208,17 +5170,23 @@ "dev": true }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" } }, + "caniuse-lite": { + "version": "1.0.30001450", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", + "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", + "dev": true + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -5300,36 +5268,36 @@ "dev": true }, "cssnano": { - "version": "5.1.13", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.13.tgz", - "integrity": "sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==", + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.14.tgz", + "integrity": "sha512-Oou7ihiTocbKqi0J1bB+TRJIQX5RMR3JghA8hcWSw9mjBLQ5Y3RWqEDoYG3sRNlAbCIXpqMoZGbq5KDR3vdzgw==", "dev": true, "requires": { - "cssnano-preset-default": "^5.2.12", + "cssnano-preset-default": "^5.2.13", "lilconfig": "^2.0.3", "yaml": "^1.10.2" } }, "cssnano-preset-default": { - "version": "5.2.12", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz", - "integrity": "sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==", + "version": "5.2.13", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.13.tgz", + "integrity": "sha512-PX7sQ4Pb+UtOWuz8A1d+Rbi+WimBIxJTRyBdgGp1J75VU0r/HFQeLnMYgHiCAp6AR4rqrc7Y4R+1Rjk3KJz6DQ==", "dev": true, "requires": { - "css-declaration-sorter": "^6.3.0", + "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.0", - "postcss-convert-values": "^5.1.2", + "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.6", - "postcss-merge-rules": "^5.1.2", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.3", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.3", + "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", @@ -5337,11 +5305,11 @@ "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.0", + "postcss-reduce-initial": "^5.1.1", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" @@ -5462,9 +5430,9 @@ "dev": true }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", + "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==", "dev": true }, "nth-check": { @@ -5492,9 +5460,9 @@ "dev": true }, "postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", "dev": true, "requires": { "nanoid": "^3.3.4", @@ -5525,12 +5493,12 @@ } }, "postcss-convert-values": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz", - "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dev": true, "requires": { - "browserslist": "^4.20.3", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -5559,22 +5527,22 @@ "dev": true }, "postcss-merge-longhand": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz", - "integrity": "sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.0" + "stylehacks": "^5.1.1" } }, "postcss-merge-rules": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz", - "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.3.tgz", + "integrity": "sha512-LbLd7uFC00vpOuMvyZop8+vvhnfRGpp2S+IMQKeuOZZapPRY4SMq5ErjQeHbHsjCUgJkRNrlU+LmxsKIqPKQlA==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" @@ -5601,12 +5569,12 @@ } }, "postcss-minify-params": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz", - "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" } @@ -5672,12 +5640,12 @@ } }, "postcss-normalize-unicode": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz", - "integrity": "sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" } }, @@ -5711,12 +5679,12 @@ } }, "postcss-reduce-initial": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz", - "integrity": "sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.1.tgz", + "integrity": "sha512-//jeDqWcHPuXGZLoolFrUXBDyuEGbr9S2rMo19bkTIjBQ4PqkaO+oI8wua5BOUxpfi97i3PCoInsiFIEBfkm9w==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" } }, @@ -5730,9 +5698,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -5817,12 +5785,12 @@ } }, "stylehacks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.0.tgz", - "integrity": "sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "dev": true, "requires": { - "browserslist": "^4.16.6", + "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" } }, @@ -5859,45 +5827,45 @@ } }, "@wordpress/server-side-render": { - "version": "3.15.7", - "resolved": "https://registry.npmjs.org/@wordpress/server-side-render/-/server-side-render-3.15.7.tgz", - "integrity": "sha512-oeSg1tK+0f3sc9gOzAQzHX1y7akbv1OVPJvJx7RrBy4N4iCXVGJUIqv6XancMshIj+5lQKFobItfYhETGY2GuA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/server-side-render/-/server-side-render-4.3.0.tgz", + "integrity": "sha512-YsFSQio6zHRPi4AOEa6HFNjwy5T8ijsiR+COAdlrKjf7k4WtD1jNi7x7mVX/YY+hfIaEPZ8nCVtRQFHIQXWdng==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^6.14.1", - "@wordpress/blocks": "^11.16.4", - "@wordpress/components": "^21.0.7", - "@wordpress/compose": "^5.15.2", - "@wordpress/data": "^7.1.3", - "@wordpress/deprecated": "^3.17.1", - "@wordpress/element": "^4.15.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/url": "^3.18.1", - "lodash": "^4.17.21" + "@wordpress/api-fetch": "^6.23.0", + "@wordpress/blocks": "^12.3.0", + "@wordpress/components": "^23.3.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/deprecated": "^3.26.0", + "@wordpress/element": "^5.3.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/url": "^3.27.0", + "fast-deep-equal": "^3.1.3" } }, "@wordpress/shortcode": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-3.17.1.tgz", - "integrity": "sha512-DLM35NtGcAOCltpOf5Uz7s7NRgwOkVwWPLUWDvUS1iFL2S9R3EOc7c7yYZr18yV6C2qB+QAuq+NKvESw6aoTsQ==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-3.26.0.tgz", + "integrity": "sha512-8V7v6d1hqZCkdB0qVxhSqwUYYI0RSP3M7EDqGqiWs/Hu53VIMHGOf/nT9KTRRhx+1iAC4ohpUUtFWaop3dhE3Q==", "requires": { "@babel/runtime": "^7.16.0", "memize": "^1.1.0" } }, "@wordpress/style-engine": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@wordpress/style-engine/-/style-engine-1.0.3.tgz", - "integrity": "sha512-///EPfjHCv5PDQ6cu6H/XtLK4vi3mZ9lWojVU2wAluS2NrrOHpmL8kkBLwcuJHuJpKjgCkRMrtQwW8uqCrXAsw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@wordpress/style-engine/-/style-engine-1.9.0.tgz", + "integrity": "sha512-U/dGGZsQ613n7Rq18o3DvJau8AYvAHCa2qghOd0FBCDzO+kKkUMsIxUuCRCJktmRG/dpoLPAi7gbFqsqfxeGSg==", "requires": { "@babel/runtime": "^7.16.0", "lodash": "^4.17.21" } }, "@wordpress/stylelint-config": { - "version": "21.3.0", - "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-21.3.0.tgz", - "integrity": "sha512-bjb7jMafEiPdZ5deq1QdGnxvOLDiRcHqCMDPG6kRflb9TYQ1H1yDBC5r4nUm60wTN/xy/du80zCdNuDe2N2Nrg==", + "version": "21.9.0", + "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-21.9.0.tgz", + "integrity": "sha512-o5TMSX4ww3glf8A6byHnfwodMVB95dH0KoQ4nm5T9KMtsBYNd87HdM9WkVGVsFGb7oZlpL1ydREmlhsQh8sKYw==", "dev": true, "requires": { "stylelint-config-recommended": "^6.0.0", @@ -5905,63 +5873,61 @@ } }, "@wordpress/token-list": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-2.17.1.tgz", - "integrity": "sha512-7Xe2ecMZmULP/uZILUXcC+LzIdcmsEb24pU8QzegvgyMzTjs4h+DOJkQBtNP8Hyau+/9CNNG8jTGP+AT/cyRIA==", + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-2.26.0.tgz", + "integrity": "sha512-QRKvswtbMk+QN7oxbCzrrFQ7IpM/Rsi8QjdSdpORIwYbWMO00UPfBm2qDKSwIw9YK3Ucmq164YFm2Xeg0AO+oQ==", "requires": { "@babel/runtime": "^7.16.0" } }, "@wordpress/url": { - "version": "3.18.1", - "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-3.18.1.tgz", - "integrity": "sha512-kzfoVfDQsFuswvnnYOjsYG3J9VNFH7Nx8Q+/evvsO7N+QN02v2vpHHg582VjAbHJa7VfHrIw+GjLsr8YL6sa2A==", + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-3.27.0.tgz", + "integrity": "sha512-iHFpDeI+m6SUpmy/zVnRIdIYCQIkfUPevJ9WupnUB34eopeT4ugpbYRUhopNIZShM9HXjaSeViFbRMIqA3PwDg==", "requires": { "@babel/runtime": "^7.16.0", "remove-accents": "^0.4.2" } }, "@wordpress/viewport": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/@wordpress/viewport/-/viewport-4.15.3.tgz", - "integrity": "sha512-7+V5kiuZ7SmkT7RcGgxZEigN4HIEvQ7lnPYPonGrwurOaXL7NPGCIrYiS5QLgFwqm/uao9RGXhTE3fyZKEDV1A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/viewport/-/viewport-5.3.0.tgz", + "integrity": "sha512-4zhib0jimNF38rBIgSaNz5zcbkCbjrtXQXC2GvN4QmuhLMA4JzKi7jt/6aJ4Cy1NJXqUUQe42tL0bfi1iguIAw==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/compose": "^5.15.2", - "@wordpress/data": "^7.1.3", - "lodash": "^4.17.21" + "@wordpress/compose": "^6.3.0", + "@wordpress/data": "^8.3.0" } }, "@wordpress/warning": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-2.17.1.tgz", - "integrity": "sha512-Ursa3UgwUoatO5XNkPw3a+JM5t/7r0x+fMAYCC4IlBjnC4iWK4H3pPqC0NwkScUOtRKI9K6FBuEB86rlCid4yw==" + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-2.26.0.tgz", + "integrity": "sha512-nGupksgetlQAzF2E0rAHH17v+uKDarBGto9UduUIsiivYqJdJ/x2f3HopxPrGRDqEjOkPXoywQb9haNMU2zVmg==" }, "@wordpress/widgets": { - "version": "2.15.10", - "resolved": "https://registry.npmjs.org/@wordpress/widgets/-/widgets-2.15.10.tgz", - "integrity": "sha512-2RSFIBje0D2sbPBmIjzCS9j5lHWWetvcZmozRCXIMrZqB713vdqxZxLwXWUvKt43Sgu9pWYioQ+Zs/FIt6MUhA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@wordpress/widgets/-/widgets-3.3.0.tgz", + "integrity": "sha512-frnLnCzyQ7GyAQgqoOapt11YnHS4K0YMdW9VwwEJOTjcTb93pPUClenF24CIqUwv+1ahww197nDiUXnegrq5Bw==", "requires": { "@babel/runtime": "^7.16.0", - "@wordpress/api-fetch": "^6.14.1", - "@wordpress/block-editor": "^10.0.10", - "@wordpress/blocks": "^11.16.4", - "@wordpress/components": "^21.0.7", - "@wordpress/compose": "^5.15.2", - "@wordpress/core-data": "^5.0.4", - "@wordpress/data": "^7.1.3", - "@wordpress/element": "^4.15.1", - "@wordpress/i18n": "^4.17.1", - "@wordpress/icons": "^9.8.1", - "@wordpress/notices": "^3.17.3", - "classnames": "^2.3.1", - "lodash": "^4.17.21" + "@wordpress/api-fetch": "^6.23.0", + "@wordpress/block-editor": "^11.3.0", + "@wordpress/blocks": "^12.3.0", + "@wordpress/components": "^23.3.0", + "@wordpress/compose": "^6.3.0", + "@wordpress/core-data": "^6.3.0", + "@wordpress/data": "^8.3.0", + "@wordpress/element": "^5.3.0", + "@wordpress/i18n": "^4.26.0", + "@wordpress/icons": "^9.17.0", + "@wordpress/notices": "^3.26.0", + "classnames": "^2.3.1" } }, "@wordpress/wordcount": { - "version": "3.17.1", - "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-3.17.1.tgz", - "integrity": "sha512-gbXwOWkaqb2trkmAgqMpPLqDwP4BVVvjlLFC05+zTSM0EiLEEZDvbxhHFOxeQd98May2KO26iRr/xDbqXa2QxQ==", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-3.26.0.tgz", + "integrity": "sha512-s1+yc0bv0Qral9n8e/QInchiKpS9TrAUKxDtXXOm6xFeVtaUhovJNXzuzRmb5ndzWOGK0zKX53ywkdGPhr0yEA==", "requires": { "@babel/runtime": "^7.16.0" } @@ -6060,9 +6026,9 @@ "dev": true }, "adm-zip": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.9.tgz", - "integrity": "sha512-s+3fXLkeeLjZ2kLjCBwQufpI5fuN+kIGBxu6530nVQZGVol0d7Y/M88/xw9HGGUcJjKf8LutN3VPRUBq6N7Ajg==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", + "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", "dev": true }, "agent-base": { @@ -6223,13 +6189,12 @@ } }, "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", "dev": true, "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" + "deep-equal": "^2.0.5" } }, "arr-diff": { @@ -6270,15 +6235,15 @@ "dev": true }, "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "is-string": "^1.0.7" }, "dependencies": { @@ -6303,41 +6268,50 @@ } }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" } }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -6374,9 +6348,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object.assign": { @@ -6392,25 +6366,25 @@ } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } } } @@ -6442,17 +6416,16 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "array.prototype.filter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.1.tgz", - "integrity": "sha512-Dk3Ty7N42Odk7PjU/Ci3zT4pLj20YvuVnneG/58ICM6bt4Ij5kZaJTVQ9TSaWaIECX2sFyz4KItkVZqHNnciqw==", + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" }, "dependencies": { "call-bind": { @@ -6465,42 +6438,61 @@ "get-intrinsic": "^1.0.2" } }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "dependencies": { "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -6539,9 +6531,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object.assign": { @@ -6554,77 +6546,41 @@ "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } + "es-abstract": "^1.20.4" } } } }, - "array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", "es-shim-unscopables": "^1.0.0" }, "dependencies": { @@ -6638,42 +6594,61 @@ "get-intrinsic": "^1.0.2" } }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "dependencies": { "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -6712,9 +6687,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object.assign": { @@ -6727,78 +6702,43 @@ "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } + "es-abstract": "^1.20.4" } } } }, - "array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" }, "dependencies": { "call-bind": { @@ -6811,49 +6751,66 @@ "get-intrinsic": "^1.0.2" } }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - } + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + } + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" } }, "has-symbols": { @@ -6885,9 +6842,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object.assign": { @@ -6900,64 +6857,28 @@ "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } + "es-abstract": "^1.20.4" } } } @@ -7056,6 +6977,12 @@ "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz", "integrity": "sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ==" }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -7069,16 +6996,19 @@ "dev": true }, "axe-core": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.0.tgz", - "integrity": "sha512-4+rr8eQ7+XXS5nZrKcMO/AikHL0hVqy+lHWAnE3xdHl+aguag8SOQ6eEqLexwLNWgXIMfunGuD3ON1/6Kyet0A==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", + "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==", "dev": true }, "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "requires": { + "deep-equal": "^2.0.5" + } }, "babel-jest": { "version": "27.5.1", @@ -7154,9 +7084,9 @@ } }, "babel-loader": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", - "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", "dev": true, "requires": { "find-cache-dir": "^3.3.1", @@ -7795,9 +7725,9 @@ "integrity": "sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg==" }, "bonjour-service": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", - "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", + "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", "dev": true, "requires": { "array-flatten": "^2.1.2", @@ -8275,153 +8205,6 @@ } } }, - "cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dev": true, - "requires": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "dependencies": { - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", - "dev": true - } - } - }, - "cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "dependencies": { - "css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", - "dev": true - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - } - } - }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -8496,9 +8279,9 @@ "dev": true }, "ci-info": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz", - "integrity": "sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", + "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", "dev": true }, "cjs-module-lexer": { @@ -8748,9 +8531,9 @@ "dev": true }, "comment-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.0.tgz", - "integrity": "sha512-hRpmWIKgzd81vn0ydoWoyPoALEOnF4wt8yKD35Ib1D6XC2siLiYaiqfGkYrunuKdsXGwpBpHU3+9r+RVw2NZfA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", + "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", "dev": true }, "common-path-prefix": { @@ -8819,9 +8602,9 @@ } }, "compute-scroll-into-view": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz", - "integrity": "sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==" + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" }, "computed-style": { "version": "0.1.4", @@ -8888,9 +8671,9 @@ } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true }, "continuable-cache": { @@ -9015,32 +8798,38 @@ } }, "core-js": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz", - "integrity": "sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw==", + "version": "3.27.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.27.2.tgz", + "integrity": "sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w==", "dev": true }, "core-js-compat": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", - "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", + "version": "3.27.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz", + "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==", "dev": true, "requires": { "browserslist": "^4.21.4" }, "dependencies": { "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" } }, + "caniuse-lite": { + "version": "1.0.30001450", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", + "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", + "dev": true + }, "electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", @@ -9048,9 +8837,9 @@ "dev": true }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", + "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==", "dev": true } } @@ -9072,9 +8861,9 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -9162,25 +8951,25 @@ "dev": true }, "css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", "dev": true, "requires": { "icss-utils": "^5.1.0", - "postcss": "^8.4.7", + "postcss": "^8.4.19", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.0", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" + "semver": "^7.3.8" }, "dependencies": { "postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", "dev": true, "requires": { "nanoid": "^3.3.4", @@ -9543,9 +9332,9 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, "requires": { "decamelize": "^1.1.0", @@ -9553,9 +9342,9 @@ } }, "decimal.js": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz", - "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, "decode-uri-component": { @@ -9757,6 +9546,107 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, + "deep-equal": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", + "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.2", + "get-intrinsic": "^1.1.3", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + } + } + }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -9779,9 +9669,9 @@ "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==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", + "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", "dev": true }, "default-gateway": { @@ -10037,12 +9927,6 @@ "path-type": "^4.0.0" } }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", - "dev": true - }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -10349,57 +10233,6 @@ "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "dev": true }, - "enzyme": { - "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.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.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.7.0", - "object-is": "^1.0.2", - "object.assign": "^4.1.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.2.1" - } - }, - "enzyme-shallow-equal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz", - "integrity": "sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q==", - "dev": true, - "requires": { - "has": "^1.0.3", - "object-is": "^1.1.2" - } - }, - "enzyme-to-json": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.6.2.tgz", - "integrity": "sha512-Ynm6Z6R6iwQ0g2g1YToz6DWhxVnt8Dy1ijR2zynRKxTyBGA8rCDXU3rs2Qc4OKvUvc2Qoe1bcFK6bnPs20TrTg==", - "dev": true, - "requires": { - "@types/cheerio": "^0.22.22", - "lodash": "^4.17.21", - "react-is": "^16.12.0" - } - }, "equivalent-key-map": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/equivalent-key-map/-/equivalent-key-map-0.2.2.tgz", @@ -10450,11 +10283,57 @@ "string.prototype.trimstart": "^1.0.1" } }, - "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.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } }, "es-module-lexer": { "version": "0.9.3", @@ -10462,6 +10341,36 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } + } + }, "es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -10491,8 +10400,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { "version": "1.0.5", @@ -10567,13 +10475,13 @@ } }, "eslint": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.26.0.tgz", - "integrity": "sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==", + "version": "8.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz", + "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -10592,7 +10500,7 @@ "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", + "globals": "^13.19.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", @@ -10747,9 +10655,9 @@ } }, "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -10866,19 +10774,20 @@ } }, "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", + "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", "dev": true }, "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "requires": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" }, "dependencies": { "debug": { @@ -10933,23 +10842,25 @@ } }, "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", "has": "^1.0.3", - "is-core-module": "^2.8.1", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", "tsconfig-paths": "^3.14.1" }, "dependencies": { @@ -10964,50 +10875,69 @@ } }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" + } + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "dependencies": { "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -11072,16 +11002,10 @@ "brace-expansion": "^1.1.7" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object.assign": { @@ -11094,29 +11018,17 @@ "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "resolve": { @@ -11130,76 +11042,57 @@ "supports-preserve-symlinks-flag": "^1.0.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 + }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } + "es-abstract": "^1.20.4" } } } }, "eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "version": "27.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz", + "integrity": "sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "^5.0.0" + "@typescript-eslint/utils": "^5.10.0" } }, "eslint-plugin-jsdoc": { - "version": "37.9.7", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-37.9.7.tgz", - "integrity": "sha512-8alON8yYcStY94o0HycU2zkLKQdcS+qhhOUNQpfONHHwvI99afbmfpYuPqf6PbLz5pLZldG3Te5I0RbAiTN42g==", + "version": "39.7.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.7.5.tgz", + "integrity": "sha512-6L90P0AnZcE4ra7nocolp9vTjgVr2wEZ7jPnEA/X30XAoQPk+wvnaq61n164Tf7Fg4QPpJtRSCPpApOsfWDdNA==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "~0.20.1", - "comment-parser": "1.3.0", - "debug": "^4.3.3", + "@es-joy/jsdoccomment": "~0.36.1", + "comment-parser": "1.3.1", + "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.4.0", - "regextras": "^0.8.0", - "semver": "^7.3.5", + "semver": "^7.3.8", "spdx-expression-parse": "^3.0.1" }, "dependencies": { @@ -11236,23 +11129,26 @@ } }, "eslint-plugin-jsx-a11y": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", - "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", "dev": true, "requires": { - "@babel/runtime": "^7.18.9", - "aria-query": "^4.2.2", - "array-includes": "^3.1.5", + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.3", - "axobject-query": "^2.2.0", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "has": "^1.0.3", - "jsx-ast-utils": "^3.3.2", - "language-tags": "^1.0.5", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", "semver": "^6.3.0" }, "dependencies": { @@ -11289,25 +11185,26 @@ } }, "eslint-plugin-react": { - "version": "7.31.10", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", - "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", "dev": true, "requires": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", + "resolve": "^2.0.0-next.4", "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" + "string.prototype.matchall": "^4.0.8" }, "dependencies": { "call-bind": { @@ -11320,42 +11217,61 @@ "get-intrinsic": "^1.0.2" } }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "dependencies": { "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -11418,9 +11334,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object.assign": { @@ -11433,29 +11349,17 @@ "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" } }, "resolve": { @@ -11476,49 +11380,25 @@ "dev": true }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } + "es-abstract": "^1.20.4" } } } @@ -11555,9 +11435,9 @@ "dev": true }, "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", "dev": true, "requires": { "acorn": "^8.8.0", @@ -11566,9 +11446,9 @@ }, "dependencies": { "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, "eslint-visitor-keys": { @@ -12108,15 +11988,14 @@ "dev": true }, "fast-average-color": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/fast-average-color/-/fast-average-color-4.3.0.tgz", - "integrity": "sha512-k8FXd6+JeXoItmdNqB3hMwFgArryjdYBLuzEM8fRY/oztd/051yhSHU6GUrMOfIQU9dDHyFDcIAkGrQKlYtpDA==" + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/fast-average-color/-/fast-average-color-9.3.0.tgz", + "integrity": "sha512-FlPROSqDMOnoBgkFhWMHJODPvpS0Od0WDpedcKq4U/t0JVapGAkblNwxOr75qT+ZNd0dQM4qlgqrtnXbCJ8cNg==" }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-diff": { "version": "1.2.0", @@ -12588,6 +12467,15 @@ "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -12650,17 +12538,14 @@ } }, "framer-motion": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-6.5.1.tgz", - "integrity": "sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==", + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-7.10.3.tgz", + "integrity": "sha512-k2ccYeZNSpPg//HTaqrU+4pRq9f9ZpaaN7rr0+Rx5zA4wZLbk547wtDzge2db1sB+1mnJ6r59P4xb+aEIi/W+w==", "requires": { "@emotion/is-prop-valid": "^0.8.2", - "@motionone/dom": "10.12.0", - "framesync": "6.0.1", + "@motionone/dom": "^10.15.3", "hey-listen": "^1.0.8", - "popmotion": "11.0.3", - "style-value-types": "5.0.0", - "tslib": "^2.1.0" + "tslib": "2.4.0" }, "dependencies": { "@emotion/is-prop-valid": { @@ -12677,17 +12562,14 @@ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", "optional": true + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" } } }, - "framesync": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.0.1.tgz", - "integrity": "sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==", - "requires": { - "tslib": "^2.1.0" - } - }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -12790,41 +12672,50 @@ } }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "dependencies": { "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -12863,9 +12754,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object.assign": { @@ -12893,14 +12784,14 @@ } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "dependencies": { "define-properties": { @@ -12916,14 +12807,14 @@ } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "dependencies": { "define-properties": { @@ -13035,9 +12926,9 @@ } }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -13178,6 +13069,15 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, "globalyzer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", @@ -13243,6 +13143,34 @@ "delegate": "^3.1.2" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } + } + }, "got": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", @@ -14298,9 +14226,9 @@ }, "dependencies": { "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -14316,6 +14244,12 @@ } } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, "has-symbol-support-x": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", @@ -14484,28 +14418,6 @@ "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", "dev": true }, - "html-element-map": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz", - "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==", - "dev": true, - "requires": { - "array.prototype.filter": "^1.0.0", - "call-bind": "^1.0.2" - }, - "dependencies": { - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - } - } - }, "html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -14533,63 +14445,6 @@ "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", "dev": true }, - "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - }, - "dependencies": { - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", - "dev": true - } - } - }, "http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", @@ -15132,20 +14987,20 @@ "dev": true }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", + "get-intrinsic": "^1.1.3", "has": "^1.0.3", "side-channel": "^1.0.4" }, "dependencies": { "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -15185,9 +15040,9 @@ "dev": true }, "irregular-plurals": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", - "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.4.0.tgz", + "integrity": "sha512-YXxECO/W6N9aMBVKMKKZ8TXESgq7EFrp3emCGGUcrYY1cgJIeZjoB75MTu8qi+NAKntS9NwPU8VdcQ3r6E6aWQ==", "dev": true }, "is-absolute": { @@ -15215,6 +15070,68 @@ "kind-of": "^3.0.2" } }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + } + } + }, + "is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -15396,6 +15313,12 @@ "dev": true, "optional": true }, + "is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true + }, "is-natural-number": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", @@ -15528,6 +15451,12 @@ "dev": true, "optional": true }, + "is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true + }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -15565,12 +15494,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==", - "dev": true - }, "is-svg": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-4.3.1.tgz", @@ -15590,6 +15513,31 @@ "has-symbols": "^1.0.1" } }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + } + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -15618,13 +15566,41 @@ "dev": true, "optional": true }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + } + } + }, + "is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "dependencies": { "call-bind": { @@ -15636,6 +15612,23 @@ "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true } } }, @@ -15697,9 +15690,9 @@ }, "dependencies": { "@babel/parser": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", - "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", "dev": true }, "semver": { @@ -16253,16 +16246,16 @@ } }, "jest-dev-server": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-6.1.1.tgz", - "integrity": "sha512-z5LnaGDvlIkdMv/rppSO4+rq+GyQKf1xI9oiBxf9/2EBeN2hxRaWiMvaLNDnHPZj2PAhBXsycrKslDDoZO2Xtw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-6.2.0.tgz", + "integrity": "sha512-ZWh8CuvxwjhYfvw4tGeftziqIvw/26R6AG3OTgNTQeXul8aZz48RQjDpnlDwnWX53jxJJl9fcigqIdSU5lYZuw==", "dev": true, "requires": { "chalk": "^4.1.2", "cwd": "^0.10.0", "find-process": "^1.4.7", "prompts": "^2.4.2", - "spawnd": "^6.0.2", + "spawnd": "^6.2.0", "tree-kill": "^1.2.2", "wait-on": "^6.0.1" }, @@ -16908,9 +16901,9 @@ } }, "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true }, "jest-regex-util": { @@ -17660,9 +17653,9 @@ } }, "js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", "dev": true }, "js-tokens": { @@ -17785,9 +17778,9 @@ } }, "jsdoc-type-pratt-parser": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-2.2.5.tgz", - "integrity": "sha512-2a6eRxSxp1BW040hFvaJxhsCMI9lT8QB8t14t+NY5tC5rckIR0U9cr2tjOeaFirmEOy6MHvmJnY7zTBHq431Lw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz", + "integrity": "sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw==", "dev": true }, "jsdom": { @@ -17836,12 +17829,6 @@ "mime-types": "^2.1.12" } }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "tr46": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", @@ -18134,15 +18121,15 @@ "dev": true }, "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true }, "known-css-properties": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.25.0.tgz", - "integrity": "sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", + "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", "dev": true }, "language-subtag-registry": { @@ -18427,30 +18414,12 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, - "lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true - }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -19014,9 +18983,9 @@ "dev": true }, "memfs": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", - "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", + "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", "dev": true, "requires": { "fs-monkey": "^1.0.3" @@ -19155,18 +19124,18 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", + "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", "dev": true, "requires": { "schema-utils": "^4.0.0" }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -19312,19 +19281,13 @@ "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" }, "moment-timezone": { - "version": "0.5.38", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.38.tgz", - "integrity": "sha512-nMIrzGah4+oYZPflDvLZUgoVUO4fvAqHstvG3xAUnMolWncuAiLDWNnJZj6EwJGMGfb1ZcuTFE6GI3hNOVWI/Q==", + "version": "0.5.40", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.40.tgz", + "integrity": "sha512-tWfmNkRYmBkPJz5mr9GVDn9vRlVZOTe6yqY92rFxiOdWXbjaR0+9LwQnZGGuNR63X456NqmEkbskte8tWL5ePg==", "requires": { "moment": ">= 2.9.0" } }, - "moo": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", - "dev": true - }, "mousetrap": { "version": "1.6.5", "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz", @@ -19397,17 +19360,11 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "nearley": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", - "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", - "dev": true, - "requires": { - "commander": "^2.19.0", - "moo": "^0.5.0", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6" - } + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true }, "negotiator": { "version": "0.6.3", @@ -20013,14 +19970,14 @@ } }, "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "dependencies": { "call-bind": { @@ -20033,42 +19990,61 @@ "get-intrinsic": "^1.0.2" } }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "dependencies": { "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -20107,9 +20083,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object.assign": { @@ -20122,77 +20098,41 @@ "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } + "es-abstract": "^1.20.4" } } } }, "object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "dependencies": { "call-bind": { @@ -20205,42 +20145,61 @@ "get-intrinsic": "^1.0.2" } }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "dependencies": { "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -20279,9 +20238,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object.assign": { @@ -20294,64 +20253,28 @@ "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } + "es-abstract": "^1.20.4" } } } @@ -20390,13 +20313,13 @@ } }, "object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", "dev": true, "requires": { "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" }, "dependencies": { "call-bind": { @@ -20420,41 +20343,50 @@ } }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" } }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -20491,9 +20423,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object.assign": { @@ -20509,25 +20441,25 @@ } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } } } @@ -20889,48 +20821,10 @@ "dev": true }, "parse5": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", - "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", - "dev": true, - "requires": { - "entities": "^4.4.0" - }, - "dependencies": { - "entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", - "dev": true - } - } - }, - "parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dev": true, - "requires": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - } - } + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true }, "parseurl": { "version": "1.3.3", @@ -21173,17 +21067,6 @@ } } }, - "popmotion": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.3.tgz", - "integrity": "sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==", - "requires": { - "framesync": "6.0.1", - "hey-listen": "^1.0.8", - "style-value-types": "5.0.0", - "tslib": "^2.1.0" - } - }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -21640,9 +21523,9 @@ "dev": true }, "postcss-scss": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.5.tgz", - "integrity": "sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz", + "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==", "dev": true }, "postcss-selector-parser": { @@ -21811,6 +21694,11 @@ } } }, + "proxy-compare": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.4.0.tgz", + "integrity": "sha512-FD8KmQUQD6Mfpd0hywCOzcon/dbkFP8XBd9F1ycbKtvVsfv6TsFUKJ2eC0Iz2y+KzlkdT1Z8SY6ZSgm07zOyqg==" + }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -21987,31 +21875,6 @@ } } }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", - "dev": true - }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "requires": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - } - }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -22062,12 +21925,11 @@ "integrity": "sha512-l+MBlKZffv/SicxDySKEEh42hR6m5bAHfNu3Tvxks2c4Ah+ldnWjfnVRwxo/nxF27SsUsxDS0raAzFuJNKABXA==" }, "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "react-autosize-textarea": { @@ -22086,19 +21948,18 @@ "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==" }, "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "requires": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "scheduler": "^0.23.0" } }, "react-easy-crop": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-4.6.2.tgz", - "integrity": "sha512-qTGU3TWPwdAdNJsbM0OLbDx+Vjes9vWOnm1AUBiVp4GOzZacBQbUzVE9jYprFoWRrJZSn3GEwnxk0YhLAvdiYQ==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-4.6.3.tgz", + "integrity": "sha512-xeP5Cq56xDK2QkGs6RIrVXQs7cDan9B16yUt/3XqFN7siSjLgXkDfKNri8eC8CFSd3AFs0NX6IpIeIPBf4PCBA==", "requires": { "normalize-wheel": "^1.0.1", "tslib": "2.0.1" @@ -22122,36 +21983,6 @@ "integrity": "sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ==", "dev": true }, - "react-shallow-renderer": { - "version": "16.15.0", - "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", - "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" - } - }, - "react-test-renderer": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz", - "integrity": "sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "react-is": "^17.0.2", - "react-shallow-renderer": "^16.13.1", - "scheduler": "^0.20.2" - }, - "dependencies": { - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - } - } - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -22321,9 +22152,9 @@ } }, "redux": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", - "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", "requires": { "@babel/runtime": "^7.9.2" } @@ -22349,9 +22180,9 @@ "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" @@ -22397,9 +22228,9 @@ "dev": true }, "regexpu-core": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", - "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", + "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", "dev": true, "requires": { "regenerate": "^1.4.2", @@ -22407,15 +22238,9 @@ "regjsgen": "^0.7.1", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" } }, - "regextras": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz", - "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==", - "dev": true - }, "regjsgen": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", @@ -22445,9 +22270,9 @@ "integrity": "sha512-NVfSP9NstE3QPNs/TnegQY0vnJnstKQSpcrsI2kBTB3dB2PkdfKdTa+abbjMIDqpc63fE5LfjLgfMst0ULMFxQ==" }, "remove-accents": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.3.tgz", - "integrity": "sha512-bwzzFccF6RgWWt+KrcEpCDMw9uCwz5GCdyo+r4p2hu6PhqtlEMOXEO0uPAw6XmVYAnODxHaqLanhUY1lqmsNFw==" + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.4.tgz", + "integrity": "sha512-EpFcOa/ISetVHEXqu+VwI96KZBmq+a8LJnGkaeFw45epGlxIZz5dhEEnNZMsQXgORu3qaMoLX4qJCzOik6ytAg==" }, "repeat-element": { "version": "1.1.3", @@ -22628,9 +22453,9 @@ "dev": true }, "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", "dev": true }, "responselike": { @@ -22709,16 +22534,6 @@ "glob": "^7.1.3" } }, - "rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==", - "dev": true, - "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, "rtlcss": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.6.2.tgz", @@ -22864,9 +22679,9 @@ } }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -23019,12 +22834,11 @@ } }, "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "schema-utils": { @@ -23735,13 +23549,13 @@ "dev": true }, "spawnd": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-6.0.2.tgz", - "integrity": "sha512-+YJtx0dvy2wt304MrHD//tASc84zinBUYU1jacPBzrjhZUd7RsDo25krxr4HUHAQzEQFuMAs4/p+yLYU5ciZ1w==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-6.2.0.tgz", + "integrity": "sha512-qX/I4lQy4KgVEcNle0kuc4FxFWHISzBhZW1YemPfwmrmQjyZmfTK/OhBKkhrD2ooAaFZEm1maEBLE6/6enwt+g==", "dev": true, "requires": { "exit": "^0.1.2", - "signal-exit": "^3.0.6", + "signal-exit": "^3.0.7", "tree-kill": "^1.2.2" }, "dependencies": { @@ -23928,9 +23742,9 @@ "dev": true }, "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" @@ -23977,6 +23791,15 @@ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "requires": { + "internal-slot": "^1.0.4" + } + }, "stream-from-promise": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-from-promise/-/stream-from-promise-1.0.0.tgz", @@ -24041,190 +23864,20 @@ } }, "string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", + "regexp.prototype.flags": "^1.4.3", "side-channel": "^1.0.4" }, - "dependencies": { - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - } - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } - } - }, - "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "dependencies": { - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } - } - } - } - }, - "string.prototype.trim": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz", - "integrity": "sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, "dependencies": { "call-bind": { "version": "1.0.2", @@ -24247,48 +23900,55 @@ } }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", "dev": true, "requires": { + "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", "object-inspect": "^1.12.2", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - } + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + } + }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" } }, "has-symbols": { @@ -24320,9 +23980,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, "object.assign": { @@ -24338,25 +23998,25 @@ } }, "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } }, "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "es-abstract": "^1.20.4" } } } @@ -24480,15 +24140,6 @@ "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", "dev": true }, - "style-value-types": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.0.0.tgz", - "integrity": "sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==", - "requires": { - "hey-listen": "^1.0.8", - "tslib": "^2.1.0" - } - }, "stylehacks": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", @@ -24514,15 +24165,15 @@ } }, "stylelint": { - "version": "14.14.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.14.0.tgz", - "integrity": "sha512-yUI+4xXfPHVnueYddSQ/e1GuEA/2wVhWQbGj16AmWLtQJtn28lVxfS4b0CsWyVRPgd3Auzi0NXOthIEUhtQmmA==", + "version": "14.16.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", + "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", "dev": true, "requires": { "@csstools/selector-specificity": "^2.0.2", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^7.0.1", + "cosmiconfig": "^7.1.0", "css-functions-list": "^3.1.0", "debug": "^4.3.4", "fast-glob": "^3.2.12", @@ -24532,21 +24183,21 @@ "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.2.0", - "ignore": "^5.2.0", + "ignore": "^5.2.1", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.25.0", + "known-css-properties": "^0.26.0", "mathml-tag-names": "^2.1.3", "meow": "^9.0.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.4.17", + "postcss": "^8.4.19", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.10", + "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", @@ -24554,7 +24205,7 @@ "style-search": "^0.1.0", "supports-hyperlinks": "^2.3.0", "svg-tags": "^1.0.0", - "table": "^6.8.0", + "table": "^6.8.1", "v8-compile-cache": "^2.3.0", "write-file-atomic": "^4.0.2" }, @@ -24667,6 +24318,12 @@ "lru-cache": "^6.0.0" } }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, "indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -24791,9 +24448,9 @@ "dev": true }, "postcss": { - "version": "8.4.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", - "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==", + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", "dev": true, "requires": { "nanoid": "^3.3.4", @@ -24802,9 +24459,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -24966,9 +24623,9 @@ }, "dependencies": { "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -25082,9 +24739,9 @@ "dev": true }, "table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, "requires": { "ajv": "^8.0.1", @@ -25095,9 +24752,9 @@ }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -25290,9 +24947,9 @@ "dev": true }, "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", "dev": true }, "through": { @@ -25501,9 +25158,9 @@ }, "dependencies": { "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -25600,6 +25257,29 @@ "mime-types": "~2.1.24" } }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + } + } + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -25699,9 +25379,9 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true }, "unicode-property-aliases-ecmascript": { @@ -25895,6 +25575,11 @@ "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==" }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -25968,6 +25653,15 @@ "spdx-expression-parse": "^3.0.0" } }, + "valtio": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/valtio/-/valtio-1.9.0.tgz", + "integrity": "sha512-mQLFsAlKbYascZygFQh6lXuDjU5WHLoeZ8He4HqMnWfasM96V6rDbeFkw1XeG54xycmDonr/Jb4xgviHtuySrA==", + "requires": { + "proxy-compare": "2.4.0", + "use-sync-external-store": "1.2.0" + } + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -26170,9 +25864,9 @@ } }, "webpack-bundle-analyzer": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", - "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.7.0.tgz", + "integrity": "sha512-j9b8ynpJS4K+zfO5GGwsAcQX4ZHpWV+yRiHDiL+bE0XHJ8NiPYLTNVQdlFYWxtpg9lfAQNlwJg16J9AJtFSXRg==", "dev": true, "requires": { "acorn": "^8.0.4", @@ -26323,9 +26017,9 @@ }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -26416,9 +26110,9 @@ }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -26470,9 +26164,9 @@ } }, "ws": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", - "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", "dev": true } } @@ -26613,11 +26307,49 @@ "is-symbol": "^1.0.3" } }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + } + } + }, "wicg-inert": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/wicg-inert/-/wicg-inert-3.1.2.tgz", diff --git a/package.json b/package.json index c459eca491322..7448b1c237ec3 100644 --- a/package.json +++ b/package.json @@ -25,10 +25,10 @@ ], "devDependencies": { "@pmmmwh/react-refresh-webpack-plugin": "0.5.5", - "@wordpress/babel-preset-default": "7.1.1", - "@wordpress/dependency-extraction-webpack-plugin": "4.0.2", - "@wordpress/e2e-test-utils": "8.1.1", - "@wordpress/scripts": "24.1.2", + "@wordpress/babel-preset-default": "7.10.0", + "@wordpress/dependency-extraction-webpack-plugin": "4.9.0", + "@wordpress/e2e-test-utils": "9.3.0", + "@wordpress/scripts": "25.3.0", "autoprefixer": "^9.8.8", "chalk": "5.1.0", "check-node-version": "4.2.1", @@ -76,62 +76,63 @@ "webpack-livereload-plugin": "3.0.2" }, "dependencies": { - "@wordpress/a11y": "3.17.1", - "@wordpress/annotations": "2.17.3", - "@wordpress/api-fetch": "6.14.1", - "@wordpress/autop": "3.17.1", - "@wordpress/blob": "3.17.1", - "@wordpress/block-directory": "3.15.12", - "@wordpress/block-editor": "10.0.10", - "@wordpress/block-library": "7.14.12", - "@wordpress/block-serialization-default-parser": "4.17.1", - "@wordpress/blocks": "11.16.4", - "@wordpress/components": "21.0.7", - "@wordpress/compose": "5.15.2", - "@wordpress/core-data": "5.0.4", - "@wordpress/customize-widgets": "3.14.12", - "@wordpress/data": "7.1.3", - "@wordpress/data-controls": "2.17.3", - "@wordpress/date": "4.17.1", - "@wordpress/deprecated": "3.17.1", - "@wordpress/dom": "3.17.2", - "@wordpress/dom-ready": "3.17.1", - "@wordpress/edit-post": "6.14.12", - "@wordpress/edit-site": "4.14.14", - "@wordpress/edit-widgets": "4.14.12", - "@wordpress/editor": "12.16.10", - "@wordpress/element": "4.15.1", - "@wordpress/escape-html": "2.17.1", - "@wordpress/format-library": "3.15.10", - "@wordpress/hooks": "3.17.1", - "@wordpress/html-entities": "3.17.1", - "@wordpress/i18n": "4.17.1", - "@wordpress/icons": "9.8.1", - "@wordpress/interface": "4.16.7", - "@wordpress/is-shallow-equal": "4.17.1", - "@wordpress/keyboard-shortcuts": "3.15.3", - "@wordpress/keycodes": "3.17.1", - "@wordpress/list-reusable-blocks": "3.15.7", - "@wordpress/media-utils": "4.8.1", - "@wordpress/notices": "3.17.3", - "@wordpress/nux": "5.15.7", - "@wordpress/plugins": "4.15.2", - "@wordpress/preferences": "2.9.7", - "@wordpress/preferences-persistence": "1.9.1", - "@wordpress/primitives": "3.15.1", - "@wordpress/priority-queue": "2.17.2", - "@wordpress/redux-routine": "4.17.1", - "@wordpress/reusable-blocks": "3.15.10", - "@wordpress/rich-text": "5.15.3", - "@wordpress/server-side-render": "3.15.7", - "@wordpress/shortcode": "3.17.1", - "@wordpress/style-engine": "1.0.3", - "@wordpress/token-list": "2.17.1", - "@wordpress/url": "3.18.1", - "@wordpress/viewport": "4.15.3", - "@wordpress/warning": "2.17.1", - "@wordpress/widgets": "2.15.10", - "@wordpress/wordcount": "3.17.1", + "@wordpress/a11y": "3.26.0", + "@wordpress/annotations": "2.26.0", + "@wordpress/api-fetch": "6.23.0", + "@wordpress/autop": "3.26.0", + "@wordpress/blob": "3.26.0", + "@wordpress/block-directory": "4.3.0", + "@wordpress/block-editor": "11.3.0", + "@wordpress/block-library": "8.3.0", + "@wordpress/block-serialization-default-parser": "4.26.0", + "@wordpress/blocks": "12.3.0", + "@wordpress/components": "23.3.0", + "@wordpress/compose": "6.3.0", + "@wordpress/core-data": "6.3.0", + "@wordpress/customize-widgets": "4.3.0", + "@wordpress/data": "8.3.0", + "@wordpress/data-controls": "2.26.0", + "@wordpress/date": "4.26.0", + "@wordpress/deprecated": "3.26.0", + "@wordpress/dom": "3.26.0", + "@wordpress/dom-ready": "3.26.0", + "@wordpress/edit-post": "7.3.0", + "@wordpress/edit-site": "5.3.0", + "@wordpress/edit-widgets": "5.3.0", + "@wordpress/editor": "13.3.0", + "@wordpress/element": "5.3.0", + "@wordpress/escape-html": "2.26.0", + "@wordpress/experiments": "0.8.0", + "@wordpress/format-library": "4.3.0", + "@wordpress/hooks": "3.26.0", + "@wordpress/html-entities": "3.26.0", + "@wordpress/i18n": "4.26.0", + "@wordpress/icons": "9.17.0", + "@wordpress/interface": "5.3.0", + "@wordpress/is-shallow-equal": "4.26.0", + "@wordpress/keyboard-shortcuts": "4.3.0", + "@wordpress/keycodes": "3.26.0", + "@wordpress/list-reusable-blocks": "4.3.0", + "@wordpress/media-utils": "4.17.0", + "@wordpress/notices": "3.26.0", + "@wordpress/nux": "6.0.0", + "@wordpress/plugins": "5.3.0", + "@wordpress/preferences": "3.3.0", + "@wordpress/preferences-persistence": "1.18.0", + "@wordpress/primitives": "3.24.0", + "@wordpress/priority-queue": "2.26.0", + "@wordpress/redux-routine": "4.26.0", + "@wordpress/reusable-blocks": "4.3.0", + "@wordpress/rich-text": "6.3.0", + "@wordpress/server-side-render": "4.3.0", + "@wordpress/shortcode": "3.26.0", + "@wordpress/style-engine": "1.9.0", + "@wordpress/token-list": "2.26.0", + "@wordpress/url": "3.27.0", + "@wordpress/viewport": "5.3.0", + "@wordpress/warning": "2.26.0", + "@wordpress/widgets": "3.3.0", + "@wordpress/wordcount": "3.26.0", "backbone": "1.4.1", "clipboard": "2.0.11", "core-js-url-browser": "3.6.4", @@ -149,8 +150,8 @@ "moment": "2.29.4", "objectFitPolyfill": "2.3.5", "polyfill-library": "4.4.0", - "react": "17.0.2", - "react-dom": "17.0.2", + "react": "18.2.0", + "react-dom": "18.2.0", "regenerator-runtime": "0.13.9", "twemoji": "14.0.2", "underscore": "1.13.6", diff --git a/src/wp-includes/assets/script-loader-packages.min.php b/src/wp-includes/assets/script-loader-packages.min.php index d66e0fd1d34bb..2316e62e3754a 100644 --- a/src/wp-includes/assets/script-loader-packages.min.php +++ b/src/wp-includes/assets/script-loader-packages.min.php @@ -1 +1 @@ - array('dependencies' => array('wp-dom-ready', 'wp-i18n', 'wp-polyfill'), 'version' => 'ecce20f002eda4c19664'), 'annotations.min.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-rich-text'), 'version' => '1720fc5d5c76f53a1740'), 'api-fetch.min.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => 'bc0029ca2c943aec5311'), 'autop.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '43197d709df445ccf849'), 'blob.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'a078f260190acf405764'), 'block-directory.min.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-edit-post', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => '000a47d4ebe2ceac3593'), 'block-editor.min.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-shortcode', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => '0c7c9b9a74ceb717d6eb'), 'block-library.min.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-reusable-blocks', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport'), 'version' => '8adfaccd027d4d509d5e'), 'block-serialization-default-parser.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'eb2cdc8cd7a7975d49d9'), 'blocks.min.js' => array('dependencies' => array('lodash', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-shortcode'), 'version' => '69022aed79bfd45b3b1d'), 'components.min.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-warning'), 'version' => '4b876f1ff2e5c93b8fb1'), 'compose.min.js' => array('dependencies' => array('lodash', 'react', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-priority-queue'), 'version' => '37228270687b2a94e518'), 'core-data.min.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blocks', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-url'), 'version' => 'd8d458b31912f858bcdf'), 'customize-widgets.min.js' => array('dependencies' => array('lodash', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-widgets'), 'version' => '1fddf6d27e5c3aeddd54'), 'data.min.js' => array('dependencies' => array('lodash', 'react', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-priority-queue', 'wp-redux-routine'), 'version' => 'd8cf5b24f99c64ae47d6'), 'data-controls.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated', 'wp-polyfill'), 'version' => 'e10d473d392daa8501e8'), 'date.min.js' => array('dependencies' => array('moment', 'wp-deprecated', 'wp-polyfill'), 'version' => 'ce7daf24092d87ff18be'), 'deprecated.min.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '6c963cb9494ba26b77eb'), 'dom.min.js' => array('dependencies' => array('wp-deprecated', 'wp-polyfill'), 'version' => '133a042fbbef48f38107'), 'dom-ready.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '392bdd43726760d1f3ca'), 'edit-post.min.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-url', 'wp-viewport', 'wp-warning'), 'version' => '2baffbeec6cbe5171dee'), 'edit-site.min.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-reusable-blocks', 'wp-style-engine', 'wp-url', 'wp-viewport'), 'version' => '3ab3e2570a5c4c270c72'), 'edit-widgets.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-reusable-blocks', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => 'f920c6385e705b28f823'), 'editor.min.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-reusable-blocks', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => 'c9102d37531f38da0681'), 'element.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html', 'wp-polyfill'), 'version' => '47162ff4492c7ec4956b'), 'escape-html.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '03e27a7b6ae14f7afaa6'), 'format-library.min.js' => array('dependencies' => array('wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-url'), 'version' => '57876a359eac66da202b'), 'hooks.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '4169d3cf8e8d95a3d6d5'), 'html-entities.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '36a4a255da7dd2e1bf8e'), 'i18n.min.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '9e794f35a71bb98672ae'), 'is-shallow-equal.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '20c2b06ecf04afb14fee'), 'keyboard-shortcuts.min.js' => array('dependencies' => array('wp-data', 'wp-element', 'wp-keycodes', 'wp-polyfill'), 'version' => 'b696c16720133edfc065'), 'keycodes.min.js' => array('dependencies' => array('lodash', 'wp-i18n', 'wp-polyfill'), 'version' => '6e0aadc0106bd8aadc89'), 'list-reusable-blocks.min.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => 'f97bc9cc3a1cd21b8c8e'), 'media-utils.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => '17f6455b0630582352a4'), 'notices.min.js' => array('dependencies' => array('wp-data', 'wp-polyfill'), 'version' => '9c1575b7a31659f45a45'), 'nux.min.js' => array('dependencies' => array('wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => '038c48e26a91639ae8ab'), 'plugins.min.js' => array('dependencies' => array('wp-compose', 'wp-element', 'wp-hooks', 'wp-polyfill', 'wp-primitives'), 'version' => '0d1b90278bae7df6ecf9'), 'preferences.min.js' => array('dependencies' => array('wp-a11y', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => '5e6c91c252c0e040f379'), 'preferences-persistence.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-polyfill'), 'version' => 'c5543628aa7ff5bd5be4'), 'primitives.min.js' => array('dependencies' => array('wp-element', 'wp-polyfill'), 'version' => 'ae0bece54c0487c976b1'), 'priority-queue.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '99e325da95c5a35c7dc2'), 'redux-routine.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'c9ea6c0df793258797e6'), 'reusable-blocks.min.js' => array('dependencies' => array('wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => '3fb4b31e589a583a362e'), 'rich-text.min.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes', 'wp-polyfill'), 'version' => 'c704284bebe26cf1dd51'), 'server-side-render.min.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => 'ba8027ee85d65ae23ec7'), 'shortcode.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '7539044b04e6bca57f2e'), 'style-engine.min.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '10341d6e6decffab850e'), 'token-list.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'f2cf0bb3ae80de227e43'), 'url.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'bb0ef862199bcae73aa7'), 'viewport.min.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-data', 'wp-element', 'wp-polyfill'), 'version' => 'a9868d184d07e4c94fe4'), 'warning.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '4acee5fc2fd9a24cefc2'), 'widgets.min.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => 'ec7c547bc8a579c6061e'), 'wordcount.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'feb9569307aec24292f2')); + array('dependencies' => array('wp-dom-ready', 'wp-i18n', 'wp-polyfill'), 'version' => 'ecce20f002eda4c19664'), 'annotations.min.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-rich-text'), 'version' => '1720fc5d5c76f53a1740'), 'api-fetch.min.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => 'bc0029ca2c943aec5311'), 'autop.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '43197d709df445ccf849'), 'blob.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'e7b4ea96175a89b263e2'), 'block-directory.min.js' => array('dependencies' => array('wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => '9c45b8d28fc867ceed45'), 'block-editor.min.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-a11y', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-experiments', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-shortcode', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => '03ae878385e0d4aa4931'), 'block-library.min.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-experiments', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-reusable-blocks', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport'), 'version' => '1e5e1e18192e56765ef3'), 'block-serialization-default-parser.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '30ffd7e7e199f10b2a6d'), 'blocks.min.js' => array('dependencies' => array('lodash', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-shortcode'), 'version' => '639e14271099dc3d85bf'), 'components.min.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-warning'), 'version' => '459960afd883bbb31505'), 'compose.min.js' => array('dependencies' => array('react', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-priority-queue'), 'version' => '0d0320f45a7c34b53f34'), 'core-data.min.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blocks', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-url'), 'version' => 'fc0de6bb17aa25caf698'), 'customize-widgets.min.js' => array('dependencies' => array('wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-experiments', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-widgets'), 'version' => '2e9918bbd2bb965a1c5b'), 'data.min.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-experiments', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-priority-queue', 'wp-redux-routine'), 'version' => '44ce08e2e8d1d36191c0'), 'data-controls.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated', 'wp-polyfill'), 'version' => 'e10d473d392daa8501e8'), 'date.min.js' => array('dependencies' => array('moment', 'wp-deprecated', 'wp-polyfill'), 'version' => 'f8550b1212d715fbf745'), 'deprecated.min.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '6c963cb9494ba26b77eb'), 'dom.min.js' => array('dependencies' => array('wp-deprecated', 'wp-polyfill'), 'version' => 'e03c89e1dd68aee1cb3a'), 'dom-ready.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '392bdd43726760d1f3ca'), 'edit-post.min.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-experiments', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-url', 'wp-viewport', 'wp-warning', 'wp-widgets'), 'version' => 'e768cb09e794bfc3f817'), 'edit-site.min.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-experiments', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-reusable-blocks', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '02d640124ef54bf6b05a'), 'edit-widgets.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-experiments', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-reusable-blocks', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '171584eed72658ba7e62'), 'editor.min.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-experiments', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-reusable-blocks', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => 'e40dc59ec48f54636dd6'), 'element.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html', 'wp-polyfill'), 'version' => '846e425acb550abbc270'), 'escape-html.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '03e27a7b6ae14f7afaa6'), 'experiments.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '7a09a31152667ba2d915'), 'format-library.min.js' => array('dependencies' => array('wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-url'), 'version' => 'cd4a10ec005e2f001978'), 'hooks.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '4169d3cf8e8d95a3d6d5'), 'html-entities.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '36a4a255da7dd2e1bf8e'), 'i18n.min.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '9e794f35a71bb98672ae'), 'is-shallow-equal.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '20c2b06ecf04afb14fee'), 'keyboard-shortcuts.min.js' => array('dependencies' => array('wp-data', 'wp-element', 'wp-keycodes', 'wp-polyfill'), 'version' => 'b696c16720133edfc065'), 'keycodes.min.js' => array('dependencies' => array('lodash', 'wp-i18n', 'wp-polyfill'), 'version' => 'b755dcd6aeedb0b754e0'), 'list-reusable-blocks.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => 'cd5fa2e68a534174e31f'), 'media-utils.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => 'f837b6298c83612cd6f6'), 'notices.min.js' => array('dependencies' => array('wp-data', 'wp-polyfill'), 'version' => '9c1575b7a31659f45a45'), 'nux.min.js' => array('dependencies' => array('wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => '038c48e26a91639ae8ab'), 'plugins.min.js' => array('dependencies' => array('wp-compose', 'wp-element', 'wp-hooks', 'wp-polyfill', 'wp-primitives'), 'version' => '0d1b90278bae7df6ecf9'), 'preferences.min.js' => array('dependencies' => array('wp-a11y', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => 'c66e137a7e588dab54c3'), 'preferences-persistence.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-polyfill'), 'version' => 'c5543628aa7ff5bd5be4'), 'primitives.min.js' => array('dependencies' => array('wp-element', 'wp-polyfill'), 'version' => 'dfac1545e52734396640'), 'priority-queue.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '422e19e9d48b269c5219'), 'redux-routine.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'd86e7e9f062d7582f76b'), 'reusable-blocks.min.js' => array('dependencies' => array('wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => 'a7367a6154c724b51b31'), 'rich-text.min.js' => array('dependencies' => array('wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes', 'wp-polyfill'), 'version' => '29557b2dbbe17d0d4317'), 'server-side-render.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => 'd1bc93277666143a3f5e'), 'shortcode.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '7539044b04e6bca57f2e'), 'style-engine.min.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '528e6cf281ffc9b7bd3c'), 'token-list.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'f2cf0bb3ae80de227e43'), 'url.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '16185fce2fb043a0cfed'), 'viewport.min.js' => array('dependencies' => array('wp-compose', 'wp-data', 'wp-element', 'wp-polyfill'), 'version' => '4f6bd168b2b8b45c8a6b'), 'warning.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '4acee5fc2fd9a24cefc2'), 'widgets.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => '943ce7f84e164b9462c1'), 'wordcount.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'feb9569307aec24292f2')); diff --git a/src/wp-includes/block-editor.php b/src/wp-includes/block-editor.php index 4227c674c02ff..39debd983b90a 100644 --- a/src/wp-includes/block-editor.php +++ b/src/wp-includes/block-editor.php @@ -318,8 +318,6 @@ function _wp_get_iframed_editor_assets() { $script_handles = array(); $style_handles = array( - 'wp-block-editor', - 'wp-block-library', 'wp-edit-blocks', ); diff --git a/src/wp-includes/blocks/archives.php b/src/wp-includes/blocks/archives.php index afbf400fedba8..695affde760a8 100644 --- a/src/wp-includes/blocks/archives.php +++ b/src/wp-includes/blocks/archives.php @@ -17,11 +17,12 @@ function render_block_core_archives( $attributes ) { $show_post_count = ! empty( $attributes['showPostCounts'] ); $type = isset( $attributes['type'] ) ? $attributes['type'] : 'monthly'; - $class = ''; + + $class = 'wp-block-archives-list'; if ( ! empty( $attributes['displayAsDropdown'] ) ) { - $class .= ' wp-block-archives-dropdown'; + $class = 'wp-block-archives-dropdown'; $dropdown_id = wp_unique_id( 'wp-block-archives-' ); $title = __( 'Archives' ); @@ -40,9 +41,7 @@ function render_block_core_archives( $attributes ) { $archives = wp_get_archives( $dropdown_args ); - $classnames = esc_attr( $class ); - - $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classnames ) ); + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $class ) ); switch ( $dropdown_args['type'] ) { case 'yearly': @@ -75,8 +74,6 @@ function render_block_core_archives( $attributes ) { ); } - $class .= ' wp-block-archives-list'; - /** This filter is documented in wp-includes/widgets/class-wp-widget-archives.php */ $archives_args = apply_filters( 'widget_archives_args', diff --git a/src/wp-includes/blocks/archives/block.json b/src/wp-includes/blocks/archives/block.json index 3e589af452fa9..edc6895e14b06 100644 --- a/src/wp-includes/blocks/archives/block.json +++ b/src/wp-includes/blocks/archives/block.json @@ -26,6 +26,7 @@ }, "supports": { "align": true, + "anchor": true, "html": false, "spacing": { "margin": true, diff --git a/src/wp-includes/blocks/avatar.php b/src/wp-includes/blocks/avatar.php index f6e3f6a7eeaf2..25f3ad88dcbab 100644 --- a/src/wp-includes/blocks/avatar.php +++ b/src/wp-includes/blocks/avatar.php @@ -100,7 +100,7 @@ function render_block_core_avatar( $attributes, $content, $block ) { $label = 'aria-label="' . sprintf( esc_attr__( '(%s author archive, opens in a new tab)' ), $author_name ) . '"'; } // translators: %1$s: Author archive link. %2$s: Link target. %3$s Aria label. %4$s Avatar image. - $avatar_block = sprintf( '%4$s', get_author_posts_url( $author_id ), esc_attr( $attributes['linkTarget'] ), $label, $avatar_block ); + $avatar_block = sprintf( '%4$s', esc_url( get_author_posts_url( $author_id ) ), esc_attr( $attributes['linkTarget'] ), $label, $avatar_block ); } return sprintf( '
%2s
', $wrapper_attributes, $avatar_block ); } diff --git a/src/wp-includes/blocks/avatar/block.json b/src/wp-includes/blocks/avatar/block.json index bceef63ad6fb9..3fbb6dd9221ae 100644 --- a/src/wp-includes/blocks/avatar/block.json +++ b/src/wp-includes/blocks/avatar/block.json @@ -4,7 +4,7 @@ "name": "core/avatar", "title": "Avatar", "category": "theme", - "description": "Add a user's avatar.", + "description": "Add a user’s avatar.", "textdomain": "default", "attributes": { "userId": { @@ -25,6 +25,7 @@ }, "usesContext": [ "postType", "postId", "commentId" ], "supports": { + "anchor": true, "html": false, "align": true, "alignWide": false, diff --git a/src/wp-includes/blocks/block.php b/src/wp-includes/blocks/block.php index 2cfd672aa3ada..d51b35d68b23d 100644 --- a/src/wp-includes/blocks/block.php +++ b/src/wp-includes/blocks/block.php @@ -27,8 +27,7 @@ function render_block_core_block( $attributes ) { if ( isset( $seen_refs[ $attributes['ref'] ] ) ) { // WP_DEBUG_DISPLAY must only be honored when WP_DEBUG. This precedent // is set in `wp_debug_mode()`. - $is_debug = defined( 'WP_DEBUG' ) && WP_DEBUG && - defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG_DISPLAY; + $is_debug = WP_DEBUG && WP_DEBUG_DISPLAY; return $is_debug ? // translators: Visible only in the front end, this warning takes the place of a faulty block. diff --git a/src/wp-includes/blocks/block/block.json b/src/wp-includes/blocks/block/block.json index 8d850ef1c30ba..f472fd0f4760a 100644 --- a/src/wp-includes/blocks/block/block.json +++ b/src/wp-includes/blocks/block/block.json @@ -15,6 +15,5 @@ "customClassName": false, "html": false, "inserter": false - }, - "editorStyle": "wp-block-editor" + } } diff --git a/src/wp-includes/blocks/blocks-json.php b/src/wp-includes/blocks/blocks-json.php index 4f9b68e444f71..55cea3a5281d9 100644 --- a/src/wp-includes/blocks/blocks-json.php +++ b/src/wp-includes/blocks/blocks-json.php @@ -1 +1 @@ - array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/archives', 'title' => 'Archives', 'category' => 'widgets', 'description' => 'Display a date archive of your posts.', 'textdomain' => 'default', 'attributes' => array('displayAsDropdown' => array('type' => 'boolean', 'default' => false), 'showLabel' => array('type' => 'boolean', 'default' => true), 'showPostCounts' => array('type' => 'boolean', 'default' => false), 'type' => array('type' => 'string', 'default' => 'monthly')), 'supports' => array('align' => true, 'html' => false, 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-archives-editor'), 'audio' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/audio', 'title' => 'Audio', 'category' => 'media', 'description' => 'Embed a simple audio player.', 'keywords' => array('music', 'sound', 'podcast', 'recording'), 'textdomain' => 'default', 'attributes' => array('src' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'audio', 'attribute' => 'src', '__experimentalRole' => 'content'), 'caption' => array('type' => 'string', 'source' => 'html', 'selector' => 'figcaption', '__experimentalRole' => 'content'), 'id' => array('type' => 'number', '__experimentalRole' => 'content'), 'autoplay' => array('type' => 'boolean', 'source' => 'attribute', 'selector' => 'audio', 'attribute' => 'autoplay'), 'loop' => array('type' => 'boolean', 'source' => 'attribute', 'selector' => 'audio', 'attribute' => 'loop'), 'preload' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'audio', 'attribute' => 'preload')), 'supports' => array('anchor' => true, 'align' => true, 'spacing' => array('margin' => true, 'padding' => true)), 'editorStyle' => 'wp-block-audio-editor', 'style' => 'wp-block-audio'), 'avatar' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/avatar', 'title' => 'Avatar', 'category' => 'theme', 'description' => 'Add a user\'s avatar.', 'textdomain' => 'default', 'attributes' => array('userId' => array('type' => 'number'), 'size' => array('type' => 'number', 'default' => 96), 'isLink' => array('type' => 'boolean', 'default' => false), 'linkTarget' => array('type' => 'string', 'default' => '_self')), 'usesContext' => array('postType', 'postId', 'commentId'), 'supports' => array('html' => false, 'align' => true, 'alignWide' => false, 'spacing' => array('margin' => true, 'padding' => true), '__experimentalBorder' => array('__experimentalSkipSerialization' => true, 'radius' => true, 'width' => true, 'color' => true, 'style' => true, '__experimentalDefaultControls' => array('radius' => true)), 'color' => array('text' => false, 'background' => false, '__experimentalDuotone' => 'img')), 'editorStyle' => 'wp-block-avatar', 'style' => 'wp-block-avatar'), 'block' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/block', 'title' => 'Reusable block', 'category' => 'reusable', 'description' => 'Create and save content to reuse across your site. Update the block, and the changes apply everywhere it’s used.', 'textdomain' => 'default', 'attributes' => array('ref' => array('type' => 'number')), 'supports' => array('customClassName' => false, 'html' => false, 'inserter' => false), 'editorStyle' => 'wp-block-editor'), 'button' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/button', 'title' => 'Button', 'category' => 'design', 'parent' => array('core/buttons'), 'description' => 'Prompt visitors to take action with a button-style link.', 'keywords' => array('link'), 'textdomain' => 'default', 'attributes' => array('url' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'a', 'attribute' => 'href'), 'title' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'a', 'attribute' => 'title'), 'text' => array('type' => 'string', 'source' => 'html', 'selector' => 'a'), 'linkTarget' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'a', 'attribute' => 'target'), 'rel' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'a', 'attribute' => 'rel'), 'placeholder' => array('type' => 'string'), 'backgroundColor' => array('type' => 'string'), 'textColor' => array('type' => 'string'), 'gradient' => array('type' => 'string'), 'width' => array('type' => 'number')), 'supports' => array('anchor' => true, 'align' => true, 'alignWide' => false, 'color' => array('__experimentalSkipSerialization' => true, 'gradients' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), 'reusable' => false, 'spacing' => array('__experimentalSkipSerialization' => true, 'padding' => array('horizontal', 'vertical'), '__experimentalDefaultControls' => array('padding' => true)), '__experimentalBorder' => array('radius' => true, '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array('radius' => true)), '__experimentalSelector' => '.wp-block-button .wp-block-button__link'), 'styles' => array(array('name' => 'fill', 'label' => 'Fill', 'isDefault' => true), array('name' => 'outline', 'label' => 'Outline')), 'editorStyle' => 'wp-block-button-editor', 'style' => 'wp-block-button'), 'buttons' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/buttons', 'title' => 'Buttons', 'category' => 'design', 'description' => 'Prompt visitors to take action with a group of button-style links.', 'keywords' => array('link'), 'textdomain' => 'default', 'supports' => array('anchor' => true, 'align' => array('wide', 'full'), '__experimentalExposeControlsToChildren' => true, 'spacing' => array('blockGap' => true, 'margin' => array('top', 'bottom'), '__experimentalDefaultControls' => array('blockGap' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), '__experimentalLayout' => array('allowSwitching' => false, 'allowInheriting' => false, 'default' => array('type' => 'flex'))), 'editorStyle' => 'wp-block-buttons-editor', 'style' => 'wp-block-buttons'), 'calendar' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/calendar', 'title' => 'Calendar', 'category' => 'widgets', 'description' => 'A calendar of your site’s posts.', 'keywords' => array('posts', 'archive'), 'textdomain' => 'default', 'attributes' => array('month' => array('type' => 'integer'), 'year' => array('type' => 'integer')), 'supports' => array('align' => true, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'style' => 'wp-block-calendar'), 'categories' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/categories', 'title' => 'Categories List', 'category' => 'widgets', 'description' => 'Display a list of all categories.', 'textdomain' => 'default', 'attributes' => array('displayAsDropdown' => array('type' => 'boolean', 'default' => false), 'showHierarchy' => array('type' => 'boolean', 'default' => false), 'showPostCounts' => array('type' => 'boolean', 'default' => false), 'showOnlyTopLevel' => array('type' => 'boolean', 'default' => false), 'showEmpty' => array('type' => 'boolean', 'default' => false)), 'supports' => array('align' => true, 'html' => false, 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-categories-editor', 'style' => 'wp-block-categories'), 'code' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/code', 'title' => 'Code', 'category' => 'text', 'description' => 'Display code snippets that respect your spacing and tabs.', 'textdomain' => 'default', 'attributes' => array('content' => array('type' => 'string', 'source' => 'html', 'selector' => 'code')), 'supports' => array('anchor' => true, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), 'spacing' => array('margin' => array('top', 'bottom'), 'padding' => true), '__experimentalBorder' => array('radius' => true, 'color' => true, 'width' => true, 'style' => true, '__experimentalDefaultControls' => array('width' => true, 'color' => true)), 'color' => array('text' => true, 'background' => true, 'gradients' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true))), 'style' => 'wp-block-code'), 'column' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/column', 'title' => 'Column', 'category' => 'text', 'parent' => array('core/columns'), 'description' => 'A single column within a columns block.', 'textdomain' => 'default', 'attributes' => array('verticalAlignment' => array('type' => 'string'), 'width' => array('type' => 'string'), 'allowedBlocks' => array('type' => 'array'), 'templateLock' => array('type' => array('string', 'boolean'), 'enum' => array('all', 'insert', 'contentOnly', false))), 'supports' => array('anchor' => true, 'reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('blockGap' => true, 'padding' => true, '__experimentalDefaultControls' => array('padding' => true)), '__experimentalBorder' => array('color' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array('color' => true, 'style' => true, 'width' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), '__experimentalLayout' => true)), 'columns' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/columns', 'title' => 'Columns', 'category' => 'design', 'description' => 'Display content in multiple columns, with blocks added to each column.', 'textdomain' => 'default', 'attributes' => array('verticalAlignment' => array('type' => 'string'), 'isStackedOnMobile' => array('type' => 'boolean', 'default' => true)), 'supports' => array('anchor' => true, 'align' => array('wide', 'full'), 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('blockGap' => array('__experimentalDefault' => '2em', 'sides' => array('horizontal', 'vertical')), 'margin' => array('top', 'bottom'), 'padding' => true, '__experimentalDefaultControls' => array('padding' => true)), '__experimentalLayout' => array('allowSwitching' => false, 'allowInheriting' => false, 'allowEditing' => false, 'default' => array('type' => 'flex', 'flexWrap' => 'nowrap')), '__experimentalBorder' => array('color' => true, 'radius' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array('color' => true, 'radius' => true, 'style' => true, 'width' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-columns-editor', 'style' => 'wp-block-columns'), 'comment-author-name' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comment-author-name', 'title' => 'Comment Author Name', 'category' => 'theme', 'ancestor' => array('core/comment-template'), 'description' => 'Displays the name of the author of the comment.', 'textdomain' => 'default', 'attributes' => array('isLink' => array('type' => 'boolean', 'default' => true), 'linkTarget' => array('type' => 'string', 'default' => '_self'), 'textAlign' => array('type' => 'string')), 'usesContext' => array('commentId'), 'supports' => array('html' => false, 'spacing' => array('margin' => true, 'padding' => true), 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'comment-content' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comment-content', 'title' => 'Comment Content', 'category' => 'theme', 'ancestor' => array('core/comment-template'), 'description' => 'Displays the contents of a comment.', 'textdomain' => 'default', 'usesContext' => array('commentId'), 'attributes' => array('textAlign' => array('type' => 'string')), 'supports' => array('color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), 'spacing' => array('padding' => array('horizontal', 'vertical'), '__experimentalDefaultControls' => array('padding' => true)), 'html' => false)), 'comment-date' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comment-date', 'title' => 'Comment Date', 'category' => 'theme', 'ancestor' => array('core/comment-template'), 'description' => 'Displays the date on which the comment was posted.', 'textdomain' => 'default', 'attributes' => array('format' => array('type' => 'string'), 'isLink' => array('type' => 'boolean', 'default' => true)), 'usesContext' => array('commentId'), 'supports' => array('html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'comment-edit-link' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comment-edit-link', 'title' => 'Comment Edit Link', 'category' => 'theme', 'ancestor' => array('core/comment-template'), 'description' => 'Displays a link to edit the comment in the WordPress Dashboard. This link is only visible to users with the edit comment capability.', 'textdomain' => 'default', 'usesContext' => array('commentId'), 'attributes' => array('linkTarget' => array('type' => 'string', 'default' => '_self'), 'textAlign' => array('type' => 'string')), 'supports' => array('html' => false, 'color' => array('link' => true, 'gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'comment-reply-link' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comment-reply-link', 'title' => 'Comment Reply Link', 'category' => 'theme', 'ancestor' => array('core/comment-template'), 'description' => 'Displays a link to reply to a comment.', 'textdomain' => 'default', 'usesContext' => array('commentId'), 'attributes' => array('textAlign' => array('type' => 'string')), 'supports' => array('color' => array('gradients' => true, 'link' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), 'html' => false)), 'comment-template' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comment-template', 'title' => 'Comment Template', 'category' => 'design', 'parent' => array('core/comments'), 'description' => 'Contains the block elements used to display a comment, like the title, date, author, avatar and more.', 'textdomain' => 'default', 'usesContext' => array('postId'), 'supports' => array('reusable' => false, 'html' => false, 'align' => true, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'style' => 'wp-block-comment-template'), 'comments' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comments', 'title' => 'Comments', 'category' => 'theme', 'description' => 'An advanced block that allows displaying post comments using different visual configurations.', 'textdomain' => 'default', 'attributes' => array('tagName' => array('type' => 'string', 'default' => 'div'), 'legacy' => array('type' => 'boolean', 'default' => false)), 'supports' => array('align' => array('wide', 'full'), 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-comments-editor', 'usesContext' => array('postId', 'postType')), 'comments-pagination' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comments-pagination', 'title' => 'Comments Pagination', 'category' => 'theme', 'parent' => array('core/comments'), 'description' => 'Displays a paginated navigation to next/previous set of comments, when applicable.', 'textdomain' => 'default', 'attributes' => array('paginationArrow' => array('type' => 'string', 'default' => 'none')), 'providesContext' => array('comments/paginationArrow' => 'paginationArrow'), 'supports' => array('align' => true, 'reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), '__experimentalLayout' => array('allowSwitching' => false, 'allowInheriting' => false, 'default' => array('type' => 'flex')), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-comments-pagination-editor', 'style' => 'wp-block-comments-pagination'), 'comments-pagination-next' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comments-pagination-next', 'title' => 'Comments Next Page', 'category' => 'theme', 'parent' => array('core/comments-pagination'), 'description' => 'Displays the next comment\'s page link.', 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string')), 'usesContext' => array('postId', 'comments/paginationArrow'), 'supports' => array('reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'comments-pagination-numbers' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comments-pagination-numbers', 'title' => 'Comments Page Numbers', 'category' => 'theme', 'parent' => array('core/comments-pagination'), 'description' => 'Displays a list of page numbers for comments pagination.', 'textdomain' => 'default', 'usesContext' => array('postId'), 'supports' => array('reusable' => false, 'html' => false, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'comments-pagination-previous' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comments-pagination-previous', 'title' => 'Comments Previous Page', 'category' => 'theme', 'parent' => array('core/comments-pagination'), 'description' => 'Displays the previous comment\'s page link.', 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string')), 'usesContext' => array('postId', 'comments/paginationArrow'), 'supports' => array('reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'comments-title' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comments-title', 'title' => 'Comments Title', 'category' => 'theme', 'ancestor' => array('core/comments'), 'description' => 'Displays a title with the number of comments', 'textdomain' => 'default', 'usesContext' => array('postId', 'postType'), 'attributes' => array('textAlign' => array('type' => 'string'), 'showPostTitle' => array('type' => 'boolean', 'default' => true), 'showCommentsCount' => array('type' => 'boolean', 'default' => true), 'level' => array('type' => 'number', 'default' => 2)), 'supports' => array('anchor' => false, 'align' => true, 'html' => false, '__experimentalBorder' => array('radius' => true, 'color' => true, 'width' => true, 'style' => true), 'color' => array('gradients' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true, '__experimentalFontFamily' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true)))), 'cover' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/cover', 'title' => 'Cover', 'category' => 'media', 'description' => 'Add an image or video with a text overlay — great for headers.', 'textdomain' => 'default', 'attributes' => array('url' => array('type' => 'string'), 'useFeaturedImage' => array('type' => 'boolean', 'default' => false), 'id' => array('type' => 'number'), 'alt' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'alt', 'default' => ''), 'hasParallax' => array('type' => 'boolean', 'default' => false), 'isRepeated' => array('type' => 'boolean', 'default' => false), 'dimRatio' => array('type' => 'number', 'default' => 100), 'overlayColor' => array('type' => 'string'), 'customOverlayColor' => array('type' => 'string'), 'backgroundType' => array('type' => 'string', 'default' => 'image'), 'focalPoint' => array('type' => 'object'), 'minHeight' => array('type' => 'number'), 'minHeightUnit' => array('type' => 'string'), 'gradient' => array('type' => 'string'), 'customGradient' => array('type' => 'string'), 'contentPosition' => array('type' => 'string'), 'isDark' => array('type' => 'boolean', 'default' => true), 'allowedBlocks' => array('type' => 'array'), 'templateLock' => array('type' => array('string', 'boolean'), 'enum' => array('all', 'insert', 'contentOnly', false))), 'usesContext' => array('postId', 'postType'), 'supports' => array('anchor' => true, 'align' => true, 'html' => false, 'spacing' => array('padding' => true, 'margin' => array('top', 'bottom'), '__experimentalDefaultControls' => array('padding' => true)), 'color' => array('__experimentalDuotone' => '> .wp-block-cover__image-background, > .wp-block-cover__video-background', 'text' => false, 'background' => false), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-cover-editor', 'style' => 'wp-block-cover'), 'embed' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/embed', 'title' => 'Embed', 'category' => 'embed', 'description' => 'Add a block that displays content pulled from other sites, like Twitter or YouTube.', 'textdomain' => 'default', 'attributes' => array('url' => array('type' => 'string'), 'caption' => array('type' => 'string', 'source' => 'html', 'selector' => 'figcaption'), 'type' => array('type' => 'string'), 'providerNameSlug' => array('type' => 'string'), 'allowResponsive' => array('type' => 'boolean', 'default' => true), 'responsive' => array('type' => 'boolean', 'default' => false), 'previewable' => array('type' => 'boolean', 'default' => true)), 'supports' => array('align' => true), 'editorStyle' => 'wp-block-embed-editor', 'style' => 'wp-block-embed'), 'file' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/file', 'title' => 'File', 'category' => 'media', 'description' => 'Add a link to a downloadable file.', 'keywords' => array('document', 'pdf', 'download'), 'textdomain' => 'default', 'attributes' => array('id' => array('type' => 'number'), 'href' => array('type' => 'string'), 'fileId' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'a:not([download])', 'attribute' => 'id'), 'fileName' => array('type' => 'string', 'source' => 'html', 'selector' => 'a:not([download])'), 'textLinkHref' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'a:not([download])', 'attribute' => 'href'), 'textLinkTarget' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'a:not([download])', 'attribute' => 'target'), 'showDownloadButton' => array('type' => 'boolean', 'default' => true), 'downloadButtonText' => array('type' => 'string', 'source' => 'html', 'selector' => 'a[download]'), 'displayPreview' => array('type' => 'boolean'), 'previewHeight' => array('type' => 'number', 'default' => 600)), 'supports' => array('anchor' => true, 'align' => true), 'viewScript' => 'file:./view.min.js', 'editorStyle' => 'wp-block-file-editor', 'style' => 'wp-block-file'), 'freeform' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/freeform', 'title' => 'Classic', 'category' => 'text', 'description' => 'Use the classic WordPress editor.', 'textdomain' => 'default', 'attributes' => array('content' => array('type' => 'string', 'source' => 'html')), 'supports' => array('className' => false, 'customClassName' => false, 'reusable' => false), 'editorStyle' => 'wp-block-freeform-editor'), 'gallery' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/gallery', 'title' => 'Gallery', 'category' => 'media', 'description' => 'Display multiple images in a rich gallery.', 'keywords' => array('images', 'photos'), 'textdomain' => 'default', 'attributes' => array('images' => array('type' => 'array', 'default' => array(), 'source' => 'query', 'selector' => '.blocks-gallery-item', 'query' => array('url' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'src'), 'fullUrl' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'data-full-url'), 'link' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'data-link'), 'alt' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'alt', 'default' => ''), 'id' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'data-id'), 'caption' => array('type' => 'string', 'source' => 'html', 'selector' => '.blocks-gallery-item__caption'))), 'ids' => array('type' => 'array', 'items' => array('type' => 'number'), 'default' => array()), 'shortCodeTransforms' => array('type' => 'array', 'default' => array(), 'items' => array('type' => 'object')), 'columns' => array('type' => 'number', 'minimum' => 1, 'maximum' => 8), 'caption' => array('type' => 'string', 'source' => 'html', 'selector' => '.blocks-gallery-caption'), 'imageCrop' => array('type' => 'boolean', 'default' => true), 'fixedHeight' => array('type' => 'boolean', 'default' => true), 'linkTarget' => array('type' => 'string'), 'linkTo' => array('type' => 'string'), 'sizeSlug' => array('type' => 'string', 'default' => 'large'), 'allowResize' => array('type' => 'boolean', 'default' => false)), 'providesContext' => array('allowResize' => 'allowResize', 'imageCrop' => 'imageCrop', 'fixedHeight' => 'fixedHeight'), 'supports' => array('anchor' => true, 'align' => true, 'html' => false, 'units' => array('px', 'em', 'rem', 'vh', 'vw'), 'spacing' => array('margin' => true, 'padding' => true, 'blockGap' => array('horizontal', 'vertical'), '__experimentalSkipSerialization' => array('blockGap'), '__experimentalDefaultControls' => array('blockGap' => true)), 'color' => array('text' => false, 'background' => true, 'gradients' => true), '__experimentalLayout' => array('allowSwitching' => false, 'allowInheriting' => false, 'allowEditing' => false, 'default' => array('type' => 'flex'))), 'editorStyle' => 'wp-block-gallery-editor', 'style' => 'wp-block-gallery'), 'group' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/group', 'title' => 'Group', 'category' => 'design', 'description' => 'Gather blocks in a layout container.', 'keywords' => array('container', 'wrapper', 'row', 'section'), 'textdomain' => 'default', 'attributes' => array('tagName' => array('type' => 'string', 'default' => 'div'), 'templateLock' => array('type' => array('string', 'boolean'), 'enum' => array('all', 'insert', 'contentOnly', false))), 'supports' => array('__experimentalOnEnter' => true, '__experimentalSettings' => true, 'align' => array('wide', 'full'), 'anchor' => true, 'ariaLabel' => true, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => array('top', 'bottom'), 'padding' => true, 'blockGap' => true, '__experimentalDefaultControls' => array('padding' => true, 'blockGap' => true)), '__experimentalBorder' => array('color' => true, 'radius' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array('color' => true, 'radius' => true, 'style' => true, 'width' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), '__experimentalLayout' => true), 'editorStyle' => 'wp-block-group-editor', 'style' => 'wp-block-group'), 'heading' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/heading', 'title' => 'Heading', 'category' => 'text', 'description' => 'Introduce new sections and organize content to help visitors (and search engines) understand the structure of your content.', 'keywords' => array('title', 'subtitle'), 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string'), 'content' => array('type' => 'string', 'source' => 'html', 'selector' => 'h1,h2,h3,h4,h5,h6', 'default' => '', '__experimentalRole' => 'content'), 'level' => array('type' => 'number', 'default' => 2), 'placeholder' => array('type' => 'string')), 'supports' => array('align' => array('wide', 'full'), 'anchor' => true, 'className' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'fontAppearance' => true, 'textTransform' => true)), '__experimentalSelector' => 'h1,h2,h3,h4,h5,h6', '__unstablePasteTextInline' => true, '__experimentalSlashInserter' => true), 'editorStyle' => 'wp-block-heading-editor', 'style' => 'wp-block-heading'), 'home-link' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/home-link', 'category' => 'design', 'parent' => array('core/navigation'), 'title' => 'Home Link', 'description' => 'Create a link that always points to the homepage of the site. Usually not necessary if there is already a site title link present in the header.', 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string')), 'usesContext' => array('textColor', 'customTextColor', 'backgroundColor', 'customBackgroundColor', 'fontSize', 'customFontSize', 'style'), 'supports' => array('reusable' => false, 'html' => false, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-home-link-editor', 'style' => 'wp-block-home-link'), 'html' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/html', 'title' => 'Custom HTML', 'category' => 'widgets', 'description' => 'Add custom HTML code and preview it as you edit.', 'keywords' => array('embed'), 'textdomain' => 'default', 'attributes' => array('content' => array('type' => 'string', 'source' => 'html')), 'supports' => array('customClassName' => false, 'className' => false, 'html' => false), 'editorStyle' => 'wp-block-html-editor'), 'image' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/image', 'title' => 'Image', 'category' => 'media', 'usesContext' => array('allowResize', 'imageCrop', 'fixedHeight'), 'description' => 'Insert an image to make a visual statement.', 'keywords' => array('img', 'photo', 'picture'), 'textdomain' => 'default', 'attributes' => array('align' => array('type' => 'string'), 'url' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'src', '__experimentalRole' => 'content'), 'alt' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'alt', 'default' => '', '__experimentalRole' => 'content'), 'caption' => array('type' => 'string', 'source' => 'html', 'selector' => 'figcaption', '__experimentalRole' => 'content'), 'title' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'title', '__experimentalRole' => 'content'), 'href' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure > a', 'attribute' => 'href', '__experimentalRole' => 'content'), 'rel' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure > a', 'attribute' => 'rel'), 'linkClass' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure > a', 'attribute' => 'class'), 'id' => array('type' => 'number', '__experimentalRole' => 'content'), 'width' => array('type' => 'number'), 'height' => array('type' => 'number'), 'sizeSlug' => array('type' => 'string'), 'linkDestination' => array('type' => 'string'), 'linkTarget' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure > a', 'attribute' => 'target')), 'supports' => array('anchor' => true, 'color' => array('__experimentalDuotone' => 'img, .components-placeholder', 'text' => false, 'background' => false), '__experimentalBorder' => array('color' => true, 'radius' => true, 'width' => true, '__experimentalSelector' => 'img, .wp-block-image__crop-area', '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array('color' => true, 'radius' => true, 'width' => true))), 'styles' => array(array('name' => 'default', 'label' => 'Default', 'isDefault' => true), array('name' => 'rounded', 'label' => 'Rounded')), 'editorStyle' => 'wp-block-image-editor', 'style' => 'wp-block-image'), 'latest-comments' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/latest-comments', 'title' => 'Latest Comments', 'category' => 'widgets', 'description' => 'Display a list of your most recent comments.', 'keywords' => array('recent comments'), 'textdomain' => 'default', 'attributes' => array('commentsToShow' => array('type' => 'number', 'default' => 5, 'minimum' => 1, 'maximum' => 100), 'displayAvatar' => array('type' => 'boolean', 'default' => true), 'displayDate' => array('type' => 'boolean', 'default' => true), 'displayExcerpt' => array('type' => 'boolean', 'default' => true)), 'supports' => array('align' => true, 'html' => false), 'editorStyle' => 'wp-block-latest-comments-editor', 'style' => 'wp-block-latest-comments'), 'latest-posts' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/latest-posts', 'title' => 'Latest Posts', 'category' => 'widgets', 'description' => 'Display a list of your most recent posts.', 'keywords' => array('recent posts'), 'textdomain' => 'default', 'attributes' => array('categories' => array('type' => 'array', 'items' => array('type' => 'object')), 'selectedAuthor' => array('type' => 'number'), 'postsToShow' => array('type' => 'number', 'default' => 5), 'displayPostContent' => array('type' => 'boolean', 'default' => false), 'displayPostContentRadio' => array('type' => 'string', 'default' => 'excerpt'), 'excerptLength' => array('type' => 'number', 'default' => 55), 'displayAuthor' => array('type' => 'boolean', 'default' => false), '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), 'addLinkToFeaturedImage' => array('type' => 'boolean', 'default' => false)), 'supports' => array('align' => true, 'html' => false, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-latest-posts-editor', 'style' => 'wp-block-latest-posts'), 'legacy-widget' => array('apiVersion' => 2, 'name' => 'core/legacy-widget', 'title' => 'Legacy Widget', 'category' => 'widgets', 'description' => 'Display a legacy widget.', 'textdomain' => 'default', 'attributes' => array('id' => array('type' => 'string', 'default' => null), 'idBase' => array('type' => 'string', 'default' => null), 'instance' => array('type' => 'object', 'default' => null)), 'supports' => array('html' => false, 'customClassName' => false, 'reusable' => false), 'editorStyle' => 'wp-block-legacy-widget-editor'), 'list' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/list', 'title' => 'List', 'category' => 'text', 'description' => 'Create a bulleted or numbered list.', 'keywords' => array('bullet list', 'ordered list', 'numbered list'), 'textdomain' => 'default', 'attributes' => array('ordered' => array('type' => 'boolean', 'default' => false, '__experimentalRole' => 'content'), 'values' => array('type' => 'string', 'source' => 'html', 'selector' => 'ol,ul', 'multiline' => 'li', '__unstableMultilineWrapperTags' => array('ol', 'ul'), 'default' => '', '__experimentalRole' => 'content'), 'type' => array('type' => 'string'), 'start' => array('type' => 'number'), 'reversed' => array('type' => 'boolean'), 'placeholder' => array('type' => 'string')), 'supports' => array('anchor' => true, 'className' => false, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), '__unstablePasteTextInline' => true, '__experimentalSelector' => 'ol,ul', '__experimentalSlashInserter' => true), 'editorStyle' => 'wp-block-list-editor', 'style' => 'wp-block-list'), 'list-item' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/list-item', 'title' => 'List item', 'category' => 'text', 'parent' => array('core/list'), 'description' => 'Create a list item.', 'textdomain' => 'default', 'attributes' => array('placeholder' => array('type' => 'string'), 'content' => array('type' => 'string', 'source' => 'html', 'selector' => 'li', 'default' => '', '__experimentalRole' => 'content')), 'supports' => array('className' => false, '__experimentalSelector' => 'li')), 'loginout' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/loginout', 'title' => 'Login/out', 'category' => 'theme', 'description' => 'Show login & logout links.', 'keywords' => array('login', 'logout', 'form'), 'textdomain' => 'default', 'attributes' => array('displayLoginAsForm' => array('type' => 'boolean', 'default' => false), 'redirectToCurrent' => array('type' => 'boolean', 'default' => true)), 'supports' => array('className' => true, 'typography' => array('fontSize' => false))), 'media-text' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/media-text', 'title' => 'Media & Text', 'category' => 'media', 'description' => 'Set media and words side-by-side for a richer layout.', 'keywords' => array('image', 'video'), 'textdomain' => 'default', 'attributes' => array('align' => array('type' => 'string', 'default' => 'wide'), 'mediaAlt' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure img', 'attribute' => 'alt', 'default' => '', '__experimentalRole' => 'content'), 'mediaPosition' => array('type' => 'string', 'default' => 'left'), 'mediaId' => array('type' => 'number', '__experimentalRole' => 'content'), 'mediaUrl' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure video,figure img', 'attribute' => 'src', '__experimentalRole' => 'content'), 'mediaLink' => array('type' => 'string'), 'linkDestination' => array('type' => 'string'), 'linkTarget' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure a', 'attribute' => 'target'), 'href' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure a', 'attribute' => 'href', '__experimentalRole' => 'content'), 'rel' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure a', 'attribute' => 'rel'), 'linkClass' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure a', 'attribute' => 'class'), 'mediaType' => array('type' => 'string', '__experimentalRole' => 'content'), 'mediaWidth' => array('type' => 'number', 'default' => 50), 'mediaSizeSlug' => array('type' => 'string'), 'isStackedOnMobile' => array('type' => 'boolean', 'default' => true), 'verticalAlignment' => array('type' => 'string'), 'imageFill' => array('type' => 'boolean'), 'focalPoint' => array('type' => 'object')), 'supports' => array('anchor' => true, 'align' => array('wide', 'full'), 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-media-text-editor', 'style' => 'wp-block-media-text'), 'missing' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/missing', 'title' => 'Unsupported', 'category' => 'text', 'description' => 'Your site doesn’t include support for this block.', 'textdomain' => 'default', 'attributes' => array('originalName' => array('type' => 'string'), 'originalUndelimitedContent' => array('type' => 'string'), 'originalContent' => array('type' => 'string', 'source' => 'html')), 'supports' => array('className' => false, 'customClassName' => false, 'inserter' => false, 'html' => false, 'reusable' => false)), 'more' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/more', 'title' => 'More', 'category' => 'design', 'description' => 'Content before this block will be shown in the excerpt on your archives page.', 'keywords' => array('read more'), 'textdomain' => 'default', 'attributes' => array('customText' => array('type' => 'string'), 'noTeaser' => array('type' => 'boolean', 'default' => false)), 'supports' => array('customClassName' => false, 'className' => false, 'html' => false, 'multiple' => false), 'editorStyle' => 'wp-block-more-editor'), 'navigation' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/navigation', 'title' => 'Navigation', 'category' => 'theme', 'description' => 'A collection of blocks that allow visitors to get around your site.', 'keywords' => array('menu', 'navigation', 'links'), 'textdomain' => 'default', 'attributes' => array('ref' => array('type' => 'number'), 'textColor' => array('type' => 'string'), 'customTextColor' => array('type' => 'string'), 'rgbTextColor' => array('type' => 'string'), 'backgroundColor' => array('type' => 'string'), 'customBackgroundColor' => array('type' => 'string'), 'rgbBackgroundColor' => array('type' => 'string'), 'showSubmenuIcon' => array('type' => 'boolean', 'default' => true), 'openSubmenusOnClick' => array('type' => 'boolean', 'default' => false), 'overlayMenu' => array('type' => 'string', 'default' => 'mobile'), 'icon' => array('type' => 'string', 'default' => 'handle'), 'hasIcon' => array('type' => 'boolean', 'default' => true), '__unstableLocation' => array('type' => 'string'), 'overlayBackgroundColor' => array('type' => 'string'), 'customOverlayBackgroundColor' => array('type' => 'string'), 'overlayTextColor' => array('type' => 'string'), 'customOverlayTextColor' => array('type' => 'string'), 'maxNestingLevel' => array('type' => 'number', 'default' => 5)), 'providesContext' => array('textColor' => 'textColor', 'customTextColor' => 'customTextColor', 'backgroundColor' => 'backgroundColor', 'customBackgroundColor' => 'customBackgroundColor', 'overlayTextColor' => 'overlayTextColor', 'customOverlayTextColor' => 'customOverlayTextColor', 'overlayBackgroundColor' => 'overlayBackgroundColor', 'customOverlayBackgroundColor' => 'customOverlayBackgroundColor', 'fontSize' => 'fontSize', 'customFontSize' => 'customFontSize', 'showSubmenuIcon' => 'showSubmenuIcon', 'openSubmenusOnClick' => 'openSubmenusOnClick', 'style' => 'style', 'orientation' => 'orientation', 'maxNestingLevel' => 'maxNestingLevel'), 'supports' => array('align' => array('wide', 'full'), 'html' => false, 'inserter' => true, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalTextTransform' => true, '__experimentalFontFamily' => true, '__experimentalLetterSpacing' => true, '__experimentalTextDecoration' => true, '__experimentalSkipSerialization' => array('textDecoration'), '__experimentalDefaultControls' => array('fontSize' => true)), 'spacing' => array('blockGap' => true, 'units' => array('px', 'em', 'rem', 'vh', 'vw'), '__experimentalDefaultControls' => array('blockGap' => true)), '__experimentalLayout' => array('allowSwitching' => false, 'allowInheriting' => false, 'allowVerticalAlignment' => false, 'default' => array('type' => 'flex')), '__experimentalStyle' => array('elements' => array('link' => array('color' => array('text' => 'inherit'))))), 'viewScript' => array('file:./view.min.js', 'file:./view-modal.min.js'), 'editorStyle' => 'wp-block-navigation-editor', 'style' => 'wp-block-navigation'), 'navigation-link' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/navigation-link', 'title' => 'Custom Link', 'category' => 'design', 'parent' => array('core/navigation'), 'description' => 'Add a page, link, or another item to your navigation.', 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string'), 'type' => array('type' => 'string'), 'description' => array('type' => 'string'), 'rel' => array('type' => 'string'), 'id' => array('type' => 'number'), 'opensInNewTab' => array('type' => 'boolean', 'default' => false), 'url' => array('type' => 'string'), 'title' => array('type' => 'string'), 'kind' => array('type' => 'string'), 'isTopLevelLink' => array('type' => 'boolean')), 'usesContext' => array('textColor', 'customTextColor', 'backgroundColor', 'customBackgroundColor', 'overlayTextColor', 'customOverlayTextColor', 'overlayBackgroundColor', 'customOverlayBackgroundColor', 'fontSize', 'customFontSize', 'showSubmenuIcon', 'maxNestingLevel', 'style'), 'supports' => array('reusable' => false, 'html' => false, '__experimentalSlashInserter' => true, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-navigation-link-editor', 'style' => 'wp-block-navigation-link'), 'navigation-submenu' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/navigation-submenu', 'title' => 'Submenu', 'category' => 'design', 'parent' => array('core/navigation'), 'description' => 'Add a submenu to your navigation.', 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string'), 'type' => array('type' => 'string'), 'description' => array('type' => 'string'), 'rel' => array('type' => 'string'), 'id' => array('type' => 'number'), 'opensInNewTab' => array('type' => 'boolean', 'default' => false), 'url' => array('type' => 'string'), 'title' => array('type' => 'string'), 'kind' => array('type' => 'string'), 'isTopLevelItem' => array('type' => 'boolean')), 'usesContext' => array('textColor', 'customTextColor', 'backgroundColor', 'customBackgroundColor', 'overlayTextColor', 'customOverlayTextColor', 'overlayBackgroundColor', 'customOverlayBackgroundColor', 'fontSize', 'customFontSize', 'showSubmenuIcon', 'maxNestingLevel', 'openSubmenusOnClick', 'style'), 'supports' => array('reusable' => false, 'html' => false), 'editorStyle' => 'wp-block-navigation-submenu-editor', 'style' => 'wp-block-navigation-submenu'), 'nextpage' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/nextpage', 'title' => 'Page Break', 'category' => 'design', 'description' => 'Separate your content into a multi-page experience.', 'keywords' => array('next page', 'pagination'), 'parent' => array('core/post-content'), 'textdomain' => 'default', 'supports' => array('customClassName' => false, 'className' => false, 'html' => false), 'editorStyle' => 'wp-block-nextpage-editor'), 'page-list' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/page-list', 'title' => 'Page List', 'category' => 'widgets', 'description' => 'Display a list of all pages.', 'keywords' => array('menu', 'navigation'), 'textdomain' => 'default', 'attributes' => array(), 'usesContext' => array('textColor', 'customTextColor', 'backgroundColor', 'customBackgroundColor', 'overlayTextColor', 'customOverlayTextColor', 'overlayBackgroundColor', 'customOverlayBackgroundColor', 'fontSize', 'customFontSize', 'showSubmenuIcon', 'style', 'openSubmenusOnClick'), 'supports' => array('reusable' => false, 'html' => false), 'editorStyle' => 'wp-block-page-list-editor', 'style' => 'wp-block-page-list'), 'paragraph' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/paragraph', 'title' => 'Paragraph', 'category' => 'text', 'description' => 'Start with the basic building block of all narrative.', 'keywords' => array('text'), 'textdomain' => 'default', 'attributes' => array('align' => array('type' => 'string'), 'content' => array('type' => 'string', 'source' => 'html', 'selector' => 'p', 'default' => '', '__experimentalRole' => 'content'), 'dropCap' => array('type' => 'boolean', 'default' => false), 'placeholder' => array('type' => 'string'), 'direction' => array('type' => 'string', 'enum' => array('ltr', 'rtl'))), 'supports' => array('anchor' => true, 'className' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalTextDecoration' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalDefaultControls' => array('fontSize' => true)), '__experimentalSelector' => 'p', '__unstablePasteTextInline' => true), 'editorStyle' => 'wp-block-paragraph-editor', 'style' => 'wp-block-paragraph'), 'pattern' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/pattern', 'title' => 'Pattern', 'category' => 'theme', 'description' => 'Show a block pattern.', 'supports' => array('html' => false, 'inserter' => false), 'textdomain' => 'default', 'attributes' => array('slug' => array('type' => 'string'))), 'post-author' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-author', 'title' => 'Post Author', 'category' => 'theme', 'description' => 'Display post author details such as name, avatar, and bio.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string'), 'avatarSize' => array('type' => 'number', 'default' => 48), 'showAvatar' => array('type' => 'boolean', 'default' => true), 'showBio' => array('type' => 'boolean'), 'byline' => array('type' => 'string')), 'usesContext' => array('postType', 'postId', 'queryId'), 'supports' => array('html' => false, 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), 'color' => array('gradients' => true, 'link' => true, '__experimentalDuotone' => '.wp-block-post-author__avatar img', '__experimentalDefaultControls' => array('background' => true, 'text' => true))), 'editorStyle' => 'wp-block-post-author-editor', 'style' => 'wp-block-post-author'), 'post-author-biography' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-author-biography', 'title' => 'Post Author Biography', 'category' => 'theme', 'description' => 'The author biography.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string')), 'usesContext' => array('postType', 'postId'), 'supports' => array('spacing' => array('margin' => true, 'padding' => true), 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'post-comments-form' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-comments-form', 'title' => 'Post Comments Form', 'category' => 'theme', 'description' => 'Display a post\'s comments form.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string')), 'usesContext' => array('postId', 'postType'), 'supports' => array('html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-post-comments-form-editor', 'style' => array('wp-block-post-comments-form', 'wp-block-buttons', 'wp-block-button')), 'post-content' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-content', 'title' => 'Post Content', 'category' => 'theme', 'description' => 'Displays the contents of a post or page.', 'textdomain' => 'default', 'usesContext' => array('postId', 'postType', 'queryId'), 'supports' => array('align' => array('wide', 'full'), 'html' => false, '__experimentalLayout' => true, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-post-content-editor'), 'post-date' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-date', 'title' => 'Post Date', 'category' => 'theme', 'description' => 'Add the date of this post.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string'), 'format' => array('type' => 'string'), 'isLink' => array('type' => 'boolean', 'default' => false), 'displayType' => array('type' => 'string', 'default' => 'date')), 'usesContext' => array('postId', 'postType', 'queryId'), 'supports' => array('html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'post-excerpt' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-excerpt', 'title' => 'Post Excerpt', 'category' => 'theme', 'description' => 'Display a post\'s excerpt.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string'), 'moreText' => array('type' => 'string'), 'showMoreOnNewLine' => array('type' => 'boolean', 'default' => true)), 'usesContext' => array('postId', 'postType', 'queryId'), 'supports' => array('html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-post-excerpt-editor', 'style' => 'wp-block-post-excerpt'), 'post-featured-image' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-featured-image', 'title' => 'Post Featured Image', 'category' => 'theme', 'description' => 'Display a post\'s featured image.', 'textdomain' => 'default', 'attributes' => array('isLink' => array('type' => 'boolean', 'default' => false), 'width' => array('type' => 'string'), 'height' => array('type' => 'string'), 'scale' => array('type' => 'string', 'default' => 'cover'), 'sizeSlug' => array('type' => 'string'), 'rel' => array('type' => 'string', 'attribute' => 'rel', 'default' => ''), 'linkTarget' => array('type' => 'string', 'default' => '_self'), 'overlayColor' => array('type' => 'string'), 'customOverlayColor' => array('type' => 'string'), 'dimRatio' => array('type' => 'number', 'default' => 0), 'gradient' => array('type' => 'string'), 'customGradient' => array('type' => 'string')), 'usesContext' => array('postId', 'postType', 'queryId'), 'supports' => array('align' => array('left', 'right', 'center', 'wide', 'full'), 'color' => array('__experimentalDuotone' => 'img, .wp-block-post-featured-image__placeholder, .components-placeholder__illustration, .components-placeholder::before', 'text' => false, 'background' => false), '__experimentalBorder' => array('color' => true, 'radius' => true, 'width' => true, '__experimentalSelector' => 'img, .block-editor-media-placeholder, .wp-block-post-featured-image__overlay', '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array('color' => true, 'radius' => true, 'width' => true)), 'html' => false, 'spacing' => array('margin' => true, 'padding' => true)), 'editorStyle' => 'wp-block-post-featured-image-editor', 'style' => 'wp-block-post-featured-image'), 'post-navigation-link' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-navigation-link', 'title' => 'Post Navigation Link', 'category' => 'theme', 'description' => 'Displays the next or previous post link that is adjacent to the current post.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string'), 'type' => array('type' => 'string', 'default' => 'next'), 'label' => array('type' => 'string'), 'showTitle' => array('type' => 'boolean', 'default' => false), 'linkLabel' => array('type' => 'boolean', 'default' => false)), 'supports' => array('reusable' => false, 'html' => false, 'color' => array('link' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'post-template' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-template', 'title' => 'Post Template', 'category' => 'theme', 'parent' => array('core/query'), 'description' => 'Contains the block elements used to render a post, like the title, date, featured image, content or excerpt, and more.', 'textdomain' => 'default', 'usesContext' => array('queryId', 'query', 'queryContext', 'displayLayout', 'templateSlug', 'previewPostType'), 'supports' => array('reusable' => false, 'html' => false, 'align' => true, '__experimentalLayout' => array('allowEditing' => false), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'style' => 'wp-block-post-template', 'editorStyle' => 'wp-block-post-template-editor'), 'post-terms' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-terms', 'title' => 'Post Terms', 'category' => 'theme', 'description' => 'Post terms.', 'textdomain' => 'default', 'attributes' => array('term' => array('type' => 'string'), 'textAlign' => array('type' => 'string'), 'separator' => array('type' => 'string', 'default' => ', '), 'prefix' => array('type' => 'string', 'default' => ''), 'suffix' => array('type' => 'string', 'default' => '')), 'usesContext' => array('postId', 'postType'), 'supports' => array('html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'style' => 'wp-block-post-terms'), 'post-title' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-title', 'title' => 'Post Title', 'category' => 'theme', 'description' => 'Displays the title of a post, page, or any other content-type.', 'textdomain' => 'default', 'usesContext' => array('postId', 'postType', 'queryId'), 'attributes' => array('textAlign' => array('type' => 'string'), 'level' => array('type' => 'number', 'default' => 2), 'isLink' => array('type' => 'boolean', 'default' => false), 'rel' => array('type' => 'string', 'attribute' => 'rel', 'default' => ''), 'linkTarget' => array('type' => 'string', 'default' => '_self')), 'supports' => array('align' => array('wide', 'full'), 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'fontAppearance' => true, 'textTransform' => true))), 'style' => 'wp-block-post-title'), 'preformatted' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/preformatted', 'title' => 'Preformatted', 'category' => 'text', 'description' => 'Add text that respects your spacing and tabs, and also allows styling.', 'textdomain' => 'default', 'attributes' => array('content' => array('type' => 'string', 'source' => 'html', 'selector' => 'pre', 'default' => '', '__unstablePreserveWhiteSpace' => true, '__experimentalRole' => 'content')), 'supports' => array('anchor' => true, 'color' => array('gradients' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'style' => 'wp-block-preformatted'), 'pullquote' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/pullquote', 'title' => 'Pullquote', 'category' => 'text', 'description' => 'Give special visual emphasis to a quote from your text.', 'textdomain' => 'default', 'attributes' => array('value' => array('type' => 'string', 'source' => 'html', 'selector' => 'p', '__experimentalRole' => 'content'), 'citation' => array('type' => 'string', 'source' => 'html', 'selector' => 'cite', 'default' => '', '__experimentalRole' => 'content'), 'textAlign' => array('type' => 'string')), 'supports' => array('anchor' => true, 'align' => array('left', 'right', 'wide', 'full'), 'color' => array('gradients' => true, 'background' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'fontAppearance' => true)), '__experimentalBorder' => array('color' => true, 'radius' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array('color' => true, 'radius' => true, 'style' => true, 'width' => true)), '__experimentalStyle' => array('typography' => array('fontSize' => '1.5em', 'lineHeight' => '1.6'))), 'editorStyle' => 'wp-block-pullquote-editor', 'style' => 'wp-block-pullquote'), 'query' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/query', 'title' => 'Query Loop', 'category' => 'theme', 'description' => 'An advanced block that allows displaying post types based on different query parameters and visual configurations.', 'textdomain' => 'default', 'attributes' => array('queryId' => array('type' => 'number'), 'query' => array('type' => 'object', 'default' => array('perPage' => null, 'pages' => 0, 'offset' => 0, 'postType' => 'post', 'order' => 'desc', 'orderBy' => 'date', 'author' => '', 'search' => '', 'exclude' => array(), 'sticky' => '', 'inherit' => true, 'taxQuery' => null, 'parents' => array())), 'tagName' => array('type' => 'string', 'default' => 'div'), 'displayLayout' => array('type' => 'object', 'default' => array('type' => 'list')), 'namespace' => array('type' => 'string')), 'providesContext' => array('queryId' => 'queryId', 'query' => 'query', 'displayLayout' => 'displayLayout'), 'supports' => array('align' => array('wide', 'full'), 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), '__experimentalLayout' => true), 'editorStyle' => 'wp-block-query-editor'), 'query-no-results' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/query-no-results', 'title' => 'No results', 'category' => 'theme', 'description' => 'Contains the block elements used to render content when no query results are found.', 'parent' => array('core/query'), 'textdomain' => 'default', 'usesContext' => array('queryId', 'query'), 'supports' => array('align' => true, 'reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'link' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'query-pagination' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/query-pagination', 'title' => 'Pagination', 'category' => 'theme', 'parent' => array('core/query'), 'description' => 'Displays a paginated navigation to next/previous set of posts, when applicable.', 'textdomain' => 'default', 'attributes' => array('paginationArrow' => array('type' => 'string', 'default' => 'none')), 'usesContext' => array('queryId', 'query'), 'providesContext' => array('paginationArrow' => 'paginationArrow'), 'supports' => array('align' => true, 'reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), '__experimentalLayout' => array('allowSwitching' => false, 'allowInheriting' => false, 'default' => array('type' => 'flex')), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-query-pagination-editor', 'style' => 'wp-block-query-pagination'), 'query-pagination-next' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/query-pagination-next', 'title' => 'Next Page', 'category' => 'theme', 'parent' => array('core/query-pagination'), 'description' => 'Displays the next posts page link.', 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string')), 'usesContext' => array('queryId', 'query', 'paginationArrow'), 'supports' => array('reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'query-pagination-numbers' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/query-pagination-numbers', 'title' => 'Page Numbers', 'category' => 'theme', 'parent' => array('core/query-pagination'), 'description' => 'Displays a list of page numbers for pagination', 'textdomain' => 'default', 'usesContext' => array('queryId', 'query'), 'supports' => array('reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'query-pagination-numbers-editor'), 'query-pagination-previous' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/query-pagination-previous', 'title' => 'Previous Page', 'category' => 'theme', 'parent' => array('core/query-pagination'), 'description' => 'Displays the previous posts page link.', 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string')), 'usesContext' => array('queryId', 'query', 'paginationArrow'), 'supports' => array('reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'query-title' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/query-title', 'title' => 'Query Title', 'category' => 'theme', 'description' => 'Display the query title.', 'textdomain' => 'default', 'attributes' => array('type' => array('type' => 'string'), 'textAlign' => array('type' => 'string'), 'level' => array('type' => 'number', 'default' => 1), 'showPrefix' => array('type' => 'boolean', 'default' => true), 'showSearchTerm' => array('type' => 'boolean', 'default' => true)), 'supports' => array('align' => array('wide', 'full'), 'html' => false, 'color' => array('gradients' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'fontAppearance' => true, 'textTransform' => true))), 'style' => 'wp-block-query-title'), 'quote' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/quote', 'title' => 'Quote', 'category' => 'text', 'description' => 'Give quoted text visual emphasis. "In quoting others, we cite ourselves." — Julio Cortázar', 'keywords' => array('blockquote', 'cite'), 'textdomain' => 'default', 'attributes' => array('value' => array('type' => 'string', 'source' => 'html', 'selector' => 'blockquote', 'multiline' => 'p', 'default' => '', '__experimentalRole' => 'content'), 'citation' => array('type' => 'string', 'source' => 'html', 'selector' => 'cite', 'default' => '', '__experimentalRole' => 'content'), 'align' => array('type' => 'string')), 'supports' => array('anchor' => true, '__experimentalOnEnter' => true, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'fontAppearance' => true)), 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true))), 'styles' => array(array('name' => 'default', 'label' => 'Default', 'isDefault' => true), array('name' => 'plain', 'label' => 'Plain')), 'editorStyle' => 'wp-block-quote-editor', 'style' => 'wp-block-quote'), 'read-more' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/read-more', 'title' => 'Read More', 'category' => 'theme', 'description' => 'Displays the link of a post, page, or any other content-type.', 'textdomain' => 'default', 'attributes' => array('content' => array('type' => 'string'), 'linkTarget' => array('type' => 'string', 'default' => '_self')), 'usesContext' => array('postId'), 'supports' => array('html' => false, 'color' => array('gradients' => true, 'text' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalLetterSpacing' => true, '__experimentalTextDecoration' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'textDecoration' => true)), 'spacing' => array('margin' => array('top', 'bottom'), 'padding' => true, '__experimentalDefaultControls' => array('padding' => true)), '__experimentalBorder' => array('color' => true, 'radius' => true, 'width' => true, '__experimentalDefaultControls' => array('width' => true))), 'style' => 'wp-block-read-more'), 'rss' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/rss', 'title' => 'RSS', 'category' => 'widgets', 'description' => 'Display entries from any RSS or Atom feed.', 'keywords' => array('atom', 'feed'), 'textdomain' => 'default', 'attributes' => array('columns' => array('type' => 'number', 'default' => 2), 'blockLayout' => array('type' => 'string', 'default' => 'list'), 'feedURL' => array('type' => 'string', 'default' => ''), 'itemsToShow' => array('type' => 'number', 'default' => 5), 'displayExcerpt' => array('type' => 'boolean', 'default' => false), 'displayAuthor' => array('type' => 'boolean', 'default' => false), 'displayDate' => array('type' => 'boolean', 'default' => false), 'excerptLength' => array('type' => 'number', 'default' => 55)), 'supports' => array('align' => true, 'html' => false), 'editorStyle' => 'wp-block-rss-editor', 'style' => 'wp-block-rss'), 'search' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/search', 'title' => 'Search', 'category' => 'widgets', 'description' => 'Help visitors find your content.', 'keywords' => array('find'), 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string', '__experimentalRole' => 'content'), 'showLabel' => array('type' => 'boolean', 'default' => true), 'placeholder' => array('type' => 'string', 'default' => '', '__experimentalRole' => 'content'), 'width' => array('type' => 'number'), 'widthUnit' => array('type' => 'string'), 'buttonText' => array('type' => 'string', '__experimentalRole' => 'content'), 'buttonPosition' => array('type' => 'string', 'default' => 'button-outside'), 'buttonUseIcon' => array('type' => 'boolean', 'default' => false), 'query' => array('type' => 'object', 'default' => array())), 'supports' => array('align' => array('left', 'center', 'right'), 'color' => array('gradients' => true, '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('__experimentalSkipSerialization' => true, '__experimentalSelector' => '.wp-block-search__label, .wp-block-search__input, .wp-block-search__button', 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), '__experimentalBorder' => array('color' => true, 'radius' => true, 'width' => true, '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array('color' => true, 'radius' => true, 'width' => true)), 'html' => false), 'editorStyle' => 'wp-block-search-editor', 'style' => 'wp-block-search'), 'separator' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/separator', 'title' => 'Separator', 'category' => 'design', 'description' => 'Create a break between ideas or sections with a horizontal separator.', 'keywords' => array('horizontal-line', 'hr', 'divider'), 'textdomain' => 'default', 'attributes' => array('opacity' => array('type' => 'string', 'default' => 'alpha-channel')), 'supports' => array('anchor' => true, 'align' => array('center', 'wide', 'full'), 'color' => array('enableContrastChecker' => false, '__experimentalSkipSerialization' => true, 'gradients' => true, 'background' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true)), 'spacing' => array('margin' => array('top', 'bottom'))), 'styles' => array(array('name' => 'default', 'label' => 'Default', 'isDefault' => true), array('name' => 'wide', 'label' => 'Wide Line'), array('name' => 'dots', 'label' => 'Dots')), 'editorStyle' => 'wp-block-separator-editor', 'style' => 'wp-block-separator'), 'shortcode' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/shortcode', 'title' => 'Shortcode', 'category' => 'widgets', 'description' => 'Insert additional custom elements with a WordPress shortcode.', 'textdomain' => 'default', 'attributes' => array('text' => array('type' => 'string', 'source' => 'html')), 'supports' => array('className' => false, 'customClassName' => false, 'html' => false), 'editorStyle' => 'wp-block-shortcode-editor'), 'site-logo' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/site-logo', 'title' => 'Site Logo', 'category' => 'theme', 'description' => 'Display a graphic to represent this site. Update the block, and the changes apply everywhere it’s used. This is different than the site icon, which is the smaller image visible in your dashboard, browser tabs, etc used to help others recognize this site.', 'textdomain' => 'default', 'attributes' => array('width' => array('type' => 'number'), 'isLink' => array('type' => 'boolean', 'default' => true), 'linkTarget' => array('type' => 'string', 'default' => '_self'), 'shouldSyncIcon' => array('type' => 'boolean')), 'example' => array('viewportWidth' => 500, 'attributes' => array('width' => 350, 'className' => 'block-editor-block-types-list__site-logo-example')), 'supports' => array('html' => false, 'align' => true, 'alignWide' => false, 'color' => array('__experimentalDuotone' => 'img, .components-placeholder__illustration, .components-placeholder::before', 'text' => false, 'background' => false), 'spacing' => array('margin' => true, 'padding' => true)), 'styles' => array(array('name' => 'default', 'label' => 'Default', 'isDefault' => true), array('name' => 'rounded', 'label' => 'Rounded')), 'editorStyle' => 'wp-block-site-logo-editor', 'style' => 'wp-block-site-logo'), 'site-tagline' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/site-tagline', 'title' => 'Site Tagline', 'category' => 'theme', 'description' => 'Describe in a few words what the site is about. The tagline can be used in search results or when sharing on social networks even if it\'s not displayed in the theme design.', 'keywords' => array('description'), 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string')), 'supports' => array('align' => array('wide', 'full'), 'html' => false, 'color' => array('gradients' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-site-tagline-editor'), 'site-title' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/site-title', 'title' => 'Site Title', 'category' => 'theme', 'description' => 'Displays the name of this site. Update the block, and the changes apply everywhere it’s used. This will also appear in the browser title bar and in search results.', 'textdomain' => 'default', 'attributes' => array('level' => array('type' => 'number', 'default' => 1), 'textAlign' => array('type' => 'string'), 'isLink' => array('type' => 'boolean', 'default' => true), 'linkTarget' => array('type' => 'string', 'default' => '_self')), 'example' => array('viewportWidth' => 500), 'supports' => array('align' => array('wide', 'full'), 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'spacing' => array('padding' => true, 'margin' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'lineHeight' => true, 'fontAppearance' => true, 'letterSpacing' => true, 'textTransform' => true))), 'editorStyle' => 'wp-block-site-title-editor'), 'social-link' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/social-link', 'title' => 'Social Icon', 'category' => 'widgets', 'parent' => array('core/social-links'), 'description' => 'Display an icon linking to a social media profile or site.', 'textdomain' => 'default', 'attributes' => array('url' => array('type' => 'string'), 'service' => array('type' => 'string'), 'label' => array('type' => 'string')), 'usesContext' => array('openInNewTab', 'showLabels', 'iconColorValue', 'iconBackgroundColorValue'), 'supports' => array('reusable' => false, 'html' => false), 'editorStyle' => 'wp-block-social-link-editor'), 'social-links' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/social-links', 'title' => 'Social Icons', 'category' => 'widgets', 'description' => 'Display icons linking to your social media profiles or sites.', 'keywords' => array('links'), 'textdomain' => 'default', 'attributes' => array('iconColor' => array('type' => 'string'), 'customIconColor' => array('type' => 'string'), 'iconColorValue' => array('type' => 'string'), 'iconBackgroundColor' => array('type' => 'string'), 'customIconBackgroundColor' => array('type' => 'string'), 'iconBackgroundColorValue' => array('type' => 'string'), 'openInNewTab' => array('type' => 'boolean', 'default' => false), 'showLabels' => array('type' => 'boolean', 'default' => false), 'size' => array('type' => 'string')), 'providesContext' => array('openInNewTab' => 'openInNewTab', 'showLabels' => 'showLabels', 'iconColorValue' => 'iconColorValue', 'iconBackgroundColorValue' => 'iconBackgroundColorValue'), 'supports' => array('align' => array('left', 'center', 'right'), 'anchor' => true, '__experimentalExposeControlsToChildren' => true, '__experimentalLayout' => array('allowSwitching' => false, 'allowInheriting' => false, 'allowVerticalAlignment' => false, 'default' => array('type' => 'flex')), 'color' => array('enableContrastChecker' => false, 'background' => true, 'gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => false)), 'spacing' => array('blockGap' => array('horizontal', 'vertical'), 'margin' => true, 'padding' => true, 'units' => array('px', 'em', 'rem', 'vh', 'vw'), '__experimentalDefaultControls' => array('blockGap' => true))), 'styles' => array(array('name' => 'default', 'label' => 'Default', 'isDefault' => true), array('name' => 'logos-only', 'label' => 'Logos Only'), array('name' => 'pill-shape', 'label' => 'Pill Shape')), 'editorStyle' => 'wp-block-social-links-editor', 'style' => 'wp-block-social-links'), 'spacer' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/spacer', 'title' => 'Spacer', 'category' => 'design', 'description' => 'Add white space between blocks and customize its height.', 'textdomain' => 'default', 'attributes' => array('height' => array('type' => 'string', 'default' => '100px'), 'width' => array('type' => 'string')), 'usesContext' => array('orientation'), 'supports' => array('anchor' => true, 'spacing' => array('margin' => array('top', 'bottom'), '__experimentalDefaultControls' => array('margin' => true))), 'editorStyle' => 'wp-block-spacer-editor', 'style' => 'wp-block-spacer'), 'table' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/table', 'title' => 'Table', 'category' => 'text', 'description' => 'Create structured content in rows and columns to display information.', 'textdomain' => 'default', 'attributes' => array('hasFixedLayout' => array('type' => 'boolean', 'default' => false), 'caption' => array('type' => 'string', 'source' => 'html', 'selector' => 'figcaption', 'default' => ''), 'head' => array('type' => 'array', 'default' => array(), 'source' => 'query', 'selector' => 'thead tr', 'query' => array('cells' => array('type' => 'array', 'default' => array(), 'source' => 'query', 'selector' => 'td,th', 'query' => array('content' => array('type' => 'string', 'source' => 'html'), 'tag' => array('type' => 'string', 'default' => 'td', 'source' => 'tag'), 'scope' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'scope'), 'align' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'data-align'))))), 'body' => array('type' => 'array', 'default' => array(), 'source' => 'query', 'selector' => 'tbody tr', 'query' => array('cells' => array('type' => 'array', 'default' => array(), 'source' => 'query', 'selector' => 'td,th', 'query' => array('content' => array('type' => 'string', 'source' => 'html'), 'tag' => array('type' => 'string', 'default' => 'td', 'source' => 'tag'), 'scope' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'scope'), 'align' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'data-align'))))), 'foot' => array('type' => 'array', 'default' => array(), 'source' => 'query', 'selector' => 'tfoot tr', 'query' => array('cells' => array('type' => 'array', 'default' => array(), 'source' => 'query', 'selector' => 'td,th', 'query' => array('content' => array('type' => 'string', 'source' => 'html'), 'tag' => array('type' => 'string', 'default' => 'td', 'source' => 'tag'), 'scope' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'scope'), 'align' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'data-align')))))), 'supports' => array('anchor' => true, 'align' => true, 'color' => array('__experimentalSkipSerialization' => true, 'gradients' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalDefaultControls' => array('fontSize' => true)), '__experimentalBorder' => array('__experimentalSkipSerialization' => true, 'color' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array('color' => true, 'style' => true, 'width' => true)), '__experimentalSelector' => '.wp-block-table > table'), 'styles' => array(array('name' => 'regular', 'label' => 'Default', 'isDefault' => true), array('name' => 'stripes', 'label' => 'Stripes')), 'editorStyle' => 'wp-block-table-editor', 'style' => 'wp-block-table'), 'tag-cloud' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/tag-cloud', 'title' => 'Tag Cloud', 'category' => 'widgets', 'description' => 'A cloud of your most used tags.', 'textdomain' => 'default', 'attributes' => array('numberOfTags' => array('type' => 'number', 'default' => 45, 'minimum' => 1, 'maximum' => 100), 'taxonomy' => array('type' => 'string', 'default' => 'post_tag'), 'showTagCounts' => array('type' => 'boolean', 'default' => false), 'smallestFontSize' => array('type' => 'string', 'default' => '8pt'), 'largestFontSize' => array('type' => 'string', 'default' => '22pt')), 'styles' => array(array('name' => 'default', 'label' => 'Default', 'isDefault' => true), array('name' => 'outline', 'label' => 'Outline')), 'supports' => array('html' => false, 'align' => true, 'spacing' => array('margin' => true, 'padding' => true)), 'editorStyle' => 'wp-block-tag-cloud-editor'), 'template-part' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/template-part', 'title' => 'Template Part', 'category' => 'theme', 'description' => 'Edit the different global regions of your site, like the header, footer, sidebar, or create your own.', 'textdomain' => 'default', 'attributes' => array('slug' => array('type' => 'string'), 'theme' => array('type' => 'string'), 'tagName' => array('type' => 'string'), 'area' => array('type' => 'string')), 'supports' => array('align' => true, 'html' => false, 'reusable' => false), 'editorStyle' => 'wp-block-template-part-editor'), 'term-description' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/term-description', 'title' => 'Term Description', 'category' => 'theme', 'description' => 'Display the description of categories, tags and custom taxonomies when viewing an archive.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string')), 'supports' => array('align' => array('wide', 'full'), 'html' => false, 'color' => array('link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('padding' => true, 'margin' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-term-description-editor'), 'text-columns' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/text-columns', 'title' => 'Text Columns (deprecated)', 'icon' => 'columns', 'category' => 'design', 'description' => 'This block is deprecated. Please use the Columns block instead.', 'textdomain' => 'default', 'attributes' => array('content' => array('type' => 'array', 'source' => 'query', 'selector' => 'p', 'query' => array('children' => array('type' => 'string', 'source' => 'html')), 'default' => array(array(), array())), 'columns' => array('type' => 'number', 'default' => 2), 'width' => array('type' => 'string')), 'supports' => array('inserter' => false), 'editorStyle' => 'wp-block-text-columns-editor', 'style' => 'wp-block-text-columns'), 'verse' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/verse', 'title' => 'Verse', 'category' => 'text', 'description' => 'Insert poetry. Use special spacing formats. Or quote song lyrics.', 'keywords' => array('poetry', 'poem'), 'textdomain' => 'default', 'attributes' => array('content' => array('type' => 'string', 'source' => 'html', 'selector' => 'pre', 'default' => '', '__unstablePreserveWhiteSpace' => true, '__experimentalRole' => 'content'), 'textAlign' => array('type' => 'string')), 'supports' => array('anchor' => true, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('fontSize' => true, '__experimentalFontFamily' => true, 'lineHeight' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'fontAppearance' => true)), 'spacing' => array('margin' => true, 'padding' => true)), 'style' => 'wp-block-verse', 'editorStyle' => 'wp-block-verse-editor'), 'video' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/video', 'title' => 'Video', 'category' => 'media', 'description' => 'Embed a video from your media library or upload a new one.', 'keywords' => array('movie'), 'textdomain' => 'default', 'attributes' => array('autoplay' => array('type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'autoplay'), 'caption' => array('type' => 'string', 'source' => 'html', 'selector' => 'figcaption', '__experimentalRole' => 'content'), 'controls' => array('type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'controls', 'default' => true), 'id' => array('type' => 'number', '__experimentalRole' => 'content'), 'loop' => array('type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'loop'), 'muted' => array('type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'muted'), 'poster' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'poster'), 'preload' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'preload', 'default' => 'metadata'), 'src' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'src', '__experimentalRole' => 'content'), 'playsInline' => array('type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'playsinline'), 'tracks' => array('__experimentalRole' => 'content', 'type' => 'array', 'items' => array('type' => 'object'), 'default' => array())), 'supports' => array('anchor' => true, 'align' => true, 'spacing' => array('margin' => true, 'padding' => true)), 'editorStyle' => 'wp-block-video-editor', 'style' => 'wp-block-video'), 'widget-group' => array('apiVersion' => 2, 'name' => 'core/widget-group', 'category' => 'widgets', 'attributes' => array('title' => array('type' => 'string')), 'supports' => array('html' => false, 'inserter' => true, 'customClassName' => true, 'reusable' => false), 'editorStyle' => 'wp-block-widget-group-editor', 'style' => 'wp-block-widget-group')); \ No newline at end of file + array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/archives', 'title' => 'Archives', 'category' => 'widgets', 'description' => 'Display a date archive of your posts.', 'textdomain' => 'default', 'attributes' => array('displayAsDropdown' => array('type' => 'boolean', 'default' => false), 'showLabel' => array('type' => 'boolean', 'default' => true), 'showPostCounts' => array('type' => 'boolean', 'default' => false), 'type' => array('type' => 'string', 'default' => 'monthly')), 'supports' => array('align' => true, 'anchor' => true, 'html' => false, 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-archives-editor'), 'audio' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/audio', 'title' => 'Audio', 'category' => 'media', 'description' => 'Embed a simple audio player.', 'keywords' => array('music', 'sound', 'podcast', 'recording'), 'textdomain' => 'default', 'attributes' => array('src' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'audio', 'attribute' => 'src', '__experimentalRole' => 'content'), 'caption' => array('type' => 'string', 'source' => 'html', 'selector' => 'figcaption', '__experimentalRole' => 'content'), 'id' => array('type' => 'number', '__experimentalRole' => 'content'), 'autoplay' => array('type' => 'boolean', 'source' => 'attribute', 'selector' => 'audio', 'attribute' => 'autoplay'), 'loop' => array('type' => 'boolean', 'source' => 'attribute', 'selector' => 'audio', 'attribute' => 'loop'), 'preload' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'audio', 'attribute' => 'preload')), 'supports' => array('anchor' => true, 'align' => true, 'spacing' => array('margin' => true, 'padding' => true)), 'editorStyle' => 'wp-block-audio-editor', 'style' => 'wp-block-audio'), 'avatar' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/avatar', 'title' => 'Avatar', 'category' => 'theme', 'description' => 'Add a user’s avatar.', 'textdomain' => 'default', 'attributes' => array('userId' => array('type' => 'number'), 'size' => array('type' => 'number', 'default' => 96), 'isLink' => array('type' => 'boolean', 'default' => false), 'linkTarget' => array('type' => 'string', 'default' => '_self')), 'usesContext' => array('postType', 'postId', 'commentId'), 'supports' => array('anchor' => true, 'html' => false, 'align' => true, 'alignWide' => false, 'spacing' => array('margin' => true, 'padding' => true), '__experimentalBorder' => array('__experimentalSkipSerialization' => true, 'radius' => true, 'width' => true, 'color' => true, 'style' => true, '__experimentalDefaultControls' => array('radius' => true)), 'color' => array('text' => false, 'background' => false, '__experimentalDuotone' => 'img')), 'editorStyle' => 'wp-block-avatar', 'style' => 'wp-block-avatar'), 'block' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/block', 'title' => 'Reusable block', 'category' => 'reusable', 'description' => 'Create and save content to reuse across your site. Update the block, and the changes apply everywhere it’s used.', 'textdomain' => 'default', 'attributes' => array('ref' => array('type' => 'number')), 'supports' => array('customClassName' => false, 'html' => false, 'inserter' => false)), 'button' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/button', 'title' => 'Button', 'category' => 'design', 'parent' => array('core/buttons'), 'description' => 'Prompt visitors to take action with a button-style link.', 'keywords' => array('link'), 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string'), 'url' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'a', 'attribute' => 'href'), 'title' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'a', 'attribute' => 'title'), 'text' => array('type' => 'string', 'source' => 'html', 'selector' => 'a'), 'linkTarget' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'a', 'attribute' => 'target'), 'rel' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'a', 'attribute' => 'rel'), 'placeholder' => array('type' => 'string'), 'backgroundColor' => array('type' => 'string'), 'textColor' => array('type' => 'string'), 'gradient' => array('type' => 'string'), 'width' => array('type' => 'number')), 'supports' => array('anchor' => true, 'align' => false, 'alignWide' => false, 'color' => array('__experimentalSkipSerialization' => true, 'gradients' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), 'reusable' => false, 'shadow' => true, 'spacing' => array('__experimentalSkipSerialization' => true, 'padding' => array('horizontal', 'vertical'), '__experimentalDefaultControls' => array('padding' => true)), '__experimentalBorder' => array('radius' => true, '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array('radius' => true)), '__experimentalSelector' => '.wp-block-button .wp-block-button__link'), 'styles' => array(array('name' => 'fill', 'label' => 'Fill', 'isDefault' => true), array('name' => 'outline', 'label' => 'Outline')), 'editorStyle' => 'wp-block-button-editor', 'style' => 'wp-block-button'), 'buttons' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/buttons', 'title' => 'Buttons', 'category' => 'design', 'description' => 'Prompt visitors to take action with a group of button-style links.', 'keywords' => array('link'), 'textdomain' => 'default', 'supports' => array('anchor' => true, 'align' => array('wide', 'full'), '__experimentalExposeControlsToChildren' => true, 'spacing' => array('blockGap' => true, 'margin' => array('top', 'bottom'), '__experimentalDefaultControls' => array('blockGap' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), '__experimentalLayout' => array('allowSwitching' => false, 'allowInheriting' => false, 'default' => array('type' => 'flex'))), 'editorStyle' => 'wp-block-buttons-editor', 'style' => 'wp-block-buttons'), 'calendar' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/calendar', 'title' => 'Calendar', 'category' => 'widgets', 'description' => 'A calendar of your site’s posts.', 'keywords' => array('posts', 'archive'), 'textdomain' => 'default', 'attributes' => array('month' => array('type' => 'integer'), 'year' => array('type' => 'integer')), 'supports' => array('align' => true, 'anchor' => true, 'color' => array('link' => true, '__experimentalSkipSerialization' => array('text', 'background'), '__experimentalDefaultControls' => array('background' => true, 'text' => true), '__experimentalSelector' => 'table, th'), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'style' => 'wp-block-calendar'), 'categories' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/categories', 'title' => 'Categories List', 'category' => 'widgets', 'description' => 'Display a list of all categories.', 'textdomain' => 'default', 'attributes' => array('displayAsDropdown' => array('type' => 'boolean', 'default' => false), 'showHierarchy' => array('type' => 'boolean', 'default' => false), 'showPostCounts' => array('type' => 'boolean', 'default' => false), 'showOnlyTopLevel' => array('type' => 'boolean', 'default' => false), 'showEmpty' => array('type' => 'boolean', 'default' => false)), 'supports' => array('align' => true, 'anchor' => true, 'html' => false, 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-categories-editor', 'style' => 'wp-block-categories'), 'code' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/code', 'title' => 'Code', 'category' => 'text', 'description' => 'Display code snippets that respect your spacing and tabs.', 'textdomain' => 'default', 'attributes' => array('content' => array('type' => 'string', 'source' => 'html', 'selector' => 'code')), 'supports' => array('anchor' => true, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), 'spacing' => array('margin' => array('top', 'bottom'), 'padding' => true), '__experimentalBorder' => array('radius' => true, 'color' => true, 'width' => true, 'style' => true, '__experimentalDefaultControls' => array('width' => true, 'color' => true)), 'color' => array('text' => true, 'background' => true, 'gradients' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true))), 'style' => 'wp-block-code'), 'column' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/column', 'title' => 'Column', 'category' => 'text', 'parent' => array('core/columns'), 'description' => 'A single column within a columns block.', 'textdomain' => 'default', 'attributes' => array('verticalAlignment' => array('type' => 'string'), 'width' => array('type' => 'string'), 'allowedBlocks' => array('type' => 'array'), 'templateLock' => array('type' => array('string', 'boolean'), 'enum' => array('all', 'insert', 'contentOnly', false))), 'supports' => array('anchor' => true, 'reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('blockGap' => true, 'padding' => true, '__experimentalDefaultControls' => array('padding' => true)), '__experimentalBorder' => array('color' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array('color' => true, 'style' => true, 'width' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), '__experimentalLayout' => true)), 'columns' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/columns', 'title' => 'Columns', 'category' => 'design', 'description' => 'Display content in multiple columns, with blocks added to each column.', 'textdomain' => 'default', 'attributes' => array('verticalAlignment' => array('type' => 'string'), 'isStackedOnMobile' => array('type' => 'boolean', 'default' => true)), 'supports' => array('anchor' => true, 'align' => array('wide', 'full'), 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('blockGap' => array('__experimentalDefault' => '2em', 'sides' => array('horizontal', 'vertical')), 'margin' => array('top', 'bottom'), 'padding' => true, '__experimentalDefaultControls' => array('padding' => true)), '__experimentalLayout' => array('allowSwitching' => false, 'allowInheriting' => false, 'allowEditing' => false, 'default' => array('type' => 'flex', 'flexWrap' => 'nowrap')), '__experimentalBorder' => array('color' => true, 'radius' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array('color' => true, 'radius' => true, 'style' => true, 'width' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-columns-editor', 'style' => 'wp-block-columns'), 'comment-author-name' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comment-author-name', 'title' => 'Comment Author Name', 'category' => 'theme', 'ancestor' => array('core/comment-template'), 'description' => 'Displays the name of the author of the comment.', 'textdomain' => 'default', 'attributes' => array('isLink' => array('type' => 'boolean', 'default' => true), 'linkTarget' => array('type' => 'string', 'default' => '_self'), 'textAlign' => array('type' => 'string')), 'usesContext' => array('commentId'), 'supports' => array('anchor' => true, 'html' => false, 'spacing' => array('margin' => true, 'padding' => true), 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'comment-content' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comment-content', 'title' => 'Comment Content', 'category' => 'theme', 'ancestor' => array('core/comment-template'), 'description' => 'Displays the contents of a comment.', 'textdomain' => 'default', 'usesContext' => array('commentId'), 'attributes' => array('textAlign' => array('type' => 'string')), 'supports' => array('anchor' => true, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), 'spacing' => array('padding' => array('horizontal', 'vertical'), '__experimentalDefaultControls' => array('padding' => true)), 'html' => false)), 'comment-date' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comment-date', 'title' => 'Comment Date', 'category' => 'theme', 'ancestor' => array('core/comment-template'), 'description' => 'Displays the date on which the comment was posted.', 'textdomain' => 'default', 'attributes' => array('format' => array('type' => 'string'), 'isLink' => array('type' => 'boolean', 'default' => true)), 'usesContext' => array('commentId'), 'supports' => array('anchor' => true, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'comment-edit-link' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comment-edit-link', 'title' => 'Comment Edit Link', 'category' => 'theme', 'ancestor' => array('core/comment-template'), 'description' => 'Displays a link to edit the comment in the WordPress Dashboard. This link is only visible to users with the edit comment capability.', 'textdomain' => 'default', 'usesContext' => array('commentId'), 'attributes' => array('linkTarget' => array('type' => 'string', 'default' => '_self'), 'textAlign' => array('type' => 'string')), 'supports' => array('anchor' => true, 'html' => false, 'color' => array('link' => true, 'gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'comment-reply-link' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comment-reply-link', 'title' => 'Comment Reply Link', 'category' => 'theme', 'ancestor' => array('core/comment-template'), 'description' => 'Displays a link to reply to a comment.', 'textdomain' => 'default', 'usesContext' => array('commentId'), 'attributes' => array('textAlign' => array('type' => 'string')), 'supports' => array('anchor' => true, 'color' => array('gradients' => true, 'link' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), 'html' => false)), 'comment-template' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comment-template', 'title' => 'Comment Template', 'category' => 'design', 'parent' => array('core/comments'), 'description' => 'Contains the block elements used to display a comment, like the title, date, author, avatar and more.', 'textdomain' => 'default', 'usesContext' => array('postId'), 'supports' => array('align' => true, 'anchor' => true, 'html' => false, 'reusable' => false, 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'style' => 'wp-block-comment-template'), 'comments' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comments', 'title' => 'Comments', 'category' => 'theme', 'description' => 'An advanced block that allows displaying post comments using different visual configurations.', 'textdomain' => 'default', 'attributes' => array('tagName' => array('type' => 'string', 'default' => 'div'), 'legacy' => array('type' => 'boolean', 'default' => false)), 'supports' => array('align' => array('wide', 'full'), 'anchor' => true, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-comments-editor', 'usesContext' => array('postId', 'postType')), 'comments-pagination' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comments-pagination', 'title' => 'Comments Pagination', 'category' => 'theme', 'parent' => array('core/comments'), 'description' => 'Displays a paginated navigation to next/previous set of comments, when applicable.', 'textdomain' => 'default', 'attributes' => array('paginationArrow' => array('type' => 'string', 'default' => 'none')), 'providesContext' => array('comments/paginationArrow' => 'paginationArrow'), 'supports' => array('anchor' => true, 'align' => true, 'reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), '__experimentalLayout' => array('allowSwitching' => false, 'allowInheriting' => false, 'default' => array('type' => 'flex')), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-comments-pagination-editor', 'style' => 'wp-block-comments-pagination'), 'comments-pagination-next' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comments-pagination-next', 'title' => 'Comments Next Page', 'category' => 'theme', 'parent' => array('core/comments-pagination'), 'description' => 'Displays the next comment\'s page link.', 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string')), 'usesContext' => array('postId', 'comments/paginationArrow'), 'supports' => array('anchor' => true, 'reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'comments-pagination-numbers' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comments-pagination-numbers', 'title' => 'Comments Page Numbers', 'category' => 'theme', 'parent' => array('core/comments-pagination'), 'description' => 'Displays a list of page numbers for comments pagination.', 'textdomain' => 'default', 'usesContext' => array('postId'), 'supports' => array('anchor' => true, 'reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'comments-pagination-previous' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comments-pagination-previous', 'title' => 'Comments Previous Page', 'category' => 'theme', 'parent' => array('core/comments-pagination'), 'description' => 'Displays the previous comment\'s page link.', 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string')), 'usesContext' => array('postId', 'comments/paginationArrow'), 'supports' => array('anchor' => true, 'reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'comments-title' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/comments-title', 'title' => 'Comments Title', 'category' => 'theme', 'ancestor' => array('core/comments'), 'description' => 'Displays a title with the number of comments', 'textdomain' => 'default', 'usesContext' => array('postId', 'postType'), 'attributes' => array('textAlign' => array('type' => 'string'), 'showPostTitle' => array('type' => 'boolean', 'default' => true), 'showCommentsCount' => array('type' => 'boolean', 'default' => true), 'level' => array('type' => 'number', 'default' => 2)), 'supports' => array('anchor' => false, 'align' => true, 'html' => false, '__experimentalBorder' => array('radius' => true, 'color' => true, 'width' => true, 'style' => true), 'color' => array('gradients' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true, '__experimentalFontFamily' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true)))), 'cover' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/cover', 'title' => 'Cover', 'category' => 'media', 'description' => 'Add an image or video with a text overlay — great for headers.', 'textdomain' => 'default', 'attributes' => array('url' => array('type' => 'string'), 'useFeaturedImage' => array('type' => 'boolean', 'default' => false), 'id' => array('type' => 'number'), 'alt' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'alt', 'default' => ''), 'hasParallax' => array('type' => 'boolean', 'default' => false), 'isRepeated' => array('type' => 'boolean', 'default' => false), 'dimRatio' => array('type' => 'number', 'default' => 100), 'overlayColor' => array('type' => 'string'), 'customOverlayColor' => array('type' => 'string'), 'backgroundType' => array('type' => 'string', 'default' => 'image'), 'focalPoint' => array('type' => 'object'), 'minHeight' => array('type' => 'number'), 'minHeightUnit' => array('type' => 'string'), 'gradient' => array('type' => 'string'), 'customGradient' => array('type' => 'string'), 'contentPosition' => array('type' => 'string'), 'isDark' => array('type' => 'boolean', 'default' => true), 'allowedBlocks' => array('type' => 'array'), 'templateLock' => array('type' => array('string', 'boolean'), 'enum' => array('all', 'insert', 'contentOnly', false)), 'tagName' => array('type' => 'string', 'default' => 'div')), 'usesContext' => array('postId', 'postType'), 'supports' => array('anchor' => true, 'align' => true, 'html' => false, 'spacing' => array('padding' => true, 'margin' => array('top', 'bottom'), '__experimentalDefaultControls' => array('padding' => true)), 'color' => array('__experimentalDuotone' => '> .wp-block-cover__image-background, > .wp-block-cover__video-background', 'text' => false, 'background' => false), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-cover-editor', 'style' => 'wp-block-cover'), 'embed' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/embed', 'title' => 'Embed', 'category' => 'embed', 'description' => 'Add a block that displays content pulled from other sites, like Twitter or YouTube.', 'textdomain' => 'default', 'attributes' => array('url' => array('type' => 'string', '__experimentalRole' => 'content'), 'caption' => array('type' => 'string', 'source' => 'html', 'selector' => 'figcaption', '__experimentalRole' => 'content'), 'type' => array('type' => 'string', '__experimentalRole' => 'content'), 'providerNameSlug' => array('type' => 'string', '__experimentalRole' => 'content'), 'allowResponsive' => array('type' => 'boolean', 'default' => true), 'responsive' => array('type' => 'boolean', 'default' => false, '__experimentalRole' => 'content'), 'previewable' => array('type' => 'boolean', 'default' => true, '__experimentalRole' => 'content')), 'supports' => array('align' => true), 'editorStyle' => 'wp-block-embed-editor', 'style' => 'wp-block-embed'), 'file' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/file', 'title' => 'File', 'category' => 'media', 'description' => 'Add a link to a downloadable file.', 'keywords' => array('document', 'pdf', 'download'), 'textdomain' => 'default', 'attributes' => array('id' => array('type' => 'number'), 'href' => array('type' => 'string'), 'fileId' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'a:not([download])', 'attribute' => 'id'), 'fileName' => array('type' => 'string', 'source' => 'html', 'selector' => 'a:not([download])'), 'textLinkHref' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'a:not([download])', 'attribute' => 'href'), 'textLinkTarget' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'a:not([download])', 'attribute' => 'target'), 'showDownloadButton' => array('type' => 'boolean', 'default' => true), 'downloadButtonText' => array('type' => 'string', 'source' => 'html', 'selector' => 'a[download]'), 'displayPreview' => array('type' => 'boolean'), 'previewHeight' => array('type' => 'number', 'default' => 600)), 'supports' => array('anchor' => true, 'align' => true), 'viewScript' => 'file:./view.min.js', 'editorStyle' => 'wp-block-file-editor', 'style' => 'wp-block-file'), 'freeform' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/freeform', 'title' => 'Classic', 'category' => 'text', 'description' => 'Use the classic WordPress editor.', 'textdomain' => 'default', 'attributes' => array('content' => array('type' => 'string', 'source' => 'html')), 'supports' => array('className' => false, 'customClassName' => false, 'reusable' => false), 'editorStyle' => 'wp-block-freeform-editor'), 'gallery' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/gallery', 'title' => 'Gallery', 'category' => 'media', 'description' => 'Display multiple images in a rich gallery.', 'keywords' => array('images', 'photos'), 'textdomain' => 'default', 'attributes' => array('images' => array('type' => 'array', 'default' => array(), 'source' => 'query', 'selector' => '.blocks-gallery-item', 'query' => array('url' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'src'), 'fullUrl' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'data-full-url'), 'link' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'data-link'), 'alt' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'alt', 'default' => ''), 'id' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'data-id'), 'caption' => array('type' => 'string', 'source' => 'html', 'selector' => '.blocks-gallery-item__caption'))), 'ids' => array('type' => 'array', 'items' => array('type' => 'number'), 'default' => array()), 'shortCodeTransforms' => array('type' => 'array', 'default' => array(), 'items' => array('type' => 'object')), 'columns' => array('type' => 'number', 'minimum' => 1, 'maximum' => 8), 'caption' => array('type' => 'string', 'source' => 'html', 'selector' => '.blocks-gallery-caption'), 'imageCrop' => array('type' => 'boolean', 'default' => true), 'fixedHeight' => array('type' => 'boolean', 'default' => true), 'linkTarget' => array('type' => 'string'), 'linkTo' => array('type' => 'string'), 'sizeSlug' => array('type' => 'string', 'default' => 'large'), 'allowResize' => array('type' => 'boolean', 'default' => false)), 'providesContext' => array('allowResize' => 'allowResize', 'imageCrop' => 'imageCrop', 'fixedHeight' => 'fixedHeight'), 'supports' => array('anchor' => true, 'align' => true, 'html' => false, 'units' => array('px', 'em', 'rem', 'vh', 'vw'), 'spacing' => array('margin' => true, 'padding' => true, 'blockGap' => array('horizontal', 'vertical'), '__experimentalSkipSerialization' => array('blockGap'), '__experimentalDefaultControls' => array('blockGap' => true)), 'color' => array('text' => false, 'background' => true, 'gradients' => true), '__experimentalLayout' => array('allowSwitching' => false, 'allowInheriting' => false, 'allowEditing' => false, 'default' => array('type' => 'flex'))), 'editorStyle' => 'wp-block-gallery-editor', 'style' => 'wp-block-gallery'), 'group' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/group', 'title' => 'Group', 'category' => 'design', 'description' => 'Gather blocks in a layout container.', 'keywords' => array('container', 'wrapper', 'row', 'section'), 'textdomain' => 'default', 'attributes' => array('tagName' => array('type' => 'string', 'default' => 'div'), 'templateLock' => array('type' => array('string', 'boolean'), 'enum' => array('all', 'insert', 'contentOnly', false))), 'supports' => array('__experimentalOnEnter' => true, '__experimentalSettings' => true, 'align' => array('wide', 'full'), 'anchor' => true, 'ariaLabel' => true, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => array('top', 'bottom'), 'padding' => true, 'blockGap' => true, '__experimentalDefaultControls' => array('padding' => true, 'blockGap' => true)), 'dimensions' => array('minHeight' => true), '__experimentalBorder' => array('color' => true, 'radius' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array('color' => true, 'radius' => true, 'style' => true, 'width' => true)), 'position' => array('sticky' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), '__experimentalLayout' => array('allowSizingOnChildren' => true)), 'editorStyle' => 'wp-block-group-editor', 'style' => 'wp-block-group'), 'heading' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/heading', 'title' => 'Heading', 'category' => 'text', 'description' => 'Introduce new sections and organize content to help visitors (and search engines) understand the structure of your content.', 'keywords' => array('title', 'subtitle'), 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string'), 'content' => array('type' => 'string', 'source' => 'html', 'selector' => 'h1,h2,h3,h4,h5,h6', 'default' => '', '__experimentalRole' => 'content'), 'level' => array('type' => 'number', 'default' => 2), 'placeholder' => array('type' => 'string')), 'supports' => array('align' => array('wide', 'full'), 'anchor' => true, 'className' => true, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'fontAppearance' => true, 'textTransform' => true)), '__unstablePasteTextInline' => true, '__experimentalSlashInserter' => true), 'editorStyle' => 'wp-block-heading-editor', 'style' => 'wp-block-heading'), 'home-link' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/home-link', 'category' => 'design', 'parent' => array('core/navigation'), 'title' => 'Home Link', 'description' => 'Create a link that always points to the homepage of the site. Usually not necessary if there is already a site title link present in the header.', 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string')), 'usesContext' => array('textColor', 'customTextColor', 'backgroundColor', 'customBackgroundColor', 'fontSize', 'customFontSize', 'style'), 'supports' => array('anchor' => true, 'reusable' => false, 'html' => false, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-home-link-editor', 'style' => 'wp-block-home-link'), 'html' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/html', 'title' => 'Custom HTML', 'category' => 'widgets', 'description' => 'Add custom HTML code and preview it as you edit.', 'keywords' => array('embed'), 'textdomain' => 'default', 'attributes' => array('content' => array('type' => 'string', 'source' => 'raw')), 'supports' => array('customClassName' => false, 'className' => false, 'html' => false), 'editorStyle' => 'wp-block-html-editor'), 'image' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/image', 'title' => 'Image', 'category' => 'media', 'usesContext' => array('allowResize', 'imageCrop', 'fixedHeight'), 'description' => 'Insert an image to make a visual statement.', 'keywords' => array('img', 'photo', 'picture'), 'textdomain' => 'default', 'attributes' => array('align' => array('type' => 'string'), 'url' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'src', '__experimentalRole' => 'content'), 'alt' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'alt', 'default' => '', '__experimentalRole' => 'content'), 'caption' => array('type' => 'string', 'source' => 'html', 'selector' => 'figcaption', '__experimentalRole' => 'content'), 'title' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'img', 'attribute' => 'title', '__experimentalRole' => 'content'), 'href' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure > a', 'attribute' => 'href', '__experimentalRole' => 'content'), 'rel' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure > a', 'attribute' => 'rel'), 'linkClass' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure > a', 'attribute' => 'class'), 'id' => array('type' => 'number', '__experimentalRole' => 'content'), 'width' => array('type' => 'number'), 'height' => array('type' => 'number'), 'sizeSlug' => array('type' => 'string'), 'linkDestination' => array('type' => 'string'), 'linkTarget' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure > a', 'attribute' => 'target')), 'supports' => array('anchor' => true, 'color' => array('__experimentalDuotone' => 'img, .components-placeholder', 'text' => false, 'background' => false), '__experimentalBorder' => array('color' => true, 'radius' => true, 'width' => true, '__experimentalSelector' => 'img, .wp-block-image__crop-area', '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array('color' => true, 'radius' => true, 'width' => true))), 'styles' => array(array('name' => 'default', 'label' => 'Default', 'isDefault' => true), array('name' => 'rounded', 'label' => 'Rounded')), 'editorStyle' => 'wp-block-image-editor', 'style' => 'wp-block-image'), 'latest-comments' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/latest-comments', 'title' => 'Latest Comments', 'category' => 'widgets', 'description' => 'Display a list of your most recent comments.', 'keywords' => array('recent comments'), 'textdomain' => 'default', 'attributes' => array('commentsToShow' => array('type' => 'number', 'default' => 5, 'minimum' => 1, 'maximum' => 100), 'displayAvatar' => array('type' => 'boolean', 'default' => true), 'displayDate' => array('type' => 'boolean', 'default' => true), 'displayExcerpt' => array('type' => 'boolean', 'default' => true)), 'supports' => array('align' => true, 'anchor' => true, 'html' => false, 'spacing' => array('margin' => true, 'padding' => true)), 'editorStyle' => 'wp-block-latest-comments-editor', 'style' => 'wp-block-latest-comments'), 'latest-posts' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/latest-posts', 'title' => 'Latest Posts', 'category' => 'widgets', 'description' => 'Display a list of your most recent posts.', 'keywords' => array('recent posts'), 'textdomain' => 'default', 'attributes' => array('categories' => array('type' => 'array', 'items' => array('type' => 'object')), 'selectedAuthor' => array('type' => 'number'), 'postsToShow' => array('type' => 'number', 'default' => 5), 'displayPostContent' => array('type' => 'boolean', 'default' => false), 'displayPostContentRadio' => array('type' => 'string', 'default' => 'excerpt'), 'excerptLength' => array('type' => 'number', 'default' => 55), 'displayAuthor' => array('type' => 'boolean', 'default' => false), '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), 'addLinkToFeaturedImage' => array('type' => 'boolean', 'default' => false)), 'supports' => array('align' => true, 'anchor' => true, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-latest-posts-editor', 'style' => 'wp-block-latest-posts'), 'legacy-widget' => array('apiVersion' => 2, 'name' => 'core/legacy-widget', 'title' => 'Legacy Widget', 'category' => 'widgets', 'description' => 'Display a legacy widget.', 'textdomain' => 'default', 'attributes' => array('id' => array('type' => 'string', 'default' => null), 'idBase' => array('type' => 'string', 'default' => null), 'instance' => array('type' => 'object', 'default' => null)), 'supports' => array('html' => false, 'customClassName' => false, 'reusable' => false), 'editorStyle' => 'wp-block-legacy-widget-editor'), 'list' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/list', 'title' => 'List', 'category' => 'text', 'description' => 'Create a bulleted or numbered list.', 'keywords' => array('bullet list', 'ordered list', 'numbered list'), 'textdomain' => 'default', 'attributes' => array('ordered' => array('type' => 'boolean', 'default' => false, '__experimentalRole' => 'content'), 'values' => array('type' => 'string', 'source' => 'html', 'selector' => 'ol,ul', 'multiline' => 'li', '__unstableMultilineWrapperTags' => array('ol', 'ul'), 'default' => '', '__experimentalRole' => 'content'), 'type' => array('type' => 'string'), 'start' => array('type' => 'number'), 'reversed' => array('type' => 'boolean'), 'placeholder' => array('type' => 'string')), 'supports' => array('anchor' => true, 'className' => false, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), '__unstablePasteTextInline' => true, '__experimentalSelector' => 'ol,ul', '__experimentalSlashInserter' => true), 'editorStyle' => 'wp-block-list-editor', 'style' => 'wp-block-list'), 'list-item' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/list-item', 'title' => 'List item', 'category' => 'text', 'parent' => array('core/list'), 'description' => 'Create a list item.', 'textdomain' => 'default', 'attributes' => array('placeholder' => array('type' => 'string'), 'content' => array('type' => 'string', 'source' => 'html', 'selector' => 'li', 'default' => '', '__experimentalRole' => 'content')), 'supports' => array('className' => false, '__experimentalSelector' => 'li', 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'loginout' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/loginout', 'title' => 'Login/out', 'category' => 'theme', 'description' => 'Show login & logout links.', 'keywords' => array('login', 'logout', 'form'), 'textdomain' => 'default', 'attributes' => array('displayLoginAsForm' => array('type' => 'boolean', 'default' => false), 'redirectToCurrent' => array('type' => 'boolean', 'default' => true)), 'supports' => array('anchor' => true, 'className' => true, 'typography' => array('fontSize' => false))), 'media-text' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/media-text', 'title' => 'Media & Text', 'category' => 'media', 'description' => 'Set media and words side-by-side for a richer layout.', 'keywords' => array('image', 'video'), 'textdomain' => 'default', 'attributes' => array('align' => array('type' => 'string', 'default' => 'wide'), 'mediaAlt' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure img', 'attribute' => 'alt', 'default' => '', '__experimentalRole' => 'content'), 'mediaPosition' => array('type' => 'string', 'default' => 'left'), 'mediaId' => array('type' => 'number', '__experimentalRole' => 'content'), 'mediaUrl' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure video,figure img', 'attribute' => 'src', '__experimentalRole' => 'content'), 'mediaLink' => array('type' => 'string'), 'linkDestination' => array('type' => 'string'), 'linkTarget' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure a', 'attribute' => 'target'), 'href' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure a', 'attribute' => 'href', '__experimentalRole' => 'content'), 'rel' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure a', 'attribute' => 'rel'), 'linkClass' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'figure a', 'attribute' => 'class'), 'mediaType' => array('type' => 'string', '__experimentalRole' => 'content'), 'mediaWidth' => array('type' => 'number', 'default' => 50), 'mediaSizeSlug' => array('type' => 'string'), 'isStackedOnMobile' => array('type' => 'boolean', 'default' => true), 'verticalAlignment' => array('type' => 'string'), 'imageFill' => array('type' => 'boolean'), 'focalPoint' => array('type' => 'object')), 'supports' => array('anchor' => true, 'align' => array('wide', 'full'), 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-media-text-editor', 'style' => 'wp-block-media-text'), 'missing' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/missing', 'title' => 'Unsupported', 'category' => 'text', 'description' => 'Your site doesn’t include support for this block.', 'textdomain' => 'default', 'attributes' => array('originalName' => array('type' => 'string'), 'originalUndelimitedContent' => array('type' => 'string'), 'originalContent' => array('type' => 'string', 'source' => 'html')), 'supports' => array('className' => false, 'customClassName' => false, 'inserter' => false, 'html' => false, 'reusable' => false)), 'more' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/more', 'title' => 'More', 'category' => 'design', 'description' => 'Content before this block will be shown in the excerpt on your archives page.', 'keywords' => array('read more'), 'textdomain' => 'default', 'attributes' => array('customText' => array('type' => 'string'), 'noTeaser' => array('type' => 'boolean', 'default' => false)), 'supports' => array('customClassName' => false, 'className' => false, 'html' => false, 'multiple' => false), 'editorStyle' => 'wp-block-more-editor'), 'navigation' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/navigation', 'title' => 'Navigation', 'category' => 'theme', 'description' => 'A collection of blocks that allow visitors to get around your site.', 'keywords' => array('menu', 'navigation', 'links'), 'textdomain' => 'default', 'attributes' => array('ref' => array('type' => 'number'), 'textColor' => array('type' => 'string'), 'customTextColor' => array('type' => 'string'), 'rgbTextColor' => array('type' => 'string'), 'backgroundColor' => array('type' => 'string'), 'customBackgroundColor' => array('type' => 'string'), 'rgbBackgroundColor' => array('type' => 'string'), 'showSubmenuIcon' => array('type' => 'boolean', 'default' => true), 'openSubmenusOnClick' => array('type' => 'boolean', 'default' => false), 'overlayMenu' => array('type' => 'string', 'default' => 'mobile'), 'icon' => array('type' => 'string', 'default' => 'handle'), 'hasIcon' => array('type' => 'boolean', 'default' => true), '__unstableLocation' => array('type' => 'string'), 'overlayBackgroundColor' => array('type' => 'string'), 'customOverlayBackgroundColor' => array('type' => 'string'), 'overlayTextColor' => array('type' => 'string'), 'customOverlayTextColor' => array('type' => 'string'), 'maxNestingLevel' => array('type' => 'number', 'default' => 5), 'templateLock' => array('type' => array('string', 'boolean'), 'enum' => array('all', 'insert', 'contentOnly', false))), 'providesContext' => array('textColor' => 'textColor', 'customTextColor' => 'customTextColor', 'backgroundColor' => 'backgroundColor', 'customBackgroundColor' => 'customBackgroundColor', 'overlayTextColor' => 'overlayTextColor', 'customOverlayTextColor' => 'customOverlayTextColor', 'overlayBackgroundColor' => 'overlayBackgroundColor', 'customOverlayBackgroundColor' => 'customOverlayBackgroundColor', 'fontSize' => 'fontSize', 'customFontSize' => 'customFontSize', 'showSubmenuIcon' => 'showSubmenuIcon', 'openSubmenusOnClick' => 'openSubmenusOnClick', 'style' => 'style', 'orientation' => 'orientation', 'maxNestingLevel' => 'maxNestingLevel'), 'supports' => array('align' => array('wide', 'full'), 'anchor' => true, 'html' => false, 'inserter' => true, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalTextTransform' => true, '__experimentalFontFamily' => true, '__experimentalLetterSpacing' => true, '__experimentalTextDecoration' => true, '__experimentalSkipSerialization' => array('textDecoration'), '__experimentalDefaultControls' => array('fontSize' => true)), 'spacing' => array('blockGap' => true, 'units' => array('px', 'em', 'rem', 'vh', 'vw'), '__experimentalDefaultControls' => array('blockGap' => true)), '__experimentalLayout' => array('allowSwitching' => false, 'allowInheriting' => false, 'allowVerticalAlignment' => false, 'allowSizingOnChildren' => true, 'default' => array('type' => 'flex')), '__experimentalStyle' => array('elements' => array('link' => array('color' => array('text' => 'inherit'))))), 'viewScript' => array('file:./view.min.js', 'file:./view-modal.min.js'), 'editorStyle' => 'wp-block-navigation-editor', 'style' => 'wp-block-navigation'), 'navigation-link' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/navigation-link', 'title' => 'Custom Link', 'category' => 'design', 'parent' => array('core/navigation'), 'description' => 'Add a page, link, or another item to your navigation.', 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string'), 'type' => array('type' => 'string'), 'description' => array('type' => 'string'), 'rel' => array('type' => 'string'), 'id' => array('type' => 'number'), 'opensInNewTab' => array('type' => 'boolean', 'default' => false), 'url' => array('type' => 'string'), 'title' => array('type' => 'string'), 'kind' => array('type' => 'string'), 'isTopLevelLink' => array('type' => 'boolean')), 'usesContext' => array('textColor', 'customTextColor', 'backgroundColor', 'customBackgroundColor', 'overlayTextColor', 'customOverlayTextColor', 'overlayBackgroundColor', 'customOverlayBackgroundColor', 'fontSize', 'customFontSize', 'showSubmenuIcon', 'maxNestingLevel', 'style'), 'supports' => array('reusable' => false, 'html' => false, '__experimentalSlashInserter' => true, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-navigation-link-editor', 'style' => 'wp-block-navigation-link'), 'navigation-submenu' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/navigation-submenu', 'title' => 'Submenu', 'category' => 'design', 'parent' => array('core/navigation'), 'description' => 'Add a submenu to your navigation.', 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string'), 'type' => array('type' => 'string'), 'description' => array('type' => 'string'), 'rel' => array('type' => 'string'), 'id' => array('type' => 'number'), 'opensInNewTab' => array('type' => 'boolean', 'default' => false), 'url' => array('type' => 'string'), 'title' => array('type' => 'string'), 'kind' => array('type' => 'string'), 'isTopLevelItem' => array('type' => 'boolean')), 'usesContext' => array('textColor', 'customTextColor', 'backgroundColor', 'customBackgroundColor', 'overlayTextColor', 'customOverlayTextColor', 'overlayBackgroundColor', 'customOverlayBackgroundColor', 'fontSize', 'customFontSize', 'showSubmenuIcon', 'maxNestingLevel', 'openSubmenusOnClick', 'style'), 'supports' => array('reusable' => false, 'html' => false), 'editorStyle' => 'wp-block-navigation-submenu-editor', 'style' => 'wp-block-navigation-submenu'), 'nextpage' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/nextpage', 'title' => 'Page Break', 'category' => 'design', 'description' => 'Separate your content into a multi-page experience.', 'keywords' => array('next page', 'pagination'), 'parent' => array('core/post-content'), 'textdomain' => 'default', 'supports' => array('customClassName' => false, 'className' => false, 'html' => false), 'editorStyle' => 'wp-block-nextpage-editor'), 'page-list' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/page-list', 'title' => 'Page List', 'category' => 'widgets', 'description' => 'Display a list of all pages.', 'keywords' => array('menu', 'navigation'), 'textdomain' => 'default', 'attributes' => array('parentPageID' => array('type' => 'integer', 'default' => 0), 'isNested' => array('type' => 'boolean', 'default' => false)), 'usesContext' => array('textColor', 'customTextColor', 'backgroundColor', 'customBackgroundColor', 'overlayTextColor', 'customOverlayTextColor', 'overlayBackgroundColor', 'customOverlayBackgroundColor', 'fontSize', 'customFontSize', 'showSubmenuIcon', 'style', 'openSubmenusOnClick'), 'supports' => array('anchor' => true, 'reusable' => false, 'html' => false, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-page-list-editor', 'style' => 'wp-block-page-list'), 'page-list-item' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/page-list-item', 'title' => 'Page List Item', 'category' => 'widgets', 'parent' => array('core/page-list'), 'description' => 'Displays a page inside a list of all pages.', 'keywords' => array('page', 'menu', 'navigation'), 'textdomain' => 'default', 'attributes' => array('id' => array('type' => 'number'), 'label' => array('type' => 'string'), 'title' => array('type' => 'string'), 'link' => array('type' => 'string'), 'hasChildren' => array('type' => 'boolean')), 'usesContext' => array('textColor', 'customTextColor', 'backgroundColor', 'customBackgroundColor', 'overlayTextColor', 'customOverlayTextColor', 'overlayBackgroundColor', 'customOverlayBackgroundColor', 'fontSize', 'customFontSize', 'showSubmenuIcon', 'style', 'openSubmenusOnClick'), 'supports' => array('reusable' => false, 'html' => false, 'lock' => false, 'inserter' => false, '__experimentalToolbar' => false), 'editorStyle' => 'wp-block-page-list-editor', 'style' => 'wp-block-page-list'), 'paragraph' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/paragraph', 'title' => 'Paragraph', 'category' => 'text', 'description' => 'Start with the basic building block of all narrative.', 'keywords' => array('text'), 'textdomain' => 'default', 'attributes' => array('align' => array('type' => 'string'), 'content' => array('type' => 'string', 'source' => 'html', 'selector' => 'p', 'default' => '', '__experimentalRole' => 'content'), 'dropCap' => array('type' => 'boolean', 'default' => false), 'placeholder' => array('type' => 'string'), 'direction' => array('type' => 'string', 'enum' => array('ltr', 'rtl'))), 'supports' => array('anchor' => true, 'className' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalTextDecoration' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalDefaultControls' => array('fontSize' => true)), '__experimentalSelector' => 'p', '__unstablePasteTextInline' => true), 'editorStyle' => 'wp-block-paragraph-editor', 'style' => 'wp-block-paragraph'), 'pattern' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/pattern', 'title' => 'Pattern', 'category' => 'theme', 'description' => 'Show a block pattern.', 'supports' => array('html' => false, 'inserter' => false), 'textdomain' => 'default', 'attributes' => array('slug' => array('type' => 'string'))), 'post-author' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-author', 'title' => 'Post Author', 'category' => 'theme', 'description' => 'Display post author details such as name, avatar, and bio.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string'), 'avatarSize' => array('type' => 'number', 'default' => 48), 'showAvatar' => array('type' => 'boolean', 'default' => true), 'showBio' => array('type' => 'boolean'), 'byline' => array('type' => 'string'), 'isLink' => array('type' => 'boolean', 'default' => false), 'linkTarget' => array('type' => 'string', 'default' => '_self')), 'usesContext' => array('postType', 'postId', 'queryId'), 'supports' => array('anchor' => true, 'html' => false, 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), 'color' => array('gradients' => true, 'link' => true, '__experimentalDuotone' => '.wp-block-post-author__avatar img', '__experimentalDefaultControls' => array('background' => true, 'text' => true))), 'editorStyle' => 'wp-block-post-author-editor', 'style' => 'wp-block-post-author'), 'post-author-biography' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-author-biography', 'title' => 'Post Author Biography', 'category' => 'theme', 'description' => 'The author biography.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string')), 'usesContext' => array('postType', 'postId'), 'supports' => array('anchor' => true, 'spacing' => array('margin' => true, 'padding' => true), 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'post-author-name' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-author-name', 'title' => 'Post Author Name', 'category' => 'theme', 'description' => 'The author name.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string'), 'isLink' => array('type' => 'boolean', 'default' => false), 'linkTarget' => array('type' => 'string', 'default' => '_self')), 'usesContext' => array('postType', 'postId'), 'supports' => array('anchor' => true, 'html' => false, 'spacing' => array('margin' => true, 'padding' => true), 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'post-comments-form' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-comments-form', 'title' => 'Post Comments Form', 'category' => 'theme', 'description' => 'Display a post\'s comments form.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string')), 'usesContext' => array('postId', 'postType'), 'supports' => array('anchor' => true, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-post-comments-form-editor', 'style' => array('wp-block-post-comments-form', 'wp-block-buttons', 'wp-block-button')), 'post-content' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-content', 'title' => 'Post Content', 'category' => 'theme', 'description' => 'Displays the contents of a post or page.', 'textdomain' => 'default', 'usesContext' => array('postId', 'postType', 'queryId'), 'supports' => array('anchor' => true, 'align' => array('wide', 'full'), 'html' => false, '__experimentalLayout' => true, 'dimensions' => array('minHeight' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-post-content-editor'), 'post-date' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-date', 'title' => 'Post Date', 'category' => 'theme', 'description' => 'Add the date of this post.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string'), 'format' => array('type' => 'string'), 'isLink' => array('type' => 'boolean', 'default' => false), 'displayType' => array('type' => 'string', 'default' => 'date')), 'usesContext' => array('postId', 'postType', 'queryId'), 'supports' => array('anchor' => true, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'post-excerpt' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-excerpt', 'title' => 'Post Excerpt', 'category' => 'theme', 'description' => 'Display a post\'s excerpt.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string'), 'moreText' => array('type' => 'string'), 'showMoreOnNewLine' => array('type' => 'boolean', 'default' => true)), 'usesContext' => array('postId', 'postType', 'queryId'), 'supports' => array('anchor' => true, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-post-excerpt-editor', 'style' => 'wp-block-post-excerpt'), 'post-featured-image' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-featured-image', 'title' => 'Post Featured Image', 'category' => 'theme', 'description' => 'Display a post\'s featured image.', 'textdomain' => 'default', 'attributes' => array('isLink' => array('type' => 'boolean', 'default' => false), 'width' => array('type' => 'string'), 'height' => array('type' => 'string'), 'scale' => array('type' => 'string', 'default' => 'cover'), 'sizeSlug' => array('type' => 'string'), 'rel' => array('type' => 'string', 'attribute' => 'rel', 'default' => ''), 'linkTarget' => array('type' => 'string', 'default' => '_self'), 'overlayColor' => array('type' => 'string'), 'customOverlayColor' => array('type' => 'string'), 'dimRatio' => array('type' => 'number', 'default' => 0), 'gradient' => array('type' => 'string'), 'customGradient' => array('type' => 'string')), 'usesContext' => array('postId', 'postType', 'queryId'), 'supports' => array('align' => array('left', 'right', 'center', 'wide', 'full'), 'anchor' => true, 'color' => array('__experimentalDuotone' => 'img, .wp-block-post-featured-image__placeholder, .components-placeholder__illustration, .components-placeholder::before', 'text' => false, 'background' => false), '__experimentalBorder' => array('color' => true, 'radius' => true, 'width' => true, '__experimentalSelector' => 'img, .block-editor-media-placeholder, .wp-block-post-featured-image__overlay', '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array('color' => true, 'radius' => true, 'width' => true)), 'html' => false, 'spacing' => array('margin' => true, 'padding' => true)), 'editorStyle' => 'wp-block-post-featured-image-editor', 'style' => 'wp-block-post-featured-image'), 'post-navigation-link' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-navigation-link', 'title' => 'Post Navigation Link', 'category' => 'theme', 'description' => 'Displays the next or previous post link that is adjacent to the current post.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string'), 'type' => array('type' => 'string', 'default' => 'next'), 'label' => array('type' => 'string'), 'showTitle' => array('type' => 'boolean', 'default' => false), 'linkLabel' => array('type' => 'boolean', 'default' => false), 'arrow' => array('type' => 'string', 'default' => 'none')), 'supports' => array('anchor' => true, 'reusable' => false, 'html' => false, 'color' => array('link' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'style' => 'wp-block-post-navigation-link'), 'post-template' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-template', 'title' => 'Post Template', 'category' => 'theme', 'parent' => array('core/query'), 'description' => 'Contains the block elements used to render a post, like the title, date, featured image, content or excerpt, and more.', 'textdomain' => 'default', 'usesContext' => array('queryId', 'query', 'queryContext', 'displayLayout', 'templateSlug', 'previewPostType'), 'supports' => array('reusable' => false, 'html' => false, 'align' => true, 'anchor' => true, '__experimentalLayout' => array('allowEditing' => false), 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'style' => 'wp-block-post-template', 'editorStyle' => 'wp-block-post-template-editor'), 'post-terms' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-terms', 'title' => 'Post Terms', 'category' => 'theme', 'description' => 'Post terms.', 'textdomain' => 'default', 'attributes' => array('term' => array('type' => 'string'), 'textAlign' => array('type' => 'string'), 'separator' => array('type' => 'string', 'default' => ', '), 'prefix' => array('type' => 'string', 'default' => ''), 'suffix' => array('type' => 'string', 'default' => '')), 'usesContext' => array('postId', 'postType'), 'supports' => array('anchor' => true, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'style' => 'wp-block-post-terms'), 'post-title' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/post-title', 'title' => 'Post Title', 'category' => 'theme', 'description' => 'Displays the title of a post, page, or any other content-type.', 'textdomain' => 'default', 'usesContext' => array('postId', 'postType', 'queryId'), 'attributes' => array('textAlign' => array('type' => 'string'), 'level' => array('type' => 'number', 'default' => 2), 'isLink' => array('type' => 'boolean', 'default' => false), 'rel' => array('type' => 'string', 'attribute' => 'rel', 'default' => ''), 'linkTarget' => array('type' => 'string', 'default' => '_self')), 'supports' => array('align' => array('wide', 'full'), 'anchor' => true, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'fontAppearance' => true, 'textTransform' => true))), 'style' => 'wp-block-post-title'), 'preformatted' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/preformatted', 'title' => 'Preformatted', 'category' => 'text', 'description' => 'Add text that respects your spacing and tabs, and also allows styling.', 'textdomain' => 'default', 'attributes' => array('content' => array('type' => 'string', 'source' => 'html', 'selector' => 'pre', 'default' => '', '__unstablePreserveWhiteSpace' => true, '__experimentalRole' => 'content')), 'supports' => array('anchor' => true, 'color' => array('gradients' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'style' => 'wp-block-preformatted'), 'pullquote' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/pullquote', 'title' => 'Pullquote', 'category' => 'text', 'description' => 'Give special visual emphasis to a quote from your text.', 'textdomain' => 'default', 'attributes' => array('value' => array('type' => 'string', 'source' => 'html', 'selector' => 'p', '__experimentalRole' => 'content'), 'citation' => array('type' => 'string', 'source' => 'html', 'selector' => 'cite', 'default' => '', '__experimentalRole' => 'content'), 'textAlign' => array('type' => 'string')), 'supports' => array('anchor' => true, 'align' => array('left', 'right', 'wide', 'full'), 'color' => array('gradients' => true, 'background' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'fontAppearance' => true)), '__experimentalBorder' => array('color' => true, 'radius' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array('color' => true, 'radius' => true, 'style' => true, 'width' => true)), '__experimentalStyle' => array('typography' => array('fontSize' => '1.5em', 'lineHeight' => '1.6'))), 'editorStyle' => 'wp-block-pullquote-editor', 'style' => 'wp-block-pullquote'), 'query' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/query', 'title' => 'Query Loop', 'category' => 'theme', 'description' => 'An advanced block that allows displaying post types based on different query parameters and visual configurations.', 'textdomain' => 'default', 'attributes' => array('queryId' => array('type' => 'number'), 'query' => array('type' => 'object', 'default' => array('perPage' => null, 'pages' => 0, 'offset' => 0, 'postType' => 'post', 'order' => 'desc', 'orderBy' => 'date', 'author' => '', 'search' => '', 'exclude' => array(), 'sticky' => '', 'inherit' => true, 'taxQuery' => null, 'parents' => array())), 'tagName' => array('type' => 'string', 'default' => 'div'), 'displayLayout' => array('type' => 'object', 'default' => array('type' => 'list')), 'namespace' => array('type' => 'string')), 'providesContext' => array('queryId' => 'queryId', 'query' => 'query', 'displayLayout' => 'displayLayout'), 'supports' => array('align' => array('wide', 'full'), 'anchor' => true, 'html' => false, '__experimentalLayout' => true), 'editorStyle' => 'wp-block-query-editor'), 'query-no-results' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/query-no-results', 'title' => 'No results', 'category' => 'theme', 'description' => 'Contains the block elements used to render content when no query results are found.', 'parent' => array('core/query'), 'textdomain' => 'default', 'usesContext' => array('queryId', 'query'), 'supports' => array('anchor' => true, 'align' => true, 'reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'link' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'query-pagination' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/query-pagination', 'title' => 'Pagination', 'category' => 'theme', 'parent' => array('core/query'), 'description' => 'Displays a paginated navigation to next/previous set of posts, when applicable.', 'textdomain' => 'default', 'attributes' => array('paginationArrow' => array('type' => 'string', 'default' => 'none')), 'usesContext' => array('queryId', 'query'), 'providesContext' => array('paginationArrow' => 'paginationArrow'), 'supports' => array('anchor' => true, 'align' => true, 'reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), '__experimentalLayout' => array('allowSwitching' => false, 'allowInheriting' => false, 'default' => array('type' => 'flex')), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-query-pagination-editor', 'style' => 'wp-block-query-pagination'), 'query-pagination-next' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/query-pagination-next', 'title' => 'Next Page', 'category' => 'theme', 'parent' => array('core/query-pagination'), 'description' => 'Displays the next posts page link.', 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string')), 'usesContext' => array('queryId', 'query', 'paginationArrow'), 'supports' => array('anchor' => true, 'reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'query-pagination-numbers' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/query-pagination-numbers', 'title' => 'Page Numbers', 'category' => 'theme', 'parent' => array('core/query-pagination'), 'description' => 'Displays a list of page numbers for pagination', 'textdomain' => 'default', 'usesContext' => array('queryId', 'query'), 'supports' => array('anchor' => true, 'reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'query-pagination-numbers-editor'), 'query-pagination-previous' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/query-pagination-previous', 'title' => 'Previous Page', 'category' => 'theme', 'parent' => array('core/query-pagination'), 'description' => 'Displays the previous posts page link.', 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string')), 'usesContext' => array('queryId', 'query', 'paginationArrow'), 'supports' => array('anchor' => true, 'reusable' => false, 'html' => false, 'color' => array('gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true)), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)))), 'query-title' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/query-title', 'title' => 'Query Title', 'category' => 'theme', 'description' => 'Display the query title.', 'textdomain' => 'default', 'attributes' => array('type' => array('type' => 'string'), 'textAlign' => array('type' => 'string'), 'level' => array('type' => 'number', 'default' => 1), 'showPrefix' => array('type' => 'boolean', 'default' => true), 'showSearchTerm' => array('type' => 'boolean', 'default' => true)), 'supports' => array('anchor' => true, 'align' => array('wide', 'full'), 'html' => false, 'color' => array('gradients' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'fontAppearance' => true, 'textTransform' => true))), 'style' => 'wp-block-query-title'), 'quote' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/quote', 'title' => 'Quote', 'category' => 'text', 'description' => 'Give quoted text visual emphasis. "In quoting others, we cite ourselves." — Julio Cortázar', 'keywords' => array('blockquote', 'cite'), 'textdomain' => 'default', 'attributes' => array('value' => array('type' => 'string', 'source' => 'html', 'selector' => 'blockquote', 'multiline' => 'p', 'default' => '', '__experimentalRole' => 'content'), 'citation' => array('type' => 'string', 'source' => 'html', 'selector' => 'cite', 'default' => '', '__experimentalRole' => 'content'), 'align' => array('type' => 'string')), 'supports' => array('anchor' => true, '__experimentalOnEnter' => true, 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'fontAppearance' => true)), 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true))), 'styles' => array(array('name' => 'default', 'label' => 'Default', 'isDefault' => true), array('name' => 'plain', 'label' => 'Plain')), 'editorStyle' => 'wp-block-quote-editor', 'style' => 'wp-block-quote'), 'read-more' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/read-more', 'title' => 'Read More', 'category' => 'theme', 'description' => 'Displays the link of a post, page, or any other content-type.', 'textdomain' => 'default', 'attributes' => array('content' => array('type' => 'string'), 'linkTarget' => array('type' => 'string', 'default' => '_self')), 'usesContext' => array('postId'), 'supports' => array('anchor' => true, 'html' => false, 'color' => array('gradients' => true, 'text' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalLetterSpacing' => true, '__experimentalTextDecoration' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'textDecoration' => true)), 'spacing' => array('margin' => array('top', 'bottom'), 'padding' => true, '__experimentalDefaultControls' => array('padding' => true)), '__experimentalBorder' => array('color' => true, 'radius' => true, 'width' => true, '__experimentalDefaultControls' => array('width' => true))), 'style' => 'wp-block-read-more'), 'rss' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/rss', 'title' => 'RSS', 'category' => 'widgets', 'description' => 'Display entries from any RSS or Atom feed.', 'keywords' => array('atom', 'feed'), 'textdomain' => 'default', 'attributes' => array('columns' => array('type' => 'number', 'default' => 2), 'blockLayout' => array('type' => 'string', 'default' => 'list'), 'feedURL' => array('type' => 'string', 'default' => ''), 'itemsToShow' => array('type' => 'number', 'default' => 5), 'displayExcerpt' => array('type' => 'boolean', 'default' => false), 'displayAuthor' => array('type' => 'boolean', 'default' => false), 'displayDate' => array('type' => 'boolean', 'default' => false), 'excerptLength' => array('type' => 'number', 'default' => 55)), 'supports' => array('align' => true, 'anchor' => true, 'html' => false), 'editorStyle' => 'wp-block-rss-editor', 'style' => 'wp-block-rss'), 'search' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/search', 'title' => 'Search', 'category' => 'widgets', 'description' => 'Help visitors find your content.', 'keywords' => array('find'), 'textdomain' => 'default', 'attributes' => array('label' => array('type' => 'string', '__experimentalRole' => 'content'), 'showLabel' => array('type' => 'boolean', 'default' => true), 'placeholder' => array('type' => 'string', 'default' => '', '__experimentalRole' => 'content'), 'width' => array('type' => 'number'), 'widthUnit' => array('type' => 'string'), 'buttonText' => array('type' => 'string', '__experimentalRole' => 'content'), 'buttonPosition' => array('type' => 'string', 'default' => 'button-outside'), 'buttonUseIcon' => array('type' => 'boolean', 'default' => false), 'query' => array('type' => 'object', 'default' => array())), 'supports' => array('align' => array('left', 'center', 'right'), 'anchor' => true, 'color' => array('gradients' => true, '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('__experimentalSkipSerialization' => true, '__experimentalSelector' => '.wp-block-search__label, .wp-block-search__input, .wp-block-search__button', 'fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true)), '__experimentalBorder' => array('color' => true, 'radius' => true, 'width' => true, '__experimentalSkipSerialization' => true, '__experimentalDefaultControls' => array('color' => true, 'radius' => true, 'width' => true)), 'html' => false), 'editorStyle' => 'wp-block-search-editor', 'style' => 'wp-block-search'), 'separator' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/separator', 'title' => 'Separator', 'category' => 'design', 'description' => 'Create a break between ideas or sections with a horizontal separator.', 'keywords' => array('horizontal-line', 'hr', 'divider'), 'textdomain' => 'default', 'attributes' => array('opacity' => array('type' => 'string', 'default' => 'alpha-channel')), 'supports' => array('anchor' => true, 'align' => array('center', 'wide', 'full'), 'color' => array('enableContrastChecker' => false, '__experimentalSkipSerialization' => true, 'gradients' => true, 'background' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => true)), 'spacing' => array('margin' => array('top', 'bottom'))), 'styles' => array(array('name' => 'default', 'label' => 'Default', 'isDefault' => true), array('name' => 'wide', 'label' => 'Wide Line'), array('name' => 'dots', 'label' => 'Dots')), 'editorStyle' => 'wp-block-separator-editor', 'style' => 'wp-block-separator'), 'shortcode' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/shortcode', 'title' => 'Shortcode', 'category' => 'widgets', 'description' => 'Insert additional custom elements with a WordPress shortcode.', 'textdomain' => 'default', 'attributes' => array('text' => array('type' => 'string', 'source' => 'html')), 'supports' => array('className' => false, 'customClassName' => false, 'html' => false), 'editorStyle' => 'wp-block-shortcode-editor'), 'site-logo' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/site-logo', 'title' => 'Site Logo', 'category' => 'theme', 'description' => 'Display a graphic to represent this site. Update the block, and the changes apply everywhere it’s used. This is different than the site icon, which is the smaller image visible in your dashboard, browser tabs, etc used to help others recognize this site.', 'textdomain' => 'default', 'attributes' => array('width' => array('type' => 'number'), 'isLink' => array('type' => 'boolean', 'default' => true), 'linkTarget' => array('type' => 'string', 'default' => '_self'), 'shouldSyncIcon' => array('type' => 'boolean')), 'example' => array('viewportWidth' => 500, 'attributes' => array('width' => 350, 'className' => 'block-editor-block-types-list__site-logo-example')), 'supports' => array('html' => false, 'anchor' => true, 'align' => true, 'alignWide' => false, 'color' => array('__experimentalDuotone' => 'img, .components-placeholder__illustration, .components-placeholder::before', 'text' => false, 'background' => false), 'spacing' => array('margin' => true, 'padding' => true)), 'styles' => array(array('name' => 'default', 'label' => 'Default', 'isDefault' => true), array('name' => 'rounded', 'label' => 'Rounded')), 'editorStyle' => 'wp-block-site-logo-editor', 'style' => 'wp-block-site-logo'), 'site-tagline' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/site-tagline', 'title' => 'Site Tagline', 'category' => 'theme', 'description' => 'Describe in a few words what the site is about. The tagline can be used in search results or when sharing on social networks even if it’s not displayed in the theme design.', 'keywords' => array('description'), 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string')), 'supports' => array('anchor' => true, 'align' => array('wide', 'full'), 'html' => false, 'color' => array('gradients' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-site-tagline-editor'), 'site-title' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/site-title', 'title' => 'Site Title', 'category' => 'theme', 'description' => 'Displays the name of this site. Update the block, and the changes apply everywhere it’s used. This will also appear in the browser title bar and in search results.', 'textdomain' => 'default', 'attributes' => array('level' => array('type' => 'number', 'default' => 1), 'textAlign' => array('type' => 'string'), 'isLink' => array('type' => 'boolean', 'default' => true), 'linkTarget' => array('type' => 'string', 'default' => '_self')), 'example' => array('viewportWidth' => 500), 'supports' => array('anchor' => true, 'align' => array('wide', 'full'), 'html' => false, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true, 'link' => true)), 'spacing' => array('padding' => true, 'margin' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'lineHeight' => true, 'fontAppearance' => true, 'letterSpacing' => true, 'textTransform' => true))), 'editorStyle' => 'wp-block-site-title-editor', 'style' => 'wp-block-site-title'), 'social-link' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/social-link', 'title' => 'Social Icon', 'category' => 'widgets', 'parent' => array('core/social-links'), 'description' => 'Display an icon linking to a social media profile or site.', 'textdomain' => 'default', 'attributes' => array('url' => array('type' => 'string'), 'service' => array('type' => 'string'), 'label' => array('type' => 'string'), 'rel' => array('type' => 'string')), 'usesContext' => array('openInNewTab', 'showLabels', 'iconColorValue', 'iconBackgroundColorValue'), 'supports' => array('anchor' => true, 'reusable' => false, 'html' => false), 'editorStyle' => 'wp-block-social-link-editor'), 'social-links' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/social-links', 'title' => 'Social Icons', 'category' => 'widgets', 'description' => 'Display icons linking to your social media profiles or sites.', 'keywords' => array('links'), 'textdomain' => 'default', 'attributes' => array('iconColor' => array('type' => 'string'), 'customIconColor' => array('type' => 'string'), 'iconColorValue' => array('type' => 'string'), 'iconBackgroundColor' => array('type' => 'string'), 'customIconBackgroundColor' => array('type' => 'string'), 'iconBackgroundColorValue' => array('type' => 'string'), 'openInNewTab' => array('type' => 'boolean', 'default' => false), 'showLabels' => array('type' => 'boolean', 'default' => false), 'size' => array('type' => 'string')), 'providesContext' => array('openInNewTab' => 'openInNewTab', 'showLabels' => 'showLabels', 'iconColorValue' => 'iconColorValue', 'iconBackgroundColorValue' => 'iconBackgroundColorValue'), 'supports' => array('align' => array('left', 'center', 'right'), 'anchor' => true, '__experimentalExposeControlsToChildren' => true, '__experimentalLayout' => array('allowSwitching' => false, 'allowInheriting' => false, 'allowVerticalAlignment' => false, 'default' => array('type' => 'flex')), 'color' => array('enableContrastChecker' => false, 'background' => true, 'gradients' => true, 'text' => false, '__experimentalDefaultControls' => array('background' => false)), 'spacing' => array('blockGap' => array('horizontal', 'vertical'), 'margin' => true, 'padding' => true, 'units' => array('px', 'em', 'rem', 'vh', 'vw'), '__experimentalDefaultControls' => array('blockGap' => true))), 'styles' => array(array('name' => 'default', 'label' => 'Default', 'isDefault' => true), array('name' => 'logos-only', 'label' => 'Logos Only'), array('name' => 'pill-shape', 'label' => 'Pill Shape')), 'editorStyle' => 'wp-block-social-links-editor', 'style' => 'wp-block-social-links'), 'spacer' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/spacer', 'title' => 'Spacer', 'category' => 'design', 'description' => 'Add white space between blocks and customize its height.', 'textdomain' => 'default', 'attributes' => array('height' => array('type' => 'string', 'default' => '100px'), 'width' => array('type' => 'string')), 'usesContext' => array('orientation'), 'supports' => array('anchor' => true, 'spacing' => array('margin' => array('top', 'bottom'), '__experimentalDefaultControls' => array('margin' => true))), 'editorStyle' => 'wp-block-spacer-editor', 'style' => 'wp-block-spacer'), 'table' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/table', 'title' => 'Table', 'category' => 'text', 'description' => 'Create structured content in rows and columns to display information.', 'textdomain' => 'default', 'attributes' => array('hasFixedLayout' => array('type' => 'boolean', 'default' => false), 'caption' => array('type' => 'string', 'source' => 'html', 'selector' => 'figcaption', 'default' => ''), 'head' => array('type' => 'array', 'default' => array(), 'source' => 'query', 'selector' => 'thead tr', 'query' => array('cells' => array('type' => 'array', 'default' => array(), 'source' => 'query', 'selector' => 'td,th', 'query' => array('content' => array('type' => 'string', 'source' => 'html'), 'tag' => array('type' => 'string', 'default' => 'td', 'source' => 'tag'), 'scope' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'scope'), 'align' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'data-align'), 'colspan' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'colspan'), 'rowspan' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'rowspan'))))), 'body' => array('type' => 'array', 'default' => array(), 'source' => 'query', 'selector' => 'tbody tr', 'query' => array('cells' => array('type' => 'array', 'default' => array(), 'source' => 'query', 'selector' => 'td,th', 'query' => array('content' => array('type' => 'string', 'source' => 'html'), 'tag' => array('type' => 'string', 'default' => 'td', 'source' => 'tag'), 'scope' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'scope'), 'align' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'data-align'), 'colspan' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'colspan'), 'rowspan' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'rowspan'))))), 'foot' => array('type' => 'array', 'default' => array(), 'source' => 'query', 'selector' => 'tfoot tr', 'query' => array('cells' => array('type' => 'array', 'default' => array(), 'source' => 'query', 'selector' => 'td,th', 'query' => array('content' => array('type' => 'string', 'source' => 'html'), 'tag' => array('type' => 'string', 'default' => 'td', 'source' => 'tag'), 'scope' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'scope'), 'align' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'data-align'), 'colspan' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'colspan'), 'rowspan' => array('type' => 'string', 'source' => 'attribute', 'attribute' => 'rowspan')))))), 'supports' => array('anchor' => true, 'align' => true, 'color' => array('__experimentalSkipSerialization' => true, 'gradients' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalDefaultControls' => array('fontSize' => true)), '__experimentalBorder' => array('__experimentalSkipSerialization' => true, 'color' => true, 'style' => true, 'width' => true, '__experimentalDefaultControls' => array('color' => true, 'style' => true, 'width' => true)), '__experimentalSelector' => '.wp-block-table > table'), 'styles' => array(array('name' => 'regular', 'label' => 'Default', 'isDefault' => true), array('name' => 'stripes', 'label' => 'Stripes')), 'editorStyle' => 'wp-block-table-editor', 'style' => 'wp-block-table'), 'tag-cloud' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/tag-cloud', 'title' => 'Tag Cloud', 'category' => 'widgets', 'description' => 'A cloud of your most used tags.', 'textdomain' => 'default', 'attributes' => array('numberOfTags' => array('type' => 'number', 'default' => 45, 'minimum' => 1, 'maximum' => 100), 'taxonomy' => array('type' => 'string', 'default' => 'post_tag'), 'showTagCounts' => array('type' => 'boolean', 'default' => false), 'smallestFontSize' => array('type' => 'string', 'default' => '8pt'), 'largestFontSize' => array('type' => 'string', 'default' => '22pt')), 'styles' => array(array('name' => 'default', 'label' => 'Default', 'isDefault' => true), array('name' => 'outline', 'label' => 'Outline')), 'supports' => array('html' => false, 'anchor' => true, 'align' => true, 'spacing' => array('margin' => true, 'padding' => true), 'typography' => array('lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalLetterSpacing' => true)), 'editorStyle' => 'wp-block-tag-cloud-editor'), 'template-part' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/template-part', 'title' => 'Template Part', 'category' => 'theme', 'description' => 'Edit the different global regions of your site, like the header, footer, sidebar, or create your own.', 'textdomain' => 'default', 'attributes' => array('slug' => array('type' => 'string'), 'theme' => array('type' => 'string'), 'tagName' => array('type' => 'string'), 'area' => array('type' => 'string')), 'supports' => array('anchor' => true, 'align' => true, 'html' => false, 'reusable' => false), 'editorStyle' => 'wp-block-template-part-editor'), 'term-description' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/term-description', 'title' => 'Term Description', 'category' => 'theme', 'description' => 'Display the description of categories, tags and custom taxonomies when viewing an archive.', 'textdomain' => 'default', 'attributes' => array('textAlign' => array('type' => 'string')), 'supports' => array('anchor' => true, 'align' => array('wide', 'full'), 'html' => false, 'color' => array('link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'spacing' => array('padding' => true, 'margin' => true), 'typography' => array('fontSize' => true, 'lineHeight' => true, '__experimentalFontFamily' => true, '__experimentalFontWeight' => true, '__experimentalFontStyle' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalLetterSpacing' => true, '__experimentalDefaultControls' => array('fontSize' => true))), 'editorStyle' => 'wp-block-term-description-editor'), 'text-columns' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/text-columns', 'title' => 'Text Columns (deprecated)', 'icon' => 'columns', 'category' => 'design', 'description' => 'This block is deprecated. Please use the Columns block instead.', 'textdomain' => 'default', 'attributes' => array('content' => array('type' => 'array', 'source' => 'query', 'selector' => 'p', 'query' => array('children' => array('type' => 'string', 'source' => 'html')), 'default' => array(array(), array())), 'columns' => array('type' => 'number', 'default' => 2), 'width' => array('type' => 'string')), 'supports' => array('inserter' => false), 'editorStyle' => 'wp-block-text-columns-editor', 'style' => 'wp-block-text-columns'), 'verse' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/verse', 'title' => 'Verse', 'category' => 'text', 'description' => 'Insert poetry. Use special spacing formats. Or quote song lyrics.', 'keywords' => array('poetry', 'poem'), 'textdomain' => 'default', 'attributes' => array('content' => array('type' => 'string', 'source' => 'html', 'selector' => 'pre', 'default' => '', '__unstablePreserveWhiteSpace' => true, '__experimentalRole' => 'content'), 'textAlign' => array('type' => 'string')), 'supports' => array('anchor' => true, 'color' => array('gradients' => true, 'link' => true, '__experimentalDefaultControls' => array('background' => true, 'text' => true)), 'typography' => array('fontSize' => true, '__experimentalFontFamily' => true, 'lineHeight' => true, '__experimentalFontStyle' => true, '__experimentalFontWeight' => true, '__experimentalLetterSpacing' => true, '__experimentalTextTransform' => true, '__experimentalTextDecoration' => true, '__experimentalDefaultControls' => array('fontSize' => true, 'fontAppearance' => true)), 'spacing' => array('margin' => true, 'padding' => true)), 'style' => 'wp-block-verse', 'editorStyle' => 'wp-block-verse-editor'), 'video' => array('$schema' => 'https://schemas.wp.org/trunk/block.json', 'apiVersion' => 2, 'name' => 'core/video', 'title' => 'Video', 'category' => 'media', 'description' => 'Embed a video from your media library or upload a new one.', 'keywords' => array('movie'), 'textdomain' => 'default', 'attributes' => array('autoplay' => array('type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'autoplay'), 'caption' => array('type' => 'string', 'source' => 'html', 'selector' => 'figcaption', '__experimentalRole' => 'content'), 'controls' => array('type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'controls', 'default' => true), 'id' => array('type' => 'number', '__experimentalRole' => 'content'), 'loop' => array('type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'loop'), 'muted' => array('type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'muted'), 'poster' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'poster'), 'preload' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'preload', 'default' => 'metadata'), 'src' => array('type' => 'string', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'src', '__experimentalRole' => 'content'), 'playsInline' => array('type' => 'boolean', 'source' => 'attribute', 'selector' => 'video', 'attribute' => 'playsinline'), 'tracks' => array('__experimentalRole' => 'content', 'type' => 'array', 'items' => array('type' => 'object'), 'default' => array())), 'supports' => array('anchor' => true, 'align' => true, 'spacing' => array('margin' => true, 'padding' => true)), 'editorStyle' => 'wp-block-video-editor', 'style' => 'wp-block-video'), 'widget-group' => array('apiVersion' => 2, 'name' => 'core/widget-group', 'category' => 'widgets', 'attributes' => array('title' => array('type' => 'string')), 'supports' => array('html' => false, 'inserter' => true, 'customClassName' => true, 'reusable' => false), 'editorStyle' => 'wp-block-widget-group-editor', 'style' => 'wp-block-widget-group')); \ No newline at end of file diff --git a/src/wp-includes/blocks/button/block.json b/src/wp-includes/blocks/button/block.json index 6076db9b8feec..cc9921953abf6 100644 --- a/src/wp-includes/blocks/button/block.json +++ b/src/wp-includes/blocks/button/block.json @@ -9,6 +9,9 @@ "keywords": [ "link" ], "textdomain": "default", "attributes": { + "textAlign": { + "type": "string" + }, "url": { "type": "string", "source": "attribute", @@ -56,7 +59,7 @@ }, "supports": { "anchor": true, - "align": true, + "align": false, "alignWide": false, "color": { "__experimentalSkipSerialization": true, @@ -80,6 +83,7 @@ } }, "reusable": false, + "shadow": true, "spacing": { "__experimentalSkipSerialization": true, "padding": [ "horizontal", "vertical" ], diff --git a/src/wp-includes/blocks/calendar.php b/src/wp-includes/blocks/calendar.php index 8f6226e943480..de82ba22f7a99 100644 --- a/src/wp-includes/blocks/calendar.php +++ b/src/wp-includes/blocks/calendar.php @@ -40,11 +40,34 @@ function render_block_core_calendar( $attributes ) { } } + $color_block_styles = array(); + + // Text color. + $preset_text_color = array_key_exists( 'textColor', $attributes ) ? "var:preset|color|{$attributes['textColor']}" : null; + $custom_text_color = _wp_array_get( $attributes, array( 'style', 'color', 'text' ), null ); + $color_block_styles['text'] = $preset_text_color ? $preset_text_color : $custom_text_color; + + // Background Color. + $preset_background_color = array_key_exists( 'backgroundColor', $attributes ) ? "var:preset|color|{$attributes['backgroundColor']}" : null; + $custom_background_color = _wp_array_get( $attributes, array( 'style', 'color', 'background' ), null ); + $color_block_styles['background'] = $preset_background_color ? $preset_background_color : $custom_background_color; + + // Generate color styles and classes. + $styles = gutenberg_style_engine_get_styles( array( 'color' => $color_block_styles ), array( 'convert_vars_to_classnames' => true ) ); + $inline_styles = empty( $styles['css'] ) ? '' : sprintf( ' style="%s"', esc_attr( $styles['css'] ) ); + $classnames = empty( $styles['classnames'] ) ? '' : ' ' . esc_attr( $styles['classnames'] ); + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classnames .= ' has-link-color'; + } + // Apply color classes and styles to the calendar. + $calendar = str_replace( '%2$s
', $wrapper_attributes, - get_calendar( true, false ) + $calendar ); // phpcs:ignore WordPress.WP.GlobalVariablesOverride.OverrideProhibited diff --git a/src/wp-includes/blocks/calendar/block.json b/src/wp-includes/blocks/calendar/block.json index fad97e0a9efc7..c772cf58411f0 100644 --- a/src/wp-includes/blocks/calendar/block.json +++ b/src/wp-includes/blocks/calendar/block.json @@ -17,6 +17,16 @@ }, "supports": { "align": true, + "anchor": true, + "color": { + "link": true, + "__experimentalSkipSerialization": [ "text", "background" ], + "__experimentalDefaultControls": { + "background": true, + "text": true + }, + "__experimentalSelector": "table, th" + }, "typography": { "fontSize": true, "lineHeight": true, diff --git a/src/wp-includes/blocks/categories.php b/src/wp-includes/blocks/categories.php index 027688152fe7f..7e3979b7aefe2 100644 --- a/src/wp-includes/blocks/categories.php +++ b/src/wp-includes/blocks/categories.php @@ -14,7 +14,7 @@ */ function render_block_core_categories( $attributes ) { static $block_id = 0; - $block_id++; + ++$block_id; $args = array( 'echo' => false, diff --git a/src/wp-includes/blocks/categories/block.json b/src/wp-includes/blocks/categories/block.json index adf28dc42b4f0..a90a527e35c45 100644 --- a/src/wp-includes/blocks/categories/block.json +++ b/src/wp-includes/blocks/categories/block.json @@ -30,6 +30,7 @@ }, "supports": { "align": true, + "anchor": true, "html": false, "spacing": { "margin": true, diff --git a/src/wp-includes/blocks/comment-author-name.php b/src/wp-includes/blocks/comment-author-name.php index 04d8e60c65e8c..d3cd68c0dfbfc 100644 --- a/src/wp-includes/blocks/comment-author-name.php +++ b/src/wp-includes/blocks/comment-author-name.php @@ -25,12 +25,15 @@ function render_block_core_comment_author_name( $attributes, $content, $block ) return ''; } - $classes = ''; + $classes = array(); if ( isset( $attributes['textAlign'] ) ) { - $classes .= 'has-text-align-' . $attributes['textAlign']; + $classes[] = 'has-text-align-' . $attributes['textAlign']; + } + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; } - $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) ); + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); $comment_author = get_comment_author( $comment ); $link = get_comment_author_url( $comment ); diff --git a/src/wp-includes/blocks/comment-author-name/block.json b/src/wp-includes/blocks/comment-author-name/block.json index 59300c317a679..cfa036fa80e2d 100644 --- a/src/wp-includes/blocks/comment-author-name/block.json +++ b/src/wp-includes/blocks/comment-author-name/block.json @@ -22,6 +22,7 @@ }, "usesContext": [ "commentId" ], "supports": { + "anchor": true, "html": false, "spacing": { "margin": true, diff --git a/src/wp-includes/blocks/comment-content.php b/src/wp-includes/blocks/comment-content.php index 90ba060b44dfa..50bca402acf03 100644 --- a/src/wp-includes/blocks/comment-content.php +++ b/src/wp-includes/blocks/comment-content.php @@ -49,12 +49,15 @@ function render_block_core_comment_content( $attributes, $content, $block ) { } } - $classes = ''; + $classes = array(); if ( isset( $attributes['textAlign'] ) ) { - $classes .= 'has-text-align-' . $attributes['textAlign']; + $classes[] = 'has-text-align-' . $attributes['textAlign']; + } + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; } - $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) ); + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); return sprintf( '
%2$s%3$s
', diff --git a/src/wp-includes/blocks/comment-content/block.json b/src/wp-includes/blocks/comment-content/block.json index 0c28c25f330ca..69917ccce6aea 100644 --- a/src/wp-includes/blocks/comment-content/block.json +++ b/src/wp-includes/blocks/comment-content/block.json @@ -14,6 +14,7 @@ } }, "supports": { + "anchor": true, "color": { "gradients": true, "link": true, diff --git a/src/wp-includes/blocks/comment-date.php b/src/wp-includes/blocks/comment-date.php index 9bff9f2f6cbbf..0f9c18bf2c006 100644 --- a/src/wp-includes/blocks/comment-date.php +++ b/src/wp-includes/blocks/comment-date.php @@ -23,7 +23,7 @@ function render_block_core_comment_date( $attributes, $content, $block ) { return ''; } - $classes = ''; + $classes = ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) ? 'has-link-color' : ''; $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) ); $formatted_date = get_comment_date( diff --git a/src/wp-includes/blocks/comment-date/block.json b/src/wp-includes/blocks/comment-date/block.json index e90cb0b0d8c4d..ea1e263338139 100644 --- a/src/wp-includes/blocks/comment-date/block.json +++ b/src/wp-includes/blocks/comment-date/block.json @@ -18,6 +18,7 @@ }, "usesContext": [ "commentId" ], "supports": { + "anchor": true, "html": false, "color": { "gradients": true, diff --git a/src/wp-includes/blocks/comment-edit-link.php b/src/wp-includes/blocks/comment-edit-link.php index 39727ea5aed10..ce7ad9bf207d4 100644 --- a/src/wp-includes/blocks/comment-edit-link.php +++ b/src/wp-includes/blocks/comment-edit-link.php @@ -27,12 +27,15 @@ function render_block_core_comment_edit_link( $attributes, $content, $block ) { $link_atts .= sprintf( 'target="%s"', esc_attr( $attributes['linkTarget'] ) ); } - $classes = ''; + $classes = array(); if ( isset( $attributes['textAlign'] ) ) { - $classes .= 'has-text-align-' . $attributes['textAlign']; + $classes[] = 'has-text-align-' . $attributes['textAlign']; + } + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; } - $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) ); + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); return sprintf( '', diff --git a/src/wp-includes/blocks/comment-edit-link/block.json b/src/wp-includes/blocks/comment-edit-link/block.json index 14795c83e1c53..e695ddc3801f7 100644 --- a/src/wp-includes/blocks/comment-edit-link/block.json +++ b/src/wp-includes/blocks/comment-edit-link/block.json @@ -18,6 +18,7 @@ } }, "supports": { + "anchor": true, "html": false, "color": { "link": true, diff --git a/src/wp-includes/blocks/comment-reply-link.php b/src/wp-includes/blocks/comment-reply-link.php index 169b62ac24bdf..3f7b6e48b617c 100644 --- a/src/wp-includes/blocks/comment-reply-link.php +++ b/src/wp-includes/blocks/comment-reply-link.php @@ -34,7 +34,7 @@ function render_block_core_comment_reply_link( $attributes, $content, $block ) { // Compute comment's depth iterating over its ancestors. while ( ! empty( $parent_id ) ) { - $depth++; + ++$depth; $parent_id = get_comment( $parent_id )->comment_parent; } @@ -51,12 +51,15 @@ function render_block_core_comment_reply_link( $attributes, $content, $block ) { return; } - $classes = ''; + $classes = array(); if ( isset( $attributes['textAlign'] ) ) { - $classes .= 'has-text-align-' . $attributes['textAlign']; + $classes[] = 'has-text-align-' . $attributes['textAlign']; + } + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; } - $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) ); + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); return sprintf( '
%2$s
', diff --git a/src/wp-includes/blocks/comment-reply-link/block.json b/src/wp-includes/blocks/comment-reply-link/block.json index 9d4a1d8668acc..7ed60f34f581f 100644 --- a/src/wp-includes/blocks/comment-reply-link/block.json +++ b/src/wp-includes/blocks/comment-reply-link/block.json @@ -14,6 +14,7 @@ } }, "supports": { + "anchor": true, "color": { "gradients": true, "link": true, diff --git a/src/wp-includes/blocks/comment-template.php b/src/wp-includes/blocks/comment-template.php index 770959854b58a..08620a3ea695f 100644 --- a/src/wp-includes/blocks/comment-template.php +++ b/src/wp-includes/blocks/comment-template.php @@ -50,13 +50,13 @@ function block_core_comment_template_render_comments( $comments, $block ) { // comments. if ( ! empty( $children ) && ! empty( $thread_comments ) ) { if ( $comment_depth < $thread_comments_depth ) { - $comment_depth += 1; + ++$comment_depth; $inner_content = block_core_comment_template_render_comments( $children, $block ); $block_content .= sprintf( '
    %1$s
', $inner_content ); - $comment_depth -= 1; + --$comment_depth; } else { $inner_content = block_core_comment_template_render_comments( $children, @@ -70,7 +70,6 @@ function block_core_comment_template_render_comments( $comments, $block ) { } return $content; - } /** diff --git a/src/wp-includes/blocks/comment-template/block.json b/src/wp-includes/blocks/comment-template/block.json index 1a8dd4da1ada3..9d0eb98684f14 100644 --- a/src/wp-includes/blocks/comment-template/block.json +++ b/src/wp-includes/blocks/comment-template/block.json @@ -9,9 +9,14 @@ "textdomain": "default", "usesContext": [ "postId" ], "supports": { - "reusable": false, - "html": false, "align": true, + "anchor": true, + "html": false, + "reusable": false, + "spacing": { + "margin": true, + "padding": true + }, "typography": { "fontSize": true, "lineHeight": true, diff --git a/src/wp-includes/blocks/comments-pagination-next/block.json b/src/wp-includes/blocks/comments-pagination-next/block.json index 48da9495bff62..f0cee1a1cdbe6 100644 --- a/src/wp-includes/blocks/comments-pagination-next/block.json +++ b/src/wp-includes/blocks/comments-pagination-next/block.json @@ -14,6 +14,7 @@ }, "usesContext": [ "postId", "comments/paginationArrow" ], "supports": { + "anchor": true, "reusable": false, "html": false, "color": { diff --git a/src/wp-includes/blocks/comments-pagination-numbers/block.json b/src/wp-includes/blocks/comments-pagination-numbers/block.json index 97a0649a7a4c1..0ab4f965ff1cd 100644 --- a/src/wp-includes/blocks/comments-pagination-numbers/block.json +++ b/src/wp-includes/blocks/comments-pagination-numbers/block.json @@ -9,8 +9,16 @@ "textdomain": "default", "usesContext": [ "postId" ], "supports": { + "anchor": true, "reusable": false, "html": false, + "color": { + "gradients": true, + "text": false, + "__experimentalDefaultControls": { + "background": true + } + }, "typography": { "fontSize": true, "lineHeight": true, diff --git a/src/wp-includes/blocks/comments-pagination-previous/block.json b/src/wp-includes/blocks/comments-pagination-previous/block.json index a48782af29760..211e1a33305a0 100644 --- a/src/wp-includes/blocks/comments-pagination-previous/block.json +++ b/src/wp-includes/blocks/comments-pagination-previous/block.json @@ -14,6 +14,7 @@ }, "usesContext": [ "postId", "comments/paginationArrow" ], "supports": { + "anchor": true, "reusable": false, "html": false, "color": { diff --git a/src/wp-includes/blocks/comments-pagination.php b/src/wp-includes/blocks/comments-pagination.php index 5c041c237c64f..2f9cef27f78cf 100644 --- a/src/wp-includes/blocks/comments-pagination.php +++ b/src/wp-includes/blocks/comments-pagination.php @@ -22,9 +22,12 @@ function render_block_core_comments_pagination( $attributes, $content ) { return; } + $classes = ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) ? 'has-link-color' : ''; + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) ); + return sprintf( '
%2$s
', - get_block_wrapper_attributes(), + $wrapper_attributes, $content ); } diff --git a/src/wp-includes/blocks/comments-pagination/block.json b/src/wp-includes/blocks/comments-pagination/block.json index ffa2828912f26..d7c8be4b8eaa2 100644 --- a/src/wp-includes/blocks/comments-pagination/block.json +++ b/src/wp-includes/blocks/comments-pagination/block.json @@ -17,6 +17,7 @@ "comments/paginationArrow": "paginationArrow" }, "supports": { + "anchor": true, "align": true, "reusable": false, "html": false, diff --git a/src/wp-includes/blocks/comments.php b/src/wp-includes/blocks/comments.php index 69044c081c74e..a5e51cfbf4e79 100644 --- a/src/wp-includes/blocks/comments.php +++ b/src/wp-includes/blocks/comments.php @@ -202,7 +202,6 @@ function register_legacy_post_comments_block() { 'wp-block-buttons', 'wp-block-button', ), - 'editorStyle' => 'wp-block-post-comments-editor', 'render_callback' => 'render_block_core_comments', 'skip_inner_blocks' => true, ); diff --git a/src/wp-includes/blocks/comments/block.json b/src/wp-includes/blocks/comments/block.json index 59d315b5fcb83..19490f6e99eb4 100644 --- a/src/wp-includes/blocks/comments/block.json +++ b/src/wp-includes/blocks/comments/block.json @@ -18,6 +18,7 @@ }, "supports": { "align": [ "wide", "full" ], + "anchor": true, "html": false, "color": { "gradients": true, @@ -28,6 +29,10 @@ "link": true } }, + "spacing": { + "margin": true, + "padding": true + }, "typography": { "fontSize": true, "lineHeight": true, diff --git a/src/wp-includes/blocks/cover.php b/src/wp-includes/blocks/cover.php index 4168d267671f7..e5a497fd76889 100644 --- a/src/wp-includes/blocks/cover.php +++ b/src/wp-includes/blocks/cover.php @@ -25,7 +25,7 @@ function render_block_core_cover( $attributes, $content ) { ); if ( isset( $attributes['focalPoint'] ) ) { - $object_position = round( $attributes['focalPoint']['x'] * 100 ) . '%' . ' ' . round( $attributes['focalPoint']['y'] * 100 ) . '%'; + $object_position = round( $attributes['focalPoint']['x'] * 100 ) . '% ' . round( $attributes['focalPoint']['y'] * 100 ) . '%'; $attr['data-object-position'] = $object_position; $attr['style'] = 'object-position: ' . $object_position; } diff --git a/src/wp-includes/blocks/cover/block.json b/src/wp-includes/blocks/cover/block.json index 1982ecc44853e..3bcc779a0f127 100644 --- a/src/wp-includes/blocks/cover/block.json +++ b/src/wp-includes/blocks/cover/block.json @@ -74,6 +74,10 @@ "templateLock": { "type": [ "string", "boolean" ], "enum": [ "all", "insert", "contentOnly", false ] + }, + "tagName": { + "type": "string", + "default": "div" } }, "usesContext": [ "postId", "postType" ], diff --git a/src/wp-includes/blocks/embed/block.json b/src/wp-includes/blocks/embed/block.json index 7257b54cf20fa..e36768cd72780 100644 --- a/src/wp-includes/blocks/embed/block.json +++ b/src/wp-includes/blocks/embed/block.json @@ -8,18 +8,22 @@ "textdomain": "default", "attributes": { "url": { - "type": "string" + "type": "string", + "__experimentalRole": "content" }, "caption": { "type": "string", "source": "html", - "selector": "figcaption" + "selector": "figcaption", + "__experimentalRole": "content" }, "type": { - "type": "string" + "type": "string", + "__experimentalRole": "content" }, "providerNameSlug": { - "type": "string" + "type": "string", + "__experimentalRole": "content" }, "allowResponsive": { "type": "boolean", @@ -27,11 +31,13 @@ }, "responsive": { "type": "boolean", - "default": false + "default": false, + "__experimentalRole": "content" }, "previewable": { "type": "boolean", - "default": true + "default": true, + "__experimentalRole": "content" } }, "supports": { diff --git a/src/wp-includes/blocks/gallery.php b/src/wp-includes/blocks/gallery.php index 7bc5e2821b796..ff1fb8ef42d89 100644 --- a/src/wp-includes/blocks/gallery.php +++ b/src/wp-includes/blocks/gallery.php @@ -76,13 +76,10 @@ function block_core_gallery_render( $attributes, $content ) { } } - $class = wp_unique_id( 'wp-block-gallery-' ); - $content = preg_replace( - '/' . preg_quote( 'class="', '/' ) . '/', - 'class="' . $class . ' ', - $content, - 1 - ); + $unique_gallery_classname = wp_unique_id( 'wp-block-gallery-' ); + $processed_content = new WP_HTML_Tag_Processor( $content ); + $processed_content->next_tag(); + $processed_content->add_class( $unique_gallery_classname ); // --gallery-block--gutter-size is deprecated. --wp--style--gallery-gap-default should be used by themes that want to set a default // gap on the gallery. @@ -102,10 +99,22 @@ function block_core_gallery_render( $attributes, $content ) { } // Set the CSS variable to the column value, and the `gap` property to the combined gap value. - $style = '.wp-block-gallery.' . $class . '{ --wp--style--unstable-gallery-gap: ' . $gap_column . '; gap: ' . $gap_value . '}'; + $gallery_styles = array(); + $gallery_styles[] = array( + 'selector' => ".wp-block-gallery.{$unique_gallery_classname}", + 'declarations' => array( + '--wp--style--unstable-gallery-gap' => $gap_column, + 'gap' => $gap_value, + ), + ); - wp_enqueue_block_support_styles( $style, 11 ); - return $content; + gutenberg_style_engine_get_stylesheet_from_css_rules( + $gallery_styles, + array( + 'context' => 'block-supports', + ) + ); + return (string) $processed_content; } /** * Registers the `core/gallery` block on server. diff --git a/src/wp-includes/blocks/group/block.json b/src/wp-includes/blocks/group/block.json index 968f00cb1c5cb..2b227a15847a2 100644 --- a/src/wp-includes/blocks/group/block.json +++ b/src/wp-includes/blocks/group/block.json @@ -41,6 +41,9 @@ "blockGap": true } }, + "dimensions": { + "minHeight": true + }, "__experimentalBorder": { "color": true, "radius": true, @@ -53,6 +56,9 @@ "width": true } }, + "position": { + "sticky": true + }, "typography": { "fontSize": true, "lineHeight": true, @@ -66,7 +72,9 @@ "fontSize": true } }, - "__experimentalLayout": true + "__experimentalLayout": { + "allowSizingOnChildren": true + } }, "editorStyle": "wp-block-group-editor", "style": "wp-block-group" diff --git a/src/wp-includes/blocks/heading.php b/src/wp-includes/blocks/heading.php new file mode 100644 index 0000000000000..5a7e8dbaab43c --- /dev/null +++ b/src/wp-includes/blocks/heading.php @@ -0,0 +1,52 @@ +Hello World + * + * Would be transformed to: + *

Hello World

+ * + * @param array $attributes Attributes of the block being rendered. + * @param string $content Content of the block being rendered. + * + * @return string The content of the block being rendered. + */ +function block_core_heading_render( $attributes, $content ) { + if ( ! $content ) { + return $content; + } + + $p = new WP_HTML_Tag_Processor( $content ); + + $header_tags = array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ); + while ( $p->next_tag() ) { + if ( in_array( $p->get_tag(), $header_tags, true ) ) { + $p->add_class( 'wp-block-heading' ); + break; + } + } + + return $p->get_updated_html(); +} + +/** + * Registers the `core/heading` block on server. + */ +function register_block_core_heading() { + register_block_type_from_metadata( + __DIR__ . '/heading', + array( + 'render_callback' => 'block_core_heading_render', + ) + ); +} + +add_action( 'init', 'register_block_core_heading' ); diff --git a/src/wp-includes/blocks/heading/block.json b/src/wp-includes/blocks/heading/block.json index 89c1514808911..f9d701eace964 100644 --- a/src/wp-includes/blocks/heading/block.json +++ b/src/wp-includes/blocks/heading/block.json @@ -29,7 +29,7 @@ "supports": { "align": [ "wide", "full" ], "anchor": true, - "className": false, + "className": true, "color": { "gradients": true, "link": true, @@ -57,7 +57,6 @@ "textTransform": true } }, - "__experimentalSelector": "h1,h2,h3,h4,h5,h6", "__unstablePasteTextInline": true, "__experimentalSlashInserter": true }, diff --git a/src/wp-includes/blocks/home-link.php b/src/wp-includes/blocks/home-link.php index 5bf7aeda5505d..33f41057c936b 100644 --- a/src/wp-includes/blocks/home-link.php +++ b/src/wp-includes/blocks/home-link.php @@ -128,7 +128,7 @@ function render_block_core_home_link( $attributes, $content, $block ) { $aria_current = is_home() || ( is_front_page() && 'page' === get_option( 'show_on_front' ) ) ? ' aria-current="page"' : ''; return sprintf( - '
  • %4$s
  • ', + '
  • %4$s
  • ', block_core_home_link_build_li_wrapper_attributes( $block->context ), esc_url( home_url() ), $aria_current, diff --git a/src/wp-includes/blocks/home-link/block.json b/src/wp-includes/blocks/home-link/block.json index 567bdf8c27ba7..df964ad76bc68 100644 --- a/src/wp-includes/blocks/home-link/block.json +++ b/src/wp-includes/blocks/home-link/block.json @@ -22,6 +22,7 @@ "style" ], "supports": { + "anchor": true, "reusable": false, "html": false, "typography": { diff --git a/src/wp-includes/blocks/html/block.json b/src/wp-includes/blocks/html/block.json index e72a674373e14..c1e1e94b87496 100644 --- a/src/wp-includes/blocks/html/block.json +++ b/src/wp-includes/blocks/html/block.json @@ -10,7 +10,7 @@ "attributes": { "content": { "type": "string", - "source": "html" + "source": "raw" } }, "supports": { diff --git a/src/wp-includes/blocks/latest-comments/block.json b/src/wp-includes/blocks/latest-comments/block.json index 4f8b0fbf54284..b7ba5c71a6832 100644 --- a/src/wp-includes/blocks/latest-comments/block.json +++ b/src/wp-includes/blocks/latest-comments/block.json @@ -29,7 +29,12 @@ }, "supports": { "align": true, - "html": false + "anchor": true, + "html": false, + "spacing": { + "margin": true, + "padding": true + } }, "editorStyle": "wp-block-latest-comments-editor", "style": "wp-block-latest-comments" diff --git a/src/wp-includes/blocks/latest-posts.php b/src/wp-includes/blocks/latest-posts.php index cbeafb6677a13..d3945ee2c9ee2 100644 --- a/src/wp-includes/blocks/latest-posts.php +++ b/src/wp-includes/blocks/latest-posts.php @@ -55,7 +55,7 @@ function render_block_core_latest_posts( $attributes ) { $args['author'] = $attributes['selectedAuthor']; } - $query = new WP_Query; + $query = new WP_Query(); $recent_posts = $query->query( $args ); if ( isset( $attributes['displayFeaturedImage'] ) && $attributes['displayFeaturedImage'] ) { @@ -173,25 +173,24 @@ function render_block_core_latest_posts( $attributes ) { remove_filter( 'excerpt_length', 'block_core_latest_posts_get_excerpt_length', 20 ); - $class = 'wp-block-latest-posts__list'; - + $classes = array( 'wp-block-latest-posts__list' ); if ( isset( $attributes['postLayout'] ) && 'grid' === $attributes['postLayout'] ) { - $class .= ' is-grid'; + $classes[] = 'is-grid'; } - if ( isset( $attributes['columns'] ) && 'grid' === $attributes['postLayout'] ) { - $class .= ' columns-' . $attributes['columns']; + $classes[] = 'columns-' . $attributes['columns']; } - if ( isset( $attributes['displayPostDate'] ) && $attributes['displayPostDate'] ) { - $class .= ' has-dates'; + $classes[] = 'has-dates'; } - if ( isset( $attributes['displayAuthor'] ) && $attributes['displayAuthor'] ) { - $class .= ' has-author'; + $classes[] = 'has-author'; + } + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; } - $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $class ) ); + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); return sprintf( '
      %2$s
    ', diff --git a/src/wp-includes/blocks/latest-posts/block.json b/src/wp-includes/blocks/latest-posts/block.json index b423b09d900cb..9b451f5875c73 100644 --- a/src/wp-includes/blocks/latest-posts/block.json +++ b/src/wp-includes/blocks/latest-posts/block.json @@ -84,7 +84,21 @@ }, "supports": { "align": true, + "anchor": true, "html": false, + "color": { + "gradients": true, + "link": true, + "__experimentalDefaultControls": { + "background": true, + "text": true, + "link": true + } + }, + "spacing": { + "margin": true, + "padding": true + }, "typography": { "fontSize": true, "lineHeight": true, diff --git a/src/wp-includes/blocks/list-item/block.json b/src/wp-includes/blocks/list-item/block.json index 674cf381aa99c..745d6e30b4dd6 100644 --- a/src/wp-includes/blocks/list-item/block.json +++ b/src/wp-includes/blocks/list-item/block.json @@ -21,6 +21,19 @@ }, "supports": { "className": false, - "__experimentalSelector": "li" + "__experimentalSelector": "li", + "typography": { + "fontSize": true, + "lineHeight": true, + "__experimentalFontFamily": true, + "__experimentalFontWeight": true, + "__experimentalFontStyle": true, + "__experimentalTextTransform": true, + "__experimentalTextDecoration": true, + "__experimentalLetterSpacing": true, + "__experimentalDefaultControls": { + "fontSize": true + } + } } } diff --git a/src/wp-includes/blocks/loginout/block.json b/src/wp-includes/blocks/loginout/block.json index 3db9d0040ce5f..aea0bb9e68840 100644 --- a/src/wp-includes/blocks/loginout/block.json +++ b/src/wp-includes/blocks/loginout/block.json @@ -18,6 +18,7 @@ } }, "supports": { + "anchor": true, "className": true, "typography": { "fontSize": false diff --git a/src/wp-includes/blocks/navigation-link.php b/src/wp-includes/blocks/navigation-link.php index f32437b41a3f8..4b0dace04c1b8 100644 --- a/src/wp-includes/blocks/navigation-link.php +++ b/src/wp-includes/blocks/navigation-link.php @@ -120,6 +120,33 @@ function block_core_navigation_link_render_submenu_icon() { return ''; } +/** + * Decodes a url if it's encoded, returning the same url if not. + * + * @param string $url The url to decode. + * + * @return string $url Returns the decoded url. + */ +function block_core_navigation_link_maybe_urldecode( $url ) { + $is_url_encoded = false; + $query = parse_url( $url, PHP_URL_QUERY ); + $query_params = wp_parse_args( $query ); + + foreach ( $query_params as $query_param ) { + if ( rawurldecode( $query_param ) !== $query_param ) { + $is_url_encoded = true; + break; + } + } + + if ( $is_url_encoded ) { + return rawurldecode( $url ); + } + + return $url; +} + + /** * Renders the `core/navigation-link` block. * @@ -171,7 +198,7 @@ function render_block_core_navigation_link( $attributes, $content, $block ) { // Start appending HTML attributes to anchor tag. if ( isset( $attributes['url'] ) ) { - $html .= ' href="' . esc_url( $attributes['url'] ) . '"'; + $html .= ' href="' . esc_url( block_core_navigation_link_maybe_urldecode( $attributes['url'] ) ) . '"'; } if ( $is_active ) { @@ -344,3 +371,35 @@ function register_block_core_navigation_link() { ); } add_action( 'init', 'register_block_core_navigation_link' ); + +/** + * Enables animation of the block inspector for the Navigation Link block. + * + * See: + * - https://github.com/WordPress/gutenberg/pull/46342 + * - https://github.com/WordPress/gutenberg/issues/45884 + * + * @param array $settings Default editor settings. + * @return array Filtered editor settings. + */ +function gutenberg_enable_animation_for_navigation_link_inspector( $settings ) { + $current_animation_settings = _wp_array_get( + $settings, + array( '__experimentalBlockInspectorAnimation' ), + array() + ); + + $settings['__experimentalBlockInspectorAnimation'] = array_merge( + $current_animation_settings, + array( + 'core/navigation-link' => + array( + 'enterDirection' => 'rightToLeft', + ), + ) + ); + + return $settings; +} + +add_filter( 'block_editor_settings_all', 'gutenberg_enable_animation_for_navigation_link_inspector' ); diff --git a/src/wp-includes/blocks/navigation-submenu.php b/src/wp-includes/blocks/navigation-submenu.php index 0ad7ba1d658f4..84bc859a62525 100644 --- a/src/wp-includes/blocks/navigation-submenu.php +++ b/src/wp-includes/blocks/navigation-submenu.php @@ -155,7 +155,7 @@ function render_block_core_navigation_submenu( $attributes, $content, $block ) { $css_classes = trim( implode( ' ', $classes ) ); $has_submenu = count( $block->inner_blocks ) > 0; - $is_active = ! empty( $attributes['id'] ) && ( get_the_ID() === (int) $attributes['id'] ); + $is_active = ! empty( $attributes['id'] ) && ( get_queried_object_id() === (int) $attributes['id'] ); $show_submenu_indicators = isset( $block->context['showSubmenuIcon'] ) && $block->context['showSubmenuIcon']; $open_on_click = isset( $block->context['openSubmenusOnClick'] ) && $block->context['openSubmenusOnClick']; @@ -255,6 +255,14 @@ function render_block_core_navigation_submenu( $attributes, $content, $block ) { $inner_blocks_html .= $inner_block->render(); } + if ( strpos( $inner_blocks_html, 'current-menu-item' ) ) { + $tag_processor = new WP_HTML_Tag_Processor( $html ); + while ( $tag_processor->next_tag( array( 'class_name' => 'wp-block-navigation-item__content' ) ) ) { + $tag_processor->add_class( 'current-menu-ancestor' ); + } + $html = $tag_processor->get_updated_html(); + } + $html .= sprintf( '
      %s
    ', $inner_blocks_html @@ -281,3 +289,35 @@ function register_block_core_navigation_submenu() { ); } add_action( 'init', 'register_block_core_navigation_submenu' ); + +/** + * Enables animation of the block inspector for the Navigation Submenu block. + * + * See: + * - https://github.com/WordPress/gutenberg/pull/46342 + * - https://github.com/WordPress/gutenberg/issues/45884 + * + * @param array $settings Default editor settings. + * @return array Filtered editor settings. + */ +function gutenberg_enable_animation_for_navigation_submenu_inspector( $settings ) { + $current_animation_settings = _wp_array_get( + $settings, + array( '__experimentalBlockInspectorAnimation' ), + array() + ); + + $settings['__experimentalBlockInspectorAnimation'] = array_merge( + $current_animation_settings, + array( + 'core/navigation-submenu' => + array( + 'enterDirection' => 'rightToLeft', + ), + ) + ); + + return $settings; +} + +add_filter( 'block_editor_settings_all', 'gutenberg_enable_animation_for_navigation_submenu_inspector' ); diff --git a/src/wp-includes/blocks/navigation.php b/src/wp-includes/blocks/navigation.php index c3f6317eb2955..8c5aa720b488b 100644 --- a/src/wp-includes/blocks/navigation.php +++ b/src/wp-includes/blocks/navigation.php @@ -248,6 +248,121 @@ function block_core_navigation_render_submenu_icon() { return ''; } +/** + * Get the classic navigation menu to use as a fallback. + * + * @return object WP_Term The classic navigation. + */ +function block_core_navigation_get_classic_menu_fallback() { + $classic_nav_menus = wp_get_nav_menus(); + + // If menus exist. + if ( $classic_nav_menus && ! is_wp_error( $classic_nav_menus ) ) { + // Handles simple use case where user has a classic menu and switches to a block theme. + + // Returns the menu assigned to location `primary`. + $locations = get_nav_menu_locations(); + if ( isset( $locations['primary'] ) ) { + $primary_menu = wp_get_nav_menu_object( $locations['primary'] ); + if ( $primary_menu ) { + return $primary_menu; + } + } + + // Returns a menu if `primary` is its slug. + foreach ( $classic_nav_menus as $classic_nav_menu ) { + if ( 'primary' === $classic_nav_menu->slug ) { + return $classic_nav_menu; + } + } + + // Otherwise return the most recently created classic menu. + usort( + $classic_nav_menus, + function( $a, $b ) { + return $b->term_id - $a->term_id; + } + ); + return $classic_nav_menus[0]; + } +} + +/** + * Converts a classic navigation to blocks. + * + * @param object $classic_nav_menu WP_Term The classic navigation object to convert. + * @return array the normalized parsed blocks. + */ +function block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu ) { + // BEGIN: Code that already exists in wp_nav_menu(). + $menu_items = wp_get_nav_menu_items( $classic_nav_menu->term_id, array( 'update_post_term_cache' => false ) ); + + // Set up the $menu_item variables. + _wp_menu_item_classes_by_context( $menu_items ); + + $sorted_menu_items = array(); + foreach ( (array) $menu_items as $menu_item ) { + $sorted_menu_items[ $menu_item->menu_order ] = $menu_item; + } + + unset( $menu_items, $menu_item ); + + // END: Code that already exists in wp_nav_menu(). + + $menu_items_by_parent_id = array(); + foreach ( $sorted_menu_items as $menu_item ) { + $menu_items_by_parent_id[ $menu_item->menu_item_parent ][] = $menu_item; + } + + $inner_blocks = block_core_navigation_parse_blocks_from_menu_items( + isset( $menu_items_by_parent_id[0] ) + ? $menu_items_by_parent_id[0] + : array(), + $menu_items_by_parent_id + ); + + return serialize_blocks( $inner_blocks ); +} + +/** + * If there's a the classic menu then use it as a fallback. + * + * @return array the normalized parsed blocks. + */ +function block_core_navigation_maybe_use_classic_menu_fallback() { + // See if we have a classic menu. + $classic_nav_menu = block_core_navigation_get_classic_menu_fallback(); + + if ( ! $classic_nav_menu ) { + return; + } + + // If we have a classic menu then convert it to blocks. + $classic_nav_menu_blocks = block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu ); + + if ( empty( $classic_nav_menu_blocks ) ) { + return; + } + + // Create a new navigation menu from the classic menu. + $wp_insert_post_result = wp_insert_post( + array( + 'post_content' => $classic_nav_menu_blocks, + 'post_title' => $classic_nav_menu->slug, + 'post_name' => $classic_nav_menu->slug, + 'post_status' => 'publish', + 'post_type' => 'wp_navigation', + ), + true // So that we can check whether the result is an error. + ); + + if ( is_wp_error( $wp_insert_post_result ) ) { + return; + } + + // Fetch the most recently published navigation which will be the classic one created above. + return block_core_navigation_get_most_recently_published_navigation(); +} /** * Finds the most recently published `wp_navigation` Post. @@ -255,7 +370,8 @@ function block_core_navigation_render_submenu_icon() { * @return WP_Post|null the first non-empty Navigation or null. */ function block_core_navigation_get_most_recently_published_navigation() { - // We default to the most recently created menu. + + // Default to the most recently created menu. $parsed_args = array( 'post_type' => 'wp_navigation', 'no_found_rows' => true, @@ -294,6 +410,25 @@ function( $block ) { return array_values( $filtered ); } +/** + * Returns true if the navigation block contains a nested navigation block. + * + * @param WP_Block_List $inner_blocks Inner block instance to be normalized. + * @return bool true if the navigation block contains a nested navigation block. + */ +function block_core_navigation_block_contains_core_navigation( $inner_blocks ) { + foreach ( $inner_blocks as $block ) { + if ( 'core/navigation' === $block->name ) { + return true; + } + if ( $block->inner_blocks && block_core_navigation_block_contains_core_navigation( $block->inner_blocks ) ) { + return true; + } + } + + return false; +} + /** * Retrieves the appropriate fallback to be used on the front of the * site when there is no menu assigned to the Nav block. @@ -319,9 +454,16 @@ function block_core_navigation_get_fallback_blocks() { $navigation_post = block_core_navigation_get_most_recently_published_navigation(); - // Prefer using the first non-empty Navigation as fallback if available. + // If there are no navigation posts then try to find a classic menu + // and convert it into a block based navigation menu. + if ( ! $navigation_post ) { + $navigation_post = block_core_navigation_maybe_use_classic_menu_fallback(); + } + + // Use the first non-empty Navigation as fallback if available. if ( $navigation_post ) { - $maybe_fallback = block_core_navigation_filter_out_empty_blocks( parse_blocks( $navigation_post->post_content ) ); + $parsed_blocks = parse_blocks( $navigation_post->post_content ); + $maybe_fallback = block_core_navigation_filter_out_empty_blocks( $parsed_blocks ); // Normalizing blocks may result in an empty array of blocks if they were all `null` blocks. // In this case default to the (Page List) fallback. @@ -501,6 +643,10 @@ function render_block_core_navigation( $attributes, $content, $block ) { $inner_blocks = new WP_Block_List( $fallback_blocks, $attributes ); } + if ( block_core_navigation_block_contains_core_navigation( $inner_blocks ) ) { + return ''; + } + /** * Filter navigation block $inner_blocks. * Allows modification of a navigation block menu items. @@ -551,22 +697,41 @@ function render_block_core_navigation( $attributes, $content, $block ) { _prime_post_caches( $post_ids, false, false ); } + $list_item_nav_blocks = array( + 'core/navigation-link', + 'core/home-link', + 'core/site-title', + 'core/site-logo', + 'core/navigation-submenu', + ); + + $needs_list_item_wrapper = array( + 'core/site-title', + 'core/site-logo', + ); + $inner_blocks_html = ''; $is_list_open = false; foreach ( $inner_blocks as $inner_block ) { - if ( ( 'core/navigation-link' === $inner_block->name || 'core/home-link' === $inner_block->name || 'core/site-title' === $inner_block->name || 'core/site-logo' === $inner_block->name || 'core/navigation-submenu' === $inner_block->name ) && ! $is_list_open ) { + $is_list_item = in_array( $inner_block->name, $list_item_nav_blocks, true ); + + if ( $is_list_item && ! $is_list_open ) { $is_list_open = true; $inner_blocks_html .= '
      '; } - if ( 'core/navigation-link' !== $inner_block->name && 'core/home-link' !== $inner_block->name && 'core/site-title' !== $inner_block->name && 'core/site-logo' !== $inner_block->name && 'core/navigation-submenu' !== $inner_block->name && $is_list_open ) { + + if ( ! $is_list_item && $is_list_open ) { $is_list_open = false; $inner_blocks_html .= '
    '; } + $inner_block_content = $inner_block->render(); - if ( 'core/site-title' === $inner_block->name || ( 'core/site-logo' === $inner_block->name && $inner_block_content ) ) { - $inner_blocks_html .= '
  • ' . $inner_block_content . '
  • '; - } else { - $inner_blocks_html .= $inner_block_content; + if ( ! empty( $inner_block_content ) ) { + if ( in_array( $inner_block->name, $needs_list_item_wrapper, true ) ) { + $inner_blocks_html .= '
  • ' . $inner_block_content . '
  • '; + } else { + $inner_blocks_html .= $inner_block_content; + } } } @@ -709,3 +874,35 @@ function block_core_navigation_typographic_presets_backcompatibility( $parsed_bl } add_filter( 'render_block_data', 'block_core_navigation_typographic_presets_backcompatibility' ); + +/** + * Enables animation of the block inspector for the Navigation block. + * + * See: + * - https://github.com/WordPress/gutenberg/pull/46342 + * - https://github.com/WordPress/gutenberg/issues/45884 + * + * @param array $settings Default editor settings. + * @return array Filtered editor settings. + */ +function gutenberg_enable_animation_for_navigation_inspector( $settings ) { + $current_animation_settings = _wp_array_get( + $settings, + array( '__experimentalBlockInspectorAnimation' ), + array() + ); + + $settings['__experimentalBlockInspectorAnimation'] = array_merge( + $current_animation_settings, + array( + 'core/navigation' => + array( + 'enterDirection' => 'leftToRight', + ), + ) + ); + + return $settings; +} + +add_filter( 'block_editor_settings_all', 'gutenberg_enable_animation_for_navigation_inspector' ); diff --git a/src/wp-includes/blocks/navigation/block.json b/src/wp-includes/blocks/navigation/block.json index 5e856a30ceaba..16b0e57505c69 100644 --- a/src/wp-includes/blocks/navigation/block.json +++ b/src/wp-includes/blocks/navigation/block.json @@ -67,6 +67,10 @@ "maxNestingLevel": { "type": "number", "default": 5 + }, + "templateLock": { + "type": [ "string", "boolean" ], + "enum": [ "all", "insert", "contentOnly", false ] } }, "providesContext": { @@ -88,6 +92,7 @@ }, "supports": { "align": [ "wide", "full" ], + "anchor": true, "html": false, "inserter": true, "typography": { @@ -115,6 +120,7 @@ "allowSwitching": false, "allowInheriting": false, "allowVerticalAlignment": false, + "allowSizingOnChildren": true, "default": { "type": "flex" } diff --git a/src/wp-includes/blocks/navigation/view-modal.asset.php b/src/wp-includes/blocks/navigation/view-modal.asset.php index a4d19fb3ca75c..35bf91ef33bec 100644 --- a/src/wp-includes/blocks/navigation/view-modal.asset.php +++ b/src/wp-includes/blocks/navigation/view-modal.asset.php @@ -1 +1 @@ - array(), 'version' => '6d574d0390bc333487cb'); + array(), 'version' => 'd09326a9acd3f6992aae'); diff --git a/src/wp-includes/blocks/navigation/view-modal.min.asset.php b/src/wp-includes/blocks/navigation/view-modal.min.asset.php index 97565b80d692d..c6b1fdefa293a 100644 --- a/src/wp-includes/blocks/navigation/view-modal.min.asset.php +++ b/src/wp-includes/blocks/navigation/view-modal.min.asset.php @@ -1 +1 @@ - array(), 'version' => '45f05135277abf0b0408'); + array(), 'version' => 'f51363b18f0497ec84da'); diff --git a/src/wp-includes/blocks/page-list-item/block.json b/src/wp-includes/blocks/page-list-item/block.json new file mode 100644 index 0000000000000..04e7f7f574dd2 --- /dev/null +++ b/src/wp-includes/blocks/page-list-item/block.json @@ -0,0 +1,52 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "core/page-list-item", + "title": "Page List Item", + "category": "widgets", + "parent": [ "core/page-list" ], + "description": "Displays a page inside a list of all pages.", + "keywords": [ "page", "menu", "navigation" ], + "textdomain": "default", + "attributes": { + "id": { + "type": "number" + }, + "label": { + "type": "string" + }, + "title": { + "type": "string" + }, + "link": { + "type": "string" + }, + "hasChildren": { + "type": "boolean" + } + }, + "usesContext": [ + "textColor", + "customTextColor", + "backgroundColor", + "customBackgroundColor", + "overlayTextColor", + "customOverlayTextColor", + "overlayBackgroundColor", + "customOverlayBackgroundColor", + "fontSize", + "customFontSize", + "showSubmenuIcon", + "style", + "openSubmenusOnClick" + ], + "supports": { + "reusable": false, + "html": false, + "lock": false, + "inserter": false, + "__experimentalToolbar": false + }, + "editorStyle": "wp-block-page-list-editor", + "style": "wp-block-page-list" +} diff --git a/src/wp-includes/blocks/page-list.php b/src/wp-includes/blocks/page-list.php index 5ef169fe13a87..efc73ad3a0a48 100644 --- a/src/wp-includes/blocks/page-list.php +++ b/src/wp-includes/blocks/page-list.php @@ -139,13 +139,14 @@ function block_core_page_list_build_css_font_sizes( $context ) { * @param boolean $show_submenu_icons Whether to show submenu indicator icons. * @param boolean $is_navigation_child If block is a child of Navigation block. * @param array $nested_pages The array of nested pages. + * @param boolean $is_nested Whether the submenu is nested or not. * @param array $active_page_ancestor_ids An array of ancestor ids for active page. * @param array $colors Color information for overlay styles. * @param integer $depth The nesting depth. * * @return string List markup. */ -function block_core_page_list_render_nested_page_list( $open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $active_page_ancestor_ids = array(), $colors = array(), $depth = 0 ) { +function block_core_page_list_render_nested_page_list( $open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $is_nested, $active_page_ancestor_ids = array(), $colors = array(), $depth = 0 ) { if ( empty( $nested_pages ) ) { return; } @@ -173,7 +174,7 @@ function block_core_page_list_render_nested_page_list( $open_submenus_on_click, $navigation_child_content_class = $is_navigation_child ? ' wp-block-navigation-item__content' : ''; // If this is the first level of submenus, include the overlay colors. - if ( 1 === $depth && isset( $colors['overlay_css_classes'], $colors['overlay_inline_styles'] ) ) { + if ( ( ( 0 < $depth && ! $is_nested ) || $is_nested ) && isset( $colors['overlay_css_classes'], $colors['overlay_inline_styles'] ) ) { $css_class .= ' ' . trim( implode( ' ', $colors['overlay_css_classes'] ) ); if ( '' !== $colors['overlay_inline_styles'] ) { $style_attribute = sprintf( ' style="%s"', esc_attr( $colors['overlay_inline_styles'] ) ); @@ -196,7 +197,7 @@ function block_core_page_list_render_nested_page_list( $open_submenus_on_click, if ( isset( $page['children'] ) && $is_navigation_child && $open_submenus_on_click ) { $markup .= '' . ''; + ''; } else { $markup .= '' . $title . ''; } @@ -207,12 +208,9 @@ function block_core_page_list_render_nested_page_list( $open_submenus_on_click, $markup .= ''; $markup .= ''; } - $markup .= ''; + $markup .= '
      '; + $markup .= block_core_page_list_render_nested_page_list( $open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $page['children'], $is_nested, $active_page_ancestor_ids, $colors, $depth + 1 ); + $markup .= '
    '; } $markup .= ''; } @@ -250,7 +248,10 @@ function block_core_page_list_nest_pages( $current_level, $children ) { */ function render_block_core_page_list( $attributes, $content, $block ) { static $block_id = 0; - $block_id++; + ++$block_id; + + $parent_page_id = $attributes['parentPageID']; + $is_nested = $attributes['isNested']; $all_pages = get_pages( array( @@ -271,7 +272,7 @@ function render_block_core_page_list( $attributes, $content, $block ) { $active_page_ancestor_ids = array(); foreach ( (array) $all_pages as $page ) { - $is_active = ! empty( $page->ID ) && ( get_the_ID() === $page->ID ); + $is_active = ! empty( $page->ID ) && ( get_queried_object_id() === $page->ID ); if ( $is_active ) { $active_page_ancestor_ids = get_post_ancestors( $page->ID ); @@ -306,15 +307,27 @@ function render_block_core_page_list( $attributes, $content, $block ) { $nested_pages = block_core_page_list_nest_pages( $top_level_pages, $pages_with_children ); + if ( 0 !== $parent_page_id ) { + // If the parent page has no child pages, there is nothing to show. + if ( ! array_key_exists( $parent_page_id, $pages_with_children ) ) { + return; + } + + $nested_pages = block_core_page_list_nest_pages( + $pages_with_children[ $parent_page_id ], + $pages_with_children + ); + } + $is_navigation_child = array_key_exists( 'showSubmenuIcon', $block->context ); $open_submenus_on_click = array_key_exists( 'openSubmenusOnClick', $block->context ) ? $block->context['openSubmenusOnClick'] : false; $show_submenu_icons = array_key_exists( 'showSubmenuIcon', $block->context ) ? $block->context['showSubmenuIcon'] : false; - $wrapper_markup = '
      %2$s
    '; + $wrapper_markup = $is_nested ? '%2$s' : '
      %2$s
    '; - $items_markup = block_core_page_list_render_nested_page_list( $open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $active_page_ancestor_ids, $colors ); + $items_markup = block_core_page_list_render_nested_page_list( $open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $is_nested, $active_page_ancestor_ids, $colors ); $wrapper_attributes = get_block_wrapper_attributes( array( diff --git a/src/wp-includes/blocks/page-list/block.json b/src/wp-includes/blocks/page-list/block.json index 3068a1fb8bc00..0fa309431202a 100644 --- a/src/wp-includes/blocks/page-list/block.json +++ b/src/wp-includes/blocks/page-list/block.json @@ -7,7 +7,16 @@ "description": "Display a list of all pages.", "keywords": [ "menu", "navigation" ], "textdomain": "default", - "attributes": {}, + "attributes": { + "parentPageID": { + "type": "integer", + "default": 0 + }, + "isNested": { + "type": "boolean", + "default": false + } + }, "usesContext": [ "textColor", "customTextColor", @@ -24,8 +33,22 @@ "openSubmenusOnClick" ], "supports": { + "anchor": true, "reusable": false, - "html": false + "html": false, + "typography": { + "fontSize": true, + "lineHeight": true, + "__experimentalFontFamily": true, + "__experimentalFontWeight": true, + "__experimentalFontStyle": true, + "__experimentalTextTransform": true, + "__experimentalTextDecoration": true, + "__experimentalLetterSpacing": true, + "__experimentalDefaultControls": { + "fontSize": true + } + } }, "editorStyle": "wp-block-page-list-editor", "style": "wp-block-page-list" diff --git a/src/wp-includes/blocks/post-author-biography/block.json b/src/wp-includes/blocks/post-author-biography/block.json index 434b6b0965880..a2e5f327acfeb 100644 --- a/src/wp-includes/blocks/post-author-biography/block.json +++ b/src/wp-includes/blocks/post-author-biography/block.json @@ -13,6 +13,7 @@ }, "usesContext": [ "postType", "postId" ], "supports": { + "anchor": true, "spacing": { "margin": true, "padding": true diff --git a/src/wp-includes/blocks/post-author-name.php b/src/wp-includes/blocks/post-author-name.php new file mode 100644 index 0000000000000..c5c6d142e06dd --- /dev/null +++ b/src/wp-includes/blocks/post-author-name.php @@ -0,0 +1,54 @@ +context['postId'] ) ) { + return ''; + } + + $author_id = get_post_field( 'post_author', $block->context['postId'] ); + if ( empty( $author_id ) ) { + return ''; + } + + $author_name = get_the_author_meta( 'display_name', $author_id ); + if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) { + $author_name = sprintf( '', get_author_posts_url( $author_id ), esc_attr( $attributes['linkTarget'] ), $author_name ); + } + + $classes = array(); + if ( isset( $attributes['textAlign'] ) ) { + $classes[] = 'has-text-align-' . $attributes['textAlign']; + } + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; + } + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); + + return sprintf( '
    %2$s
    ', $wrapper_attributes, $author_name ); +} + +/** + * Registers the `core/post-author-name` block on the server. + */ +function register_block_core_post_author_name() { + register_block_type_from_metadata( + __DIR__ . '/post-author-name', + array( + 'render_callback' => 'render_block_core_post_author_name', + ) + ); +} +add_action( 'init', 'register_block_core_post_author_name' ); diff --git a/src/wp-includes/blocks/post-author-name/block.json b/src/wp-includes/blocks/post-author-name/block.json new file mode 100644 index 0000000000000..2340636e0c63a --- /dev/null +++ b/src/wp-includes/blocks/post-author-name/block.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "core/post-author-name", + "title": "Post Author Name", + "category": "theme", + "description": "The author name.", + "textdomain": "default", + "attributes": { + "textAlign": { + "type": "string" + }, + "isLink": { + "type": "boolean", + "default": false + }, + "linkTarget": { + "type": "string", + "default": "_self" + } + }, + "usesContext": [ "postType", "postId" ], + "supports": { + "anchor": true, + "html": false, + "spacing": { + "margin": true, + "padding": true + }, + "color": { + "gradients": true, + "link": true, + "__experimentalDefaultControls": { + "background": true, + "text": true, + "link": true + } + }, + "typography": { + "fontSize": true, + "lineHeight": true, + "__experimentalFontFamily": true, + "__experimentalFontWeight": true, + "__experimentalFontStyle": true, + "__experimentalTextTransform": true, + "__experimentalTextDecoration": true, + "__experimentalLetterSpacing": true, + "__experimentalDefaultControls": { + "fontSize": true + } + } + } +} diff --git a/src/wp-includes/blocks/post-author.php b/src/wp-includes/blocks/post-author.php index 325aa43607d22..7e6a9e6a0bd85 100644 --- a/src/wp-includes/blocks/post-author.php +++ b/src/wp-includes/blocks/post-author.php @@ -29,11 +29,23 @@ function render_block_core_post_author( $attributes, $content, $block ) { $attributes['avatarSize'] ) : null; + $link = get_author_posts_url( $author_id ); + $author_name = get_the_author_meta( 'display_name', $author_id ); + if ( ! empty( $attributes['isLink'] && ! empty( $attributes['linkTarget'] ) ) ) { + $author_name = sprintf( '%2s', esc_url( $link ), esc_attr( $attributes['linkTarget'] ), $author_name ); + } + $byline = ! empty( $attributes['byline'] ) ? $attributes['byline'] : false; - $classes = array_merge( - isset( $attributes['itemsJustification'] ) ? array( 'items-justified-' . $attributes['itemsJustification'] ) : array(), - isset( $attributes['textAlign'] ) ? array( 'has-text-align-' . $attributes['textAlign'] ) : array() - ); + $classes = array(); + if ( isset( $attributes['itemsJustification'] ) ) { + $classes[] = 'items-justified-' . $attributes['itemsJustification']; + } + if ( isset( $attributes['textAlign'] ) ) { + $classes[] = 'has-text-align-' . $attributes['textAlign']; + } + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; + } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); @@ -41,7 +53,7 @@ function render_block_core_post_author( $attributes, $content, $block ) { ( ! empty( $attributes['showAvatar'] ) ? '' : '' ) . '' . '
    '; diff --git a/src/wp-includes/blocks/post-author/block.json b/src/wp-includes/blocks/post-author/block.json index 232e20dbd0a8d..bb9f69ade07e6 100644 --- a/src/wp-includes/blocks/post-author/block.json +++ b/src/wp-includes/blocks/post-author/block.json @@ -23,10 +23,19 @@ }, "byline": { "type": "string" + }, + "isLink": { + "type": "boolean", + "default": false + }, + "linkTarget": { + "type": "string", + "default": "_self" } }, "usesContext": [ "postType", "postId", "queryId" ], "supports": { + "anchor": true, "html": false, "spacing": { "margin": true, diff --git a/src/wp-includes/blocks/post-comments-form.php b/src/wp-includes/blocks/post-comments-form.php index 53a6f8b5242a9..644b02ae0f149 100644 --- a/src/wp-includes/blocks/post-comments-form.php +++ b/src/wp-includes/blocks/post-comments-form.php @@ -22,12 +22,14 @@ function render_block_core_post_comments_form( $attributes, $content, $block ) { return; } - $classes = 'comment-respond'; // See comment further below. + $classes = array( 'comment-respond' ); // See comment further below. if ( isset( $attributes['textAlign'] ) ) { - $classes .= ' has-text-align-' . $attributes['textAlign']; + $classes[] = 'has-text-align-' . $attributes['textAlign']; } - - $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) ); + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; + } + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); add_filter( 'comment_form_defaults', 'post_comments_form_block_form_defaults' ); diff --git a/src/wp-includes/blocks/post-comments-form/block.json b/src/wp-includes/blocks/post-comments-form/block.json index 47cc0a443baee..793d14d74ba7b 100644 --- a/src/wp-includes/blocks/post-comments-form/block.json +++ b/src/wp-includes/blocks/post-comments-form/block.json @@ -13,6 +13,7 @@ }, "usesContext": [ "postId", "postType" ], "supports": { + "anchor": true, "html": false, "color": { "gradients": true, @@ -22,6 +23,10 @@ "text": true } }, + "spacing": { + "margin": true, + "padding": true + }, "typography": { "fontSize": true, "lineHeight": true, diff --git a/src/wp-includes/blocks/post-content.php b/src/wp-includes/blocks/post-content.php index 228a0d52f4069..2be1ef77b3b85 100644 --- a/src/wp-includes/blocks/post-content.php +++ b/src/wp-includes/blocks/post-content.php @@ -25,8 +25,7 @@ function render_block_core_post_content( $attributes, $content, $block ) { if ( isset( $seen_ids[ $post_id ] ) ) { // WP_DEBUG_DISPLAY must only be honored when WP_DEBUG. This precedent // is set in `wp_debug_mode()`. - $is_debug = defined( 'WP_DEBUG' ) && WP_DEBUG && - defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG_DISPLAY; + $is_debug = WP_DEBUG && WP_DEBUG_DISPLAY; return $is_debug ? // translators: Visible only in the front end, this warning takes the place of a faulty block. diff --git a/src/wp-includes/blocks/post-content/block.json b/src/wp-includes/blocks/post-content/block.json index c330f624ee142..56834a980baed 100644 --- a/src/wp-includes/blocks/post-content/block.json +++ b/src/wp-includes/blocks/post-content/block.json @@ -8,9 +8,13 @@ "textdomain": "default", "usesContext": [ "postId", "postType", "queryId" ], "supports": { + "anchor": true, "align": [ "wide", "full" ], "html": false, "__experimentalLayout": true, + "dimensions": { + "minHeight": true + }, "typography": { "fontSize": true, "lineHeight": true, diff --git a/src/wp-includes/blocks/post-date.php b/src/wp-includes/blocks/post-date.php index fc1537d156689..5c20ee30c2b39 100644 --- a/src/wp-includes/blocks/post-date.php +++ b/src/wp-includes/blocks/post-date.php @@ -18,9 +18,16 @@ function render_block_core_post_date( $attributes, $content, $block ) { return ''; } - $post_ID = $block->context['postId']; - $align_class_name = empty( $attributes['textAlign'] ) ? '' : "has-text-align-{$attributes['textAlign']}"; - $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $align_class_name ) ); + $post_ID = $block->context['postId']; + + $classes = array(); + if ( isset( $attributes['textAlign'] ) ) { + $classes[] = 'has-text-align-' . $attributes['textAlign']; + } + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; + } + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); if ( isset( $attributes['displayType'] ) && 'modified' === $attributes['displayType'] ) { $formatted_date = get_the_modified_date( empty( $attributes['format'] ) ? '' : $attributes['format'], $post_ID ); diff --git a/src/wp-includes/blocks/post-date/block.json b/src/wp-includes/blocks/post-date/block.json index b469dbe87d7e0..41c45a4a57e26 100644 --- a/src/wp-includes/blocks/post-date/block.json +++ b/src/wp-includes/blocks/post-date/block.json @@ -24,6 +24,7 @@ }, "usesContext": [ "postId", "postType", "queryId" ], "supports": { + "anchor": true, "html": false, "color": { "gradients": true, diff --git a/src/wp-includes/blocks/post-excerpt.php b/src/wp-includes/blocks/post-excerpt.php index 79cc959cd86d7..1380918fe1058 100644 --- a/src/wp-includes/blocks/post-excerpt.php +++ b/src/wp-includes/blocks/post-excerpt.php @@ -38,11 +38,14 @@ function render_block_core_post_excerpt( $attributes, $content, $block ) { * result in showing only one `read more` link at a time. */ add_filter( 'excerpt_more', $filter_excerpt_more ); - $classes = ''; + $classes = array(); if ( isset( $attributes['textAlign'] ) ) { - $classes .= "has-text-align-{$attributes['textAlign']}"; + $classes[] = 'has-text-align-' . $attributes['textAlign']; } - $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) ); + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; + } + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); $content = '

    ' . $excerpt; $show_more_on_new_line = ! isset( $attributes['showMoreOnNewLine'] ) || $attributes['showMoreOnNewLine']; diff --git a/src/wp-includes/blocks/post-excerpt/block.json b/src/wp-includes/blocks/post-excerpt/block.json index 03107ff900e06..223b4c68bde0e 100644 --- a/src/wp-includes/blocks/post-excerpt/block.json +++ b/src/wp-includes/blocks/post-excerpt/block.json @@ -20,6 +20,7 @@ }, "usesContext": [ "postId", "postType", "queryId" ], "supports": { + "anchor": true, "html": false, "color": { "gradients": true, diff --git a/src/wp-includes/blocks/post-featured-image.php b/src/wp-includes/blocks/post-featured-image.php index 068b7eeac6899..8da66accd3032 100644 --- a/src/wp-includes/blocks/post-featured-image.php +++ b/src/wp-includes/blocks/post-featured-image.php @@ -27,12 +27,19 @@ function render_block_core_post_featured_image( $attributes, $content, $block ) $is_link = isset( $attributes['isLink'] ) && $attributes['isLink']; $size_slug = isset( $attributes['sizeSlug'] ) ? $attributes['sizeSlug'] : 'post-thumbnail'; - $post_title = trim( strip_tags( get_the_title( $post_ID ) ) ); $attr = get_block_core_post_featured_image_border_attributes( $attributes ); $overlay_markup = get_block_core_post_featured_image_overlay_element_markup( $attributes ); if ( $is_link ) { - $attr['alt'] = $post_title; + if ( get_the_title( $post_ID ) ) { + $attr['alt'] = trim( strip_tags( get_the_title( $post_ID ) ) ); + } else { + $attr['alt'] = sprintf( + // translators: %d is the post ID. + __( 'Untitled post %d' ), + $post_ID + ); + } } if ( ! empty( $attributes['height'] ) ) { @@ -50,11 +57,13 @@ function render_block_core_post_featured_image( $attributes, $content, $block ) if ( $is_link ) { $link_target = $attributes['linkTarget']; $rel = ! empty( $attributes['rel'] ) ? 'rel="' . esc_attr( $attributes['rel'] ) . '"' : ''; + $height = ! empty( $attributes['height'] ) ? 'style="' . esc_attr( safecss_filter_attr( 'height:' . $attributes['height'] ) ) . '"' : ''; $featured_image = sprintf( - '%4$s%5$s', + '%5$s%6$s', get_the_permalink( $post_ID ), esc_attr( $link_target ), $rel, + $height, $featured_image, $overlay_markup ); @@ -62,10 +71,13 @@ function render_block_core_post_featured_image( $attributes, $content, $block ) $featured_image = $featured_image . $overlay_markup; } - $wrapper_attributes = empty( $attributes['width'] ) - ? get_block_wrapper_attributes() - : get_block_wrapper_attributes( array( 'style' => "width:{$attributes['width']};" ) ); - + $width = ! empty( $attributes['width'] ) ? esc_attr( safecss_filter_attr( 'width:' . $attributes['width'] ) ) . ';' : ''; + $height = ! empty( $attributes['height'] ) ? esc_attr( safecss_filter_attr( 'height:' . $attributes['height'] ) ) . ';' : ''; + if ( ! $height && ! $width ) { + $wrapper_attributes = get_block_wrapper_attributes(); + } else { + $wrapper_attributes = get_block_wrapper_attributes( array( 'style' => $width . $height ) ); + } return "

    {$featured_image}
    "; } diff --git a/src/wp-includes/blocks/post-featured-image/block.json b/src/wp-includes/blocks/post-featured-image/block.json index 40f51cffa06e7..e6c8c3bfbbd3f 100644 --- a/src/wp-includes/blocks/post-featured-image/block.json +++ b/src/wp-includes/blocks/post-featured-image/block.json @@ -53,6 +53,7 @@ "usesContext": [ "postId", "postType", "queryId" ], "supports": { "align": [ "left", "right", "center", "wide", "full" ], + "anchor": true, "color": { "__experimentalDuotone": "img, .wp-block-post-featured-image__placeholder, .components-placeholder__illustration, .components-placeholder::before", "text": false, diff --git a/src/wp-includes/blocks/post-navigation-link.php b/src/wp-includes/blocks/post-navigation-link.php index b0677e4b3ebf3..cb1fe568bdf0e 100644 --- a/src/wp-includes/blocks/post-navigation-link.php +++ b/src/wp-includes/blocks/post-navigation-link.php @@ -34,6 +34,18 @@ function render_block_core_post_navigation_link( $attributes, $content ) { $link = 'next' === $navigation_type ? _x( 'Next', 'label for next post link' ) : _x( 'Previous', 'label for previous post link' ); $label = ''; + $arrow_map = array( + 'none' => '', + 'arrow' => array( + 'next' => '→', + 'previous' => '←', + ), + 'chevron' => array( + 'next' => '»', + 'previous' => '«', + ), + ); + // If a custom label is provided, make this a link. // `$label` is used to prepend the provided label, if we want to show the page title as well. if ( isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ) { @@ -71,6 +83,17 @@ function render_block_core_post_navigation_link( $attributes, $content ) { } } + // Display arrows. + if ( isset( $attributes['arrow'] ) && ! empty( $attributes['arrow'] ) && 'none' !== $attributes['arrow'] ) { + $arrow = $arrow_map[ $attributes['arrow'] ][ $navigation_type ]; + + if ( 'next' === $navigation_type ) { + $format = '%link '; + } else { + $format = ' %link'; + } + } + // The dynamic portion of the function name, `$navigation_type`, // refers to the type of adjacency, 'next' or 'previous'. $get_link_function = "get_{$navigation_type}_post_link"; diff --git a/src/wp-includes/blocks/post-navigation-link/block.json b/src/wp-includes/blocks/post-navigation-link/block.json index c7e53bdce0af3..2bdfa654798ee 100644 --- a/src/wp-includes/blocks/post-navigation-link/block.json +++ b/src/wp-includes/blocks/post-navigation-link/block.json @@ -24,9 +24,14 @@ "linkLabel": { "type": "boolean", "default": false + }, + "arrow": { + "type": "string", + "default": "none" } }, "supports": { + "anchor": true, "reusable": false, "html": false, "color": { @@ -45,5 +50,6 @@ "fontSize": true } } - } + }, + "style": "wp-block-post-navigation-link" } diff --git a/src/wp-includes/blocks/post-template.php b/src/wp-includes/blocks/post-template.php index c12a0e68b8e24..3a3c207cf92ee 100644 --- a/src/wp-includes/blocks/post-template.php +++ b/src/wp-includes/blocks/post-template.php @@ -68,8 +68,11 @@ function render_block_core_post_template( $attributes, $content, $block ) { $classnames = "is-flex-container columns-{$block->context['displayLayout']['columns']}"; } } + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classnames .= ' has-link-color'; + } - $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classnames ) ); + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => trim( $classnames ) ) ); $content = ''; while ( $query->have_posts() ) { diff --git a/src/wp-includes/blocks/post-template/block.json b/src/wp-includes/blocks/post-template/block.json index 380b6d55f71fa..c0fc0d6ff8e7e 100644 --- a/src/wp-includes/blocks/post-template/block.json +++ b/src/wp-includes/blocks/post-template/block.json @@ -19,9 +19,18 @@ "reusable": false, "html": false, "align": true, + "anchor": true, "__experimentalLayout": { "allowEditing": false }, + "color": { + "gradients": true, + "link": true, + "__experimentalDefaultControls": { + "background": true, + "text": true + } + }, "typography": { "fontSize": true, "lineHeight": true, diff --git a/src/wp-includes/blocks/post-terms.php b/src/wp-includes/blocks/post-terms.php index f98baba65ec63..5511dd2f8e885 100644 --- a/src/wp-includes/blocks/post-terms.php +++ b/src/wp-includes/blocks/post-terms.php @@ -27,14 +27,17 @@ function render_block_core_post_terms( $attributes, $content, $block ) { return ''; } - $classes = 'taxonomy-' . $attributes['term']; + $classes = array( 'taxonomy-' . $attributes['term'] ); if ( isset( $attributes['textAlign'] ) ) { - $classes .= ' has-text-align-' . $attributes['textAlign']; + $classes[] = 'has-text-align-' . $attributes['textAlign']; + } + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; } $separator = empty( $attributes['separator'] ) ? ' ' : $attributes['separator']; - $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) ); + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); $prefix = "
    "; if ( isset( $attributes['prefix'] ) && $attributes['prefix'] ) { diff --git a/src/wp-includes/blocks/post-terms/block.json b/src/wp-includes/blocks/post-terms/block.json index 26f3915d5b0e0..1633c7c01b82c 100644 --- a/src/wp-includes/blocks/post-terms/block.json +++ b/src/wp-includes/blocks/post-terms/block.json @@ -28,6 +28,7 @@ }, "usesContext": [ "postId", "postType" ], "supports": { + "anchor": true, "html": false, "color": { "gradients": true, @@ -38,6 +39,10 @@ "link": true } }, + "spacing": { + "margin": true, + "padding": true + }, "typography": { "fontSize": true, "lineHeight": true, diff --git a/src/wp-includes/blocks/post-title.php b/src/wp-includes/blocks/post-title.php index 125a2d81ddcbe..1f03b12fc2b46 100644 --- a/src/wp-includes/blocks/post-title.php +++ b/src/wp-includes/blocks/post-title.php @@ -26,9 +26,7 @@ function render_block_core_post_title( $attributes, $content, $block ) { return ''; } - $tag_name = 'h2'; - $align_class_name = empty( $attributes['textAlign'] ) ? '' : "has-text-align-{$attributes['textAlign']}"; - + $tag_name = 'h2'; if ( isset( $attributes['level'] ) ) { $tag_name = 0 === $attributes['level'] ? 'p' : 'h' . $attributes['level']; } @@ -37,7 +35,15 @@ function render_block_core_post_title( $attributes, $content, $block ) { $rel = ! empty( $attributes['rel'] ) ? 'rel="' . esc_attr( $attributes['rel'] ) . '"' : ''; $title = sprintf( '%4$s', get_the_permalink( $post_ID ), esc_attr( $attributes['linkTarget'] ), $rel, $title ); } - $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $align_class_name ) ); + + $classes = array(); + if ( isset( $attributes['textAlign'] ) ) { + $classes[] = 'has-text-align-' . $attributes['textAlign']; + } + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; + } + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); return sprintf( '<%1$s %2$s>%3$s', diff --git a/src/wp-includes/blocks/post-title/block.json b/src/wp-includes/blocks/post-title/block.json index 015896ff1bad0..4a56a6f37b779 100644 --- a/src/wp-includes/blocks/post-title/block.json +++ b/src/wp-includes/blocks/post-title/block.json @@ -31,6 +31,7 @@ }, "supports": { "align": [ "wide", "full" ], + "anchor": true, "html": false, "color": { "gradients": true, diff --git a/src/wp-includes/blocks/query-no-results.php b/src/wp-includes/blocks/query-no-results.php index 6d4dad48f49e0..4342ba57cccbd 100644 --- a/src/wp-includes/blocks/query-no-results.php +++ b/src/wp-includes/blocks/query-no-results.php @@ -40,9 +40,11 @@ function render_block_core_query_no_results( $attributes, $content, $block ) { wp_reset_postdata(); } + $classes = ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) ? 'has-link-color' : ''; + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) ); return sprintf( '
    %2$s
    ', - get_block_wrapper_attributes(), + $wrapper_attributes, $content ); } diff --git a/src/wp-includes/blocks/query-no-results/block.json b/src/wp-includes/blocks/query-no-results/block.json index f042223f36aec..789dcc8e66f60 100644 --- a/src/wp-includes/blocks/query-no-results/block.json +++ b/src/wp-includes/blocks/query-no-results/block.json @@ -9,6 +9,7 @@ "textdomain": "default", "usesContext": [ "queryId", "query" ], "supports": { + "anchor": true, "align": true, "reusable": false, "html": false, diff --git a/src/wp-includes/blocks/query-pagination-next/block.json b/src/wp-includes/blocks/query-pagination-next/block.json index ad87d05b5ed99..d4861519f149e 100644 --- a/src/wp-includes/blocks/query-pagination-next/block.json +++ b/src/wp-includes/blocks/query-pagination-next/block.json @@ -14,6 +14,7 @@ }, "usesContext": [ "queryId", "query", "paginationArrow" ], "supports": { + "anchor": true, "reusable": false, "html": false, "color": { diff --git a/src/wp-includes/blocks/query-pagination-numbers/block.json b/src/wp-includes/blocks/query-pagination-numbers/block.json index fd28596581961..a05faff5f1b52 100644 --- a/src/wp-includes/blocks/query-pagination-numbers/block.json +++ b/src/wp-includes/blocks/query-pagination-numbers/block.json @@ -9,6 +9,7 @@ "textdomain": "default", "usesContext": [ "queryId", "query" ], "supports": { + "anchor": true, "reusable": false, "html": false, "color": { diff --git a/src/wp-includes/blocks/query-pagination-previous/block.json b/src/wp-includes/blocks/query-pagination-previous/block.json index 484cefe6bbd82..823808b0fb054 100644 --- a/src/wp-includes/blocks/query-pagination-previous/block.json +++ b/src/wp-includes/blocks/query-pagination-previous/block.json @@ -14,6 +14,7 @@ }, "usesContext": [ "queryId", "query", "paginationArrow" ], "supports": { + "anchor": true, "reusable": false, "html": false, "color": { diff --git a/src/wp-includes/blocks/query-pagination.php b/src/wp-includes/blocks/query-pagination.php index eaa784be08e7d..9b7289ec22e0f 100644 --- a/src/wp-includes/blocks/query-pagination.php +++ b/src/wp-includes/blocks/query-pagination.php @@ -18,9 +18,11 @@ function render_block_core_query_pagination( $attributes, $content ) { return ''; } + $classes = ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) ? 'has-link-color' : ''; $wrapper_attributes = get_block_wrapper_attributes( array( 'aria-label' => __( 'Pagination' ), + 'class' => $classes, ) ); diff --git a/src/wp-includes/blocks/query-pagination/block.json b/src/wp-includes/blocks/query-pagination/block.json index f75f4077d4e13..fa980575ec969 100644 --- a/src/wp-includes/blocks/query-pagination/block.json +++ b/src/wp-includes/blocks/query-pagination/block.json @@ -18,6 +18,7 @@ "paginationArrow": "paginationArrow" }, "supports": { + "anchor": true, "align": true, "reusable": false, "html": false, diff --git a/src/wp-includes/blocks/query-title/block.json b/src/wp-includes/blocks/query-title/block.json index 33df75866bce0..029762c321e39 100644 --- a/src/wp-includes/blocks/query-title/block.json +++ b/src/wp-includes/blocks/query-title/block.json @@ -27,6 +27,7 @@ } }, "supports": { + "anchor": true, "align": [ "wide", "full" ], "html": false, "color": { diff --git a/src/wp-includes/blocks/query/block.json b/src/wp-includes/blocks/query/block.json index cd09e22ee57f7..bcff0e3ac63b1 100644 --- a/src/wp-includes/blocks/query/block.json +++ b/src/wp-includes/blocks/query/block.json @@ -49,15 +49,8 @@ }, "supports": { "align": [ "wide", "full" ], + "anchor": true, "html": false, - "color": { - "gradients": true, - "link": true, - "__experimentalDefaultControls": { - "background": true, - "text": true - } - }, "__experimentalLayout": true }, "editorStyle": "wp-block-query-editor" diff --git a/src/wp-includes/blocks/read-more.php b/src/wp-includes/blocks/read-more.php index 93013b2517d14..7bfd22e6d4c4d 100644 --- a/src/wp-includes/blocks/read-more.php +++ b/src/wp-includes/blocks/read-more.php @@ -19,15 +19,22 @@ function render_block_core_read_more( $attributes, $content, $block ) { } $post_ID = $block->context['postId']; + $post_title = get_the_title( $post_ID ); + $screen_reader_text = sprintf( + /* translators: %s is either the post title or post ID to describe the link for screen readers. */ + __( ': %s' ), + '' !== $post_title ? $post_title : __( 'untitled post ' ) . $post_ID + ); $justify_class_name = empty( $attributes['justifyContent'] ) ? '' : "is-justified-{$attributes['justifyContent']}"; $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $justify_class_name ) ); $more_text = ! empty( $attributes['content'] ) ? wp_kses_post( $attributes['content'] ) : __( 'Read more' ); return sprintf( - '%4s', + '%4s%5s', $wrapper_attributes, get_the_permalink( $post_ID ), esc_attr( $attributes['linkTarget'] ), - $more_text + $more_text, + $screen_reader_text ); } diff --git a/src/wp-includes/blocks/read-more/block.json b/src/wp-includes/blocks/read-more/block.json index 61b0452c7c80e..ed2b23c3b7f0f 100644 --- a/src/wp-includes/blocks/read-more/block.json +++ b/src/wp-includes/blocks/read-more/block.json @@ -17,6 +17,7 @@ }, "usesContext": [ "postId" ], "supports": { + "anchor": true, "html": false, "color": { "gradients": true, diff --git a/src/wp-includes/blocks/require-dynamic-blocks.php b/src/wp-includes/blocks/require-dynamic-blocks.php index 4841d214c84ce..1f9bf0a16c802 100644 --- a/src/wp-includes/blocks/require-dynamic-blocks.php +++ b/src/wp-includes/blocks/require-dynamic-blocks.php @@ -22,6 +22,7 @@ require_once ABSPATH . WPINC . '/blocks/cover.php'; require_once ABSPATH . WPINC . '/blocks/file.php'; require_once ABSPATH . WPINC . '/blocks/gallery.php'; +require_once ABSPATH . WPINC . '/blocks/heading.php'; require_once ABSPATH . WPINC . '/blocks/home-link.php'; require_once ABSPATH . WPINC . '/blocks/image.php'; require_once ABSPATH . WPINC . '/blocks/latest-comments.php'; @@ -34,6 +35,7 @@ require_once ABSPATH . WPINC . '/blocks/pattern.php'; require_once ABSPATH . WPINC . '/blocks/post-author.php'; require_once ABSPATH . WPINC . '/blocks/post-author-biography.php'; +require_once ABSPATH . WPINC . '/blocks/post-author-name.php'; require_once ABSPATH . WPINC . '/blocks/post-comments-form.php'; require_once ABSPATH . WPINC . '/blocks/post-content.php'; require_once ABSPATH . WPINC . '/blocks/post-date.php'; diff --git a/src/wp-includes/blocks/require-static-blocks.php b/src/wp-includes/blocks/require-static-blocks.php index 9a1884e9cf09b..44009bef5fff0 100644 --- a/src/wp-includes/blocks/require-static-blocks.php +++ b/src/wp-includes/blocks/require-static-blocks.php @@ -12,7 +12,6 @@ 'embed', 'freeform', 'group', - 'heading', 'html', 'list', 'list-item', @@ -20,6 +19,7 @@ 'missing', 'more', 'nextpage', + 'page-list-item', 'paragraph', 'preformatted', 'pullquote', diff --git a/src/wp-includes/blocks/rss.php b/src/wp-includes/blocks/rss.php index e32155195af1d..91cdab3f589e0 100644 --- a/src/wp-includes/blocks/rss.php +++ b/src/wp-includes/blocks/rss.php @@ -48,7 +48,7 @@ function render_block_core_rss( $attributes ) { if ( $date ) { $date = sprintf( ' ', - esc_attr( date_i18n( get_option( 'c' ), $date ) ), + esc_attr( date_i18n( 'c', $date ) ), esc_attr( date_i18n( get_option( 'date_format' ), $date ) ) ); } diff --git a/src/wp-includes/blocks/rss/block.json b/src/wp-includes/blocks/rss/block.json index 8a351d877a751..2e3fd4b2d385e 100644 --- a/src/wp-includes/blocks/rss/block.json +++ b/src/wp-includes/blocks/rss/block.json @@ -43,6 +43,7 @@ }, "supports": { "align": true, + "anchor": true, "html": false }, "editorStyle": "wp-block-rss-editor", diff --git a/src/wp-includes/blocks/search.php b/src/wp-includes/blocks/search.php index 26b6a7585ccc7..c7461a86795b5 100644 --- a/src/wp-includes/blocks/search.php +++ b/src/wp-includes/blocks/search.php @@ -66,14 +66,14 @@ function render_block_core_search( $attributes ) { if ( $show_input ) { $input_classes = array( 'wp-block-search__input' ); - if ( $is_button_inside ) { + if ( ! $is_button_inside && ! empty( $border_color_classes ) ) { $input_classes[] = $border_color_classes; } if ( ! empty( $typography_classes ) ) { $input_classes[] = $typography_classes; } $input_markup = sprintf( - '', + '', $input_id, esc_attr( implode( ' ', $input_classes ) ), get_search_query(), diff --git a/src/wp-includes/blocks/search/block.json b/src/wp-includes/blocks/search/block.json index fbd0fa874c408..387295ebb36de 100644 --- a/src/wp-includes/blocks/search/block.json +++ b/src/wp-includes/blocks/search/block.json @@ -46,6 +46,7 @@ }, "supports": { "align": [ "left", "center", "right" ], + "anchor": true, "color": { "gradients": true, "__experimentalSkipSerialization": true, diff --git a/src/wp-includes/blocks/site-logo/block.json b/src/wp-includes/blocks/site-logo/block.json index f7efcb72159ff..f5eab1de304bc 100644 --- a/src/wp-includes/blocks/site-logo/block.json +++ b/src/wp-includes/blocks/site-logo/block.json @@ -31,6 +31,7 @@ }, "supports": { "html": false, + "anchor": true, "align": true, "alignWide": false, "color": { diff --git a/src/wp-includes/blocks/site-tagline/block.json b/src/wp-includes/blocks/site-tagline/block.json index 7a69e6b1e22a9..c7da7ebf3fdde 100644 --- a/src/wp-includes/blocks/site-tagline/block.json +++ b/src/wp-includes/blocks/site-tagline/block.json @@ -4,7 +4,7 @@ "name": "core/site-tagline", "title": "Site Tagline", "category": "theme", - "description": "Describe in a few words what the site is about. The tagline can be used in search results or when sharing on social networks even if it's not displayed in the theme design.", + "description": "Describe in a few words what the site is about. The tagline can be used in search results or when sharing on social networks even if it’s not displayed in the theme design.", "keywords": [ "description" ], "textdomain": "default", "attributes": { @@ -13,6 +13,7 @@ } }, "supports": { + "anchor": true, "align": [ "wide", "full" ], "html": false, "color": { diff --git a/src/wp-includes/blocks/site-title.php b/src/wp-includes/blocks/site-title.php index 3c3e4d8669238..255615b3a4e45 100644 --- a/src/wp-includes/blocks/site-title.php +++ b/src/wp-includes/blocks/site-title.php @@ -18,8 +18,11 @@ function render_block_core_site_title( $attributes ) { return; } - $tag_name = 'h1'; - $align_class_name = empty( $attributes['textAlign'] ) ? '' : "has-text-align-{$attributes['textAlign']}"; + $tag_name = 'h1'; + $classes = empty( $attributes['textAlign'] ) ? '' : "has-text-align-{$attributes['textAlign']}"; + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes .= ' has-link-color'; + } if ( isset( $attributes['level'] ) ) { $tag_name = 0 === $attributes['level'] ? 'p' : 'h' . (int) $attributes['level']; @@ -37,7 +40,7 @@ function render_block_core_site_title( $attributes ) { esc_html( $site_title ) ); } - $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $align_class_name ) ); + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => trim( $classes ) ) ); return sprintf( '<%1$s %2$s>%3$s', diff --git a/src/wp-includes/blocks/site-title/block.json b/src/wp-includes/blocks/site-title/block.json index 717db27747d7f..b69acda934fda 100644 --- a/src/wp-includes/blocks/site-title/block.json +++ b/src/wp-includes/blocks/site-title/block.json @@ -27,6 +27,7 @@ "viewportWidth": 500 }, "supports": { + "anchor": true, "align": [ "wide", "full" ], "html": false, "color": { @@ -60,5 +61,6 @@ } } }, - "editorStyle": "wp-block-site-title-editor" + "editorStyle": "wp-block-site-title-editor", + "style": "wp-block-site-title" } diff --git a/src/wp-includes/blocks/social-link.php b/src/wp-includes/blocks/social-link.php index 3aabd2a9a8430..7e669bf56d6da 100644 --- a/src/wp-includes/blocks/social-link.php +++ b/src/wp-includes/blocks/social-link.php @@ -20,6 +20,7 @@ function render_block_core_social_link( $attributes, $content, $block ) { $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 ); + $rel = ( isset( $attributes['rel'] ) ) ? $attributes['rel'] : ''; $show_labels = array_key_exists( 'showLabels', $block->context ) ? $block->context['showLabels'] : false; // Don't render a link if there is no URL set. @@ -43,11 +44,6 @@ function render_block_core_social_link( $attributes, $content, $block ) { $url = 'https://' . $url; } - $rel_target_attributes = ''; - if ( $open_in_new_tab ) { - $rel_target_attributes = 'rel="noopener nofollow" target="_blank"'; - } - $icon = block_core_social_link_get_icon( $service ); $wrapper_attributes = get_block_wrapper_attributes( array( @@ -57,13 +53,21 @@ function render_block_core_social_link( $attributes, $content, $block ) { ); $link = '
  • '; - $link .= ''; + $link .= ''; $link .= $icon; $link .= ''; $link .= esc_html( $label ); $link .= '
  • '; - return $link; + $w = new WP_HTML_Tag_Processor( $link ); + $w->next_tag( 'a' ); + if ( $open_in_new_tab ) { + $w->set_attribute( 'rel', esc_attr( $rel ) . ' noopener nofollow' ); + $w->set_attribute( 'target', '_blank' ); + } elseif ( '' !== $rel ) { + $w->set_attribute( 'rel', esc_attr( $rel ) ); + } + return $w; } /** diff --git a/src/wp-includes/blocks/social-link/block.json b/src/wp-includes/blocks/social-link/block.json index 90a3f270d738d..e81894591b4b3 100644 --- a/src/wp-includes/blocks/social-link/block.json +++ b/src/wp-includes/blocks/social-link/block.json @@ -16,6 +16,9 @@ }, "label": { "type": "string" + }, + "rel": { + "type": "string" } }, "usesContext": [ @@ -25,6 +28,7 @@ "iconBackgroundColorValue" ], "supports": { + "anchor": true, "reusable": false, "html": false }, diff --git a/src/wp-includes/blocks/table/block.json b/src/wp-includes/blocks/table/block.json index 3de088e0879b7..adac1e9c2130e 100644 --- a/src/wp-includes/blocks/table/block.json +++ b/src/wp-includes/blocks/table/block.json @@ -47,6 +47,16 @@ "type": "string", "source": "attribute", "attribute": "data-align" + }, + "colspan": { + "type": "string", + "source": "attribute", + "attribute": "colspan" + }, + "rowspan": { + "type": "string", + "source": "attribute", + "attribute": "rowspan" } } } @@ -82,6 +92,16 @@ "type": "string", "source": "attribute", "attribute": "data-align" + }, + "colspan": { + "type": "string", + "source": "attribute", + "attribute": "colspan" + }, + "rowspan": { + "type": "string", + "source": "attribute", + "attribute": "rowspan" } } } @@ -117,6 +137,16 @@ "type": "string", "source": "attribute", "attribute": "data-align" + }, + "colspan": { + "type": "string", + "source": "attribute", + "attribute": "colspan" + }, + "rowspan": { + "type": "string", + "source": "attribute", + "attribute": "rowspan" } } } diff --git a/src/wp-includes/blocks/tag-cloud.php b/src/wp-includes/blocks/tag-cloud.php index a7d121f7ca632..7ff5f78400db6 100644 --- a/src/wp-includes/blocks/tag-cloud.php +++ b/src/wp-includes/blocks/tag-cloud.php @@ -28,14 +28,7 @@ function render_block_core_tag_cloud( $attributes ) { $tag_cloud = wp_tag_cloud( $args ); if ( ! $tag_cloud ) { - $labels = get_taxonomy_labels( get_taxonomy( $attributes['taxonomy'] ) ); - $tag_cloud = esc_html( - sprintf( - /* translators: %s: taxonomy name */ - __( 'Your site doesn’t have any %s, so there’s nothing to display here at the moment.' ), - strtolower( $labels->name ) - ) - ); + $tag_cloud = __( 'There’s no content to show here yet.' ); } $wrapper_attributes = get_block_wrapper_attributes(); diff --git a/src/wp-includes/blocks/tag-cloud/block.json b/src/wp-includes/blocks/tag-cloud/block.json index 69e14223f70fb..ec1e333512719 100644 --- a/src/wp-includes/blocks/tag-cloud/block.json +++ b/src/wp-includes/blocks/tag-cloud/block.json @@ -36,10 +36,19 @@ ], "supports": { "html": false, + "anchor": true, "align": true, "spacing": { "margin": true, "padding": true + }, + "typography": { + "lineHeight": true, + "__experimentalFontFamily": true, + "__experimentalFontWeight": true, + "__experimentalFontStyle": true, + "__experimentalTextTransform": true, + "__experimentalLetterSpacing": true } }, "editorStyle": "wp-block-tag-cloud-editor" diff --git a/src/wp-includes/blocks/template-part.php b/src/wp-includes/blocks/template-part.php index bef49341d7bb5..7c4cb693fde54 100644 --- a/src/wp-includes/blocks/template-part.php +++ b/src/wp-includes/blocks/template-part.php @@ -105,8 +105,7 @@ function render_block_core_template_part( $attributes ) { // WP_DEBUG_DISPLAY must only be honored when WP_DEBUG. This precedent // is set in `wp_debug_mode()`. - $is_debug = defined( 'WP_DEBUG' ) && WP_DEBUG && - defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG_DISPLAY; + $is_debug = WP_DEBUG && WP_DEBUG_DISPLAY; if ( is_null( $content ) && $is_debug ) { if ( ! isset( $attributes['slug'] ) ) { @@ -127,6 +126,21 @@ function render_block_core_template_part( $attributes ) { ''; } + // Look up area definition. + $area_definition = null; + $defined_areas = get_allowed_block_template_part_areas(); + foreach ( $defined_areas as $defined_area ) { + if ( $defined_area['area'] === $area ) { + $area_definition = $defined_area; + break; + } + } + + // If $area is not allowed, set it back to the uncategorized default. + if ( ! $area_definition ) { + $area = WP_TEMPLATE_PART_AREA_UNCATEGORIZED; + } + // Run through the actions that are typically taken on the_content. $seen_ids[ $template_part_id ] = true; $content = do_blocks( $content ); @@ -134,7 +148,7 @@ function render_block_core_template_part( $attributes ) { $content = wptexturize( $content ); $content = convert_smilies( $content ); $content = shortcode_unautop( $content ); - $content = wp_filter_content_tags( $content ); + $content = wp_filter_content_tags( $content, "template_part_{$area}" ); $content = do_shortcode( $content ); // Handle embeds for block template parts. @@ -142,12 +156,9 @@ function render_block_core_template_part( $attributes ) { $content = $wp_embed->autoembed( $content ); if ( empty( $attributes['tagName'] ) ) { - $defined_areas = get_allowed_block_template_part_areas(); - $area_tag = 'div'; - foreach ( $defined_areas as $defined_area ) { - if ( $defined_area['area'] === $area && isset( $defined_area['area_tag'] ) ) { - $area_tag = $defined_area['area_tag']; - } + $area_tag = 'div'; + if ( $area_definition && isset( $area_definition['area_tag'] ) ) { + $area_tag = $area_definition['area_tag']; } $html_tag = $area_tag; } else { diff --git a/src/wp-includes/blocks/template-part/block.json b/src/wp-includes/blocks/template-part/block.json index 3801eee941bc9..282ac2ca22127 100644 --- a/src/wp-includes/blocks/template-part/block.json +++ b/src/wp-includes/blocks/template-part/block.json @@ -21,6 +21,7 @@ } }, "supports": { + "anchor": true, "align": true, "html": false, "reusable": false diff --git a/src/wp-includes/blocks/term-description.php b/src/wp-includes/blocks/term-description.php index 4f1cd7e518d11..011ec28f2e5e6 100644 --- a/src/wp-includes/blocks/term-description.php +++ b/src/wp-includes/blocks/term-description.php @@ -23,10 +23,14 @@ function render_block_core_term_description( $attributes ) { return ''; } - $extra_attributes = ( isset( $attributes['textAlign'] ) ) - ? array( 'class' => 'has-text-align-' . $attributes['textAlign'] ) - : array(); - $wrapper_attributes = get_block_wrapper_attributes( $extra_attributes ); + $classes = array(); + if ( isset( $attributes['textAlign'] ) ) { + $classes[] = 'has-text-align-' . $attributes['textAlign']; + } + if ( isset( $attributes['style']['elements']['link']['color']['text'] ) ) { + $classes[] = 'has-link-color'; + } + $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) ); return '
    ' . $term_description . '
    '; } diff --git a/src/wp-includes/blocks/term-description/block.json b/src/wp-includes/blocks/term-description/block.json index 66eb9348a4709..5e945b2d0f637 100644 --- a/src/wp-includes/blocks/term-description/block.json +++ b/src/wp-includes/blocks/term-description/block.json @@ -12,6 +12,7 @@ } }, "supports": { + "anchor": true, "align": [ "wide", "full" ], "html": false, "color": { diff --git a/src/wp-includes/class-wp-block-parser.php b/src/wp-includes/class-wp-block-parser.php index 95add35cbfb6f..50337b588a37b 100644 --- a/src/wp-includes/class-wp-block-parser.php +++ b/src/wp-includes/class-wp-block-parser.php @@ -80,7 +80,7 @@ class WP_Block_Parser_Block { * @param string $innerHTML Resultant HTML from inside block comment delimiters after removing inner blocks. * @param array $innerContent List of string fragments and null markers where inner blocks were found. */ - function __construct( $name, $attrs, $innerBlocks, $innerHTML, $innerContent ) { + public function __construct( $name, $attrs, $innerBlocks, $innerHTML, $innerContent ) { $this->blockName = $name; $this->attrs = $attrs; $this->innerBlocks = $innerBlocks; @@ -152,7 +152,7 @@ class WP_Block_Parser_Frame { * @param int $prev_offset Byte offset into document for after parse token ends. * @param int $leading_html_start Byte offset into document where leading HTML before token starts. */ - function __construct( $block, $token_start, $token_length, $prev_offset = null, $leading_html_start = null ) { + public function __construct( $block, $token_start, $token_length, $prev_offset = null, $leading_html_start = null ) { $this->block = $block; $this->token_start = $token_start; $this->token_length = $token_length; @@ -224,16 +224,16 @@ class WP_Block_Parser { * @param string $document Input document being parsed. * @return array[] */ - function parse( $document ) { + public function parse( $document ) { $this->document = $document; $this->offset = 0; $this->output = array(); $this->stack = array(); $this->empty_attrs = json_decode( '{}', true ); - do { - // twiddle our thumbs. - } while ( $this->proceed() ); + while ( $this->proceed() ) { + continue; + } return $this->output; } @@ -252,7 +252,7 @@ function parse( $document ) { * @since 5.0.0 * @return bool */ - function proceed() { + public function proceed() { $next_token = $this->next_token(); list( $token_type, $block_name, $attrs, $start_offset, $token_length ) = $next_token; $stack_depth = count( $this->stack ); @@ -398,7 +398,7 @@ function proceed() { * @since 4.6.1 fixed a bug in attribute parsing which caused catastrophic backtracking on invalid block comments * @return array */ - function next_token() { + public function next_token() { $matches = null; /* @@ -473,7 +473,7 @@ function next_token() { * @param string $innerHTML HTML content of block. * @return WP_Block_Parser_Block freeform block object. */ - function freeform( $innerHTML ) { + public function freeform( $innerHTML ) { return new WP_Block_Parser_Block( null, $this->empty_attrs, array(), $innerHTML, array( $innerHTML ) ); } @@ -485,7 +485,7 @@ function freeform( $innerHTML ) { * @since 5.0.0 * @param null $length how many bytes of document text to output. */ - function add_freeform( $length = null ) { + public function add_freeform( $length = null ) { $length = $length ? $length : strlen( $this->document ) - $this->offset; if ( 0 === $length ) { @@ -506,7 +506,7 @@ function add_freeform( $length = null ) { * @param int $token_length Byte length of entire block from start of opening token to end of closing token. * @param int|null $last_offset Last byte offset into document if continuing form earlier output. */ - function add_inner_block( WP_Block_Parser_Block $block, $token_start, $token_length, $last_offset = null ) { + public function add_inner_block( WP_Block_Parser_Block $block, $token_start, $token_length, $last_offset = null ) { $parent = $this->stack[ count( $this->stack ) - 1 ]; $parent->block->innerBlocks[] = (array) $block; $html = substr( $this->document, $parent->prev_offset, $token_start - $parent->prev_offset ); @@ -527,7 +527,7 @@ function add_inner_block( WP_Block_Parser_Block $block, $token_start, $token_len * @since 5.0.0 * @param int|null $end_offset byte offset into document for where we should stop sending text output as HTML. */ - function add_block_from_stack( $end_offset = null ) { + public function add_block_from_stack( $end_offset = null ) { $stack_top = array_pop( $this->stack ); $prev_offset = $stack_top->prev_offset; diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index de52578936989..10078c87f1f1d 100644 --- a/src/wp-includes/script-loader.php +++ b/src/wp-includes/script-loader.php @@ -104,8 +104,8 @@ function wp_default_packages_vendor( $scripts ) { ); $vendor_scripts_versions = array( - 'react' => '17.0.1', - 'react-dom' => '17.0.1', + 'react' => '18.2.0', + 'react-dom' => '18.2.0', 'regenerator-runtime' => '0.13.9', 'moment' => '2.29.4', 'lodash' => '4.17.19', @@ -1609,6 +1609,12 @@ function wp_default_styles( $styles ) { array() ); + $styles->add( + 'wp-block-editor-content', + "/wp-includes/css/dist/block-editor/content$suffix.css", + array() + ); + $wp_edit_blocks_dependencies = array( 'wp-components', 'wp-editor', @@ -1617,6 +1623,7 @@ function wp_default_styles( $styles ) { 'wp-reset-editor-styles', 'wp-block-library', 'wp-reusable-blocks', + 'wp-block-editor-content', ); // Only load the default layout and margin styles for themes without theme.json file. diff --git a/tests/phpunit/includes/unregister-blocks-hooks.php b/tests/phpunit/includes/unregister-blocks-hooks.php index df08612e8c490..5edeba144582c 100644 --- a/tests/phpunit/includes/unregister-blocks-hooks.php +++ b/tests/phpunit/includes/unregister-blocks-hooks.php @@ -21,6 +21,7 @@ remove_action( 'init', 'register_block_core_cover' ); remove_action( 'init', 'register_block_core_file' ); remove_action( 'init', 'register_block_core_gallery' ); +remove_action( 'init', 'register_block_core_heading' ); remove_action( 'init', 'register_block_core_home_link' ); remove_action( 'init', 'register_block_core_image' ); remove_action( 'init', 'register_block_core_latest_comments' ); @@ -33,6 +34,7 @@ remove_action( 'init', 'register_block_core_pattern' ); remove_action( 'init', 'register_block_core_post_author' ); remove_action( 'init', 'register_block_core_post_author_biography' ); +remove_action( 'init', 'register_block_core_post_author_name' ); remove_action( 'init', 'register_block_core_post_comments_form' ); remove_action( 'init', 'register_block_core_post_content' ); remove_action( 'init', 'register_block_core_post_date' ); From 384c6b937dd05ef840642fd56e63ad2ed0fea1fc Mon Sep 17 00:00:00 2001 From: ntsekouras Date: Wed, 1 Feb 2023 20:20:13 +0200 Subject: [PATCH 23/23] backport layout support changes --- src/wp-includes/block-supports/layout.php | 111 ++++++++++++++++++++-- 1 file changed, 105 insertions(+), 6 deletions(-) diff --git a/src/wp-includes/block-supports/layout.php b/src/wp-includes/block-supports/layout.php index 93c7364a323b6..0db060dc4c2ca 100644 --- a/src/wp-includes/block-supports/layout.php +++ b/src/wp-includes/block-supports/layout.php @@ -298,6 +298,25 @@ function wp_get_layout_style( $selector, $layout, $has_block_gap_support = false return ''; } +/** + * Gets classname from last tag in a string of HTML. + * + * @since 6.2.0 + * + * @param string $html markup to be processed. + * @return string String of inner wrapper classnames. + */ +function wp_get_classnames_from_last_tag( $html ) { + $tags = new WP_HTML_Tag_Processor( $html ); + $last_classnames = ''; + + while ( $tags->next_tag() ) { + $last_classnames = $tags->get_attribute( 'class' ); + } + + return (string) $last_classnames; +} + /** * Renders the layout config to the block wrapper. * @@ -309,13 +328,60 @@ function wp_get_layout_style( $selector, $layout, $has_block_gap_support = false * @return string Filtered block content. */ function wp_render_layout_support_flag( $block_content, $block ) { - $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] ); - $support_layout = block_has_support( $block_type, array( '__experimentalLayout' ), false ); + $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] ); + $support_layout = block_has_support( $block_type, array( '__experimentalLayout' ), false ); + $has_child_layout = isset( $block['attrs']['style']['layout']['selfStretch'] ); - if ( ! $support_layout ) { + if ( ! $support_layout + && ! $has_child_layout ) { return $block_content; } + $outer_class_names = array(); + + if ( $has_child_layout && ( 'fixed' === $block['attrs']['style']['layout']['selfStretch'] || 'fill' === $block['attrs']['style']['layout']['selfStretch'] ) ) { + + $container_content_class = wp_unique_id( 'wp-container-content-' ); + + $child_layout_styles = array(); + + if ( 'fixed' === $block['attrs']['style']['layout']['selfStretch'] && isset( $block['attrs']['style']['layout']['flexSize'] ) ) { + $child_layout_styles[] = array( + 'selector' => ".$container_content_class", + 'declarations' => array( + 'flex-basis' => $block['attrs']['style']['layout']['flexSize'], + 'box-sizing' => 'border-box', + ), + ); + } elseif ( 'fill' === $block['attrs']['style']['layout']['selfStretch'] ) { + $child_layout_styles[] = array( + 'selector' => ".$container_content_class", + 'declarations' => array( + 'flex-grow' => '1', + ), + ); + } + + wp_style_engine_get_stylesheet_from_css_rules( + $child_layout_styles, + array( + 'context' => 'block-supports', + 'prettify' => false, + ) + ); + + $outer_class_names[] = $container_content_class; + + } + + // Return early if only child layout exists. + if ( ! $support_layout && ! empty( $outer_class_names ) ) { + $content = new WP_HTML_Tag_Processor( $block_content ); + $content->next_tag(); + $content->add_class( implode( ' ', $outer_class_names ) ); + return (string) $content; + } + $block_gap = wp_get_global_settings( array( 'spacing', 'blockGap' ) ); $global_layout_settings = wp_get_global_settings( array( 'layout' ) ); $has_block_gap_support = isset( $block_gap ) ? null !== $block_gap : false; @@ -330,7 +396,6 @@ function wp_render_layout_support_flag( $block_content, $block ) { $class_names = array(); $layout_definitions = _wp_array_get( $global_layout_settings, array( 'definitions' ), array() ); - $block_classname = wp_get_block_default_classname( $block['blockName'] ); $container_class = wp_unique_id( 'wp-container-' ); $layout_classname = ''; @@ -406,7 +471,7 @@ function wp_render_layout_support_flag( $block_content, $block ) { $should_skip_gap_serialization = wp_should_skip_block_supports_serialization( $block_type, 'spacing', 'blockGap' ); $style = wp_get_layout_style( - ".$block_classname.$container_class", + ".$container_class.$container_class", $used_layout, $has_block_gap_support, $gap_value, @@ -421,6 +486,40 @@ function wp_render_layout_support_flag( $block_content, $block ) { } } + $content_with_outer_classnames = ''; + + if ( ! empty( $outer_class_names ) ) { + $content_with_outer_classnames = new WP_HTML_Tag_Processor( $block_content ); + $content_with_outer_classnames->next_tag(); + foreach ( $outer_class_names as $outer_class_name ) { + $content_with_outer_classnames->add_class( $outer_class_name ); + } + + $content_with_outer_classnames = (string) $content_with_outer_classnames; + } + + /** + * The first chunk of innerContent contains the block markup up until the inner blocks start. + * We want to target the opening tag of the inner blocks wrapper, which is the last tag in that chunk. + */ + $inner_content_classnames = isset( $block['innerContent'][0] ) && 'string' === gettype( $block['innerContent'][0] ) ? wp_get_classnames_from_last_tag( $block['innerContent'][0] ) : ''; + + $content = $content_with_outer_classnames ? new WP_HTML_Tag_Processor( $content_with_outer_classnames ) : new WP_HTML_Tag_Processor( $block_content ); + + if ( $inner_content_classnames ) { + $content->next_tag( array( 'class_name' => $inner_content_classnames ) ); + foreach ( $class_names as $class_name ) { + $content->add_class( $class_name ); + } + } else { + $content->next_tag(); + foreach ( $class_names as $class_name ) { + $content->add_class( $class_name ); + } + } + + return (string) $content; + /* * This assumes the hook only applies to blocks with a single wrapper. * A limitation of this hook is that nested inner blocks wrappers are not yet supported. @@ -432,7 +531,7 @@ function wp_render_layout_support_flag( $block_content, $block ) { 1 ); - return $content; + return (string) $content; } // Register the block support.