'
@@ -177,13 +177,14 @@ return array(
'Registering the website domain on the PayPal site is mandated by Apple. Payments will fail if the Apple Pay button is used on an unregistered domain.',
'woocommerce-paypal-payments'
),
+ 'classes' => array('ppcp-field-indent'),
'class' => array(),
'screens' => array( State::STATE_ONBOARDED ),
'gateway' => 'paypal',
'requirements' => array(),
),
- 'applepay_button_domain_validation' => array(
- 'title' => str_repeat( ' ', 6 ) . __( 'Domain Validation', 'woocommerce-paypal-payments' ),
+ 'applepay_button_domain_validation' => array(
+ 'title' => __( 'Domain Validation', 'woocommerce-paypal-payments' ),
'type' => 'ppcp-text',
'text' => $domain_validation_text
. ''
@@ -199,13 +200,14 @@ return array(
'Apple requires the website domain to be registered and validated. PayPal Payments automatically presents your domain association file for Apple to validate the manually registered domain.',
'woocommerce-paypal-payments'
),
+ 'classes' => array('ppcp-field-indent'),
'class' => array(),
'screens' => array( State::STATE_ONBOARDED ),
'gateway' => 'paypal',
'requirements' => array(),
),
- 'applepay_button_device_eligibility' => array(
- 'title' => str_repeat( ' ', 6 ) . __( 'Device Eligibility', 'woocommerce-paypal-payments' ),
+ 'applepay_button_device_eligibility' => array(
+ 'title' => __( 'Device Eligibility', 'woocommerce-paypal-payments' ),
'type' => 'ppcp-text',
'text' => $device_eligibility_text
. '
'
@@ -216,19 +218,21 @@ return array(
'Apple Pay demands certain Apple devices for secure payment execution. This helps determine if your current device is compliant.',
'woocommerce-paypal-payments'
),
+ 'classes' => array('ppcp-field-indent'),
'class' => array(),
'screens' => array( State::STATE_ONBOARDED ),
'gateway' => 'paypal',
'requirements' => array(),
),
- 'applepay_button_type' => array(
- 'title' => str_repeat( ' ', 6 ) . __( 'Button Label', 'woocommerce-paypal-payments' ),
+ 'applepay_button_type' => array(
+ 'title' => __( 'Button Label', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
'description' => __(
'This controls the label of the Apple Pay button.',
'woocommerce-paypal-payments'
),
+ 'classes' => array('ppcp-field-indent'),
'class' => array(),
'input_class' => array( 'wc-enhanced-select' ),
'default' => 'pay',
@@ -237,8 +241,8 @@ return array(
'gateway' => 'paypal',
'requirements' => array(),
),
- 'applepay_button_color' => array(
- 'title' => str_repeat( ' ', 6 ) . __( 'Button Color', 'woocommerce-paypal-payments' ),
+ 'applepay_button_color' => array(
+ 'title' => __( 'Button Color', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
'description' => __(
@@ -247,6 +251,7 @@ return array(
),
'label' => '',
'input_class' => array( 'wc-enhanced-select' ),
+ 'classes' => array('ppcp-field-indent'),
'class' => array(),
'default' => 'black',
'options' => PropertiesDictionary::button_colors(),
@@ -254,14 +259,15 @@ return array(
'gateway' => 'paypal',
'requirements' => array(),
),
- 'applepay_button_language' => array(
- 'title' => str_repeat( ' ', 6 ) . __( 'Button Language', 'woocommerce-paypal-payments' ),
+ 'applepay_button_language' => array(
+ 'title' => __( 'Button Language', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
'description' => __(
'The language and region used for the displayed Apple Pay button. The default value is the current language and region setting in a browser.',
'woocommerce-paypal-payments'
),
+ 'classes' => array('ppcp-field-indent'),
'class' => array(),
'input_class' => array( 'wc-enhanced-select' ),
'default' => 'en',
@@ -270,6 +276,20 @@ return array(
'gateway' => 'paypal',
'requirements' => array(),
),
+ 'applepay_checkout_data_mode' => array(
+ 'title' => __( 'Send checkout billing and shipping data to Apple Pay', 'woocommerce-paypal-payments' ),
+ 'type' => 'select',
+ 'classes' => array('ppcp-field-indent'),
+ 'class' => array(),
+ 'input_class' => array( 'wc-enhanced-select' ),
+ 'desc_tip' => true,
+ 'description' => __( 'Using the WC form data increases convenience for the customers, but can cause issues if Apple Pay details do not match the billing and shipping data in the checkout form.', 'woocommerce-paypal-payments' ),
+ 'default' => PropertiesDictionary::BILLING_DATA_MODE_DEFAULT,
+ 'options' => PropertiesDictionary::billing_data_modes(),
+ 'screens' => array( State::STATE_ONBOARDED ),
+ 'gateway' => 'paypal',
+ 'requirements' => array(),
+ ),
)
);
},
diff --git a/modules/ppcp-applepay/resources/js/ApplepayButton.js b/modules/ppcp-applepay/resources/js/ApplepayButton.js
index 34ad4454e..5cc3a225c 100644
--- a/modules/ppcp-applepay/resources/js/ApplepayButton.js
+++ b/modules/ppcp-applepay/resources/js/ApplepayButton.js
@@ -132,7 +132,7 @@ class ApplepayButton {
const session = new ApplePaySession(4, paymentRequest)
session.begin()
- if (this.buttonConfig.product.needShipping) {
+ if (this.shouldAllowShippingInButton()) {
session.onshippingmethodselected = this.onshippingmethodselected(session)
session.onshippingcontactselected = this.onshippingcontactselected(session)
}
@@ -222,20 +222,50 @@ class ApplepayButton {
this.applePaySession(paymentDataRequest)
}
+ /**
+ * If the button should show the shipping fields.
+ *
+ * @returns {false|*}
+ */
+ shouldAllowShippingInButton() {
+ return this.contextHandler.shippingAllowed()
+ && this.buttonConfig.product.needShipping
+ && (this.context !== 'checkout' || this.shouldAllowShippingInButton());
+ }
+
+ /**
+ * If the button should be updated with the form addresses.
+ *
+ * @returns {boolean}
+ */
+ shouldUpdateButtonWithFormData() {
+ return this.ppcpConfig?.preferences?.checkout_data_mode === 'use_applepay';
+ }
+
update_request_data_with_form(paymentDataRequest) {
- paymentDataRequest.billingContact = this.fill_billing_contact(this.form_saved);
-
- // "applicationData" is originating a "PayPalApplePayError: An internal server error has occurred" on paypal.Applepay().confirmOrder().
- //paymentDataRequest.applicationData = this.fill_application_data(this.form_saved);
-
- if (!this.buttonConfig.product.needShipping) {
+ if (!this.shouldUpdateButtonWithFormData()) {
return;
}
+
+ // Add billing address.
+ paymentDataRequest.billingContact = this.fill_billing_contact(this.form_saved);
+
+ // Add custom data.
+ // "applicationData" is originating a "PayPalApplePayError: An internal server error has occurred" on paypal.Applepay().confirmOrder().
+ // paymentDataRequest.applicationData = this.fill_application_data(this.form_saved);
+
+ if (!this.shouldAllowShippingInButton()) {
+ return;
+ }
+
+ // Add shipping address.
paymentDataRequest.shippingContact = this.fill_shipping_contact(this.form_saved);
+ // Get shipping methods.
const rate = this.transactionInfo.chosenShippingMethods[0];
-
paymentDataRequest.shippingMethods = [];
+
+ // Add selected shipping method.
for (const shippingPackage of this.transactionInfo.shippingPackages) {
if (rate === shippingPackage.id) {
paymentDataRequest.shippingMethods.push({
@@ -248,6 +278,7 @@ class ApplepayButton {
}
}
+ // Add other shipping methods.
for (const shippingPackage of this.transactionInfo.shippingPackages) {
if (rate !== shippingPackage.id) {
paymentDataRequest.shippingMethods.push({
@@ -256,7 +287,6 @@ class ApplepayButton {
'amount' : shippingPackage.cost_str,
'identifier' : shippingPackage.id,
});
- break;
}
}
@@ -271,11 +301,11 @@ class ApplepayButton {
merchantCapabilities: applepayConfig.merchantCapabilities,
supportedNetworks: applepayConfig.supportedNetworks,
requiredShippingContactFields: ["postalAddress", "email", "phone"],
- requiredBillingContactFields: ["postalAddress", "email", "phone"],
+ requiredBillingContactFields: ["postalAddress"],
}
- if (!this.contextHandler.shippingAllowed()) {
- baseRequest.requiredShippingContactFields = [];
+ if (!this.shouldAllowShippingInButton()) {
+ baseRequest.requiredShippingContactFields = ["email", "phone"];
}
const paymentDataRequest = Object.assign({}, baseRequest);
@@ -429,7 +459,7 @@ class ApplepayButton {
caller_page: 'productDetail',
product_quantity: this.productQuantity,
simplified_contact: event.shippingContact,
- need_shipping: this.buttonConfig.product.needShipping,
+ need_shipping: this.shouldAllowShippingInButton(),
'woocommerce-process-checkout-nonce': this.nonce,
};
case 'cart':
@@ -441,7 +471,7 @@ class ApplepayButton {
action: 'ppcp_update_shipping_contact',
simplified_contact: event.shippingContact,
caller_page: 'cart',
- need_shipping: this.buttonConfig.product.needShipping,
+ need_shipping: this.shouldAllowShippingInButton(),
'woocommerce-process-checkout-nonce': this.nonce,
};
}
@@ -548,7 +578,7 @@ class ApplepayButton {
if (confirmOrderResponse.approveApplePayPayment.status === "APPROVED") {
try {
- if (!this.contextHandler.shippingAllowed()) {
+ if (!this.shouldAllowShippingInButton()) {
// No shipping, expect immediate capture, ex: PayNow.
let approveFailed = false;
diff --git a/modules/ppcp-applepay/src/Assets/DataToAppleButtonScripts.php b/modules/ppcp-applepay/src/Assets/DataToAppleButtonScripts.php
index afe0126ef..1c3891b48 100644
--- a/modules/ppcp-applepay/src/Assets/DataToAppleButtonScripts.php
+++ b/modules/ppcp-applepay/src/Assets/DataToAppleButtonScripts.php
@@ -144,31 +144,35 @@ class DataToAppleButtonScripts {
$type = $this->settings->has( 'applepay_button_type' ) ? $this->settings->get( 'applepay_button_type' ) : '';
$color = $this->settings->has( 'applepay_button_color' ) ? $this->settings->get( 'applepay_button_color' ) : '';
$lang = $this->settings->has( 'applepay_button_language' ) ? $this->settings->get( 'applepay_button_language' ) : '';
+ $checkout_data_mode = $this->settings->has( 'applepay_checkout_data_mode' ) ? $this->settings->get( 'applepay_checkout_data_mode' ) : PropertiesDictionary::BILLING_DATA_MODE_DEFAULT;
return array(
- 'sdk_url' => $this->sdk_url,
- 'is_debug' => defined( 'WP_DEBUG' ) && WP_DEBUG ? true : false,
- 'button' => array(
+ 'sdk_url' => $this->sdk_url,
+ 'is_debug' => defined( 'WP_DEBUG' ) && WP_DEBUG ? true : false,
+ 'preferences' => array(
+ 'checkout_data_mode' => $checkout_data_mode,
+ ),
+ 'button' => array(
'wrapper' => 'applepay-container',
'mini_cart_wrapper' => 'applepay-container-minicart',
'type' => $type,
'color' => $color,
'lang' => $lang,
),
- 'product' => array(
+ 'product' => array(
'needShipping' => $product_need_shipping,
'id' => $product_id,
'price' => $product_price,
'isVariation' => $is_variation,
'stock' => $product_stock,
),
- 'shop' => array(
+ 'shop' => array(
'countryCode' => $shop_country_code,
'currencyCode' => $currency_code,
'totalLabel' => $total_label,
),
- 'ajax_url' => admin_url( 'admin-ajax.php' ),
- 'nonce' => wp_create_nonce( 'woocommerce-process_checkout' ),
+ 'ajax_url' => admin_url( 'admin-ajax.php' ),
+ 'nonce' => wp_create_nonce( 'woocommerce-process_checkout' ),
);
}
@@ -191,14 +195,18 @@ class DataToAppleButtonScripts {
return array();
}
- $type = $this->settings->has( 'applepay_button_type' ) ? $this->settings->get( 'applepay_button_type' ) : '';
- $color = $this->settings->has( 'applepay_button_color' ) ? $this->settings->get( 'applepay_button_color' ) : '';
- $lang = $this->settings->has( 'applepay_button_language' ) ? $this->settings->get( 'applepay_button_language' ) : '';
- $lang = apply_filters( 'woocommerce_paypal_payments_applepay_button_language', $lang );
+ $type = $this->settings->has( 'applepay_button_type' ) ? $this->settings->get( 'applepay_button_type' ) : '';
+ $color = $this->settings->has( 'applepay_button_color' ) ? $this->settings->get( 'applepay_button_color' ) : '';
+ $lang = $this->settings->has( 'applepay_button_language' ) ? $this->settings->get( 'applepay_button_language' ) : '';
+ $lang = apply_filters( 'woocommerce_paypal_payments_applepay_button_language', $lang );
+ $checkout_data_mode = $this->settings->has( 'applepay_checkout_data_mode' ) ? $this->settings->get( 'applepay_checkout_data_mode' ) : PropertiesDictionary::BILLING_DATA_MODE_DEFAULT;
return array(
'sdk_url' => $this->sdk_url,
'is_debug' => defined( 'WP_DEBUG' ) && WP_DEBUG ? true : false,
+ 'preferences' => array(
+ 'checkout_data_mode' => $checkout_data_mode,
+ ),
'button' => array(
'wrapper' => 'applepay-container',
'mini_cart_wrapper' => 'applepay-container-minicart',
@@ -235,14 +243,18 @@ class DataToAppleButtonScripts {
$currency_code,
$total_label
) {
- $type = $this->settings->has( 'applepay_button_type' ) ? $this->settings->get( 'applepay_button_type' ) : '';
- $color = $this->settings->has( 'applepay_button_color' ) ? $this->settings->get( 'applepay_button_color' ) : '';
- $lang = $this->settings->has( 'applepay_button_language' ) ? $this->settings->get( 'applepay_button_language' ) : '';
- $lang = apply_filters( 'woocommerce_paypal_payments_applepay_button_language', $lang );
+ $type = $this->settings->has( 'applepay_button_type' ) ? $this->settings->get( 'applepay_button_type' ) : '';
+ $color = $this->settings->has( 'applepay_button_color' ) ? $this->settings->get( 'applepay_button_color' ) : '';
+ $lang = $this->settings->has( 'applepay_button_language' ) ? $this->settings->get( 'applepay_button_language' ) : '';
+ $lang = apply_filters( 'woocommerce_paypal_payments_applepay_button_language', $lang );
+ $checkout_data_mode = $this->settings->has( 'applepay_checkout_data_mode' ) ? $this->settings->get( 'applepay_checkout_data_mode' ) : PropertiesDictionary::BILLING_DATA_MODE_DEFAULT;
return array(
'sdk_url' => $this->sdk_url,
'is_debug' => defined( 'WP_DEBUG' ) && WP_DEBUG ? true : false,
+ 'preferences' => array(
+ 'checkout_data_mode' => $checkout_data_mode,
+ ),
'button' => array(
'wrapper' => 'applepay-container',
'mini_cart_wrapper' => 'applepay-container-minicart',
diff --git a/modules/ppcp-applepay/src/Assets/PropertiesDictionary.php b/modules/ppcp-applepay/src/Assets/PropertiesDictionary.php
index d1c388ffd..4cdb3190f 100644
--- a/modules/ppcp-applepay/src/Assets/PropertiesDictionary.php
+++ b/modules/ppcp-applepay/src/Assets/PropertiesDictionary.php
@@ -17,6 +17,10 @@ class PropertiesDictionary {
public const BILLING_CONTACT_INVALID = 'billing Contact Invalid';
+ public const BILLING_DATA_MODE_USE_WC = 'use_wc';
+ public const BILLING_DATA_MODE_USE_APPLEPAY = 'use_applepay';
+ public const BILLING_DATA_MODE_DEFAULT = self::BILLING_DATA_MODE_USE_WC;
+
public const CREATE_ORDER_SINGLE_PROD_REQUIRED_FIELDS =
array(
self::WCNONCE,
@@ -186,4 +190,16 @@ class PropertiesDictionary {
'zh-TW' => __( 'Chinese (Traditional)', 'woocommerce-paypal-payments' ),
);
}
+
+ /**
+ * Returns the possible list of billing data modes.
+ *
+ * @return array
+ */
+ public static function billing_data_modes(): array {
+ return array(
+ PropertiesDictionary::BILLING_DATA_MODE_USE_WC => __( 'Use WC checkout form data (do not show shipping address fields)', 'woocommerce-paypal-payments' ),
+ PropertiesDictionary::BILLING_DATA_MODE_USE_APPLEPAY => __( 'Do not use WC checkout form data (request billing and shipping addresses on Apple Pay)', 'woocommerce-paypal-payments' ),
+ );
+ }
}
diff --git a/modules/ppcp-googlepay/extensions.php b/modules/ppcp-googlepay/extensions.php
index 18c8955be..e2080a8f5 100644
--- a/modules/ppcp-googlepay/extensions.php
+++ b/modules/ppcp-googlepay/extensions.php
@@ -135,13 +135,14 @@ return array(
),
),
'googlepay_button_type' => array(
- 'title' => str_repeat( ' ', 6 ) . __( 'Button Label', 'woocommerce-paypal-payments' ),
+ 'title' => __( 'Button Label', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
'description' => __(
'This controls the label of the Google Pay button.',
'woocommerce-paypal-payments'
),
+ 'classes' => array('ppcp-field-indent'),
'class' => array(),
'input_class' => array( 'wc-enhanced-select' ),
'default' => 'pay',
@@ -151,7 +152,7 @@ return array(
'requirements' => array(),
),
'googlepay_button_color' => array(
- 'title' => str_repeat( ' ', 6 ) . __( 'Button Color', 'woocommerce-paypal-payments' ),
+ 'title' => __( 'Button Color', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
'description' => __(
@@ -160,6 +161,7 @@ return array(
),
'label' => '',
'input_class' => array( 'wc-enhanced-select' ),
+ 'classes' => array('ppcp-field-indent'),
'class' => array(),
'default' => 'black',
'options' => PropertiesDictionary::button_colors(),
@@ -168,13 +170,14 @@ return array(
'requirements' => array(),
),
'googlepay_button_language' => array(
- 'title' => str_repeat( ' ', 6 ) . __( 'Button Language', 'woocommerce-paypal-payments' ),
+ 'title' => __( 'Button Language', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
'description' => __(
'The language and region used for the displayed Google Pay button. The default value is the current language and region setting in a browser.',
'woocommerce-paypal-payments'
),
+ 'classes' => array('ppcp-field-indent'),
'class' => array(),
'input_class' => array( 'wc-enhanced-select' ),
'default' => 'en',
@@ -184,13 +187,14 @@ return array(
'requirements' => array(),
),
'googlepay_button_shipping_enabled' => array(
- 'title' => str_repeat( ' ', 6 ) . __( 'Shipping Callback', 'woocommerce-paypal-payments' ),
+ 'title' => __( 'Shipping Callback', 'woocommerce-paypal-payments' ),
'type' => 'checkbox',
'desc_tip' => true,
'description' => __(
'Synchronizes your available shipping options with Google Pay. Enabling this may impact the buyer experience.',
'woocommerce-paypal-payments'
),
+ 'classes' => array('ppcp-field-indent'),
'label' => __( 'Enable Google Pay shipping callback', 'woocommerce-paypal-payments' ),
'default' => 'no',
'screens' => array( State::STATE_ONBOARDED ),
diff --git a/modules/ppcp-wc-gateway/resources/css/common.scss b/modules/ppcp-wc-gateway/resources/css/common.scss
index 299375005..259ecc672 100644
--- a/modules/ppcp-wc-gateway/resources/css/common.scss
+++ b/modules/ppcp-wc-gateway/resources/css/common.scss
@@ -9,3 +9,9 @@
filter: grayscale(100%);
opacity: 0.5;
}
+
+.ppcp-field-indent {
+ th {
+ padding-left: 20px;
+ }
+}
From 4edf9c1f46e316ad74c353d01ba02674016690ac Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Thu, 9 Nov 2023 11:40:25 +0100
Subject: [PATCH 13/36] Add card fields renderer
---
.../resources/js/CardFieldsRenderer.js | 27 +++++++++++++++++++
1 file changed, 27 insertions(+)
create mode 100644 modules/ppcp-card-fields/resources/js/CardFieldsRenderer.js
diff --git a/modules/ppcp-card-fields/resources/js/CardFieldsRenderer.js b/modules/ppcp-card-fields/resources/js/CardFieldsRenderer.js
new file mode 100644
index 000000000..f7a68b6d5
--- /dev/null
+++ b/modules/ppcp-card-fields/resources/js/CardFieldsRenderer.js
@@ -0,0 +1,27 @@
+class CardFieldsRenderer {
+
+ render(wrapper, contextConfig) {
+ const cardField = paypal.CardFields({
+ createOrder: function (data) {},
+ onApprove: function (data) {},
+ onError: function (error) {
+ console.error(error)
+ }
+ });
+
+ if (cardField.isEligible()) {
+ const numberField = cardField.NumberField();
+ numberField.render('#ppcp-credit-card-gateway-card-number');
+
+ const cvvField = cardField.CVVField();
+ cvvField.render('#ppcp-credit-card-gateway-card-cvc');
+
+ const expiryField = cardField.ExpiryField();
+ expiryField.render('#ppcp-credit-card-gateway-card-expiry');
+ };
+ }
+
+ enableFields() {}
+}
+
+export default CardFieldsRenderer;
From 2f5f51e5181c09a985480da0834e28b93047b6bd Mon Sep 17 00:00:00 2001
From: Pedro Silva
Date: Thu, 9 Nov 2023 17:50:57 +0000
Subject: [PATCH 14/36] Uniformize ApplePay javascript coding style. Add
support for checkout form data to ApplePay. Add checkout shipping mode option
in ApplePay settings.
---
modules/ppcp-applepay/extensions.php | 28 +-
.../resources/js/ApplepayButton.js | 298 +++++++++++-------
.../resources/js/Context/BaseHandler.js | 6 +-
.../resources/js/Context/CheckoutHandler.js | 19 +-
.../src/Assets/ApplePayButton.php | 55 +---
.../src/Assets/DataToAppleButtonScripts.php | 26 +-
.../src/Assets/PropertiesDictionary.php | 4 +-
.../src/Endpoint/CartScriptParamsEndpoint.php | 96 +++---
modules/ppcp-googlepay/extensions.php | 8 +-
9 files changed, 292 insertions(+), 248 deletions(-)
diff --git a/modules/ppcp-applepay/extensions.php b/modules/ppcp-applepay/extensions.php
index 5b52f8050..ec5c27b96 100644
--- a/modules/ppcp-applepay/extensions.php
+++ b/modules/ppcp-applepay/extensions.php
@@ -162,7 +162,7 @@ return array(
),
),
),
- 'applepay_button_domain_registration' => array(
+ 'applepay_button_domain_registration' => array(
'title' => __( 'Domain Registration', 'woocommerce-paypal-payments' ),
'type' => 'ppcp-text',
'text' =>
@@ -177,13 +177,13 @@ return array(
'Registering the website domain on the PayPal site is mandated by Apple. Payments will fail if the Apple Pay button is used on an unregistered domain.',
'woocommerce-paypal-payments'
),
- 'classes' => array('ppcp-field-indent'),
+ 'classes' => array( 'ppcp-field-indent' ),
'class' => array(),
'screens' => array( State::STATE_ONBOARDED ),
'gateway' => 'paypal',
'requirements' => array(),
),
- 'applepay_button_domain_validation' => array(
+ 'applepay_button_domain_validation' => array(
'title' => __( 'Domain Validation', 'woocommerce-paypal-payments' ),
'type' => 'ppcp-text',
'text' => $domain_validation_text
@@ -200,13 +200,13 @@ return array(
'Apple requires the website domain to be registered and validated. PayPal Payments automatically presents your domain association file for Apple to validate the manually registered domain.',
'woocommerce-paypal-payments'
),
- 'classes' => array('ppcp-field-indent'),
+ 'classes' => array( 'ppcp-field-indent' ),
'class' => array(),
'screens' => array( State::STATE_ONBOARDED ),
'gateway' => 'paypal',
'requirements' => array(),
),
- 'applepay_button_device_eligibility' => array(
+ 'applepay_button_device_eligibility' => array(
'title' => __( 'Device Eligibility', 'woocommerce-paypal-payments' ),
'type' => 'ppcp-text',
'text' => $device_eligibility_text
@@ -218,13 +218,13 @@ return array(
'Apple Pay demands certain Apple devices for secure payment execution. This helps determine if your current device is compliant.',
'woocommerce-paypal-payments'
),
- 'classes' => array('ppcp-field-indent'),
+ 'classes' => array( 'ppcp-field-indent' ),
'class' => array(),
'screens' => array( State::STATE_ONBOARDED ),
'gateway' => 'paypal',
'requirements' => array(),
),
- 'applepay_button_type' => array(
+ 'applepay_button_type' => array(
'title' => __( 'Button Label', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
@@ -232,7 +232,7 @@ return array(
'This controls the label of the Apple Pay button.',
'woocommerce-paypal-payments'
),
- 'classes' => array('ppcp-field-indent'),
+ 'classes' => array( 'ppcp-field-indent' ),
'class' => array(),
'input_class' => array( 'wc-enhanced-select' ),
'default' => 'pay',
@@ -241,7 +241,7 @@ return array(
'gateway' => 'paypal',
'requirements' => array(),
),
- 'applepay_button_color' => array(
+ 'applepay_button_color' => array(
'title' => __( 'Button Color', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
@@ -251,7 +251,7 @@ return array(
),
'label' => '',
'input_class' => array( 'wc-enhanced-select' ),
- 'classes' => array('ppcp-field-indent'),
+ 'classes' => array( 'ppcp-field-indent' ),
'class' => array(),
'default' => 'black',
'options' => PropertiesDictionary::button_colors(),
@@ -259,7 +259,7 @@ return array(
'gateway' => 'paypal',
'requirements' => array(),
),
- 'applepay_button_language' => array(
+ 'applepay_button_language' => array(
'title' => __( 'Button Language', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
@@ -267,7 +267,7 @@ return array(
'The language and region used for the displayed Apple Pay button. The default value is the current language and region setting in a browser.',
'woocommerce-paypal-payments'
),
- 'classes' => array('ppcp-field-indent'),
+ 'classes' => array( 'ppcp-field-indent' ),
'class' => array(),
'input_class' => array( 'wc-enhanced-select' ),
'default' => 'en',
@@ -276,10 +276,10 @@ return array(
'gateway' => 'paypal',
'requirements' => array(),
),
- 'applepay_checkout_data_mode' => array(
+ 'applepay_checkout_data_mode' => array(
'title' => __( 'Send checkout billing and shipping data to Apple Pay', 'woocommerce-paypal-payments' ),
'type' => 'select',
- 'classes' => array('ppcp-field-indent'),
+ 'classes' => array( 'ppcp-field-indent' ),
'class' => array(),
'input_class' => array( 'wc-enhanced-select' ),
'desc_tip' => true,
diff --git a/modules/ppcp-applepay/resources/js/ApplepayButton.js b/modules/ppcp-applepay/resources/js/ApplepayButton.js
index 5cc3a225c..d8e23fb63 100644
--- a/modules/ppcp-applepay/resources/js/ApplepayButton.js
+++ b/modules/ppcp-applepay/resources/js/ApplepayButton.js
@@ -16,7 +16,7 @@ class ApplepayButton {
this.buttonConfig = buttonConfig;
this.ppcpConfig = ppcpConfig;
this.paymentsClient = null;
- this.form_saved = false;
+ this.formData = null;
this.contextHandler = ContextHandlerFactory.create(
this.context,
@@ -24,10 +24,13 @@ class ApplepayButton {
this.ppcpConfig
);
- this.updated_contact_info = []
+ this.updatedContactInfo = []
this.selectedShippingMethod = []
this.nonce = document.getElementById('woocommerce-process-checkout-nonce')?.value || buttonConfig.nonce
+ // Stores initialization data sent to the button.
+ this.initialPaymentRequest = null;
+
this.log = function() {
if ( this.buttonConfig.is_debug ) {
console.log('[ApplePayButton]', ...arguments);
@@ -35,6 +38,13 @@ class ApplepayButton {
}
this.refreshContextData();
+
+ // Debug helpers
+ jQuery(document).on('ppcp-applepay-debug', () => {
+ console.log('ApplePayButton', this.context, this);
+ });
+ document.ppcpApplepayButtons = document.ppcpApplepayButtons || {};
+ document.ppcpApplepayButtons[this.context] = this;
}
init(config) {
@@ -47,6 +57,7 @@ class ApplepayButton {
this.isInitialized = true;
this.applePayConfig = config;
const isEligible = this.applePayConfig.isEligible;
+
if (isEligible) {
this.fetchTransactionInfo().then(() => {
const isSubscriptionProduct = this.ppcpConfig?.data_client_id?.has_subscriptions === true;
@@ -84,6 +95,7 @@ class ApplepayButton {
async fetchTransactionInfo() {
this.transactionInfo = await this.contextHandler.transactionInfo();
}
+
/**
* Returns configurations relative to this button context.
*/
@@ -108,6 +120,7 @@ class ApplepayButton {
return config;
}
+
initEventHandlers() {
const { wrapper, ppcpButtonWrapper } = this.contextConfig();
const wrapper_id = '#' + wrapper;
@@ -127,22 +140,25 @@ class ApplepayButton {
syncButtonVisibility();
}
+ /**
+ * Starts an ApplePay session.
+ */
applePaySession(paymentRequest) {
this.log('applePaySession', paymentRequest);
- const session = new ApplePaySession(4, paymentRequest)
- session.begin()
+ const session = new ApplePaySession(4, paymentRequest);
+ session.begin();
- if (this.shouldAllowShippingInButton()) {
- session.onshippingmethodselected = this.onshippingmethodselected(session)
- session.onshippingcontactselected = this.onshippingcontactselected(session)
+ if (this.shouldRequireShippingInButton()) {
+ session.onshippingmethodselected = this.onShippingMethodSelected(session);
+ session.onshippingcontactselected = this.onShippingContactSelected(session);
}
- session.onvalidatemerchant = this.onvalidatemerchant(session);
- session.onpaymentauthorized = this.onpaymentauthorized(session);
+ session.onvalidatemerchant = this.onValidateMerchant(session);
+ session.onpaymentauthorized = this.onPaymentAuthorized(session);
return session;
}
/**
- * Add a Apple Pay purchase button
+ * Adds an Apple Pay purchase button.
*/
addButton() {
this.log('addButton', this.context);
@@ -179,8 +195,9 @@ class ApplepayButton {
async onButtonClick() {
this.log('onButtonClick', this.context);
- const paymentDataRequest = this.paymentDataRequest();
- // trigger woocommerce validation if we are in the checkout page
+ const paymentRequest = this.paymentRequest();
+
+ // Trigger woocommerce validation if we are in the checkout page.
if (this.context === 'checkout') {
const checkoutFormSelector = 'form.woocommerce-checkout';
const errorHandler = new ErrorHandler(
@@ -189,16 +206,16 @@ class ApplepayButton {
);
try {
const formData = new FormData(document.querySelector(checkoutFormSelector));
- this.form_saved = Object.fromEntries(formData.entries());
- // This line should be reviewed, the widgetBuilder.paypal.Applepay().confirmOrder fails if we add it.
- this.update_request_data_with_form(paymentDataRequest);
+ this.formData = Object.fromEntries(formData.entries());
+
+ this.updateRequestDataWithForm(paymentRequest);
} catch (error) {
console.error(error);
}
- this.log('=== paymentDataRequest', paymentDataRequest);
+ this.log('=== paymentRequest', paymentRequest);
- const session = this.applePaySession(paymentDataRequest);
+ const session = this.applePaySession(paymentRequest);
const formValidator = PayPalCommerceGateway.early_checkout_validation_enabled ?
new FormValidator(
PayPalCommerceGateway.ajax.validate_checkout.endpoint,
@@ -219,7 +236,9 @@ class ApplepayButton {
}
return;
}
- this.applePaySession(paymentDataRequest)
+
+ // Default session initialization.
+ this.applePaySession(paymentRequest);
}
/**
@@ -227,10 +246,10 @@ class ApplepayButton {
*
* @returns {false|*}
*/
- shouldAllowShippingInButton() {
+ shouldRequireShippingInButton() {
return this.contextHandler.shippingAllowed()
&& this.buttonConfig.product.needShipping
- && (this.context !== 'checkout' || this.shouldAllowShippingInButton());
+ && (this.context !== 'checkout' || this.shouldUpdateButtonWithFormData());
}
/**
@@ -239,41 +258,70 @@ class ApplepayButton {
* @returns {boolean}
*/
shouldUpdateButtonWithFormData() {
- return this.ppcpConfig?.preferences?.checkout_data_mode === 'use_applepay';
+ if (this.context !== 'checkout') {
+ return false;
+ }
+ return this.buttonConfig?.preferences?.checkout_data_mode === 'use_applepay';
}
- update_request_data_with_form(paymentDataRequest) {
+ /**
+ * Indicates how payment completion should be handled if with the context handler default actions.
+ * Or with ApplePay module specific completion.
+ *
+ * @returns {boolean}
+ */
+ shouldCompletePaymentWithContextHandler() {
+ // Data already handled, ex: PayNow
+ if (!this.contextHandler.shippingAllowed()) {
+ return true;
+ }
+ // Use WC form data mode in Checkout.
+ if (this.context === 'checkout' && !this.shouldUpdateButtonWithFormData()) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Updates ApplePay paymentRequest with form data.
+ */
+ updateRequestDataWithForm(paymentRequest) {
if (!this.shouldUpdateButtonWithFormData()) {
return;
}
// Add billing address.
- paymentDataRequest.billingContact = this.fill_billing_contact(this.form_saved);
+ paymentRequest.billingContact = this.fillBillingContact(this.formData);
// Add custom data.
// "applicationData" is originating a "PayPalApplePayError: An internal server error has occurred" on paypal.Applepay().confirmOrder().
- // paymentDataRequest.applicationData = this.fill_application_data(this.form_saved);
+ // paymentRequest.applicationData = this.fillApplicationData(this.formData);
- if (!this.shouldAllowShippingInButton()) {
+ if (!this.shouldRequireShippingInButton()) {
return;
}
// Add shipping address.
- paymentDataRequest.shippingContact = this.fill_shipping_contact(this.form_saved);
+ paymentRequest.shippingContact = this.fillShippingContact(this.formData);
// Get shipping methods.
const rate = this.transactionInfo.chosenShippingMethods[0];
- paymentDataRequest.shippingMethods = [];
+ paymentRequest.shippingMethods = [];
// Add selected shipping method.
for (const shippingPackage of this.transactionInfo.shippingPackages) {
if (rate === shippingPackage.id) {
- paymentDataRequest.shippingMethods.push({
+ const shippingMethod = {
'label' : shippingPackage.label,
'detail' : '',
'amount' : shippingPackage.cost_str,
'identifier' : shippingPackage.id,
- });
+ };
+
+ // Remember this shipping method as the selected one.
+ this.selectedShippingMethod = shippingMethod;
+
+ paymentRequest.shippingMethods.push(shippingMethod);
break;
}
}
@@ -281,7 +329,7 @@ class ApplepayButton {
// Add other shipping methods.
for (const shippingPackage of this.transactionInfo.shippingPackages) {
if (rate !== shippingPackage.id) {
- paymentDataRequest.shippingMethods.push({
+ paymentRequest.shippingMethods.push({
'label' : shippingPackage.label,
'detail' : '',
'amount' : shippingPackage.cost_str,
@@ -290,10 +338,13 @@ class ApplepayButton {
}
}
- this.log('=== paymentDataRequest.shippingMethods', paymentDataRequest.shippingMethods);
+ // Store for reuse in case this data is not provided by ApplePay on authorization.
+ this.initialPaymentRequest = paymentRequest;
+
+ this.log('=== paymentRequest.shippingMethods', paymentRequest.shippingMethods);
}
- paymentDataRequest() {
+ paymentRequest() {
const applepayConfig = this.applePayConfig
const buttonConfig = this.buttonConfig
let baseRequest = {
@@ -301,22 +352,28 @@ class ApplepayButton {
merchantCapabilities: applepayConfig.merchantCapabilities,
supportedNetworks: applepayConfig.supportedNetworks,
requiredShippingContactFields: ["postalAddress", "email", "phone"],
- requiredBillingContactFields: ["postalAddress"],
+ requiredBillingContactFields: ["postalAddress"], // ApplePay does not implement billing email and phone fields.
}
- if (!this.shouldAllowShippingInButton()) {
- baseRequest.requiredShippingContactFields = ["email", "phone"];
+ if (!this.shouldRequireShippingInButton()) {
+ if (this.shouldCompletePaymentWithContextHandler()) {
+ // Data needs handled externally.
+ baseRequest.requiredShippingContactFields = [];
+ } else {
+ // Minimum data required for order creation.
+ baseRequest.requiredShippingContactFields = ["email", "phone"];
+ }
}
- const paymentDataRequest = Object.assign({}, baseRequest);
- paymentDataRequest.currencyCode = buttonConfig.shop.currencyCode;
- paymentDataRequest.total = {
+ const paymentRequest = Object.assign({}, baseRequest);
+ paymentRequest.currencyCode = buttonConfig.shop.currencyCode;
+ paymentRequest.total = {
label: buttonConfig.shop.totalLabel,
type: "final",
amount: this.transactionInfo.totalPrice,
}
- return paymentDataRequest
+ return paymentRequest;
}
refreshContextData() {
@@ -334,7 +391,7 @@ class ApplepayButton {
// Payment process
//------------------------
- onvalidatemerchant(session) {
+ onValidateMerchant(session) {
this.log('onvalidatemerchant', this.buttonConfig.ajax_url);
return (applePayValidateMerchantEvent) => {
this.log('onvalidatemerchant call');
@@ -368,83 +425,90 @@ class ApplepayButton {
validation: false,
'woocommerce-process-checkout-nonce': this.nonce,
}
- })
+ });
this.log('onvalidatemerchant session abort');
session.abort();
});
};
}
- onshippingmethodselected(session) {
+
+ onShippingMethodSelected(session) {
this.log('onshippingmethodselected', this.buttonConfig.ajax_url);
- const ajax_url = this.buttonConfig.ajax_url
+ const ajax_url = this.buttonConfig.ajax_url;
return (event) => {
this.log('onshippingmethodselected call');
const data = this.getShippingMethodData(event);
+
jQuery.ajax({
url: ajax_url,
method: 'POST',
data: data,
success: (applePayShippingMethodUpdate, textStatus, jqXHR) => {
this.log('onshippingmethodselected ok');
- let response = applePayShippingMethodUpdate.data
+ let response = applePayShippingMethodUpdate.data;
if (applePayShippingMethodUpdate.success === false) {
- response.errors = createAppleErrors(response.errors)
+ response.errors = createAppleErrors(response.errors);
}
- this.selectedShippingMethod = event.shippingMethod
- //order the response shipping methods, so that the selected shipping method is the first one
- let orderedShippingMethods = response.newShippingMethods.sort((a, b) => {
+ this.selectedShippingMethod = event.shippingMethod;
+
+ // Sort the response shipping methods, so that the selected shipping method is the first one.
+ response.newShippingMethods = response.newShippingMethods.sort((a, b) => {
if (a.label === this.selectedShippingMethod.label) {
- return -1
+ return -1;
}
- return 1
- })
- //update the response.newShippingMethods with the ordered shipping methods
- response.newShippingMethods = orderedShippingMethods
+ return 1;
+ });
+
if (applePayShippingMethodUpdate.success === false) {
- response.errors = createAppleErrors(response.errors)
+ response.errors = createAppleErrors(response.errors);
}
- session.completeShippingMethodSelection(response)
+ session.completeShippingMethodSelection(response);
},
error: (jqXHR, textStatus, errorThrown) => {
this.log('onshippingmethodselected error', textStatus);
- console.warn(textStatus, errorThrown)
- session.abort()
+ console.warn(textStatus, errorThrown);
+ session.abort();
},
- })
+ });
};
}
- onshippingcontactselected(session) {
+
+ onShippingContactSelected(session) {
this.log('onshippingcontactselected', this.buttonConfig.ajax_url);
- const ajax_url = this.buttonConfig.ajax_url
+
+ const ajax_url = this.buttonConfig.ajax_url;
+
return (event) => {
this.log('onshippingcontactselected call');
const data = this.getShippingContactData(event);
+
jQuery.ajax({
url: ajax_url,
method: 'POST',
data: data,
success: (applePayShippingContactUpdate, textStatus, jqXHR) => {
this.log('onshippingcontactselected ok');
- let response = applePayShippingContactUpdate.data
- this.updated_contact_info = event.shippingContact
+ let response = applePayShippingContactUpdate.data;
+ this.updatedContactInfo = event.shippingContact;
if (applePayShippingContactUpdate.success === false) {
- response.errors = createAppleErrors(response.errors)
+ response.errors = createAppleErrors(response.errors);
}
if (response.newShippingMethods) {
- this.selectedShippingMethod = response.newShippingMethods[0]
+ this.selectedShippingMethod = response.newShippingMethods[0];
}
- session.completeShippingContactSelection(response)
+ session.completeShippingContactSelection(response);
},
error: (jqXHR, textStatus, errorThrown) => {
this.log('onshippingcontactselected error', textStatus);
- console.warn(textStatus, errorThrown)
- session.abort()
+ console.warn(textStatus, errorThrown);
+ session.abort();
},
- })
+ });
};
}
+
getShippingContactData(event) {
const product_id = this.buttonConfig.product.id;
@@ -459,7 +523,7 @@ class ApplepayButton {
caller_page: 'productDetail',
product_quantity: this.productQuantity,
simplified_contact: event.shippingContact,
- need_shipping: this.shouldAllowShippingInButton(),
+ need_shipping: this.shouldRequireShippingInButton(),
'woocommerce-process-checkout-nonce': this.nonce,
};
case 'cart':
@@ -471,11 +535,12 @@ class ApplepayButton {
action: 'ppcp_update_shipping_contact',
simplified_contact: event.shippingContact,
caller_page: 'cart',
- need_shipping: this.shouldAllowShippingInButton(),
+ need_shipping: this.shouldRequireShippingInButton(),
'woocommerce-process-checkout-nonce': this.nonce,
};
}
}
+
getShippingMethodData(event) {
const product_id = this.buttonConfig.product.id;
@@ -485,11 +550,11 @@ class ApplepayButton {
case 'product': return {
action: 'ppcp_update_shipping_method',
shipping_method: event.shippingMethod,
+ simplified_contact: this.updatedContactInfo || this.initialPaymentRequest.shippingContact || this.initialPaymentRequest.billingContact,
product_id: product_id,
products: JSON.stringify(this.products),
caller_page: 'productDetail',
product_quantity: this.productQuantity,
- simplified_contact: this.updated_contact_info,
'woocommerce-process-checkout-nonce': this.nonce,
}
case 'cart':
@@ -500,14 +565,14 @@ class ApplepayButton {
return {
action: 'ppcp_update_shipping_method',
shipping_method: event.shippingMethod,
+ simplified_contact: this.updatedContactInfo || this.initialPaymentRequest.shippingContact || this.initialPaymentRequest.billingContact,
caller_page: 'cart',
- simplified_contact: this.updated_contact_info,
'woocommerce-process-checkout-nonce': this.nonce,
}
}
}
- onpaymentauthorized(session) {
+ onPaymentAuthorized(session) {
this.log('onpaymentauthorized');
return async (event) => {
this.log('onpaymentauthorized call');
@@ -518,8 +583,10 @@ class ApplepayButton {
const processInWooAndCapture = async (data) => {
return new Promise((resolve, reject) => {
try {
- const billingContact = data.billing_contact
- const shippingContact = data.shipping_contact
+ const billingContact = data.billing_contact || this.initialPaymentRequest.billingContact;
+ const shippingContact = data.shipping_contact || this.initialPaymentRequest.shippingContact;
+ const shippingMethod = this.selectedShippingMethod || (this.initialPaymentRequest.shippingMethods || [])[0];
+
let request_data = {
action: 'ppcp_create_order',
'caller_page': this.context,
@@ -529,7 +596,7 @@ class ApplepayButton {
'shipping_contact': shippingContact,
'billing_contact': billingContact,
'token': event.payment.token,
- 'shipping_method': this.selectedShippingMethod,
+ 'shipping_method': shippingMethod,
'woocommerce-process-checkout-nonce': this.nonce,
'funding_source': 'applepay',
'_wp_http_referer': '/?wc-ajax=update_order_review',
@@ -547,16 +614,16 @@ class ApplepayButton {
},
success: (authorizationResult, textStatus, jqXHR) => {
this.log('onpaymentauthorized ok');
- resolve(authorizationResult)
+ resolve(authorizationResult);
},
error: (jqXHR, textStatus, errorThrown) => {
this.log('onpaymentauthorized error', textStatus);
reject(new Error(errorThrown));
},
- })
+ });
} catch (error) {
this.log('onpaymentauthorized catch', error);
- console.log(error) // handle error
+ console.log(error); // handle error
}
});
}
@@ -578,8 +645,8 @@ class ApplepayButton {
if (confirmOrderResponse.approveApplePayPayment.status === "APPROVED") {
try {
- if (!this.shouldAllowShippingInButton()) {
- // No shipping, expect immediate capture, ex: PayNow.
+ if (this.shouldCompletePaymentWithContextHandler()) {
+ // No shipping, expect immediate capture, ex: PayNow, Checkout with form data.
let approveFailed = false;
await this.contextHandler.approveOrder({
@@ -602,7 +669,7 @@ class ApplepayButton {
} else {
this.log('onpaymentauthorized approveOrder FAIL');
session.completePayment(ApplePaySession.STATUS_FAILURE);
- session.abort()
+ session.abort();
console.error(error);
}
@@ -616,17 +683,17 @@ class ApplepayButton {
};
let authorizationResult = await processInWooAndCapture(data);
if (authorizationResult.result === "success") {
- session.completePayment(ApplePaySession.STATUS_SUCCESS)
- window.location.href = authorizationResult.redirect
+ session.completePayment(ApplePaySession.STATUS_SUCCESS);
+ window.location.href = authorizationResult.redirect;
} else {
- session.completePayment(ApplePaySession.STATUS_FAILURE)
+ session.completePayment(ApplePaySession.STATUS_FAILURE);
}
}
} catch (error) {
session.completePayment(ApplePaySession.STATUS_FAILURE);
- session.abort()
+ session.abort();
console.error(error);
}
} else {
@@ -640,43 +707,44 @@ class ApplepayButton {
} catch (error) {
console.error('Error confirming order with applepay token', error);
session.completePayment(ApplePaySession.STATUS_FAILURE);
- session.abort()
+ session.abort();
}
};
}
- fill_billing_contact(form_saved) {
+ fillBillingContact(data) {
return {
- givenName: form_saved.billing_first_name ?? '',
- familyName: form_saved.billing_last_name ?? '',
- emailAddress: form_saved.billing_email ?? '',
- phoneNumber: form_saved.billing_phone ?? '',
- addressLines: [form_saved.billing_address_1, form_saved.billing_address_2],
- locality: form_saved.billing_city ?? '',
- postalCode: form_saved.billing_postcode ?? '',
- countryCode: form_saved.billing_country ?? '',
- administrativeArea: form_saved.billing_state ?? '',
- }
- }
- fill_shipping_contact(form_saved) {
- if (form_saved.shipping_first_name === "") {
- return this.fill_billing_contact(form_saved)
- }
- return {
- givenName: (form_saved?.shipping_first_name && form_saved.shipping_first_name !== "") ? form_saved.shipping_first_name : form_saved?.billing_first_name,
- familyName: (form_saved?.shipping_last_name && form_saved.shipping_last_name !== "") ? form_saved.shipping_last_name : form_saved?.billing_last_name,
- emailAddress: (form_saved?.shipping_email && form_saved.shipping_email !== "") ? form_saved.shipping_email : form_saved?.billing_email,
- phoneNumber: (form_saved?.shipping_phone && form_saved.shipping_phone !== "") ? form_saved.shipping_phone : form_saved?.billing_phone,
- addressLines: [form_saved.shipping_address_1 ?? '', form_saved.shipping_address_2 ?? ''],
- locality: (form_saved?.shipping_city && form_saved.shipping_city !== "") ? form_saved.shipping_city : form_saved?.billing_city,
- postalCode: (form_saved?.shipping_postcode && form_saved.shipping_postcode !== "") ? form_saved.shipping_postcode : form_saved?.billing_postcode,
- countryCode: (form_saved?.shipping_country && form_saved.shipping_country !== "") ? form_saved.shipping_country : form_saved?.billing_country,
- administrativeArea: (form_saved?.shipping_state && form_saved.shipping_state !== "") ? form_saved.shipping_state : form_saved?.billing_state,
+ givenName: data.billing_first_name ?? '',
+ familyName: data.billing_last_name ?? '',
+ emailAddress: data.billing_email ?? '',
+ phoneNumber: data.billing_phone ?? '',
+ addressLines: [data.billing_address_1, data.billing_address_2],
+ locality: data.billing_city ?? '',
+ postalCode: data.billing_postcode ?? '',
+ countryCode: data.billing_country ?? '',
+ administrativeArea: data.billing_state ?? '',
}
}
- fill_application_data(form_saved) {
- const jsonString = JSON.stringify(form_saved);
+ fillShippingContact(data) {
+ if (data.shipping_first_name === "") {
+ return this.fillBillingContact(data);
+ }
+ return {
+ givenName: (data?.shipping_first_name && data.shipping_first_name !== "") ? data.shipping_first_name : data?.billing_first_name,
+ familyName: (data?.shipping_last_name && data.shipping_last_name !== "") ? data.shipping_last_name : data?.billing_last_name,
+ emailAddress: (data?.shipping_email && data.shipping_email !== "") ? data.shipping_email : data?.billing_email,
+ phoneNumber: (data?.shipping_phone && data.shipping_phone !== "") ? data.shipping_phone : data?.billing_phone,
+ addressLines: [data.shipping_address_1 ?? '', data.shipping_address_2 ?? ''],
+ locality: (data?.shipping_city && data.shipping_city !== "") ? data.shipping_city : data?.billing_city,
+ postalCode: (data?.shipping_postcode && data.shipping_postcode !== "") ? data.shipping_postcode : data?.billing_postcode,
+ countryCode: (data?.shipping_country && data.shipping_country !== "") ? data.shipping_country : data?.billing_country,
+ administrativeArea: (data?.shipping_state && data.shipping_state !== "") ? data.shipping_state : data?.billing_state,
+ }
+ }
+
+ fillApplicationData(data) {
+ const jsonString = JSON.stringify(data);
let utf8Str = encodeURIComponent(jsonString).replace(/%([0-9A-F]{2})/g, (match, p1) => {
return String.fromCharCode('0x' + p1);
});
diff --git a/modules/ppcp-applepay/resources/js/Context/BaseHandler.js b/modules/ppcp-applepay/resources/js/Context/BaseHandler.js
index 958508de2..6934916d8 100644
--- a/modules/ppcp-applepay/resources/js/Context/BaseHandler.js
+++ b/modules/ppcp-applepay/resources/js/Context/BaseHandler.js
@@ -15,12 +15,14 @@ class BaseHandler {
transactionInfo() {
return new Promise((resolve, reject) => {
+ const endpoint = this.ppcpConfig.ajax.cart_script_params.endpoint;
+ const separator = (endpoint.indexOf('?') !== -1) ? '&' : '?';
fetch(
- this.ppcpConfig.ajax.cart_script_params.endpoint,
+ endpoint + separator + 'shipping=1',
{
method: 'GET',
- credentials: 'same-origin',
+ credentials: 'same-origin'
}
)
.then(result => result.json())
diff --git a/modules/ppcp-applepay/resources/js/Context/CheckoutHandler.js b/modules/ppcp-applepay/resources/js/Context/CheckoutHandler.js
index 9d134fc55..67c88162a 100644
--- a/modules/ppcp-applepay/resources/js/Context/CheckoutHandler.js
+++ b/modules/ppcp-applepay/resources/js/Context/CheckoutHandler.js
@@ -1,28 +1,17 @@
import Spinner from "../../../../ppcp-button/resources/js/modules/Helper/Spinner";
import CheckoutActionHandler
from "../../../../ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler";
-import ErrorHandler from "../../../../ppcp-button/resources/js/modules/ErrorHandler";
import BaseHandler from "./BaseHandler";
class CheckoutHandler extends BaseHandler {
- createOrder() {
- const errorHandler = new ErrorHandler(
- this.ppcpConfig.labels.error.generic,
- document.querySelector('.woocommerce-notices-wrapper')
- );
-
- const spinner = new Spinner();
-
- const actionHandler = new CheckoutActionHandler(
+ actionHandler() {
+ return new CheckoutActionHandler(
this.ppcpConfig,
- errorHandler,
- spinner
+ this.errorHandler(),
+ new Spinner()
);
-
- return actionHandler.configuration().createOrder(null, null);
}
-
}
export default CheckoutHandler;
diff --git a/modules/ppcp-applepay/src/Assets/ApplePayButton.php b/modules/ppcp-applepay/src/Assets/ApplePayButton.php
index 701f1a7f8..c34a9fc6c 100644
--- a/modules/ppcp-applepay/src/Assets/ApplePayButton.php
+++ b/modules/ppcp-applepay/src/Assets/ApplePayButton.php
@@ -312,7 +312,6 @@ class ApplePayButton implements ButtonInterface {
$user_country,
$allowed_shipping_countries
);
- $product_need_shipping = $applepay_request_data_object->need_shipping();
if ( ! $is_allowed_selling_country ) {
$this->response_templates->response_with_data_errors(
@@ -320,7 +319,7 @@ class ApplePayButton implements ButtonInterface {
);
return;
}
- if ( $product_need_shipping && ! $is_allowed_shipping_country ) {
+ if ( $applepay_request_data_object->need_shipping() && ! $is_allowed_shipping_country ) {
$this->response_templates->response_with_data_errors(
array( array( 'errorCode' => 'addressUnserviceable' ) )
);
@@ -406,9 +405,6 @@ class ApplePayButton implements ButtonInterface {
$applepay_request_data_object = $this->applepay_data_object_http();
//phpcs:disable WordPress.Security.NonceVerification
- $this->logger->info('== $_POST ==');
- $this->logger->info(print_r($_POST, true));
-
$context = wc_clean( wp_unslash( $_POST['caller_page'] ?? '' ) );
if ( ! is_string( $context ) ) {
$this->response_templates->response_with_data_errors(
@@ -423,9 +419,6 @@ class ApplePayButton implements ButtonInterface {
}
$applepay_request_data_object->order_data( $context );
- $this->logger->info('== $applepay_request_data_object ==');
- $this->logger->info(print_r($applepay_request_data_object, true));
-
$this->update_posted_data( $applepay_request_data_object );
if ( $context === 'product' ) {
$cart_item_key = $this->prepare_cart( $applepay_request_data_object );
@@ -459,7 +452,7 @@ class ApplePayButton implements ButtonInterface {
}
);
}
- $this->add_addresses_to_order( $applepay_request_data_object );
+
WC()->checkout()->process_checkout();
}
@@ -773,33 +766,6 @@ class ApplePayButton implements ButtonInterface {
return $results;
}
- /**
- * Add address billing and shipping data to order
- *
- * @param ApplePayDataObjectHttp $applepay_request_data_object ApplePayDataObjectHttp.
- */
- protected function add_addresses_to_order(
- ApplePayDataObjectHttp $applepay_request_data_object
- ): void {
- add_action(
- 'woocommerce_checkout_create_order',
- static function ( WC_Order $order, array $data ) use ( $applepay_request_data_object ) {
-$this->logger->info('== HOOK woocommerce_checkout_create_order');
- if ( ! empty( $applepay_request_data_object->shipping_method() ) ) {
- $billing_address = $applepay_request_data_object->billing_address();
- $shipping_address = $applepay_request_data_object->shipping_address();
- // apple puts email in shipping_address while we get it from WC's billing_address.
- $billing_address['email'] = $shipping_address['email'];
- $billing_address['phone'] = $shipping_address['phone'];
-$this->logger->info(print_r($billing_address, true));
- $order->set_address( $billing_address, 'billing' );
- $order->set_address( $shipping_address, 'shipping' );
- }
- },
- 10,
- 2
- );
- }
/**
* Empty the cart to use for calculations
* while saving its contents in a field
@@ -881,8 +847,6 @@ $this->logger->info(print_r($billing_address, true));
add_filter(
'woocommerce_checkout_posted_data',
function ( array $data ) use ( $applepay_request_data_object ): array {
-$this->logger->info('== HOOK woocommerce_checkout_posted_data');
-
$data['payment_method'] = 'ppcp-gateway';
$data['shipping_method'] = $applepay_request_data_object->shipping_method();
$data['billing_first_name'] = $applepay_request_data_object->billing_address()['first_name'] ?? '';
@@ -894,10 +858,18 @@ $this->logger->info('== HOOK woocommerce_checkout_posted_data');
$data['billing_city'] = $applepay_request_data_object->billing_address()['city'] ?? '';
$data['billing_state'] = $applepay_request_data_object->billing_address()['state'] ?? '';
$data['billing_postcode'] = $applepay_request_data_object->billing_address()['postcode'] ?? '';
+ $data['billing_email'] = $applepay_request_data_object->billing_address()['email'] ?? '';
+ $data['billing_phone'] = $applepay_request_data_object->billing_address()['phone'] ?? '';
- if ( ! empty( $applepay_request_data_object->need_shipping() ) ) {
- $data['billing_email'] = $applepay_request_data_object->shipping_address()['email'] ?? '';
- $data['billing_phone'] = $applepay_request_data_object->shipping_address()['phone'] ?? '';
+ // ApplePay doesn't send us a billing email or phone, use the shipping contacts instead.
+ if ( ! ( $data['billing_email'] ?? false ) ) {
+ $data['billing_email'] = $applepay_request_data_object->shipping_address()['email'] ?? '';
+ }
+ if ( ! ( $data['billing_phone'] ?? false ) ) {
+ $data['billing_phone'] = $applepay_request_data_object->shipping_address()['phone'] ?? '';
+ }
+
+ if ( ! empty( $applepay_request_data_object->shipping_method() ) ) {
$data['shipping_first_name'] = $applepay_request_data_object->shipping_address()['first_name'] ?? '';
$data['shipping_last_name'] = $applepay_request_data_object->shipping_address()['last_name'] ?? '';
$data['shipping_company'] = $applepay_request_data_object->shipping_address()['company'] ?? '';
@@ -910,7 +882,6 @@ $this->logger->info('== HOOK woocommerce_checkout_posted_data');
$data['shipping_email'] = $applepay_request_data_object->shipping_address()['email'] ?? '';
$data['shipping_phone'] = $applepay_request_data_object->shipping_address()['phone'] ?? '';
}
-$this->logger->info(print_r($data, true));
return $data;
}
diff --git a/modules/ppcp-applepay/src/Assets/DataToAppleButtonScripts.php b/modules/ppcp-applepay/src/Assets/DataToAppleButtonScripts.php
index 1c3891b48..6c29c726d 100644
--- a/modules/ppcp-applepay/src/Assets/DataToAppleButtonScripts.php
+++ b/modules/ppcp-applepay/src/Assets/DataToAppleButtonScripts.php
@@ -202,29 +202,29 @@ class DataToAppleButtonScripts {
$checkout_data_mode = $this->settings->has( 'applepay_checkout_data_mode' ) ? $this->settings->get( 'applepay_checkout_data_mode' ) : PropertiesDictionary::BILLING_DATA_MODE_DEFAULT;
return array(
- 'sdk_url' => $this->sdk_url,
- 'is_debug' => defined( 'WP_DEBUG' ) && WP_DEBUG ? true : false,
+ 'sdk_url' => $this->sdk_url,
+ 'is_debug' => defined( 'WP_DEBUG' ) && WP_DEBUG ? true : false,
'preferences' => array(
'checkout_data_mode' => $checkout_data_mode,
),
- 'button' => array(
+ 'button' => array(
'wrapper' => 'applepay-container',
'mini_cart_wrapper' => 'applepay-container-minicart',
'type' => $type,
'color' => $color,
'lang' => $lang,
),
- 'product' => array(
+ 'product' => array(
'needShipping' => $cart->needs_shipping(),
'subtotal' => $cart->get_subtotal(),
),
- 'shop' => array(
+ 'shop' => array(
'countryCode' => $shop_country_code,
'currencyCode' => $currency_code,
'totalLabel' => $total_label,
),
- 'ajax_url' => admin_url( 'admin-ajax.php' ),
- 'nonce' => wp_create_nonce( 'woocommerce-process_checkout' ),
+ 'ajax_url' => admin_url( 'admin-ajax.php' ),
+ 'nonce' => wp_create_nonce( 'woocommerce-process_checkout' ),
);
}
@@ -250,28 +250,28 @@ class DataToAppleButtonScripts {
$checkout_data_mode = $this->settings->has( 'applepay_checkout_data_mode' ) ? $this->settings->get( 'applepay_checkout_data_mode' ) : PropertiesDictionary::BILLING_DATA_MODE_DEFAULT;
return array(
- 'sdk_url' => $this->sdk_url,
- 'is_debug' => defined( 'WP_DEBUG' ) && WP_DEBUG ? true : false,
+ 'sdk_url' => $this->sdk_url,
+ 'is_debug' => defined( 'WP_DEBUG' ) && WP_DEBUG ? true : false,
'preferences' => array(
'checkout_data_mode' => $checkout_data_mode,
),
- 'button' => array(
+ 'button' => array(
'wrapper' => 'applepay-container',
'mini_cart_wrapper' => 'applepay-container-minicart',
'type' => $type,
'color' => $color,
'lang' => $lang,
),
- 'product' => array(
+ 'product' => array(
'needShipping' => false,
'subtotal' => 0,
),
- 'shop' => array(
+ 'shop' => array(
'countryCode' => $shop_country_code,
'currencyCode' => $currency_code,
'totalLabel' => $total_label,
),
- 'ajax_url' => admin_url( 'admin-ajax.php' ),
+ 'ajax_url' => admin_url( 'admin-ajax.php' ),
);
}
}
diff --git a/modules/ppcp-applepay/src/Assets/PropertiesDictionary.php b/modules/ppcp-applepay/src/Assets/PropertiesDictionary.php
index 4cdb3190f..da859e2c2 100644
--- a/modules/ppcp-applepay/src/Assets/PropertiesDictionary.php
+++ b/modules/ppcp-applepay/src/Assets/PropertiesDictionary.php
@@ -198,8 +198,8 @@ class PropertiesDictionary {
*/
public static function billing_data_modes(): array {
return array(
- PropertiesDictionary::BILLING_DATA_MODE_USE_WC => __( 'Use WC checkout form data (do not show shipping address fields)', 'woocommerce-paypal-payments' ),
- PropertiesDictionary::BILLING_DATA_MODE_USE_APPLEPAY => __( 'Do not use WC checkout form data (request billing and shipping addresses on Apple Pay)', 'woocommerce-paypal-payments' ),
+ self::BILLING_DATA_MODE_USE_WC => __( 'Use WC checkout form data (do not show shipping address fields)', 'woocommerce-paypal-payments' ),
+ self::BILLING_DATA_MODE_USE_APPLEPAY => __( 'Do not use WC checkout form data (request billing and shipping addresses on Apple Pay)', 'woocommerce-paypal-payments' ),
);
}
}
diff --git a/modules/ppcp-button/src/Endpoint/CartScriptParamsEndpoint.php b/modules/ppcp-button/src/Endpoint/CartScriptParamsEndpoint.php
index b8bde1c45..316d2c000 100644
--- a/modules/ppcp-button/src/Endpoint/CartScriptParamsEndpoint.php
+++ b/modules/ppcp-button/src/Endpoint/CartScriptParamsEndpoint.php
@@ -70,6 +70,8 @@ class CartScriptParamsEndpoint implements EndpointInterface {
wc_maybe_define_constant( 'WOOCOMMERCE_CART', true );
}
+ $include_shipping = (bool) wc_clean( wp_unslash( $_GET['shipping'] ?? '' ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
+
$script_data = $this->smart_button->script_data();
$total = (float) WC()->cart->get_total( 'numeric' );
@@ -79,52 +81,23 @@ class CartScriptParamsEndpoint implements EndpointInterface {
$shop_country_code = $base_location['country'] ?? '';
$currency_code = get_woocommerce_currency();
+ $response = array(
+ 'url_params' => $script_data['url_params'],
+ 'button' => $script_data['button'],
+ 'messages' => $script_data['messages'],
+ 'amount' => WC()->cart->get_total( 'raw' ),
- $calculated_packages = WC()->shipping->calculate_shipping(
- WC()->cart->get_shipping_packages()
+ 'total' => $total,
+ 'total_str' => ( new Money( $total, $currency_code ) )->value_str(),
+ 'currency_code' => $currency_code,
+ 'country_code' => $shop_country_code,
);
- $shipping_packages = array();
-
- foreach ( $calculated_packages[0]['rates'] as $rate ) {
- $rate_cost = $rate->get_cost();
-
- /**
- * The shipping rate.
- *
- * @var \WC_Shipping_Rate $rate
- */
- $shipping_packages[] = array(
- 'id' => $rate->get_id(),
- 'label' => $rate->get_label(),
- 'cost' => (float) $rate_cost,
- 'cost_str' => ( new Money( (float) $rate_cost, $currency_code ) )->value_str(),
- 'description' => html_entity_decode(
- wp_strip_all_tags(
- wc_price( (float) $rate->get_cost(), array( 'currency' => get_woocommerce_currency() ) )
- )
- ),
- );
+ if ( $include_shipping ) {
+ $response = $this->append_shipping_data( $response, $currency_code );
}
-
- wp_send_json_success(
- array(
- 'url_params' => $script_data['url_params'],
- 'button' => $script_data['button'],
- 'messages' => $script_data['messages'],
- 'amount' => WC()->cart->get_total( 'raw' ),
-
- 'total' => $total,
- 'total_str' => ( new Money( $total, $currency_code ) )->value_str(),
- 'currency_code' => $currency_code,
- 'country_code' => $shop_country_code,
-
- 'chosen_shipping_methods' => WC()->session->get( 'chosen_shipping_methods' ),
- 'shipping_packages' => $shipping_packages
- )
- );
-
+ wp_send_json_success( $response );
return true;
} catch ( Throwable $error ) {
$this->logger->error( "CartScriptParamsEndpoint execution failed. {$error->getMessage()} {$error->getFile()}:{$error->getLine()}" );
@@ -133,4 +106,45 @@ class CartScriptParamsEndpoint implements EndpointInterface {
return false;
}
}
+
+ /**
+ * Appends shipping data to response.
+ *
+ * @param array $response The response array.
+ * @param string $currency_code The currency code.
+ * @return array
+ */
+ private function append_shipping_data( array $response, string $currency_code ): array {
+ $calculated_packages = WC()->shipping->calculate_shipping(
+ WC()->cart->get_shipping_packages()
+ );
+
+ $shipping_packages = array();
+
+ foreach ( $calculated_packages[0]['rates'] as $rate ) {
+ $rate_cost = $rate->get_cost();
+
+ /**
+ * The shipping rate.
+ *
+ * @var \WC_Shipping_Rate $rate
+ */
+ $shipping_packages[] = array(
+ 'id' => $rate->get_id(),
+ 'label' => $rate->get_label(),
+ 'cost' => (float) $rate_cost,
+ 'cost_str' => ( new Money( (float) $rate_cost, $currency_code ) )->value_str(),
+ 'description' => html_entity_decode(
+ wp_strip_all_tags(
+ wc_price( (float) $rate->get_cost(), array( 'currency' => get_woocommerce_currency() ) )
+ )
+ ),
+ );
+ }
+
+ $response['chosen_shipping_methods'] = WC()->session->get( 'chosen_shipping_methods' );
+ $response['shipping_packages'] = $shipping_packages;
+
+ return $response;
+ }
}
diff --git a/modules/ppcp-googlepay/extensions.php b/modules/ppcp-googlepay/extensions.php
index e2080a8f5..1583e5c6e 100644
--- a/modules/ppcp-googlepay/extensions.php
+++ b/modules/ppcp-googlepay/extensions.php
@@ -142,7 +142,7 @@ return array(
'This controls the label of the Google Pay button.',
'woocommerce-paypal-payments'
),
- 'classes' => array('ppcp-field-indent'),
+ 'classes' => array( 'ppcp-field-indent' ),
'class' => array(),
'input_class' => array( 'wc-enhanced-select' ),
'default' => 'pay',
@@ -161,7 +161,7 @@ return array(
),
'label' => '',
'input_class' => array( 'wc-enhanced-select' ),
- 'classes' => array('ppcp-field-indent'),
+ 'classes' => array( 'ppcp-field-indent' ),
'class' => array(),
'default' => 'black',
'options' => PropertiesDictionary::button_colors(),
@@ -177,7 +177,7 @@ return array(
'The language and region used for the displayed Google Pay button. The default value is the current language and region setting in a browser.',
'woocommerce-paypal-payments'
),
- 'classes' => array('ppcp-field-indent'),
+ 'classes' => array( 'ppcp-field-indent' ),
'class' => array(),
'input_class' => array( 'wc-enhanced-select' ),
'default' => 'en',
@@ -194,7 +194,7 @@ return array(
'Synchronizes your available shipping options with Google Pay. Enabling this may impact the buyer experience.',
'woocommerce-paypal-payments'
),
- 'classes' => array('ppcp-field-indent'),
+ 'classes' => array( 'ppcp-field-indent' ),
'label' => __( 'Enable Google Pay shipping callback', 'woocommerce-paypal-payments' ),
'default' => 'no',
'screens' => array( State::STATE_ONBOARDED ),
From 692d3672c42ff85d3c40d1267b1ccad588666b13 Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Fri, 10 Nov 2023 11:20:28 +0100
Subject: [PATCH 15/36] Add card fields (WIP)
---
.../js/modules/Renderer/CreditCardRenderer.js | 302 ++-
modules/ppcp-card-fields/.babelrc | 14 -
modules/ppcp-card-fields/.gitignore | 3 -
modules/ppcp-card-fields/package.json | 34 -
.../resources/js/CardFieldsRenderer.js | 27 -
modules/ppcp-card-fields/resources/js/boot.js | 0
modules/ppcp-card-fields/services.php | 11 -
.../ppcp-card-fields/src/CardFieldsModule.php | 14 -
modules/ppcp-card-fields/webpack.config.js | 38 -
modules/ppcp-card-fields/yarn.lock | 2254 -----------------
package.json | 3 -
11 files changed, 184 insertions(+), 2516 deletions(-)
delete mode 100644 modules/ppcp-card-fields/.babelrc
delete mode 100644 modules/ppcp-card-fields/.gitignore
delete mode 100644 modules/ppcp-card-fields/package.json
delete mode 100644 modules/ppcp-card-fields/resources/js/CardFieldsRenderer.js
delete mode 100644 modules/ppcp-card-fields/resources/js/boot.js
delete mode 100644 modules/ppcp-card-fields/webpack.config.js
delete mode 100644 modules/ppcp-card-fields/yarn.lock
diff --git a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
index 9cd6e345c..0249076e4 100644
--- a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
+++ b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
@@ -1,6 +1,5 @@
import dccInputFactory from "../Helper/DccInputFactory";
import {show} from "../Helper/Hiding";
-import Product from "../Entity/Product";
class CreditCardRenderer {
@@ -25,141 +24,208 @@ class CreditCardRenderer {
) {
return;
}
- if (
- typeof paypal.HostedFields === 'undefined'
- || ! paypal.HostedFields.isEligible()
- ) {
- const wrapperElement = document.querySelector(wrapper);
- wrapperElement.parentNode.removeChild(wrapperElement);
+
+ if (typeof paypal.HostedFields !== 'undefined' && paypal.HostedFields.isEligible()) {
+ const buttonSelector = wrapper + ' button';
+
+ if (this.currentHostedFieldsInstance) {
+ this.currentHostedFieldsInstance.teardown()
+ .catch(err => console.error(`Hosted fields teardown error: ${err}`));
+ this.currentHostedFieldsInstance = null;
+ }
+
+ const gateWayBox = document.querySelector('.payment_box.payment_method_ppcp-credit-card-gateway');
+ if(! gateWayBox) {
+ return
+ }
+ const oldDisplayStyle = gateWayBox.style.display;
+ gateWayBox.style.display = 'block';
+
+ const hideDccGateway = document.querySelector('#ppcp-hide-dcc');
+ if (hideDccGateway) {
+ hideDccGateway.parentNode.removeChild(hideDccGateway);
+ }
+
+ const cardNumberField = document.querySelector('#ppcp-credit-card-gateway-card-number');
+
+ const stylesRaw = window.getComputedStyle(cardNumberField);
+ let styles = {};
+ Object.values(stylesRaw).forEach( (prop) => {
+ if (! stylesRaw[prop]) {
+ return;
+ }
+ styles[prop] = '' + stylesRaw[prop];
+ });
+
+ const cardNumber = dccInputFactory(cardNumberField);
+ cardNumberField.parentNode.replaceChild(cardNumber, cardNumberField);
+
+ const cardExpiryField = document.querySelector('#ppcp-credit-card-gateway-card-expiry');
+ const cardExpiry = dccInputFactory(cardExpiryField);
+ cardExpiryField.parentNode.replaceChild(cardExpiry, cardExpiryField);
+
+ const cardCodeField = document.querySelector('#ppcp-credit-card-gateway-card-cvc');
+ const cardCode = dccInputFactory(cardCodeField);
+ cardCodeField.parentNode.replaceChild(cardCode, cardCodeField);
+
+ gateWayBox.style.display = oldDisplayStyle;
+
+ const formWrapper = '.payment_box payment_method_ppcp-credit-card-gateway';
+ if (
+ this.defaultConfig.enforce_vault
+ && document.querySelector(formWrapper + ' .ppcp-credit-card-vault')
+ ) {
+ document.querySelector(formWrapper + ' .ppcp-credit-card-vault').checked = true;
+ document.querySelector(formWrapper + ' .ppcp-credit-card-vault').setAttribute('disabled', true);
+ }
+ paypal.HostedFields.render({
+ createOrder: contextConfig.createOrder,
+ styles: {
+ 'input': styles
+ },
+ fields: {
+ number: {
+ selector: '#ppcp-credit-card-gateway-card-number',
+ placeholder: this.defaultConfig.hosted_fields.labels.credit_card_number,
+ },
+ cvv: {
+ selector: '#ppcp-credit-card-gateway-card-cvc',
+ placeholder: this.defaultConfig.hosted_fields.labels.cvv,
+ },
+ expirationDate: {
+ selector: '#ppcp-credit-card-gateway-card-expiry',
+ placeholder: this.defaultConfig.hosted_fields.labels.mm_yy,
+ }
+ }
+ }).then(hostedFields => {
+ document.dispatchEvent(new CustomEvent("hosted_fields_loaded"));
+ this.currentHostedFieldsInstance = hostedFields;
+
+ hostedFields.on('inputSubmitRequest', () => {
+ this._submit(contextConfig);
+ });
+ hostedFields.on('cardTypeChange', (event) => {
+ if ( ! event.cards.length ) {
+ this.cardValid = false;
+ return;
+ }
+ const validCards = this.defaultConfig.hosted_fields.valid_cards;
+ this.cardValid = validCards.indexOf(event.cards[0].type) !== -1;
+
+ const className = this._cardNumberFiledCLassNameByCardType(event.cards[0].type);
+ this._recreateElementClassAttribute(cardNumber, cardNumberField.className);
+ if (event.cards.length === 1) {
+ cardNumber.classList.add(className);
+ }
+ })
+ hostedFields.on('validityChange', (event) => {
+ this.formValid = Object.keys(event.fields).every(function (key) {
+ return event.fields[key].isValid;
+ });
+ });
+ hostedFields.on('empty', (event) => {
+ this._recreateElementClassAttribute(cardNumber, cardNumberField.className);
+ this.emptyFields.add(event.emittedBy);
+ });
+ hostedFields.on('notEmpty', (event) => {
+ this.emptyFields.delete(event.emittedBy);
+ });
+
+ show(buttonSelector);
+
+ if (document.querySelector(wrapper).getAttribute('data-ppcp-subscribed') !== true) {
+ document.querySelector(buttonSelector).addEventListener(
+ 'click',
+ event => {
+ event.preventDefault();
+ this._submit(contextConfig);
+ }
+ );
+
+ document.querySelector(wrapper).setAttribute('data-ppcp-subscribed', true);
+ }
+ });
+
+ document.querySelector('#payment_method_ppcp-credit-card-gateway').addEventListener(
+ 'click',
+ () => {
+ document.querySelector('label[for=ppcp-credit-card-gateway-card-number]').click();
+ }
+ )
+
return;
}
- const buttonSelector = wrapper + ' button';
+ if (typeof paypal.CardFields !== 'undefined') {
+ const buttonSelector = wrapper + ' button';
- if (this.currentHostedFieldsInstance) {
- this.currentHostedFieldsInstance.teardown()
- .catch(err => console.error(`Hosted fields teardown error: ${err}`));
- this.currentHostedFieldsInstance = null;
- }
-
- const gateWayBox = document.querySelector('.payment_box.payment_method_ppcp-credit-card-gateway');
- if(! gateWayBox) {
- return
- }
- const oldDisplayStyle = gateWayBox.style.display;
- gateWayBox.style.display = 'block';
-
- const hideDccGateway = document.querySelector('#ppcp-hide-dcc');
- if (hideDccGateway) {
- hideDccGateway.parentNode.removeChild(hideDccGateway);
- }
-
- const cardNumberField = document.querySelector('#ppcp-credit-card-gateway-card-number');
-
- const stylesRaw = window.getComputedStyle(cardNumberField);
- let styles = {};
- Object.values(stylesRaw).forEach( (prop) => {
- if (! stylesRaw[prop]) {
- return;
+ const gateWayBox = document.querySelector('.payment_box.payment_method_ppcp-credit-card-gateway');
+ if(! gateWayBox) {
+ return
}
- styles[prop] = '' + stylesRaw[prop];
- });
+ const oldDisplayStyle = gateWayBox.style.display;
+ gateWayBox.style.display = 'block';
- const cardNumber = dccInputFactory(cardNumberField);
- cardNumberField.parentNode.replaceChild(cardNumber, cardNumberField);
-
- const cardExpiryField = document.querySelector('#ppcp-credit-card-gateway-card-expiry');
- const cardExpiry = dccInputFactory(cardExpiryField);
- cardExpiryField.parentNode.replaceChild(cardExpiry, cardExpiryField);
-
- const cardCodeField = document.querySelector('#ppcp-credit-card-gateway-card-cvc');
- const cardCode = dccInputFactory(cardCodeField);
- cardCodeField.parentNode.replaceChild(cardCode, cardCodeField);
-
- gateWayBox.style.display = oldDisplayStyle;
-
- const formWrapper = '.payment_box payment_method_ppcp-credit-card-gateway';
- if (
- this.defaultConfig.enforce_vault
- && document.querySelector(formWrapper + ' .ppcp-credit-card-vault')
- ) {
- document.querySelector(formWrapper + ' .ppcp-credit-card-vault').checked = true;
- document.querySelector(formWrapper + ' .ppcp-credit-card-vault').setAttribute('disabled', true);
- }
- paypal.HostedFields.render({
- createOrder: contextConfig.createOrder,
- styles: {
- 'input': styles
- },
- fields: {
- number: {
- selector: '#ppcp-credit-card-gateway-card-number',
- placeholder: this.defaultConfig.hosted_fields.labels.credit_card_number,
- },
- cvv: {
- selector: '#ppcp-credit-card-gateway-card-cvc',
- placeholder: this.defaultConfig.hosted_fields.labels.cvv,
- },
- expirationDate: {
- selector: '#ppcp-credit-card-gateway-card-expiry',
- placeholder: this.defaultConfig.hosted_fields.labels.mm_yy,
- }
+ const hideDccGateway = document.querySelector('#ppcp-hide-dcc');
+ if (hideDccGateway) {
+ hideDccGateway.parentNode.removeChild(hideDccGateway);
}
- }).then(hostedFields => {
- document.dispatchEvent(new CustomEvent("hosted_fields_loaded"));
- this.currentHostedFieldsInstance = hostedFields;
- hostedFields.on('inputSubmitRequest', () => {
- this._submit(contextConfig);
- });
- hostedFields.on('cardTypeChange', (event) => {
- if ( ! event.cards.length ) {
- this.cardValid = false;
+ const cardNumberField = document.querySelector('#ppcp-credit-card-gateway-card-number');
+ const stylesRaw = window.getComputedStyle(cardNumberField);
+ let styles = {};
+ Object.values(stylesRaw).forEach( (prop) => {
+ if (! stylesRaw[prop]) {
return;
}
- const validCards = this.defaultConfig.hosted_fields.valid_cards;
- this.cardValid = validCards.indexOf(event.cards[0].type) !== -1;
+ styles[prop] = '' + stylesRaw[prop];
+ });
+ const cardNumber = dccInputFactory(cardNumberField);
+ cardNumberField.parentNode.replaceChild(cardNumber, cardNumberField);
- const className = this._cardNumberFiledCLassNameByCardType(event.cards[0].type);
- this._recreateElementClassAttribute(cardNumber, cardNumberField.className);
- if (event.cards.length === 1) {
- cardNumber.classList.add(className);
+ const cardExpiryField = document.querySelector('#ppcp-credit-card-gateway-card-expiry');
+ const cardExpiry = dccInputFactory(cardExpiryField);
+ cardExpiryField.parentNode.replaceChild(cardExpiry, cardExpiryField);
+
+ const cardCodeField = document.querySelector('#ppcp-credit-card-gateway-card-cvc');
+ const cardCode = dccInputFactory(cardCodeField);
+ cardCodeField.parentNode.replaceChild(cardCode, cardCodeField);
+
+ const cardField = paypal.CardFields({
+ createOrder: contextConfig.createOrder,
+ onApprove: function (data) {
+ return contextConfig.onApprove(data);
+ },
+ onError: function (error) {
+ console.error(error)
}
- })
- hostedFields.on('validityChange', (event) => {
- this.formValid = Object.keys(event.fields).every(function (key) {
- return event.fields[key].isValid;
- });
- });
- hostedFields.on('empty', (event) => {
- this._recreateElementClassAttribute(cardNumber, cardNumberField.className);
- this.emptyFields.add(event.emittedBy);
- });
- hostedFields.on('notEmpty', (event) => {
- this.emptyFields.delete(event.emittedBy);
});
+ if (cardField.isEligible()) {
+ const numberField = cardField.NumberField();
+ numberField.render('#ppcp-credit-card-gateway-card-number');
+
+ const cvvField = cardField.CVVField();
+ cvvField.render('#ppcp-credit-card-gateway-card-cvc');
+
+ const expiryField = cardField.ExpiryField();
+ expiryField.render('#ppcp-credit-card-gateway-card-expiry');
+ }
+
+ gateWayBox.style.display = oldDisplayStyle;
+
show(buttonSelector);
- if (document.querySelector(wrapper).getAttribute('data-ppcp-subscribed') !== true) {
- document.querySelector(buttonSelector).addEventListener(
- 'click',
- event => {
- event.preventDefault();
- this._submit(contextConfig);
- }
- );
+ document.querySelector(buttonSelector).addEventListener("click", (event) => {
+ event.preventDefault();
+ cardField.submit();
+ });
- document.querySelector(wrapper).setAttribute('data-ppcp-subscribed', true);
- }
- });
+ return;
+ }
- document.querySelector('#payment_method_ppcp-credit-card-gateway').addEventListener(
- 'click',
- () => {
- document.querySelector('label[for=ppcp-credit-card-gateway-card-number]').click();
- }
- )
+ const wrapperElement = document.querySelector(wrapper);
+ wrapperElement.parentNode.removeChild(wrapperElement);
}
disableFields() {
diff --git a/modules/ppcp-card-fields/.babelrc b/modules/ppcp-card-fields/.babelrc
deleted file mode 100644
index 822778e6c..000000000
--- a/modules/ppcp-card-fields/.babelrc
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "presets": [
- [
- "@babel/preset-env",
- {
- "useBuiltIns": "usage",
- "corejs": "3.25.0"
- }
- ],
- [
- "@babel/preset-react"
- ]
- ]
-}
diff --git a/modules/ppcp-card-fields/.gitignore b/modules/ppcp-card-fields/.gitignore
deleted file mode 100644
index 0bd2b9f58..000000000
--- a/modules/ppcp-card-fields/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-node_modules
-assets/js
-assets/css
diff --git a/modules/ppcp-card-fields/package.json b/modules/ppcp-card-fields/package.json
deleted file mode 100644
index 1327fbe09..000000000
--- a/modules/ppcp-card-fields/package.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "name": "ppcp-card-fields",
- "version": "1.0.0",
- "license": "GPL-3.0-or-later",
- "browserslist": [
- "> 0.5%",
- "Safari >= 8",
- "Chrome >= 41",
- "Firefox >= 43",
- "Edge >= 14"
- ],
- "dependencies": {
- "@paypal/paypal-js": "^6.0.0",
- "core-js": "^3.25.0"
- },
- "devDependencies": {
- "@babel/core": "^7.19",
- "@babel/preset-env": "^7.19",
- "@babel/preset-react": "^7.18.6",
- "@woocommerce/dependency-extraction-webpack-plugin": "^2.2.0",
- "babel-loader": "^8.2",
- "cross-env": "^7.0.3",
- "file-loader": "^6.2.0",
- "sass": "^1.42.1",
- "sass-loader": "^12.1.0",
- "webpack": "^5.76",
- "webpack-cli": "^4.10"
- },
- "scripts": {
- "build": "cross-env BABEL_ENV=default NODE_ENV=production webpack",
- "watch": "cross-env BABEL_ENV=default NODE_ENV=production webpack --watch",
- "dev": "cross-env BABEL_ENV=default webpack --watch"
- }
-}
diff --git a/modules/ppcp-card-fields/resources/js/CardFieldsRenderer.js b/modules/ppcp-card-fields/resources/js/CardFieldsRenderer.js
deleted file mode 100644
index f7a68b6d5..000000000
--- a/modules/ppcp-card-fields/resources/js/CardFieldsRenderer.js
+++ /dev/null
@@ -1,27 +0,0 @@
-class CardFieldsRenderer {
-
- render(wrapper, contextConfig) {
- const cardField = paypal.CardFields({
- createOrder: function (data) {},
- onApprove: function (data) {},
- onError: function (error) {
- console.error(error)
- }
- });
-
- if (cardField.isEligible()) {
- const numberField = cardField.NumberField();
- numberField.render('#ppcp-credit-card-gateway-card-number');
-
- const cvvField = cardField.CVVField();
- cvvField.render('#ppcp-credit-card-gateway-card-cvc');
-
- const expiryField = cardField.ExpiryField();
- expiryField.render('#ppcp-credit-card-gateway-card-expiry');
- };
- }
-
- enableFields() {}
-}
-
-export default CardFieldsRenderer;
diff --git a/modules/ppcp-card-fields/resources/js/boot.js b/modules/ppcp-card-fields/resources/js/boot.js
deleted file mode 100644
index e69de29bb..000000000
diff --git a/modules/ppcp-card-fields/services.php b/modules/ppcp-card-fields/services.php
index d101e46da..76a7082dc 100644
--- a/modules/ppcp-card-fields/services.php
+++ b/modules/ppcp-card-fields/services.php
@@ -41,15 +41,4 @@ return array(
)
);
},
- 'card-fields.module.url' => static function ( ContainerInterface $container ): string {
- /**
- * The path cannot be false.
- *
- * @psalm-suppress PossiblyFalseArgument
- */
- return plugins_url(
- '/modules/ppcp-card-fields/',
- dirname( realpath( __FILE__ ), 3 ) . '/woocommerce-paypal-payments.php'
- );
- },
);
diff --git a/modules/ppcp-card-fields/src/CardFieldsModule.php b/modules/ppcp-card-fields/src/CardFieldsModule.php
index c214c2ef8..4b8f55d98 100644
--- a/modules/ppcp-card-fields/src/CardFieldsModule.php
+++ b/modules/ppcp-card-fields/src/CardFieldsModule.php
@@ -28,20 +28,6 @@ class CardFieldsModule implements ModuleInterface {
return;
}
- add_action(
- 'wp_enqueue_scripts',
- function () use ( $c ) {
- $module_url = $c->get( 'card-fields.module.url' );
- wp_enqueue_script(
- 'ppcp-card-fields-boot',
- untrailingslashit( $module_url ) . '/assets/js/boot.js',
- array( 'jquery' ),
- $c->get( 'ppcp.asset-version' ),
- true
- );
- }
- );
-
/**
* Param types removed to avoid third-party issues.
*
diff --git a/modules/ppcp-card-fields/webpack.config.js b/modules/ppcp-card-fields/webpack.config.js
deleted file mode 100644
index a168dda71..000000000
--- a/modules/ppcp-card-fields/webpack.config.js
+++ /dev/null
@@ -1,38 +0,0 @@
-const path = require('path');
-const isProduction = process.env.NODE_ENV === 'production';
-
-const DependencyExtractionWebpackPlugin = require( '@woocommerce/dependency-extraction-webpack-plugin' );
-
-module.exports = {
- devtool: isProduction ? 'source-map' : 'eval-source-map',
- mode: isProduction ? 'production' : 'development',
- target: 'web',
- plugins: [ new DependencyExtractionWebpackPlugin() ],
- entry: {
- 'boot': path.resolve('./resources/js/boot.js'),
- },
- output: {
- path: path.resolve(__dirname, 'assets/'),
- filename: 'js/[name].js',
- },
- module: {
- rules: [{
- test: /\.js?$/,
- exclude: /node_modules/,
- loader: 'babel-loader',
- },
- {
- test: /\.scss$/,
- exclude: /node_modules/,
- use: [
- {
- loader: 'file-loader',
- options: {
- name: 'css/[name].css',
- }
- },
- {loader:'sass-loader'}
- ]
- }]
- }
-};
diff --git a/modules/ppcp-card-fields/yarn.lock b/modules/ppcp-card-fields/yarn.lock
deleted file mode 100644
index 3eef88182..000000000
--- a/modules/ppcp-card-fields/yarn.lock
+++ /dev/null
@@ -1,2254 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@ampproject/remapping@^2.2.0":
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
- integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==
- dependencies:
- "@jridgewell/gen-mapping" "^0.3.0"
- "@jridgewell/trace-mapping" "^0.3.9"
-
-"@babel/code-frame@^7.22.13":
- version "7.22.13"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e"
- integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==
- dependencies:
- "@babel/highlight" "^7.22.13"
- chalk "^2.4.2"
-
-"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc"
- integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==
-
-"@babel/core@^7.19":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94"
- integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==
- dependencies:
- "@ampproject/remapping" "^2.2.0"
- "@babel/code-frame" "^7.22.13"
- "@babel/generator" "^7.23.0"
- "@babel/helper-compilation-targets" "^7.22.15"
- "@babel/helper-module-transforms" "^7.23.0"
- "@babel/helpers" "^7.23.2"
- "@babel/parser" "^7.23.0"
- "@babel/template" "^7.22.15"
- "@babel/traverse" "^7.23.2"
- "@babel/types" "^7.23.0"
- convert-source-map "^2.0.0"
- debug "^4.1.0"
- gensync "^1.0.0-beta.2"
- json5 "^2.2.3"
- semver "^6.3.1"
-
-"@babel/generator@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420"
- integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==
- dependencies:
- "@babel/types" "^7.23.0"
- "@jridgewell/gen-mapping" "^0.3.2"
- "@jridgewell/trace-mapping" "^0.3.17"
- jsesc "^2.5.1"
-
-"@babel/helper-annotate-as-pure@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
- integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==
- dependencies:
- "@babel/types" "^7.22.5"
-
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956"
- integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==
- dependencies:
- "@babel/types" "^7.22.15"
-
-"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52"
- integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==
- dependencies:
- "@babel/compat-data" "^7.22.9"
- "@babel/helper-validator-option" "^7.22.15"
- browserslist "^4.21.9"
- lru-cache "^5.1.1"
- semver "^6.3.1"
-
-"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4"
- integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.22.5"
- "@babel/helper-environment-visitor" "^7.22.5"
- "@babel/helper-function-name" "^7.22.5"
- "@babel/helper-member-expression-to-functions" "^7.22.15"
- "@babel/helper-optimise-call-expression" "^7.22.5"
- "@babel/helper-replace-supers" "^7.22.9"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
- "@babel/helper-split-export-declaration" "^7.22.6"
- semver "^6.3.1"
-
-"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1"
- integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.22.5"
- regexpu-core "^5.3.1"
- semver "^6.3.1"
-
-"@babel/helper-define-polyfill-provider@^0.4.3":
- version "0.4.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba"
- integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==
- dependencies:
- "@babel/helper-compilation-targets" "^7.22.6"
- "@babel/helper-plugin-utils" "^7.22.5"
- debug "^4.1.1"
- lodash.debounce "^4.0.8"
- resolve "^1.14.2"
-
-"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5":
- version "7.22.20"
- resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
- integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
-
-"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
- integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
- dependencies:
- "@babel/template" "^7.22.15"
- "@babel/types" "^7.23.0"
-
-"@babel/helper-hoist-variables@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
- integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
- dependencies:
- "@babel/types" "^7.22.5"
-
-"@babel/helper-member-expression-to-functions@^7.22.15":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366"
- integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==
- dependencies:
- "@babel/types" "^7.23.0"
-
-"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0"
- integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==
- dependencies:
- "@babel/types" "^7.22.15"
-
-"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e"
- integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==
- dependencies:
- "@babel/helper-environment-visitor" "^7.22.20"
- "@babel/helper-module-imports" "^7.22.15"
- "@babel/helper-simple-access" "^7.22.5"
- "@babel/helper-split-export-declaration" "^7.22.6"
- "@babel/helper-validator-identifier" "^7.22.20"
-
-"@babel/helper-optimise-call-expression@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e"
- integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==
- dependencies:
- "@babel/types" "^7.22.5"
-
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295"
- integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==
-
-"@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5":
- version "7.22.20"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0"
- integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.22.5"
- "@babel/helper-environment-visitor" "^7.22.20"
- "@babel/helper-wrap-function" "^7.22.20"
-
-"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9":
- version "7.22.20"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793"
- integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==
- dependencies:
- "@babel/helper-environment-visitor" "^7.22.20"
- "@babel/helper-member-expression-to-functions" "^7.22.15"
- "@babel/helper-optimise-call-expression" "^7.22.5"
-
-"@babel/helper-simple-access@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
- integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==
- dependencies:
- "@babel/types" "^7.22.5"
-
-"@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847"
- integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==
- dependencies:
- "@babel/types" "^7.22.5"
-
-"@babel/helper-split-export-declaration@^7.22.6":
- version "7.22.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
- integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
- dependencies:
- "@babel/types" "^7.22.5"
-
-"@babel/helper-string-parser@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
- integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
-
-"@babel/helper-validator-identifier@^7.22.20":
- version "7.22.20"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
- integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
-
-"@babel/helper-validator-option@^7.22.15":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040"
- integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==
-
-"@babel/helper-wrap-function@^7.22.20":
- version "7.22.20"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569"
- integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==
- dependencies:
- "@babel/helper-function-name" "^7.22.5"
- "@babel/template" "^7.22.15"
- "@babel/types" "^7.22.19"
-
-"@babel/helpers@^7.23.2":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767"
- integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==
- dependencies:
- "@babel/template" "^7.22.15"
- "@babel/traverse" "^7.23.2"
- "@babel/types" "^7.23.0"
-
-"@babel/highlight@^7.22.13":
- version "7.22.20"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54"
- integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==
- dependencies:
- "@babel/helper-validator-identifier" "^7.22.20"
- chalk "^2.4.2"
- js-tokens "^4.0.0"
-
-"@babel/parser@^7.22.15", "@babel/parser@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719"
- integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==
-
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962"
- integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f"
- integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
- "@babel/plugin-transform-optional-chaining" "^7.22.15"
-
-"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2":
- version "7.21.0-placeholder-for-preset-env.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703"
- integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==
-
-"@babel/plugin-syntax-async-generators@^7.8.4":
- version "7.8.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
- integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-class-properties@^7.12.13":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
- integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.12.13"
-
-"@babel/plugin-syntax-class-static-block@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
- integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
-
-"@babel/plugin-syntax-dynamic-import@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
- integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-export-namespace-from@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
- integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-syntax-import-assertions@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98"
- integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-syntax-import-attributes@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb"
- integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-syntax-import-meta@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
- integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
- dependencies:
- "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-json-strings@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
- integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-jsx@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918"
- integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
- integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
- dependencies:
- "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
- integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-numeric-separator@^7.10.4":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
- integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
- dependencies:
- "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-object-rest-spread@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
- integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
- integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-optional-chaining@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
- integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-private-property-in-object@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
- integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
-
-"@babel/plugin-syntax-top-level-await@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
- integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
-
-"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357"
- integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.18.6"
- "@babel/helper-plugin-utils" "^7.18.6"
-
-"@babel/plugin-transform-arrow-functions@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958"
- integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-async-generator-functions@^7.23.2":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb"
- integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==
- dependencies:
- "@babel/helper-environment-visitor" "^7.22.20"
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-remap-async-to-generator" "^7.22.20"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
-
-"@babel/plugin-transform-async-to-generator@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775"
- integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==
- dependencies:
- "@babel/helper-module-imports" "^7.22.5"
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-remap-async-to-generator" "^7.22.5"
-
-"@babel/plugin-transform-block-scoped-functions@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024"
- integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-block-scoping@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022"
- integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-class-properties@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77"
- integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.22.5"
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-class-static-block@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974"
- integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.22.11"
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
-
-"@babel/plugin-transform-classes@^7.22.15":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b"
- integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.22.5"
- "@babel/helper-compilation-targets" "^7.22.15"
- "@babel/helper-environment-visitor" "^7.22.5"
- "@babel/helper-function-name" "^7.22.5"
- "@babel/helper-optimise-call-expression" "^7.22.5"
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-replace-supers" "^7.22.9"
- "@babel/helper-split-export-declaration" "^7.22.6"
- globals "^11.1.0"
-
-"@babel/plugin-transform-computed-properties@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869"
- integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/template" "^7.22.5"
-
-"@babel/plugin-transform-destructuring@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c"
- integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-dotall-regex@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165"
- integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.22.5"
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-duplicate-keys@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285"
- integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-dynamic-import@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa"
- integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
-
-"@babel/plugin-transform-exponentiation-operator@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a"
- integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==
- dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5"
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-export-namespace-from@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c"
- integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-
-"@babel/plugin-transform-for-of@^7.22.15":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29"
- integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-function-name@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143"
- integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==
- dependencies:
- "@babel/helper-compilation-targets" "^7.22.5"
- "@babel/helper-function-name" "^7.22.5"
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-json-strings@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835"
- integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
-
-"@babel/plugin-transform-literals@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920"
- integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-logical-assignment-operators@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c"
- integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-
-"@babel/plugin-transform-member-expression-literals@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def"
- integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-modules-amd@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88"
- integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==
- dependencies:
- "@babel/helper-module-transforms" "^7.23.0"
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-modules-commonjs@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481"
- integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==
- dependencies:
- "@babel/helper-module-transforms" "^7.23.0"
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-simple-access" "^7.22.5"
-
-"@babel/plugin-transform-modules-systemjs@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160"
- integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==
- dependencies:
- "@babel/helper-hoist-variables" "^7.22.5"
- "@babel/helper-module-transforms" "^7.23.0"
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-validator-identifier" "^7.22.20"
-
-"@babel/plugin-transform-modules-umd@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98"
- integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==
- dependencies:
- "@babel/helper-module-transforms" "^7.22.5"
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f"
- integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.22.5"
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-new-target@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d"
- integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc"
- integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-
-"@babel/plugin-transform-numeric-separator@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd"
- integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
-
-"@babel/plugin-transform-object-rest-spread@^7.22.15":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f"
- integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==
- dependencies:
- "@babel/compat-data" "^7.22.9"
- "@babel/helper-compilation-targets" "^7.22.15"
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.22.15"
-
-"@babel/plugin-transform-object-super@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c"
- integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-replace-supers" "^7.22.5"
-
-"@babel/plugin-transform-optional-catch-binding@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0"
- integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-
-"@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158"
- integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
-
-"@babel/plugin-transform-parameters@^7.22.15":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114"
- integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-private-methods@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722"
- integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==
- dependencies:
- "@babel/helper-create-class-features-plugin" "^7.22.5"
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-private-property-in-object@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1"
- integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.22.5"
- "@babel/helper-create-class-features-plugin" "^7.22.11"
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-
-"@babel/plugin-transform-property-literals@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766"
- integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-react-display-name@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b"
- integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-react-jsx-development@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87"
- integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==
- dependencies:
- "@babel/plugin-transform-react-jsx" "^7.22.5"
-
-"@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6"
- integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.22.5"
- "@babel/helper-module-imports" "^7.22.15"
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/plugin-syntax-jsx" "^7.22.5"
- "@babel/types" "^7.22.15"
-
-"@babel/plugin-transform-react-pure-annotations@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0"
- integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.22.5"
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-regenerator@^7.22.10":
- version "7.22.10"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca"
- integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- regenerator-transform "^0.15.2"
-
-"@babel/plugin-transform-reserved-words@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb"
- integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-shorthand-properties@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624"
- integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-spread@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b"
- integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
-
-"@babel/plugin-transform-sticky-regex@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa"
- integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-template-literals@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff"
- integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-typeof-symbol@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34"
- integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-unicode-escapes@^7.22.10":
- version "7.22.10"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9"
- integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-unicode-property-regex@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81"
- integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.22.5"
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-unicode-regex@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183"
- integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.22.5"
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-transform-unicode-sets-regex@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91"
- integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==
- dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.22.5"
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/preset-env@^7.19":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.2.tgz#1f22be0ff0e121113260337dbc3e58fafce8d059"
- integrity sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==
- dependencies:
- "@babel/compat-data" "^7.23.2"
- "@babel/helper-compilation-targets" "^7.22.15"
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-validator-option" "^7.22.15"
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15"
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15"
- "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
- "@babel/plugin-syntax-class-properties" "^7.12.13"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
- "@babel/plugin-syntax-import-assertions" "^7.22.5"
- "@babel/plugin-syntax-import-attributes" "^7.22.5"
- "@babel/plugin-syntax-import-meta" "^7.10.4"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
- "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
- "@babel/plugin-syntax-top-level-await" "^7.14.5"
- "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
- "@babel/plugin-transform-arrow-functions" "^7.22.5"
- "@babel/plugin-transform-async-generator-functions" "^7.23.2"
- "@babel/plugin-transform-async-to-generator" "^7.22.5"
- "@babel/plugin-transform-block-scoped-functions" "^7.22.5"
- "@babel/plugin-transform-block-scoping" "^7.23.0"
- "@babel/plugin-transform-class-properties" "^7.22.5"
- "@babel/plugin-transform-class-static-block" "^7.22.11"
- "@babel/plugin-transform-classes" "^7.22.15"
- "@babel/plugin-transform-computed-properties" "^7.22.5"
- "@babel/plugin-transform-destructuring" "^7.23.0"
- "@babel/plugin-transform-dotall-regex" "^7.22.5"
- "@babel/plugin-transform-duplicate-keys" "^7.22.5"
- "@babel/plugin-transform-dynamic-import" "^7.22.11"
- "@babel/plugin-transform-exponentiation-operator" "^7.22.5"
- "@babel/plugin-transform-export-namespace-from" "^7.22.11"
- "@babel/plugin-transform-for-of" "^7.22.15"
- "@babel/plugin-transform-function-name" "^7.22.5"
- "@babel/plugin-transform-json-strings" "^7.22.11"
- "@babel/plugin-transform-literals" "^7.22.5"
- "@babel/plugin-transform-logical-assignment-operators" "^7.22.11"
- "@babel/plugin-transform-member-expression-literals" "^7.22.5"
- "@babel/plugin-transform-modules-amd" "^7.23.0"
- "@babel/plugin-transform-modules-commonjs" "^7.23.0"
- "@babel/plugin-transform-modules-systemjs" "^7.23.0"
- "@babel/plugin-transform-modules-umd" "^7.22.5"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5"
- "@babel/plugin-transform-new-target" "^7.22.5"
- "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11"
- "@babel/plugin-transform-numeric-separator" "^7.22.11"
- "@babel/plugin-transform-object-rest-spread" "^7.22.15"
- "@babel/plugin-transform-object-super" "^7.22.5"
- "@babel/plugin-transform-optional-catch-binding" "^7.22.11"
- "@babel/plugin-transform-optional-chaining" "^7.23.0"
- "@babel/plugin-transform-parameters" "^7.22.15"
- "@babel/plugin-transform-private-methods" "^7.22.5"
- "@babel/plugin-transform-private-property-in-object" "^7.22.11"
- "@babel/plugin-transform-property-literals" "^7.22.5"
- "@babel/plugin-transform-regenerator" "^7.22.10"
- "@babel/plugin-transform-reserved-words" "^7.22.5"
- "@babel/plugin-transform-shorthand-properties" "^7.22.5"
- "@babel/plugin-transform-spread" "^7.22.5"
- "@babel/plugin-transform-sticky-regex" "^7.22.5"
- "@babel/plugin-transform-template-literals" "^7.22.5"
- "@babel/plugin-transform-typeof-symbol" "^7.22.5"
- "@babel/plugin-transform-unicode-escapes" "^7.22.10"
- "@babel/plugin-transform-unicode-property-regex" "^7.22.5"
- "@babel/plugin-transform-unicode-regex" "^7.22.5"
- "@babel/plugin-transform-unicode-sets-regex" "^7.22.5"
- "@babel/preset-modules" "0.1.6-no-external-plugins"
- "@babel/types" "^7.23.0"
- babel-plugin-polyfill-corejs2 "^0.4.6"
- babel-plugin-polyfill-corejs3 "^0.8.5"
- babel-plugin-polyfill-regenerator "^0.5.3"
- core-js-compat "^3.31.0"
- semver "^6.3.1"
-
-"@babel/preset-modules@0.1.6-no-external-plugins":
- version "0.1.6-no-external-plugins"
- resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a"
- integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@babel/types" "^7.4.4"
- esutils "^2.0.2"
-
-"@babel/preset-react@^7.18.6":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc"
- integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-validator-option" "^7.22.15"
- "@babel/plugin-transform-react-display-name" "^7.22.5"
- "@babel/plugin-transform-react-jsx" "^7.22.15"
- "@babel/plugin-transform-react-jsx-development" "^7.22.5"
- "@babel/plugin-transform-react-pure-annotations" "^7.22.5"
-
-"@babel/regjsgen@^0.8.0":
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
- integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
-
-"@babel/runtime@^7.8.4":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885"
- integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==
- dependencies:
- regenerator-runtime "^0.14.0"
-
-"@babel/template@^7.22.15", "@babel/template@^7.22.5":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
- integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==
- dependencies:
- "@babel/code-frame" "^7.22.13"
- "@babel/parser" "^7.22.15"
- "@babel/types" "^7.22.15"
-
-"@babel/traverse@^7.23.2":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8"
- integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==
- dependencies:
- "@babel/code-frame" "^7.22.13"
- "@babel/generator" "^7.23.0"
- "@babel/helper-environment-visitor" "^7.22.20"
- "@babel/helper-function-name" "^7.23.0"
- "@babel/helper-hoist-variables" "^7.22.5"
- "@babel/helper-split-export-declaration" "^7.22.6"
- "@babel/parser" "^7.23.0"
- "@babel/types" "^7.23.0"
- debug "^4.1.0"
- globals "^11.1.0"
-
-"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb"
- integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==
- dependencies:
- "@babel/helper-string-parser" "^7.22.5"
- "@babel/helper-validator-identifier" "^7.22.20"
- to-fast-properties "^2.0.0"
-
-"@discoveryjs/json-ext@^0.5.0":
- version "0.5.7"
- resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
- integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
-
-"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
- integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
- dependencies:
- "@jridgewell/set-array" "^1.0.1"
- "@jridgewell/sourcemap-codec" "^1.4.10"
- "@jridgewell/trace-mapping" "^0.3.9"
-
-"@jridgewell/resolve-uri@^3.1.0":
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
- integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
-
-"@jridgewell/set-array@^1.0.1":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
- integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
-
-"@jridgewell/source-map@^0.3.3":
- version "0.3.5"
- resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91"
- integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==
- dependencies:
- "@jridgewell/gen-mapping" "^0.3.0"
- "@jridgewell/trace-mapping" "^0.3.9"
-
-"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
- version "1.4.15"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
- integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
-
-"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9":
- version "0.3.20"
- resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f"
- integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==
- dependencies:
- "@jridgewell/resolve-uri" "^3.1.0"
- "@jridgewell/sourcemap-codec" "^1.4.14"
-
-"@paypal/paypal-js@^6.0.0":
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/@paypal/paypal-js/-/paypal-js-6.0.1.tgz#5d68d5863a5176383fee9424bc944231668fcffd"
- integrity sha512-bvYetmkg2GEC6onsUJQx1E9hdAJWff2bS3IPeiZ9Sh9U7h26/fIgMKm240cq/908sbSoDjHys75XXd8at9OpQA==
- dependencies:
- promise-polyfill "^8.3.0"
-
-"@types/eslint-scope@^3.7.3":
- version "3.7.7"
- resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5"
- integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==
- dependencies:
- "@types/eslint" "*"
- "@types/estree" "*"
-
-"@types/eslint@*":
- version "8.44.7"
- resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.7.tgz#430b3cc96db70c81f405e6a08aebdb13869198f5"
- integrity sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==
- dependencies:
- "@types/estree" "*"
- "@types/json-schema" "*"
-
-"@types/estree@*", "@types/estree@^1.0.0":
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
- integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
-
-"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8":
- version "7.0.15"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
- integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
-
-"@types/node@*":
- version "20.9.0"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.0.tgz#bfcdc230583aeb891cf51e73cfdaacdd8deae298"
- integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==
- dependencies:
- undici-types "~5.26.4"
-
-"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24"
- integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==
- dependencies:
- "@webassemblyjs/helper-numbers" "1.11.6"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
-
-"@webassemblyjs/floating-point-hex-parser@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431"
- integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==
-
-"@webassemblyjs/helper-api-error@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768"
- integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==
-
-"@webassemblyjs/helper-buffer@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093"
- integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==
-
-"@webassemblyjs/helper-numbers@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5"
- integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==
- dependencies:
- "@webassemblyjs/floating-point-hex-parser" "1.11.6"
- "@webassemblyjs/helper-api-error" "1.11.6"
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/helper-wasm-bytecode@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9"
- integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==
-
-"@webassemblyjs/helper-wasm-section@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577"
- integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==
- dependencies:
- "@webassemblyjs/ast" "1.11.6"
- "@webassemblyjs/helper-buffer" "1.11.6"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
- "@webassemblyjs/wasm-gen" "1.11.6"
-
-"@webassemblyjs/ieee754@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a"
- integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==
- dependencies:
- "@xtuc/ieee754" "^1.2.0"
-
-"@webassemblyjs/leb128@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7"
- integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==
- dependencies:
- "@xtuc/long" "4.2.2"
-
-"@webassemblyjs/utf8@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a"
- integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==
-
-"@webassemblyjs/wasm-edit@^1.11.5":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab"
- integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==
- dependencies:
- "@webassemblyjs/ast" "1.11.6"
- "@webassemblyjs/helper-buffer" "1.11.6"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
- "@webassemblyjs/helper-wasm-section" "1.11.6"
- "@webassemblyjs/wasm-gen" "1.11.6"
- "@webassemblyjs/wasm-opt" "1.11.6"
- "@webassemblyjs/wasm-parser" "1.11.6"
- "@webassemblyjs/wast-printer" "1.11.6"
-
-"@webassemblyjs/wasm-gen@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268"
- integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==
- dependencies:
- "@webassemblyjs/ast" "1.11.6"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
- "@webassemblyjs/ieee754" "1.11.6"
- "@webassemblyjs/leb128" "1.11.6"
- "@webassemblyjs/utf8" "1.11.6"
-
-"@webassemblyjs/wasm-opt@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2"
- integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==
- dependencies:
- "@webassemblyjs/ast" "1.11.6"
- "@webassemblyjs/helper-buffer" "1.11.6"
- "@webassemblyjs/wasm-gen" "1.11.6"
- "@webassemblyjs/wasm-parser" "1.11.6"
-
-"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1"
- integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==
- dependencies:
- "@webassemblyjs/ast" "1.11.6"
- "@webassemblyjs/helper-api-error" "1.11.6"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.6"
- "@webassemblyjs/ieee754" "1.11.6"
- "@webassemblyjs/leb128" "1.11.6"
- "@webassemblyjs/utf8" "1.11.6"
-
-"@webassemblyjs/wast-printer@1.11.6":
- version "1.11.6"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20"
- integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==
- dependencies:
- "@webassemblyjs/ast" "1.11.6"
- "@xtuc/long" "4.2.2"
-
-"@webpack-cli/configtest@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5"
- integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==
-
-"@webpack-cli/info@^1.5.0":
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1"
- integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==
- dependencies:
- envinfo "^7.7.3"
-
-"@webpack-cli/serve@^1.7.0":
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1"
- integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==
-
-"@woocommerce/dependency-extraction-webpack-plugin@^2.2.0":
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/@woocommerce/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-2.3.0.tgz#9d242e538072fa5cc2d5f6241af1272317c757bb"
- integrity sha512-dfa5bBZFRKcjFpqTEXyuUKC16n85RlKQ4EamdAAqUVQedv4DMRCj2jWUcId7pN2mOFGgAp+heGgb9i6fwiZk2Q==
- dependencies:
- "@wordpress/dependency-extraction-webpack-plugin" "^3.3.0"
-
-"@wordpress/dependency-extraction-webpack-plugin@^3.3.0":
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-3.7.0.tgz#e52ef31f66b8c4add3d773a87e11007375127b04"
- integrity sha512-SHyp88D1ICSaRVMfs/kKEicjKXWf1y2wecUeZIiMtkfAi8Bnk3JsnUo11LH7drJIXfjmDoer2B2rrBMZmRm8VA==
- dependencies:
- json2php "^0.0.4"
- webpack-sources "^3.2.2"
-
-"@xtuc/ieee754@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
- integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
-
-"@xtuc/long@4.2.2":
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
- integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
-
-acorn-import-assertions@^1.9.0:
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac"
- integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==
-
-acorn@^8.7.1, acorn@^8.8.2:
- version "8.11.2"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b"
- integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==
-
-ajv-keywords@^3.5.2:
- version "3.5.2"
- resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
- integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
-
-ajv@^6.12.4, ajv@^6.12.5:
- version "6.12.6"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
- integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
- dependencies:
- fast-deep-equal "^3.1.1"
- fast-json-stable-stringify "^2.0.0"
- json-schema-traverse "^0.4.1"
- uri-js "^4.2.2"
-
-ansi-styles@^3.2.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
- integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
- dependencies:
- color-convert "^1.9.0"
-
-anymatch@~3.1.2:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
- integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
- dependencies:
- normalize-path "^3.0.0"
- picomatch "^2.0.4"
-
-babel-loader@^8.2:
- version "8.3.0"
- resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8"
- integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==
- dependencies:
- find-cache-dir "^3.3.1"
- loader-utils "^2.0.0"
- make-dir "^3.1.0"
- schema-utils "^2.6.5"
-
-babel-plugin-polyfill-corejs2@^0.4.6:
- version "0.4.6"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313"
- integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==
- dependencies:
- "@babel/compat-data" "^7.22.6"
- "@babel/helper-define-polyfill-provider" "^0.4.3"
- semver "^6.3.1"
-
-babel-plugin-polyfill-corejs3@^0.8.5:
- version "0.8.6"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz#25c2d20002da91fe328ff89095c85a391d6856cf"
- integrity sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==
- dependencies:
- "@babel/helper-define-polyfill-provider" "^0.4.3"
- core-js-compat "^3.33.1"
-
-babel-plugin-polyfill-regenerator@^0.5.3:
- version "0.5.3"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5"
- integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==
- dependencies:
- "@babel/helper-define-polyfill-provider" "^0.4.3"
-
-big.js@^5.2.2:
- version "5.2.2"
- resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
- integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
-
-binary-extensions@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
- integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
-
-braces@~3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
- integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
- dependencies:
- fill-range "^7.0.1"
-
-browserslist@^4.14.5, browserslist@^4.21.9, browserslist@^4.22.1:
- version "4.22.1"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619"
- integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==
- dependencies:
- caniuse-lite "^1.0.30001541"
- electron-to-chromium "^1.4.535"
- node-releases "^2.0.13"
- update-browserslist-db "^1.0.13"
-
-buffer-from@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
- integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
-
-caniuse-lite@^1.0.30001541:
- version "1.0.30001561"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz#752f21f56f96f1b1a52e97aae98c57c562d5d9da"
- integrity sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==
-
-chalk@^2.4.2:
- version "2.4.2"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
- integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
- dependencies:
- ansi-styles "^3.2.1"
- escape-string-regexp "^1.0.5"
- supports-color "^5.3.0"
-
-"chokidar@>=3.0.0 <4.0.0":
- version "3.5.3"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
- integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
- dependencies:
- anymatch "~3.1.2"
- braces "~3.0.2"
- glob-parent "~5.1.2"
- is-binary-path "~2.1.0"
- is-glob "~4.0.1"
- normalize-path "~3.0.0"
- readdirp "~3.6.0"
- optionalDependencies:
- fsevents "~2.3.2"
-
-chrome-trace-event@^1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
- integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
-
-clone-deep@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
- integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
- dependencies:
- is-plain-object "^2.0.4"
- kind-of "^6.0.2"
- shallow-clone "^3.0.0"
-
-color-convert@^1.9.0:
- version "1.9.3"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
- integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
- dependencies:
- color-name "1.1.3"
-
-color-name@1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
- integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
-
-colorette@^2.0.14:
- version "2.0.20"
- resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
- integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
-
-commander@^2.20.0:
- version "2.20.3"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
- integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
-
-commander@^7.0.0:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
- integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
-
-commondir@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
- integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==
-
-convert-source-map@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
- integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
-
-core-js-compat@^3.31.0, core-js-compat@^3.33.1:
- version "3.33.2"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.2.tgz#3ea4563bfd015ad4e4b52442865b02c62aba5085"
- integrity sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==
- dependencies:
- browserslist "^4.22.1"
-
-core-js@^3.25.0:
- version "3.33.2"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.33.2.tgz#312bbf6996a3a517c04c99b9909cdd27138d1ceb"
- integrity sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==
-
-cross-env@^7.0.3:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
- integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
- dependencies:
- cross-spawn "^7.0.1"
-
-cross-spawn@^7.0.1, cross-spawn@^7.0.3:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
-debug@^4.1.0, debug@^4.1.1:
- version "4.3.4"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
- integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
- dependencies:
- ms "2.1.2"
-
-electron-to-chromium@^1.4.535:
- version "1.4.578"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.578.tgz#7a3510f333bcd55e87882799ebeb7518d6ab4d95"
- integrity sha512-V0ZhSu1BQZKfG0yNEL6Dadzik8E1vAzfpVOapdSiT9F6yapEJ3Bk+4tZ4SMPdWiUchCgnM/ByYtBzp5ntzDMIA==
-
-emojis-list@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
- integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
-
-enhanced-resolve@^5.15.0:
- version "5.15.0"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35"
- integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==
- dependencies:
- graceful-fs "^4.2.4"
- tapable "^2.2.0"
-
-envinfo@^7.7.3:
- version "7.11.0"
- resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.0.tgz#c3793f44284a55ff8c82faf1ffd91bc6478ea01f"
- integrity sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==
-
-es-module-lexer@^1.2.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1"
- integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==
-
-escalade@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
- integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
-
-escape-string-regexp@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
- integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
-
-eslint-scope@5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
- integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
- dependencies:
- esrecurse "^4.3.0"
- estraverse "^4.1.1"
-
-esrecurse@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
- integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
- dependencies:
- estraverse "^5.2.0"
-
-estraverse@^4.1.1:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
- integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
-
-estraverse@^5.2.0:
- version "5.3.0"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
- integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
-
-esutils@^2.0.2:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
- integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
-
-events@^3.2.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
- integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
-
-fast-deep-equal@^3.1.1:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
- integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-
-fast-json-stable-stringify@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
- integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
-
-fastest-levenshtein@^1.0.12:
- version "1.0.16"
- resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5"
- integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==
-
-file-loader@^6.2.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d"
- integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==
- dependencies:
- loader-utils "^2.0.0"
- schema-utils "^3.0.0"
-
-fill-range@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
- integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
- dependencies:
- to-regex-range "^5.0.1"
-
-find-cache-dir@^3.3.1:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
- integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
- dependencies:
- commondir "^1.0.1"
- make-dir "^3.0.2"
- pkg-dir "^4.1.0"
-
-find-up@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
- integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
- dependencies:
- locate-path "^5.0.0"
- path-exists "^4.0.0"
-
-flat@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
- integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
-
-fsevents@~2.3.2:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
- integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
-
-function-bind@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
- integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
-
-gensync@^1.0.0-beta.2:
- version "1.0.0-beta.2"
- resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
- integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
-
-glob-parent@~5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
- integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
- dependencies:
- is-glob "^4.0.1"
-
-glob-to-regexp@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
- integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
-
-globals@^11.1.0:
- version "11.12.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
- integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-
-graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
- version "4.2.11"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
- integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
-
-has-flag@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
- integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
-
-has-flag@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
- integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-
-hasown@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c"
- integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==
- dependencies:
- function-bind "^1.1.2"
-
-immutable@^4.0.0:
- version "4.3.4"
- resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f"
- integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==
-
-import-local@^3.0.2:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
- integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
- dependencies:
- pkg-dir "^4.2.0"
- resolve-cwd "^3.0.0"
-
-interpret@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
- integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
-
-is-binary-path@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
- integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
- dependencies:
- binary-extensions "^2.0.0"
-
-is-core-module@^2.13.0:
- version "2.13.1"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
- integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
- dependencies:
- hasown "^2.0.0"
-
-is-extglob@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
- integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
-
-is-glob@^4.0.1, is-glob@~4.0.1:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
- integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
- dependencies:
- is-extglob "^2.1.1"
-
-is-number@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
- integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
-
-is-plain-object@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
- integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
- dependencies:
- isobject "^3.0.1"
-
-isexe@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
-
-isobject@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
- integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
-
-jest-worker@^27.4.5:
- version "27.5.1"
- resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
- integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
- dependencies:
- "@types/node" "*"
- merge-stream "^2.0.0"
- supports-color "^8.0.0"
-
-js-tokens@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
- integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-
-jsesc@^2.5.1:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
- integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
-
-jsesc@~0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
- integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
-
-json-parse-even-better-errors@^2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
- integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
-
-json-schema-traverse@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
- integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
-
-json2php@^0.0.4:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/json2php/-/json2php-0.0.4.tgz#6bd85a1dda6a5dd7e91022bb24403cc1b7c2ee34"
- integrity sha512-hFzejhs28f70sGnutcsRS459MnAsjRVI85RgPAL1KQIZEpjiDitc27CZv4IgOtaR86vrqOVlu9vJNew2XyTH4g==
-
-json5@^2.1.2, json5@^2.2.3:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
- integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
-
-kind-of@^6.0.2:
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
- integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
-
-klona@^2.0.4:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22"
- integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==
-
-loader-runner@^4.2.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1"
- integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
-
-loader-utils@^2.0.0:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c"
- integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==
- dependencies:
- big.js "^5.2.2"
- emojis-list "^3.0.0"
- json5 "^2.1.2"
-
-locate-path@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
- integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
- dependencies:
- p-locate "^4.1.0"
-
-lodash.debounce@^4.0.8:
- version "4.0.8"
- resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
- integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
-
-lru-cache@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
- integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
- dependencies:
- yallist "^3.0.2"
-
-make-dir@^3.0.2, make-dir@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
- integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
- dependencies:
- semver "^6.0.0"
-
-merge-stream@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
- integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-
-mime-db@1.52.0:
- version "1.52.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
- integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
-
-mime-types@^2.1.27:
- version "2.1.35"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
- integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
- dependencies:
- mime-db "1.52.0"
-
-ms@2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-neo-async@^2.6.2:
- version "2.6.2"
- resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
- integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
-
-node-releases@^2.0.13:
- version "2.0.13"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d"
- integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==
-
-normalize-path@^3.0.0, normalize-path@~3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
- integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-
-p-limit@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
- integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
- dependencies:
- p-try "^2.0.0"
-
-p-locate@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
- integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
- dependencies:
- p-limit "^2.2.0"
-
-p-try@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
- integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
-
-path-exists@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
- integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
-
-path-key@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
- integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-
-path-parse@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
- integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
-
-picocolors@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
- integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
-
-picomatch@^2.0.4, picomatch@^2.2.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
- integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-
-pkg-dir@^4.1.0, pkg-dir@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
- integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
- dependencies:
- find-up "^4.0.0"
-
-promise-polyfill@^8.3.0:
- version "8.3.0"
- resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.3.0.tgz#9284810268138d103807b11f4e23d5e945a4db63"
- integrity sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==
-
-punycode@^2.1.0:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
- integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
-
-randombytes@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
- integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
- dependencies:
- safe-buffer "^5.1.0"
-
-readdirp@~3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
- integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
- dependencies:
- picomatch "^2.2.1"
-
-rechoir@^0.7.0:
- version "0.7.1"
- resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686"
- integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==
- dependencies:
- resolve "^1.9.0"
-
-regenerate-unicode-properties@^10.1.0:
- version "10.1.1"
- resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480"
- integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==
- dependencies:
- regenerate "^1.4.2"
-
-regenerate@^1.4.2:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
- integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
-
-regenerator-runtime@^0.14.0:
- version "0.14.0"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
- integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
-
-regenerator-transform@^0.15.2:
- version "0.15.2"
- resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4"
- integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==
- dependencies:
- "@babel/runtime" "^7.8.4"
-
-regexpu-core@^5.3.1:
- version "5.3.2"
- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b"
- integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==
- dependencies:
- "@babel/regjsgen" "^0.8.0"
- regenerate "^1.4.2"
- regenerate-unicode-properties "^10.1.0"
- regjsparser "^0.9.1"
- unicode-match-property-ecmascript "^2.0.0"
- unicode-match-property-value-ecmascript "^2.1.0"
-
-regjsparser@^0.9.1:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709"
- integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==
- dependencies:
- jsesc "~0.5.0"
-
-resolve-cwd@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
- integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
- dependencies:
- resolve-from "^5.0.0"
-
-resolve-from@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
- integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-
-resolve@^1.14.2, resolve@^1.9.0:
- version "1.22.8"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
- integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
- dependencies:
- is-core-module "^2.13.0"
- path-parse "^1.0.7"
- supports-preserve-symlinks-flag "^1.0.0"
-
-safe-buffer@^5.1.0:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
- integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-
-sass-loader@^12.1.0:
- version "12.6.0"
- resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb"
- integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==
- dependencies:
- klona "^2.0.4"
- neo-async "^2.6.2"
-
-sass@^1.42.1:
- version "1.69.5"
- resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.5.tgz#23e18d1c757a35f2e52cc81871060b9ad653dfde"
- integrity sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==
- dependencies:
- chokidar ">=3.0.0 <4.0.0"
- immutable "^4.0.0"
- source-map-js ">=0.6.2 <2.0.0"
-
-schema-utils@^2.6.5:
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
- integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
- dependencies:
- "@types/json-schema" "^7.0.5"
- ajv "^6.12.4"
- ajv-keywords "^3.5.2"
-
-schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe"
- integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==
- dependencies:
- "@types/json-schema" "^7.0.8"
- ajv "^6.12.5"
- ajv-keywords "^3.5.2"
-
-semver@^6.0.0, semver@^6.3.1:
- version "6.3.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
- integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-
-serialize-javascript@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c"
- integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==
- dependencies:
- randombytes "^2.1.0"
-
-shallow-clone@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
- integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
- dependencies:
- kind-of "^6.0.2"
-
-shebang-command@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
- integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
- dependencies:
- shebang-regex "^3.0.0"
-
-shebang-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
- integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-
-"source-map-js@>=0.6.2 <2.0.0":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
- integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
-
-source-map-support@~0.5.20:
- version "0.5.21"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
- integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
- dependencies:
- buffer-from "^1.0.0"
- source-map "^0.6.0"
-
-source-map@^0.6.0:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
- integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-
-supports-color@^5.3.0:
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
- integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
- dependencies:
- has-flag "^3.0.0"
-
-supports-color@^8.0.0:
- version "8.1.1"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
- integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
- dependencies:
- has-flag "^4.0.0"
-
-supports-preserve-symlinks-flag@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
- integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
-
-tapable@^2.1.1, tapable@^2.2.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
- integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
-
-terser-webpack-plugin@^5.3.7:
- version "5.3.9"
- resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1"
- integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==
- dependencies:
- "@jridgewell/trace-mapping" "^0.3.17"
- jest-worker "^27.4.5"
- schema-utils "^3.1.1"
- serialize-javascript "^6.0.1"
- terser "^5.16.8"
-
-terser@^5.16.8:
- version "5.24.0"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.24.0.tgz#4ae50302977bca4831ccc7b4fef63a3c04228364"
- integrity sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==
- dependencies:
- "@jridgewell/source-map" "^0.3.3"
- acorn "^8.8.2"
- commander "^2.20.0"
- source-map-support "~0.5.20"
-
-to-fast-properties@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
- integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
-
-to-regex-range@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
- integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
- dependencies:
- is-number "^7.0.0"
-
-undici-types@~5.26.4:
- version "5.26.5"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
- integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
-
-unicode-canonical-property-names-ecmascript@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
- integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
-
-unicode-match-property-ecmascript@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3"
- integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==
- dependencies:
- unicode-canonical-property-names-ecmascript "^2.0.0"
- unicode-property-aliases-ecmascript "^2.0.0"
-
-unicode-match-property-value-ecmascript@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0"
- integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==
-
-unicode-property-aliases-ecmascript@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd"
- integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==
-
-update-browserslist-db@^1.0.13:
- version "1.0.13"
- resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4"
- integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==
- dependencies:
- escalade "^3.1.1"
- picocolors "^1.0.0"
-
-uri-js@^4.2.2:
- version "4.4.1"
- resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
- integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
- dependencies:
- punycode "^2.1.0"
-
-watchpack@^2.4.0:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"
- integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==
- dependencies:
- glob-to-regexp "^0.4.1"
- graceful-fs "^4.1.2"
-
-webpack-cli@^4.10:
- version "4.10.0"
- resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31"
- integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==
- dependencies:
- "@discoveryjs/json-ext" "^0.5.0"
- "@webpack-cli/configtest" "^1.2.0"
- "@webpack-cli/info" "^1.5.0"
- "@webpack-cli/serve" "^1.7.0"
- colorette "^2.0.14"
- commander "^7.0.0"
- cross-spawn "^7.0.3"
- fastest-levenshtein "^1.0.12"
- import-local "^3.0.2"
- interpret "^2.2.0"
- rechoir "^0.7.0"
- webpack-merge "^5.7.3"
-
-webpack-merge@^5.7.3:
- version "5.10.0"
- resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177"
- integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==
- dependencies:
- clone-deep "^4.0.1"
- flat "^5.0.2"
- wildcard "^2.0.0"
-
-webpack-sources@^3.2.2, webpack-sources@^3.2.3:
- version "3.2.3"
- resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
- integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
-
-webpack@^5.76:
- version "5.89.0"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc"
- integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==
- dependencies:
- "@types/eslint-scope" "^3.7.3"
- "@types/estree" "^1.0.0"
- "@webassemblyjs/ast" "^1.11.5"
- "@webassemblyjs/wasm-edit" "^1.11.5"
- "@webassemblyjs/wasm-parser" "^1.11.5"
- acorn "^8.7.1"
- acorn-import-assertions "^1.9.0"
- browserslist "^4.14.5"
- chrome-trace-event "^1.0.2"
- enhanced-resolve "^5.15.0"
- es-module-lexer "^1.2.1"
- eslint-scope "5.1.1"
- events "^3.2.0"
- glob-to-regexp "^0.4.1"
- graceful-fs "^4.2.9"
- json-parse-even-better-errors "^2.3.1"
- loader-runner "^4.2.0"
- mime-types "^2.1.27"
- neo-async "^2.6.2"
- schema-utils "^3.2.0"
- tapable "^2.1.1"
- terser-webpack-plugin "^5.3.7"
- watchpack "^2.4.0"
- webpack-sources "^3.2.3"
-
-which@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
- integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
- dependencies:
- isexe "^2.0.0"
-
-wildcard@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67"
- integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==
-
-yallist@^3.0.2:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
- integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
diff --git a/package.json b/package.json
index e3d9c97fc..a4d6ea019 100644
--- a/package.json
+++ b/package.json
@@ -10,7 +10,6 @@
"install:modules:ppcp-applepay": "cd modules/ppcp-applepay && yarn install",
"install:modules:ppcp-blocks": "cd modules/ppcp-blocks && yarn install",
"install:modules:ppcp-button": "cd modules/ppcp-button && yarn install",
- "install:modules:ppcp-card-fields": "cd modules/ppcp-card-fields && yarn install",
"install:modules:ppcp-googlepay": "cd modules/ppcp-googlepay && yarn install",
"install:modules:ppcp-wc-gateway": "cd modules/ppcp-wc-gateway && yarn install",
"install:modules:ppcp-webhooks": "cd modules/ppcp-webhooks && yarn install",
@@ -22,7 +21,6 @@
"build:modules:ppcp-applepay": "cd modules/ppcp-applepay && yarn run build",
"build:modules:ppcp-blocks": "cd modules/ppcp-blocks && yarn run build",
"build:modules:ppcp-button": "cd modules/ppcp-button && yarn run build",
- "build:modules:ppcp-card-fields": "cd modules/ppcp-card-fields && yarn run build",
"build:modules:ppcp-googlepay": "cd modules/ppcp-googlepay && yarn run build",
"build:modules:ppcp-wc-gateway": "cd modules/ppcp-wc-gateway && yarn run build",
"build:modules:ppcp-webhooks": "cd modules/ppcp-webhooks && yarn run build",
@@ -35,7 +33,6 @@
"watch:modules:ppcp-applepay": "cd modules/ppcp-applepay && yarn run watch",
"watch:modules:ppcp-blocks": "cd modules/ppcp-blocks && yarn run watch",
"watch:modules:ppcp-button": "cd modules/ppcp-button && yarn run watch",
- "watch:modules:ppcp-card-fields": "cd modules/ppcp-card-fields && yarn run watch",
"watch:modules:ppcp-googlepay": "cd modules/ppcp-googlepay && yarn run watch",
"watch:modules:ppcp-wc-gateway": "cd modules/ppcp-wc-gateway && yarn run watch",
"watch:modules:ppcp-webhooks": "cd modules/ppcp-webhooks && yarn run watch",
From c8d4c12a2d8baf9910b9cbb8d258718bb06a1726 Mon Sep 17 00:00:00 2001
From: Pedro Silva
Date: Mon, 13 Nov 2023 13:55:08 +0000
Subject: [PATCH 16/36] Fix GooglePay and ApplePay loading scripts on admin
standard payments page.
---
modules/ppcp-applepay/src/ApplepayModule.php | 3 ++-
modules/ppcp-googlepay/src/GooglepayModule.php | 3 ++-
modules/ppcp-wc-gateway/services.php | 5 +++++
3 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/modules/ppcp-applepay/src/ApplepayModule.php b/modules/ppcp-applepay/src/ApplepayModule.php
index a02e26884..86aaff278 100644
--- a/modules/ppcp-applepay/src/ApplepayModule.php
+++ b/modules/ppcp-applepay/src/ApplepayModule.php
@@ -164,6 +164,7 @@ class ApplepayModule implements ModuleInterface {
assert( $smart_button instanceof SmartButtonInterface );
if ( $smart_button->should_load_ppcp_script() ) {
$button->enqueue();
+ return;
}
if ( has_block( 'woocommerce/checkout' ) || has_block( 'woocommerce/cart' ) ) {
@@ -196,7 +197,7 @@ class ApplepayModule implements ModuleInterface {
add_action(
'admin_enqueue_scripts',
static function () use ( $c, $button ) {
- if ( ! is_admin() ) {
+ if ( ! is_admin() || ! $c->get( 'wcgateway.is-ppcp-settings-standard-payments-page' ) ) {
return;
}
diff --git a/modules/ppcp-googlepay/src/GooglepayModule.php b/modules/ppcp-googlepay/src/GooglepayModule.php
index 083f8eba7..e478881ba 100644
--- a/modules/ppcp-googlepay/src/GooglepayModule.php
+++ b/modules/ppcp-googlepay/src/GooglepayModule.php
@@ -94,6 +94,7 @@ class GooglepayModule implements ModuleInterface {
assert( $smart_button instanceof SmartButtonInterface );
if ( $smart_button->should_load_ppcp_script() ) {
$button->enqueue();
+ return;
}
if ( has_block( 'woocommerce/checkout' ) || has_block( 'woocommerce/cart' ) ) {
@@ -111,7 +112,7 @@ class GooglepayModule implements ModuleInterface {
add_action(
'admin_enqueue_scripts',
static function () use ( $c, $button ) {
- if ( ! is_admin() ) {
+ if ( ! is_admin() || ! $c->get( 'wcgateway.is-ppcp-settings-standard-payments-page' ) ) {
return;
}
diff --git a/modules/ppcp-wc-gateway/services.php b/modules/ppcp-wc-gateway/services.php
index 063afa9a3..8c0f4474a 100644
--- a/modules/ppcp-wc-gateway/services.php
+++ b/modules/ppcp-wc-gateway/services.php
@@ -182,6 +182,11 @@ return array(
);
},
+ 'wcgateway.is-ppcp-settings-standard-payments-page' => static function ( ContainerInterface $container ): bool {
+ return $container->get( 'wcgateway.is-ppcp-settings-page' )
+ && $container->get( 'wcgateway.current-ppcp-settings-page-id' ) === PayPalGateway::ID;
+ },
+
'wcgateway.current-ppcp-settings-page-id' => static function ( ContainerInterface $container ): string {
if ( ! $container->get( 'wcgateway.is-ppcp-settings-page' ) ) {
return '';
From 822485f78265b0303f07c420f60589ee6b43fbba Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Mon, 13 Nov 2023 16:03:18 +0100
Subject: [PATCH 17/36] Add card fields without custom styles for now
---
.../js/modules/Renderer/CreditCardRenderer.js | 47 +++++++------------
1 file changed, 17 insertions(+), 30 deletions(-)
diff --git a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
index 0249076e4..d0c4c003a 100644
--- a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
+++ b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
@@ -163,33 +163,14 @@ class CreditCardRenderer {
if(! gateWayBox) {
return
}
- const oldDisplayStyle = gateWayBox.style.display;
- gateWayBox.style.display = 'block';
- const hideDccGateway = document.querySelector('#ppcp-hide-dcc');
- if (hideDccGateway) {
- hideDccGateway.parentNode.removeChild(hideDccGateway);
- }
+ const oldDisplayStyle = gateWayBox.style.display;
+ gateWayBox.style.display = 'block';
- const cardNumberField = document.querySelector('#ppcp-credit-card-gateway-card-number');
- const stylesRaw = window.getComputedStyle(cardNumberField);
- let styles = {};
- Object.values(stylesRaw).forEach( (prop) => {
- if (! stylesRaw[prop]) {
- return;
- }
- styles[prop] = '' + stylesRaw[prop];
- });
- const cardNumber = dccInputFactory(cardNumberField);
- cardNumberField.parentNode.replaceChild(cardNumber, cardNumberField);
-
- const cardExpiryField = document.querySelector('#ppcp-credit-card-gateway-card-expiry');
- const cardExpiry = dccInputFactory(cardExpiryField);
- cardExpiryField.parentNode.replaceChild(cardExpiry, cardExpiryField);
-
- const cardCodeField = document.querySelector('#ppcp-credit-card-gateway-card-cvc');
- const cardCode = dccInputFactory(cardCodeField);
- cardCodeField.parentNode.replaceChild(cardCode, cardCodeField);
+ const hideDccGateway = document.querySelector('#ppcp-hide-dcc');
+ if (hideDccGateway) {
+ hideDccGateway.parentNode.removeChild(hideDccGateway);
+ }
const cardField = paypal.CardFields({
createOrder: contextConfig.createOrder,
@@ -202,14 +183,20 @@ class CreditCardRenderer {
});
if (cardField.isEligible()) {
+ const numberFieldContainer = document.getElementById('ppcp-credit-card-gateway-card-number').parentNode;
const numberField = cardField.NumberField();
- numberField.render('#ppcp-credit-card-gateway-card-number');
-
- const cvvField = cardField.CVVField();
- cvvField.render('#ppcp-credit-card-gateway-card-cvc');
+ numberField.render(numberFieldContainer);
+ document.getElementById("ppcp-credit-card-gateway-card-number").remove();
+ const expiryFieldContainer = document.getElementById('ppcp-credit-card-gateway-card-expiry').parentNode;
const expiryField = cardField.ExpiryField();
- expiryField.render('#ppcp-credit-card-gateway-card-expiry');
+ expiryField.render(expiryFieldContainer);
+ document.getElementById("ppcp-credit-card-gateway-card-expiry").remove();
+
+ const cvvFieldContainer = document.getElementById('ppcp-credit-card-gateway-card-cvc').parentNode;
+ const cvvField = cardField.CVVField();
+ cvvField.render(cvvFieldContainer);
+ document.getElementById("ppcp-credit-card-gateway-card-cvc").remove();
}
gateWayBox.style.display = oldDisplayStyle;
From b2a8c607af36508bdaef6fe6f8b10b8b38b611d2 Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Mon, 13 Nov 2023 17:03:04 +0100
Subject: [PATCH 18/36] Add error handling (WIP)
---
.../js/modules/Renderer/CreditCardRenderer.js | 34 ++++++++++++-------
1 file changed, 22 insertions(+), 12 deletions(-)
diff --git a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
index d0c4c003a..cdf65a35b 100644
--- a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
+++ b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
@@ -35,7 +35,7 @@ class CreditCardRenderer {
}
const gateWayBox = document.querySelector('.payment_box.payment_method_ppcp-credit-card-gateway');
- if(! gateWayBox) {
+ if (!gateWayBox) {
return
}
const oldDisplayStyle = gateWayBox.style.display;
@@ -50,8 +50,8 @@ class CreditCardRenderer {
const stylesRaw = window.getComputedStyle(cardNumberField);
let styles = {};
- Object.values(stylesRaw).forEach( (prop) => {
- if (! stylesRaw[prop]) {
+ Object.values(stylesRaw).forEach((prop) => {
+ if (!stylesRaw[prop]) {
return;
}
styles[prop] = '' + stylesRaw[prop];
@@ -105,7 +105,7 @@ class CreditCardRenderer {
this._submit(contextConfig);
});
hostedFields.on('cardTypeChange', (event) => {
- if ( ! event.cards.length ) {
+ if (!event.cards.length) {
this.cardValid = false;
return;
}
@@ -160,17 +160,17 @@ class CreditCardRenderer {
const buttonSelector = wrapper + ' button';
const gateWayBox = document.querySelector('.payment_box.payment_method_ppcp-credit-card-gateway');
- if(! gateWayBox) {
+ if (!gateWayBox) {
return
}
- const oldDisplayStyle = gateWayBox.style.display;
- gateWayBox.style.display = 'block';
+ const oldDisplayStyle = gateWayBox.style.display;
+ gateWayBox.style.display = 'block';
- const hideDccGateway = document.querySelector('#ppcp-hide-dcc');
- if (hideDccGateway) {
- hideDccGateway.parentNode.removeChild(hideDccGateway);
- }
+ const hideDccGateway = document.querySelector('#ppcp-hide-dcc');
+ if (hideDccGateway) {
+ hideDccGateway.parentNode.removeChild(hideDccGateway);
+ }
const cardField = paypal.CardFields({
createOrder: contextConfig.createOrder,
@@ -179,6 +179,7 @@ class CreditCardRenderer {
},
onError: function (error) {
console.error(error)
+ this.spinner.unblock();
}
});
@@ -205,7 +206,15 @@ class CreditCardRenderer {
document.querySelector(buttonSelector).addEventListener("click", (event) => {
event.preventDefault();
- cardField.submit();
+ this.spinner.block();
+ this.errorHandler.clear();
+
+ cardField.submit()
+ .catch((error) => {
+ this.spinner.unblock();
+ console.error(error)
+ this.errorHandler.genericError();
+ })
});
return;
@@ -325,4 +334,5 @@ class CreditCardRenderer {
element.setAttribute('class', newClassName);
}
}
+
export default CreditCardRenderer;
From 24f98cd038fc8f3536172dbcca3c589b1a396fe8 Mon Sep 17 00:00:00 2001
From: Pedro Silva
Date: Mon, 13 Nov 2023 17:36:18 +0000
Subject: [PATCH 19/36] Disabled GooglePay and ApplePay on locations with
subsciption products.
---
.../ppcp-applepay/resources/js/ApplepayButton.js | 6 +++++-
.../resources/js/Context/BaseHandler.js | 7 +++++++
.../resources/js/Context/PayNowHandler.js | 7 +++++++
.../resources/js/Context/SingleProductHandler.js | 7 +++++++
modules/ppcp-button/src/Assets/SmartButton.php | 1 +
.../resources/js/Context/BaseHandler.js | 7 +++++++
.../resources/js/Context/PayNowHandler.js | 7 +++++++
.../resources/js/Context/SingleProductHandler.js | 7 +++++++
.../ppcp-googlepay/resources/js/GooglepayButton.js | 4 ++++
.../src/Helper/SubscriptionHelper.php | 13 +++++++++++++
10 files changed, 65 insertions(+), 1 deletion(-)
diff --git a/modules/ppcp-applepay/resources/js/ApplepayButton.js b/modules/ppcp-applepay/resources/js/ApplepayButton.js
index 8c35c9eb5..91a2f7f08 100644
--- a/modules/ppcp-applepay/resources/js/ApplepayButton.js
+++ b/modules/ppcp-applepay/resources/js/ApplepayButton.js
@@ -42,6 +42,10 @@ class ApplepayButton {
return;
}
+ if (!this.contextHandler.validateContext()) {
+ return;
+ }
+
this.log('Init', this.context);
this.initEventHandlers();
this.isInitialized = true;
@@ -263,7 +267,7 @@ class ApplepayButton {
switch (this.context) {
case 'product':
// Refresh product data that makes the price change.
- this.productQuantity = document.querySelector('input.qty').value;
+ this.productQuantity = document.querySelector('input.qty')?.value;
this.products = this.contextHandler.products();
this.log('Products updated', this.products);
break;
diff --git a/modules/ppcp-applepay/resources/js/Context/BaseHandler.js b/modules/ppcp-applepay/resources/js/Context/BaseHandler.js
index 3deb4a47e..1201ed084 100644
--- a/modules/ppcp-applepay/resources/js/Context/BaseHandler.js
+++ b/modules/ppcp-applepay/resources/js/Context/BaseHandler.js
@@ -9,6 +9,13 @@ class BaseHandler {
this.ppcpConfig = ppcpConfig;
}
+ validateContext() {
+ if ( this.ppcpConfig?.locations_with_subscription_product?.cart ) {
+ return false;
+ }
+ return true;
+ }
+
shippingAllowed() {
return true;
}
diff --git a/modules/ppcp-applepay/resources/js/Context/PayNowHandler.js b/modules/ppcp-applepay/resources/js/Context/PayNowHandler.js
index add275608..a580c4084 100644
--- a/modules/ppcp-applepay/resources/js/Context/PayNowHandler.js
+++ b/modules/ppcp-applepay/resources/js/Context/PayNowHandler.js
@@ -5,6 +5,13 @@ import CheckoutActionHandler
class PayNowHandler extends BaseHandler {
+ validateContext() {
+ if ( this.ppcpConfig?.locations_with_subscription_product?.payorder ) {
+ return false;
+ }
+ return true;
+ }
+
shippingAllowed() {
return false;
}
diff --git a/modules/ppcp-applepay/resources/js/Context/SingleProductHandler.js b/modules/ppcp-applepay/resources/js/Context/SingleProductHandler.js
index c5d0549d2..5825a1f2c 100644
--- a/modules/ppcp-applepay/resources/js/Context/SingleProductHandler.js
+++ b/modules/ppcp-applepay/resources/js/Context/SingleProductHandler.js
@@ -7,6 +7,13 @@ import BaseHandler from "./BaseHandler";
class SingleProductHandler extends BaseHandler {
+ validateContext() {
+ if ( this.ppcpConfig?.locations_with_subscription_product?.product ) {
+ return false;
+ }
+ return true;
+ }
+
transactionInfo() {
const errorHandler = new ErrorHandler(
this.ppcpConfig.labels.error.generic,
diff --git a/modules/ppcp-button/src/Assets/SmartButton.php b/modules/ppcp-button/src/Assets/SmartButton.php
index 049b1ab00..e8e0796ff 100644
--- a/modules/ppcp-button/src/Assets/SmartButton.php
+++ b/modules/ppcp-button/src/Assets/SmartButton.php
@@ -973,6 +973,7 @@ document.querySelector("#payment").before(document.querySelector("#ppcp-messages
'subscription_plan_id' => $this->subscription_helper->paypal_subscription_id(),
'variable_paypal_subscription_variations' => $this->subscription_helper->variable_paypal_subscription_variations(),
'subscription_product_allowed' => $this->subscription_helper->checkout_subscription_product_allowed(),
+ 'locations_with_subscription_product' => $this->subscription_helper->locations_with_subscription_product(),
'enforce_vault' => $this->has_subscriptions(),
'can_save_vault_token' => $this->can_save_vault_token(),
'is_free_trial_cart' => $is_free_trial_cart,
diff --git a/modules/ppcp-googlepay/resources/js/Context/BaseHandler.js b/modules/ppcp-googlepay/resources/js/Context/BaseHandler.js
index 1074c94ec..fe0054f63 100644
--- a/modules/ppcp-googlepay/resources/js/Context/BaseHandler.js
+++ b/modules/ppcp-googlepay/resources/js/Context/BaseHandler.js
@@ -10,6 +10,13 @@ class BaseHandler {
this.externalHandler = externalHandler;
}
+ validateContext() {
+ if ( this.ppcpConfig?.locations_with_subscription_product?.cart ) {
+ return false;
+ }
+ return true;
+ }
+
shippingAllowed() {
return true;
}
diff --git a/modules/ppcp-googlepay/resources/js/Context/PayNowHandler.js b/modules/ppcp-googlepay/resources/js/Context/PayNowHandler.js
index add275608..a580c4084 100644
--- a/modules/ppcp-googlepay/resources/js/Context/PayNowHandler.js
+++ b/modules/ppcp-googlepay/resources/js/Context/PayNowHandler.js
@@ -5,6 +5,13 @@ import CheckoutActionHandler
class PayNowHandler extends BaseHandler {
+ validateContext() {
+ if ( this.ppcpConfig?.locations_with_subscription_product?.payorder ) {
+ return false;
+ }
+ return true;
+ }
+
shippingAllowed() {
return false;
}
diff --git a/modules/ppcp-googlepay/resources/js/Context/SingleProductHandler.js b/modules/ppcp-googlepay/resources/js/Context/SingleProductHandler.js
index 6760cfb80..60563ded9 100644
--- a/modules/ppcp-googlepay/resources/js/Context/SingleProductHandler.js
+++ b/modules/ppcp-googlepay/resources/js/Context/SingleProductHandler.js
@@ -7,6 +7,13 @@ import BaseHandler from "./BaseHandler";
class SingleProductHandler extends BaseHandler {
+ validateContext() {
+ if ( this.ppcpConfig?.locations_with_subscription_product?.product ) {
+ return false;
+ }
+ return true;
+ }
+
transactionInfo() {
const errorHandler = new ErrorHandler(
this.ppcpConfig.labels.error.generic,
diff --git a/modules/ppcp-googlepay/resources/js/GooglepayButton.js b/modules/ppcp-googlepay/resources/js/GooglepayButton.js
index 9ecb778d5..61b5451ba 100644
--- a/modules/ppcp-googlepay/resources/js/GooglepayButton.js
+++ b/modules/ppcp-googlepay/resources/js/GooglepayButton.js
@@ -40,6 +40,10 @@ class GooglepayButton {
return;
}
+ if (!this.contextHandler.validateContext()) {
+ return;
+ }
+
this.googlePayConfig = config;
this.allowedPaymentMethods = config.allowedPaymentMethods;
this.baseCardPaymentMethod = this.allowedPaymentMethods[0];
diff --git a/modules/ppcp-subscription/src/Helper/SubscriptionHelper.php b/modules/ppcp-subscription/src/Helper/SubscriptionHelper.php
index 9f803c5c5..b71156f86 100644
--- a/modules/ppcp-subscription/src/Helper/SubscriptionHelper.php
+++ b/modules/ppcp-subscription/src/Helper/SubscriptionHelper.php
@@ -271,4 +271,17 @@ class SubscriptionHelper {
return true;
}
+
+ /**
+ * Returns the locations on the page which have subscription products.
+ *
+ * @return array
+ */
+ public function locations_with_subscription_product(): array {
+ return array(
+ 'product' => is_product() && $this->current_product_is_subscription(),
+ 'payorder' => is_wc_endpoint_url( 'order-pay' ) && $this->order_pay_contains_subscription(),
+ 'cart' => $this->cart_contains_subscription(),
+ );
+ }
}
From c4290073c1878f19d0fdb35a005ada1d70834104 Mon Sep 17 00:00:00 2001
From: James Allan
Date: Tue, 14 Nov 2023 11:47:00 +1000
Subject: [PATCH 20/36] Product version bump update
---
changelog.txt | 2 +-
readme.txt | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/changelog.txt b/changelog.txt
index 52e9534b1..723707185 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,6 +1,6 @@
*** Changelog ***
-= 2.4.1 - xxxx-xx-xx =
+= 2.4.1 - 2023-11-14 =
* Fix - Error "PayPal order ID not found in meta" prevents automations from triggering when buying subscription via third-party payment gateway #1822
* Fix - Card button subscription support declaration #1796
* Fix - Pay Later messaging disappears when updating shipping option on cart page #1807
diff --git a/readme.txt b/readme.txt
index db1e38b34..7d1d2e955 100644
--- a/readme.txt
+++ b/readme.txt
@@ -180,7 +180,7 @@ If you encounter issues with the PayPal buttons not appearing after an update, p
== Changelog ==
-= 2.4.1 - xxxx-xx-xx =
+= 2.4.1 - 2023-11-14 =
* Fix - Error "PayPal order ID not found in meta" prevents automations from triggering when buying subscription via third-party payment gateway #1822
* Fix - Card button subscription support declaration #1796
* Fix - Pay Later messaging disappears when updating shipping option on cart page #1807
From 4d569949011cf8959e86a960787062716ea77554 Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Tue, 14 Nov 2023 12:00:26 +0100
Subject: [PATCH 21/36] Hide spinner on card fields loaded
---
.../resources/js/modules/Renderer/CreditCardRenderer.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
index cdf65a35b..1d75087e4 100644
--- a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
+++ b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
@@ -198,6 +198,8 @@ class CreditCardRenderer {
const cvvField = cardField.CVVField();
cvvField.render(cvvFieldContainer);
document.getElementById("ppcp-credit-card-gateway-card-cvc").remove();
+
+ document.dispatchEvent(new CustomEvent("hosted_fields_loaded"));
}
gateWayBox.style.display = oldDisplayStyle;
From 6fe60864442c36a8aff819f14dbdb1afe7a468a1 Mon Sep 17 00:00:00 2001
From: carmenmaymo
Date: Tue, 14 Nov 2023 12:37:15 +0100
Subject: [PATCH 22/36] update CI matrix
---
.github/workflows/e2e.yml | 2 +-
.github/workflows/php.yml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml
index 0bf80c13b..e47208e50 100644
--- a/.github/workflows/e2e.yml
+++ b/.github/workflows/e2e.yml
@@ -7,7 +7,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- php-versions: ['7.3', '7.4', '8.1']
+ php-versions: ['7.3', '7.4', '8.2']
wc-versions: ['5.9.5', '7.7.2']
name: PHP ${{ matrix.php-versions }} WC ${{ matrix.wc-versions }}
diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml
index 186c90837..ed3804b04 100644
--- a/.github/workflows/php.yml
+++ b/.github/workflows/php.yml
@@ -7,7 +7,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- php-versions: ['7.2', '7.3', '7.4', '8.0', '8.1']
+ php-versions: ['7.2', '7.3', '7.4', '8.0', '8.1', '8.2']
name: PHP ${{ matrix.php-versions }}
steps:
From 581f99d187a86e534b152b7bf5768170559eea22 Mon Sep 17 00:00:00 2001
From: carmenmaymo
Date: Tue, 14 Nov 2023 15:48:51 +0100
Subject: [PATCH 23/36] Add 8.3 version in CI
---
.github/workflows/php.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml
index ed3804b04..f4967e186 100644
--- a/.github/workflows/php.yml
+++ b/.github/workflows/php.yml
@@ -7,7 +7,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- php-versions: ['7.2', '7.3', '7.4', '8.0', '8.1', '8.2']
+ php-versions: ['7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3']
name: PHP ${{ matrix.php-versions }}
steps:
From adbb799be4e68069c5c8ffaef9c72d4e65f78002 Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Tue, 14 Nov 2023 16:24:02 +0100
Subject: [PATCH 24/36] Add cardholder name field
---
.../js/modules/Renderer/CreditCardRenderer.js | 5 +++
.../ppcp-card-fields/src/CardFieldsModule.php | 33 +++++++++++++++++--
2 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
index 1d75087e4..e5e723311 100644
--- a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
+++ b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
@@ -184,6 +184,11 @@ class CreditCardRenderer {
});
if (cardField.isEligible()) {
+ const nameFieldContainer = document.getElementById('ppcp-credit-card-gateway-card-name').parentNode;
+ const nameField = cardField.NameField();
+ nameField.render(nameFieldContainer);
+ document.getElementById("ppcp-credit-card-gateway-card-name").remove();
+
const numberFieldContainer = document.getElementById('ppcp-credit-card-gateway-card-number').parentNode;
const numberField = cardField.NumberField();
numberField.render(numberFieldContainer);
diff --git a/modules/ppcp-card-fields/src/CardFieldsModule.php b/modules/ppcp-card-fields/src/CardFieldsModule.php
index 4b8f55d98..4091acf00 100644
--- a/modules/ppcp-card-fields/src/CardFieldsModule.php
+++ b/modules/ppcp-card-fields/src/CardFieldsModule.php
@@ -13,9 +13,16 @@ use WooCommerce\PayPalCommerce\Vendor\Dhii\Container\ServiceProvider;
use WooCommerce\PayPalCommerce\Vendor\Dhii\Modular\Module\ModuleInterface;
use WooCommerce\PayPalCommerce\Vendor\Interop\Container\ServiceProviderInterface;
use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface;
+use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
+/**
+ * Class CardFieldsModule
+ */
class CardFieldsModule implements ModuleInterface {
+ /**
+ * {@inheritDoc}
+ */
public function setup(): ServiceProviderInterface {
return new ServiceProvider(
require __DIR__ . '/../services.php',
@@ -23,6 +30,9 @@ class CardFieldsModule implements ModuleInterface {
);
}
+ /**
+ * {@inheritDoc}
+ */
public function run( ContainerInterface $c ): void {
if ( ! $c->get( 'card-fields.eligible' ) ) {
return;
@@ -36,8 +46,9 @@ class CardFieldsModule implements ModuleInterface {
add_filter(
'woocommerce_paypal_payments_sdk_components_hook',
function( $components ) {
- if ( in_array( 'hosted-fields', $components ) ) {
- if ( ( $key = array_search( 'hosted-fields', $components ) ) !== false ) {
+ if ( in_array( 'hosted-fields', $components, true ) ) {
+ $key = array_search( 'hosted-fields', $components, true );
+ if ( $key !== false ) {
unset( $components[ $key ] );
}
}
@@ -46,5 +57,23 @@ class CardFieldsModule implements ModuleInterface {
return $components;
}
);
+
+ add_filter(
+ 'woocommerce_credit_card_form_fields',
+ function( $default_fields, $id ) {
+ if ( CreditCardGateway::ID === $id ) {
+ $default_fields['card-name-field'] = '';
+
+ // Moves new item to first position.
+ $new_field = $default_fields['card-name-field'];
+ unset( $default_fields['card-name-field'] );
+ array_unshift( $default_fields, $new_field );
+ }
+
+ return $default_fields;
+ },
+ 10,
+ 2
+ );
}
}
From 206db7688722a47b4936cb6ccd017a775d7c2850 Mon Sep 17 00:00:00 2001
From: Pedro Silva
Date: Tue, 14 Nov 2023 16:33:19 +0000
Subject: [PATCH 25/36] Fix ApplePay device detection for edge cases.
---
modules/ppcp-applepay/services.php | 19 ++++++++++++++++---
.../src/Assets/PropertiesDictionary.php | 11 +++++++++--
2 files changed, 25 insertions(+), 5 deletions(-)
diff --git a/modules/ppcp-applepay/services.php b/modules/ppcp-applepay/services.php
index 96a237f03..0f1266006 100644
--- a/modules/ppcp-applepay/services.php
+++ b/modules/ppcp-applepay/services.php
@@ -98,11 +98,24 @@ return array(
return false;
}
}
- foreach ( PropertiesDictionary::ALLOWED_USER_AGENTS as $allowed_agent ) {
- if ( strpos( $user_agent, $allowed_agent ) !== false ) {
- return true;
+
+ $browser_allowed = false;
+ foreach ( PropertiesDictionary::ALLOWED_USER_BROWSERS as $allowed_browser ) {
+ if ( strpos( $user_agent, $allowed_browser ) !== false ) {
+ $browser_allowed = true;
+ break;
}
}
+
+ $device_allowed = false;
+ foreach ( PropertiesDictionary::ALLOWED_USER_DEVICES as $allowed_devices ) {
+ if ( strpos( $user_agent, $allowed_devices ) !== false ) {
+ $device_allowed = true;
+ break;
+ }
+ }
+
+ return $browser_allowed && $device_allowed;
}
return false;
},
diff --git a/modules/ppcp-applepay/src/Assets/PropertiesDictionary.php b/modules/ppcp-applepay/src/Assets/PropertiesDictionary.php
index ce4be2a46..9367e2e51 100644
--- a/modules/ppcp-applepay/src/Assets/PropertiesDictionary.php
+++ b/modules/ppcp-applepay/src/Assets/PropertiesDictionary.php
@@ -13,8 +13,15 @@ namespace WooCommerce\PayPalCommerce\Applepay\Assets;
* Class PropertiesDictionary
*/
class PropertiesDictionary {
- public const DISALLOWED_USER_AGENTS = array( 'Chrome' );
- public const ALLOWED_USER_AGENTS = array( 'Safari', 'Macintosh', 'iPhone', 'iPad', 'iPod' );
+ public const DISALLOWED_USER_AGENTS = array(
+ 'Chrome/',
+ 'CriOS/', // Chrome on iOS.
+ 'Firefox/',
+ 'OPR/', // Opera.
+ 'Edg/', // Edge.
+ );
+ public const ALLOWED_USER_BROWSERS = array( 'Safari' );
+ public const ALLOWED_USER_DEVICES = array( 'Macintosh', 'iPhone', 'iPad', 'iPod' );
public const BILLING_CONTACT_INVALID = 'billing Contact Invalid';
From a50ac455eeb40ba1a0f2be38051b6154bc66319d Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Wed, 15 Nov 2023 12:01:18 +0100
Subject: [PATCH 26/36] Add 3DS verification method
---
.../ppcp-card-fields/src/CardFieldsModule.php | 27 +++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/modules/ppcp-card-fields/src/CardFieldsModule.php b/modules/ppcp-card-fields/src/CardFieldsModule.php
index 4091acf00..2976d3a94 100644
--- a/modules/ppcp-card-fields/src/CardFieldsModule.php
+++ b/modules/ppcp-card-fields/src/CardFieldsModule.php
@@ -14,6 +14,7 @@ use WooCommerce\PayPalCommerce\Vendor\Dhii\Modular\Module\ModuleInterface;
use WooCommerce\PayPalCommerce\Vendor\Interop\Container\ServiceProviderInterface;
use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface;
use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
+use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
/**
* Class CardFieldsModule
@@ -75,5 +76,31 @@ class CardFieldsModule implements ModuleInterface {
10,
2
);
+
+ add_filter(
+ 'ppcp_create_order_request_body_data',
+ function( $data ) use ( $c ) {
+ $settings = $c->get( 'wcgateway.settings' );
+ assert( $settings instanceof Settings );
+
+ if (
+ $settings->has( '3d_secure_contingency' )
+ && (
+ $settings->get( '3d_secure_contingency' ) === 'SCA_ALWAYS'
+ || $settings->get( '3d_secure_contingency' ) === 'SCA_WHEN_REQUIRED'
+ )
+ ) {
+ $data['payment_source']['card'] = array(
+ 'attributes' => array(
+ 'verification' => array(
+ 'method' => $settings->get( '3d_secure_contingency' ),
+ ),
+ ),
+ );
+ }
+
+ return $data;
+ }
+ );
}
}
From 8d9e32baebb3515df3f59a309b9f524446bd0c8e Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Wed, 15 Nov 2023 12:33:07 +0100
Subject: [PATCH 27/36] Add filter for rendering cardholder name field
---
.../js/modules/Renderer/CreditCardRenderer.js | 10 ++++++----
modules/ppcp-card-fields/src/CardFieldsModule.php | 2 +-
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
index e5e723311..326f9d806 100644
--- a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
+++ b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
@@ -184,10 +184,12 @@ class CreditCardRenderer {
});
if (cardField.isEligible()) {
- const nameFieldContainer = document.getElementById('ppcp-credit-card-gateway-card-name').parentNode;
- const nameField = cardField.NameField();
- nameField.render(nameFieldContainer);
- document.getElementById("ppcp-credit-card-gateway-card-name").remove();
+ const nameFieldContainer = document.getElementById('ppcp-credit-card-gateway-card-name')?.parentNode;
+ if(nameFieldContainer) {
+ const nameField = cardField.NameField();
+ nameField.render(nameFieldContainer);
+ document.getElementById("ppcp-credit-card-gateway-card-name").remove();
+ }
const numberFieldContainer = document.getElementById('ppcp-credit-card-gateway-card-number').parentNode;
const numberField = cardField.NumberField();
diff --git a/modules/ppcp-card-fields/src/CardFieldsModule.php b/modules/ppcp-card-fields/src/CardFieldsModule.php
index 2976d3a94..fa047f5bc 100644
--- a/modules/ppcp-card-fields/src/CardFieldsModule.php
+++ b/modules/ppcp-card-fields/src/CardFieldsModule.php
@@ -62,7 +62,7 @@ class CardFieldsModule implements ModuleInterface {
add_filter(
'woocommerce_credit_card_form_fields',
function( $default_fields, $id ) {
- if ( CreditCardGateway::ID === $id ) {
+ if ( CreditCardGateway::ID === $id && apply_filters( 'woocommerce_paypal_payments_enable_cardholder_name_field', false ) ) {
$default_fields['card-name-field'] = '';
// Moves new item to first position.
From 8fc4833503912b889d9833b1ddf0ecabf5536fad Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Wed, 15 Nov 2023 15:43:15 +0100
Subject: [PATCH 28/36] Add styles to fields
---
.../js/modules/Renderer/CreditCardRenderer.js | 92 +++++++++++++++----
.../ppcp-card-fields/src/CardFieldsModule.php | 5 +-
2 files changed, 79 insertions(+), 18 deletions(-)
diff --git a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
index 326f9d806..0346cdd63 100644
--- a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
+++ b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
@@ -184,27 +184,33 @@ class CreditCardRenderer {
});
if (cardField.isEligible()) {
- const nameFieldContainer = document.getElementById('ppcp-credit-card-gateway-card-name')?.parentNode;
- if(nameFieldContainer) {
- const nameField = cardField.NameField();
- nameField.render(nameFieldContainer);
- document.getElementById("ppcp-credit-card-gateway-card-name").remove();
+ const nameField = document.getElementById('ppcp-credit-card-gateway-card-name');
+ if(nameField) {
+ let styles = this.cardFieldStyles(nameField);
+ cardField.NameField({style: {'input': styles}}).render(nameField.parentNode);
+ nameField.remove();
}
- const numberFieldContainer = document.getElementById('ppcp-credit-card-gateway-card-number').parentNode;
- const numberField = cardField.NumberField();
- numberField.render(numberFieldContainer);
- document.getElementById("ppcp-credit-card-gateway-card-number").remove();
+ const numberField = document.getElementById('ppcp-credit-card-gateway-card-number');
+ if(numberField) {
+ let styles = this.cardFieldStyles(numberField);
+ cardField.NumberField({style: {'input': styles}}).render(numberField.parentNode);
+ numberField.remove();
+ }
- const expiryFieldContainer = document.getElementById('ppcp-credit-card-gateway-card-expiry').parentNode;
- const expiryField = cardField.ExpiryField();
- expiryField.render(expiryFieldContainer);
- document.getElementById("ppcp-credit-card-gateway-card-expiry").remove();
+ const expiryField = document.getElementById('ppcp-credit-card-gateway-card-expiry');
+ if(expiryField) {
+ let styles = this.cardFieldStyles(expiryField);
+ cardField.ExpiryField({style: {'input': styles}}).render(expiryField.parentNode);
+ expiryField.remove();
+ }
- const cvvFieldContainer = document.getElementById('ppcp-credit-card-gateway-card-cvc').parentNode;
- const cvvField = cardField.CVVField();
- cvvField.render(cvvFieldContainer);
- document.getElementById("ppcp-credit-card-gateway-card-cvc").remove();
+ const cvvField = document.getElementById('ppcp-credit-card-gateway-card-cvc');
+ if(cvvField) {
+ let styles = this.cardFieldStyles(cvvField);
+ cardField.CVVField({style: {'input': styles}}).render(cvvField.parentNode);
+ cvvField.remove();
+ }
document.dispatchEvent(new CustomEvent("hosted_fields_loaded"));
}
@@ -233,6 +239,58 @@ class CreditCardRenderer {
wrapperElement.parentNode.removeChild(wrapperElement);
}
+ cardFieldStyles(field) {
+ const allowedProperties = [
+ 'appearance',
+ 'color',
+ 'direction',
+ 'font',
+ 'font-family',
+ 'font-size',
+ 'font-size-adjust',
+ 'font-stretch',
+ 'font-style',
+ 'font-variant',
+ 'font-variant-alternates',
+ 'font-variant-caps',
+ 'font-variant-east-asian',
+ 'font-variant-ligatures',
+ 'font-variant-numeric',
+ 'font-weight',
+ 'letter-spacing',
+ 'line-height',
+ 'opacity',
+ 'outline',
+ 'padding',
+ 'padding-bottom',
+ 'padding-left',
+ 'padding-right',
+ 'padding-top',
+ 'text-shadow',
+ 'transition',
+ '-moz-appearance',
+ '-moz-osx-font-smoothing',
+ '-moz-tap-highlight-color',
+ '-moz-transition',
+ '-webkit-appearance',
+ '-webkit-osx-font-smoothing',
+ '-webkit-tap-highlight-color',
+ '-webkit-transition',
+ ];
+
+ const stylesRaw = window.getComputedStyle(field);
+ const styles = {};
+ Object.values(stylesRaw).forEach((prop) => {
+ console.log(prop)
+ if (!stylesRaw[prop] || !allowedProperties.includes(prop)) {
+ return;
+ }
+ styles[prop] = '' + stylesRaw[prop];
+ });
+
+ return styles;
+ }
+
disableFields() {
if (this.currentHostedFieldsInstance) {
this.currentHostedFieldsInstance.setAttribute({
diff --git a/modules/ppcp-card-fields/src/CardFieldsModule.php b/modules/ppcp-card-fields/src/CardFieldsModule.php
index fa047f5bc..8c89a12fd 100644
--- a/modules/ppcp-card-fields/src/CardFieldsModule.php
+++ b/modules/ppcp-card-fields/src/CardFieldsModule.php
@@ -63,7 +63,10 @@ class CardFieldsModule implements ModuleInterface {
'woocommerce_credit_card_form_fields',
function( $default_fields, $id ) {
if ( CreditCardGateway::ID === $id && apply_filters( 'woocommerce_paypal_payments_enable_cardholder_name_field', false ) ) {
- $default_fields['card-name-field'] = '';
+ $default_fields['card-name-field'] = '
+
+
+
';
// Moves new item to first position.
$new_field = $default_fields['card-name-field'];
From 5112e755525769a77fb04833cb53f766a156242c Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Wed, 15 Nov 2023 16:18:39 +0100
Subject: [PATCH 29/36] Add styles to fields
---
.../resources/js/modules/Renderer/CreditCardRenderer.js | 1 -
modules/ppcp-card-fields/src/CardFieldsModule.php | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
index 0346cdd63..9279086e2 100644
--- a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
+++ b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
@@ -281,7 +281,6 @@ class CreditCardRenderer {
const stylesRaw = window.getComputedStyle(field);
const styles = {};
Object.values(stylesRaw).forEach((prop) => {
- console.log(prop)
if (!stylesRaw[prop] || !allowedProperties.includes(prop)) {
return;
}
diff --git a/modules/ppcp-card-fields/src/CardFieldsModule.php b/modules/ppcp-card-fields/src/CardFieldsModule.php
index 8c89a12fd..698cc1d7a 100644
--- a/modules/ppcp-card-fields/src/CardFieldsModule.php
+++ b/modules/ppcp-card-fields/src/CardFieldsModule.php
@@ -64,7 +64,7 @@ class CardFieldsModule implements ModuleInterface {
function( $default_fields, $id ) {
if ( CreditCardGateway::ID === $id && apply_filters( 'woocommerce_paypal_payments_enable_cardholder_name_field', false ) ) {
$default_fields['card-name-field'] = '
-
+
';
From 7502438d0c689bb9598367968dab78806fb3a0f2 Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Wed, 15 Nov 2023 16:32:46 +0100
Subject: [PATCH 30/36] Add styles to fields
---
.../resources/js/modules/Renderer/CreditCardRenderer.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
index 9279086e2..75396d0fd 100644
--- a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
+++ b/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
@@ -228,7 +228,7 @@ class CreditCardRenderer {
.catch((error) => {
this.spinner.unblock();
console.error(error)
- this.errorHandler.genericError();
+ this.errorHandler.message(this.defaultConfig.hosted_fields.labels.fields_not_valid);
})
});
From aa8bc204b481011bb071f4a46ee39d4a07f3d937 Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Thu, 16 Nov 2023 16:53:51 +0100
Subject: [PATCH 31/36] Fix psalm
---
modules/ppcp-card-fields/src/CardFieldsModule.php | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/modules/ppcp-card-fields/src/CardFieldsModule.php b/modules/ppcp-card-fields/src/CardFieldsModule.php
index 698cc1d7a..4471485aa 100644
--- a/modules/ppcp-card-fields/src/CardFieldsModule.php
+++ b/modules/ppcp-card-fields/src/CardFieldsModule.php
@@ -61,6 +61,12 @@ class CardFieldsModule implements ModuleInterface {
add_filter(
'woocommerce_credit_card_form_fields',
+ /**
+ * Return/Param types removed to avoid third-party issues.
+ *
+ * @psalm-suppress MissingClosureReturnType
+ * @psalm-suppress MissingClosureParamType
+ */
function( $default_fields, $id ) {
if ( CreditCardGateway::ID === $id && apply_filters( 'woocommerce_paypal_payments_enable_cardholder_name_field', false ) ) {
$default_fields['card-name-field'] = '
@@ -82,7 +88,7 @@ class CardFieldsModule implements ModuleInterface {
add_filter(
'ppcp_create_order_request_body_data',
- function( $data ) use ( $c ) {
+ function( array $data ) use ( $c ): array {
$settings = $c->get( 'wcgateway.settings' );
assert( $settings instanceof Settings );
From 9b58eca1b0378b237eb71a05ebb15bf116dc7478 Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Thu, 16 Nov 2023 17:01:39 +0100
Subject: [PATCH 32/36] Fix phpcs
---
modules/ppcp-card-fields/services.php | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/modules/ppcp-card-fields/services.php b/modules/ppcp-card-fields/services.php
index 76a7082dc..b6c18d977 100644
--- a/modules/ppcp-card-fields/services.php
+++ b/modules/ppcp-card-fields/services.php
@@ -13,9 +13,9 @@ use WooCommerce\PayPalCommerce\CardFields\Helper\CardFieldsApplies;
use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface;
return array(
- 'card-fields.eligible' => static function ( ContainerInterface $container ): bool {
+ 'card-fields.eligible' => static function ( ContainerInterface $container ): bool {
$save_payment_methods_applies = $container->get( 'card-fields.helpers.save-payment-methods-applies' );
- assert( $save_payment_methods_applies instanceof CardFieldsApplies);
+ assert( $save_payment_methods_applies instanceof CardFieldsApplies );
return $save_payment_methods_applies->for_country_currency();
},
@@ -26,7 +26,7 @@ return array(
$container->get( 'api.shop.country' )
);
},
- 'card-fields.supported-country-currency-matrix' => static function ( ContainerInterface $container ) : array {
+ 'card-fields.supported-country-currency-matrix' => static function ( ContainerInterface $container ) : array {
return apply_filters(
'woocommerce_paypal_payments_card_fields_supported_country_currency_matrix',
array(
From 1af681904abacfda434277e378f0989617628766 Mon Sep 17 00:00:00 2001
From: Pedro Silva
Date: Fri, 17 Nov 2023 11:13:53 +0000
Subject: [PATCH 33/36] Fix button rendering location compatibility issues on
single product page.
---
modules/ppcp-compat/src/CompatModule.php | 27 +++++++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/modules/ppcp-compat/src/CompatModule.php b/modules/ppcp-compat/src/CompatModule.php
index edb4f0e67..44cfd1988 100644
--- a/modules/ppcp-compat/src/CompatModule.php
+++ b/modules/ppcp-compat/src/CompatModule.php
@@ -273,7 +273,12 @@ class CompatModule implements ModuleInterface {
add_action(
'init',
function() {
- if ( $this->is_elementor_pro_active() || $this->is_divi_theme_active() ) {
+ if (
+ $this->is_block_theme_active()
+ || $this->is_elementor_pro_active()
+ || $this->is_divi_theme_active()
+ || $this->is_divi_child_theme_active()
+ ) {
add_filter(
'woocommerce_paypal_payments_single_product_renderer_hook',
function(): string {
@@ -286,6 +291,15 @@ class CompatModule implements ModuleInterface {
);
}
+ /**
+ * Checks whether the current theme is a blocks theme.
+ *
+ * @return bool
+ */
+ protected function is_block_theme_active(): bool {
+ return function_exists( 'wp_is_block_theme' ) && wp_is_block_theme();
+ }
+
/**
* Checks whether the Elementor Pro plugins (allowing integrations with WC) is active.
*
@@ -304,4 +318,15 @@ class CompatModule implements ModuleInterface {
$theme = wp_get_theme();
return $theme->get( 'Name' ) === 'Divi';
}
+
+ /**
+ * Checks whether a Divi child theme is currently used.
+ *
+ * @return bool
+ */
+ protected function is_divi_child_theme_active(): bool {
+ $theme = wp_get_theme();
+ $parent = $theme->parent();
+ return ( $parent && $parent->get( 'Name' ) === 'Divi' );
+ }
}
From 14fc649c40609c2b37fc3cb02071c8370581c1de Mon Sep 17 00:00:00 2001
From: Narek Zakarian
Date: Fri, 17 Nov 2023 15:51:10 +0400
Subject: [PATCH 34/36] Create service for 2nd version country codes
---
modules/ppcp-order-tracking/services.php | 42 ++++++++++++++++--------
1 file changed, 29 insertions(+), 13 deletions(-)
diff --git a/modules/ppcp-order-tracking/services.php b/modules/ppcp-order-tracking/services.php
index 37154cd65..8b52fa2fe 100644
--- a/modules/ppcp-order-tracking/services.php
+++ b/modules/ppcp-order-tracking/services.php
@@ -21,16 +21,16 @@ use WooCommerce\PayPalCommerce\OrderTracking\Assets\OrderEditPageAssets;
use WooCommerce\PayPalCommerce\OrderTracking\Endpoint\OrderTrackingEndpoint;
return array(
- 'order-tracking.assets' => function( ContainerInterface $container ) : OrderEditPageAssets {
+ 'order-tracking.assets' => function( ContainerInterface $container ) : OrderEditPageAssets {
return new OrderEditPageAssets(
$container->get( 'order-tracking.module.url' ),
$container->get( 'ppcp.asset-version' )
);
},
- 'order-tracking.shipment.factory' => static function ( ContainerInterface $container ) : ShipmentFactoryInterface {
+ 'order-tracking.shipment.factory' => static function ( ContainerInterface $container ) : ShipmentFactoryInterface {
return new ShipmentFactory();
},
- 'order-tracking.endpoint.controller' => static function ( ContainerInterface $container ) : OrderTrackingEndpoint {
+ 'order-tracking.endpoint.controller' => static function ( ContainerInterface $container ) : OrderTrackingEndpoint {
return new OrderTrackingEndpoint(
$container->get( 'api.host' ),
$container->get( 'api.bearer' ),
@@ -38,10 +38,10 @@ return array(
$container->get( 'button.request-data' ),
$container->get( 'order-tracking.shipment.factory' ),
$container->get( 'order-tracking.allowed-shipping-statuses' ),
- $container->get( 'order-tracking.is-merchant-country-us' )
+ $container->get( 'order-tracking.should-use-second-version-of-api' )
);
},
- 'order-tracking.module.url' => static function ( ContainerInterface $container ): string {
+ 'order-tracking.module.url' => static function ( ContainerInterface $container ): string {
/**
* The path cannot be false.
*
@@ -52,15 +52,15 @@ return array(
dirname( realpath( __FILE__ ), 3 ) . '/woocommerce-paypal-payments.php'
);
},
- 'order-tracking.meta-box.renderer' => static function ( ContainerInterface $container ): MetaBoxRenderer {
+ 'order-tracking.meta-box.renderer' => static function ( ContainerInterface $container ): MetaBoxRenderer {
return new MetaBoxRenderer(
$container->get( 'order-tracking.allowed-shipping-statuses' ),
$container->get( 'order-tracking.available-carriers' ),
$container->get( 'order-tracking.endpoint.controller' ),
- $container->get( 'order-tracking.is-merchant-country-us' )
+ $container->get( 'order-tracking.should-use-second-version-of-api' )
);
},
- 'order-tracking.allowed-shipping-statuses' => static function ( ContainerInterface $container ): array {
+ 'order-tracking.allowed-shipping-statuses' => static function ( ContainerInterface $container ): array {
return (array) apply_filters(
'woocommerce_paypal_payments_tracking_statuses',
array(
@@ -71,10 +71,10 @@ return array(
)
);
},
- 'order-tracking.allowed-carriers' => static function ( ContainerInterface $container ): array {
+ 'order-tracking.allowed-carriers' => static function ( ContainerInterface $container ): array {
return require __DIR__ . '/carriers.php';
},
- 'order-tracking.available-carriers' => static function ( ContainerInterface $container ): array {
+ 'order-tracking.available-carriers' => static function ( ContainerInterface $container ): array {
$api_shop_country = $container->get( 'api.shop.country' );
$allowed_carriers = $container->get( 'order-tracking.allowed-carriers' );
$selected_country_carriers = $allowed_carriers[ $api_shop_country ] ?? array();
@@ -90,10 +90,26 @@ return array(
),
);
},
- 'order-tracking.is-merchant-country-us' => static function ( ContainerInterface $container ): bool {
- return $container->get( 'api.shop.country' ) === 'US';
+
+ /**
+ * The list of country codes, for which the 2nd version of PayPal tracking API is supported.
+ */
+ 'order-tracking.second-version-api-supported-countries' => static function (): array {
+ /**
+ * Returns codes of countries, for which the 2nd version of PayPal tracking API is supported.
+ */
+ return apply_filters(
+ 'woocommerce_paypal_payments_supported_country_codes_for_second_version_of_tracking_api',
+ array( 'US', 'AU', 'CA', 'FR', 'DE', 'IT', 'ES' )
+ );
},
- 'order-tracking.integrations' => static function ( ContainerInterface $container ): array {
+ 'order-tracking.should-use-second-version-of-api' => static function ( ContainerInterface $container ): bool {
+ $supported_county_codes = $container->get( 'order-tracking.second-version-api-supported-countries' );
+ $selected_country_code = $container->get( 'api.shop.country' );
+
+ return in_array( $selected_country_code, $supported_county_codes, true );
+ },
+ 'order-tracking.integrations' => static function ( ContainerInterface $container ): array {
$shipment_factory = $container->get( 'order-tracking.shipment.factory' );
$logger = $container->get( 'woocommerce.logger.woocommerce' );
$endpoint = $container->get( 'order-tracking.endpoint.controller' );
From 32f7b4940b6481dbecd8dc5bb8d65692af4bd2c9 Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Mon, 20 Nov 2023 13:23:10 +0100
Subject: [PATCH 35/36] Inject either hosted fields or card fields depending on
context
---
modules/ppcp-button/resources/js/button.js | 9 +-
.../js/modules/Renderer/CardFieldsRenderer.js | 265 ++++++++++++++++++
...ardRenderer.js => HostedFieldsRenderer.js} | 134 +--------
3 files changed, 274 insertions(+), 134 deletions(-)
create mode 100644 modules/ppcp-button/resources/js/modules/Renderer/CardFieldsRenderer.js
rename modules/ppcp-button/resources/js/modules/Renderer/{CreditCardRenderer.js => HostedFieldsRenderer.js} (70%)
diff --git a/modules/ppcp-button/resources/js/button.js b/modules/ppcp-button/resources/js/button.js
index 7d3812fc5..4366b6592 100644
--- a/modules/ppcp-button/resources/js/button.js
+++ b/modules/ppcp-button/resources/js/button.js
@@ -5,7 +5,8 @@ import CheckoutBootstap from './modules/ContextBootstrap/CheckoutBootstap';
import PayNowBootstrap from "./modules/ContextBootstrap/PayNowBootstrap";
import Renderer from './modules/Renderer/Renderer';
import ErrorHandler from './modules/ErrorHandler';
-import CreditCardRenderer from "./modules/Renderer/CreditCardRenderer";
+import HostedFieldsRenderer from "./modules/Renderer/HostedFieldsRenderer";
+import CardFieldsRenderer from "./modules/Renderer/CardFieldsRenderer";
import MessageRenderer from "./modules/Renderer/MessageRenderer";
import Spinner from "./modules/Helper/Spinner";
import {
@@ -37,7 +38,11 @@ const bootstrap = () => {
document.querySelector(checkoutFormSelector) ?? document.querySelector('.woocommerce-notices-wrapper')
);
const spinner = new Spinner();
- const creditCardRenderer = new CreditCardRenderer(PayPalCommerceGateway, errorHandler, spinner);
+
+ let creditCardRenderer = new HostedFieldsRenderer(PayPalCommerceGateway, errorHandler, spinner);
+ if (typeof paypal.CardFields !== 'undefined') {
+ creditCardRenderer = new CardFieldsRenderer(PayPalCommerceGateway, errorHandler, spinner);
+ }
const formSaver = new FormSaver(
PayPalCommerceGateway.ajax.save_checkout_form.endpoint,
diff --git a/modules/ppcp-button/resources/js/modules/Renderer/CardFieldsRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/CardFieldsRenderer.js
new file mode 100644
index 000000000..1fb4fa81f
--- /dev/null
+++ b/modules/ppcp-button/resources/js/modules/Renderer/CardFieldsRenderer.js
@@ -0,0 +1,265 @@
+import {show} from "../Helper/Hiding";
+
+class CardFieldsRenderer {
+
+ constructor(defaultConfig, errorHandler, spinner) {
+ this.defaultConfig = defaultConfig;
+ this.errorHandler = errorHandler;
+ this.spinner = spinner;
+ this.cardValid = false;
+ this.formValid = false;
+ this.emptyFields = new Set(['number', 'cvv', 'expirationDate']);
+ this.currentHostedFieldsInstance = null;
+ }
+
+ render(wrapper, contextConfig) {
+ if (
+ (
+ this.defaultConfig.context !== 'checkout'
+ && this.defaultConfig.context !== 'pay-now'
+ )
+ || wrapper === null
+ || document.querySelector(wrapper) === null
+ ) {
+ return;
+ }
+
+ const buttonSelector = wrapper + ' button';
+
+ const gateWayBox = document.querySelector('.payment_box.payment_method_ppcp-credit-card-gateway');
+ if (!gateWayBox) {
+ return
+ }
+
+ const oldDisplayStyle = gateWayBox.style.display;
+ gateWayBox.style.display = 'block';
+
+ const hideDccGateway = document.querySelector('#ppcp-hide-dcc');
+ if (hideDccGateway) {
+ hideDccGateway.parentNode.removeChild(hideDccGateway);
+ }
+
+ const cardField = paypal.CardFields({
+ createOrder: contextConfig.createOrder,
+ onApprove: function (data) {
+ return contextConfig.onApprove(data);
+ },
+ onError: function (error) {
+ console.error(error)
+ this.spinner.unblock();
+ }
+ });
+
+ if (cardField.isEligible()) {
+ const nameField = document.getElementById('ppcp-credit-card-gateway-card-name');
+ if (nameField) {
+ let styles = this.cardFieldStyles(nameField);
+ cardField.NameField({style: {'input': styles}}).render(nameField.parentNode);
+ nameField.remove();
+ }
+
+ const numberField = document.getElementById('ppcp-credit-card-gateway-card-number');
+ if (numberField) {
+ let styles = this.cardFieldStyles(numberField);
+ cardField.NumberField({style: {'input': styles}}).render(numberField.parentNode);
+ numberField.remove();
+ }
+
+ const expiryField = document.getElementById('ppcp-credit-card-gateway-card-expiry');
+ if (expiryField) {
+ let styles = this.cardFieldStyles(expiryField);
+ cardField.ExpiryField({style: {'input': styles}}).render(expiryField.parentNode);
+ expiryField.remove();
+ }
+
+ const cvvField = document.getElementById('ppcp-credit-card-gateway-card-cvc');
+ if (cvvField) {
+ let styles = this.cardFieldStyles(cvvField);
+ cardField.CVVField({style: {'input': styles}}).render(cvvField.parentNode);
+ cvvField.remove();
+ }
+
+ document.dispatchEvent(new CustomEvent("hosted_fields_loaded"));
+ }
+
+ gateWayBox.style.display = oldDisplayStyle;
+
+ show(buttonSelector);
+
+ document.querySelector(buttonSelector).addEventListener("click", (event) => {
+ event.preventDefault();
+ this.spinner.block();
+ this.errorHandler.clear();
+
+ cardField.submit()
+ .catch((error) => {
+ this.spinner.unblock();
+ console.error(error)
+ this.errorHandler.message(this.defaultConfig.hosted_fields.labels.fields_not_valid);
+ })
+ });
+ }
+
+ cardFieldStyles(field) {
+ const allowedProperties = [
+ 'appearance',
+ 'color',
+ 'direction',
+ 'font',
+ 'font-family',
+ 'font-size',
+ 'font-size-adjust',
+ 'font-stretch',
+ 'font-style',
+ 'font-variant',
+ 'font-variant-alternates',
+ 'font-variant-caps',
+ 'font-variant-east-asian',
+ 'font-variant-ligatures',
+ 'font-variant-numeric',
+ 'font-weight',
+ 'letter-spacing',
+ 'line-height',
+ 'opacity',
+ 'outline',
+ 'padding',
+ 'padding-bottom',
+ 'padding-left',
+ 'padding-right',
+ 'padding-top',
+ 'text-shadow',
+ 'transition',
+ '-moz-appearance',
+ '-moz-osx-font-smoothing',
+ '-moz-tap-highlight-color',
+ '-moz-transition',
+ '-webkit-appearance',
+ '-webkit-osx-font-smoothing',
+ '-webkit-tap-highlight-color',
+ '-webkit-transition',
+ ];
+
+ const stylesRaw = window.getComputedStyle(field);
+ const styles = {};
+ Object.values(stylesRaw).forEach((prop) => {
+ if (!stylesRaw[prop] || !allowedProperties.includes(prop)) {
+ return;
+ }
+ styles[prop] = '' + stylesRaw[prop];
+ });
+
+ return styles;
+ }
+
+ disableFields() {
+ if (this.currentHostedFieldsInstance) {
+ this.currentHostedFieldsInstance.setAttribute({
+ field: 'number',
+ attribute: 'disabled'
+ })
+ this.currentHostedFieldsInstance.setAttribute({
+ field: 'cvv',
+ attribute: 'disabled'
+ })
+ this.currentHostedFieldsInstance.setAttribute({
+ field: 'expirationDate',
+ attribute: 'disabled'
+ })
+ }
+ }
+
+ enableFields() {
+ if (this.currentHostedFieldsInstance) {
+ this.currentHostedFieldsInstance.removeAttribute({
+ field: 'number',
+ attribute: 'disabled'
+ })
+ this.currentHostedFieldsInstance.removeAttribute({
+ field: 'cvv',
+ attribute: 'disabled'
+ })
+ this.currentHostedFieldsInstance.removeAttribute({
+ field: 'expirationDate',
+ attribute: 'disabled'
+ })
+ }
+ }
+
+ _submit(contextConfig) {
+ this.spinner.block();
+ this.errorHandler.clear();
+
+ if (this.formValid && this.cardValid) {
+ const save_card = this.defaultConfig.can_save_vault_token ? true : false;
+ let vault = document.getElementById('ppcp-credit-card-vault') ?
+ document.getElementById('ppcp-credit-card-vault').checked : save_card;
+ if (this.defaultConfig.enforce_vault) {
+ vault = true;
+ }
+ const contingency = this.defaultConfig.hosted_fields.contingency;
+ const hostedFieldsData = {
+ vault: vault
+ };
+ if (contingency !== 'NO_3D_SECURE') {
+ hostedFieldsData.contingencies = [contingency];
+ }
+
+ if (this.defaultConfig.payer) {
+ hostedFieldsData.cardholderName = this.defaultConfig.payer.name.given_name + ' ' + this.defaultConfig.payer.name.surname;
+ }
+ if (!hostedFieldsData.cardholderName) {
+ const firstName = document.getElementById('billing_first_name') ? document.getElementById('billing_first_name').value : '';
+ const lastName = document.getElementById('billing_last_name') ? document.getElementById('billing_last_name').value : '';
+
+ hostedFieldsData.cardholderName = firstName + ' ' + lastName;
+ }
+
+ this.currentHostedFieldsInstance.submit(hostedFieldsData).then((payload) => {
+ payload.orderID = payload.orderId;
+ this.spinner.unblock();
+ return contextConfig.onApprove(payload);
+ }).catch(err => {
+ this.spinner.unblock();
+ this.errorHandler.clear();
+
+ if (err.data?.details?.length) {
+ this.errorHandler.message(err.data.details.map(d => `${d.issue} ${d.description}`).join('
'));
+ } else if (err.details?.length) {
+ this.errorHandler.message(err.details.map(d => `${d.issue} ${d.description}`).join('
'));
+ } else if (err.data?.errors?.length > 0) {
+ this.errorHandler.messages(err.data.errors);
+ } else if (err.data?.message) {
+ this.errorHandler.message(err.data.message);
+ } else if (err.message) {
+ this.errorHandler.message(err.message);
+ } else {
+ this.errorHandler.genericError();
+ }
+ });
+ } else {
+ this.spinner.unblock();
+
+ let message = this.defaultConfig.labels.error.generic;
+ if (this.emptyFields.size > 0) {
+ message = this.defaultConfig.hosted_fields.labels.fields_empty;
+ } else if (!this.cardValid) {
+ message = this.defaultConfig.hosted_fields.labels.card_not_supported;
+ } else if (!this.formValid) {
+ message = this.defaultConfig.hosted_fields.labels.fields_not_valid;
+ }
+
+ this.errorHandler.message(message);
+ }
+ }
+
+ _cardNumberFiledCLassNameByCardType(cardType) {
+ return cardType === 'american-express' ? 'amex' : cardType.replace('-', '');
+ }
+
+ _recreateElementClassAttribute(element, newClassName) {
+ element.removeAttribute('class')
+ element.setAttribute('class', newClassName);
+ }
+}
+
+export default CardFieldsRenderer;
diff --git a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/HostedFieldsRenderer.js
similarity index 70%
rename from modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
rename to modules/ppcp-button/resources/js/modules/Renderer/HostedFieldsRenderer.js
index 75396d0fd..7a2c5043e 100644
--- a/modules/ppcp-button/resources/js/modules/Renderer/CreditCardRenderer.js
+++ b/modules/ppcp-button/resources/js/modules/Renderer/HostedFieldsRenderer.js
@@ -1,7 +1,7 @@
import dccInputFactory from "../Helper/DccInputFactory";
import {show} from "../Helper/Hiding";
-class CreditCardRenderer {
+class HostedFieldsRenderer {
constructor(defaultConfig, errorHandler, spinner) {
this.defaultConfig = defaultConfig;
@@ -156,140 +156,10 @@ class CreditCardRenderer {
return;
}
- if (typeof paypal.CardFields !== 'undefined') {
- const buttonSelector = wrapper + ' button';
-
- const gateWayBox = document.querySelector('.payment_box.payment_method_ppcp-credit-card-gateway');
- if (!gateWayBox) {
- return
- }
-
- const oldDisplayStyle = gateWayBox.style.display;
- gateWayBox.style.display = 'block';
-
- const hideDccGateway = document.querySelector('#ppcp-hide-dcc');
- if (hideDccGateway) {
- hideDccGateway.parentNode.removeChild(hideDccGateway);
- }
-
- const cardField = paypal.CardFields({
- createOrder: contextConfig.createOrder,
- onApprove: function (data) {
- return contextConfig.onApprove(data);
- },
- onError: function (error) {
- console.error(error)
- this.spinner.unblock();
- }
- });
-
- if (cardField.isEligible()) {
- const nameField = document.getElementById('ppcp-credit-card-gateway-card-name');
- if(nameField) {
- let styles = this.cardFieldStyles(nameField);
- cardField.NameField({style: {'input': styles}}).render(nameField.parentNode);
- nameField.remove();
- }
-
- const numberField = document.getElementById('ppcp-credit-card-gateway-card-number');
- if(numberField) {
- let styles = this.cardFieldStyles(numberField);
- cardField.NumberField({style: {'input': styles}}).render(numberField.parentNode);
- numberField.remove();
- }
-
- const expiryField = document.getElementById('ppcp-credit-card-gateway-card-expiry');
- if(expiryField) {
- let styles = this.cardFieldStyles(expiryField);
- cardField.ExpiryField({style: {'input': styles}}).render(expiryField.parentNode);
- expiryField.remove();
- }
-
- const cvvField = document.getElementById('ppcp-credit-card-gateway-card-cvc');
- if(cvvField) {
- let styles = this.cardFieldStyles(cvvField);
- cardField.CVVField({style: {'input': styles}}).render(cvvField.parentNode);
- cvvField.remove();
- }
-
- document.dispatchEvent(new CustomEvent("hosted_fields_loaded"));
- }
-
- gateWayBox.style.display = oldDisplayStyle;
-
- show(buttonSelector);
-
- document.querySelector(buttonSelector).addEventListener("click", (event) => {
- event.preventDefault();
- this.spinner.block();
- this.errorHandler.clear();
-
- cardField.submit()
- .catch((error) => {
- this.spinner.unblock();
- console.error(error)
- this.errorHandler.message(this.defaultConfig.hosted_fields.labels.fields_not_valid);
- })
- });
-
- return;
- }
-
const wrapperElement = document.querySelector(wrapper);
wrapperElement.parentNode.removeChild(wrapperElement);
}
- cardFieldStyles(field) {
- const allowedProperties = [
- 'appearance',
- 'color',
- 'direction',
- 'font',
- 'font-family',
- 'font-size',
- 'font-size-adjust',
- 'font-stretch',
- 'font-style',
- 'font-variant',
- 'font-variant-alternates',
- 'font-variant-caps',
- 'font-variant-east-asian',
- 'font-variant-ligatures',
- 'font-variant-numeric',
- 'font-weight',
- 'letter-spacing',
- 'line-height',
- 'opacity',
- 'outline',
- 'padding',
- 'padding-bottom',
- 'padding-left',
- 'padding-right',
- 'padding-top',
- 'text-shadow',
- 'transition',
- '-moz-appearance',
- '-moz-osx-font-smoothing',
- '-moz-tap-highlight-color',
- '-moz-transition',
- '-webkit-appearance',
- '-webkit-osx-font-smoothing',
- '-webkit-tap-highlight-color',
- '-webkit-transition',
- ];
-
- const stylesRaw = window.getComputedStyle(field);
- const styles = {};
- Object.values(stylesRaw).forEach((prop) => {
- if (!stylesRaw[prop] || !allowedProperties.includes(prop)) {
- return;
- }
- styles[prop] = '' + stylesRaw[prop];
- });
-
- return styles;
- }
-
disableFields() {
if (this.currentHostedFieldsInstance) {
this.currentHostedFieldsInstance.setAttribute({
@@ -401,4 +271,4 @@ class CreditCardRenderer {
}
}
-export default CreditCardRenderer;
+export default HostedFieldsRenderer;
From e7d07d5f126ed1eb1e30095248dcb8213d832848 Mon Sep 17 00:00:00 2001
From: Emili Castells Guasch
Date: Mon, 20 Nov 2023 15:03:49 +0100
Subject: [PATCH 36/36] Remove unused code
---
.../js/modules/Renderer/CardFieldsRenderer.js | 110 ------------------
1 file changed, 110 deletions(-)
diff --git a/modules/ppcp-button/resources/js/modules/Renderer/CardFieldsRenderer.js b/modules/ppcp-button/resources/js/modules/Renderer/CardFieldsRenderer.js
index 1fb4fa81f..29514186a 100644
--- a/modules/ppcp-button/resources/js/modules/Renderer/CardFieldsRenderer.js
+++ b/modules/ppcp-button/resources/js/modules/Renderer/CardFieldsRenderer.js
@@ -150,116 +150,6 @@ class CardFieldsRenderer {
return styles;
}
-
- disableFields() {
- if (this.currentHostedFieldsInstance) {
- this.currentHostedFieldsInstance.setAttribute({
- field: 'number',
- attribute: 'disabled'
- })
- this.currentHostedFieldsInstance.setAttribute({
- field: 'cvv',
- attribute: 'disabled'
- })
- this.currentHostedFieldsInstance.setAttribute({
- field: 'expirationDate',
- attribute: 'disabled'
- })
- }
- }
-
- enableFields() {
- if (this.currentHostedFieldsInstance) {
- this.currentHostedFieldsInstance.removeAttribute({
- field: 'number',
- attribute: 'disabled'
- })
- this.currentHostedFieldsInstance.removeAttribute({
- field: 'cvv',
- attribute: 'disabled'
- })
- this.currentHostedFieldsInstance.removeAttribute({
- field: 'expirationDate',
- attribute: 'disabled'
- })
- }
- }
-
- _submit(contextConfig) {
- this.spinner.block();
- this.errorHandler.clear();
-
- if (this.formValid && this.cardValid) {
- const save_card = this.defaultConfig.can_save_vault_token ? true : false;
- let vault = document.getElementById('ppcp-credit-card-vault') ?
- document.getElementById('ppcp-credit-card-vault').checked : save_card;
- if (this.defaultConfig.enforce_vault) {
- vault = true;
- }
- const contingency = this.defaultConfig.hosted_fields.contingency;
- const hostedFieldsData = {
- vault: vault
- };
- if (contingency !== 'NO_3D_SECURE') {
- hostedFieldsData.contingencies = [contingency];
- }
-
- if (this.defaultConfig.payer) {
- hostedFieldsData.cardholderName = this.defaultConfig.payer.name.given_name + ' ' + this.defaultConfig.payer.name.surname;
- }
- if (!hostedFieldsData.cardholderName) {
- const firstName = document.getElementById('billing_first_name') ? document.getElementById('billing_first_name').value : '';
- const lastName = document.getElementById('billing_last_name') ? document.getElementById('billing_last_name').value : '';
-
- hostedFieldsData.cardholderName = firstName + ' ' + lastName;
- }
-
- this.currentHostedFieldsInstance.submit(hostedFieldsData).then((payload) => {
- payload.orderID = payload.orderId;
- this.spinner.unblock();
- return contextConfig.onApprove(payload);
- }).catch(err => {
- this.spinner.unblock();
- this.errorHandler.clear();
-
- if (err.data?.details?.length) {
- this.errorHandler.message(err.data.details.map(d => `${d.issue} ${d.description}`).join('
'));
- } else if (err.details?.length) {
- this.errorHandler.message(err.details.map(d => `${d.issue} ${d.description}`).join('
'));
- } else if (err.data?.errors?.length > 0) {
- this.errorHandler.messages(err.data.errors);
- } else if (err.data?.message) {
- this.errorHandler.message(err.data.message);
- } else if (err.message) {
- this.errorHandler.message(err.message);
- } else {
- this.errorHandler.genericError();
- }
- });
- } else {
- this.spinner.unblock();
-
- let message = this.defaultConfig.labels.error.generic;
- if (this.emptyFields.size > 0) {
- message = this.defaultConfig.hosted_fields.labels.fields_empty;
- } else if (!this.cardValid) {
- message = this.defaultConfig.hosted_fields.labels.card_not_supported;
- } else if (!this.formValid) {
- message = this.defaultConfig.hosted_fields.labels.fields_not_valid;
- }
-
- this.errorHandler.message(message);
- }
- }
-
- _cardNumberFiledCLassNameByCardType(cardType) {
- return cardType === 'american-express' ? 'amex' : cardType.replace('-', '');
- }
-
- _recreateElementClassAttribute(element, newClassName) {
- element.removeAttribute('class')
- element.setAttribute('class', newClassName);
- }
}
export default CardFieldsRenderer;