diff --git a/assets/css/admin.scss b/assets/css/admin.scss
index 6ea357b8e2a..921e2fe3ba6 100644
--- a/assets/css/admin.scss
+++ b/assets/css/admin.scss
@@ -154,11 +154,23 @@
border: 1px solid #e6e6e6;
margin-right: 2em;
padding: 4em;
+ max-width: 200px;
.addons-img {
max-height: 86px;
max-width: 97px;
}
+
+ &.is-full-image {
+ padding: 0;
+ background: none;
+ border: none;
+
+ .addons-img {
+ max-height: 100%;
+ max-width: 100%;
+ }
+ }
}
.addons-promotion-block {
@@ -219,8 +231,27 @@
margin-bottom: 0;
}
+ .wcs-logos-container {
+ display: flex;
+ align-items: center;
+ flex-direction: row;
+ justify-content: center;
+
+ @media screen and (min-width: 500px) {
+ justify-content: left;
+ }
+
+ li {
+ margin-right: 8px;
+
+ &:last-child {
+ margin-right: 0;
+ }
+ }
+ }
+
.wcs-service-logo {
- max-width: 40px;
+ max-width: 45px;
}
}
diff --git a/assets/css/twenty-twenty-one.scss b/assets/css/twenty-twenty-one.scss
index 3091ae71eb2..a168e9d37b2 100644
--- a/assets/css/twenty-twenty-one.scss
+++ b/assets/css/twenty-twenty-one.scss
@@ -4,8 +4,8 @@
* Sass variables
*/
-$headings: -apple-system, blinkmacsystemfont, "Helvetica Neue", helvetica, sans-serif;
-$body: nonbreakingspaceoverride, "Hoefler Text", garamond, "Times New Roman", serif;
+$headings: var(--heading--font-family);
+$body: var(--global--font-secondary);
$body-color: currentColor;
$highlights-color: #88a171;
diff --git a/assets/images/wcs-canada-post-logo.jpg b/assets/images/wcs-canada-post-logo.jpg
deleted file mode 100644
index 004bbd448d4..00000000000
Binary files a/assets/images/wcs-canada-post-logo.jpg and /dev/null differ
diff --git a/assets/images/wcs-dhlexpress-logo.png b/assets/images/wcs-dhlexpress-logo.png
new file mode 100644
index 00000000000..45eaa8ac0ff
Binary files /dev/null and b/assets/images/wcs-dhlexpress-logo.png differ
diff --git a/assets/images/wcs-extensions-banner-3x.jpg b/assets/images/wcs-extensions-banner-3x.jpg
new file mode 100644
index 00000000000..1a7d72c612e
Binary files /dev/null and b/assets/images/wcs-extensions-banner-3x.jpg differ
diff --git a/assets/images/wcs-extensions-banner-3x.png b/assets/images/wcs-extensions-banner-3x.png
deleted file mode 100644
index 0b81938fbd1..00000000000
Binary files a/assets/images/wcs-extensions-banner-3x.png and /dev/null differ
diff --git a/assets/images/wcs-truck-banner-3x.png b/assets/images/wcs-truck-banner-3x.png
deleted file mode 100644
index 3175a5d04d0..00000000000
Binary files a/assets/images/wcs-truck-banner-3x.png and /dev/null differ
diff --git a/assets/images/wcs-usps-logo.png b/assets/images/wcs-usps-logo.png
index 04184bf2bbc..4f331e84ff7 100644
Binary files a/assets/images/wcs-usps-logo.png and b/assets/images/wcs-usps-logo.png differ
diff --git a/assets/js/admin/wc-enhanced-select.js b/assets/js/admin/wc-enhanced-select.js
index 843ce80640c..3683d4caa21 100644
--- a/assets/js/admin/wc-enhanced-select.js
+++ b/assets/js/admin/wc-enhanced-select.js
@@ -88,7 +88,7 @@ jQuery( function( $ ) {
tolerance : 'pointer',
stop: function() {
$( $list.find( '.select2-selection__choice' ).get().reverse() ).each( function() {
- var id = $( self ).data( 'data' ).id;
+ var id = $( this ).data( 'data' ).id;
var option = $select.find( 'option[value="' + id + '"]' )[0];
$select.prepend( option );
} );
diff --git a/assets/js/admin/wc-shipping-zones.js b/assets/js/admin/wc-shipping-zones.js
index 093170a1ca9..be7120fbc4c 100644
--- a/assets/js/admin/wc-shipping-zones.js
+++ b/assets/js/admin/wc-shipping-zones.js
@@ -81,6 +81,10 @@
$( window ).on( 'beforeunload', { view: this }, this.unloadConfirmation );
$( document.body ).on( 'click', '.wc-shipping-zone-add', { view: this }, this.onAddNewRow );
},
+ onAddNewRow: function() {
+ var $link = $( this );
+ window.location.href = $link.attr( 'href' );
+ },
block: function() {
$( this.el ).block({
message: null,
diff --git a/assets/js/jquery-tiptip/jquery.tipTip.js b/assets/js/jquery-tiptip/jquery.tipTip.js
index 810fc3aa76d..6672f09fc07 100644
--- a/assets/js/jquery-tiptip/jquery.tipTip.js
+++ b/assets/js/jquery-tiptip/jquery.tipTip.js
@@ -58,7 +58,7 @@
}
if(org_title != ""){
if(!opts.content){
- org_elem.prop(opts.attribute, false); //remove original Attribute
+ org_elem.removeAttr(opts.attribute); //remove original Attribute
}
var timeout = false;
diff --git a/bin/composer/mozart/composer.lock b/bin/composer/mozart/composer.lock
index e49886d9753..e1e7086b4c7 100644
--- a/bin/composer/mozart/composer.lock
+++ b/bin/composer/mozart/composer.lock
@@ -68,16 +68,16 @@
},
{
"name": "league/flysystem",
- "version": "1.1.3",
+ "version": "1.1.4",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
- "reference": "9be3b16c877d477357c015cec057548cf9b2a14a"
+ "reference": "f3ad69181b8afed2c9edf7be5a2918144ff4ea32"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/9be3b16c877d477357c015cec057548cf9b2a14a",
- "reference": "9be3b16c877d477357c015cec057548cf9b2a14a",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f3ad69181b8afed2c9edf7be5a2918144ff4ea32",
+ "reference": "f3ad69181b8afed2c9edf7be5a2918144ff4ea32",
"shasum": ""
},
"require": {
@@ -93,7 +93,6 @@
"phpunit/phpunit": "^8.5.8"
},
"suggest": {
- "ext-fileinfo": "Required for MimeType",
"ext-ftp": "Allows you to use FTP server storage",
"ext-openssl": "Allows you to use FTPS server storage",
"league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
@@ -151,7 +150,7 @@
],
"support": {
"issues": "https://github.com/thephpleague/flysystem/issues",
- "source": "https://github.com/thephpleague/flysystem/tree/1.x"
+ "source": "https://github.com/thephpleague/flysystem/tree/1.1.4"
},
"funding": [
{
@@ -159,7 +158,7 @@
"type": "other"
}
],
- "time": "2020-08-23T07:39:11+00:00"
+ "time": "2021-06-23T21:56:05+00:00"
},
{
"name": "league/mime-type-detection",
@@ -1152,5 +1151,5 @@
"platform-overrides": {
"php": "7.3"
},
- "plugin-api-version": "2.0.0"
+ "plugin-api-version": "2.1.0"
}
diff --git a/bin/composer/wp/composer.lock b/bin/composer/wp/composer.lock
index 0674d3f98fa..08806cfd5e5 100644
--- a/bin/composer/wp/composer.lock
+++ b/bin/composer/wp/composer.lock
@@ -254,16 +254,16 @@
},
{
"name": "rmccue/requests",
- "version": "v1.8.0",
+ "version": "v1.8.1",
"source": {
"type": "git",
"url": "https://github.com/WordPress/Requests.git",
- "reference": "afbe4790e4def03581c4a0963a1e8aa01f6030f1"
+ "reference": "82e6936366eac3af4d836c18b9d8c31028fe4cd5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/WordPress/Requests/zipball/afbe4790e4def03581c4a0963a1e8aa01f6030f1",
- "reference": "afbe4790e4def03581c4a0963a1e8aa01f6030f1",
+ "url": "https://api.github.com/repos/WordPress/Requests/zipball/82e6936366eac3af4d836c18b9d8c31028fe4cd5",
+ "reference": "82e6936366eac3af4d836c18b9d8c31028fe4cd5",
"shasum": ""
},
"require": {
@@ -306,11 +306,7 @@
"iri",
"sockets"
],
- "support": {
- "issues": "https://github.com/WordPress/Requests/issues",
- "source": "https://github.com/WordPress/Requests/tree/v1.8.0"
- },
- "time": "2021-04-27T11:05:25+00:00"
+ "time": "2021-06-04T09:56:25+00:00"
},
{
"name": "symfony/finder",
@@ -612,5 +608,5 @@
"platform-overrides": {
"php": "7.0"
},
- "plugin-api-version": "2.0.0"
+ "plugin-api-version": "1.1.0"
}
diff --git a/changelog.txt b/changelog.txt
index 1dff12e467d..0205c509727 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,5 +1,181 @@
== Changelog ==
+= 5.5.0-beta.1 2021-06-22 =
+
+**WooCommerce**
+
+* Performance - Set Geolocation fallback transients to expire in one day instead of one week. #29987
+* Enhancement - [Transparency] CLI command for viewing tracking data for your store. #30010
+* Enhancement - All settings pages can now be extended consistently with new sections and settings. Also, unit tests have been added. #27684
+* Enhancement - Set checkout fields value with the default defined value where form is not presented to the user. #29820
+* Tweak - Show legacy widget instance in Rest API. #30012
+* Tweak - No longer load PayPal Standard by default on new installs. #29971
+* Tweak - Rename Products, Products by Rating, and Recent Viewed Products widgets to Products list, Products by Rating list, and Recently Viewed Products list. #29941
+* Tweak - By default the postcode field will no longer be used, and the state field will become optional, for Curaçao. #29848
+* Tweak - Handle WP_Error while creating placeholder image during install. #29783
+* Fix - Allow block templates for WooCommerce pages. #30013
+* Fix - Download IDs are included in export CSV and imported when updating existing products to maintain download permissions. #29970
+* Fix - Fees added to an order from wp-admin are now calculated correctly the first time. #29945
+* Fix - Prevent caching of cart/checkout page when using Chrome browser. #29912
+* Fix - Invoice emails now contain payment link if the order needs payment, not just when the order is "pending". #29833
+* Fix - Introduce meta to track stocks that refunded and restocked to properly handle stock recalculation. #29762
+* Fix - Resolved a console error that could occur when clicking Add Shipping Zone. #30015
+* Dev - Added an if condition block to check for new install before creating Zero and Reduced rate tax classes in class-wc-install.php. #29938
+* Dev - Product attributes lookup table usage when enabled. #29896
+* Dev - Set $woocommerce_loop name propriety to widget "Products". #29847
+* Dev - Reduce the potential for errors when plugins implement REST API endpoints based on WooCommerce's own products controller. #29835
+* Dev - Remove ABSPATH check in interfaces. #30124
+* Dev - Add ability to bulk update order status to cancelled. #30116
+* Dev - Register woocommerce.css in editor screens so it can be enqueued in the editor. #30093
+* Dev - Add Customize WooCommerce link for block-based themes. #30044
+
+**WooCommerce Admin - 2.4.0 **
+
+* Add - SlotFill to Abbreviated Notification panel #7091
+* Add - Consume remote payment methods on frontend #6867
+* Add - Extend payment gateways REST endpoint #6919
+* Add - Add remote payment gateway recommendations initial docs #6962
+* Add - Add loading placeholders for payment gateways task #7123
+* Add - Note date range logic for GivingFeedback, and InsightFirstSale note. #6969
+* Add - Add transient notices feature #6809
+* Add - Add transformers in remote inbox notifications #6948
+* Add - Add Mercado Pago as default fallback payment gateway #7043
+* Add - Add in Razorpay as default fallback payment gateway #7096
+* Add - Get post install scripts from gateway and enqueue in client #6967
+* Add - Add eWAY as default fallback gateway #7108
+* Add - Free extension list powered by remote config #6952
+* Add - Add PayPal to fallback payment gateways #7001
+* Add - Add a data store for WC Payments REST APIs #6918
+* Add - Progressive setup checklist copy and call to action buttons. #6956
+* Add - Add Paystack as fallback gateway #7025
+* Add - Add Square as default fallback gateway #7107
+* Add - Add COD method to default payment gateway recommendations #7057
+* Add - Add BACS as default fallback payment gateway #7073
+* Add - A/B test of progressive checklist features. #7089
+* Add - Add payment gateway return URL and action #7095
+* Add - Add Mollie to the default payment gateways. #7092
+* Add - Show task and activity notifications in the Inbox panel #7017
+* Add - Adding WCPay payment configuration defaults. #7097
+* Add - Create onboarding package to house refactored WCPay card and relevant components #7058
+* Dev - Add Jetpack Backup admin note #6738
+* Dev - Reduce the specificity and complexity of the ReportError component #6846
+* Dev - Converting component to TypeScript. #6981
+* Dev - Update package-lock to fix versioning of local packages. #6843
+* Dev - Use rule processing for remote payment methods #6830
+* Dev - Update E2E jest config, so it correctly creates screenshots on failure. #6858
+* Dev - Fixed storybook build script #6875
+* Dev - Removed allowed keys list for adding woocommerce_meta data. #6889 🎉 @xristos3490
+* Dev - Delete all products when running product import tests, unskip previously skipped test. #6905
+* Dev - Add payment method selector to onboarding store #6921
+* Dev - Add disabled prop to SelectControl #6902
+* Dev - Add filter variation to tracks data in products analytics. #6913
+* Dev - Offload remote inbox notifications engine run using action-scheduler. #6995
+* Dev - Add source param support for notes query. #6979
+* Dev - Remove the use of Dashicons and replace with @wordpress/icons or gridicons. #7020
+* Dev - Refactor inbox panel components and moved to experimental package. #7006
+* Dev - Business features uncheck creative mail by default #7139
+* Dev - Remove support for IE11. #7112
+* Dev - Drop styling support for IE11. #7137
+* Dev - Remove react-docgen docs in favor of Storybook #7055
+* Enhancement - Add expand/collapse to extendable task list. #6910
+* Enhancement - Add task hierarchy support to extended task list. #6916
+* Enhancement - Add remind me later option to task list. #6923
+* Enhancement - Enable Remote Free Extensions List #7144
+* Enhancement - Adding Slotfills for remote payments and SettingsForm component. #6932
+* Fix - Update the wordpress/babel-preset to avoid crashes in WP5.8 beta2 #7202
+* Fix - Add fallback for the select/dispatch data-controls for older WP versions #7204
+* Fix - RemoteFreeExtension hide bundle when all of its plugins are not visible #7182
+* Fix - Issue where summary stats were not showing in Analytics > Stock. #7161
+* Fix - Rule Processing Transformer to handle dotNotation default value #7009
+* Fix - Remove Navigation's uneeded SlotFill context #6832
+* Fix - Report filters expecting specific ordering. #6847
+* Fix - Render bug with report comparison mode selections. #6862
+* Fix - Throw exception if the data store cannot be loaded when trying to use notes. #6771
+* Fix - Autocompleter for custom Search in FilterPicker #6880
+* Fix - Get currency from CurrencyContext #6723
+* Fix - Correct the left position of transient notices when the new nav is used. #6914
+* Fix - Exclude WC Shipping for store that are only offering downloadable products #6917
+* Fix - SelectControl focus and de-focus bug #6906
+* Fix - Multiple preload tag output bug. #6998
+* Fix - Call existing filters for leaderboards in analytics. #6626
+* Fix - Set target to blank for the external links #6999
+* Fix style regression with the Chart header. #7002
+* Fix styling of the advanced filter operator selection. #7005
+* Fix - Deprecated warnings from select control @wordpress/data-controls. #7007
+* Fix - Bug with Orders Report coupon exclusion filter. #7021
+* Fix - Show Google Listing and Ads in installed marketing extensions section. #7029
+* Fix - Notices not dissapearing. #7077
+* Fix - Keyboard accessibility on the free features tab. #7149
+* Fix - Fix error handling when remote free extension API returns empty array. #7147
+* Fix - Transformer casing is incorrect and creates an error on case-sensitive systems #7104
+* Fix - Preventing redundant notices when installing plugins via payments task list. #7026
+* Fix - Autocompleter for custom Search in CompareFilter #6911
+* Fix - Add target to the button to open it in a new tab #7110
+* Fix - Make `Search` accept synchronous `autocompleter.options`. #6884
+* Fix - Set autoload to false for all remote inbox notifications options. #7060
+* Tweak - Setup checklist copy revert. #7015
+* Tweak - Revert Card component removal #7167
+* Update - Task list component with new Experimental Task list. #6849
+* Update - Optimize payment gateway resolution #7124
+* Update - Experimental task list import to the experimental package. #6950
+* Update - Redirect to WC Home after setting up a payment method #6891
+* Update - Hook up payments gateway data store #7038
+* Update - Update remote payment docs gateway methods #7079
+* Update - Remove original business step flow #7103
+* Update - WooCommerce Shipping copy on onboarding steps #7148
+
+** WooCommerce Blocks Package - 5.2.0 & 5.3.0 & 5.3.1 **
+
+* Enhancement - Hide legacy widgets with a feature-complete block equivalent from the widget area block inserter. #4237
+* Enhancement - Provide block transforms for legacy widgets with a feature-complete block equivalent. #4292
+* Enhancement - Hide the All Products Block from the Customizer Widget Areas until full support is achieved. #4225
+* Enhancement - Improved accessibility and styling of the controls of several of ours blocks. #4100
+* Enhancement - Fix duplicate react keys in ProductDetails component. #4187
+* Fix - Fix a bug in which Cart Widget didn’t update when adding items from the All Products block. #4291
+* Fix - Fix an issue where an attempt to add an out-of-stock product to the cart was made when clicking the “Read more” button. #4265
+* Fix - Fix Product Categories List block display in Site Editor #4335.
+* Fix - Make links in the Product Categories List block unclickable in the editor #4339.
+* Fix - Fix rating stars not being shown in the Site Editor #4345.
+
+** WooCommerce Blocks Feature Plugin - 5.2.0 & 5.3.0 & 5.3.1 **
+
+* Enhancement - Added a key prop to each CartTotalItem within usePaymentMethodInterface. (4240)
+* Enhancement - Sync customer data during checkout with draft orders. (4197)
+* Enhancement - Update the display of the sidebar/order summary in the Cart and Checkout blocks. (4180)
+* Enhancement - Hide the Cart and Checkout blocks from the new block-based widget editor. (4303)
+* Fix - Hide tax breakdown if the total amount of tax to be paid is 0. (4262)
+* Fix - Prevent Coupon code panel from appearing in stores were coupons are disabled. (4202)
+* Fix - For payment methods, only use canMakePayment in the frontend (not the editor) context. (4188)
+* Fix - Fix sending of confirmation emails for orders when no payment is needed. (4186)
+* Fix - Stopped a warning being shown when using WooCommerce Force Sells and adding a product with a Synced Force Sell to the cart. (4182)
+* Fix - Fix some missing translations from the Cart and Checkout blocks. (4295)
+* Fix - Fix the flickering of the Proceed to Checkout button on quantity update in the Cart Block. (4293)
+* Fix - Fix a display issue when itemized taxes are enabled, but no products in the cart are taxable. (4284)
+* Compatibility - Add the ability for extensions to register callbacks to be executed by Blocks when the cart/extensions endpoint is hit. Extensions can now tell Blocks they need to do some server-side processing which will update the cart. (4298)
+* Tweak - Add couponName filter to allow extensions to modify how coupons are displayed in the Cart and Checkout summary. (4166)
+* Tweak - Move Button and Label components to @woocommerce/blocks-checkout package. (4222)
+* Tweak - Add Slot in the Discounts section of the cart sidebar to allow third party extensions to render their own components there. (4248)
+
+** ActionScheduler 3.2.0 & 3.2.1 **
+
+* Fix - Add "no ordering" option to as_next_scheduled_action().
+* Fix - Add secondary scheduled date checks when claiming actions (DBStore) | #634.
+* Fix - Add secondary scheduled date checks when claiming actions (wpPostStore) | #634.
+* Fix - Adds a new index to the action table, reducing the potential for deadlocks (props: @glagonikas).
+* Fix - Fix unit tests infrastructure and adapt tests to PHP 8.
+* Fix - Identify in-use data store.
+* Fix - Improve test_migration_is_scheduled.
+* Fix - PHP notice on list table.
+* Fix - Speed up clean up and batch selects.
+* Fix - Update pending dependencies.
+* Fix - [PHP 8.0] Only pass action arg values through to do_action_ref_array().
+* Fix - [PHP 8] Set the PHP version to 7.1 in composer.json for PHP 8 compatibility.
+* Fix - add is_initialized() to docs.
+* Fix - fix file permissions.
+* Fix - fixes #664 by replacing __ with esc_html__.
+* Fix - Add extra safety/account for different versions of AS and different loading patterns. #714
+* Fix - Handle hidden columns (Tools → Scheduled Actions) | #600.
+
= 5.4.1 2021-06-10 =
**WooCommerce**
diff --git a/composer.json b/composer.json
index 8df8848a89d..c20dd7a4801 100644
--- a/composer.json
+++ b/composer.json
@@ -20,8 +20,8 @@
"maxmind-db/reader": "1.6.0",
"pelago/emogrifier": "3.1.0",
"psr/container": "1.0.0",
- "woocommerce/action-scheduler": "3.2.0",
- "woocommerce/woocommerce-admin": "2.3.1",
+ "woocommerce/action-scheduler": "3.2.1",
+ "woocommerce/woocommerce-admin": "2.4.0-rc.2",
"woocommerce/woocommerce-blocks": "5.3.1"
},
"require-dev": {
diff --git a/composer.lock b/composer.lock
index 0091b0486ef..ede60a42fa8 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "21b06e63b5f65deec4b635463a10402b",
+ "content-hash": "6fb169d13104940f13185353a857a799",
"packages": [
{
"name": "automattic/jetpack-autoloader",
@@ -493,16 +493,16 @@
},
{
"name": "woocommerce/action-scheduler",
- "version": "3.2.0",
+ "version": "3.2.1",
"source": {
"type": "git",
"url": "https://github.com/woocommerce/action-scheduler.git",
- "reference": "12c91fd20af0cdfb6107b8db9df78d133f512b04"
+ "reference": "3c24064f115cd55e972d73d5d48f14133ac60b0d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/woocommerce/action-scheduler/zipball/12c91fd20af0cdfb6107b8db9df78d133f512b04",
- "reference": "12c91fd20af0cdfb6107b8db9df78d133f512b04",
+ "url": "https://api.github.com/repos/woocommerce/action-scheduler/zipball/3c24064f115cd55e972d73d5d48f14133ac60b0d",
+ "reference": "3c24064f115cd55e972d73d5d48f14133ac60b0d",
"shasum": ""
},
"require-dev": {
@@ -526,22 +526,22 @@
"homepage": "https://actionscheduler.org/",
"support": {
"issues": "https://github.com/woocommerce/action-scheduler/issues",
- "source": "https://github.com/woocommerce/action-scheduler/tree/3.2.0"
+ "source": "https://github.com/woocommerce/action-scheduler/tree/3.2.1"
},
- "time": "2021-06-03T16:41:18+00:00"
+ "time": "2021-06-21T20:21:35+00:00"
},
{
"name": "woocommerce/woocommerce-admin",
- "version": "2.3.1",
+ "version": "2.4.0-rc.2",
"source": {
"type": "git",
"url": "https://github.com/woocommerce/woocommerce-admin.git",
- "reference": "f28cf3f027e27a6679e4fa8173d8b6859ec84838"
+ "reference": "ed72985cd459831c555dff2ff5f75111b6e210c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/woocommerce/woocommerce-admin/zipball/f28cf3f027e27a6679e4fa8173d8b6859ec84838",
- "reference": "f28cf3f027e27a6679e4fa8173d8b6859ec84838",
+ "url": "https://api.github.com/repos/woocommerce/woocommerce-admin/zipball/ed72985cd459831c555dff2ff5f75111b6e210c1",
+ "reference": "ed72985cd459831c555dff2ff5f75111b6e210c1",
"shasum": ""
},
"require": {
@@ -578,9 +578,9 @@
"homepage": "https://github.com/woocommerce/woocommerce-admin",
"support": {
"issues": "https://github.com/woocommerce/woocommerce-admin/issues",
- "source": "https://github.com/woocommerce/woocommerce-admin/tree/v2.3.1"
+ "source": "https://github.com/woocommerce/woocommerce-admin/tree/v2.4.0-rc.2"
},
- "time": "2021-05-24T09:48:40+00:00"
+ "time": "2021-06-18T05:58:25+00:00"
},
{
"name": "woocommerce/woocommerce-blocks",
diff --git a/includes/admin/class-wc-admin-addons.php b/includes/admin/class-wc-admin-addons.php
index ff33de129e0..1f3775e956a 100644
--- a/includes/admin/class-wc-admin-addons.php
+++ b/includes/admin/class-wc-admin-addons.php
@@ -375,7 +375,7 @@ class WC_Admin_Addons {
$location = wc_get_base_location();
if (
- ! in_array( $location['country'], array( 'US', 'CA' ), true ) ||
+ ! in_array( $location['country'], array( 'US' ), true ) ||
$is_active ||
! current_user_can( 'install_plugins' ) ||
! current_user_can( 'activate_plugins' )
@@ -393,32 +393,16 @@ class WC_Admin_Addons {
);
$defaults = array(
- 'image' => WC()->plugin_url() . '/assets/images/wcs-extensions-banner-3x.png',
+ 'image' => WC()->plugin_url() . '/assets/images/wcs-extensions-banner-3x.jpg',
'image_alt' => __( 'WooCommerce Shipping', 'woocommerce' ),
- 'title' => __( 'Buy discounted shipping labels — then print them from your dashboard.', 'woocommerce' ),
- 'description' => __( 'Integrate your store with USPS to buy discounted shipping labels, and print them directly from your WooCommerce dashboard. Powered by WooCommerce Shipping.', 'woocommerce' ),
+ 'title' => __( 'Save time and money with WooCommerce Shipping', 'woocommerce' ),
+ 'description' => __( 'Print discounted USPS and DHL labels straight from your WooCommerce dashboard and save on shipping.', 'woocommerce' ),
'button' => __( 'Free - Install now', 'woocommerce' ),
'href' => $button_url,
'logos' => array(),
);
switch ( $location['country'] ) {
- case 'CA':
- $local_defaults = array(
- 'image' => WC()->plugin_url() . '/assets/images/wcs-truck-banner-3x.png',
- 'title' => __( 'Show Canada Post shipping rates', 'woocommerce' ),
- 'description' => __( 'Display live rates from Canada Post at checkout to make shipping a breeze. Powered by WooCommerce Shipping.', 'woocommerce' ),
- 'logos' => array_merge(
- $defaults['logos'],
- array(
- array(
- 'link' => WC()->plugin_url() . '/assets/images/wcs-canada-post-logo.jpg',
- 'alt' => 'Canada Post logo',
- ),
- )
- ),
- );
- break;
case 'US':
$local_defaults = array(
'logos' => array_merge(
@@ -428,6 +412,10 @@ class WC_Admin_Addons {
'link' => WC()->plugin_url() . '/assets/images/wcs-usps-logo.png',
'alt' => 'USPS logo',
),
+ array(
+ 'link' => WC()->plugin_url() . '/assets/images/wcs-dhlexpress-logo.png',
+ 'alt' => 'DHL Express logo',
+ ),
)
),
);
@@ -439,7 +427,7 @@ class WC_Admin_Addons {
$block_data = array_merge( $defaults, $local_defaults, $block );
?>
-
+
-
+
-
post_type . '_meta', $post_id, $post );
}
}
+
+ /**
+ * Remove block-based templates from the list of available templates for products.
+ *
+ * @param string[] $templates Array of template header names keyed by the template file name.
+ *
+ * @return string[] Templates array excluding block-based templates.
+ */
+ public function remove_block_templates( $templates ) {
+ if ( count( $templates ) === 0 || ! function_exists( 'gutenberg_get_block_template' ) ) {
+ return $templates;
+ }
+
+ $theme = wp_get_theme()->get_stylesheet();
+ $filtered_templates = array();
+
+ foreach ( $templates as $template_key => $template_name ) {
+ $gutenberg_template = gutenberg_get_block_template( $theme . '//' . $template_key );
+
+ if ( ! $gutenberg_template ) {
+ $filtered_templates[ $template_key ] = $template_name;
+ }
+ }
+
+ return $filtered_templates;
+ }
}
new WC_Admin_Meta_Boxes();
diff --git a/includes/class-wc-download-handler.php b/includes/class-wc-download-handler.php
index fa279c8c6fd..00022f818b0 100644
--- a/includes/class-wc-download-handler.php
+++ b/includes/class-wc-download-handler.php
@@ -314,7 +314,7 @@ class WC_Download_Handler {
/**
* Fallback on force download method for remote files. This is because:
* 1. xsendfile needs proxy configuration to work for remote files, which cannot be assumed to be available on most hosts.
- * 2. Force download method is more secure than redirect method if `allow_url_fopen` is enabled in `php.ini`. We fallback to redirect method in force download method anyway in case `allow_url_fopen` is not enabled.
+ * 2. Force download method is more secure than redirect method if `allow_url_fopen` is enabled in `php.ini`.
*/
if ( $parsed_file_path['remote_file'] && ! apply_filters( 'woocommerce_use_xsendfile_for_remote', false ) ) {
do_action( 'woocommerce_download_file_force', $file_path, $filename );
@@ -435,11 +435,7 @@ class WC_Download_Handler {
$start = isset( $download_range['start'] ) ? $download_range['start'] : 0;
$length = isset( $download_range['length'] ) ? $download_range['length'] : 0;
if ( ! self::readfile_chunked( $parsed_file_path['file_path'], $start, $length ) ) {
- if ( $parsed_file_path['remote_file'] ) {
- self::download_file_redirect( $file_path );
- } else {
- self::download_error( __( 'File not found', 'woocommerce' ) );
- }
+ self::download_error( __( 'File not found', 'woocommerce' ) );
}
exit;
@@ -620,6 +616,15 @@ class WC_Download_Handler {
* @param integer $status Error status.
*/
private static function download_error( $message, $title = '', $status = 404 ) {
+ /*
+ * Since we will now render a message instead of serving a download, we should unwind some of the previously set
+ * headers.
+ */
+ header( 'Content-Type: ' . get_option( 'html_type' ) . '; charset=' . get_option( 'blog_charset' ) );
+ header_remove( 'Content-Description;' );
+ header_remove( 'Content-Disposition' );
+ header_remove( 'Content-Transfer-Encoding' );
+
if ( ! strstr( $message, '' . esc_html__( 'Go to shop', 'woocommerce' ) . '';
}
diff --git a/includes/class-woocommerce.php b/includes/class-woocommerce.php
index c75a69cf2c9..4aca7ed58a6 100644
--- a/includes/class-woocommerce.php
+++ b/includes/class-woocommerce.php
@@ -26,7 +26,7 @@ final class WooCommerce {
*
* @var string
*/
- public $version = '5.5.0';
+ public $version = '5.6.0';
/**
* WooCommerce Schema version.
diff --git a/includes/data-stores/class-wc-webhook-data-store.php b/includes/data-stores/class-wc-webhook-data-store.php
index 947e89edb13..7feed6e4cc4 100644
--- a/includes/data-stores/class-wc-webhook-data-store.php
+++ b/includes/data-stores/class-wc-webhook-data-store.php
@@ -272,7 +272,8 @@ class WC_Webhook_Data_Store implements WC_Webhook_Data_Store_Interface {
'post_modified' => 'date_modified_gmt',
);
$orderby = isset( $orderby_mapping[ $args['orderby'] ] ) ? $orderby_mapping[ $args['orderby'] ] : 'webhook_id';
- $order = "ORDER BY {$orderby} " . esc_sql( strtoupper( $args['order'] ) );
+ $sort = 'ASC' === strtoupper( $args['order'] ) ? 'ASC' : 'DESC';
+ $order = "ORDER BY {$orderby} {$sort}";
$limit = -1 < $args['limit'] ? $wpdb->prepare( 'LIMIT %d', $args['limit'] ) : '';
$offset = 0 < $args['offset'] ? $wpdb->prepare( 'OFFSET %d', $args['offset'] ) : '';
$status = ! empty( $args['status'] ) ? $wpdb->prepare( 'AND `status` = %s', isset( $statuses[ $args['status'] ] ) ? $statuses[ $args['status'] ] : $args['status'] ) : '';
diff --git a/includes/emails/class-wc-email.php b/includes/emails/class-wc-email.php
index 91c0582d9ba..babe3cf8e0a 100644
--- a/includes/emails/class-wc-email.php
+++ b/includes/emails/class-wc-email.php
@@ -658,6 +658,16 @@ class WC_Email extends WC_Settings_API {
remove_filter( 'wp_mail_from_name', array( $this, 'get_from_name' ) );
remove_filter( 'wp_mail_content_type', array( $this, 'get_content_type' ) );
+ /**
+ * Action hook fired when an email is sent.
+ *
+ * @since 5.6.0
+ * @param bool $return Whether the email was sent successfully.
+ * @param int $id Email ID.
+ * @param WC_Email $this WC_Email instance.
+ */
+ do_action( 'woocommerce_email_sent', $return, $this->id, $this );
+
return $return;
}
diff --git a/includes/export/abstract-wc-csv-batch-exporter.php b/includes/export/abstract-wc-csv-batch-exporter.php
index b48fd53a4ae..838d4e57eea 100644
--- a/includes/export/abstract-wc-csv-batch-exporter.php
+++ b/includes/export/abstract-wc-csv-batch-exporter.php
@@ -46,6 +46,32 @@ abstract class WC_CSV_Batch_Exporter extends WC_CSV_Exporter {
return trailingslashit( $upload_dir['basedir'] ) . $this->get_filename();
}
+ /**
+ * Get CSV headers row file path to export to.
+ *
+ * @return string
+ */
+ protected function get_headers_row_file_path() {
+ return $this->get_file_path() . '.headers';
+ }
+
+ /**
+ * Get the contents of the CSV headers row file. Defaults to the original known headers.
+ *
+ * @since 3.1.0
+ * @return string
+ */
+ public function get_headers_row_file() {
+
+ $file = chr( 239 ) . chr( 187 ) . chr( 191 ) . $this->export_column_headers();
+
+ if ( @file_exists( $this->get_headers_row_file_path() ) ) { // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged
+ $file = @file_get_contents( $this->get_headers_row_file_path() ); // phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents, WordPress.WP.AlternativeFunctions.file_system_read_file_get_contents
+ }
+
+ return $file;
+ }
+
/**
* Get the file contents.
*
@@ -70,8 +96,9 @@ abstract class WC_CSV_Batch_Exporter extends WC_CSV_Exporter {
*/
public function export() {
$this->send_headers();
- $this->send_content( $this->get_file() );
+ $this->send_content( $this->get_headers_row_file() . $this->get_file() );
@unlink( $this->get_file_path() ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_unlink, Generic.PHP.NoSilencedErrors.Discouraged
+ @unlink( $this->get_headers_row_file_path() ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_unlink, Generic.PHP.NoSilencedErrors.Discouraged
die();
}
@@ -83,6 +110,9 @@ abstract class WC_CSV_Batch_Exporter extends WC_CSV_Exporter {
public function generate_file() {
if ( 1 === $this->get_page() ) {
@unlink( $this->get_file_path() ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_unlink, Generic.PHP.NoSilencedErrors.Discouraged,
+
+ // We need to initialize the file here.
+ $this->get_file();
}
$this->prepare_data_to_export();
$this->write_csv_data( $this->get_csv_data() );
@@ -95,15 +125,26 @@ abstract class WC_CSV_Batch_Exporter extends WC_CSV_Exporter {
* @param string $data Data.
*/
protected function write_csv_data( $data ) {
- $file = $this->get_file();
- // Add columns when finished.
- if ( 100 === $this->get_percent_complete() ) {
- $file = chr( 239 ) . chr( 187 ) . chr( 191 ) . $this->export_column_headers() . $file;
+ if ( ! file_exists( $this->get_file_path() ) || ! is_writeable( $this->get_file_path() ) ) {
+ return false;
+ }
+
+ $fp = fopen( $this->get_file_path(), 'a+' );
+
+ if ( $fp ) {
+ fwrite( $fp, $data );
+ fclose( $fp );
+ }
+
+ // Add all columns when finished.
+ if ( 100 === $this->get_percent_complete() ) {
+ $header = chr( 239 ) . chr( 187 ) . chr( 191 ) . $this->export_column_headers();
+
+ // We need to use a temporary file to store headers, this will make our life so much easier.
+ @file_put_contents( $this->get_headers_row_file_path(), $header ); //phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_file_put_contents, Generic.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_system_read_file_put_contents
}
- $file .= $data;
- @file_put_contents( $this->get_file_path(), $file ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_file_put_contents, Generic.PHP.NoSilencedErrors.Discouraged, WordPress.WP.AlternativeFunctions.file_system_read_file_put_contents
}
/**
diff --git a/includes/wc-core-functions.php b/includes/wc-core-functions.php
index d0298871e68..ccc71dcfc6a 100644
--- a/includes/wc-core-functions.php
+++ b/includes/wc-core-functions.php
@@ -976,14 +976,14 @@ function wc_get_image_size( $image_size ) {
$size['height'] = '';
$size['crop'] = 0;
} elseif ( 'custom' === $cropping ) {
- $width = max( 1, get_option( 'woocommerce_thumbnail_cropping_custom_width', '4' ) );
- $height = max( 1, get_option( 'woocommerce_thumbnail_cropping_custom_height', '3' ) );
+ $width = max( 1, (float) get_option( 'woocommerce_thumbnail_cropping_custom_width', '4' ) );
+ $height = max( 1, (float) get_option( 'woocommerce_thumbnail_cropping_custom_height', '3' ) );
$size['height'] = absint( NumberUtil::round( ( $size['width'] / $width ) * $height ) );
$size['crop'] = 1;
} else {
$cropping_split = explode( ':', $cropping );
- $width = max( 1, current( $cropping_split ) );
- $height = max( 1, end( $cropping_split ) );
+ $width = max( 1, (float) current( $cropping_split ) );
+ $height = max( 1, (float) end( $cropping_split ) );
$size['height'] = absint( NumberUtil::round( ( $size['width'] / $width ) * $height ) );
$size['crop'] = 1;
}
diff --git a/includes/wc-template-functions.php b/includes/wc-template-functions.php
index dd40a5f805e..6a46831bb60 100644
--- a/includes/wc-template-functions.php
+++ b/includes/wc-template-functions.php
@@ -36,7 +36,7 @@ function wc_template_redirect() {
// Logout.
if ( isset( $wp->query_vars['customer-logout'] ) && ! empty( $_REQUEST['_wpnonce'] ) && wp_verify_nonce( sanitize_key( $_REQUEST['_wpnonce'] ), 'customer-logout' ) ) {
- wp_safe_redirect( str_replace( '&', '&', wp_logout_url( wc_get_page_permalink( 'myaccount' ) ) ) );
+ wp_safe_redirect( str_replace( '&', '&', wp_logout_url( apply_filters( 'woocommerce_logout_default_redirect_url', wc_get_page_permalink( 'myaccount' ) ) ) ) );
exit;
}
diff --git a/package-lock.json b/package-lock.json
index 92b593f6ebb..c446ecbc3d4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "woocommerce",
- "version": "5.5.0",
+ "version": "5.6.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -3954,6 +3954,25 @@
}
}
},
+ "@stylelint/postcss-css-in-js": {
+ "version": "0.37.2",
+ "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz",
+ "integrity": "sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==",
+ "dev": true,
+ "requires": {
+ "@babel/core": ">=7.9.0"
+ }
+ },
+ "@stylelint/postcss-markdown": {
+ "version": "0.36.2",
+ "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz",
+ "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==",
+ "dev": true,
+ "requires": {
+ "remark": "^13.0.0",
+ "unist-util-find-all-after": "^3.0.2"
+ }
+ },
"@tannin/compile": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz",
@@ -4106,6 +4125,15 @@
"integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
"dev": true
},
+ "@types/mdast": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz",
+ "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "*"
+ }
+ },
"@types/minimatch": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
@@ -4160,26 +4188,6 @@
"integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==",
"dev": true
},
- "@types/vfile": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz",
- "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==",
- "dev": true,
- "requires": {
- "@types/node": "*",
- "@types/unist": "*",
- "@types/vfile-message": "*"
- }
- },
- "@types/vfile-message": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz",
- "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==",
- "dev": true,
- "requires": {
- "vfile-message": "*"
- }
- },
"@types/yargs": {
"version": "15.0.7",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.7.tgz",
@@ -22807,12 +22815,6 @@
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
"dev": true
},
- "ccount": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz",
- "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==",
- "dev": true
- },
"chai": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
@@ -22853,12 +22855,6 @@
"integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
"dev": true
},
- "character-entities-html4": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz",
- "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==",
- "dev": true
- },
"character-entities-legacy": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
@@ -23242,12 +23238,6 @@
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true
},
- "collapse-white-space": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
- "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==",
- "dev": true
- },
"collect-v8-coverage": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
@@ -24009,16 +23999,16 @@
"dev": true
},
"cosmiconfig": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
- "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+ "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
"dev": true,
"requires": {
"@types/parse-json": "^4.0.0",
- "import-fresh": "^3.1.0",
+ "import-fresh": "^3.2.1",
"parse-json": "^5.0.0",
"path-type": "^4.0.0",
- "yaml": "^1.7.2"
+ "yaml": "^1.10.0"
}
},
"create-ecdh": {
@@ -25879,6 +25869,12 @@
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
+ "fastest-levenshtein": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+ "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+ "dev": true
+ },
"fastq": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
@@ -28703,12 +28699,6 @@
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true
},
- "indexes-of": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
- "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
- "dev": true
- },
"infer-owner": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
@@ -28937,12 +28927,6 @@
"integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
"dev": true
},
- "is-alphanumeric": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
- "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=",
- "dev": true
- },
"is-alphanumerical": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
@@ -29272,30 +29256,24 @@
"unc-path-regex": "^0.1.2"
}
},
+ "is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true
+ },
"is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
"dev": true
},
- "is-whitespace-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
- "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
- "dev": true
- },
"is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
"dev": true
},
- "is-word-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
- "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==",
- "dev": true
- },
"is-wsl": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
@@ -31093,9 +31071,9 @@
"dev": true
},
"known-css-properties": {
- "version": "0.17.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.17.0.tgz",
- "integrity": "sha512-Vi3nxDGMm/z+lAaCjvAR1u+7fiv+sG6gU/iYDj5QOF8h76ytK9EW/EKfF0NeTyiGBi8Jy6Hklty/vxISrLox3w==",
+ "version": "0.21.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz",
+ "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==",
"dev": true
},
"language-subtag-registry": {
@@ -31729,6 +31707,12 @@
"lodash._reinterpolate": "^3.0.0"
}
},
+ "lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
+ "dev": true
+ },
"lodash.uniq": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
@@ -31962,18 +31946,6 @@
"object-visit": "^1.0.0"
}
},
- "markdown-escapes": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
- "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==",
- "dev": true
- },
- "markdown-table": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz",
- "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==",
- "dev": true
- },
"marked": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/marked/-/marked-0.6.3.tgz",
@@ -32061,15 +32033,39 @@
"safe-buffer": "^5.1.2"
}
},
- "mdast-util-compact": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz",
- "integrity": "sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==",
+ "mdast-util-from-markdown": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
+ "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
"dev": true,
"requires": {
- "unist-util-visit": "^1.1.0"
+ "@types/mdast": "^3.0.0",
+ "mdast-util-to-string": "^2.0.0",
+ "micromark": "~2.11.0",
+ "parse-entities": "^2.0.0",
+ "unist-util-stringify-position": "^2.0.0"
}
},
+ "mdast-util-to-markdown": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
+ "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "^2.0.0",
+ "longest-streak": "^2.0.0",
+ "mdast-util-to-string": "^2.0.0",
+ "parse-entities": "^2.0.0",
+ "repeat-string": "^1.0.0",
+ "zwitch": "^1.0.0"
+ }
+ },
+ "mdast-util-to-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
+ "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
+ "dev": true
+ },
"memize": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/memize/-/memize-1.1.0.tgz",
@@ -32131,6 +32127,33 @@
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true
},
+ "micromark": {
+ "version": "2.11.4",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
+ "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.0.0",
+ "parse-entities": "^2.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ }
+ }
+ },
"micromatch": {
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
@@ -33882,9 +33905,9 @@
}
},
"parse-entities": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz",
- "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+ "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
"dev": true,
"requires": {
"character-entities": "^1.0.0",
@@ -34177,15 +34200,6 @@
"htmlparser2": "^3.10.0"
}
},
- "postcss-jsx": {
- "version": "0.36.4",
- "resolved": "https://registry.npmjs.org/postcss-jsx/-/postcss-jsx-0.36.4.tgz",
- "integrity": "sha512-jwO/7qWUvYuWYnpOb0+4bIIgJt7003pgU3P6nETBLaOyBXuTD55ho21xnals5nBrlpTIFodyd3/jBi6UO3dHvA==",
- "dev": true,
- "requires": {
- "@babel/core": ">=7.2.2"
- }
- },
"postcss-less": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz",
@@ -34195,45 +34209,12 @@
"postcss": "^7.0.14"
}
},
- "postcss-markdown": {
- "version": "0.36.0",
- "resolved": "https://registry.npmjs.org/postcss-markdown/-/postcss-markdown-0.36.0.tgz",
- "integrity": "sha512-rl7fs1r/LNSB2bWRhyZ+lM/0bwKv9fhl38/06gF6mKMo/NPnp55+K1dSTosSVjFZc0e1ppBlu+WT91ba0PMBfQ==",
- "dev": true,
- "requires": {
- "remark": "^10.0.1",
- "unist-util-find-all-after": "^1.0.2"
- }
- },
"postcss-media-query-parser": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
"integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
"dev": true
},
- "postcss-reporter": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz",
- "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.1",
- "lodash": "^4.17.11",
- "log-symbols": "^2.2.0",
- "postcss": "^7.0.7"
- },
- "dependencies": {
- "log-symbols": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
- "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.1"
- }
- }
- }
- },
"postcss-resolve-nested-selector": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
@@ -34269,31 +34250,13 @@
}
},
"postcss-selector-parser": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
- "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+ "version": "6.0.6",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
+ "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
"dev": true,
"requires": {
- "dot-prop": "^5.2.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- },
- "dependencies": {
- "dot-prop": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
- "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
- "dev": true,
- "requires": {
- "is-obj": "^2.0.0"
- }
- },
- "is-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
- "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
- "dev": true
- }
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
}
},
"postcss-syntax": {
@@ -34967,59 +34930,32 @@
}
},
"remark": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz",
- "integrity": "sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==",
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
+ "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
"dev": true,
"requires": {
- "remark-parse": "^6.0.0",
- "remark-stringify": "^6.0.0",
- "unified": "^7.0.0"
+ "remark-parse": "^9.0.0",
+ "remark-stringify": "^9.0.0",
+ "unified": "^9.1.0"
}
},
"remark-parse": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz",
- "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==",
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+ "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
"dev": true,
"requires": {
- "collapse-white-space": "^1.0.2",
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "is-word-character": "^1.0.0",
- "markdown-escapes": "^1.0.0",
- "parse-entities": "^1.1.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "trim": "0.0.1",
- "trim-trailing-lines": "^1.0.0",
- "unherit": "^1.0.4",
- "unist-util-remove-position": "^1.0.0",
- "vfile-location": "^2.0.0",
- "xtend": "^4.0.1"
+ "mdast-util-from-markdown": "^0.8.0"
}
},
"remark-stringify": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-6.0.4.tgz",
- "integrity": "sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==",
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz",
+ "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==",
"dev": true,
"requires": {
- "ccount": "^1.0.0",
- "is-alphanumeric": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "longest-streak": "^2.0.1",
- "markdown-escapes": "^1.0.0",
- "markdown-table": "^1.1.0",
- "mdast-util-compact": "^1.0.0",
- "parse-entities": "^1.0.2",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "stringify-entities": "^1.0.1",
- "unherit": "^1.0.4",
- "xtend": "^4.0.1"
+ "mdast-util-to-markdown": "^0.6.0"
}
},
"remove-trailing-separator": {
@@ -35049,12 +34985,6 @@
"is-finite": "^1.0.0"
}
},
- "replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
- "dev": true
- },
"request": {
"version": "2.88.2",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
@@ -35139,6 +35069,12 @@
"integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
"dev": true
},
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true
+ },
"require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
@@ -35973,12 +35909,6 @@
"integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
"dev": true
},
- "state-toggle": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
- "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==",
- "dev": true
- },
"static-extend": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
@@ -36216,18 +36146,6 @@
"safe-buffer": "~5.1.0"
}
},
- "stringify-entities": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz",
- "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==",
- "dev": true,
- "requires": {
- "character-entities-html4": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-hexadecimal": "^1.0.0"
- }
- },
"stringify-object": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
@@ -36310,61 +36228,79 @@
"dev": true
},
"stylelint": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-12.0.1.tgz",
- "integrity": "sha512-1mn39pqZiC/e8KUPoRMc1WMM83Upb2ILaSGxkCvKxALHutEOs2txcPQocJiXdO4Zx4FY4prGqjlkwrbthAxqig==",
+ "version": "13.13.1",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz",
+ "integrity": "sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==",
"dev": true,
"requires": {
- "autoprefixer": "^9.7.1",
- "balanced-match": "^1.0.0",
- "chalk": "^3.0.0",
- "cosmiconfig": "^6.0.0",
- "debug": "^4.1.1",
+ "@stylelint/postcss-css-in-js": "^0.37.2",
+ "@stylelint/postcss-markdown": "^0.36.2",
+ "autoprefixer": "^9.8.6",
+ "balanced-match": "^2.0.0",
+ "chalk": "^4.1.1",
+ "cosmiconfig": "^7.0.0",
+ "debug": "^4.3.1",
"execall": "^2.0.0",
- "file-entry-cache": "^5.0.1",
- "get-stdin": "^7.0.0",
+ "fast-glob": "^3.2.5",
+ "fastest-levenshtein": "^1.0.12",
+ "file-entry-cache": "^6.0.1",
+ "get-stdin": "^8.0.0",
"global-modules": "^2.0.0",
- "globby": "^9.2.0",
+ "globby": "^11.0.3",
"globjoin": "^0.1.4",
"html-tags": "^3.1.0",
- "ignore": "^5.1.4",
+ "ignore": "^5.1.8",
"import-lazy": "^4.0.0",
"imurmurhash": "^0.1.4",
- "known-css-properties": "^0.17.0",
- "leven": "^3.1.0",
- "lodash": "^4.17.15",
- "log-symbols": "^3.0.0",
- "mathml-tag-names": "^2.1.1",
- "meow": "^5.0.0",
- "micromatch": "^4.0.2",
+ "known-css-properties": "^0.21.0",
+ "lodash": "^4.17.21",
+ "log-symbols": "^4.1.0",
+ "mathml-tag-names": "^2.1.3",
+ "meow": "^9.0.0",
+ "micromatch": "^4.0.4",
"normalize-selector": "^0.2.0",
- "postcss": "^7.0.21",
+ "postcss": "^7.0.35",
"postcss-html": "^0.36.0",
- "postcss-jsx": "^0.36.3",
"postcss-less": "^3.1.4",
- "postcss-markdown": "^0.36.0",
"postcss-media-query-parser": "^0.2.3",
- "postcss-reporter": "^6.0.1",
"postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^4.0.1",
- "postcss-sass": "^0.4.2",
- "postcss-scss": "^2.0.0",
- "postcss-selector-parser": "^3.1.0",
+ "postcss-safe-parser": "^4.0.2",
+ "postcss-sass": "^0.4.4",
+ "postcss-scss": "^2.1.1",
+ "postcss-selector-parser": "^6.0.5",
"postcss-syntax": "^0.36.2",
- "postcss-value-parser": "^4.0.2",
+ "postcss-value-parser": "^4.1.0",
"resolve-from": "^5.0.0",
"slash": "^3.0.0",
"specificity": "^0.4.1",
- "string-width": "^4.2.0",
+ "string-width": "^4.2.2",
"strip-ansi": "^6.0.0",
"style-search": "^0.1.0",
"sugarss": "^2.0.0",
"svg-tags": "^1.0.0",
- "table": "^5.4.6",
- "v8-compile-cache": "^2.1.0",
- "write-file-atomic": "^3.0.1"
+ "table": "^6.6.0",
+ "v8-compile-cache": "^2.3.0",
+ "write-file-atomic": "^3.0.3"
},
"dependencies": {
+ "@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true
+ },
+ "ajv": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz",
+ "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -36374,6 +36310,24 @@
"color-convert": "^2.0.1"
}
},
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
+ "dev": true
+ },
"braces": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
@@ -36383,27 +36337,10 @@
"fill-range": "^7.0.1"
}
},
- "camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
- "dev": true
- },
- "camelcase-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz",
- "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=",
- "dev": true,
- "requires": {
- "camelcase": "^4.1.0",
- "map-obj": "^2.0.0",
- "quick-lru": "^1.0.0"
- }
- },
"chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"dev": true,
"requires": {
"ansi-styles": "^4.1.0",
@@ -36426,14 +36363,51 @@
"dev": true
},
"debug": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
- "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
},
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.6.tgz",
+ "integrity": "sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ==",
+ "dev": true,
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ }
+ },
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -36443,21 +36417,37 @@
"to-regex-range": "^5.0.1"
}
},
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"requires": {
- "locate-path": "^2.0.0"
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
}
},
- "get-stdin": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz",
- "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==",
+ "flatted": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
"dev": true
},
+ "get-stdin": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
+ "dev": true
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
"global-modules": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
@@ -36478,23 +36468,49 @@
"which": "^1.3.1"
}
},
+ "globby": {
+ "version": "11.0.4",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
+ "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
+ "dev": true,
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.1.1",
+ "ignore": "^5.1.4",
+ "merge2": "^1.3.0",
+ "slash": "^3.0.0"
+ }
+ },
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
+ "hosted-git-info": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
+ "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
"ignore": {
"version": "5.1.8",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
"integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
"dev": true
},
- "indent-string": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
- "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
- "dev": true
+ "is-core-module": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
+ "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
},
"is-number": {
"version": "7.0.0",
@@ -36502,69 +36518,65 @@
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
- "load-json-file": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
- "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^4.0.0",
- "pify": "^3.0.0",
- "strip-bom": "^3.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "dev": true,
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "map-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz",
- "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=",
+ "json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
- "meow": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz",
- "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==",
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
"dev": true,
"requires": {
- "camelcase-keys": "^4.0.0",
- "decamelize-keys": "^1.0.0",
- "loud-rejection": "^1.0.0",
- "minimist-options": "^3.0.1",
- "normalize-package-data": "^2.3.4",
- "read-pkg-up": "^3.0.0",
- "redent": "^2.0.0",
- "trim-newlines": "^2.0.0",
- "yargs-parser": "^10.0.0"
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "meow": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
+ "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
+ "dev": true,
+ "requires": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize": "^1.2.0",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
}
},
"micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+ "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
"dev": true,
"requires": {
"braces": "^3.0.1",
- "picomatch": "^2.0.5"
- }
- },
- "minimist-options": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz",
- "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==",
- "dev": true,
- "requires": {
- "arrify": "^1.0.1",
- "is-plain-obj": "^1.1.0"
+ "picomatch": "^2.2.3"
}
},
"ms": {
@@ -36573,90 +36585,32 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "normalize-package-data": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz",
+ "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==",
"dev": true,
"requires": {
- "p-try": "^1.0.0"
+ "hosted-git-info": "^4.0.1",
+ "resolve": "^1.20.0",
+ "semver": "^7.3.4",
+ "validate-npm-package-license": "^3.0.1"
}
},
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "dev": true,
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
"dev": true
},
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "resolve": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+ "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
"dev": true,
"requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- }
- },
- "path-type": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
- "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
- "dev": true,
- "requires": {
- "pify": "^3.0.0"
- }
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
- "dev": true
- },
- "quick-lru": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz",
- "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
- "dev": true
- },
- "read-pkg": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
- "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
- "dev": true,
- "requires": {
- "load-json-file": "^4.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^3.0.0"
- }
- },
- "read-pkg-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
- "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
- "dev": true,
- "requires": {
- "find-up": "^2.0.0",
- "read-pkg": "^3.0.0"
- }
- },
- "redent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz",
- "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=",
- "dev": true,
- "requires": {
- "indent-string": "^3.0.0",
- "strip-indent": "^2.0.0"
+ "is-core-module": "^2.2.0",
+ "path-parse": "^1.0.6"
}
},
"resolve-from": {
@@ -36665,12 +36619,52 @@
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true
},
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "semver": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+ "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
"slash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ }
+ },
+ "string-width": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+ "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
"strip-ansi": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
@@ -36680,18 +36674,6 @@
"ansi-regex": "^5.0.0"
}
},
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
- "dev": true
- },
- "strip-indent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz",
- "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=",
- "dev": true
- },
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -36701,6 +36683,20 @@
"has-flag": "^4.0.0"
}
},
+ "table": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
+ "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==",
+ "dev": true,
+ "requires": {
+ "ajv": "^8.0.1",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -36710,10 +36706,16 @@
"is-number": "^7.0.0"
}
},
- "trim-newlines": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz",
- "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=",
+ "type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true
+ },
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
"dev": true
},
"which": {
@@ -36725,14 +36727,17 @@
"isexe": "^2.0.0"
}
},
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
"yargs-parser": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
- "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
- "dev": true,
- "requires": {
- "camelcase": "^4.1.0"
- }
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true
}
}
},
@@ -36752,20 +36757,20 @@
}
},
"stylelint-config-wordpress": {
- "version": "16.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-wordpress/-/stylelint-config-wordpress-16.0.0.tgz",
- "integrity": "sha512-fu8F2a3DTHjo7Id4rUbua2FprieKBDQ+jQ67XVBMsys8YyBjOd/CdcCRiWQug4sA1/A41lq0JlD2gOlR0dWmpw==",
+ "version": "17.0.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-wordpress/-/stylelint-config-wordpress-17.0.0.tgz",
+ "integrity": "sha512-qUU2kVMd2ezIV9AzRdgietIfnavRRENt4180A1OMoVXIowRjjhohZgBiyVPV5EtNKo3GTO63l8g/QGNG27/h9g==",
"dev": true,
"requires": {
"stylelint-config-recommended": "^3.0.0",
- "stylelint-config-recommended-scss": "^4.1.0",
- "stylelint-scss": "^3.13.0"
+ "stylelint-config-recommended-scss": "^4.2.0",
+ "stylelint-scss": "^3.17.2"
}
},
"stylelint-scss": {
- "version": "3.18.0",
- "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.18.0.tgz",
- "integrity": "sha512-LD7+hv/6/ApNGt7+nR/50ft7cezKP2HM5rI8avIdGaUWre3xlHfV4jKO/DRZhscfuN+Ewy9FMhcTq0CcS0C/SA==",
+ "version": "3.19.0",
+ "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.19.0.tgz",
+ "integrity": "sha512-Ic5bsmpS4wVucOw44doC1Yi9f5qbeVL4wPFiEOaUElgsOuLEN6Ofn/krKI8BeNL2gAn53Zu+IcVV4E345r6rBw==",
"dev": true,
"requires": {
"lodash": "^4.17.15",
@@ -36773,20 +36778,6 @@
"postcss-resolve-nested-selector": "^0.1.1",
"postcss-selector-parser": "^6.0.2",
"postcss-value-parser": "^4.1.0"
- },
- "dependencies": {
- "postcss-selector-parser": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
- "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
- "dev": true,
- "requires": {
- "cssesc": "^3.0.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1",
- "util-deprecate": "^1.0.2"
- }
- }
}
},
"sugarss": {
@@ -37214,12 +37205,6 @@
"punycode": "^2.1.0"
}
},
- "trim": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
- "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
- "dev": true
- },
"trim-newlines": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
@@ -37238,12 +37223,6 @@
"integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
"dev": true
},
- "trim-trailing-lines": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz",
- "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==",
- "dev": true
- },
"trough": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
@@ -37371,16 +37350,6 @@
"util-deprecate": "^1.0.2"
}
},
- "unherit": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
- "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.0",
- "xtend": "^4.0.0"
- }
- },
"unicode-canonical-property-names-ecmascript": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
@@ -37410,19 +37379,31 @@
"dev": true
},
"unified": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz",
- "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==",
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz",
+ "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==",
"dev": true,
"requires": {
- "@types/unist": "^2.0.0",
- "@types/vfile": "^3.0.0",
"bail": "^1.0.0",
"extend": "^3.0.0",
- "is-plain-obj": "^1.1.0",
+ "is-buffer": "^2.0.0",
+ "is-plain-obj": "^2.0.0",
"trough": "^1.0.0",
- "vfile": "^3.0.0",
- "x-is-string": "^0.1.0"
+ "vfile": "^4.0.0"
+ },
+ "dependencies": {
+ "is-buffer": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+ "dev": true
+ },
+ "is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true
+ }
}
},
"union-value": {
@@ -37437,12 +37418,6 @@
"set-value": "^2.0.1"
}
},
- "uniq": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
- "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
- "dev": true
- },
"unique-filename": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
@@ -37462,29 +37437,20 @@
}
},
"unist-util-find-all-after": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.5.tgz",
- "integrity": "sha512-lWgIc3rrTMTlK1Y0hEuL+k+ApzFk78h+lsaa2gHf63Gp5Ww+mt11huDniuaoq1H+XMK2lIIjjPkncxXcDp3QDw==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz",
+ "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==",
"dev": true,
"requires": {
- "unist-util-is": "^3.0.0"
+ "unist-util-is": "^4.0.0"
}
},
"unist-util-is": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
- "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
+ "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
"dev": true
},
- "unist-util-remove-position": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz",
- "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==",
- "dev": true,
- "requires": {
- "unist-util-visit": "^1.1.0"
- }
- },
"unist-util-stringify-position": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
@@ -37494,24 +37460,6 @@
"@types/unist": "^2.0.2"
}
},
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "dev": true,
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- },
- "unist-util-visit-parents": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
- "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
- "dev": true,
- "requires": {
- "unist-util-is": "^3.0.0"
- }
- },
"universal-user-agent": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz",
@@ -37721,46 +37669,25 @@
}
},
"vfile": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz",
- "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
+ "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
"dev": true,
"requires": {
+ "@types/unist": "^2.0.0",
"is-buffer": "^2.0.0",
- "replace-ext": "1.0.0",
- "unist-util-stringify-position": "^1.0.0",
- "vfile-message": "^1.0.0"
+ "unist-util-stringify-position": "^2.0.0",
+ "vfile-message": "^2.0.0"
},
"dependencies": {
"is-buffer": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
- "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+ "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
"dev": true
- },
- "unist-util-stringify-position": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
- "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
- "dev": true
- },
- "vfile-message": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
- "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
- "dev": true,
- "requires": {
- "unist-util-stringify-position": "^1.1.1"
- }
}
}
},
- "vfile-location": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz",
- "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==",
- "dev": true
- },
"vfile-message": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
@@ -38507,12 +38434,6 @@
"integrity": "sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ==",
"dev": true
},
- "x-is-string": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
- "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
- "dev": true
- },
"xml-name-validator": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
@@ -38699,6 +38620,12 @@
}
}
}
+ },
+ "zwitch": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
+ "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
+ "dev": true
}
}
}
diff --git a/package.json b/package.json
index 3c9b50a16e1..f9c24cc66f9 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "woocommerce",
"title": "WooCommerce",
- "version": "5.5.0",
+ "version": "5.6.0",
"homepage": "https://woocommerce.com/",
"repository": {
"type": "git",
@@ -88,8 +88,8 @@
"mocha": "7.2.0",
"node-sass": "4.14.1",
"prettier": "npm:wp-prettier@2.0.5",
- "stylelint": "12.0.1",
- "stylelint-config-wordpress": "16.0.0",
+ "stylelint": "^13.8.0",
+ "stylelint-config-wordpress": "17.0.0",
"typescript": "3.9.7",
"webpack": "4.44.2",
"webpack-cli": "3.3.12",
diff --git a/readme.txt b/readme.txt
index 3a622af86bb..a4b72c4bfde 100644
--- a/readme.txt
+++ b/readme.txt
@@ -4,7 +4,7 @@ Tags: e-commerce, store, sales, sell, woo, shop, cart, checkout, downloadable, d
Requires at least: 5.5
Tested up to: 5.7
Requires PHP: 7.0
-Stable tag: 5.3.0
+Stable tag: 5.4.1
License: GPLv3
License URI: https://www.gnu.org/licenses/gpl-3.0.html
@@ -159,136 +159,180 @@ If you encounter issues with the shop/category pages after an update, flush the
WooCommerce comes with some sample data you can use to see how products look; import sample_products.xml via the [WordPress importer](https://wordpress.org/plugins/wordpress-importer/). You can also use the core [CSV importer](https://docs.woocommerce.com/document/product-csv-importer-exporter/?utm_source=wp%20org%20repo%20listing&utm_content=3.6) or our [CSV Import Suite extension](https://woocommerce.com/products/product-csv-import-suite/?utm_source=wp%20org%20repo%20listing&utm_content=3.6) to import sample_products.csv
== Changelog ==
-
-= 5.3.0 2021-05-11 =
+= 5.5.0-beta.1 2021-06-22 =
**WooCommerce**
-* Dev - Add support for "cities" and "postcodes" fields to the REST API endpoints to create/update tax rates. #29495
-* Dev - The taxes GET endpoint now supports sorting by priority. #29495
-* Enhancement - Add a new `woocommerce_cart_product_not_enough_stock_already_in_cart_message` filter to allow developers to filter an add-to-cart error when there isn't enough in stock taking into account what's already in the cart. #29304
-* Enhancement - Pass `$handler`, and prevent logging from `woocommerce_logger_log_message` filter when the message is null. #29572
-* Fix - Added parameter `$item` (instance of WC_Order_Item) to both the function `wc_downloadable_file_permission` and the filter hook `woocommerce_downloadable_file_permission`. #23188
-* Fix - Add array-typed "cities" and "postcodes" to the response of the "tax" endpoint in the REST API to overcome the limitation of "city" and "postcode" returning always one single value. #27751
-* Fix - Update tax rate for existing taxes when recalculating order totals. #27985
-* Fix - Replace page setup dropdowns with AJAX powered search selects. #29181
-* Fix - Return 0 if order isn't available in `WC_Payment_Gateway::get_order_total()`. #29314
-* Fix - Fix console error on IE11 when opening admin pages. #29322
-* Fix - Prevent crash when log file can't be opened for writing. #29396
-* Fix - Closes the section "Store management insights" in email settings. #29447
-* Fix - Fixed return type of `WC_Shortcode_Products::get_type()`. #29452
-* Fix - Fix syntax error in the admin (products/orders) list table. #29469
-* Fix - Cart duplicate debug shipping notices in certain situations. #29480
-* Fix - Trying to update the cities or postcodes (only) or a tax rate via REST API returned an error. #29495
-* Fix - Unneeded browser popup message of unsaved changes when adding a shipping zone with a shipping method. #29510
-* Fix - Update the persistent cart after it's loaded on customer login. Fixes an issue whereby unavailable products would be validated on every login. #29517
-* Fix - Updated `$customer->get_shipping()` and `$customer->get_billing()` to return the full address after updating individual fields. #29538
-* Fix - Prevent cart to reset all nonce in front-end. #29542
-* Fix - Bump the version of the "Grouped product add to cart" template to 4.8.0 (was still at 4.0.0 by mistake). #29601
-* Fix - If we have a non-empty shipping address then do not overwrite the state or country fields with billing address data. #29605
-* Tweak - Add the support to `optgroups` in single select on Settings API. #29145
-* Tweak - Improves performance by avoiding an unnecessary redirect if custom permalink structure does not contain trailing slashes. #29422
-* Tweak - Update SSR db version tooltip to more accurately state the db version. #29438
-* Tweak - Adjust Twenty Twenty One order items header alignment. #29485
-* Tweak - Lost password form alignment issues. #29496
-* Tweak - Improve accessibility by adding `aria-hidden="true"` on strikethrough prices. #29603
-* Tweak - Default store location to US California. #29654
-* Tweak - Default store currency to USD. #29752
+* Performance - Set Geolocation fallback transients to expire in one day instead of one week. #29987
+* Enhancement - [Transparency] CLI command for viewing tracking data for your store. #30010
+* Enhancement - All settings pages can now be extended consistently with new sections and settings. Also, unit tests have been added. #27684
+* Enhancement - Set checkout fields value with the default defined value where form is not presented to the user. #29820
+* Tweak - Show legacy widget instance in Rest API. #30012
+* Tweak - No longer load PayPal Standard by default on new installs. #29971
+* Tweak - Rename Products, Products by Rating, and Recent Viewed Products widgets to Products list, Products by Rating list, and Recently Viewed Products list. #29941
+* Tweak - By default the postcode field will no longer be used, and the state field will become optional, for Curaçao. #29848
+* Tweak - Handle WP_Error while creating placeholder image during install. #29783
+* Fix - Allow block templates for WooCommerce pages. #30013
+* Fix - Download IDs are included in export CSV and imported when updating existing products to maintain download permissions. #29970
+* Fix - Fees added to an order from wp-admin are now calculated correctly the first time. #29945
+* Fix - Prevent caching of cart/checkout page when using Chrome browser. #29912
+* Fix - Invoice emails now contain payment link if the order needs payment, not just when the order is "pending". #29833
+* Fix - Introduce meta to track stocks that refunded and restocked to properly handle stock recalculation. #29762
+* Fix - Resolved a console error that could occur when clicking Add Shipping Zone. #30015
+* Dev - Added an if condition block to check for new install before creating Zero and Reduced rate tax classes in class-wc-install.php. #29938
+* Dev - Product attributes lookup table usage when enabled. #29896
+* Dev - Set $woocommerce_loop name propriety to widget "Products". #29847
+* Dev - Reduce the potential for errors when plugins implement REST API endpoints based on WooCommerce's own products controller. #29835
+* Dev - Remove ABSPATH check in interfaces. #30124
+* Dev - Add ability to bulk update order status to cancelled. #30116
+* Dev - Register woocommerce.css in editor screens so it can be enqueued in the editor. #30093
+* Dev - Add Customize WooCommerce link for block-based themes. #30044
-** WooCommerce Blocks - 4.8.0 & 4.9.0 & 4.9.1 **
+**WooCommerce Admin - 2.4.0 **
-* Dev - Removed legacy handling for SSR blocks that rendered shortcodes. #4010
-* Fix - Customer address country saving to orders in certain circumstances. #4013
-* Fix - Prevent error messages returned by the API from displaying raw HTML. #4005
-* Fix - Proceed to checkout button click bug happening when the Coupon error is visible in the Cart block. #3996
-* Fix - Use font color in payment methods border. #4051
-* Fix - Load translation file for JS files that has translatable strings. #4050
-* Fix - Stop shipping package titles line-breaks occurring in the middle of a word. #4049
-* Fix - Fixed styling issues on the cart and checkout page in Twenty(X) themes. #4046
-* Fix - Fix headline alignment in the empty state of the cart block. #4044
-* Fix - Fix button alignment in Featured Product and Featured Category blocks. #4028
-* Fix - Check if Cart and Checkout are registered before removing payment methods. #4056
-* Enhancement - Registered payment methods now have access to the `shouldSavePayment` prop in their components (which indicates whether the shopper has checked the save payment method checkbox. #3990
-* Enhancement - Payment methods implementing the `savedTokenComponent` configuration property will now have the `onPaymentProcessing` event available to the registered component. #3982
+* Add - SlotFill to Abbreviated Notification panel #7091
+* Add - Consume remote payment methods on frontend #6867
+* Add - Extend payment gateways REST endpoint #6919
+* Add - Add remote payment gateway recommendations initial docs #6962
+* Add - Add loading placeholders for payment gateways task #7123
+* Add - Note date range logic for GivingFeedback, and InsightFirstSale note. #6969
+* Add - Add transient notices feature #6809
+* Add - Add transformers in remote inbox notifications #6948
+* Add - Add Mercado Pago as default fallback payment gateway #7043
+* Add - Add in Razorpay as default fallback payment gateway #7096
+* Add - Get post install scripts from gateway and enqueue in client #6967
+* Add - Add eWAY as default fallback gateway #7108
+* Add - Free extension list powered by remote config #6952
+* Add - Add PayPal to fallback payment gateways #7001
+* Add - Add a data store for WC Payments REST APIs #6918
+* Add - Progressive setup checklist copy and call to action buttons. #6956
+* Add - Add Paystack as fallback gateway #7025
+* Add - Add Square as default fallback gateway #7107
+* Add - Add COD method to default payment gateway recommendations #7057
+* Add - Add BACS as default fallback payment gateway #7073
+* Add - A/B test of progressive checklist features. #7089
+* Add - Add payment gateway return URL and action #7095
+* Add - Add Mollie to the default payment gateways. #7092
+* Add - Show task and activity notifications in the Inbox panel #7017
+* Add - Adding WCPay payment configuration defaults. #7097
+* Add - Create onboarding package to house refactored WCPay card and relevant components #7058
+* Dev - Add Jetpack Backup admin note #6738
+* Dev - Reduce the specificity and complexity of the ReportError component #6846
+* Dev - Converting component to TypeScript. #6981
+* Dev - Update package-lock to fix versioning of local packages. #6843
+* Dev - Use rule processing for remote payment methods #6830
+* Dev - Update E2E jest config, so it correctly creates screenshots on failure. #6858
+* Dev - Fixed storybook build script #6875
+* Dev - Removed allowed keys list for adding woocommerce_meta data. #6889 🎉 @xristos3490
+* Dev - Delete all products when running product import tests, unskip previously skipped test. #6905
+* Dev - Add payment method selector to onboarding store #6921
+* Dev - Add disabled prop to SelectControl #6902
+* Dev - Add filter variation to tracks data in products analytics. #6913
+* Dev - Offload remote inbox notifications engine run using action-scheduler. #6995
+* Dev - Add source param support for notes query. #6979
+* Dev - Remove the use of Dashicons and replace with @wordpress/icons or gridicons. #7020
+* Dev - Refactor inbox panel components and moved to experimental package. #7006
+* Dev - Business features uncheck creative mail by default #7139
+* Dev - Remove support for IE11. #7112
+* Dev - Drop styling support for IE11. #7137
+* Dev - Remove react-docgen docs in favor of Storybook #7055
+* Enhancement - Add expand/collapse to extendable task list. #6910
+* Enhancement - Add task hierarchy support to extended task list. #6916
+* Enhancement - Add remind me later option to task list. #6923
+* Enhancement - Enable Remote Free Extensions List #7144
+* Enhancement - Adding Slotfills for remote payments and SettingsForm component. #6932
+* Fix - Update the wordpress/babel-preset to avoid crashes in WP5.8 beta2 #7202
+* Fix - Add fallback for the select/dispatch data-controls for older WP versions #7204
+* Fix - RemoteFreeExtension hide bundle when all of its plugins are not visible #7182
+* Fix - Issue where summary stats were not showing in Analytics > Stock. #7161
+* Fix - Rule Processing Transformer to handle dotNotation default value #7009
+* Fix - Remove Navigation's uneeded SlotFill context #6832
+* Fix - Report filters expecting specific ordering. #6847
+* Fix - Render bug with report comparison mode selections. #6862
+* Fix - Throw exception if the data store cannot be loaded when trying to use notes. #6771
+* Fix - Autocompleter for custom Search in FilterPicker #6880
+* Fix - Get currency from CurrencyContext #6723
+* Fix - Correct the left position of transient notices when the new nav is used. #6914
+* Fix - Exclude WC Shipping for store that are only offering downloadable products #6917
+* Fix - SelectControl focus and de-focus bug #6906
+* Fix - Multiple preload tag output bug. #6998
+* Fix - Call existing filters for leaderboards in analytics. #6626
+* Fix - Set target to blank for the external links #6999
+* Fix style regression with the Chart header. #7002
+* Fix styling of the advanced filter operator selection. #7005
+* Fix - Deprecated warnings from select control @wordpress/data-controls. #7007
+* Fix - Bug with Orders Report coupon exclusion filter. #7021
+* Fix - Show Google Listing and Ads in installed marketing extensions section. #7029
+* Fix - Notices not dissapearing. #7077
+* Fix - Keyboard accessibility on the free features tab. #7149
+* Fix - Fix error handling when remote free extension API returns empty array. #7147
+* Fix - Transformer casing is incorrect and creates an error on case-sensitive systems #7104
+* Fix - Preventing redundant notices when installing plugins via payments task list. #7026
+* Fix - Autocompleter for custom Search in CompareFilter #6911
+* Fix - Add target to the button to open it in a new tab #7110
+* Fix - Make `Search` accept synchronous `autocompleter.options`. #6884
+* Fix - Set autoload to false for all remote inbox notifications options. #7060
+* Tweak - Setup checklist copy revert. #7015
+* Tweak - Revert Card component removal #7167
+* Update - Task list component with new Experimental Task list. #6849
+* Update - Optimize payment gateway resolution #7124
+* Update - Experimental task list import to the experimental package. #6950
+* Update - Redirect to WC Home after setting up a payment method #6891
+* Update - Hook up payments gateway data store #7038
+* Update - Update remote payment docs gateway methods #7079
+* Update - Remove original business step flow #7103
+* Update - WooCommerce Shipping copy on onboarding steps #7148
-** WooCommerce Admin - 2.2.0 & 2.2.1 & 2.2.2 & 2.2.3 & 2.2.4 & 2.2.5 & 2.2.6 **
-* Add - Next new novel navigation nudge note #6610
-* Add - Add legacy report items to new navigation #6507
-* Add - Add preview site button on the appearance task #6457
-* Add - Back button to go to home screen from tasks in the task list. #6397
-* Add - Add a "rather not say" option to revenue in the profile wizard. #6475
-* Add - Remove Mollie promo note on install #6510
-* Add - Remote Inbox Notifications rule to trigger when WooCommerce Admin is upgraded. #6040
-* Add - CES survey for search product, order, customer #6420
-* Add - CES survey for importing products #6419
-* Add - CES survey for adding product categories, tags, and attributes #6418
-* Add - Additional analytics tracking for the business details step. #6575
-* Add - Include tracking for mail poet installs in the selective bundle install #6603
-* Add - Paystack payment provider to several african countries. #6579
-* Dev - Close activity panel tabs by default and track #6566
-* Dev - Update undefined task name properties for help panel tracks #6565
-* Dev - Refactor profile wizard benefits step and add tests #6583
-* Dev - Add filter to profile wizard steps #6564
-* Dev - Add nav intro modal tests #6518
-* Dev - Use wc filter to get status tabs for tools category #6525
-* Dev - Add nav header component tests #6509
-* Dev - Add initial tests for navigation Menu class #6492
-* Dev - Remove active item from navigation store #6486
-* Dev - Add navigation container tests #6464
-* Dev - Add nav favorite button tests #6446
-* Dev - Add a changelog lint check to PRs. #6414
-* Dev - Add navigation favorites tests #6409
-* Dev - support use of Array.flat in client and packages. #6411
-* Dev - Deprecate Onboarding::has_woocommerce_support. #6401
-* Dev - Add Dependency Extraction Webpack Plugin #5762
-* Dev - Add client-side filter for Navigation rootBackUrl #6505
-* Dev - Remove `items_purchased` and `account_type` props from onboarding profile API. #6520
-* Dev - Added warning when WC-Admin is active but not being used #6453
-* Dev - Store profiler - Added MailPoet to Business Details step #6503
-* Dev - Store profiler - Added MailPoet to new Business Details step #6515
-* Dev - Add tilde (~) to represent client root directory for imports. #6517
-* Dev - Add script automation for gathering hooks and filters. #6454
-* Dev - Add TypeScript and page objects to the E2E test suite. #6582
-* Dev - Introduce Typescript to Navigation utils #6477
-* Dev - Payments task: include Mercado Pago #6572
-* Dev - Ensure script asset.php files are included in builds #6635
-* Dev - Ensure production script asset names don't include .min suffix #6681
-* Dev - Do a git clean before the core release. #6945
-* Dev - Fix a bug where trying to load an asset registry causes a crash. #6951
-* Fix - Add check for navigating being enabled. #6462
-* Fix - Move the shipping input and text 1px lower. #6408
-* Fix - Correct the Klarna slug #6440
-* Fix - Broken link anchors to online documentation. #6455
-* Fix - Update payment card style on mobile #6413
-* Fix - Missing i18n in Welcome modal. #6456
-* Fix - Restore visual styles back to Analytics tabs. #5913
-* Fix - Update contrast and hover / active colors for analytics dropdown buttons #6504
-* Fix - Associated Order Number for refunds was hidden #6428
-* Fix - Fix issue where Loader::is_admin_page() would error if WooCommerce admin is disabled. #6563
-* Fix - Correct a bug where the JP connection flow would not happen when installing JP in the OBW. #6521
-* Fix - Show management links when the task list is complete (even if its not hidden). #6657
-* Fix - Adding New Zealand and Ireland to selective bundle option, previously missed. #6649
-* Fix - Update the Mercado option used for enabling/disabling. #6677
-* Fix - Improve AddFirstProduct email note contents. #6617
-* Fix - Check if features are currently being enabled #6688
-* Fix - Fix the activity panel toggle not closing on click #6679
-* Fix - Fix use of feature checks and remove deprecated method calls #6687
-* Fix - Allow the manager role to query certain options #6577
-* Fix - Delete customer data on network user deletion #6574
-* Fix - Fix Themes step visibility in IE 11 #6578
-* Fix - Fix hidden menu title on smaller screens #6562
-* Fix - Add gross sales column to CSV export #6567
-* Fix - Disable the continue btn on OBW when requested are being made #6838
-* Fix - Calling of get_script_asset_filename with extra parameter #6955
-* Fix - Address an issue with OBW when installing only WooCommerce payments and Jetpack. #6957
-* Tweak - Add default value for contains op #6622
-* Tweak - Adjust targeting store age for the Add First Product note #6554
-* Tweak - Improve WC Shipping & Tax logic #6547
-* Tweak - Update Insight inbox note content #6555
-* Tweak - Remove mobile activity panel toggle #6539
-* Tweak - Refactor autoloader to remove global variable. #6412
-* Tweak - Revert WCPay international support for bundled package #6901
-* Tweak - Store profiler - Changed MailPoet's title and description #6886
-* Tweak - Update PayU logo #6829
+** WooCommerce Blocks Package - 5.2.0 & 5.3.0 & 5.3.1 **
+
+* Enhancement - Hide legacy widgets with a feature-complete block equivalent from the widget area block inserter. #4237
+* Enhancement - Provide block transforms for legacy widgets with a feature-complete block equivalent. #4292
+* Enhancement - Hide the All Products Block from the Customizer Widget Areas until full support is achieved. #4225
+* Enhancement - Improved accessibility and styling of the controls of several of ours blocks. #4100
+* Enhancement - Fix duplicate react keys in ProductDetails component. #4187
+* Fix - Fix a bug in which Cart Widget didn’t update when adding items from the All Products block. #4291
+* Fix - Fix an issue where an attempt to add an out-of-stock product to the cart was made when clicking the “Read more” button. #4265
+* Fix - Fix Product Categories List block display in Site Editor #4335.
+* Fix - Make links in the Product Categories List block unclickable in the editor #4339.
+* Fix - Fix rating stars not being shown in the Site Editor #4345.
+
+** WooCommerce Blocks Feature Plugin - 5.2.0 & 5.3.0 & 5.3.1 **
+
+* Enhancement - Added a key prop to each CartTotalItem within usePaymentMethodInterface. (4240)
+* Enhancement - Sync customer data during checkout with draft orders. (4197)
+* Enhancement - Update the display of the sidebar/order summary in the Cart and Checkout blocks. (4180)
+* Enhancement - Hide the Cart and Checkout blocks from the new block-based widget editor. (4303)
+* Fix - Hide tax breakdown if the total amount of tax to be paid is 0. (4262)
+* Fix - Prevent Coupon code panel from appearing in stores were coupons are disabled. (4202)
+* Fix - For payment methods, only use canMakePayment in the frontend (not the editor) context. (4188)
+* Fix - Fix sending of confirmation emails for orders when no payment is needed. (4186)
+* Fix - Stopped a warning being shown when using WooCommerce Force Sells and adding a product with a Synced Force Sell to the cart. (4182)
+* Fix - Fix some missing translations from the Cart and Checkout blocks. (4295)
+* Fix - Fix the flickering of the Proceed to Checkout button on quantity update in the Cart Block. (4293)
+* Fix - Fix a display issue when itemized taxes are enabled, but no products in the cart are taxable. (4284)
+* Compatibility - Add the ability for extensions to register callbacks to be executed by Blocks when the cart/extensions endpoint is hit. Extensions can now tell Blocks they need to do some server-side processing which will update the cart. (4298)
+* Tweak - Add couponName filter to allow extensions to modify how coupons are displayed in the Cart and Checkout summary. (4166)
+* Tweak - Move Button and Label components to @woocommerce/blocks-checkout package. (4222)
+* Tweak - Add Slot in the Discounts section of the cart sidebar to allow third party extensions to render their own components there. (4248)
+
+** ActionScheduler 3.2.0 **
+
+* Fix - Add "no ordering" option to as_next_scheduled_action().
+* Fix - Add secondary scheduled date checks when claiming actions (DBStore) | #634.
+* Fix - Add secondary scheduled date checks when claiming actions (wpPostStore) | #634.
+* Fix - Adds a new index to the action table, reducing the potential for deadlocks (props: @glagonikas).
+* Fix - Fix unit tests infrastructure and adapt tests to PHP 8.
+* Fix - Identify in-use data store.
+* Fix - Improve test_migration_is_scheduled.
+* Fix - PHP notice on list table.
+* Fix - Speed up clean up and batch selects.
+* Fix - Update pending dependencies.
+* Fix - [PHP 8.0] Only pass action arg values through to do_action_ref_array().
+* Fix - [PHP 8] Set the PHP version to 7.1 in composer.json for PHP 8 compatibility.
+* Fix - add is_initialized() to docs.
+* Fix - fix file permissions.
+* Fix - fixes #664 by replacing __ with esc_html__.
+* Fix - Add extra safety/account for different versions of AS and different loading patterns. #714
+* Fix - Handle hidden columns (Tools → Scheduled Actions) | #600.
[See changelog for all versions](https://raw.githubusercontent.com/woocommerce/woocommerce/trunk/changelog.txt).
diff --git a/tests/e2e/api/README.md b/tests/e2e/api/README.md
index 242996712fe..c21bc9ca82a 100644
--- a/tests/e2e/api/README.md
+++ b/tests/e2e/api/README.md
@@ -34,7 +34,7 @@ client = HTTPClientFactory.build( 'https://example.com' )
.create();
// You can then use the client to make API requests.
-httpClient.get( '/wc/v3/products' ).then( ( response ) => {
+client.get( '/wc/v3/products' ).then( ( response ) => {
// Access the status code from the response.
response.statusCode;
// Access the headers from the response.
diff --git a/tests/e2e/core-tests/specs/shopper/front-end-single-product.test.js b/tests/e2e/core-tests/specs/shopper/front-end-single-product.test.js
index 8d6fc05e9bd..d1473eb75a1 100644
--- a/tests/e2e/core-tests/specs/shopper/front-end-single-product.test.js
+++ b/tests/e2e/core-tests/specs/shopper/front-end-single-product.test.js
@@ -4,18 +4,37 @@
*/
const {
shopper,
- merchant,
createSimpleProduct,
createVariableProduct,
createGroupedProduct,
uiUnblocked
} = require( '@woocommerce/e2e-utils' );
-let simplePostIdValue;
-let variablePostIdValue;
-let groupedPostIdValue;
const config = require( 'config' );
+
+// Variables for simple product
const simpleProductName = config.get( 'products.simple.name' );
+let simplePostIdValue;
+
+// Variables for variable product
+const defaultVariableProduct = config.get( 'products.variable' );
+let variableProductId;
+
+// Variables for grouped product
+const simpleProductPrice = config.has('products.simple.price') ? config.get('products.simple.price') : '9.99';
+const simple1 = {
+ name: simpleProductName + ' 1',
+ regularPrice: simpleProductPrice
+};
+const simple2 = {
+ name: simpleProductName + ' 2',
+ regularPrice: simpleProductPrice
+};
+const groupedProduct = {
+ name: 'Grouped Product',
+ groupedProducts: [simple1, simple2]
+};
+let groupedPostIdValue;
const runSingleProductPageTest = () => {
describe('Single Product Page', () => {
@@ -43,30 +62,34 @@ const runSingleProductPageTest = () => {
});
});
- describe.skip('Variable Product Page', () => {
+ describe('Variable Product Page', () => {
beforeAll(async () => {
- await merchant.login();
- variablePostIdValue = await createVariableProduct();
- await merchant.logout();
+ variableProductId = await createVariableProduct();
});
it('should be able to add variation products to the cart', async () => {
// Add a product with one set of variations to cart
- await shopper.goToProduct(variablePostIdValue);
- await expect(page).toSelect('#attr-1', 'val1');
- await expect(page).toSelect('#attr-2', 'val1');
- await expect(page).toSelect('#attr-3', 'val1');
+ await shopper.goToProduct(variableProductId);
+
+ for (const attr of defaultVariableProduct.attributes) {
+ const { name, options } = attr;
+ const selectElem = `#${name.toLowerCase()}`;
+ const value = options[0];
+
+ await expect(page).toSelect(selectElem, value);
+ }
+
await shopper.addToCart();
await expect(page).toMatchElement('.woocommerce-message', {text: 'has been added to your cart.'});
// Verify cart contents
await shopper.goToCart();
- await shopper.productIsInCart('Variable Product with Three Variations');
+ await shopper.productIsInCart(defaultVariableProduct.name);
});
it('should be able to remove variation products from the cart', async () => {
// Remove items from cart
- await shopper.removeFromCart('Variable Product with Three Variations');
+ await shopper.removeFromCart(defaultVariableProduct.name);
await uiUnblocked();
await expect(page).toMatchElement('.cart-empty', {text: 'Your cart is currently empty.'});
});
@@ -74,9 +97,7 @@ const runSingleProductPageTest = () => {
describe('Grouped Product Page', () => {
beforeAll(async () => {
- await merchant.login();
- groupedPostIdValue = await createGroupedProduct();
- await merchant.logout();
+ groupedPostIdValue = await createGroupedProduct(groupedProduct);
});
it('should be able to add grouped products to the cart', async () => {
@@ -93,7 +114,7 @@ const runSingleProductPageTest = () => {
await quantityFields[1].type('5');
await shopper.addToCart();
await expect(page).toMatchElement('.woocommerce-message',
- {text: '“'+simpleProductName+' 1” and “'+simpleProductName+' 2” have been added to your cart.'});
+ {text: '“'+simpleProductName+' 1” and “'+simpleProductName+' 2” have been added to your cart.'});
// Verify cart contents
await shopper.goToCart();
diff --git a/tests/e2e/core-tests/specs/shopper/front-end-variable-product-updates.test.js b/tests/e2e/core-tests/specs/shopper/front-end-variable-product-updates.test.js
index 2cce3fd22b1..8c0ac5a9c5f 100644
--- a/tests/e2e/core-tests/specs/shopper/front-end-variable-product-updates.test.js
+++ b/tests/e2e/core-tests/specs/shopper/front-end-variable-product-updates.test.js
@@ -4,73 +4,103 @@
*/
const {
shopper,
- merchant,
createVariableProduct,
} = require( '@woocommerce/e2e-utils' );
+const config = require('config');
let variablePostIdValue;
const cartDialogMessage = 'Please select some product options before adding this product to your cart.';
+const attributes = config.get( 'products.variable.attributes' )
const runVariableProductUpdateTest = () => {
describe('Shopper > Update variable product',() => {
beforeAll(async () => {
- await merchant.login();
variablePostIdValue = await createVariableProduct();
- await merchant.logout();
});
it('shopper can change variable attributes to the same value', async () => {
await shopper.goToProduct(variablePostIdValue);
- await expect(page).toSelect('#attr-1', 'val1');
- await expect(page).toSelect('#attr-2', 'val1');
- await expect(page).toSelect('#attr-3', 'val1');
- await expect(page).toMatchElement('.woocommerce-variation-price', { text: '9.99' });
+ for (const a of attributes) {
+ const { name, options } = a;
+ const attrHTMLId = `#${name.toLowerCase()}`;
+
+ await expect(page).toSelect(attrHTMLId, options[0]);
+ }
+
+ await expect(page).toMatchElement('.woocommerce-variation-price', {
+ text: '9.99'
+ });
});
it('shopper can change attributes to combination with dimensions and weight', async () => {
await shopper.goToProduct(variablePostIdValue);
- await expect(page).toSelect('#attr-1', 'val1');
- await expect(page).toSelect('#attr-2', 'val2');
- await expect(page).toSelect('#attr-3', 'val1');
+ await expect(page).toSelect(
+ `#${attributes[0].name.toLowerCase()}`,
+ attributes[0].options[0]
+ );
+ await expect(page).toSelect(
+ `#${attributes[1].name.toLowerCase()}`,
+ attributes[1].options[1]
+ );
+ await expect(page).toSelect(
+ `#${attributes[2].name.toLowerCase()}`,
+ attributes[2].options[0]
+ );
await expect(page).toMatchElement('.woocommerce-variation-price', { text: '20.00' });
await expect(page).toMatchElement('.woocommerce-variation-availability', { text: 'Out of stock' });
await expect(page).toMatchElement('.woocommerce-product-attributes-item--weight', { text: '200 kg' });
await expect(page).toMatchElement('.woocommerce-product-attributes-item--dimensions', { text: '10 × 20 × 15 cm' });
+
});
it('shopper can change variable product attributes to variation with a different price', async () => {
await shopper.goToProduct(variablePostIdValue);
- await expect(page).toSelect('#attr-1', 'val1');
- await expect(page).toSelect('#attr-2', 'val1');
- await expect(page).toSelect('#attr-3', 'val2');
+ await expect(page).toSelect(
+ `#${attributes[0].name.toLowerCase()}`,
+ attributes[0].options[0]
+ );
+ await expect(page).toSelect(
+ `#${attributes[1].name.toLowerCase()}`,
+ attributes[1].options[0]
+ );
+ await expect(page).toSelect(
+ `#${attributes[2].name.toLowerCase()}`,
+ attributes[2].options[1]
+ );
await expect(page).toMatchElement('.woocommerce-variation-price', { text: '11.99' });
});
it('shopper can reset variations', async () => {
await shopper.goToProduct(variablePostIdValue);
- await expect(page).toSelect('#attr-1', 'val1');
- await expect(page).toSelect('#attr-2', 'val2');
- await expect(page).toSelect('#attr-3', 'val1');
+ await expect(page).toSelect(
+ `#${attributes[0].name.toLowerCase()}`,
+ attributes[0].options[0]
+ );
+ await expect(page).toSelect(
+ `#${attributes[1].name.toLowerCase()}`,
+ attributes[1].options[1]
+ );
+ await expect(page).toSelect(
+ `#${attributes[2].name.toLowerCase()}`,
+ attributes[2].options[0]
+ );
await expect(page).toClick('.reset_variations');
// Verify the reset by attempting to add the product to the cart
const couponDialog = await expect(page).toDisplayDialog(async () => {
- await expect(page).toClick('.single_add_to_cart_button');
- });
+ await expect(page).toClick('.single_add_to_cart_button');
+ });
expect(couponDialog.message()).toMatch(cartDialogMessage);
-
- // Accept the dialog
- await couponDialog.accept();
});
});
-
+
};
module.exports = runVariableProductUpdateTest;
diff --git a/tests/e2e/utils/CHANGELOG.md b/tests/e2e/utils/CHANGELOG.md
index 332eee4c055..01e698ec22e 100644
--- a/tests/e2e/utils/CHANGELOG.md
+++ b/tests/e2e/utils/CHANGELOG.md
@@ -1,5 +1,9 @@
# Unreleased
+## Added
+
+- Factories for variable product, variation, and grouped product
+
# 0.1.5
## Added
diff --git a/tests/e2e/utils/src/components.js b/tests/e2e/utils/src/components.js
index c5e3daf7f51..d77351d66c7 100644
--- a/tests/e2e/utils/src/components.js
+++ b/tests/e2e/utils/src/components.js
@@ -7,10 +7,8 @@
*/
import { merchant, IS_RETEST_MODE } from './flows';
import {
- clickTab,
uiUnblocked,
verifyCheckboxIsUnset,
- selectOptionInSelect2,
setCheckbox,
unsetCheckbox,
evalAndClick,
@@ -24,6 +22,8 @@ const client = factories.api.withDefaultPermalinks;
const config = require( 'config' );
const simpleProductName = config.get( 'products.simple.name' );
const simpleProductPrice = config.has('products.simple.price') ? config.get('products.simple.price') : '9.99';
+const defaultVariableProduct = config.get('products.variable');
+const defaultGroupedProduct = config.get('products.grouped');
/**
* Verify and publish
@@ -135,6 +135,9 @@ const completeOnboardingWizard = async () => {
// Business Details section
+ // Temporarily add delay to reduce test flakiness
+ await page.waitFor( 2000 );
+
// Query for the s
const selectControls = await page.$$( '.woocommerce-select-control' );
expect( selectControls ).toHaveLength( 2 );
@@ -220,172 +223,104 @@ const createSimpleProductWithCategory = async ( productName, productPrice, categ
/**
* Create variable product.
+ * Also, create variations for all attributes.
+ *
+ * @param varProduct Defaults to the variable product object in `default.json`
+ * @returns the ID of the created variable product
*/
-const createVariableProduct = async () => {
+const createVariableProduct = async (varProduct = defaultVariableProduct) => {
+ const { attributes } = varProduct;
+ const { id } = await factories.products.variable.create(varProduct); // create the variable product
+ const variations = [];
+ const buffer = []; // accumulated attributes while looping
+ const aIdx = 0; // attributes[] index
- // We need to remove any listeners on the `dialog` event otherwise we can't catch the dialogs below
- page.removeAllListeners('dialog');
+ // Create variation for all attributes
+ const createVariation = (aIdx) => {
+ const { name, options } = attributes[aIdx];
+ const isLastAttribute = aIdx === attributes.length - 1;
- // Go to "add product" page
- await merchant.openNewProduct();
+ // Add each attribute value to the buffer.
+ options.forEach((opt) => {
+ buffer.push({
+ name: name,
+ option: opt
+ });
- // Make sure we're on the add product page
- await expect( page.title() ).resolves.toMatch( 'Add new product' );
+ if (isLastAttribute) {
+ // If this is the last attribute, it means the variation is now complete.
+ // Save whatever's been accumulated in the buffer to the `variations[]` array.
+ variations.push({
+ attributes: [...buffer]
+ });
+ } else {
+ // Otherwise, move to the next attribute first
+ // before proceeding to the next value in this attribute.
+ createVariation(aIdx + 1);
+ }
- // Set product data
- await expect( page ).toFill( '#title', 'Variable Product with Three Variations' );
- await expect( page ).toSelect( '#product-type', 'Variable product' );
+ buffer.pop();
+ });
+ };
+ createVariation(aIdx);
- // Create attributes for variations
- await clickTab( 'Attributes' );
- await expect( page ).toSelect( 'select[name="attribute_taxonomy"]', 'Custom product attribute' );
+ // Set some properties of 1st variation
+ variations[0].regularPrice = '9.99';
+ variations[0].virtual = true;
- for ( let i = 0; i < 3; i++ ) {
- await expect( page ).toClick( 'button.add_attribute', { text: 'Add' } );
- // Wait for attribute form to load
- await uiUnblocked();
+ // Set some properties of 2nd variation
+ variations[1].regularPrice = '11.99';
+ variations[1].virtual = true;
- await page.focus( `input[name="attribute_names[${ i }]"]` );
- await expect( page ).toFill( `input[name="attribute_names[${ i }]"]`, 'attr #' + ( i + 1 ) );
- await expect( page ).toFill( `textarea[name="attribute_values[${ i }]"]`, 'val1 | val2' );
- await expect( page ).toClick( `input[name="attribute_variation[${ i }]"]` );
+ // Set some properties of 3rd variation
+ variations[2].regularPrice = '20';
+ variations[2].weight = '200';
+ variations[2].dimensions = {
+ length: '10',
+ width: '20',
+ height: '15'
+ };
+ variations[2].manage_stock = true;
+
+ // Use API to create each variation
+ for (const v of variations) {
+ await factories.products.variation.create({
+ productId: id,
+ variation: v
+ });
}
- await expect( page ).toClick( 'button', { text: 'Save attributes' } );
-
- // Wait for attribute form to save (triggers 2 UI blocks)
- await uiUnblocked();
- await page.waitFor( 1000 );
- await uiUnblocked();
-
- // Create variations from attributes
- await clickTab( 'Variations' );
- await page.waitForSelector( 'select.variation_actions:not([disabled])' );
- await page.focus( 'select.variation_actions' );
- await expect( page ).toSelect( 'select.variation_actions', 'Create variations from all attributes' );
-
- const firstDialog = await expect( page ).toDisplayDialog( async () => {
- // Using this technique since toClick() isn't working.
- // See: https://github.com/GoogleChrome/puppeteer/issues/1805#issuecomment-464802876
- page.$eval( 'a.do_variation_action', elem => elem.click() );
-
- } );
-
- expect( firstDialog.message() ).toMatch( 'Are you sure you want to link all variations?' );
-
- const secondDialog = await expect( page ).toDisplayDialog( async () => {
- await firstDialog.accept();
- } );
-
- expect( secondDialog.message() ).toMatch( '8 variations added' );
- await secondDialog.dismiss();
-
- // Set some variation data
- await uiUnblocked();
- await uiUnblocked();
-
- await page.waitForSelector( '.woocommerce_variation .handlediv' );
-
- // Verify that variations were created
- await Promise.all( [
- expect( page ).toMatchElement( 'select[name="attribute_attr-1[0]"]', { text: 'val1' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-2[0]"]', { text: 'val1' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-3[0]"]', { text: 'val1' } ),
-
- expect( page ).toMatchElement( 'select[name="attribute_attr-1[1]"]', { text: 'val1' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-2[1]"]', { text: 'val1' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-3[1]"]', { text: 'val2' } ),
-
- expect( page ).toMatchElement( 'select[name="attribute_attr-1[2]"]', { text: 'val1' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-2[2]"]', { text: 'val2' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-3[2]"]', { text: 'val1' } ),
-
- expect( page ).toMatchElement( 'select[name="attribute_attr-1[3]"]', { text: 'val1' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-2[3]"]', { text: 'val2' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-3[3]"]', { text: 'val2' } ),
-
- expect( page ).toMatchElement( 'select[name="attribute_attr-1[4]"]', { text: 'val2' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-2[4]"]', { text: 'val1' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-3[4]"]', { text: 'val1' } ),
-
- expect( page ).toMatchElement( 'select[name="attribute_attr-1[5]"]', { text: 'val2' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-2[5]"]', { text: 'val1' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-3[5]"]', { text: 'val2' } ),
-
- expect( page ).toMatchElement( 'select[name="attribute_attr-1[6]"]', { text: 'val2' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-2[6]"]', { text: 'val2' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-3[6]"]', { text: 'val1' } ),
-
- expect( page ).toMatchElement( 'select[name="attribute_attr-1[7]"]', { text: 'val2' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-2[7]"]', { text: 'val2' } ),
- expect( page ).toMatchElement( 'select[name="attribute_attr-3[7]"]', { text: 'val2' } ),
- ] );
-
- await expect( page ).toClick( '.woocommerce_variation:nth-of-type(2) .handlediv' );
- await page.waitFor( 2000 );
- await page.focus( 'input[name="variable_is_virtual[0]"]' );
- await expect( page ).toClick( 'input[name="variable_is_virtual[0]"]' );
- await expect( page ).toFill( 'input[name="variable_regular_price[0]"]', '9.99' );
-
- await expect( page ).toClick( '.woocommerce_variation:nth-of-type(3) .handlediv' );
- await page.waitFor( 2000 );
- await page.focus( 'input[name="variable_is_virtual[1]"]' );
- await expect( page ).toClick( 'input[name="variable_is_virtual[1]"]' );
- await expect( page ).toFill( 'input[name="variable_regular_price[1]"]', '11.99' );
-
- await expect( page ).toClick( '.woocommerce_variation:nth-of-type(4) .handlediv' );
- await page.waitFor( 2000 );
- await page.focus( 'input[name="variable_manage_stock[2]"]' );
- await expect( page ).toClick( 'input[name="variable_manage_stock[2]"]' );
- await expect( page ).toFill( 'input[name="variable_regular_price[2]"]', '20' );
- await expect( page ).toFill( 'input[name="variable_weight[2]"]', '200' );
- await expect( page ).toFill( 'input[name="variable_length[2]"]', '10' );
- await expect( page ).toFill( 'input[name="variable_width[2]"]', '20' );
- await expect( page ).toFill( 'input[name="variable_height[2]"]', '15' );
-
- await page.focus( 'button.save-variation-changes' );
- await expect( page ).toClick( 'button.save-variation-changes', { text: 'Save changes' } );
-
- await verifyAndPublish( 'Product published.' );
-
- const variablePostId = await page.$( '#post_ID' );
- let variablePostIdValue = ( await ( await variablePostId.getProperty( 'value' ) ).jsonValue() );
- return variablePostIdValue;
+ return id;
};
/**
* Create grouped product.
+ *
+ * @param groupedProduct Defaults to the grouped product object in `default.json`
+ * @returns ID of the grouped product
*/
-const createGroupedProduct = async () => {
- // Create two products to be linked in a grouped product after
- await factories.products.simple.create( {
- name: simpleProductName + ' 1',
- regularPrice: simpleProductPrice
- } );
- await factories.products.simple.create( {
- name: simpleProductName + ' 2',
- regularPrice: simpleProductPrice
- } );
+const createGroupedProduct = async (groupedProduct = defaultGroupedProduct) => {
+ const { name, groupedProducts } = groupedProduct;
+ const simpleProductIds = [];
+ let groupedProductRequest;
- // Go to "add product" page
- await merchant.openNewProduct();
+ // Using the api, create simple products to be grouped
+ for (const simpleProduct of groupedProducts) {
+ const { id } = await factories.products.simple.create(simpleProduct);
+ simpleProductIds.push(id);
+ }
- // Make sure we're on the add product page
- await expect( page.title() ).resolves.toMatch( 'Add new product' );
+ // Using the api, create the grouped product
+ groupedProductRequest = {
+ name: name,
+ groupedProducts: simpleProductIds
+ };
+ const { id } = await factories.products.grouped.create(
+ groupedProductRequest
+ );
- // Set product data and save the product
- await expect( page ).toFill( '#title', 'Grouped Product' );
- await expect( page ).toSelect( '#product-type', 'Grouped product' );
- await clickTab( 'Linked Products' );
- await selectOptionInSelect2( simpleProductName + ' 1' );
- await selectOptionInSelect2( simpleProductName + ' 2' );
- await verifyAndPublish();
-
- // Get product ID
- const groupedPostId = await page.$( '#post_ID' );
- let groupedPostIdValue = ( await ( await groupedPostId.getProperty( 'value' ) ).jsonValue() );
- return groupedPostIdValue;
-}
+ return id;
+};
/**
* Create a basic order with the provided order status.
diff --git a/tests/e2e/utils/src/factories.js b/tests/e2e/utils/src/factories.js
index 46f3b91f948..4ebc5e38041 100644
--- a/tests/e2e/utils/src/factories.js
+++ b/tests/e2e/utils/src/factories.js
@@ -1,6 +1,9 @@
import { HTTPClientFactory } from '@woocommerce/api';
const config = require( 'config' );
import { simpleProductFactory } from './factories/simple-product';
+import { variableProductFactory } from './factories/variable-product';
+import { variationFactory } from './factories/variation';
+import { groupedProductFactory } from './factories/grouped-product';
const apiUrl = config.get( 'url' );
const adminUsername = config.get( 'users.admin.username' );
@@ -20,6 +23,9 @@ const factories = {
},
products: {
simple: simpleProductFactory( withDefaultPermalinks ),
+ variable: variableProductFactory( withDefaultPermalinks ),
+ variation: variationFactory( withDefaultPermalinks ),
+ grouped: groupedProductFactory( withDefaultPermalinks )
},
};
diff --git a/tests/e2e/utils/src/factories/grouped-product.js b/tests/e2e/utils/src/factories/grouped-product.js
new file mode 100644
index 00000000000..cb2315f586c
--- /dev/null
+++ b/tests/e2e/utils/src/factories/grouped-product.js
@@ -0,0 +1,26 @@
+import { GroupedProduct } from '@woocommerce/api';
+import { Factory } from 'fishery';
+
+/**
+ * Creates a new factory for creating variable products.
+ * This does not include creating product variations.
+ * Instead, use `variationFactory()` for that.
+ *
+ * @param {HTTPClient} httpClient The HTTP client we will give the repository.
+ * @return {AsyncFactory} The factory for creating models.
+ */
+export function groupedProductFactory(httpClient) {
+ const repository = GroupedProduct.restRepository(httpClient);
+
+ return Factory.define(({ params, onCreate }) => {
+ onCreate((model) => {
+ return repository.create(model);
+ });
+
+ return {
+ name: params.name,
+ type: 'grouped',
+ groupedProducts: params.groupedProducts
+ };
+ });
+}
diff --git a/tests/e2e/utils/src/factories/variable-product.js b/tests/e2e/utils/src/factories/variable-product.js
new file mode 100644
index 00000000000..5080dbc0422
--- /dev/null
+++ b/tests/e2e/utils/src/factories/variable-product.js
@@ -0,0 +1,27 @@
+import { VariableProduct } from '@woocommerce/api';
+import { Factory } from 'fishery';
+
+/**
+ * Creates a new factory for creating variable products.
+ * This does not include creating product variations.
+ * Instead, use `variationFactory()` for that.
+ *
+ * @param {HTTPClient} httpClient The HTTP client we will give the repository.
+ * @return {AsyncFactory} The factory for creating models.
+ */
+export function variableProductFactory(httpClient) {
+ const repository = VariableProduct.restRepository(httpClient);
+
+ return Factory.define(({ params, onCreate }) => {
+ onCreate((model) => {
+ return repository.create(model);
+ });
+
+ return {
+ name: params.name,
+ type: 'variable',
+ defaultAttributes: params.defaultAttributes,
+ attributes: params.attributes
+ };
+ });
+}
diff --git a/tests/e2e/utils/src/factories/variation.js b/tests/e2e/utils/src/factories/variation.js
new file mode 100644
index 00000000000..4aed65ad353
--- /dev/null
+++ b/tests/e2e/utils/src/factories/variation.js
@@ -0,0 +1,22 @@
+import { ProductVariation } from '@woocommerce/api';
+import { Factory } from 'fishery';
+
+/**
+ * Creates a new factory for creating a product variation.
+ *
+ * @param {HTTPClient} httpClient The HTTP client we will give the repository.
+ * @return {AsyncFactory} The factory for creating models.
+ */
+export function variationFactory(httpClient) {
+ const repository = ProductVariation.restRepository(httpClient);
+
+ return Factory.define(({ params, onCreate }) => {
+ const { productId, variation } = params;
+
+ onCreate((model) => {
+ return repository.create(productId, model);
+ });
+
+ return variation;
+ });
+}
diff --git a/woocommerce.php b/woocommerce.php
index 57edd900f95..01a40e13d98 100644
--- a/woocommerce.php
+++ b/woocommerce.php
@@ -3,7 +3,7 @@
* Plugin Name: WooCommerce
* Plugin URI: https://woocommerce.com/
* Description: An eCommerce toolkit that helps you sell anything. Beautifully.
- * Version: 5.5.0-dev
+ * Version: 5.6.0-dev
* Author: Automattic
* Author URI: https://woocommerce.com
* Text Domain: woocommerce