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