Changeset 3457552
- Timestamp:
- 02/09/2026 11:21:34 PM (8 weeks ago)
- Location:
- mailchimp-for-woocommerce/trunk
- Files:
-
- 29 added
- 33 edited
-
CHANGELOG.txt (modified) (1 diff)
-
README.txt (modified) (1 diff)
-
admin/class-mailchimp-woocommerce-admin.php (modified) (1 diff)
-
admin/v2/processes/class-mailchimp-woocommerce-event.php (modified) (3 diffs)
-
admin/v2/templates/confirmation/tabs/audience.php (modified) (1 diff)
-
admin/v2/templates/confirmation/tabs/overview.php (modified) (1 diff)
-
admin/v2/templates/confirmation/tabs/store-info.php (modified) (2 diffs)
-
blocks/assets/js/checkout-sms-consent-block (added)
-
blocks/assets/js/checkout-sms-consent-block/attributes.js (added)
-
blocks/assets/js/checkout-sms-consent-block/block.js (added)
-
blocks/assets/js/checkout-sms-consent-block/block.json (added)
-
blocks/assets/js/checkout-sms-consent-block/edit.js (added)
-
blocks/assets/js/checkout-sms-consent-block/frontend.js (added)
-
blocks/assets/js/checkout-sms-consent-block/index.js (added)
-
blocks/assets/js/checkout-sms-consent-block/style.scss (added)
-
blocks/assets/js/checkout-sms-subscription-block (added)
-
blocks/assets/js/checkout-sms-subscription-block/attributes.js (added)
-
blocks/assets/js/checkout-sms-subscription-block/block.js (added)
-
blocks/assets/js/checkout-sms-subscription-block/block.json (added)
-
blocks/assets/js/checkout-sms-subscription-block/edit.js (added)
-
blocks/assets/js/checkout-sms-subscription-block/frontend.js (added)
-
blocks/assets/js/checkout-sms-subscription-block/index.js (added)
-
blocks/assets/js/checkout-sms-subscription-block/style.scss (added)
-
blocks/build/sms-consent-block-frontend.asset.php (added)
-
blocks/build/sms-consent-block-frontend.js (added)
-
blocks/build/sms-consent-block.asset.php (added)
-
blocks/build/sms-consent-block.js (added)
-
blocks/build/style-sms-consent-block-rtl.css (added)
-
blocks/build/style-sms-consent-block.css (added)
-
blocks/composer.json (modified) (1 diff)
-
blocks/composer.lock (modified) (34 diffs)
-
blocks/newsletter.php (modified) (2 diffs)
-
blocks/package-lock.json (modified) (106 diffs)
-
blocks/package.json (modified) (1 diff)
-
blocks/sms.php (added)
-
blocks/webpack.config.js (modified) (1 diff)
-
blocks/woocommerce-blocks-extend-store-endpoint-sms.php (added)
-
blocks/woocommerce-blocks-integration-sms.php (added)
-
blocks/woocommerce-sms-blocks-integration.php (added)
-
bootstrap.php (modified) (4 diffs)
-
includes/api/assets/class-mailchimp-customer.php (modified) (6 diffs)
-
includes/api/class-mailchimp-api.php (modified) (21 diffs)
-
includes/api/class-mailchimp-woocommerce-tower.php (modified) (2 diffs)
-
includes/class-mailchimp-woocommerce-enhanced-logger.php (modified) (1 diff)
-
includes/class-mailchimp-woocommerce-newsletter.php (modified) (5 diffs)
-
includes/class-mailchimp-woocommerce-rest-api.php (modified) (4 diffs)
-
includes/class-mailchimp-woocommerce-service.php (modified) (1 diff)
-
includes/class-mailchimp-woocommerce-sms-consent.php (added)
-
includes/class-mailchimp-woocommerce.php (modified) (2 diffs)
-
includes/processes/class-mailchimp-woocommerce-cart-update.php (modified) (2 diffs)
-
includes/processes/class-mailchimp-woocommerce-single-customer.php (modified) (1 diff)
-
includes/processes/class-mailchimp-woocommerce-single-order.php (modified) (17 diffs)
-
includes/processes/class-mailchimp-woocommerce-single-product-category.php (modified) (1 diff)
-
includes/processes/class-mailchimp-woocommerce-subscriber-sync.php (modified) (6 diffs)
-
includes/processes/class-mailchimp-woocommerce-webhooks-sync.php (modified) (1 diff)
-
languages/mc-woocommerce-newsletter.pot (modified) (4 diffs)
-
mailchimp-woocommerce.php (modified) (2 diffs)
-
public/class-mailchimp-woocommerce-public.php (modified) (1 diff)
-
public/js/mailchimp-woocommerce-public.js (modified) (2 diffs)
-
public/js/mailchimp-woocommerce-public.min.js (modified) (1 diff)
-
public/js/mailchimp-woocommerce-sms-consent.js (added)
-
public/js/mailchimp-woocommerce-sms-consent.min.js (added)
Legend:
- Unmodified
- Added
- Removed
-
mailchimp-for-woocommerce/trunk/CHANGELOG.txt
r3433839 r3457552 1 1 == Changelog == 2 = 6.0 = 3 * Adds WooCommerce Order Fulfillments tracking 4 * Adds SMS phone number field with consent for checkout 5 * Adds Bi-directional SMS contact sync 6 * Adds Order creation error handling 7 * Adds Customer skip sync logging 8 * Fixes Fatal error in subscription payment processing 9 * Fixes Cart update incorrectly setting subscriber status to transactional 10 * Fixes Backorders status sync between WooCommerce and Mailchimp 11 * Fixes Sync status icon positioning in admin 12 * Fixes PHP deprecated parameter warnings on plugin connection 13 * Fixes Undefined array key "SERVER_NAME" log warnings 14 * Updates plugin metadata 15 * Updates js-yaml to 4.1.1 16 * Updates node-forge to 1.3.2 17 * Updates qs to 6.14.1 and express to 4.22.1 18 * Updates lodash to 4.17.23 19 * Updates playwright to 1.56.1 20 * Updates tar-fs to 3.1.1 21 * Removes unused functions 22 * Updates plugin metadata 2 23 = 5.7 = 3 24 * Fixes error when order is not created yet and removes unused function. -
mailchimp-for-woocommerce/trunk/README.txt
r3433839 r3457552 79 79 80 80 == Changelog == 81 = 5.7 = 82 * Fixes error when order is not created yet and removes unused function. 83 * Fixes Fatal Error scheduled subscription payment processing 84 * Fixes PHP warnings throwing Undefined array key “SERVER_NAME” 85 * Fixes Mailchimp backorders status issues 86 * Add better support for current PHP versions 87 * Fixes sync-status-icon positioning issue in plugins dashboard 88 * Bumps node-forge from 1.3.1 to 1.3.2 in /blocks 89 * Bumps to js-yaml in /blocks 90 * Bumps to playwright and @playwright/test in /blocks 91 * Bumps to tar-fs from 3.0.9 to 3.1.1 in /blocks 81 = 6.0 = 82 * Adds WooCommerce Order Fulfillments tracking 83 * Adds SMS phone number field with consent for checkout 84 * Adds Bi-directional SMS contact sync 85 * Adds Order creation error handling 86 * Adds Customer skip sync logging 87 * Fixes Fatal error in subscription payment processing 88 * Fixes Cart update incorrectly setting subscriber status to transactional 89 * Fixes Backorders status sync between WooCommerce and Mailchimp 90 * Fixes Sync status icon positioning in admin 91 * Fixes PHP deprecated parameter warnings on plugin connection 92 * Fixes Undefined array key "SERVER_NAME" log warnings 93 * Updates plugin metadata 94 * Updates js-yaml to 4.1.1 95 * Updates node-forge to 1.3.2 96 * Updates qs to 6.14.1 and express to 4.22.1 97 * Updates lodash to 4.17.23 98 * Updates playwright to 1.56.1 99 * Updates tar-fs to 3.1.1 100 * Removes unused functions 101 * Updates plugin metadata -
mailchimp-for-woocommerce/trunk/admin/class-mailchimp-woocommerce-admin.php
r3433839 r3457552 1375 1375 'mailchimp_permission_cap' => $permissions, 1376 1376 'mailchimp_checkbox_action' => isset( $input['mailchimp_checkbox_action'] ) ? $input['mailchimp_checkbox_action'] : $this->getOption( 'mailchimp_checkbox_action', 'woocommerce_after_checkout_billing_form' ), 1377 'mailchimp_sms_consent_enabled' => isset( $input['mailchimp_sms_consent_enabled'] ) ? $input['mailchimp_sms_consent_enabled'] : $this->getOption( 'mailchimp_sms_consent_enabled', false ), 1377 1378 'mailchimp_product_image_key' => isset( $input['mailchimp_product_image_key'] ) ? $input['mailchimp_product_image_key'] : 'medium', 1378 1379 'newsletter_label' => ( isset( $input['newsletter_label'] ) ) ? wp_kses( $input['newsletter_label'], $allowed_html ) : $this->getOption( 'newsletter_label', __( 'Subscribe to our newsletter', 'mailchimp-for-woocommerce' ) ), -
mailchimp-for-woocommerce/trunk/admin/v2/processes/class-mailchimp-woocommerce-event.php
r3433839 r3457552 158 158 } 159 159 160 mailchimp_debug('event_tracer', $this->object_detail, array( 161 'id' => isset($response['headers']) && isset($response['headers']['event_id']) ? $response['headers']['event_id'] : 'none' 162 )); 160 if (defined('MAILCHIMP_DEBUG') && MAILCHIMP_DEBUG === true) { 161 mailchimp_debug('event_tracer', $this->object_detail, array( 162 'id' => isset($response['headers']) && isset($response['headers']['event_id']) ? $response['headers']['event_id'] : 'none' 163 )); 164 } 163 165 164 166 return json_decode( $response['body'] ); … … 237 239 238 240 if (empty($this->user_id)) { 239 mailchimp_log('mailchimp_events', "mailchimp beacon :: sending anonymous event"); 241 if (defined('MAILCHIMP_DEBUG') && MAILCHIMP_DEBUG === true) { 242 mailchimp_debug('mailchimp_events', "mailchimp beacon :: sending anonymous event"); 243 } 240 244 // remove the user id and login id if we don't have this info yet. 241 245 unset($payload['context']['user_id'], $payload['context']['login_id']); … … 251 255 } 252 256 253 mailchimp_debug('mailchimp_events', "mailchimp beacon tracking payload {$this->event}", $payload); 257 if (defined('MAILCHIMP_DEBUG') && MAILCHIMP_DEBUG === true) { 258 mailchimp_debug('mailchimp_events', "mailchimp beacon tracking payload {$this->event}", $payload); 259 } 254 260 255 261 return $payload; -
mailchimp-for-woocommerce/trunk/admin/v2/templates/confirmation/tabs/audience.php
r3346450 r3457552 163 163 </div> 164 164 </div> 165 166 <!-- SMS Marketing Consent Settings --> 167 <div class="mc-wc-tab-content-box has-underline"> 168 <div class="mc-wc-tab-content-title"> 169 <h3><?php esc_html_e( 'SMS Marketing Consent', 'mailchimp-for-woocommerce' ); ?></h3> 170 </div> 171 <div class="mc-wc-tab-content-description-small"> 172 <?php esc_html_e( 'Collect SMS marketing consent at checkout and sync phone numbers to Mailchimp for SMS campaigns.', 'mailchimp-for-woocommerce' ); ?> 173 </div> 174 175 <?php 176 $sms_enabled = ( array_key_exists( 'mailchimp_sms_enabled', $options ) && ! is_null( $options['mailchimp_sms_enabled'] ) ) ? (bool) $options['mailchimp_sms_enabled'] : false; 177 ?> 178 179 <!-- Enable SMS Checkbox --> 180 <div class="mc-wc-contact-import-ref-choose" style="margin-bottom: 20px;"> 181 <div class="mc-wc-import-list-sync"> 182 <div class="mc-wc-import-list-sync-item"> 183 <div class="mc-wc-import-list-sync-input"> 184 <div class="mc-wc-checkbox"> 185 <label class="mc-wc-checkbox-label fw-700"> 186 <input type="checkbox" id="mailchimp_sms_enabled" name="<?php echo esc_attr( $this->plugin_name ); ?>[mailchimp_sms_enabled]" value="1" <?php if ($sms_enabled) { echo "checked"; } ?>> 187 <?php esc_html_e( 'Enable SMS consent collection at checkout', 'mailchimp-for-woocommerce' ); ?> 188 </label> 189 </div> 190 </div> 191 <div class="mc-wc-import-list-sync-description"> 192 <?php esc_html_e( 'Note: Your Mailchimp account must have an approved SMS application to use this feature. The SMS consent checkbox will appear unchecked by default at checkout with compliant label and disclaimer text.', 'mailchimp-for-woocommerce' ); ?> 193 </div> 194 </div> 195 </div> 196 </div> 197 </div> 165 198 </div> -
mailchimp-for-woocommerce/trunk/admin/v2/templates/confirmation/tabs/overview.php
r3433839 r3457552 84 84 85 85 } 86 // try {87 // $mailchimp_total_subscribers = $mailchimp_api->getSubscribedCount( $store->getListId() );88 // } catch ( Exception $e ) {89 // $mailchimp_total_subscribers = 0; }90 // try {91 // $mailchimp_total_transactional = $mailchimp_api->getTransactionalCount( $store->getListId() );92 // } catch ( Exception $e ) {93 // $mailchimp_total_transactional = 0;94 // }95 86 } 96 87 -
mailchimp-for-woocommerce/trunk/admin/v2/templates/confirmation/tabs/store-info.php
r3209992 r3457552 27 27 ); 28 28 29 $opt_in_settings = apply_filters('mailchimp_checkout_opt_in_options', $default_opt_in_settings); ;30 ?>29 $opt_in_settings = apply_filters('mailchimp_checkout_opt_in_options', $default_opt_in_settings); 30 ?> 31 31 <input type="hidden" name="mailchimp_active_settings_tab" value="<?php echo MC_WC_STORE_INFO_TAB; ?>"/> 32 32 <input type="hidden" value="<?php echo ( esc_attr( isset( $current_currency_data ) ? $current_currency . ' | ' . $current_currency_data['name'] : $current_currency ) ); ?>" disabled/> … … 136 136 </p> 137 137 </div> 138 139 <?php if (Mailchimp_Sms_Consent::isEligibleCountry()): ?> 140 <div class="mc-wc-input-wrapper"> 141 <div class="mc-wc-checkbox"> 142 <label class="mc-wc-checkbox-label fw-700"> 143 <input type="checkbox" name="<?php echo esc_attr( $this->plugin_name ); ?>[mailchimp_sms_consent_enabled]" value="1" <?php if ($options['mailchimp_sms_consent_enabled']) { echo "checked"; } ?>> 144 <?php esc_html_e( 'Enable SMS consent in checkout', 'mailchimp-for-woocommerce' ); ?> 145 </label> 146 </div> 147 </div> 148 <?php endif; ?> 149 138 150 <?php endif; ?> 139 151 </div> -
mailchimp-for-woocommerce/trunk/blocks/composer.json
r2940866 r3457552 9 9 }, 10 10 "require-dev": { 11 "phpunit/phpunit": " 5.7.19",11 "phpunit/phpunit": "8.5.52", 12 12 "sirbrillig/spies": "^1.5" 13 13 }, -
mailchimp-for-woocommerce/trunk/blocks/composer.lock
r2865898 r3457552 5 5 "This file is @generated automatically" 6 6 ], 7 "content-hash": " b57f7d9fff58efcf93ae2b5722bfa630",7 "content-hash": "722e36cbd086f7314eae6730b576dd9a", 8 8 "packages": [ 9 9 { … … 162 162 { 163 163 "name": "doctrine/instantiator", 164 "version": "1. 4.1",164 "version": "1.5.0", 165 165 "source": { 166 166 "type": "git", 167 167 "url": "https://github.com/doctrine/instantiator.git", 168 "reference": " 10dcfce151b967d20fde1b34ae6640712c3891bc"169 }, 170 "dist": { 171 "type": "zip", 172 "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ 10dcfce151b967d20fde1b34ae6640712c3891bc",173 "reference": " 10dcfce151b967d20fde1b34ae6640712c3891bc",168 "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" 169 }, 170 "dist": { 171 "type": "zip", 172 "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", 173 "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", 174 174 "shasum": "" 175 175 }, … … 178 178 }, 179 179 "require-dev": { 180 "doctrine/coding-standard": "^9 ",180 "doctrine/coding-standard": "^9 || ^11", 181 181 "ext-pdo": "*", 182 182 "ext-phar": "*", … … 185 185 "phpstan/phpstan-phpunit": "^1", 186 186 "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", 187 "vimeo/psalm": "^4. 22"187 "vimeo/psalm": "^4.30 || ^5.4" 188 188 }, 189 189 "type": "library", … … 212 212 "support": { 213 213 "issues": "https://github.com/doctrine/instantiator/issues", 214 "source": "https://github.com/doctrine/instantiator/tree/1. 4.1"214 "source": "https://github.com/doctrine/instantiator/tree/1.5.0" 215 215 }, 216 216 "funding": [ … … 228 228 } 229 229 ], 230 "time": "2022- 03-03T08:28:38+00:00"230 "time": "2022-12-30T00:15:36+00:00" 231 231 }, 232 232 { 233 233 "name": "myclabs/deep-copy", 234 "version": "1.1 1.0",234 "version": "1.13.4", 235 235 "source": { 236 236 "type": "git", 237 237 "url": "https://github.com/myclabs/DeepCopy.git", 238 "reference": " 14daed4296fae74d9e3201d2c4925d1acb7aa614"239 }, 240 "dist": { 241 "type": "zip", 242 "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/ 14daed4296fae74d9e3201d2c4925d1acb7aa614",243 "reference": " 14daed4296fae74d9e3201d2c4925d1acb7aa614",238 "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" 239 }, 240 "dist": { 241 "type": "zip", 242 "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", 243 "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", 244 244 "shasum": "" 245 245 }, … … 249 249 "conflict": { 250 250 "doctrine/collections": "<1.6.8", 251 "doctrine/common": "<2.13.3 || >=3 ,<3.2.2"251 "doctrine/common": "<2.13.3 || >=3 <3.2.2" 252 252 }, 253 253 "require-dev": { 254 254 "doctrine/collections": "^1.6.8", 255 255 "doctrine/common": "^2.13.3 || ^3.2.2", 256 "phpspec/prophecy": "^1.10", 256 257 "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 257 258 }, … … 279 280 "support": { 280 281 "issues": "https://github.com/myclabs/DeepCopy/issues", 281 "source": "https://github.com/myclabs/DeepCopy/tree/1.1 1.0"282 "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" 282 283 }, 283 284 "funding": [ … … 287 288 } 288 289 ], 289 "time": "2022-03-03T13:19:32+00:00" 290 }, 291 { 292 "name": "phpdocumentor/reflection-common", 293 "version": "2.2.0", 294 "source": { 295 "type": "git", 296 "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 297 "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" 298 }, 299 "dist": { 300 "type": "zip", 301 "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", 302 "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", 303 "shasum": "" 304 }, 305 "require": { 290 "time": "2025-08-01T08:46:24+00:00" 291 }, 292 { 293 "name": "phar-io/manifest", 294 "version": "2.0.4", 295 "source": { 296 "type": "git", 297 "url": "https://github.com/phar-io/manifest.git", 298 "reference": "54750ef60c58e43759730615a392c31c80e23176" 299 }, 300 "dist": { 301 "type": "zip", 302 "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", 303 "reference": "54750ef60c58e43759730615a392c31c80e23176", 304 "shasum": "" 305 }, 306 "require": { 307 "ext-dom": "*", 308 "ext-libxml": "*", 309 "ext-phar": "*", 310 "ext-xmlwriter": "*", 311 "phar-io/version": "^3.0.1", 306 312 "php": "^7.2 || ^8.0" 307 313 }, … … 309 315 "extra": { 310 316 "branch-alias": { 311 "dev-2.x": "2.x-dev" 312 } 313 }, 314 "autoload": { 315 "psr-4": { 316 "phpDocumentor\\Reflection\\": "src/" 317 } 318 }, 319 "notification-url": "https://packagist.org/downloads/", 320 "license": [ 321 "MIT" 322 ], 323 "authors": [ 324 { 325 "name": "Jaap van Otterdijk", 326 "email": "opensource@ijaap.nl" 327 } 328 ], 329 "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 330 "homepage": "http://www.phpdoc.org", 331 "keywords": [ 332 "FQSEN", 333 "phpDocumentor", 334 "phpdoc", 335 "reflection", 336 "static analysis" 337 ], 338 "support": { 339 "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", 340 "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" 341 }, 342 "time": "2020-06-27T09:03:43+00:00" 343 }, 344 { 345 "name": "phpdocumentor/reflection-docblock", 346 "version": "5.3.0", 347 "source": { 348 "type": "git", 349 "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 350 "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" 351 }, 352 "dist": { 353 "type": "zip", 354 "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", 355 "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", 356 "shasum": "" 357 }, 358 "require": { 359 "ext-filter": "*", 360 "php": "^7.2 || ^8.0", 361 "phpdocumentor/reflection-common": "^2.2", 362 "phpdocumentor/type-resolver": "^1.3", 363 "webmozart/assert": "^1.9.1" 364 }, 365 "require-dev": { 366 "mockery/mockery": "~1.3.2", 367 "psalm/phar": "^4.8" 368 }, 369 "type": "library", 370 "extra": { 371 "branch-alias": { 372 "dev-master": "5.x-dev" 373 } 374 }, 375 "autoload": { 376 "psr-4": { 377 "phpDocumentor\\Reflection\\": "src" 378 } 379 }, 380 "notification-url": "https://packagist.org/downloads/", 381 "license": [ 382 "MIT" 383 ], 384 "authors": [ 385 { 386 "name": "Mike van Riel", 387 "email": "me@mikevanriel.com" 388 }, 389 { 390 "name": "Jaap van Otterdijk", 391 "email": "account@ijaap.nl" 392 } 393 ], 394 "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 395 "support": { 396 "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", 397 "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" 398 }, 399 "time": "2021-10-19T17:43:47+00:00" 400 }, 401 { 402 "name": "phpdocumentor/type-resolver", 403 "version": "1.6.2", 404 "source": { 405 "type": "git", 406 "url": "https://github.com/phpDocumentor/TypeResolver.git", 407 "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d" 408 }, 409 "dist": { 410 "type": "zip", 411 "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d", 412 "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d", 413 "shasum": "" 414 }, 415 "require": { 416 "php": "^7.4 || ^8.0", 417 "phpdocumentor/reflection-common": "^2.0" 418 }, 419 "require-dev": { 420 "ext-tokenizer": "*", 421 "phpstan/extension-installer": "^1.1", 422 "phpstan/phpstan": "^1.8", 423 "phpstan/phpstan-phpunit": "^1.1", 424 "phpunit/phpunit": "^9.5", 425 "rector/rector": "^0.13.9", 426 "vimeo/psalm": "^4.25" 427 }, 428 "type": "library", 429 "extra": { 430 "branch-alias": { 431 "dev-1.x": "1.x-dev" 432 } 433 }, 434 "autoload": { 435 "psr-4": { 436 "phpDocumentor\\Reflection\\": "src" 437 } 438 }, 439 "notification-url": "https://packagist.org/downloads/", 440 "license": [ 441 "MIT" 442 ], 443 "authors": [ 444 { 445 "name": "Mike van Riel", 446 "email": "me@mikevanriel.com" 447 } 448 ], 449 "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", 450 "support": { 451 "issues": "https://github.com/phpDocumentor/TypeResolver/issues", 452 "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2" 453 }, 454 "time": "2022-10-14T12:47:21+00:00" 455 }, 456 { 457 "name": "phpspec/prophecy", 458 "version": "v1.10.3", 459 "source": { 460 "type": "git", 461 "url": "https://github.com/phpspec/prophecy.git", 462 "reference": "451c3cd1418cf640de218914901e51b064abb093" 463 }, 464 "dist": { 465 "type": "zip", 466 "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", 467 "reference": "451c3cd1418cf640de218914901e51b064abb093", 468 "shasum": "" 469 }, 470 "require": { 471 "doctrine/instantiator": "^1.0.2", 472 "php": "^5.3|^7.0", 473 "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", 474 "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", 475 "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" 476 }, 477 "require-dev": { 478 "phpspec/phpspec": "^2.5 || ^3.2", 479 "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 480 }, 481 "type": "library", 482 "extra": { 483 "branch-alias": { 484 "dev-master": "1.10.x-dev" 485 } 486 }, 487 "autoload": { 488 "psr-4": { 489 "Prophecy\\": "src/Prophecy" 490 } 491 }, 492 "notification-url": "https://packagist.org/downloads/", 493 "license": [ 494 "MIT" 495 ], 496 "authors": [ 497 { 498 "name": "Konstantin Kudryashov", 499 "email": "ever.zet@gmail.com", 500 "homepage": "http://everzet.com" 501 }, 502 { 503 "name": "Marcello Duarte", 504 "email": "marcello.duarte@gmail.com" 505 } 506 ], 507 "description": "Highly opinionated mocking framework for PHP 5.3+", 508 "homepage": "https://github.com/phpspec/prophecy", 509 "keywords": [ 510 "Double", 511 "Dummy", 512 "fake", 513 "mock", 514 "spy", 515 "stub" 516 ], 517 "support": { 518 "issues": "https://github.com/phpspec/prophecy/issues", 519 "source": "https://github.com/phpspec/prophecy/tree/v1.10.3" 520 }, 521 "time": "2020-03-05T15:02:03+00:00" 317 "dev-master": "2.0.x-dev" 318 } 319 }, 320 "autoload": { 321 "classmap": [ 322 "src/" 323 ] 324 }, 325 "notification-url": "https://packagist.org/downloads/", 326 "license": [ 327 "BSD-3-Clause" 328 ], 329 "authors": [ 330 { 331 "name": "Arne Blankerts", 332 "email": "arne@blankerts.de", 333 "role": "Developer" 334 }, 335 { 336 "name": "Sebastian Heuer", 337 "email": "sebastian@phpeople.de", 338 "role": "Developer" 339 }, 340 { 341 "name": "Sebastian Bergmann", 342 "email": "sebastian@phpunit.de", 343 "role": "Developer" 344 } 345 ], 346 "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 347 "support": { 348 "issues": "https://github.com/phar-io/manifest/issues", 349 "source": "https://github.com/phar-io/manifest/tree/2.0.4" 350 }, 351 "funding": [ 352 { 353 "url": "https://github.com/theseer", 354 "type": "github" 355 } 356 ], 357 "time": "2024-03-03T12:33:53+00:00" 358 }, 359 { 360 "name": "phar-io/version", 361 "version": "3.2.1", 362 "source": { 363 "type": "git", 364 "url": "https://github.com/phar-io/version.git", 365 "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 366 }, 367 "dist": { 368 "type": "zip", 369 "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 370 "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 371 "shasum": "" 372 }, 373 "require": { 374 "php": "^7.2 || ^8.0" 375 }, 376 "type": "library", 377 "autoload": { 378 "classmap": [ 379 "src/" 380 ] 381 }, 382 "notification-url": "https://packagist.org/downloads/", 383 "license": [ 384 "BSD-3-Clause" 385 ], 386 "authors": [ 387 { 388 "name": "Arne Blankerts", 389 "email": "arne@blankerts.de", 390 "role": "Developer" 391 }, 392 { 393 "name": "Sebastian Heuer", 394 "email": "sebastian@phpeople.de", 395 "role": "Developer" 396 }, 397 { 398 "name": "Sebastian Bergmann", 399 "email": "sebastian@phpunit.de", 400 "role": "Developer" 401 } 402 ], 403 "description": "Library for handling version information and constraints", 404 "support": { 405 "issues": "https://github.com/phar-io/version/issues", 406 "source": "https://github.com/phar-io/version/tree/3.2.1" 407 }, 408 "time": "2022-02-21T01:04:05+00:00" 522 409 }, 523 410 { 524 411 "name": "phpunit/php-code-coverage", 525 "version": " 4.0.8",412 "version": "7.0.17", 526 413 "source": { 527 414 "type": "git", 528 415 "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 529 "reference": " ef7b2f56815df854e66ceaee8ebe9393ae36a40d"530 }, 531 "dist": { 532 "type": "zip", 533 "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ ef7b2f56815df854e66ceaee8ebe9393ae36a40d",534 "reference": " ef7b2f56815df854e66ceaee8ebe9393ae36a40d",416 "reference": "40a4ed114a4aea5afd6df8d0f0c9cd3033097f66" 417 }, 418 "dist": { 419 "type": "zip", 420 "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/40a4ed114a4aea5afd6df8d0f0c9cd3033097f66", 421 "reference": "40a4ed114a4aea5afd6df8d0f0c9cd3033097f66", 535 422 "shasum": "" 536 423 }, … … 538 425 "ext-dom": "*", 539 426 "ext-xmlwriter": "*", 540 "php": "^5.6 || ^7.0", 541 "phpunit/php-file-iterator": "^1.3", 542 "phpunit/php-text-template": "^1.2", 543 "phpunit/php-token-stream": "^1.4.2 || ^2.0", 544 "sebastian/code-unit-reverse-lookup": "^1.0", 545 "sebastian/environment": "^1.3.2 || ^2.0", 546 "sebastian/version": "^1.0 || ^2.0" 427 "php": ">=7.2", 428 "phpunit/php-file-iterator": "^2.0.2", 429 "phpunit/php-text-template": "^1.2.1", 430 "phpunit/php-token-stream": "^3.1.3 || ^4.0", 431 "sebastian/code-unit-reverse-lookup": "^1.0.1", 432 "sebastian/environment": "^4.2.2", 433 "sebastian/version": "^2.0.1", 434 "theseer/tokenizer": "^1.1.3" 547 435 }, 548 436 "require-dev": { 549 "ext-xdebug": "^2.1.4", 550 "phpunit/phpunit": "^5.7" 437 "phpunit/phpunit": "^8.2.2" 551 438 }, 552 439 "suggest": { 553 "ext-xdebug": "^2. 5.1"554 }, 555 "type": "library", 556 "extra": { 557 "branch-alias": { 558 "dev-master": " 4.0.x-dev"559 } 560 }, 561 "autoload": { 562 "classmap": [ 563 "src/" 564 ] 565 }, 566 "notification-url": "https://packagist.org/downloads/", 567 "license": [ 568 "BSD-3-Clause" 569 ], 570 "authors": [ 571 { 572 "name": "Sebastian Bergmann", 573 "email": "s b@sebastian-bergmann.de",440 "ext-xdebug": "^2.7.2" 441 }, 442 "type": "library", 443 "extra": { 444 "branch-alias": { 445 "dev-master": "7.0-dev" 446 } 447 }, 448 "autoload": { 449 "classmap": [ 450 "src/" 451 ] 452 }, 453 "notification-url": "https://packagist.org/downloads/", 454 "license": [ 455 "BSD-3-Clause" 456 ], 457 "authors": [ 458 { 459 "name": "Sebastian Bergmann", 460 "email": "sebastian@phpunit.de", 574 461 "role": "lead" 575 462 } … … 583 470 ], 584 471 "support": { 585 "irc": "irc://irc.freenode.net/phpunit",586 472 "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 587 "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/4.0" 588 }, 589 "time": "2017-04-02T07:44:40+00:00" 473 "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.17" 474 }, 475 "funding": [ 476 { 477 "url": "https://github.com/sebastianbergmann", 478 "type": "github" 479 } 480 ], 481 "time": "2024-03-02T06:09:37+00:00" 590 482 }, 591 483 { 592 484 "name": "phpunit/php-file-iterator", 593 "version": " 1.4.5",485 "version": "2.0.6", 594 486 "source": { 595 487 "type": "git", 596 488 "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 597 "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" 598 }, 599 "dist": { 600 "type": "zip", 601 "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", 602 "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", 603 "shasum": "" 604 }, 605 "require": { 606 "php": ">=5.3.3" 607 }, 608 "type": "library", 609 "extra": { 610 "branch-alias": { 611 "dev-master": "1.4.x-dev" 612 } 613 }, 614 "autoload": { 615 "classmap": [ 616 "src/" 617 ] 618 }, 619 "notification-url": "https://packagist.org/downloads/", 620 "license": [ 621 "BSD-3-Clause" 622 ], 623 "authors": [ 624 { 625 "name": "Sebastian Bergmann", 626 "email": "sb@sebastian-bergmann.de", 489 "reference": "69deeb8664f611f156a924154985fbd4911eb36b" 490 }, 491 "dist": { 492 "type": "zip", 493 "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/69deeb8664f611f156a924154985fbd4911eb36b", 494 "reference": "69deeb8664f611f156a924154985fbd4911eb36b", 495 "shasum": "" 496 }, 497 "require": { 498 "php": ">=7.1" 499 }, 500 "require-dev": { 501 "phpunit/phpunit": "^8.5" 502 }, 503 "type": "library", 504 "extra": { 505 "branch-alias": { 506 "dev-master": "2.0.x-dev" 507 } 508 }, 509 "autoload": { 510 "classmap": [ 511 "src/" 512 ] 513 }, 514 "notification-url": "https://packagist.org/downloads/", 515 "license": [ 516 "BSD-3-Clause" 517 ], 518 "authors": [ 519 { 520 "name": "Sebastian Bergmann", 521 "email": "sebastian@phpunit.de", 627 522 "role": "lead" 628 523 } … … 635 530 ], 636 531 "support": { 637 "irc": "irc://irc.freenode.net/phpunit",638 532 "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 639 "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/1.4.5" 640 }, 641 "time": "2017-11-27T13:52:08+00:00" 533 "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.6" 534 }, 535 "funding": [ 536 { 537 "url": "https://github.com/sebastianbergmann", 538 "type": "github" 539 } 540 ], 541 "time": "2024-03-01T13:39:50+00:00" 642 542 }, 643 543 { … … 688 588 { 689 589 "name": "phpunit/php-timer", 690 "version": " 1.0.9",590 "version": "2.1.4", 691 591 "source": { 692 592 "type": "git", 693 593 "url": "https://github.com/sebastianbergmann/php-timer.git", 694 "reference": " 3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"695 }, 696 "dist": { 697 "type": "zip", 698 "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/ 3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",699 "reference": " 3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",700 "shasum": "" 701 }, 702 "require": { 703 "php": " ^5.3.3 || ^7.0"594 "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb" 595 }, 596 "dist": { 597 "type": "zip", 598 "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a691211e94ff39a34811abd521c31bd5b305b0bb", 599 "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb", 600 "shasum": "" 601 }, 602 "require": { 603 "php": ">=7.1" 704 604 }, 705 605 "require-dev": { 706 "phpunit/phpunit": "^ 4.8.35 || ^5.7 || ^6.0"707 }, 708 "type": "library", 709 "extra": { 710 "branch-alias": { 711 "dev-master": " 1.0-dev"712 } 713 }, 714 "autoload": { 715 "classmap": [ 716 "src/" 717 ] 718 }, 719 "notification-url": "https://packagist.org/downloads/", 720 "license": [ 721 "BSD-3-Clause" 722 ], 723 "authors": [ 724 { 725 "name": "Sebastian Bergmann", 726 "email": "s b@sebastian-bergmann.de",606 "phpunit/phpunit": "^8.5" 607 }, 608 "type": "library", 609 "extra": { 610 "branch-alias": { 611 "dev-master": "2.1-dev" 612 } 613 }, 614 "autoload": { 615 "classmap": [ 616 "src/" 617 ] 618 }, 619 "notification-url": "https://packagist.org/downloads/", 620 "license": [ 621 "BSD-3-Clause" 622 ], 623 "authors": [ 624 { 625 "name": "Sebastian Bergmann", 626 "email": "sebastian@phpunit.de", 727 627 "role": "lead" 728 628 } … … 735 635 "support": { 736 636 "issues": "https://github.com/sebastianbergmann/php-timer/issues", 737 "source": "https://github.com/sebastianbergmann/php-timer/tree/master" 738 }, 739 "time": "2017-02-26T11:10:40+00:00" 637 "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.4" 638 }, 639 "funding": [ 640 { 641 "url": "https://github.com/sebastianbergmann", 642 "type": "github" 643 } 644 ], 645 "time": "2024-03-01T13:42:41+00:00" 740 646 }, 741 647 { 742 648 "name": "phpunit/php-token-stream", 743 "version": " 2.0.2",649 "version": "4.0.4", 744 650 "source": { 745 651 "type": "git", 746 652 "url": "https://github.com/sebastianbergmann/php-token-stream.git", 747 "reference": " 791198a2c6254db10131eecfe8c06670700904db"748 }, 749 "dist": { 750 "type": "zip", 751 "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/ 791198a2c6254db10131eecfe8c06670700904db",752 "reference": " 791198a2c6254db10131eecfe8c06670700904db",653 "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3" 654 }, 655 "dist": { 656 "type": "zip", 657 "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/a853a0e183b9db7eed023d7933a858fa1c8d25a3", 658 "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3", 753 659 "shasum": "" 754 660 }, 755 661 "require": { 756 662 "ext-tokenizer": "*", 757 "php": "^7. 0"663 "php": "^7.3 || ^8.0" 758 664 }, 759 665 "require-dev": { 760 "phpunit/phpunit": "^ 6.2.4"761 }, 762 "type": "library", 763 "extra": { 764 "branch-alias": { 765 "dev-master": " 2.0-dev"666 "phpunit/phpunit": "^9.0" 667 }, 668 "type": "library", 669 "extra": { 670 "branch-alias": { 671 "dev-master": "4.0-dev" 766 672 } 767 673 }, … … 790 696 "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" 791 697 }, 698 "funding": [ 699 { 700 "url": "https://github.com/sebastianbergmann", 701 "type": "github" 702 } 703 ], 792 704 "abandoned": true, 793 "time": "20 17-11-27T05:48:46+00:00"705 "time": "2020-08-04T08:28:15+00:00" 794 706 }, 795 707 { 796 708 "name": "phpunit/phpunit", 797 "version": " 5.7.19",709 "version": "8.5.52", 798 710 "source": { 799 711 "type": "git", 800 712 "url": "https://github.com/sebastianbergmann/phpunit.git", 801 "reference": "69c4f49ff376af2692bad9cebd883d17ebaa98a1" 802 }, 803 "dist": { 804 "type": "zip", 805 "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/69c4f49ff376af2692bad9cebd883d17ebaa98a1", 806 "reference": "69c4f49ff376af2692bad9cebd883d17ebaa98a1", 807 "shasum": "" 808 }, 809 "require": { 713 "reference": "1015741814413c156abb0f53d7db7bbd03c6e858" 714 }, 715 "dist": { 716 "type": "zip", 717 "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1015741814413c156abb0f53d7db7bbd03c6e858", 718 "reference": "1015741814413c156abb0f53d7db7bbd03c6e858", 719 "shasum": "" 720 }, 721 "require": { 722 "doctrine/instantiator": "^1.5.0", 810 723 "ext-dom": "*", 811 724 "ext-json": "*", … … 813 726 "ext-mbstring": "*", 814 727 "ext-xml": "*", 815 "myclabs/deep-copy": "~1.3", 816 "php": "^5.6 || ^7.0", 817 "phpspec/prophecy": "^1.6.2", 818 "phpunit/php-code-coverage": "^4.0.4", 819 "phpunit/php-file-iterator": "~1.4", 820 "phpunit/php-text-template": "~1.2", 821 "phpunit/php-timer": "^1.0.6", 822 "phpunit/phpunit-mock-objects": "^3.2", 823 "sebastian/comparator": "^1.2.4", 824 "sebastian/diff": "~1.2", 825 "sebastian/environment": "^1.3.4 || ^2.0", 826 "sebastian/exporter": "~2.0", 827 "sebastian/global-state": "^1.1", 828 "sebastian/object-enumerator": "~2.0", 829 "sebastian/resource-operations": "~1.0", 830 "sebastian/version": "~1.0.3|~2.0", 831 "symfony/yaml": "~2.1|~3.0" 832 }, 833 "conflict": { 834 "phpdocumentor/reflection-docblock": "3.0.2" 835 }, 836 "require-dev": { 837 "ext-pdo": "*" 728 "ext-xmlwriter": "*", 729 "myclabs/deep-copy": "^1.13.4", 730 "phar-io/manifest": "^2.0.4", 731 "phar-io/version": "^3.2.1", 732 "php": ">=7.2", 733 "phpunit/php-code-coverage": "^7.0.17", 734 "phpunit/php-file-iterator": "^2.0.6", 735 "phpunit/php-text-template": "^1.2.1", 736 "phpunit/php-timer": "^2.1.4", 737 "sebastian/comparator": "^3.0.7", 738 "sebastian/diff": "^3.0.6", 739 "sebastian/environment": "^4.2.5", 740 "sebastian/exporter": "^3.1.8", 741 "sebastian/global-state": "^3.0.6", 742 "sebastian/object-enumerator": "^3.0.5", 743 "sebastian/resource-operations": "^2.0.3", 744 "sebastian/type": "^1.1.5", 745 "sebastian/version": "^2.0.1" 838 746 }, 839 747 "suggest": { 840 "ext-xdebug": "*", 841 "phpunit/php-invoker": "~1.1" 748 "ext-soap": "To be able to generate mocks based on WSDL files", 749 "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage", 750 "phpunit/php-invoker": "To allow enforcing time limits" 842 751 }, 843 752 "bin": [ … … 847 756 "extra": { 848 757 "branch-alias": { 849 "dev-master": " 5.7.x-dev"758 "dev-master": "8.5-dev" 850 759 } 851 760 }, … … 875 784 "support": { 876 785 "issues": "https://github.com/sebastianbergmann/phpunit/issues", 877 "source": "https://github.com/sebastianbergmann/phpunit/tree/5.7.19" 878 }, 879 "time": "2017-04-03T02:22:27+00:00" 880 }, 881 { 882 "name": "phpunit/phpunit-mock-objects", 883 "version": "3.4.4", 884 "source": { 885 "type": "git", 886 "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", 887 "reference": "a23b761686d50a560cc56233b9ecf49597cc9118" 888 }, 889 "dist": { 890 "type": "zip", 891 "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118", 892 "reference": "a23b761686d50a560cc56233b9ecf49597cc9118", 893 "shasum": "" 894 }, 895 "require": { 896 "doctrine/instantiator": "^1.0.2", 897 "php": "^5.6 || ^7.0", 898 "phpunit/php-text-template": "^1.2", 899 "sebastian/exporter": "^1.2 || ^2.0" 900 }, 901 "conflict": { 902 "phpunit/phpunit": "<5.4.0" 903 }, 904 "require-dev": { 905 "phpunit/phpunit": "^5.4" 906 }, 907 "suggest": { 908 "ext-soap": "*" 909 }, 910 "type": "library", 911 "extra": { 912 "branch-alias": { 913 "dev-master": "3.2.x-dev" 914 } 915 }, 916 "autoload": { 917 "classmap": [ 918 "src/" 919 ] 920 }, 921 "notification-url": "https://packagist.org/downloads/", 922 "license": [ 923 "BSD-3-Clause" 924 ], 925 "authors": [ 926 { 927 "name": "Sebastian Bergmann", 928 "email": "sb@sebastian-bergmann.de", 929 "role": "lead" 930 } 931 ], 932 "description": "Mock Object library for PHPUnit", 933 "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", 934 "keywords": [ 935 "mock", 936 "xunit" 937 ], 938 "support": { 939 "irc": "irc://irc.freenode.net/phpunit", 940 "issues": "https://github.com/sebastianbergmann/phpunit-mock-objects/issues", 941 "source": "https://github.com/sebastianbergmann/phpunit-mock-objects/tree/3.4" 942 }, 943 "abandoned": true, 944 "time": "2017-06-30T09:13:00+00:00" 786 "security": "https://github.com/sebastianbergmann/phpunit/security/policy", 787 "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.52" 788 }, 789 "funding": [ 790 { 791 "url": "https://phpunit.de/sponsors.html", 792 "type": "custom" 793 }, 794 { 795 "url": "https://github.com/sebastianbergmann", 796 "type": "github" 797 }, 798 { 799 "url": "https://liberapay.com/sebastianbergmann", 800 "type": "liberapay" 801 }, 802 { 803 "url": "https://thanks.dev/u/gh/sebastianbergmann", 804 "type": "thanks_dev" 805 }, 806 { 807 "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 808 "type": "tidelift" 809 } 810 ], 811 "time": "2026-01-27T05:20:18+00:00" 945 812 }, 946 813 { 947 814 "name": "sebastian/code-unit-reverse-lookup", 948 "version": "1.0. 2",815 "version": "1.0.3", 949 816 "source": { 950 817 "type": "git", 951 818 "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 952 "reference": " 1de8cd5c010cb153fcd68b8d0f64606f523f7619"953 }, 954 "dist": { 955 "type": "zip", 956 "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ 1de8cd5c010cb153fcd68b8d0f64606f523f7619",957 "reference": " 1de8cd5c010cb153fcd68b8d0f64606f523f7619",819 "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54" 820 }, 821 "dist": { 822 "type": "zip", 823 "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", 824 "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", 958 825 "shasum": "" 959 826 }, … … 989 856 "support": { 990 857 "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 991 "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0. 2"858 "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.3" 992 859 }, 993 860 "funding": [ … … 997 864 } 998 865 ], 999 "time": "202 0-11-30T08:15:22+00:00"866 "time": "2024-03-01T13:45:45+00:00" 1000 867 }, 1001 868 { 1002 869 "name": "sebastian/comparator", 1003 "version": " 1.2.4",870 "version": "3.0.7", 1004 871 "source": { 1005 872 "type": "git", 1006 873 "url": "https://github.com/sebastianbergmann/comparator.git", 1007 "reference": " 2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"1008 }, 1009 "dist": { 1010 "type": "zip", 1011 "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/ 2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",1012 "reference": " 2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",1013 "shasum": "" 1014 }, 1015 "require": { 1016 "php": ">= 5.3.3",1017 "sebastian/diff": " ~1.2",1018 "sebastian/exporter": " ~1.2 || ~2.0"874 "reference": "bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52" 875 }, 876 "dist": { 877 "type": "zip", 878 "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52", 879 "reference": "bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52", 880 "shasum": "" 881 }, 882 "require": { 883 "php": ">=7.1", 884 "sebastian/diff": "^3.0", 885 "sebastian/exporter": "^3.1" 1019 886 }, 1020 887 "require-dev": { 1021 "phpunit/phpunit": "~4.4" 1022 }, 1023 "type": "library", 1024 "extra": { 1025 "branch-alias": { 1026 "dev-master": "1.2.x-dev" 1027 } 1028 }, 1029 "autoload": { 1030 "classmap": [ 1031 "src/" 1032 ] 1033 }, 1034 "notification-url": "https://packagist.org/downloads/", 1035 "license": [ 1036 "BSD-3-Clause" 1037 ], 1038 "authors": [ 888 "phpunit/phpunit": "^8.5" 889 }, 890 "type": "library", 891 "extra": { 892 "branch-alias": { 893 "dev-master": "3.0-dev" 894 } 895 }, 896 "autoload": { 897 "classmap": [ 898 "src/" 899 ] 900 }, 901 "notification-url": "https://packagist.org/downloads/", 902 "license": [ 903 "BSD-3-Clause" 904 ], 905 "authors": [ 906 { 907 "name": "Sebastian Bergmann", 908 "email": "sebastian@phpunit.de" 909 }, 1039 910 { 1040 911 "name": "Jeff Welch", … … 1048 919 "name": "Bernhard Schussek", 1049 920 "email": "bschussek@2bepublished.at" 1050 },1051 {1052 "name": "Sebastian Bergmann",1053 "email": "sebastian@phpunit.de"1054 921 } 1055 922 ], 1056 923 "description": "Provides the functionality to compare PHP values for equality", 1057 "homepage": "http ://www.github.com/sebastianbergmann/comparator",924 "homepage": "https://github.com/sebastianbergmann/comparator", 1058 925 "keywords": [ 1059 926 "comparator", … … 1063 930 "support": { 1064 931 "issues": "https://github.com/sebastianbergmann/comparator/issues", 1065 "source": "https://github.com/sebastianbergmann/comparator/tree/1.2" 1066 }, 1067 "time": "2017-01-29T09:50:25+00:00" 932 "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.7" 933 }, 934 "funding": [ 935 { 936 "url": "https://github.com/sebastianbergmann", 937 "type": "github" 938 }, 939 { 940 "url": "https://liberapay.com/sebastianbergmann", 941 "type": "liberapay" 942 }, 943 { 944 "url": "https://thanks.dev/u/gh/sebastianbergmann", 945 "type": "thanks_dev" 946 }, 947 { 948 "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", 949 "type": "tidelift" 950 } 951 ], 952 "time": "2026-01-24T09:20:25+00:00" 1068 953 }, 1069 954 { 1070 955 "name": "sebastian/diff", 1071 "version": " 1.4.3",956 "version": "3.0.6", 1072 957 "source": { 1073 958 "type": "git", 1074 959 "url": "https://github.com/sebastianbergmann/diff.git", 1075 "reference": " 7f066a26a962dbe58ddea9f72a4e82874a3975a4"1076 }, 1077 "dist": { 1078 "type": "zip", 1079 "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ 7f066a26a962dbe58ddea9f72a4e82874a3975a4",1080 "reference": " 7f066a26a962dbe58ddea9f72a4e82874a3975a4",1081 "shasum": "" 1082 }, 1083 "require": { 1084 "php": " ^5.3.3 || ^7.0"960 "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6" 961 }, 962 "dist": { 963 "type": "zip", 964 "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/98ff311ca519c3aa73ccd3de053bdb377171d7b6", 965 "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6", 966 "shasum": "" 967 }, 968 "require": { 969 "php": ">=7.1" 1085 970 }, 1086 971 "require-dev": { 1087 "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" 1088 }, 1089 "type": "library", 1090 "extra": { 1091 "branch-alias": { 1092 "dev-master": "1.4-dev" 1093 } 1094 }, 1095 "autoload": { 1096 "classmap": [ 1097 "src/" 1098 ] 1099 }, 1100 "notification-url": "https://packagist.org/downloads/", 1101 "license": [ 1102 "BSD-3-Clause" 1103 ], 1104 "authors": [ 972 "phpunit/phpunit": "^7.5 || ^8.0", 973 "symfony/process": "^2 || ^3.3 || ^4" 974 }, 975 "type": "library", 976 "extra": { 977 "branch-alias": { 978 "dev-master": "3.0-dev" 979 } 980 }, 981 "autoload": { 982 "classmap": [ 983 "src/" 984 ] 985 }, 986 "notification-url": "https://packagist.org/downloads/", 987 "license": [ 988 "BSD-3-Clause" 989 ], 990 "authors": [ 991 { 992 "name": "Sebastian Bergmann", 993 "email": "sebastian@phpunit.de" 994 }, 1105 995 { 1106 996 "name": "Kore Nordmann", 1107 997 "email": "mail@kore-nordmann.de" 1108 },1109 {1110 "name": "Sebastian Bergmann",1111 "email": "sebastian@phpunit.de"1112 998 } 1113 999 ], … … 1115 1001 "homepage": "https://github.com/sebastianbergmann/diff", 1116 1002 "keywords": [ 1117 "diff" 1003 "diff", 1004 "udiff", 1005 "unidiff", 1006 "unified diff" 1118 1007 ], 1119 1008 "support": { 1120 1009 "issues": "https://github.com/sebastianbergmann/diff/issues", 1121 "source": "https://github.com/sebastianbergmann/diff/tree/1.4" 1122 }, 1123 "time": "2017-05-22T07:24:03+00:00" 1010 "source": "https://github.com/sebastianbergmann/diff/tree/3.0.6" 1011 }, 1012 "funding": [ 1013 { 1014 "url": "https://github.com/sebastianbergmann", 1015 "type": "github" 1016 } 1017 ], 1018 "time": "2024-03-02T06:16:36+00:00" 1124 1019 }, 1125 1020 { 1126 1021 "name": "sebastian/environment", 1127 "version": " 2.0.0",1022 "version": "4.2.5", 1128 1023 "source": { 1129 1024 "type": "git", 1130 1025 "url": "https://github.com/sebastianbergmann/environment.git", 1131 "reference": "5 795ffe5dc5b02460c3e34222fee8cbe245d8fac"1132 }, 1133 "dist": { 1134 "type": "zip", 1135 "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5 795ffe5dc5b02460c3e34222fee8cbe245d8fac",1136 "reference": "5 795ffe5dc5b02460c3e34222fee8cbe245d8fac",1137 "shasum": "" 1138 }, 1139 "require": { 1140 "php": " ^5.6 || ^7.0"1026 "reference": "56932f6049a0482853056ffd617c91ffcc754205" 1027 }, 1028 "dist": { 1029 "type": "zip", 1030 "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/56932f6049a0482853056ffd617c91ffcc754205", 1031 "reference": "56932f6049a0482853056ffd617c91ffcc754205", 1032 "shasum": "" 1033 }, 1034 "require": { 1035 "php": ">=7.1" 1141 1036 }, 1142 1037 "require-dev": { 1143 "phpunit/phpunit": "^5.0" 1144 }, 1145 "type": "library", 1146 "extra": { 1147 "branch-alias": { 1148 "dev-master": "2.0.x-dev" 1038 "phpunit/phpunit": "^7.5" 1039 }, 1040 "suggest": { 1041 "ext-posix": "*" 1042 }, 1043 "type": "library", 1044 "extra": { 1045 "branch-alias": { 1046 "dev-master": "4.2-dev" 1149 1047 } 1150 1048 }, … … 1173 1071 "support": { 1174 1072 "issues": "https://github.com/sebastianbergmann/environment/issues", 1175 "source": "https://github.com/sebastianbergmann/environment/tree/master" 1176 }, 1177 "time": "2016-11-26T07:53:53+00:00" 1073 "source": "https://github.com/sebastianbergmann/environment/tree/4.2.5" 1074 }, 1075 "funding": [ 1076 { 1077 "url": "https://github.com/sebastianbergmann", 1078 "type": "github" 1079 } 1080 ], 1081 "time": "2024-03-01T13:49:59+00:00" 1178 1082 }, 1179 1083 { 1180 1084 "name": "sebastian/exporter", 1181 "version": " 2.0.0",1085 "version": "3.1.8", 1182 1086 "source": { 1183 1087 "type": "git", 1184 1088 "url": "https://github.com/sebastianbergmann/exporter.git", 1185 "reference": " ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"1186 }, 1187 "dist": { 1188 "type": "zip", 1189 "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",1190 "reference": " ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",1191 "shasum": "" 1192 }, 1193 "require": { 1194 "php": ">= 5.3.3",1195 "sebastian/recursion-context": " ~2.0"1089 "reference": "64cfeaa341951ceb2019d7b98232399d57bb2296" 1090 }, 1091 "dist": { 1092 "type": "zip", 1093 "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64cfeaa341951ceb2019d7b98232399d57bb2296", 1094 "reference": "64cfeaa341951ceb2019d7b98232399d57bb2296", 1095 "shasum": "" 1096 }, 1097 "require": { 1098 "php": ">=7.2", 1099 "sebastian/recursion-context": "^3.0" 1196 1100 }, 1197 1101 "require-dev": { 1198 1102 "ext-mbstring": "*", 1199 "phpunit/phpunit": "~4.4" 1200 }, 1201 "type": "library", 1202 "extra": { 1203 "branch-alias": { 1204 "dev-master": "2.0.x-dev" 1205 } 1206 }, 1207 "autoload": { 1208 "classmap": [ 1209 "src/" 1210 ] 1211 }, 1212 "notification-url": "https://packagist.org/downloads/", 1213 "license": [ 1214 "BSD-3-Clause" 1215 ], 1216 "authors": [ 1103 "phpunit/phpunit": "^8.5" 1104 }, 1105 "type": "library", 1106 "extra": { 1107 "branch-alias": { 1108 "dev-master": "3.1.x-dev" 1109 } 1110 }, 1111 "autoload": { 1112 "classmap": [ 1113 "src/" 1114 ] 1115 }, 1116 "notification-url": "https://packagist.org/downloads/", 1117 "license": [ 1118 "BSD-3-Clause" 1119 ], 1120 "authors": [ 1121 { 1122 "name": "Sebastian Bergmann", 1123 "email": "sebastian@phpunit.de" 1124 }, 1217 1125 { 1218 1126 "name": "Jeff Welch", … … 1224 1132 }, 1225 1133 { 1226 "name": "Bernhard Schussek",1227 "email": "bschussek@2bepublished.at"1228 },1229 {1230 "name": "Sebastian Bergmann",1231 "email": "sebastian@phpunit.de"1232 },1233 {1234 1134 "name": "Adam Harvey", 1235 1135 "email": "aharvey@php.net" 1136 }, 1137 { 1138 "name": "Bernhard Schussek", 1139 "email": "bschussek@gmail.com" 1236 1140 } 1237 1141 ], … … 1244 1148 "support": { 1245 1149 "issues": "https://github.com/sebastianbergmann/exporter/issues", 1246 "source": "https://github.com/sebastianbergmann/exporter/tree/master" 1247 }, 1248 "time": "2016-11-19T08:54:04+00:00" 1150 "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.8" 1151 }, 1152 "funding": [ 1153 { 1154 "url": "https://github.com/sebastianbergmann", 1155 "type": "github" 1156 }, 1157 { 1158 "url": "https://liberapay.com/sebastianbergmann", 1159 "type": "liberapay" 1160 }, 1161 { 1162 "url": "https://thanks.dev/u/gh/sebastianbergmann", 1163 "type": "thanks_dev" 1164 }, 1165 { 1166 "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", 1167 "type": "tidelift" 1168 } 1169 ], 1170 "time": "2025-09-24T05:55:14+00:00" 1249 1171 }, 1250 1172 { 1251 1173 "name": "sebastian/global-state", 1252 "version": " 1.1.1",1174 "version": "3.0.6", 1253 1175 "source": { 1254 1176 "type": "git", 1255 1177 "url": "https://github.com/sebastianbergmann/global-state.git", 1256 "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" 1257 }, 1258 "dist": { 1259 "type": "zip", 1260 "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", 1261 "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", 1262 "shasum": "" 1263 }, 1264 "require": { 1265 "php": ">=5.3.3" 1178 "reference": "800689427e3e8cf57a8fe38fcd1d4344c9b2f046" 1179 }, 1180 "dist": { 1181 "type": "zip", 1182 "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/800689427e3e8cf57a8fe38fcd1d4344c9b2f046", 1183 "reference": "800689427e3e8cf57a8fe38fcd1d4344c9b2f046", 1184 "shasum": "" 1185 }, 1186 "require": { 1187 "php": ">=7.2", 1188 "sebastian/object-reflector": "^1.1.1", 1189 "sebastian/recursion-context": "^3.0" 1266 1190 }, 1267 1191 "require-dev": { 1268 "phpunit/phpunit": "~4.2" 1192 "ext-dom": "*", 1193 "phpunit/phpunit": "^8.0" 1269 1194 }, 1270 1195 "suggest": { … … 1274 1199 "extra": { 1275 1200 "branch-alias": { 1276 "dev-master": " 1.0-dev"1201 "dev-master": "3.0-dev" 1277 1202 } 1278 1203 }, … … 1299 1224 "support": { 1300 1225 "issues": "https://github.com/sebastianbergmann/global-state/issues", 1301 "source": "https://github.com/sebastianbergmann/global-state/tree/1.1.1" 1302 }, 1303 "time": "2015-10-12T03:26:01+00:00" 1226 "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.6" 1227 }, 1228 "funding": [ 1229 { 1230 "url": "https://github.com/sebastianbergmann", 1231 "type": "github" 1232 }, 1233 { 1234 "url": "https://liberapay.com/sebastianbergmann", 1235 "type": "liberapay" 1236 }, 1237 { 1238 "url": "https://thanks.dev/u/gh/sebastianbergmann", 1239 "type": "thanks_dev" 1240 }, 1241 { 1242 "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state", 1243 "type": "tidelift" 1244 } 1245 ], 1246 "time": "2025-08-10T05:40:12+00:00" 1304 1247 }, 1305 1248 { 1306 1249 "name": "sebastian/object-enumerator", 1307 "version": " 2.0.1",1250 "version": "3.0.5", 1308 1251 "source": { 1309 1252 "type": "git", 1310 1253 "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1311 "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" 1312 }, 1313 "dist": { 1314 "type": "zip", 1315 "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", 1316 "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", 1317 "shasum": "" 1318 }, 1319 "require": { 1320 "php": ">=5.6", 1321 "sebastian/recursion-context": "~2.0" 1254 "reference": "ac5b293dba925751b808e02923399fb44ff0d541" 1255 }, 1256 "dist": { 1257 "type": "zip", 1258 "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/ac5b293dba925751b808e02923399fb44ff0d541", 1259 "reference": "ac5b293dba925751b808e02923399fb44ff0d541", 1260 "shasum": "" 1261 }, 1262 "require": { 1263 "php": ">=7.0", 1264 "sebastian/object-reflector": "^1.1.1", 1265 "sebastian/recursion-context": "^3.0" 1322 1266 }, 1323 1267 "require-dev": { 1324 "phpunit/phpunit": " ~5"1325 }, 1326 "type": "library", 1327 "extra": { 1328 "branch-alias": { 1329 "dev-master": " 2.0.x-dev"1268 "phpunit/phpunit": "^6.0" 1269 }, 1270 "type": "library", 1271 "extra": { 1272 "branch-alias": { 1273 "dev-master": "3.0.x-dev" 1330 1274 } 1331 1275 }, … … 1349 1293 "support": { 1350 1294 "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 1351 "source": "https://github.com/sebastianbergmann/object-enumerator/tree/master" 1352 }, 1353 "time": "2017-02-18T15:18:39+00:00" 1295 "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.5" 1296 }, 1297 "funding": [ 1298 { 1299 "url": "https://github.com/sebastianbergmann", 1300 "type": "github" 1301 } 1302 ], 1303 "time": "2024-03-01T13:54:02+00:00" 1304 }, 1305 { 1306 "name": "sebastian/object-reflector", 1307 "version": "1.1.3", 1308 "source": { 1309 "type": "git", 1310 "url": "https://github.com/sebastianbergmann/object-reflector.git", 1311 "reference": "1d439c229e61f244ff1f211e5c99737f90c67def" 1312 }, 1313 "dist": { 1314 "type": "zip", 1315 "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/1d439c229e61f244ff1f211e5c99737f90c67def", 1316 "reference": "1d439c229e61f244ff1f211e5c99737f90c67def", 1317 "shasum": "" 1318 }, 1319 "require": { 1320 "php": ">=7.0" 1321 }, 1322 "require-dev": { 1323 "phpunit/phpunit": "^6.0" 1324 }, 1325 "type": "library", 1326 "extra": { 1327 "branch-alias": { 1328 "dev-master": "1.1-dev" 1329 } 1330 }, 1331 "autoload": { 1332 "classmap": [ 1333 "src/" 1334 ] 1335 }, 1336 "notification-url": "https://packagist.org/downloads/", 1337 "license": [ 1338 "BSD-3-Clause" 1339 ], 1340 "authors": [ 1341 { 1342 "name": "Sebastian Bergmann", 1343 "email": "sebastian@phpunit.de" 1344 } 1345 ], 1346 "description": "Allows reflection of object attributes, including inherited and non-public ones", 1347 "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1348 "support": { 1349 "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 1350 "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.3" 1351 }, 1352 "funding": [ 1353 { 1354 "url": "https://github.com/sebastianbergmann", 1355 "type": "github" 1356 } 1357 ], 1358 "time": "2024-03-01T13:56:04+00:00" 1354 1359 }, 1355 1360 { 1356 1361 "name": "sebastian/recursion-context", 1357 "version": " 2.0.0",1362 "version": "3.0.3", 1358 1363 "source": { 1359 1364 "type": "git", 1360 1365 "url": "https://github.com/sebastianbergmann/recursion-context.git", 1361 "reference": " 2c3ba150cbec723aa057506e73a8d33bdb286c9a"1362 }, 1363 "dist": { 1364 "type": "zip", 1365 "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/ 2c3ba150cbec723aa057506e73a8d33bdb286c9a",1366 "reference": " 2c3ba150cbec723aa057506e73a8d33bdb286c9a",1367 "shasum": "" 1368 }, 1369 "require": { 1370 "php": ">= 5.3.3"1366 "reference": "8fe7e75986a9d24b4cceae847314035df7703a5a" 1367 }, 1368 "dist": { 1369 "type": "zip", 1370 "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/8fe7e75986a9d24b4cceae847314035df7703a5a", 1371 "reference": "8fe7e75986a9d24b4cceae847314035df7703a5a", 1372 "shasum": "" 1373 }, 1374 "require": { 1375 "php": ">=7.0" 1371 1376 }, 1372 1377 "require-dev": { 1373 "phpunit/phpunit": "~4.4" 1374 }, 1375 "type": "library", 1376 "extra": { 1377 "branch-alias": { 1378 "dev-master": "2.0.x-dev" 1379 } 1380 }, 1381 "autoload": { 1382 "classmap": [ 1383 "src/" 1384 ] 1385 }, 1386 "notification-url": "https://packagist.org/downloads/", 1387 "license": [ 1388 "BSD-3-Clause" 1389 ], 1390 "authors": [ 1378 "phpunit/phpunit": "^6.0" 1379 }, 1380 "type": "library", 1381 "extra": { 1382 "branch-alias": { 1383 "dev-master": "3.0.x-dev" 1384 } 1385 }, 1386 "autoload": { 1387 "classmap": [ 1388 "src/" 1389 ] 1390 }, 1391 "notification-url": "https://packagist.org/downloads/", 1392 "license": [ 1393 "BSD-3-Clause" 1394 ], 1395 "authors": [ 1396 { 1397 "name": "Sebastian Bergmann", 1398 "email": "sebastian@phpunit.de" 1399 }, 1391 1400 { 1392 1401 "name": "Jeff Welch", … … 1394 1403 }, 1395 1404 { 1396 "name": "Sebastian Bergmann",1397 "email": "sebastian@phpunit.de"1398 },1399 {1400 1405 "name": "Adam Harvey", 1401 1406 "email": "aharvey@php.net" … … 1406 1411 "support": { 1407 1412 "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 1408 "source": "https://github.com/sebastianbergmann/recursion-context/tree/master" 1409 }, 1410 "time": "2016-11-19T07:33:16+00:00" 1413 "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.3" 1414 }, 1415 "funding": [ 1416 { 1417 "url": "https://github.com/sebastianbergmann", 1418 "type": "github" 1419 }, 1420 { 1421 "url": "https://liberapay.com/sebastianbergmann", 1422 "type": "liberapay" 1423 }, 1424 { 1425 "url": "https://thanks.dev/u/gh/sebastianbergmann", 1426 "type": "thanks_dev" 1427 }, 1428 { 1429 "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", 1430 "type": "tidelift" 1431 } 1432 ], 1433 "time": "2025-08-10T05:25:53+00:00" 1411 1434 }, 1412 1435 { 1413 1436 "name": "sebastian/resource-operations", 1414 "version": " 1.0.0",1437 "version": "2.0.3", 1415 1438 "source": { 1416 1439 "type": "git", 1417 1440 "url": "https://github.com/sebastianbergmann/resource-operations.git", 1418 "reference": " ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"1419 }, 1420 "dist": { 1421 "type": "zip", 1422 "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",1423 "reference": " ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",1424 "shasum": "" 1425 }, 1426 "require": { 1427 "php": ">= 5.6.0"1428 }, 1429 "type": "library", 1430 "extra": { 1431 "branch-alias": { 1432 "dev-master": " 1.0.x-dev"1441 "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee" 1442 }, 1443 "dist": { 1444 "type": "zip", 1445 "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/72a7f7674d053d548003b16ff5a106e7e0e06eee", 1446 "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee", 1447 "shasum": "" 1448 }, 1449 "require": { 1450 "php": ">=7.1" 1451 }, 1452 "type": "library", 1453 "extra": { 1454 "branch-alias": { 1455 "dev-master": "2.0-dev" 1433 1456 } 1434 1457 }, … … 1451 1474 "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1452 1475 "support": { 1453 "issues": "https://github.com/sebastianbergmann/resource-operations/issues", 1454 "source": "https://github.com/sebastianbergmann/resource-operations/tree/master" 1455 }, 1456 "time": "2015-07-28T20:34:47+00:00" 1476 "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.3" 1477 }, 1478 "funding": [ 1479 { 1480 "url": "https://github.com/sebastianbergmann", 1481 "type": "github" 1482 } 1483 ], 1484 "time": "2024-03-01T13:59:09+00:00" 1485 }, 1486 { 1487 "name": "sebastian/type", 1488 "version": "1.1.5", 1489 "source": { 1490 "type": "git", 1491 "url": "https://github.com/sebastianbergmann/type.git", 1492 "reference": "18f071c3a29892b037d35e6b20ddf3ea39b42874" 1493 }, 1494 "dist": { 1495 "type": "zip", 1496 "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/18f071c3a29892b037d35e6b20ddf3ea39b42874", 1497 "reference": "18f071c3a29892b037d35e6b20ddf3ea39b42874", 1498 "shasum": "" 1499 }, 1500 "require": { 1501 "php": ">=7.2" 1502 }, 1503 "require-dev": { 1504 "phpunit/phpunit": "^8.2" 1505 }, 1506 "type": "library", 1507 "extra": { 1508 "branch-alias": { 1509 "dev-master": "1.1-dev" 1510 } 1511 }, 1512 "autoload": { 1513 "classmap": [ 1514 "src/" 1515 ] 1516 }, 1517 "notification-url": "https://packagist.org/downloads/", 1518 "license": [ 1519 "BSD-3-Clause" 1520 ], 1521 "authors": [ 1522 { 1523 "name": "Sebastian Bergmann", 1524 "email": "sebastian@phpunit.de", 1525 "role": "lead" 1526 } 1527 ], 1528 "description": "Collection of value objects that represent the types of the PHP type system", 1529 "homepage": "https://github.com/sebastianbergmann/type", 1530 "support": { 1531 "issues": "https://github.com/sebastianbergmann/type/issues", 1532 "source": "https://github.com/sebastianbergmann/type/tree/1.1.5" 1533 }, 1534 "funding": [ 1535 { 1536 "url": "https://github.com/sebastianbergmann", 1537 "type": "github" 1538 } 1539 ], 1540 "time": "2024-03-01T14:04:07+00:00" 1457 1541 }, 1458 1542 { … … 1562 1646 }, 1563 1647 { 1564 "name": "symfony/polyfill-ctype", 1565 "version": "v1.26.0", 1566 "source": { 1567 "type": "git", 1568 "url": "https://github.com/symfony/polyfill-ctype.git", 1569 "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" 1570 }, 1571 "dist": { 1572 "type": "zip", 1573 "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", 1574 "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", 1575 "shasum": "" 1576 }, 1577 "require": { 1578 "php": ">=7.1" 1579 }, 1580 "provide": { 1581 "ext-ctype": "*" 1582 }, 1583 "suggest": { 1584 "ext-ctype": "For best performance" 1585 }, 1586 "type": "library", 1587 "extra": { 1588 "branch-alias": { 1589 "dev-main": "1.26-dev" 1590 }, 1591 "thanks": { 1592 "name": "symfony/polyfill", 1593 "url": "https://github.com/symfony/polyfill" 1594 } 1595 }, 1596 "autoload": { 1597 "files": [ 1598 "bootstrap.php" 1599 ], 1600 "psr-4": { 1601 "Symfony\\Polyfill\\Ctype\\": "" 1602 } 1603 }, 1604 "notification-url": "https://packagist.org/downloads/", 1605 "license": [ 1606 "MIT" 1607 ], 1608 "authors": [ 1609 { 1610 "name": "Gert de Pagter", 1611 "email": "BackEndTea@gmail.com" 1612 }, 1613 { 1614 "name": "Symfony Community", 1615 "homepage": "https://symfony.com/contributors" 1616 } 1617 ], 1618 "description": "Symfony polyfill for ctype functions", 1619 "homepage": "https://symfony.com", 1620 "keywords": [ 1621 "compatibility", 1622 "ctype", 1623 "polyfill", 1624 "portable" 1625 ], 1626 "support": { 1627 "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" 1628 }, 1629 "funding": [ 1630 { 1631 "url": "https://symfony.com/sponsor", 1632 "type": "custom" 1633 }, 1634 { 1635 "url": "https://github.com/fabpot", 1636 "type": "github" 1637 }, 1638 { 1639 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1640 "type": "tidelift" 1641 } 1642 ], 1643 "time": "2022-05-24T11:49:31+00:00" 1644 }, 1645 { 1646 "name": "symfony/yaml", 1647 "version": "v3.4.47", 1648 "source": { 1649 "type": "git", 1650 "url": "https://github.com/symfony/yaml.git", 1651 "reference": "88289caa3c166321883f67fe5130188ebbb47094" 1652 }, 1653 "dist": { 1654 "type": "zip", 1655 "url": "https://api.github.com/repos/symfony/yaml/zipball/88289caa3c166321883f67fe5130188ebbb47094", 1656 "reference": "88289caa3c166321883f67fe5130188ebbb47094", 1657 "shasum": "" 1658 }, 1659 "require": { 1660 "php": "^5.5.9|>=7.0.8", 1661 "symfony/polyfill-ctype": "~1.8" 1662 }, 1663 "conflict": { 1664 "symfony/console": "<3.4" 1665 }, 1666 "require-dev": { 1667 "symfony/console": "~3.4|~4.0" 1668 }, 1669 "suggest": { 1670 "symfony/console": "For validating YAML files using the lint command" 1671 }, 1672 "type": "library", 1673 "autoload": { 1674 "psr-4": { 1675 "Symfony\\Component\\Yaml\\": "" 1676 }, 1677 "exclude-from-classmap": [ 1678 "/Tests/" 1679 ] 1680 }, 1681 "notification-url": "https://packagist.org/downloads/", 1682 "license": [ 1683 "MIT" 1684 ], 1685 "authors": [ 1686 { 1687 "name": "Fabien Potencier", 1688 "email": "fabien@symfony.com" 1689 }, 1690 { 1691 "name": "Symfony Community", 1692 "homepage": "https://symfony.com/contributors" 1693 } 1694 ], 1695 "description": "Symfony Yaml Component", 1696 "homepage": "https://symfony.com", 1697 "support": { 1698 "source": "https://github.com/symfony/yaml/tree/v3.4.47" 1699 }, 1700 "funding": [ 1701 { 1702 "url": "https://symfony.com/sponsor", 1703 "type": "custom" 1704 }, 1705 { 1706 "url": "https://github.com/fabpot", 1707 "type": "github" 1708 }, 1709 { 1710 "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", 1711 "type": "tidelift" 1712 } 1713 ], 1714 "time": "2020-10-24T10:57:07+00:00" 1715 }, 1716 { 1717 "name": "webmozart/assert", 1718 "version": "1.11.0", 1719 "source": { 1720 "type": "git", 1721 "url": "https://github.com/webmozarts/assert.git", 1722 "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" 1723 }, 1724 "dist": { 1725 "type": "zip", 1726 "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", 1727 "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", 1728 "shasum": "" 1729 }, 1730 "require": { 1731 "ext-ctype": "*", 1648 "name": "theseer/tokenizer", 1649 "version": "1.3.1", 1650 "source": { 1651 "type": "git", 1652 "url": "https://github.com/theseer/tokenizer.git", 1653 "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" 1654 }, 1655 "dist": { 1656 "type": "zip", 1657 "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", 1658 "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", 1659 "shasum": "" 1660 }, 1661 "require": { 1662 "ext-dom": "*", 1663 "ext-tokenizer": "*", 1664 "ext-xmlwriter": "*", 1732 1665 "php": "^7.2 || ^8.0" 1733 1666 }, 1734 "conflict": { 1735 "phpstan/phpstan": "<0.12.20", 1736 "vimeo/psalm": "<4.6.1 || 4.6.2" 1737 }, 1738 "require-dev": { 1739 "phpunit/phpunit": "^8.5.13" 1740 }, 1741 "type": "library", 1742 "extra": { 1743 "branch-alias": { 1744 "dev-master": "1.10-dev" 1745 } 1746 }, 1747 "autoload": { 1748 "psr-4": { 1749 "Webmozart\\Assert\\": "src/" 1750 } 1751 }, 1752 "notification-url": "https://packagist.org/downloads/", 1753 "license": [ 1754 "MIT" 1755 ], 1756 "authors": [ 1757 { 1758 "name": "Bernhard Schussek", 1759 "email": "bschussek@gmail.com" 1760 } 1761 ], 1762 "description": "Assertions to validate method input/output with nice error messages.", 1763 "keywords": [ 1764 "assert", 1765 "check", 1766 "validate" 1767 ], 1768 "support": { 1769 "issues": "https://github.com/webmozarts/assert/issues", 1770 "source": "https://github.com/webmozarts/assert/tree/1.11.0" 1771 }, 1772 "time": "2022-06-03T18:03:27+00:00" 1667 "type": "library", 1668 "autoload": { 1669 "classmap": [ 1670 "src/" 1671 ] 1672 }, 1673 "notification-url": "https://packagist.org/downloads/", 1674 "license": [ 1675 "BSD-3-Clause" 1676 ], 1677 "authors": [ 1678 { 1679 "name": "Arne Blankerts", 1680 "email": "arne@blankerts.de", 1681 "role": "Developer" 1682 } 1683 ], 1684 "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 1685 "support": { 1686 "issues": "https://github.com/theseer/tokenizer/issues", 1687 "source": "https://github.com/theseer/tokenizer/tree/1.3.1" 1688 }, 1689 "funding": [ 1690 { 1691 "url": "https://github.com/theseer", 1692 "type": "github" 1693 } 1694 ], 1695 "time": "2025-11-17T20:03:58+00:00" 1773 1696 } 1774 1697 ], 1775 1698 "aliases": [], 1776 1699 "minimum-stability": "stable", 1777 "stability-flags": [],1700 "stability-flags": {}, 1778 1701 "prefer-stable": false, 1779 1702 "prefer-lowest": false, 1780 "platform": [],1781 "platform-dev": [],1782 "plugin-api-version": "2. 1.0"1703 "platform": {}, 1704 "platform-dev": {}, 1705 "plugin-api-version": "2.6.0" 1783 1706 } -
mailchimp-for-woocommerce/trunk/blocks/newsletter.php
r3100617 r3457552 16 16 add_action( 'woocommerce_store_api_checkout_order_processed', array( 'Mailchimp_Woocommerce_Newsletter_Blocks_Integration', 'order_customer_processed' ) ); 17 17 18 add_action( 'woocommerce_store_api_checkout_update_order_from_request', array( 'Mailchimp_Woocommerce_Sms_Blocks_Integration', 'order_processed' ), 10, 2 ); 19 add_action( 'woocommerce_store_api_checkout_order_processed', array( 'Mailchimp_Woocommerce_Sms_Blocks_Integration', 'order_customer_processed' ) ); 20 18 21 require_once dirname( __FILE__ ) . '/woocommerce-blocks-integration.php'; 22 require_once dirname( __FILE__ ) . '/woocommerce-sms-blocks-integration.php'; 19 23 require_once dirname( __FILE__ ) . '/woocommerce-blocks-extend-store-endpoint.php'; 20 24 … … 23 27 function( $integration_registry ) { 24 28 $integration_registry->register( new Mailchimp_Woocommerce_Newsletter_Blocks_Integration() ); 29 $integration_registry->register( new Mailchimp_Woocommerce_Sms_Blocks_Integration() ); 25 30 } 26 31 ); -
mailchimp-for-woocommerce/trunk/blocks/package-lock.json
r3433839 r3457552 10 10 "license": "GPL-3.0+", 11 11 "dependencies": { 12 "classnames": "^2.5.1" 12 "classnames": "^2.5.1", 13 "express": "^4.22.1", 14 "qs": "^6.14.1" 13 15 }, 14 16 "devDependencies": { … … 4315 4317 } 4316 4318 }, 4319 "node_modules/@types/eslint": { 4320 "version": "9.6.1", 4321 "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", 4322 "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", 4323 "dev": true, 4324 "license": "MIT", 4325 "dependencies": { 4326 "@types/estree": "*", 4327 "@types/json-schema": "*" 4328 } 4329 }, 4330 "node_modules/@types/eslint-scope": { 4331 "version": "3.7.7", 4332 "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", 4333 "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", 4334 "dev": true, 4335 "license": "MIT", 4336 "dependencies": { 4337 "@types/eslint": "*", 4338 "@types/estree": "*" 4339 } 4340 }, 4317 4341 "node_modules/@types/estree": { 4318 "version": "1.0.5", 4319 "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 4320 "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 4321 "dev": true 4342 "version": "1.0.8", 4343 "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 4344 "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 4345 "dev": true, 4346 "license": "MIT" 4322 4347 }, 4323 4348 "node_modules/@types/express": { … … 4427 4452 }, 4428 4453 "node_modules/@types/json-schema": { 4429 "version": "7.0.12", 4430 "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", 4431 "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", 4432 "dev": true 4454 "version": "7.0.15", 4455 "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", 4456 "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", 4457 "dev": true, 4458 "license": "MIT" 4433 4459 }, 4434 4460 "node_modules/@types/json5": { … … 5020 5046 }, 5021 5047 "node_modules/@webassemblyjs/ast": { 5022 "version": "1.12.1", 5023 "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", 5024 "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", 5025 "dev": true, 5026 "dependencies": { 5027 "@webassemblyjs/helper-numbers": "1.11.6", 5028 "@webassemblyjs/helper-wasm-bytecode": "1.11.6" 5048 "version": "1.14.1", 5049 "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", 5050 "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", 5051 "dev": true, 5052 "license": "MIT", 5053 "dependencies": { 5054 "@webassemblyjs/helper-numbers": "1.13.2", 5055 "@webassemblyjs/helper-wasm-bytecode": "1.13.2" 5029 5056 } 5030 5057 }, 5031 5058 "node_modules/@webassemblyjs/floating-point-hex-parser": { 5032 "version": "1.11.6", 5033 "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", 5034 "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", 5035 "dev": true 5059 "version": "1.13.2", 5060 "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", 5061 "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", 5062 "dev": true, 5063 "license": "MIT" 5036 5064 }, 5037 5065 "node_modules/@webassemblyjs/helper-api-error": { 5038 "version": "1.11.6", 5039 "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", 5040 "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", 5041 "dev": true 5066 "version": "1.13.2", 5067 "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", 5068 "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", 5069 "dev": true, 5070 "license": "MIT" 5042 5071 }, 5043 5072 "node_modules/@webassemblyjs/helper-buffer": { 5044 "version": "1.12.1", 5045 "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", 5046 "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", 5047 "dev": true 5073 "version": "1.14.1", 5074 "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", 5075 "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", 5076 "dev": true, 5077 "license": "MIT" 5048 5078 }, 5049 5079 "node_modules/@webassemblyjs/helper-numbers": { 5050 "version": "1.11.6", 5051 "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", 5052 "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", 5053 "dev": true, 5054 "dependencies": { 5055 "@webassemblyjs/floating-point-hex-parser": "1.11.6", 5056 "@webassemblyjs/helper-api-error": "1.11.6", 5080 "version": "1.13.2", 5081 "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", 5082 "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", 5083 "dev": true, 5084 "license": "MIT", 5085 "dependencies": { 5086 "@webassemblyjs/floating-point-hex-parser": "1.13.2", 5087 "@webassemblyjs/helper-api-error": "1.13.2", 5057 5088 "@xtuc/long": "4.2.2" 5058 5089 } 5059 5090 }, 5060 5091 "node_modules/@webassemblyjs/helper-wasm-bytecode": { 5061 "version": "1.11.6", 5062 "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", 5063 "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", 5064 "dev": true 5092 "version": "1.13.2", 5093 "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", 5094 "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", 5095 "dev": true, 5096 "license": "MIT" 5065 5097 }, 5066 5098 "node_modules/@webassemblyjs/helper-wasm-section": { 5067 "version": "1.12.1", 5068 "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", 5069 "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", 5070 "dev": true, 5071 "dependencies": { 5072 "@webassemblyjs/ast": "1.12.1", 5073 "@webassemblyjs/helper-buffer": "1.12.1", 5074 "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 5075 "@webassemblyjs/wasm-gen": "1.12.1" 5099 "version": "1.14.1", 5100 "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", 5101 "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", 5102 "dev": true, 5103 "license": "MIT", 5104 "dependencies": { 5105 "@webassemblyjs/ast": "1.14.1", 5106 "@webassemblyjs/helper-buffer": "1.14.1", 5107 "@webassemblyjs/helper-wasm-bytecode": "1.13.2", 5108 "@webassemblyjs/wasm-gen": "1.14.1" 5076 5109 } 5077 5110 }, 5078 5111 "node_modules/@webassemblyjs/ieee754": { 5079 "version": "1.11.6", 5080 "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", 5081 "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", 5082 "dev": true, 5112 "version": "1.13.2", 5113 "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", 5114 "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", 5115 "dev": true, 5116 "license": "MIT", 5083 5117 "dependencies": { 5084 5118 "@xtuc/ieee754": "^1.2.0" … … 5086 5120 }, 5087 5121 "node_modules/@webassemblyjs/leb128": { 5088 "version": "1.11.6", 5089 "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", 5090 "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", 5091 "dev": true, 5122 "version": "1.13.2", 5123 "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", 5124 "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", 5125 "dev": true, 5126 "license": "Apache-2.0", 5092 5127 "dependencies": { 5093 5128 "@xtuc/long": "4.2.2" … … 5095 5130 }, 5096 5131 "node_modules/@webassemblyjs/utf8": { 5097 "version": "1.11.6", 5098 "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", 5099 "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", 5100 "dev": true 5132 "version": "1.13.2", 5133 "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", 5134 "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", 5135 "dev": true, 5136 "license": "MIT" 5101 5137 }, 5102 5138 "node_modules/@webassemblyjs/wasm-edit": { 5103 "version": "1.12.1", 5104 "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", 5105 "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", 5106 "dev": true, 5107 "dependencies": { 5108 "@webassemblyjs/ast": "1.12.1", 5109 "@webassemblyjs/helper-buffer": "1.12.1", 5110 "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 5111 "@webassemblyjs/helper-wasm-section": "1.12.1", 5112 "@webassemblyjs/wasm-gen": "1.12.1", 5113 "@webassemblyjs/wasm-opt": "1.12.1", 5114 "@webassemblyjs/wasm-parser": "1.12.1", 5115 "@webassemblyjs/wast-printer": "1.12.1" 5139 "version": "1.14.1", 5140 "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", 5141 "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", 5142 "dev": true, 5143 "license": "MIT", 5144 "dependencies": { 5145 "@webassemblyjs/ast": "1.14.1", 5146 "@webassemblyjs/helper-buffer": "1.14.1", 5147 "@webassemblyjs/helper-wasm-bytecode": "1.13.2", 5148 "@webassemblyjs/helper-wasm-section": "1.14.1", 5149 "@webassemblyjs/wasm-gen": "1.14.1", 5150 "@webassemblyjs/wasm-opt": "1.14.1", 5151 "@webassemblyjs/wasm-parser": "1.14.1", 5152 "@webassemblyjs/wast-printer": "1.14.1" 5116 5153 } 5117 5154 }, 5118 5155 "node_modules/@webassemblyjs/wasm-gen": { 5119 "version": "1.12.1", 5120 "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", 5121 "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", 5122 "dev": true, 5123 "dependencies": { 5124 "@webassemblyjs/ast": "1.12.1", 5125 "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 5126 "@webassemblyjs/ieee754": "1.11.6", 5127 "@webassemblyjs/leb128": "1.11.6", 5128 "@webassemblyjs/utf8": "1.11.6" 5156 "version": "1.14.1", 5157 "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", 5158 "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", 5159 "dev": true, 5160 "license": "MIT", 5161 "dependencies": { 5162 "@webassemblyjs/ast": "1.14.1", 5163 "@webassemblyjs/helper-wasm-bytecode": "1.13.2", 5164 "@webassemblyjs/ieee754": "1.13.2", 5165 "@webassemblyjs/leb128": "1.13.2", 5166 "@webassemblyjs/utf8": "1.13.2" 5129 5167 } 5130 5168 }, 5131 5169 "node_modules/@webassemblyjs/wasm-opt": { 5132 "version": "1.12.1", 5133 "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", 5134 "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", 5135 "dev": true, 5136 "dependencies": { 5137 "@webassemblyjs/ast": "1.12.1", 5138 "@webassemblyjs/helper-buffer": "1.12.1", 5139 "@webassemblyjs/wasm-gen": "1.12.1", 5140 "@webassemblyjs/wasm-parser": "1.12.1" 5170 "version": "1.14.1", 5171 "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", 5172 "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", 5173 "dev": true, 5174 "license": "MIT", 5175 "dependencies": { 5176 "@webassemblyjs/ast": "1.14.1", 5177 "@webassemblyjs/helper-buffer": "1.14.1", 5178 "@webassemblyjs/wasm-gen": "1.14.1", 5179 "@webassemblyjs/wasm-parser": "1.14.1" 5141 5180 } 5142 5181 }, 5143 5182 "node_modules/@webassemblyjs/wasm-parser": { 5144 "version": "1.12.1", 5145 "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", 5146 "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", 5147 "dev": true, 5148 "dependencies": { 5149 "@webassemblyjs/ast": "1.12.1", 5150 "@webassemblyjs/helper-api-error": "1.11.6", 5151 "@webassemblyjs/helper-wasm-bytecode": "1.11.6", 5152 "@webassemblyjs/ieee754": "1.11.6", 5153 "@webassemblyjs/leb128": "1.11.6", 5154 "@webassemblyjs/utf8": "1.11.6" 5183 "version": "1.14.1", 5184 "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", 5185 "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", 5186 "dev": true, 5187 "license": "MIT", 5188 "dependencies": { 5189 "@webassemblyjs/ast": "1.14.1", 5190 "@webassemblyjs/helper-api-error": "1.13.2", 5191 "@webassemblyjs/helper-wasm-bytecode": "1.13.2", 5192 "@webassemblyjs/ieee754": "1.13.2", 5193 "@webassemblyjs/leb128": "1.13.2", 5194 "@webassemblyjs/utf8": "1.13.2" 5155 5195 } 5156 5196 }, 5157 5197 "node_modules/@webassemblyjs/wast-printer": { 5158 "version": "1.12.1", 5159 "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", 5160 "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", 5161 "dev": true, 5162 "dependencies": { 5163 "@webassemblyjs/ast": "1.12.1", 5198 "version": "1.14.1", 5199 "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", 5200 "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", 5201 "dev": true, 5202 "license": "MIT", 5203 "dependencies": { 5204 "@webassemblyjs/ast": "1.14.1", 5164 5205 "@xtuc/long": "4.2.2" 5165 5206 } … … 7112 7153 "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", 7113 7154 "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", 7114 "dev": true 7155 "dev": true, 7156 "license": "BSD-3-Clause" 7115 7157 }, 7116 7158 "node_modules/@xtuc/long": { … … 7118 7160 "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", 7119 7161 "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", 7120 "dev": true 7162 "dev": true, 7163 "license": "Apache-2.0" 7121 7164 }, 7122 7165 "node_modules/abab": { … … 7130 7173 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 7131 7174 "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 7132 "dev": true,7133 7175 "dependencies": { 7134 7176 "mime-types": "~2.1.34", … … 7140 7182 }, 7141 7183 "node_modules/acorn": { 7142 "version": "8.10.0", 7143 "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", 7144 "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", 7145 "dev": true, 7184 "version": "8.15.0", 7185 "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", 7186 "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", 7187 "dev": true, 7188 "license": "MIT", 7146 7189 "bin": { 7147 7190 "acorn": "bin/acorn" … … 7161 7204 } 7162 7205 }, 7163 "node_modules/acorn-import-attributes": { 7164 "version": "1.9.5", 7165 "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", 7166 "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", 7167 "dev": true, 7168 "peerDependencies": { 7169 "acorn": "^8" 7206 "node_modules/acorn-import-phases": { 7207 "version": "1.0.4", 7208 "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", 7209 "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", 7210 "dev": true, 7211 "license": "MIT", 7212 "engines": { 7213 "node": ">=10.13.0" 7214 }, 7215 "peerDependencies": { 7216 "acorn": "^8.14.0" 7170 7217 } 7171 7218 }, … … 8062 8109 "license": "MIT" 8063 8110 }, 8111 "node_modules/baseline-browser-mapping": { 8112 "version": "2.9.19", 8113 "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", 8114 "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", 8115 "dev": true, 8116 "license": "Apache-2.0", 8117 "bin": { 8118 "baseline-browser-mapping": "dist/cli.js" 8119 } 8120 }, 8064 8121 "node_modules/basic-ftp": { 8065 8122 "version": "5.0.5", … … 8106 8163 "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", 8107 8164 "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", 8108 "dev": true,8109 8165 "dependencies": { 8110 8166 "bytes": "3.1.2", … … 8130 8186 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 8131 8187 "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 8132 "dev": true,8133 8188 "dependencies": { 8134 8189 "ms": "2.0.0" … … 8139 8194 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 8140 8195 "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 8141 "dev": true,8142 8196 "dependencies": { 8143 8197 "safer-buffer": ">= 2.1.2 < 3" … … 8150 8204 "version": "2.0.0", 8151 8205 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 8152 "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 8153 "dev": true 8206 "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 8207 }, 8208 "node_modules/body-parser/node_modules/qs": { 8209 "version": "6.13.0", 8210 "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 8211 "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 8212 "license": "BSD-3-Clause", 8213 "dependencies": { 8214 "side-channel": "^1.0.6" 8215 }, 8216 "engines": { 8217 "node": ">=0.6" 8218 }, 8219 "funding": { 8220 "url": "https://github.com/sponsors/ljharb" 8221 } 8154 8222 }, 8155 8223 "node_modules/bonjour-service": { … … 8194 8262 }, 8195 8263 "node_modules/browserslist": { 8196 "version": "4.2 3.3",8197 "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.2 3.3.tgz",8198 "integrity": "sha512- btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==",8264 "version": "4.28.1", 8265 "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", 8266 "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", 8199 8267 "dev": true, 8200 8268 "funding": [ … … 8212 8280 } 8213 8281 ], 8214 "dependencies": { 8215 "caniuse-lite": "^1.0.30001646", 8216 "electron-to-chromium": "^1.5.4", 8217 "node-releases": "^2.0.18", 8218 "update-browserslist-db": "^1.1.0" 8282 "license": "MIT", 8283 "dependencies": { 8284 "baseline-browser-mapping": "^2.9.0", 8285 "caniuse-lite": "^1.0.30001759", 8286 "electron-to-chromium": "^1.5.263", 8287 "node-releases": "^2.0.27", 8288 "update-browserslist-db": "^1.2.0" 8219 8289 }, 8220 8290 "bin": { … … 8291 8361 "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 8292 8362 "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 8293 "dev": true,8294 8363 "license": "MIT", 8295 8364 "engines": { … … 8320 8389 "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", 8321 8390 "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", 8322 "dev": true,8323 8391 "license": "MIT", 8324 8392 "dependencies": { … … 8328 8396 "engines": { 8329 8397 "node": ">= 0.4" 8398 } 8399 }, 8400 "node_modules/call-bound": { 8401 "version": "1.0.4", 8402 "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", 8403 "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", 8404 "license": "MIT", 8405 "dependencies": { 8406 "call-bind-apply-helpers": "^1.0.2", 8407 "get-intrinsic": "^1.3.0" 8408 }, 8409 "engines": { 8410 "node": ">= 0.4" 8411 }, 8412 "funding": { 8413 "url": "https://github.com/sponsors/ljharb" 8330 8414 } 8331 8415 }, … … 8400 8484 }, 8401 8485 "node_modules/caniuse-lite": { 8402 "version": "1.0.30001 660",8403 "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001 660.tgz",8404 "integrity": "sha512- GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==",8486 "version": "1.0.30001769", 8487 "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", 8488 "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", 8405 8489 "dev": true, 8406 8490 "funding": [ … … 8417 8501 "url": "https://github.com/sponsors/ai" 8418 8502 } 8419 ] 8503 ], 8504 "license": "CC-BY-4.0" 8420 8505 }, 8421 8506 "node_modules/capital-case": { … … 8972 9057 "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 8973 9058 "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 8974 "dev": true,8975 9059 "dependencies": { 8976 9060 "safe-buffer": "5.2.1" … … 8984 9068 "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 8985 9069 "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 8986 "dev": true,8987 9070 "engines": { 8988 9071 "node": ">= 0.6" … … 8999 9082 "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", 9000 9083 "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", 9001 "dev": true,9002 9084 "license": "MIT", 9003 9085 "engines": { … … 9008 9090 "version": "1.0.6", 9009 9091 "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 9010 "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", 9011 "dev": true 9092 "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 9012 9093 }, 9013 9094 "node_modules/copy-webpack-plugin": { … … 9906 9987 "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 9907 9988 "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 9908 "dev": true,9909 9989 "engines": { 9910 9990 "node": ">= 0.8" … … 9924 10004 "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 9925 10005 "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 9926 "dev": true,9927 10006 "engines": { 9928 10007 "node": ">= 0.8", … … 10128 10207 "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", 10129 10208 "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", 10130 "dev": true,10131 10209 "license": "MIT", 10132 10210 "dependencies": { … … 10148 10226 "version": "1.1.1", 10149 10227 "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 10150 "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 10151 "dev": true 10228 "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 10152 10229 }, 10153 10230 "node_modules/electron-to-chromium": { 10154 "version": "1.5.19", 10155 "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.19.tgz", 10156 "integrity": "sha512-kpLJJi3zxTR1U828P+LIUDZ5ohixyo68/IcYOHLqnbTPr/wdgn4i1ECvmALN9E16JPA6cvCG5UG79gVwVdEK5w==", 10157 "dev": true 10231 "version": "1.5.286", 10232 "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", 10233 "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", 10234 "dev": true, 10235 "license": "ISC" 10158 10236 }, 10159 10237 "node_modules/emittery": { … … 10188 10266 "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 10189 10267 "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 10190 "dev": true,10191 10268 "engines": { 10192 10269 "node": ">= 0.8" … … 10213 10290 }, 10214 10291 "node_modules/enhanced-resolve": { 10215 "version": "5.17.1", 10216 "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", 10217 "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", 10218 "dev": true, 10292 "version": "5.19.0", 10293 "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", 10294 "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", 10295 "dev": true, 10296 "license": "MIT", 10219 10297 "dependencies": { 10220 10298 "graceful-fs": "^4.2.4", 10221 "tapable": "^2. 2.0"10299 "tapable": "^2.3.0" 10222 10300 }, 10223 10301 "engines": { … … 10344 10422 "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", 10345 10423 "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", 10346 "dev": true,10347 10424 "license": "MIT", 10348 10425 "engines": { … … 10354 10431 "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 10355 10432 "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 10356 "dev": true,10357 10433 "engines": { 10358 10434 "node": ">= 0.4" … … 10360 10436 }, 10361 10437 "node_modules/es-module-lexer": { 10362 "version": "1.3.0", 10363 "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", 10364 "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", 10365 "dev": true 10438 "version": "2.0.0", 10439 "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", 10440 "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", 10441 "dev": true, 10442 "license": "MIT" 10366 10443 }, 10367 10444 "node_modules/es-object-atoms": { … … 10369 10446 "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", 10370 10447 "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", 10371 "dev": true,10372 10448 "license": "MIT", 10373 10449 "dependencies": { … … 10432 10508 "version": "1.0.3", 10433 10509 "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 10434 "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 10435 "dev": true 10510 "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 10436 10511 }, 10437 10512 "node_modules/escape-string-regexp": { … … 11166 11241 "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 11167 11242 "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 11168 "dev": true,11169 11243 "engines": { 11170 11244 "node": ">= 0.6" … … 11303 11377 }, 11304 11378 "node_modules/express": { 11305 "version": "4.21.2", 11306 "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", 11307 "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", 11308 "dev": true, 11379 "version": "4.22.1", 11380 "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", 11381 "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", 11309 11382 "license": "MIT", 11310 11383 "dependencies": { 11311 11384 "accepts": "~1.3.8", 11312 11385 "array-flatten": "1.1.1", 11313 "body-parser": " 1.20.3",11314 "content-disposition": " 0.5.4",11386 "body-parser": "~1.20.3", 11387 "content-disposition": "~0.5.4", 11315 11388 "content-type": "~1.0.4", 11316 "cookie": " 0.7.1",11317 "cookie-signature": " 1.0.6",11389 "cookie": "~0.7.1", 11390 "cookie-signature": "~1.0.6", 11318 11391 "debug": "2.6.9", 11319 11392 "depd": "2.0.0", … … 11321 11394 "escape-html": "~1.0.3", 11322 11395 "etag": "~1.8.1", 11323 "finalhandler": " 1.3.1",11324 "fresh": " 0.5.2",11325 "http-errors": " 2.0.0",11396 "finalhandler": "~1.3.1", 11397 "fresh": "~0.5.2", 11398 "http-errors": "~2.0.0", 11326 11399 "merge-descriptors": "1.0.3", 11327 11400 "methods": "~1.1.2", 11328 "on-finished": " 2.4.1",11401 "on-finished": "~2.4.1", 11329 11402 "parseurl": "~1.3.3", 11330 "path-to-regexp": " 0.1.12",11403 "path-to-regexp": "~0.1.12", 11331 11404 "proxy-addr": "~2.0.7", 11332 "qs": " 6.13.0",11405 "qs": "~6.14.0", 11333 11406 "range-parser": "~1.2.1", 11334 11407 "safe-buffer": "5.2.1", 11335 "send": " 0.19.0",11336 "serve-static": " 1.16.2",11408 "send": "~0.19.0", 11409 "serve-static": "~1.16.2", 11337 11410 "setprototypeof": "1.2.0", 11338 "statuses": " 2.0.1",11411 "statuses": "~2.0.1", 11339 11412 "type-is": "~1.6.18", 11340 11413 "utils-merge": "1.0.1", … … 11352 11425 "version": "1.1.1", 11353 11426 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 11354 "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", 11355 "dev": true 11427 "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 11356 11428 }, 11357 11429 "node_modules/express/node_modules/debug": { … … 11359 11431 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 11360 11432 "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 11361 "dev": true,11362 11433 "dependencies": { 11363 11434 "ms": "2.0.0" … … 11367 11438 "version": "2.0.0", 11368 11439 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 11369 "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 11370 "dev": true 11440 "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 11371 11441 }, 11372 11442 "node_modules/express/node_modules/path-to-regexp": { … … 11374 11444 "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", 11375 11445 "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", 11376 "dev": true,11377 11446 "license": "MIT" 11378 11447 }, … … 11582 11651 "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", 11583 11652 "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", 11584 "dev": true,11585 11653 "dependencies": { 11586 11654 "debug": "2.6.9", … … 11600 11668 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 11601 11669 "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 11602 "dev": true,11603 11670 "dependencies": { 11604 11671 "ms": "2.0.0" … … 11608 11675 "version": "2.0.0", 11609 11676 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 11610 "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 11611 "dev": true 11677 "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 11612 11678 }, 11613 11679 "node_modules/find-cache-dir": { … … 11879 11945 "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 11880 11946 "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 11881 "dev": true,11882 11947 "engines": { 11883 11948 "node": ">= 0.6" … … 11942 12007 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 11943 12008 "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 11944 "dev": true,11945 12009 "engines": { 11946 12010 "node": ">= 0.6" … … 11986 12050 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 11987 12051 "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 11988 "dev": true,11989 12052 "funding": { 11990 12053 "url": "https://github.com/sponsors/ljharb" … … 12040 12103 "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", 12041 12104 "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", 12042 "dev": true,12043 12105 "license": "MIT", 12044 12106 "dependencies": { … … 12095 12157 "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", 12096 12158 "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", 12097 "dev": true,12098 12159 "license": "MIT", 12099 12160 "dependencies": { … … 12206 12267 "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 12207 12268 "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", 12208 "dev": true 12269 "dev": true, 12270 "license": "BSD-2-Clause" 12209 12271 }, 12210 12272 "node_modules/global-modules": { … … 12299 12361 "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", 12300 12362 "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", 12301 "dev": true,12302 12363 "license": "MIT", 12303 12364 "engines": { … … 12417 12478 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", 12418 12479 "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", 12419 "dev": true,12420 12480 "license": "MIT", 12421 12481 "engines": { … … 12446 12506 "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 12447 12507 "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 12448 "dev": true,12449 12508 "dependencies": { 12450 12509 "function-bind": "^1.1.2" … … 12637 12696 "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 12638 12697 "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 12639 "dev": true,12640 12698 "dependencies": { 12641 12699 "depd": "2.0.0", … … 12910 12968 "version": "2.0.4", 12911 12969 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 12912 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 12913 "dev": true 12970 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 12914 12971 }, 12915 12972 "node_modules/ini": { … … 15671 15728 }, 15672 15729 "node_modules/loader-runner": { 15673 "version": "4.3.0", 15674 "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", 15675 "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", 15676 "dev": true, 15730 "version": "4.3.1", 15731 "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", 15732 "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", 15733 "dev": true, 15734 "license": "MIT", 15677 15735 "engines": { 15678 15736 "node": ">=6.11.5" 15737 }, 15738 "funding": { 15739 "type": "opencollective", 15740 "url": "https://opencollective.com/webpack" 15679 15741 } 15680 15742 }, … … 15719 15781 }, 15720 15782 "node_modules/lodash": { 15721 "version": "4.17.21", 15722 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 15723 "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 15724 "dev": true 15783 "version": "4.17.23", 15784 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", 15785 "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", 15786 "dev": true, 15787 "license": "MIT" 15725 15788 }, 15726 15789 "node_modules/lodash-es": { 15727 "version": "4.17.2 1",15728 "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.2 1.tgz",15729 "integrity": "sha512- mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",15790 "version": "4.17.23", 15791 "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", 15792 "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", 15730 15793 "dev": true, 15731 15794 "license": "MIT" … … 16050 16113 "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", 16051 16114 "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", 16052 "dev": true,16053 16115 "license": "MIT", 16054 16116 "engines": { … … 16082 16144 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 16083 16145 "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 16084 "dev": true,16085 16146 "engines": { 16086 16147 "node": ">= 0.6" … … 16170 16231 "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", 16171 16232 "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", 16172 "dev": true,16173 16233 "funding": { 16174 16234 "url": "https://github.com/sponsors/sindresorhus" … … 16201 16261 "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 16202 16262 "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 16203 "dev": true,16204 16263 "engines": { 16205 16264 "node": ">= 0.6" … … 16223 16282 "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 16224 16283 "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 16225 "dev": true,16226 16284 "bin": { 16227 16285 "mime": "cli.js" … … 16235 16293 "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 16236 16294 "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 16237 "dev": true,16238 16295 "engines": { 16239 16296 "node": ">= 0.6" … … 16244 16301 "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 16245 16302 "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 16246 "dev": true,16247 16303 "dependencies": { 16248 16304 "mime-db": "1.52.0" … … 16531 16587 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 16532 16588 "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 16533 "dev": true,16534 16589 "engines": { 16535 16590 "node": ">= 0.6" … … 16578 16633 }, 16579 16634 "node_modules/node-releases": { 16580 "version": "2.0.18", 16581 "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", 16582 "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", 16583 "dev": true 16635 "version": "2.0.27", 16636 "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", 16637 "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", 16638 "dev": true, 16639 "license": "MIT" 16584 16640 }, 16585 16641 "node_modules/node-wp-i18n": { … … 16919 16975 }, 16920 16976 "node_modules/object-inspect": { 16921 "version": "1.13. 2",16922 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13. 2.tgz",16923 "integrity": "sha512- IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",16924 " dev": true,16977 "version": "1.13.4", 16978 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", 16979 "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", 16980 "license": "MIT", 16925 16981 "engines": { 16926 16982 "node": ">= 0.4" … … 17040 17096 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 17041 17097 "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 17042 "dev": true,17043 17098 "dependencies": { 17044 17099 "ee-first": "1.1.1" … … 17338 17393 "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 17339 17394 "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 17340 "dev": true,17341 17395 "engines": { 17342 17396 "node": ">= 0.8" … … 17425 17479 }, 17426 17480 "node_modules/picocolors": { 17427 "version": "1.1.0", 17428 "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", 17429 "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", 17430 "dev": true 17481 "version": "1.1.1", 17482 "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 17483 "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 17484 "dev": true, 17485 "license": "ISC" 17431 17486 }, 17432 17487 "node_modules/picomatch": { … … 18373 18428 "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 18374 18429 "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 18375 "dev": true,18376 18430 "dependencies": { 18377 18431 "forwarded": "0.2.0", … … 18386 18440 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 18387 18441 "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 18388 "dev": true,18389 18442 "engines": { 18390 18443 "node": ">= 0.10" … … 18545 18598 }, 18546 18599 "node_modules/qs": { 18547 "version": "6.1 3.0",18548 "resolved": "https://registry.npmjs.org/qs/-/qs-6.1 3.0.tgz",18549 "integrity": "sha512- +38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",18550 " dev": true,18551 "dependencies": { 18552 "side-channel": "^1. 0.6"18600 "version": "6.14.1", 18601 "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", 18602 "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", 18603 "license": "BSD-3-Clause", 18604 "dependencies": { 18605 "side-channel": "^1.1.0" 18553 18606 }, 18554 18607 "engines": { … … 18607 18660 "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 18608 18661 "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 18609 "dev": true,18610 18662 "engines": { 18611 18663 "node": ">= 0.6" … … 18616 18668 "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 18617 18669 "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 18618 "dev": true,18619 18670 "dependencies": { 18620 18671 "bytes": "3.1.2", … … 18631 18682 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 18632 18683 "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 18633 "dev": true,18634 18684 "dependencies": { 18635 18685 "safer-buffer": ">= 2.1.2 < 3" … … 19384 19434 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 19385 19435 "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 19386 "dev": true,19387 19436 "funding": [ 19388 19437 { … … 19417 19466 "version": "2.1.2", 19418 19467 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 19419 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 19420 "dev": true 19468 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 19421 19469 }, 19422 19470 "node_modules/sass": { … … 19551 19599 "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", 19552 19600 "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", 19553 "dev": true,19554 19601 "dependencies": { 19555 19602 "debug": "2.6.9", … … 19575 19622 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 19576 19623 "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 19577 "dev": true,19578 19624 "dependencies": { 19579 19625 "ms": "2.0.0" … … 19583 19629 "version": "2.0.0", 19584 19630 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 19585 "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 19586 "dev": true 19631 "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 19587 19632 }, 19588 19633 "node_modules/send/node_modules/encodeurl": { … … 19590 19635 "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 19591 19636 "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 19592 "dev": true,19593 19637 "engines": { 19594 19638 "node": ">= 0.8" … … 19598 19642 "version": "2.1.3", 19599 19643 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 19600 "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 19601 "dev": true 19644 "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 19602 19645 }, 19603 19646 "node_modules/sentence-case": { … … 19704 19747 "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", 19705 19748 "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", 19706 "dev": true,19707 19749 "dependencies": { 19708 19750 "encodeurl": "~2.0.0", … … 19741 19783 "version": "1.2.0", 19742 19784 "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 19743 "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 19744 "dev": true 19785 "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 19745 19786 }, 19746 19787 "node_modules/shallow-clone": { … … 20003 20044 }, 20004 20045 "node_modules/side-channel": { 20005 "version": "1.0.6", 20006 "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 20007 "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 20008 "dev": true, 20009 "dependencies": { 20010 "call-bind": "^1.0.7", 20046 "version": "1.1.0", 20047 "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", 20048 "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", 20049 "license": "MIT", 20050 "dependencies": { 20011 20051 "es-errors": "^1.3.0", 20012 "get-intrinsic": "^1.2.4", 20013 "object-inspect": "^1.13.1" 20052 "object-inspect": "^1.13.3", 20053 "side-channel-list": "^1.0.0", 20054 "side-channel-map": "^1.0.1", 20055 "side-channel-weakmap": "^1.0.2" 20056 }, 20057 "engines": { 20058 "node": ">= 0.4" 20059 }, 20060 "funding": { 20061 "url": "https://github.com/sponsors/ljharb" 20062 } 20063 }, 20064 "node_modules/side-channel-list": { 20065 "version": "1.0.0", 20066 "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", 20067 "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", 20068 "license": "MIT", 20069 "dependencies": { 20070 "es-errors": "^1.3.0", 20071 "object-inspect": "^1.13.3" 20072 }, 20073 "engines": { 20074 "node": ">= 0.4" 20075 }, 20076 "funding": { 20077 "url": "https://github.com/sponsors/ljharb" 20078 } 20079 }, 20080 "node_modules/side-channel-map": { 20081 "version": "1.0.1", 20082 "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", 20083 "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", 20084 "license": "MIT", 20085 "dependencies": { 20086 "call-bound": "^1.0.2", 20087 "es-errors": "^1.3.0", 20088 "get-intrinsic": "^1.2.5", 20089 "object-inspect": "^1.13.3" 20090 }, 20091 "engines": { 20092 "node": ">= 0.4" 20093 }, 20094 "funding": { 20095 "url": "https://github.com/sponsors/ljharb" 20096 } 20097 }, 20098 "node_modules/side-channel-weakmap": { 20099 "version": "1.0.2", 20100 "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", 20101 "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", 20102 "license": "MIT", 20103 "dependencies": { 20104 "call-bound": "^1.0.2", 20105 "es-errors": "^1.3.0", 20106 "get-intrinsic": "^1.2.5", 20107 "object-inspect": "^1.13.3", 20108 "side-channel-map": "^1.0.1" 20014 20109 }, 20015 20110 "engines": { … … 20380 20475 "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 20381 20476 "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 20382 "dev": true,20383 20477 "engines": { 20384 20478 "node": ">= 0.8" … … 20917 21011 }, 20918 21012 "node_modules/tapable": { 20919 "version": "2.2.1", 20920 "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", 20921 "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", 20922 "dev": true, 21013 "version": "2.3.0", 21014 "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", 21015 "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", 21016 "dev": true, 21017 "license": "MIT", 20923 21018 "engines": { 20924 21019 "node": ">=6" 21020 }, 21021 "funding": { 21022 "type": "opencollective", 21023 "url": "https://opencollective.com/webpack" 20925 21024 } 20926 21025 }, … … 20971 21070 }, 20972 21071 "node_modules/terser-webpack-plugin": { 20973 "version": "5.3.10", 20974 "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", 20975 "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", 20976 "dev": true, 20977 "dependencies": { 20978 "@jridgewell/trace-mapping": "^0.3.20", 21072 "version": "5.3.16", 21073 "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", 21074 "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", 21075 "dev": true, 21076 "license": "MIT", 21077 "dependencies": { 21078 "@jridgewell/trace-mapping": "^0.3.25", 20979 21079 "jest-worker": "^27.4.5", 20980 "schema-utils": "^ 3.1.1",20981 "serialize-javascript": "^6.0. 1",20982 "terser": "^5. 26.0"21080 "schema-utils": "^4.3.0", 21081 "serialize-javascript": "^6.0.2", 21082 "terser": "^5.31.1" 20983 21083 }, 20984 21084 "engines": { … … 21004 21104 } 21005 21105 }, 21106 "node_modules/terser-webpack-plugin/node_modules/ajv": { 21107 "version": "8.17.1", 21108 "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", 21109 "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", 21110 "dev": true, 21111 "license": "MIT", 21112 "dependencies": { 21113 "fast-deep-equal": "^3.1.3", 21114 "fast-uri": "^3.0.1", 21115 "json-schema-traverse": "^1.0.0", 21116 "require-from-string": "^2.0.2" 21117 }, 21118 "funding": { 21119 "type": "github", 21120 "url": "https://github.com/sponsors/epoberezkin" 21121 } 21122 }, 21123 "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { 21124 "version": "5.1.0", 21125 "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", 21126 "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", 21127 "dev": true, 21128 "license": "MIT", 21129 "dependencies": { 21130 "fast-deep-equal": "^3.1.3" 21131 }, 21132 "peerDependencies": { 21133 "ajv": "^8.8.2" 21134 } 21135 }, 21006 21136 "node_modules/terser-webpack-plugin/node_modules/has-flag": { 21007 21137 "version": "4.0.0", … … 21027 21157 } 21028 21158 }, 21159 "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { 21160 "version": "1.0.0", 21161 "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 21162 "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 21163 "dev": true, 21164 "license": "MIT" 21165 }, 21166 "node_modules/terser-webpack-plugin/node_modules/schema-utils": { 21167 "version": "4.3.3", 21168 "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", 21169 "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", 21170 "dev": true, 21171 "license": "MIT", 21172 "dependencies": { 21173 "@types/json-schema": "^7.0.9", 21174 "ajv": "^8.9.0", 21175 "ajv-formats": "^2.1.1", 21176 "ajv-keywords": "^5.1.0" 21177 }, 21178 "engines": { 21179 "node": ">= 10.13.0" 21180 }, 21181 "funding": { 21182 "type": "opencollective", 21183 "url": "https://opencollective.com/webpack" 21184 } 21185 }, 21029 21186 "node_modules/terser-webpack-plugin/node_modules/supports-color": { 21030 21187 "version": "8.1.1", … … 21181 21338 "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 21182 21339 "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 21183 "dev": true,21184 21340 "engines": { 21185 21341 "node": ">=0.6" … … 21370 21526 "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 21371 21527 "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 21372 "dev": true,21373 21528 "dependencies": { 21374 21529 "media-typer": "0.3.0", … … 21572 21727 "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 21573 21728 "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 21574 "dev": true,21575 21729 "engines": { 21576 21730 "node": ">= 0.8" … … 21578 21732 }, 21579 21733 "node_modules/update-browserslist-db": { 21580 "version": "1. 1.0",21581 "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1. 1.0.tgz",21582 "integrity": "sha512- EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",21734 "version": "1.2.3", 21735 "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", 21736 "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", 21583 21737 "dev": true, 21584 21738 "funding": [ … … 21596 21750 } 21597 21751 ], 21598 "dependencies": { 21599 "escalade": "^3.1.2", 21600 "picocolors": "^1.0.1" 21752 "license": "MIT", 21753 "dependencies": { 21754 "escalade": "^3.2.0", 21755 "picocolors": "^1.1.1" 21601 21756 }, 21602 21757 "bin": { … … 21755 21910 "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 21756 21911 "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 21757 "dev": true,21758 21912 "engines": { 21759 21913 "node": ">= 0.4.0" … … 21859 22013 "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 21860 22014 "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 21861 "dev": true,21862 22015 "engines": { 21863 22016 "node": ">= 0.8" … … 21905 22058 }, 21906 22059 "node_modules/watchpack": { 21907 "version": "2.4.2", 21908 "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", 21909 "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", 21910 "dev": true, 22060 "version": "2.5.1", 22061 "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", 22062 "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", 22063 "dev": true, 22064 "license": "MIT", 21911 22065 "dependencies": { 21912 22066 "glob-to-regexp": "^0.4.1", … … 21942 22096 }, 21943 22097 "node_modules/webpack": { 21944 "version": "5.94.0", 21945 "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", 21946 "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", 21947 "dev": true, 21948 "dependencies": { 21949 "@types/estree": "^1.0.5", 21950 "@webassemblyjs/ast": "^1.12.1", 21951 "@webassemblyjs/wasm-edit": "^1.12.1", 21952 "@webassemblyjs/wasm-parser": "^1.12.1", 21953 "acorn": "^8.7.1", 21954 "acorn-import-attributes": "^1.9.5", 21955 "browserslist": "^4.21.10", 22098 "version": "5.105.0", 22099 "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz", 22100 "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", 22101 "dev": true, 22102 "license": "MIT", 22103 "dependencies": { 22104 "@types/eslint-scope": "^3.7.7", 22105 "@types/estree": "^1.0.8", 22106 "@types/json-schema": "^7.0.15", 22107 "@webassemblyjs/ast": "^1.14.1", 22108 "@webassemblyjs/wasm-edit": "^1.14.1", 22109 "@webassemblyjs/wasm-parser": "^1.14.1", 22110 "acorn": "^8.15.0", 22111 "acorn-import-phases": "^1.0.3", 22112 "browserslist": "^4.28.1", 21956 22113 "chrome-trace-event": "^1.0.2", 21957 "enhanced-resolve": "^5.1 7.1",21958 "es-module-lexer": "^ 1.2.1",22114 "enhanced-resolve": "^5.19.0", 22115 "es-module-lexer": "^2.0.0", 21959 22116 "eslint-scope": "5.1.1", 21960 22117 "events": "^3.2.0", … … 21962 22119 "graceful-fs": "^4.2.11", 21963 22120 "json-parse-even-better-errors": "^2.3.1", 21964 "loader-runner": "^4. 2.0",22121 "loader-runner": "^4.3.1", 21965 22122 "mime-types": "^2.1.27", 21966 22123 "neo-async": "^2.6.2", 21967 "schema-utils": "^ 3.2.0",21968 "tapable": "^2. 1.1",21969 "terser-webpack-plugin": "^5.3.1 0",21970 "watchpack": "^2. 4.1",21971 "webpack-sources": "^3. 2.3"22124 "schema-utils": "^4.3.3", 22125 "tapable": "^2.3.0", 22126 "terser-webpack-plugin": "^5.3.16", 22127 "watchpack": "^2.5.1", 22128 "webpack-sources": "^3.3.3" 21972 22129 }, 21973 22130 "bin": { … … 22413 22570 }, 22414 22571 "node_modules/webpack-sources": { 22415 "version": "3.2.3", 22416 "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", 22417 "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", 22418 "dev": true, 22572 "version": "3.3.3", 22573 "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", 22574 "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", 22575 "dev": true, 22576 "license": "MIT", 22419 22577 "engines": { 22420 22578 "node": ">=10.13.0" 22579 } 22580 }, 22581 "node_modules/webpack/node_modules/ajv": { 22582 "version": "8.17.1", 22583 "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", 22584 "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", 22585 "dev": true, 22586 "license": "MIT", 22587 "dependencies": { 22588 "fast-deep-equal": "^3.1.3", 22589 "fast-uri": "^3.0.1", 22590 "json-schema-traverse": "^1.0.0", 22591 "require-from-string": "^2.0.2" 22592 }, 22593 "funding": { 22594 "type": "github", 22595 "url": "https://github.com/sponsors/epoberezkin" 22596 } 22597 }, 22598 "node_modules/webpack/node_modules/ajv-keywords": { 22599 "version": "5.1.0", 22600 "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", 22601 "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", 22602 "dev": true, 22603 "license": "MIT", 22604 "dependencies": { 22605 "fast-deep-equal": "^3.1.3" 22606 }, 22607 "peerDependencies": { 22608 "ajv": "^8.8.2" 22609 } 22610 }, 22611 "node_modules/webpack/node_modules/json-schema-traverse": { 22612 "version": "1.0.0", 22613 "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 22614 "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 22615 "dev": true, 22616 "license": "MIT" 22617 }, 22618 "node_modules/webpack/node_modules/schema-utils": { 22619 "version": "4.3.3", 22620 "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", 22621 "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", 22622 "dev": true, 22623 "license": "MIT", 22624 "dependencies": { 22625 "@types/json-schema": "^7.0.9", 22626 "ajv": "^8.9.0", 22627 "ajv-formats": "^2.1.1", 22628 "ajv-keywords": "^5.1.0" 22629 }, 22630 "engines": { 22631 "node": ">= 10.13.0" 22632 }, 22633 "funding": { 22634 "type": "opencollective", 22635 "url": "https://opencollective.com/webpack" 22421 22636 } 22422 22637 }, -
mailchimp-for-woocommerce/trunk/blocks/package.json
r3159961 r3457552 51 51 }, 52 52 "dependencies": { 53 "classnames": "^2.5.1" 53 "classnames": "^2.5.1", 54 "express": "^4.22.1", 55 "qs": "^6.14.1" 54 56 } 55 57 } -
mailchimp-for-woocommerce/trunk/blocks/webpack.config.js
r2686137 r3457552 30 30 'newsletter-block': path.resolve( process.cwd(), 'assets', 'js', 'checkout-newsletter-subscription-block', 'index.js' ), 31 31 'newsletter-block-frontend': path.resolve( process.cwd(), 'assets', 'js', 'checkout-newsletter-subscription-block', 'frontend.js' ), 32 33 'sms-consent-block': path.resolve( process.cwd(), 'assets', 'js', 'checkout-sms-consent-block', 'index.js' ), 34 'sms-consent-block-frontend': path.resolve( process.cwd(), 'assets', 'js', 'checkout-sms-consent-block', 'frontend.js' ), 32 35 }, 33 36 plugins: [ -
mailchimp-for-woocommerce/trunk/bootstrap.php
r3433839 r3457552 17 17 'MailChimp_WooCommerce_Options' => 'includes/class-mailchimp-woocommerce-options.php', 18 18 'MailChimp_Newsletter' => 'includes/class-mailchimp-woocommerce-newsletter.php', 19 'MailChimp_Sms_Consent' => 'includes/class-mailchimp-woocommerce-sms-consent.php', 19 20 'MailChimp_WooCommerce_Loader' => 'includes/class-mailchimp-woocommerce-loader.php', 20 21 'MailChimp_WooCommerce_i18n' => 'includes/class-mailchimp-woocommerce-i18n.php', … … 113 114 'repo' => 'master', 114 115 'environment' => 'production', // staging or production 115 'version' => ' 5.7.0',116 'version' => '6.0', 116 117 'php_version' => phpversion(), 117 118 'wp_version' => (empty($wp_version) ? 'Unknown' : $wp_version), … … 1549 1550 } 1550 1551 1551 $result = mailchimp_get_api() 1552 $api = mailchimp_get_api(); 1553 1554 if ($caller === 'cart') { 1555 $status = mailchimp_get_subscriber_status($user_email); 1556 1557 if (in_array($status, ['transactional', 'subscribed', 'pending'])) { 1558 $status_if_new = $status; 1559 } 1560 } 1561 1562 $result = $api 1552 1563 ->useAutoDoi($should_doi) 1553 1564 ->update( … … 1600 1611 } 1601 1612 } 1613 } 1614 } 1615 1616 1617 /** 1618 * Sync SMS consent data to Mailchimp for a member 1619 * 1620 * IMPORTANT: This function respects AC8 - if a customer places an order WITHOUT 1621 * checking SMS consent, we should NOT change their existing SMS subscription status. 1622 * We only sync when the customer explicitly opts in. 1623 * 1624 * @param string|null $user_email The user's email address (can be null for email-less checkout) 1625 * @param int|null $order_id The WooCommerce order ID (optional) 1626 * @param int|null $user_id The WordPress user ID (optional) 1627 * @param string $caller The calling context for logging 1628 * @param string|null $email_status The status of user's email subscription for contact upserts. 1629 * @return bool True if SMS was synced, false otherwise 1630 */ 1631 function mailchimp_member_sms_update($user_email = null, $order_id = null, $user_id = null, $caller = 'order', $email_status = null) { 1632 // Check if SMS is enabled 1633 $options = \Mailchimp_Woocommerce_DB_Helpers::get_option('mailchimp-woocommerce'); 1634 if (empty($options['mailchimp_sms_consent_enabled'])) { 1635 return false; 1636 } 1637 1638 $sms_data = null; 1639 1640 // Try to get SMS data from order first 1641 if ($order_id) { 1642 $sms_data = MailChimp_Sms_Consent::getSmsDataFromOrder($order_id); 1643 } 1644 1645 // If no order SMS data, try from user 1646 if (!$sms_data && $user_id) { 1647 $sms_data = MailChimp_Sms_Consent::getSmsDataFromUser($user_id); 1648 } 1649 1650 // If still no SMS data, try current user if logged in 1651 if (!$sms_data && is_user_logged_in()) { 1652 $sms_data = MailChimp_Sms_Consent::getSmsDataFromUser(get_current_user_id()); 1653 } 1654 1655 // No SMS consent data found - this is expected when customer doesn't check the box 1656 // Per AC8: Do NOT change existing SMS subscription status in this case 1657 if (!$sms_data || empty($sms_data['phone'])) { 1658 mailchimp_debug('sms.sync', "No SMS consent data found - preserving existing status"); 1659 return false; 1660 } 1661 1662 // Only sync if they explicitly opted in (AC8 compliance) 1663 if (empty($sms_data['subscribed'])) { 1664 mailchimp_debug('sms.sync', "SMS consent not checked - preserving existing status"); 1665 return false; 1666 } 1667 1668 $list_id = mailchimp_get_list_id(); 1669 if (!$list_id) { 1670 return false; 1671 } 1672 1673 // Handle email-less checkout (AC10) 1674 $identifier = $user_email; 1675 if (empty($identifier) && $order_id) { 1676 $order = wc_get_order($order_id); 1677 if ($order) { 1678 $identifier = $order->get_billing_email(); 1679 } 1680 } 1681 1682 $transient_key = $caller . ".sms.member." . md5(($sms_data['phone'].'.'.$identifier)); 1683 1684 // Check if we've already synced recently 1685 if (mailchimp_get_transient($transient_key)) { 1686 mailchimp_debug('sms.sync', "Skipping SMS sync for phone {$sms_data['phone']} - recently synced"); 1687 return true; 1688 } 1689 1690 try { 1691 $api = mailchimp_get_api(); 1692 1693 mailchimp_debug('sms.sync', "Syncing SMS consent", array( 1694 'email' => $identifier, 1695 'phone' => $sms_data['phone'], 1696 'subscribed' => $sms_data['subscribed'], 1697 )); 1698 1699 // Sync SMS consent to Mailchimp 1700 // preserve_existing = true means we won't unsubscribe someone who's already subscribed 1701 $result = $api->subscribeSms($list_id, $identifier, $sms_data['phone'], $sms_data['subscribed'], true, $email_status); 1702 1703 mailchimp_log('sms_consent_sync', 'caller', [ 1704 'caller' => $caller, 1705 'user_id' => $user_id, 1706 'sms_data' => $sms_data, 1707 'email' => $identifier, 1708 'result' => $result 1709 ]); 1710 1711 // Set transient to prevent duplicate calls 1712 mailchimp_set_transient($transient_key, true, 3600); 1713 1714 mailchimp_log($caller . '.sms.synced', "SMS consent synced :: phone: {$sms_data['phone']}" . ($identifier ? " :: email: {$identifier}" : " (email-less)")); 1715 return true; 1716 1717 } catch (Exception $e) { 1718 mailchimp_error($caller . '.sms.sync.error', $e->getMessage() . " :: phone: {$sms_data['phone']}"); 1719 return false; 1602 1720 } 1603 1721 } -
mailchimp-for-woocommerce/trunk/includes/api/assets/class-mailchimp-customer.php
r3346450 r3457552 13 13 protected $id = null; 14 14 protected $email_address = null; 15 protected $opt_in_status = null; 15 protected $opt_in_status = false; 16 protected $sms_opt_in_status = false; 17 protected $phone_number = null; 16 18 protected $company = null; 17 19 protected $first_name = null; … … 34 36 'id' => 'required', 35 37 'email_address' => 'required|email', 36 'opt_in_status' => 'required |string',38 'opt_in_status' => 'required', 37 39 'company' => 'string', 38 40 'first_name' => 'string', … … 85 87 86 88 /** 89 * @return null 90 */ 91 public function getPhoneNumber() { 92 return $this->phone_number; 93 } 94 95 /** 96 * @return null 97 */ 98 public function getSmsOptInStatus() { 99 return $this->sms_opt_in_status; 100 } 101 102 /** 87 103 * @return DateTime|false|mixed|null 88 104 */ … … 123 139 } 124 140 141 142 /** 143 * @param bool $sms_opt_in_status 144 * @return MailChimp_WooCommerce_Customer 145 */ 146 public function setSmsOptInStatus( $sms_opt_in_status ) { 147 if ( is_bool( $sms_opt_in_status ) ) { 148 $this->sms_opt_in_status = $sms_opt_in_status; 149 } else { 150 $this->sms_opt_in_status = $sms_opt_in_status === '1' || $sms_opt_in_status === 1 || $sms_opt_in_status === true; 151 } 152 return $this; 153 } 154 155 /** 156 * @param string|null $phone_number 157 * @return MailChimp_WooCommerce_Customer 158 */ 159 public function setPhoneNumber( $phone_number ) { 160 $this->phone_number = $phone_number; 161 return $this; 162 } 125 163 /** 126 164 * @return null … … 370 408 } elseif ( $subscriber['status'] === 'archived' ) { 371 409 $meta_value = 'archived'; 410 } elseif ( $subscriber["status"] === "unsubscribed" ) { 411 $meta_value = "unsubscribed"; 372 412 } 373 413 $meta_value !== null && update_user_meta($this->wordpress_user->ID, 'mailchimp_woocommerce_is_subscribed', $meta_value); … … 393 433 $address = $this->getAddress()->toArray(); 394 434 395 return mailchimp_array_remove_empty( 396 array( 397 'id' => (string) $this->getId(), 398 'email_address' => (string) $this->getEmailAddress(), 399 'opt_in_status' => false, //$this->getOptInStatus(), 400 'marketing_status_updated_at' => $this->getOptInStatusTimeAsString(), 401 'company' => (string) $this->getCompany(), 402 'first_name' => (string) $this->getFirstName(), 403 'last_name' => (string) $this->getLastName(), 404 // 'orders_count' => (int) $this->getOrdersCount(), 405 // 'total_spent' => floatval(number_format($this->getTotalSpent(), 2, '.', '')), 406 'address' => ( empty( $address ) ? null : $address ), 407 ) 435 $array = array( 436 'id' => (string) $this->getId(), 437 'email_address' => (string) $this->getEmailAddress(), 438 'opt_in_status' => (bool)$this->getOptInStatus(), 439 'marketing_status_updated_at' => $this->getOptInStatusTimeAsString(), 440 'company' => (string) $this->getCompany(), 441 'first_name' => (string) $this->getFirstName(), 442 'last_name' => (string) $this->getLastName(), 443 // 'orders_count' => (int) $this->getOrdersCount(), 444 // 'total_spent' => floatval(number_format($this->getTotalSpent(), 2, '.', '')), 445 'address' => ( empty( $address ) ? null : $address ), 408 446 ); 447 448 // Add SMS fields if SMS consent is enabled 449 $sms_phone = $this->getPhoneNumber(); 450 if ( $this->getSmsOptInStatus() && !empty( $sms_phone ) ) { 451 $array['phone_number'] = (string) $sms_phone; 452 } 453 454 return mailchimp_array_remove_empty( $array ); 409 455 } 410 456 -
mailchimp-for-woocommerce/trunk/includes/api/class-mailchimp-api.php
r3355528 r3457552 398 398 } 399 399 400 public function getContacts($list_id) 401 { 402 $endpoint = "/audiences/{$list_id}/contacts"; 403 404 return $this->get( $endpoint ); 405 } 406 407 public function smsGetContact($list_id, $email) 408 { 409 $hash = md5( strtolower( trim( $email ) ) ); 410 411 $endpoint = "/audiences/{$list_id}/contacts/{$hash}"; 412 413 return $this->get( $endpoint ); 414 } 415 416 public function smsConsentUpdate($list_id, $phone_number, $subscribed = '1', $merge_fields = array()) 417 { 418 $hash = hash( 'sha256', trim( $phone_number ) ); 419 420 if ( $subscribed === '1' ) { 421 $status = 'confirmed'; 422 } else { 423 $status = 'unknown'; 424 } 425 426 $payload = [ 427 'sms_channel' => [ 428 'sms_phone' => $phone_number, 429 'marketing_consent' => [ 430 'status' => $status, 431 'source' => 'Mailchimp for Woocommerce' 432 ] 433 ], 434 'merge_fields' => $merge_fields, 435 ]; 436 437 $data = $this->cleanListSubmission($payload); 438 439 try { 440 $endpoint = "/audiences/{$list_id}/contacts/{$hash}"; 441 return $this->patch( $endpoint, $data ); 442 } catch ( Exception $e ) {} 443 } 444 445 public function smsConsentPost($list_id, $phone_number, $subscribed = '1', $merge_fields = array()) 446 { 447 if ( $subscribed === '1' ) { 448 $status = 'confirmed'; 449 } else { 450 $status = 'unknown'; 451 } 452 453 $payload = [ 454 'sms_channel' => [ 455 'sms_phone' => $phone_number, 456 'marketing_consent' => [ 457 'status' => $status, 458 'source' => 'Mailchimp for Woocommerce' 459 ] 460 ], 461 'merge_fields' => $merge_fields, 462 // 'update_existing' => true 463 ]; 464 465 $data = $this->cleanListSubmission($payload); 466 467 try { 468 $endpoint = "audiences/{$list_id}/contacts"; 469 470 $response = $this->post( $endpoint, $data ); 471 mailchimp_debug('sms-consent.post', 'success', [ 472 'payload' => $data, 473 'endpoint' => $endpoint, 474 'response' => $response, 475 ]); 476 477 return $response; 478 } catch ( Exception $e ) { 479 mailchimp_debug('sms-consent.post', 'error', [ 480 'payload' => $data, 481 'endpoint' => $endpoint, 482 'message' => $e->getMessage(), 483 ]); 484 485 return false; 486 } 487 } 488 400 489 /** 401 490 * @param $data … … 607 696 } 608 697 609 /** 698 /** 699 * Subscribe a contact to SMS marketing 700 * 701 * @param string $list_id The audience/list ID 702 * @param string|null $email The contact's email address (used to identify the contact, can be null for email-less checkout) 703 * @param string $sms_phone The SMS phone number (E.164 format preferred) 704 * @param bool $subscribed Whether to subscribe (true) or mark as pending (false) 705 * @param bool $preserve_existing If true, don't change status of already subscribed contacts 706 * @return array|bool|mixed|object|null 707 * @throws MailChimp_WooCommerce_Error 708 * @throws MailChimp_WooCommerce_RateLimitError 709 * @throws MailChimp_WooCommerce_ServerError 710 */ 711 public function subscribeSms( $list_id, $email, $sms_phone, $subscribed = true, $preserve_existing = true, $email_status = '0' ) { 712 // Validate and format phone number 713 $sms_phone = $this->formatSmsPhone( $sms_phone ); 714 if ( empty( $sms_phone ) ) { 715 throw new MailChimp_WooCommerce_Error( 'Invalid SMS phone number format' ); 716 } 717 718 // Build the SMS channel data according to Mailchimp API 719 $sms_channel = array( 720 'sms_phone' => $sms_phone, 721 'marketing_consent' => array( 722 'status' => $subscribed ? 'confirmed' : 'pending', 723 'source' => 'Mailchimp for Woocommerce', 724 ), 725 ); 726 727 // Handle email-less checkout (AC10 requirement) 728 if ( empty( $email ) ) { 729 // Use phone number as identifier for email-less subscribers 730 $data = array( 731 'sms_channel' => $sms_channel, 732 'update_existing' => true, 733 ); 734 mailchimp_debug( 'api.sms_subscribe', "SMS Subscribe (no email) :: {$sms_phone}", $data ); 735 736 // For email-less, we use the SMS phone endpoint 737 return $this->post( "audiences/{$list_id}/sms-subscribers", $data ); 738 } 739 740 // Check if we should preserve existing status (AC8 requirement) 741 if ( $preserve_existing && ! $subscribed ) { 742 // Check current status first 743 $current_status = $this->getSmsStatus( $list_id, $email ); 744 if ( $current_status && isset( $current_status['marketing_consent']['status'] ) ) { 745 if ( $current_status['marketing_consent']['status'] === 'confirmed' ) { 746 mailchimp_debug( 'api.sms_subscribe', "Preserving existing SMS subscription for {$email}" ); 747 return $current_status; 748 } 749 } 750 } 751 752 $email_subscribed = $email_status === 'subscribed' || $email_status === '1'; 753 754 $data = array( 755 'email_channel' => [ 756 'email' => $email, 757 'marketing_consent' => [ 758 'status' => $email_subscribed ? 'confirmed' : 'unknown', 759 'source' => 'Mailchimp for Woocommerce', 760 ] 761 ], 762 'sms_channel' => $sms_channel, 763 'update_existing' => true, 764 ); 765 766 mailchimp_debug( 'api.sms_subscribe', "SMS Subscribe {$email} :: {$sms_phone}", $data ); 767 768 try { 769 // Use the audiences contacts endpoint for SMS 770 return $this->post( "audiences/{$list_id}/contacts", $data ); 771 772 } catch ( MailChimp_WooCommerce_Error $e ) { 773 // If contact already exists, try to update instead 774 if ( mailchimp_string_contains( $e->getMessage(), 'already a list member' ) || 775 mailchimp_string_contains( $e->getMessage(), 'is already in the audience' ) ) { 776 return $this->updateSmsConsent( $list_id, $email, $sms_phone, $subscribed, $preserve_existing ); 777 } 778 779 throw $e; 780 } 781 } 782 783 /** 784 * Update SMS consent for an existing contact 785 * 786 * @param string $list_id The audience/list ID 787 * @param string $email The contact's email address 788 * @param string $sms_phone The SMS phone number 789 * @param bool $subscribed Whether subscribed or not 790 * @param bool $preserve_existing If true and not subscribing, don't change existing subscribed status 791 * @return array|bool|mixed|object|null 792 * @throws MailChimp_WooCommerce_Error 793 * @throws MailChimp_WooCommerce_RateLimitError 794 * @throws MailChimp_WooCommerce_ServerError 795 */ 796 public function updateSmsConsent( $list_id, $email, $sms_phone, $subscribed = true, $preserve_existing = true ) { 797 $sms_phone = $this->formatSmsPhone( $sms_phone ); 798 if ( empty( $sms_phone ) ) { 799 throw new MailChimp_WooCommerce_Error( 'Invalid SMS phone number format' ); 800 } 801 802 $hash = md5( strtolower( trim( $email ) ) ); 803 804 // Check if we should preserve existing status (AC8 requirement) 805 if ( $preserve_existing && ! $subscribed ) { 806 $current_status = $this->getSmsStatus( $list_id, $email ); 807 if ( $current_status && isset( $current_status['marketing_consent']['status'] ) ) { 808 if ( $current_status['marketing_consent']['status'] === 'confirmed' ) { 809 mailchimp_debug( 'api.sms_update', "Preserving existing SMS subscription for {$email}" ); 810 return $current_status; 811 } 812 } 813 } 814 815 $sms_channel = array( 816 'sms_phone' => $sms_phone, 817 'marketing_consent' => array( 818 'status' => $subscribed ? 'confirmed' : 'unsubscribed', 819 'source' => 'Mailchimp for Woocommerce', 820 ), 821 ); 822 823 $data = array( 824 'sms_channel' => $sms_channel, 825 ); 826 827 mailchimp_debug( 'api.sms_update', "SMS Update {$email} :: {$sms_phone}", $data ); 828 829 return $this->patch( "lists/{$list_id}/members/{$hash}", $data ); 830 } 831 832 /** 833 * Unsubscribe a contact from SMS marketing 834 * 835 * @param string $list_id The audience/list ID 836 * @param string $email The contact's email address 837 * @return array|bool|mixed|object|null 838 * @throws MailChimp_WooCommerce_Error 839 * @throws MailChimp_WooCommerce_RateLimitError 840 * @throws MailChimp_WooCommerce_ServerError 841 */ 842 public function unsubscribeSms( $list_id, $email ) { 843 $hash = md5( strtolower( trim( $email ) ) ); 844 845 $data = array( 846 'sms_channel' => array( 847 'marketing_consent' => array( 848 'status' => 'unsubscribed', 849 'source' => 'Mailchimp for Woocommerce', 850 ), 851 ), 852 ); 853 854 mailchimp_debug( 'api.sms_unsubscribe', "SMS Unsubscribe {$email}", $data ); 855 856 return $this->patch( "lists/{$list_id}/members/{$hash}", $data ); 857 } 858 859 /** 860 * Get SMS subscription status for a contact 861 * 862 * @param string $list_id The audience/list ID 863 * @param string $email The contact's email address 864 * @return array|false SMS data or false if not subscribed 865 * @throws MailChimp_WooCommerce_Error 866 * @throws MailChimp_WooCommerce_RateLimitError 867 * @throws MailChimp_WooCommerce_ServerError 868 */ 869 public function getSmsStatus( $list_id, $email ) { 870 try { 871 $member = $this->member( $list_id, $email ); 872 if ( isset( $member['sms_channel'] ) ) { 873 return $member['sms_channel']; 874 } 875 return false; 876 } catch ( Exception $e ) { 877 return false; 878 } 879 } 880 881 /** 882 * Format phone number to E.164 format 883 * 884 * @param string $phone Raw phone number 885 * @return string Formatted phone number or empty string if invalid 886 */ 887 protected function formatSmsPhone( $phone ) { 888 // Remove all non-digit characters except + 889 $phone = preg_replace( '/[^\+\d]/', '', $phone ); 890 891 // If it doesn't start with +, assume US and add +1 892 if ( strpos( $phone, '+' ) !== 0 ) { 893 // Remove leading 1 if present, then add +1 894 $phone = ltrim( $phone, '1' ); 895 if ( strlen( $phone ) === 10 ) { 896 $phone = '+1' . $phone; 897 } else { 898 $phone = '+' . $phone; 899 } 900 } 901 902 // Validate minimum length (E.164 requires at least 8 digits) 903 $digits = preg_replace( '/[^\d]/', '', $phone ); 904 if ( strlen( $digits ) < 8 || strlen( $digits ) > 15 ) { 905 return ''; 906 } 907 908 return $phone; 909 } 910 911 /** 912 * Check if the merchant has an approved SMS application for the given audience 913 * 914 * @param string $list_id The audience/list ID 915 * @return array|false SMS application status or false if not approved 916 * @throws MailChimp_WooCommerce_Error 917 * @throws MailChimp_WooCommerce_RateLimitError 918 * @throws MailChimp_WooCommerce_ServerError 919 */ 920 public function getSmsApplicationStatus( $list_id ) { 921 try { 922 // Try to get SMS settings for the audience 923 $result = $this->get( "lists/{$list_id}/sms" ); 924 925 if ( isset( $result['sms_enabled'] ) && $result['sms_enabled'] ) { 926 return array( 927 'enabled' => true, 928 'sending_countries' => isset( $result['sending_countries'] ) ? $result['sending_countries'] : array(), 929 'phone_country' => isset( $result['phone_country'] ) ? $result['phone_country'] : null, 930 ); 931 } 932 return false; 933 } catch ( Exception $e ) { 934 // If 404 or other error, SMS is not enabled 935 mailchimp_debug( 'api.sms_status', "SMS not available for list {$list_id}: " . $e->getMessage() ); 936 return false; 937 } 938 } 939 940 /** 941 * Get cached SMS application status (cached for 1 hour) 942 * 943 * @param string $list_id The audience/list ID 944 * @return array|false SMS application status or false if not approved 945 */ 946 public function getCachedSmsApplicationStatus( $list_id ) { 947 $transient_key = "mailchimp_sms_status_{$list_id}"; 948 $cached = mailchimp_get_transient( $transient_key ); 949 950 if ( $cached !== false ) { 951 return $cached; 952 } 953 954 try { 955 $status = $this->getSmsApplicationStatus( $list_id ); 956 // Cache for 1 hour 957 mailchimp_set_transient( $transient_key, $status !== false ? $status : 'disabled', 3600 ); 958 return $status; 959 } catch ( Exception $e ) { 960 return false; 961 } 962 } 963 964 /** 965 * Check if a country is in the merchant's SMS sending countries 966 * 967 * @param string $list_id The audience/list ID 968 * @param string $country_code The 2-letter country code to check 969 * @return bool 970 */ 971 public function isSmsSendingCountry( $list_id, $country_code ) { 972 $sms_status = $this->getCachedSmsApplicationStatus( $list_id ); 973 974 if ( ! $sms_status || empty( $sms_status['sending_countries'] ) ) { 975 return false; 976 } 977 978 $country_code = strtoupper( $country_code ); 979 return in_array( $country_code, $sms_status['sending_countries'], true ); 980 } 981 982 /** 610 983 * @param MailChimp_WooCommerce_CreateListSubmission $submission 611 984 * … … 2237 2610 'url' => $url, 2238 2611 'events' => array( 2612 'sms_subscribe' => true, 2613 'sms_unsubscribe' => true, 2239 2614 'subscribe' => true, 2240 2615 'unsubscribe' => true, … … 2703 3078 $err = curl_error( $curl ); 2704 3079 $info = curl_getinfo( $curl ); 2705 3080 2706 3081 // Capture request details before closing curl 2707 3082 $url = isset($info['url']) ? $info['url'] : 'UNKNOWN'; … … 2716 3091 2717 3092 curl_close( $curl ); 2718 3093 2719 3094 // Initialize error info array 2720 3095 if ( $err ) { … … 2724 3099 'code' => 500 2725 3100 ); 2726 3101 2727 3102 // Log with enhanced logger 2728 3103 if (class_exists('MailChimp_WooCommerce_Enhanced_Logger')) { … … 2737 3112 ); 2738 3113 } 2739 3114 2740 3115 throw new MailChimp_WooCommerce_Error( 'CURL error :: ' . $err, 500 ); 2741 3116 } … … 2753 3128 'code' => $http_code 2754 3129 ); 2755 3130 2756 3131 // Log with enhanced logger 2757 3132 if (class_exists('MailChimp_WooCommerce_Enhanced_Logger')) { … … 2766 3141 ); 2767 3142 } 2768 3143 2769 3144 throw new MailChimp_WooCommerce_RateLimitError( 'API is failing - try again.' ); 2770 3145 } … … 2787 3162 'response_data' => $data 2788 3163 ); 2789 3164 2790 3165 if (class_exists('MailChimp_WooCommerce_Enhanced_Logger')) { 2791 3166 MailChimp_WooCommerce_Enhanced_Logger::log_connection_attempt( … … 2799 3174 ); 2800 3175 } 2801 3176 2802 3177 throw $e; 2803 3178 } 2804 3179 } 2805 3180 2806 3181 // Log successful request if debug logging is enabled 2807 3182 if (mailchimp_environment_variables()->logging === 'debug' && class_exists('MailChimp_WooCommerce_Enhanced_Logger')) { … … 2816 3191 ); 2817 3192 } 2818 3193 2819 3194 return $data; 2820 3195 } … … 2831 3206 'response_data' => $data 2832 3207 ); 2833 3208 2834 3209 // Log with enhanced logger 2835 3210 if (class_exists('MailChimp_WooCommerce_Enhanced_Logger')) { … … 2844 3219 ); 2845 3220 } 2846 3221 2847 3222 throw new MailChimp_WooCommerce_RateLimitError(); 2848 3223 } 2849 3224 $error_message = isset( $data['title'] ) ? $data['title'] : ''; 2850 3225 $error_message .= isset( $data['detail'] ) ? $data['detail'] : ''; 2851 3226 2852 3227 $error_info = array( 2853 3228 'type' => 'client_error', … … 2856 3231 'response_data' => $data 2857 3232 ); 2858 3233 2859 3234 // Log with enhanced logger 2860 3235 if (class_exists('MailChimp_WooCommerce_Enhanced_Logger')) { … … 2869 3244 ); 2870 3245 } 2871 3246 2872 3247 throw new MailChimp_WooCommerce_Error( $error_message, $error_status ); 2873 3248 } … … 2875 3250 if ( $http_code >= 500 ) { 2876 3251 $error_message = isset( $data['detail'] ) ? $data['detail'] : ''; 2877 3252 2878 3253 $error_info = array( 2879 3254 'type' => 'server_error', … … 2882 3257 'response_data' => $data 2883 3258 ); 2884 3259 2885 3260 // Log with enhanced logger 2886 3261 if (class_exists('MailChimp_WooCommerce_Enhanced_Logger')) { … … 2895 3270 ); 2896 3271 } 2897 3272 2898 3273 throw new MailChimp_WooCommerce_ServerError( $error_message, $error_status ); 2899 3274 } … … 2906 3281 'raw_response' => $response 2907 3282 ); 2908 3283 2909 3284 // Log with enhanced logger 2910 3285 if (class_exists('MailChimp_WooCommerce_Enhanced_Logger')) { … … 2919 3294 ); 2920 3295 } 2921 3296 2922 3297 mailchimp_error( 2923 3298 'api.debug', -
mailchimp-for-woocommerce/trunk/includes/api/class-mailchimp-woocommerce-tower.php
r3234127 r3457552 818 818 } 819 819 820 mailchimp_debug('tower.remote_support', "trace.step_1", array( 821 'command' => $command, 822 'store_id' => $store_id, 823 'list_id' => $list_id, 824 'php_version' => phpversion(), 825 'curl_enabled' => function_exists( 'curl_init' ), 826 'is_connected' => $is_connected, 827 'sync_complete' => mailchimp_is_done_syncing(), 828 'rest_url' => MailChimp_WooCommerce_Rest_Api::url( '' ), 829 )); 820 if (defined('MAILCHIMP_DEBUG') && MAILCHIMP_DEBUG === true) { 821 mailchimp_debug('tower.remote_support', "trace.step_1", array( 822 'command' => $command, 823 'store_id' => $store_id, 824 'list_id' => $list_id, 825 'php_version' => phpversion(), 826 'curl_enabled' => function_exists( 'curl_init' ), 827 'is_connected' => $is_connected, 828 'sync_complete' => mailchimp_is_done_syncing(), 829 'rest_url' => MailChimp_WooCommerce_Rest_Api::url( '' ), 830 )); 831 } 830 832 831 833 if ( $enable ) { … … 905 907 return ['success' => false, 'code' => $response['code'], 'message' => $response['message']]; 906 908 } 907 mailchimp_debug('tower.remote_support', "trace.step_3", array( 908 'response' => $response, 909 )); 909 if (defined('MAILCHIMP_DEBUG') && MAILCHIMP_DEBUG === true) { 910 mailchimp_debug('tower.remote_support', "trace.step_3", array( 911 'response' => $response, 912 )); 913 } 910 914 return json_decode( $response['body'] ); 911 915 } catch ( Throwable $e ) { -
mailchimp-for-woocommerce/trunk/includes/class-mailchimp-woocommerce-enhanced-logger.php
r3433839 r3457552 22 22 */ 23 23 public static function log_connection_attempt($method, $url, $curl_info = array(), $response = null, $error_info = array(), $headers = array(), $request_data = null) { 24 if (!defined('MAILCHIMP_DEBUG') || MAILCHIMP_DEBUG !== true) return; 24 25 $log_entry = array( 25 26 'timestamp' => current_time('mysql'), -
mailchimp-for-woocommerce/trunk/includes/class-mailchimp-woocommerce-newsletter.php
r3141736 r3457552 109 109 110 110 echo apply_filters( 'mailchimp_woocommerce_newsletter_field', $checkbox, $status, $label); 111 112 // Render SMS consent fields after newsletter checkbox 113 $this->applySmsConsentField(); 114 } 115 } 116 117 /** 118 * Render SMS consent checkbox and phone field for classic checkout 119 */ 120 public function applySmsConsentField() 121 { 122 // Check if SMS is enabled in settings 123 if (!$this->isSmsEnabled()) { 124 return; 125 } 126 127 // Check if merchant has approved SMS application 128 if (!$this->merchantHasSmsApproved()) { 129 return; 130 } 131 132 // Compliance: checkbox must always be unchecked by default, label and disclaimer are fixed 133 $sms_label = __('Text me with news and offers', 'mailchimp-for-woocommerce'); 134 135 $audience_name = $this->getAudienceName(); 136 $prefix = !empty($audience_name) ? $audience_name . ' – ' : ''; 137 $sms_disclaimer = $prefix . __('By providing your phone number, you agree to receive promotional and marketing messages, notifications, and customer service communications. Message & data rates may apply. Consent is not a condition of purchase. Message frequency may vary. You can unsubscribe at any time by replying STOP.', 'mailchimp-for-woocommerce'); 138 139 // Always unchecked by default per compliance 140 $sms_status = false; 141 $sms_phone = ''; 142 $hide_sms_for_subscriber = false; 143 144 // Check logged-in user's SMS subscription status 145 if (is_user_logged_in()) { 146 $user_sms_status = get_user_meta(get_current_user_id(), 'mailchimp_woocommerce_sms_subscribed', true); 147 $sms_phone = get_user_meta(get_current_user_id(), 'mailchimp_woocommerce_sms_phone', true); 148 $hide_sms_for_subscriber = $user_sms_status === true || $user_sms_status === '1'; 149 150 if ($user_sms_status === '' || $user_sms_status === null) { 151 $sms_status = $sms_default_checked; 152 } else { 153 $sms_status = (bool) $user_sms_status; 154 } 155 } 156 157 // Don't show if already subscribed to SMS 158 if (is_checkout() && $hide_sms_for_subscriber) { 159 return; 160 } 161 162 // Build SMS consent HTML 163 $sms_html = '<div class="mailchimp-sms-consent" style="margin-top: 15px;">'; 164 165 // SMS Checkbox 166 $sms_html .= '<p class="form-row form-row-wide mailchimp-sms-checkbox">'; 167 $sms_html .= '<label for="mailchimp_woocommerce_sms_subscribe" class="woocommerce-form__label woocommerce-form__label-for-checkbox inline">'; 168 $sms_html .= '<input class="woocommerce-form__input woocommerce-form__input-checkbox input-checkbox" id="mailchimp_woocommerce_sms_subscribe" type="checkbox" name="mailchimp_woocommerce_sms_subscribe" value="1"' . ($sms_status ? ' checked="checked"' : '') . '> '; 169 $sms_html .= '<span>' . esc_html($sms_label) . '</span></label>'; 170 $sms_html .= '</p>'; 171 172 // SMS Phone field (conditionally displayed via JS) 173 $sms_html .= '<div id="mailchimp-sms-phone-wrapper" class="form-row form-row-wide" style="display: ' . ($sms_status ? 'block' : 'none') . '; margin-left: 28px;">'; 174 $sms_html .= '<label for="mailchimp_woocommerce_sms_phone">' . __('SMS Phone Number', 'mailchimp-for-woocommerce') . ' <abbr class="required" title="required">*</abbr></label>'; 175 $sms_html .= '<input type="tel" class="input-text" id="mailchimp_woocommerce_sms_phone" name="mailchimp_woocommerce_sms_phone" placeholder="+1 (555) 123-4567" value="' . esc_attr($sms_phone) . '">'; 176 $sms_html .= '<small class="mailchimp-sms-disclaimer" style="display: block; color: #666; font-size: 12px; margin-top: 8px; line-height: 1.4;">' . esc_html($sms_disclaimer) . '</small>'; 177 $sms_html .= '</div>'; 178 179 $sms_html .= '</div>'; 180 $sms_html .= '<div class="clear"></div>'; 181 182 // Get SMS sending countries for JS 183 $sms_countries = $this->getSmsSendingCountries(); 184 $sms_countries_json = !empty($sms_countries) ? json_encode($sms_countries) : '[]'; 185 186 // JavaScript to toggle phone field visibility, validation, and country filtering 187 $sms_html .= '<script type="text/javascript"> 188 jQuery(document).ready(function($) { 189 var smsCheckbox = $("#mailchimp_woocommerce_sms_subscribe"); 190 var smsPhoneWrapper = $("#mailchimp-sms-phone-wrapper"); 191 var smsPhoneInput = $("#mailchimp_woocommerce_sms_phone"); 192 var smsConsentWrapper = $(".mailchimp-sms-consent"); 193 var smsSendingCountries = ' . $sms_countries_json . '; 194 195 function isCountryEligible(countryCode) { 196 // If no countries configured, allow all 197 if (!smsSendingCountries || smsSendingCountries.length === 0) { 198 return true; 199 } 200 return smsSendingCountries.indexOf(countryCode.toUpperCase()) !== -1; 201 } 202 203 function checkBillingCountry() { 204 var billingCountry = $("#billing_country").val(); 205 if (billingCountry && !isCountryEligible(billingCountry)) { 206 smsConsentWrapper.slideUp(); 207 smsCheckbox.prop("checked", false); 208 smsPhoneInput.prop("required", false).val(""); 209 } else { 210 smsConsentWrapper.slideDown(); 211 } 212 } 213 214 function toggleSmsPhone() { 215 if (smsCheckbox.is(":checked")) { 216 smsPhoneWrapper.slideDown(); 217 smsPhoneInput.prop("required", true); 218 } else { 219 smsPhoneWrapper.slideUp(); 220 smsPhoneInput.prop("required", false).val(""); 221 } 222 } 223 224 smsCheckbox.on("change", toggleSmsPhone); 225 toggleSmsPhone(); 226 227 // Watch for billing country changes 228 $("#billing_country").on("change", checkBillingCountry); 229 $(document.body).on("updated_checkout", checkBillingCountry); 230 checkBillingCountry(); 231 232 // Validation on checkout 233 $("form.checkout").on("checkout_place_order", function() { 234 if (smsCheckbox.is(":checked") && !smsPhoneInput.val().trim()) { 235 alert("' . esc_js(__('Please enter a phone number for SMS consent.', 'mailchimp-for-woocommerce')) . '"); 236 smsPhoneInput.focus(); 237 return false; 238 } 239 return true; 240 }); 241 }); 242 </script>'; 243 244 echo apply_filters('mailchimp_woocommerce_sms_consent_field', $sms_html, $sms_status, $sms_label); 245 } 246 247 /** 248 * Check if SMS marketing is enabled 249 * 250 * @return bool 251 */ 252 public function isSmsEnabled() 253 { 254 return (bool) $this->getOption('mailchimp_sms_enabled', false); 255 } 256 257 /** 258 * Check if merchant has an approved SMS application 259 * 260 * @return bool 261 */ 262 public function merchantHasSmsApproved() 263 { 264 try { 265 if (!mailchimp_is_configured()) { 266 return false; 267 } 268 $list_id = mailchimp_get_list_id(); 269 if (!$list_id) { 270 return false; 271 } 272 $api = mailchimp_get_api(); 273 $sms_status = $api->getCachedSmsApplicationStatus($list_id); 274 return $sms_status && !empty($sms_status['enabled']); 275 } catch (Exception $e) { 276 return false; 277 } 278 } 279 280 /** 281 * Get SMS sending countries for the merchant 282 * 283 * @return array 284 */ 285 public function getSmsSendingCountries() 286 { 287 try { 288 if (!mailchimp_is_configured()) { 289 return array(); 290 } 291 $list_id = mailchimp_get_list_id(); 292 if (!$list_id) { 293 return array(); 294 } 295 $api = mailchimp_get_api(); 296 $sms_status = $api->getCachedSmsApplicationStatus($list_id); 297 if ($sms_status && !empty($sms_status['sending_countries'])) { 298 return $sms_status['sending_countries']; 299 } 300 return array(); 301 } catch (Exception $e) { 302 return array(); 303 } 304 } 305 306 /** 307 * Check if a country is eligible for SMS 308 * 309 * @param string $country_code 2-letter country code 310 * @return bool 311 */ 312 public function isCountryEligibleForSms($country_code) 313 { 314 $sending_countries = $this->getSmsSendingCountries(); 315 if (empty($sending_countries)) { 316 // If no countries configured, allow all (graceful fallback) 317 return true; 318 } 319 return in_array(strtoupper($country_code), $sending_countries, true); 320 } 321 322 /** 323 * Get the audience name for disclaimer 324 * 325 * @return string 326 */ 327 protected function getAudienceName() 328 { 329 try { 330 if (!mailchimp_is_configured()) { 331 return ''; 332 } 333 $list_id = mailchimp_get_list_id(); 334 if (!$list_id) { 335 return ''; 336 } 337 $api = mailchimp_get_api(); 338 $list = $api->getList($list_id); 339 return isset($list['name']) ? $list['name'] : ''; 340 } catch (Exception $e) { 341 return ''; 111 342 } 112 343 } … … 119 350 { 120 351 $this->handleStatus($order_id); 352 $this->handleSmsStatus($order_id); 121 353 } 122 354 … … 127 359 { 128 360 $this->handleStatus($order->get_id()); 361 $this->handleSmsStatus($order->get_id()); 129 362 } 130 363 … … 141 374 142 375 $this->handleStatus(); 376 $this->handleSmsStatus(); 143 377 } 144 378 … … 175 409 return false; 176 410 } 411 412 /** 413 * Handle SMS subscription status from classic checkout 414 * 415 * @param null $order_id 416 * @return bool 417 */ 418 protected function handleSmsStatus($order_id = null) 419 { 420 // Check if SMS is enabled 421 if (!$this->isSmsEnabled()) { 422 return false; 423 } 424 425 $sms_checkbox_key = 'mailchimp_woocommerce_sms_subscribe'; 426 $sms_phone_key = 'mailchimp_woocommerce_sms_phone'; 427 $sms_subscribed_meta = 'mailchimp_woocommerce_sms_subscribed'; 428 $sms_phone_meta = 'mailchimp_woocommerce_sms_phone'; 429 $logged_in = is_user_logged_in(); 430 431 // Get SMS consent status from POST 432 $sms_subscribed = isset($_POST[$sms_checkbox_key]) ? (bool) $_POST[$sms_checkbox_key] : false; 433 $sms_phone = isset($_POST[$sms_phone_key]) ? sanitize_text_field($_POST[$sms_phone_key]) : ''; 434 435 // Sanitize phone number - keep only + and digits 436 $sms_phone = preg_replace('/[^\+\d]/', '', $sms_phone); 437 438 // If they didn't check the box or didn't provide a phone, don't save anything 439 if (!$sms_subscribed || empty($sms_phone)) { 440 return false; 441 } 442 443 // Update order meta 444 if ($order_id) { 445 MailChimp_WooCommerce_HPOS::update_order_meta($order_id, $sms_subscribed_meta, true); 446 MailChimp_WooCommerce_HPOS::update_order_meta($order_id, $sms_phone_meta, $sms_phone); 447 } 448 449 // Update user meta if logged in 450 if ($logged_in) { 451 update_user_meta(get_current_user_id(), $sms_subscribed_meta, true); 452 update_user_meta(get_current_user_id(), $sms_phone_meta, $sms_phone); 453 } 454 455 return true; 456 } 457 458 /** 459 * Get SMS subscription data from order 460 * 461 * @param int $order_id 462 * @return array|false 463 */ 464 public static function getSmsDataFromOrder($order_id) 465 { 466 $wc_order = wc_get_order($order_id); 467 if (!$wc_order) { 468 return false; 469 } 470 471 $sms_subscribed = $wc_order->get_meta('mailchimp_woocommerce_sms_subscribed'); 472 $sms_phone = $wc_order->get_meta('mailchimp_woocommerce_sms_phone'); 473 474 if (!$sms_subscribed || empty($sms_phone)) { 475 return false; 476 } 477 478 return array( 479 'subscribed' => (bool) $sms_subscribed, 480 'phone' => $sms_phone, 481 ); 482 } 483 484 /** 485 * Get SMS subscription data from user 486 * 487 * @param int $user_id 488 * @return array|false 489 */ 490 public static function getSmsDataFromUser($user_id) 491 { 492 $sms_subscribed = get_user_meta($user_id, 'mailchimp_woocommerce_sms_subscribed', true); 493 $sms_phone = get_user_meta($user_id, 'mailchimp_woocommerce_sms_phone', true); 494 495 if (!$sms_subscribed || empty($sms_phone)) { 496 return false; 497 } 498 499 return array( 500 'subscribed' => (bool) $sms_subscribed, 501 'phone' => $sms_phone, 502 ); 503 } 177 504 } -
mailchimp-for-woocommerce/trunk/includes/class-mailchimp-woocommerce-rest-api.php
r3273692 r3457552 1026 1026 // this is just a safeguard against people trying to do wonky things. 1027 1027 if (!in_array($key, $allowed_keys, true)) { 1028 mailchimp_log('authorize', "invalid token type: {$key}"); 1028 1029 wp_send_json_error(array('message' => 'unauthorized token type'), 403); 1029 1030 } … … 1036 1037 // or the token doesn't equal the saved token, throw an error. 1037 1038 if (empty($token) || empty($saved) || ($token !== $saved && base64_decode($token) !== $saved)) { 1039 mailchimp_log('authorize', "unauthorized access on subscriber sync"); 1038 1040 wp_send_json_error(array('message' => 'unauthorized'), 403); 1039 1041 } … … 1054 1056 // if we don't have 2 items, that's invalid 1055 1057 if (count($parts) !== 2) { 1058 mailchimp_debug('authorize', "token invalid format", ['token_present' => !empty($token)]); 1056 1059 wp_send_json_error(array('message' => 'unauthorized'), 403); 1057 1060 } … … 1062 1065 $api_key = $wpdb->get_row( $sql ); 1063 1066 if (empty($api_key)) { 1067 mailchimp_debug('authorize', "token not found", ['token_present' => !empty($token)]); 1064 1068 wp_send_json_error(array('message' => 'unauthorized'), 403); 1065 1069 } -
mailchimp-for-woocommerce/trunk/includes/class-mailchimp-woocommerce-service.php
r3433839 r3457552 282 282 283 283 // if they had the checkbox checked - go ahead and subscribe them if this is the first post. 284 //$handler->setStatus($this->cart_subscribe);284 $handler->setStatus($this->cart_subscribe); 285 285 $handler->prepend_to_queue = true; 286 286 mailchimp_handle_or_queue($handler); -
mailchimp-for-woocommerce/trunk/includes/class-mailchimp-woocommerce.php
r3355528 r3457552 131 131 132 132 $this->activateMailChimpNewsletter(); 133 $this->activateMailchimpSmsConsent(); 133 134 $this->activateMailChimpService(); 134 135 $this->applyQueryStringOverrides(); … … 357 358 } 358 359 } 360 361 private function activateMailchimpSmsConsent() 362 { 363 $sms_consent = MailChimp_Sms_Consent::instance(); 364 365 if ($this->is_configured && $sms_consent->isConfigured()) { 366 $sms_consent->setEnvironment($this->environment); 367 $sms_consent->setVersion($this->version); 368 369 $render_on = $sms_consent->getOption('mailchimp_sms_consent_checkbox_action', 'woocommerce_after_checkout_billing_form'); 370 $sms_consent_allowed = MailChimp_Sms_Consent::isAllowedToUse(); 371 372 if ($sms_consent_allowed) { 373 $this->loader->add_action($render_on, $sms_consent, 'applyField'); 374 375 $this->loader->add_action('woocommerce_checkout_order_processed', $sms_consent, 'processSmsConsentField', 10, 2); 376 $this->loader->add_action('woocommerce_ppe_do_payaction', $sms_consent, 'processPayPalSmsConsentField'); 377 } 378 } 379 } 359 380 360 381 /** -
mailchimp-for-woocommerce/trunk/includes/processes/class-mailchimp-woocommerce-cart-update.php
r3355528 r3457552 156 156 } catch (Exception $e) { 157 157 158 // this error is for first time contacts not existing on the audience. 159 if (mailchimp_string_contains($e->getMessage(), ['not found in audience'])) { 160 $list_id = mailchimp_get_list_id(); 161 $email = $customer->getEmailAddress(); 162 mailchimp_debug('abandoned_cart.error', "Contact {$email} was not found in audience during cart update, adding to audience and retrying."); 163 $subscriber = $api->update($list_id, $email, 'transactional', [], null, null); 164 if ($subscriber) { 165 // if the post is successful we're all good. 166 $api->addCart($store_id, $cart, false); 167 mailchimp_log('abandoned_cart.success', "email: {$customer->getEmailAddress()} was added to the audience during checkout"); 168 return true; 169 } 170 } 171 158 172 mailchimp_error('abandoned_cart.error', "email: {$customer->getEmailAddress()} :: attempting product update :: {$e->getMessage()}"); 159 173 … … 176 190 177 191 // Maybe sync subscriber to set correct member.language 178 // TODO this function is doing nothing except pushing the log message with no actual process 179 mailchimp_member_data_update($this->email, $this->user_language, 'cart'); 192 // Pass subscriber status if user opted in via newsletter checkbox 193 $subscriber_status = $this->status ? 'subscribed' : 'transactional'; 194 mailchimp_member_data_update($this->email, $this->user_language, 'cart', $subscriber_status); 180 195 181 196 } catch (MailChimp_WooCommerce_RateLimitError $e) { -
mailchimp-for-woocommerce/trunk/includes/processes/class-mailchimp-woocommerce-single-customer.php
r3433839 r3457552 89 89 $customer->fromArray($data); 90 90 91 92 // Retrieve and set SMS consent data if user exists 93 if ($wordpress_user_id && $user) { 94 $sms_consent = get_user_meta($wordpress_user_id, 'mailchimp_woocommerce_sms_consent_subscribed', true); 95 $sms_phone = get_user_meta($wordpress_user_id, 'mailchimp_woocommerce_sms_consent_phone', true); 96 97 if ($sms_consent && !empty($sms_phone)) { 98 $customer->setSmsOptInStatus($sms_consent); 99 $customer->setPhoneNumber($sms_phone); 100 } 101 } 91 102 // set the address from the customer lookup table 92 103 $customer->getAddress()->setCity($this->customer_data->city ?? ''); -
mailchimp-for-woocommerce/trunk/includes/processes/class-mailchimp-woocommerce-single-order.php
r3433839 r3457552 25 25 protected $is_amazon_order = false; 26 26 protected $is_privacy_restricted = false; 27 /** 28 * @var null|WC_Order|WC_Order_Refund 29 */ 30 protected $woo_order = null; 31 32 /** 33 * MailChimp_WooCommerce_Single_Order constructor. 34 * 35 * @param null $id 36 * @param null $cart_session_id 37 * @param null $landing_site 38 * @param null $user_language 39 * @param null $gdpr_fields 40 */ 27 /** @var bool */ 28 // this is going to be a flag to run different code paths without refactoring everything yet 29 protected $using_new_audience_flow = true; 30 31 /** 32 * @var null|WC_Order|WC_Order_Refund 33 */ 34 protected $woo_order = null; 35 36 /** 37 * MailChimp_WooCommerce_Single_Order constructor. 38 * 39 * @param null $id 40 * @param null $cart_session_id 41 * @param null $landing_site 42 * @param null $user_language 43 * @param null $gdpr_fields 44 */ 41 45 public function __construct($id = null, $cart_session_id = null, $landing_site = null, $user_language = null, $gdpr_fields = null) 42 46 { … … 59 63 } 60 64 61 /**62 * @param $is_full_sync63 *64 * @return $this65 */65 /** 66 * @param $is_full_sync 67 * 68 * @return $this 69 */ 66 70 public function set_full_sync($is_full_sync) 67 71 { … … 71 75 } 72 76 73 /**74 * @return false75 * @throws MailChimp_WooCommerce_Error76 * @throws MailChimp_WooCommerce_RateLimitError77 * @throws MailChimp_WooCommerce_ServerError78 */77 /** 78 * @return false 79 * @throws MailChimp_WooCommerce_Error 80 * @throws MailChimp_WooCommerce_RateLimitError 81 * @throws MailChimp_WooCommerce_ServerError 82 */ 79 83 public function handle() 80 84 { … … 83 87 } 84 88 85 /**86 * @return false87 * @throws MailChimp_WooCommerce_Error88 * @throws MailChimp_WooCommerce_RateLimitError89 * @throws MailChimp_WooCommerce_ServerError90 */89 /** 90 * @return false 91 * @throws MailChimp_WooCommerce_Error 92 * @throws MailChimp_WooCommerce_RateLimitError 93 * @throws MailChimp_WooCommerce_ServerError 94 */ 91 95 public function process() 92 96 { … … 98 102 $store_id = mailchimp_get_store_id(); 99 103 100 // this will set the woo_order variable or return false.104 // this will set the woo_order variable or return false. 101 105 if (!($woo_order_number = $this->getRealOrderNumber())) { 102 106 mailchimp_log('order_submit.failure', "There is no real order number to use for order ID {$this->id}."); … … 105 109 106 110 $order_post_type_list = apply_filters( 'mailchimp_should_push_order_post_type_list', [ 107 'shop_order'111 'shop_order' 108 112 ]); 109 113 … … 113 117 } 114 118 115 $wordpress_user_id = $this->woo_order->get_user_id();116 $user = $wordpress_user_id ? get_user_by( 'ID', $wordpress_user_id ) : false;117 118 if ( $user ) {119 $restricted_roles = array('administrator');120 $allowed_roles = array();121 $allowed_roles = apply_filters('mailchimp_campaign_user_roles', $allowed_roles );122 if ( ( count( $allowed_roles ) && count( array_intersect( $allowed_roles, $user->roles ) ) === 0 ) || ( count( array_intersect( $restricted_roles, $user->roles ) ) !== 0 ) ) {123 mailchimp_log( 'order_process', "Order #{$woo_order_number} skipped, user #{$this->woo_order->get_user_id()} user role is not in the list" );124 return false;125 }126 }119 $wordpress_user_id = $this->woo_order->get_user_id(); 120 $user = $wordpress_user_id ? get_user_by( 'ID', $wordpress_user_id ) : false; 121 122 if ( $user ) { 123 $restricted_roles = array('administrator'); 124 $allowed_roles = array(); 125 $allowed_roles = apply_filters('mailchimp_campaign_user_roles', $allowed_roles ); 126 if ( ( count( $allowed_roles ) && count( array_intersect( $allowed_roles, $user->roles ) ) === 0 ) || ( count( array_intersect( $restricted_roles, $user->roles ) ) !== 0 ) ) { 127 mailchimp_log( 'order_process', "Order #{$woo_order_number} skipped, user #{$this->woo_order->get_user_id()} user role is not in the list" ); 128 return false; 129 } 130 } 127 131 128 132 if ($this->is_full_sync) { … … 164 168 165 169 if (!$this->is_admin_save && $new_order && $this->is_update === true) { 166 mailchimp_log('order_submit.filter', "Order ID {$this->id} was new, but skipping because this job was supposed to be an update.");170 mailchimp_log('order_submit.filter', "Order ID {$this->id} was new, but skipping because this job was supposed to be an update."); 167 171 return false; 168 172 } … … 174 178 } 175 179 176 $email = null;180 $email = null; 177 181 178 182 try { … … 188 192 // all subscriber logic has now been changed 189 193 190 $original_woo_status = $order->getOriginalWooStatus();194 $original_woo_status = $order->getOriginalWooStatus(); 191 195 192 196 // don't allow this to happen. … … 218 222 $current_status = null; 219 223 220 // for live traffic, if the customer was not opted in, and we should only submit subscribers: return false224 // for live traffic, if the customer was not opted in, and we should only submit subscribers: return false 221 225 if (!$this->is_full_sync && (!$order->getCustomer()->getOptInStatus() && mailchimp_submit_subscribed_only())) { 222 226 mailchimp_debug('filter', "#{$woo_order_number} was blocked due to subscriber only settings and current mailchimp status was {$current_status}"); … … 274 278 275 279 // only do this stuff on new orders 276 // apply the landing site if we have one.277 if ( $new_order && ! empty( $this->landing_site ) ) {278 $log .= ' :: landing site ' . $this->landing_site;279 $order->setLandingSite($this->landing_site);280 }280 // apply the landing site if we have one. 281 if ( $new_order && ! empty( $this->landing_site ) ) { 282 $log .= ' :: landing site ' . $this->landing_site; 283 $order->setLandingSite($this->landing_site); 284 } 281 285 282 286 if ($this->is_full_sync) { … … 305 309 306 310 mailchimp_debug('order_submit', " #{$woo_order_number}", $order->toArray()); 311 312 $status_if_new = $order->getCustomer()->getOptInStatus() ? 'subscribed' : 'transactional'; 313 314 // if we're using the new audience flow the contact needs to be created or updated first. 315 if ($this->using_new_audience_flow && !$this->is_full_sync) { 316 mailchimp_member_data_update($email, $this->user_language, 'order', $status_if_new, $order, $this->gdpr_fields, true); 317 // Sync SMS consent if available 318 $user_id = $this->woo_order ? $this->woo_order->get_user_id() : null; 319 mailchimp_member_sms_update($email, $this->id, $user_id, 'order', $status_if_new); 320 } 307 321 308 322 try { … … 331 345 } 332 346 333 // log the campaign id if we have this value from the API response. 334 if ( $new_order && $api_response instanceof MailChimp_WooCommerce_Order ) { 335 if (($campaign_id = $api_response->getCampaignId()) && !empty($campaign_id)) { 336 $log .= " :: campaign id {$campaign_id}"; 337 } 338 } 339 340 $status_if_new = $order->getCustomer()->getOptInStatus() ? 'subscribed' : 'transactional'; 347 // log the campaign id if we have this value from the API response. 348 if ( $new_order && $api_response instanceof MailChimp_WooCommerce_Order ) { 349 if (($campaign_id = $api_response->getCampaignId()) && !empty($campaign_id)) { 350 $log .= " :: campaign id {$campaign_id}"; 351 } 352 } 341 353 342 354 // if this is not currently in mailchimp - and we have the saved GDPR fields from … … 347 359 348 360 // Maybe sync subscriber to set correct member.language 349 if (!$this->is_full_sync ) {361 if (!$this->is_full_sync && !$this->using_new_audience_flow) { 350 362 mailchimp_member_data_update($email, $this->user_language, 'order', $status_if_new, $order, $this->gdpr_fields, true); 363 364 // Sync SMS consent if available 365 $user_id = $this->woo_order ? $this->woo_order->get_user_id() : null; 366 mailchimp_member_sms_update($email, $this->id, $user_id, 'order', $status_if_new); 351 367 } 352 368 … … 406 422 { 407 423 try { 408 $this->woo_order = null;409 $this->woo_order_number = false;424 $this->woo_order = null; 425 $this->woo_order_number = false; 410 426 if (empty($this->id)) { 411 427 return false; 412 428 } 413 429 if ( !($woo = MailChimp_WooCommerce_HPOS::get_order($this->id)) ) { 414 mailchimp_log('order_sync.failure', "Order #{$this->id}. Can’t submit order without a valid ID");415 return false;416 } 417 $this->woo_order = $woo;430 mailchimp_log('order_sync.failure', "Order #{$this->id}. Can’t submit order without a valid ID"); 431 return false; 432 } 433 $this->woo_order = $woo; 418 434 return $this->woo_order_number = $this->woo_order->get_order_number(); 419 435 } catch (Exception $e) { 420 $this->woo_order = null;436 $this->woo_order = null; 421 437 $this->woo_order_number = false; 422 438 mailchimp_error('order_sync.failure', mailchimp_error_trace($e, "{$this->id} could not be loaded")); … … 451 467 } 452 468 } 453 -
mailchimp-for-woocommerce/trunk/includes/processes/class-mailchimp-woocommerce-single-product-category.php
r3255434 r3457552 90 90 $synced_products = $this->api()->syncProductsToCollection(mailchimp_get_store_id(), $category->getId(), $product_ids); 91 91 92 $failed_product_ids = $synced_products['failed_product_ids'] ?? []; 93 92 94 mailchimp_debug('product_category.products_sync', "Synced products to category #{$this->id}", [ 93 95 'products' => $synced_products['products'], 94 'failed_product_ids' => $ synced_products['failed_product_ids']96 'failed_product_ids' => $failed_product_ids 95 97 ]); 96 98 97 if (count($ synced_products['failed_product_ids']) > 0) {99 if (count($failed_product_ids) > 0) { 98 100 if ($this->handle_failed_products) { 99 $this->handleFailedProductsSync($ synced_products['failed_product_ids']);101 $this->handleFailedProductsSync($failed_product_ids); 100 102 } else { 101 103 mailchimp_debug('product_category.products_sync', 'Failed to resync products', [ 102 'failed_product_ids' => $ synced_products['failed_product_ids']104 'failed_product_ids' => $failed_product_ids 103 105 ]); 104 106 } -
mailchimp-for-woocommerce/trunk/includes/processes/class-mailchimp-woocommerce-subscriber-sync.php
r3141736 r3457552 23 23 public function handle() 24 24 { 25 mailchimp_debug('subscriber_sync', "tracing mailchimp post", array('data' => $this->data)); 25 if (defined('MAILCHIMP_DEBUG') && MAILCHIMP_DEBUG === true) { 26 mailchimp_debug('subscriber_sync', "tracing mailchimp post", array('data' => $this->data)); 27 } 26 28 27 29 try { … … 50 52 return false; 51 53 } 54 55 // Check if this is an SMS event 56 $is_sms_event = in_array($hook_type, array('sms_subscribe', 'sms_unsubscribe')); 57 58 if ($is_sms_event) { 59 if (empty($email) && array_key_exists('merges', $data) && array_key_exists('EMAIL', $data['merges'])) { 60 $email = $data['merges']['EMAIL']; 61 } 62 // Handle SMS subscription events 63 return $this->handleSmsEvent($hook_type, $data, $email); 64 } 65 52 66 // if hook type is 'subscribe' that means we need ot subscribe them 53 67 $subscribe = $hook_type === 'subscribe'; … … 128 142 $data = isset($this->data['data']) ? $this->data['data'] : []; 129 143 $failed = false; 130 $allowed_hooks = array('subscribe' => true, 'unsubscribe' => true,); 144 // Include SMS webhook types 145 $allowed_hooks = array( 146 'subscribe' => true, 147 'unsubscribe' => true, 148 'sms_subscribe' => true, 149 'sms_unsubscribe' => true, 150 ); 151 131 152 if (!is_string($hook_type) || !isset($allowed_hooks[$hook_type])) { 132 153 $failed = true; … … 143 164 * @throws MailChimp_WooCommerce_ServerError 144 165 */ 145 private function createNewCustomer($email )166 private function createNewCustomer($email, $sms = null) 146 167 { 147 168 $member = mailchimp_get_api()->member(mailchimp_get_list_id(), $email); 148 169 $first_name = !empty($member['merge_fields']['FNAME']) ? $member['merge_fields']['FNAME'] : 'Guest'; 149 170 $last_name = !empty($member['merge_fields']['LNAME']) ? $member['merge_fields']['LNAME'] : 'Customer'; 171 $sms_phone = !empty($member['merge_fields']['SMSPHONE']) ? $member['merge_fields']['SMSPHONE'] : null; 150 172 if (empty($first_name)) $first_name = null; 151 173 if (empty($last_name)) $last_name = null; 152 // TODO maybe use the registration method and keep a record for when the user is verified later 174 153 175 $user = wp_create_user(strtolower($email), wp_generate_password(), strtolower($email)); 154 176 // subscribe them because this function only runs for subscribers. … … 162 184 )); 163 185 } 186 if (empty($sms) && !empty($sms_phone)) { 187 $sms = $sms_phone; 188 } 189 if (!empty($sms)) { 190 // Update user meta for SMS subscription status 191 update_user_meta($user, 'mailchimp_woocommerce_sms_consent_subscribed', '1'); 192 update_user_meta($user, 'mailchimp_woocommerce_sms_consent_phone', $sms); 193 mailchimp_log('webhook', "CREATED CUSTOMER with SMS and email :: {$email} :: {$sms} :: {$first_name} {$last_name}"); 194 return $user; 195 } 164 196 mailchimp_log('webhook', "CREATED CUSTOMER :: {$email} :: {$first_name} {$last_name}"); 165 197 return $user; … … 203 235 return false; 204 236 } 237 238 /** 239 * Handle SMS subscribe/unsubscribe webhook events from Mailchimp 240 * 241 * @param string $hook_type The webhook event type (sms_subscribe or sms_unsubscribe) 242 * @param array $data The webhook payload data 243 * @param string $email The contact's email address 244 * @return bool 245 */ 246 private function handleSmsEvent($hook_type, $data, $email) 247 { 248 $sms_subscribe = $hook_type === 'sms_subscribe'; 249 250 // Extract SMS phone number from webhook data 251 $sms_phone = ''; 252 if (isset($data['sms_phone_number'])) { 253 $sms_phone = $data['sms_phone_number']; 254 } elseif (isset($data['sms_channel']['sms_phone'])) { 255 $sms_phone = $data['sms_channel']['sms_phone']; 256 } 257 258 // Try to find the user by email 259 $user = get_user_by('email', $email); 260 261 if (!$user) { 262 // if we don't have a user by email 263 $user = $sms_subscribe && $this->shouldCreateNewCustomers() && $this->createNewCustomer($email, $sms_phone); 264 if ($user) return true; 265 mailchimp_log('webhook.sms', "SMS event for non-existent user :: {$hook_type} :: {$email}"); 266 return false; 267 } 268 269 try { 270 $hashed = md5(trim(strtolower($email))); 271 $handled_key = "sms_subscriber_sync.{$hashed}.handled"; 272 273 // Check if we've already handled this recently 274 $handled = mailchimp_get_transient($handled_key); 275 if ($handled === $sms_subscribe) { 276 mailchimp_log('webhook.sms', "SMS sync already handled for {$email}"); 277 return true; 278 } 279 280 // Update user meta for SMS subscription status 281 update_user_meta($user->ID, 'mailchimp_woocommerce_sms_consent_subscribed', $sms_subscribe); 282 283 // If subscribing and we have a phone number, store it 284 if ($sms_subscribe && !empty($sms_phone)) { 285 update_user_meta($user->ID, 'mailchimp_woocommerce_sms_consent_phone', $sms_phone); 286 } 287 288 // If unsubscribing, we keep the phone number but update the status 289 if (!$sms_subscribe) { 290 // Cache the unsubscribe to prevent re-subscription issues 291 mailchimp_set_transient("{$hashed}.sms_subscriber_sync", array( 292 'time' => time(), 293 'status' => false 294 ), 90); 295 } 296 297 // Cache the handled status 298 mailchimp_set_transient($handled_key, $sms_subscribe, 90); 299 300 mailchimp_log('webhook.sms', "SMS Subscriber Sync :: {$hook_type} :: {$email}", array( 301 'sms_subscribed' => $sms_subscribe, 302 'sms_phone' => $sms_phone, 303 'user_id' => $user->ID, 304 )); 305 306 return true; 307 } catch (Exception $e) { 308 mailchimp_error('webhook.sms', "SMS Subscriber Sync Error :: {$hook_type} :: {$email} :: " . $e->getMessage()); 309 return false; 310 } 311 } 205 312 } -
mailchimp-for-woocommerce/trunk/includes/processes/class-mailchimp-woocommerce-webhooks-sync.php
r3025229 r3457552 77 77 if ($href && mailchimp_string_contains($href, $rest_url)) { 78 78 if (!$disconnect && !empty($token) && mailchimp_string_contains($href, $token)) { 79 $this->skip_creation = true; 80 mailchimp_log('webhooks', "Verified webhook {$hook['id']}"); 81 continue; 79 if (array_key_exists('sms_subscribe', $hook['events']) && $hook['events']['sms_subscribe']) { 80 $this->skip_creation = true; 81 mailchimp_log('webhooks', "Verified webhook {$hook['id']}"); 82 continue; 83 } 82 84 } 83 85 $api->deleteWebhookByID($list, $hook['id']); -
mailchimp-for-woocommerce/trunk/languages/mc-woocommerce-newsletter.pot
r3355528 r3457552 1 # Copyright (C) 202 51 # Copyright (C) 2026 2 2 # This file is distributed under the same license as the package. 3 3 msgid "" … … 5 5 "Project-Id-Version: \n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/blocks\n" 7 "POT-Creation-Date: 202 5-08-20 08:03:29+00:00\n"7 "POT-Creation-Date: 2026-02-06 15:19:09+00:00\n" 8 8 "MIME-Version: 1.0\n" 9 9 "Content-Type: text/plain; charset=utf-8\n" 10 10 "Content-Transfer-Encoding: 8bit\n" 11 "PO-Revision-Date: 202 5-MO-DA HO:MI+ZONE\n"11 "PO-Revision-Date: 2026-MO-DA HO:MI+ZONE\n" 12 12 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" 13 13 "Language-Team: LANGUAGE <LL@li.org>\n" … … 27 27 28 28 #: woocommerce-blocks-integration.php:144 29 #: woocommerce-sms-blocks-integration.php:140 29 30 msgid "Checked by default" 30 31 msgstr "" 31 32 32 33 #: woocommerce-blocks-integration.php:145 34 #: woocommerce-sms-blocks-integration.php:141 33 35 msgid "Unchecked by default" 34 36 msgstr "" … … 37 39 msgid "Please select all the ways you would like to hear from us" 38 40 msgstr "" 41 42 #: woocommerce-sms-blocks-integration.php:130 43 msgid "Text me with news and offers" 44 msgstr "" 45 46 #: woocommerce-sms-blocks-integration.php:355 47 msgid "" 48 "By providing your phone number, you agree to receive promotional and " 49 "marketing messages, notifications, and customer service communications. " 50 "Message & data rates may apply. Consent is not a condition of purchase. " 51 "Message frequency may vary. You can unsubscribe at any time by replying " 52 "STOP." 53 msgstr "" -
mailchimp-for-woocommerce/trunk/mailchimp-woocommerce.php
r3433839 r3457552 17 17 * Plugin URI: https://mailchimp.com/connect-your-store/ 18 18 * Description: Connects WooCommerce to Mailchimp to sync your store data, send targeted campaigns to your customers, and sell more stuff. 19 * Version: 5.719 * Version: 6.0 20 20 * Author: Mailchimp 21 21 * Author URI: https://mailchimp.com … … 48 48 // make this a one liner for testing and code separation 49 49 include_once __DIR__ . '/blocks/newsletter.php'; 50 // SMS consent block for checkout 51 include_once __DIR__ . '/blocks/sms.php'; 50 52 51 53 add_action( 'before_woocommerce_init', function() { -
mailchimp-for-woocommerce/trunk/public/class-mailchimp-woocommerce-public.php
r3209992 r3457552 66 66 */ 67 67 public function enqueue_scripts() { 68 wp_register_script($this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/mailchimp-woocommerce-public.min.js', array(), $this->version.'.07'); 69 wp_localize_script($this->plugin_name, 'mailchimp_public_data', array( 70 'site_url' => site_url(), 71 'ajax_url' => admin_url('admin-ajax.php'), 72 'disable_carts' => mailchimp_carts_disabled(), 73 'subscribers_only' => mailchimp_carts_subscribers_only(), 74 'language' => substr( get_locale(), 0, 2 ), 68 $public_data = array( 69 'site_url' => site_url(), 70 'ajax_url' => admin_url('admin-ajax.php'), 71 'disable_carts' => mailchimp_carts_disabled(), 72 'subscribers_only' => mailchimp_carts_subscribers_only(), 73 'language' => substr( get_locale(), 0, 2 ), 75 74 'allowed_to_set_cookies' => mailchimp_allowed_to_use_cookie('mailchimp_user_email'), 76 )); 75 'sms_allowed_countries' => MailChimp_Sms_Consent::$allowedCountries 76 ); 77 wp_register_script($this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/mailchimp-woocommerce-public.min.js', array(), $this->version.'.08'); 78 wp_localize_script($this->plugin_name, 'mailchimp_public_data', $public_data); 77 79 78 80 // Enqueued script with localized data. 79 81 wp_enqueue_script($this->plugin_name, '', array(), $this->version, true); 82 83 $sms_consent_allowed = MailChimp_Sms_Consent::isAllowedToUse(); 84 85 if ($sms_consent_allowed) { 86 wp_register_script($this->plugin_name . '_sms_consent', plugin_dir_url( __FILE__ ) . 'js/mailchimp-woocommerce-sms-consent.min.js', array(), $this->version. '.07'); 87 wp_localize_script($this->plugin_name . '_sms_consent', 'mailchimp_public_data', $public_data); 88 wp_enqueue_script($this->plugin_name . '_sms_consent', '', array('jquery'), $this->version, true); 89 } 80 90 81 91 // if we have the "fragment" we can just inject this vs. loading the file -
mailchimp-for-woocommerce/trunk/public/js/mailchimp-woocommerce-public.js
r3355528 r3457552 202 202 var blockSubscribed = document.querySelector("#subscribe-to-newsletter"); 203 203 204 204 205 if (subscribed) { 205 206 subscribed.onchange = function() { … … 213 214 } 214 215 } 216 215 217 216 218 mailchimp_username_email = document.querySelector("#username"); -
mailchimp-for-woocommerce/trunk/public/js/mailchimp-woocommerce-public.min.js
r3209992 r3457552 1 var mailchimp,mailchimp_cart,mailchimp_billing_email,mailchimp_username_email,mailchimp_registration_email,mailchimp_submitted_email= !1,mailchimpReady=function(e){/in/.test(document.readyState)?setTimeout(() => {mailchimpReady(e)},9):e()};function mailchimpGetCurrentUserByHash(e){try{if(!mailchimp_public_data.allowed_to_set_cookies)return;var i=mailchimp_public_data.ajax_url+"?action=mailchimp_get_user_by_hash&hash="+e,a=new XMLHttpRequest;a.open("POST",i,!0),a.onload=function(){if(a.status>=200&&a.status<400){var e=JSON.parse(a.responseText);e&&mailchimp_cart.valueEmail(e.email)&&mailchimp_cart.setEmail(e.email)}},a.onerror=function(){console.log("mailchimp.get_email_by_hash.request.error",a.responseText)},a.setRequestHeader("Content-Type","application/json"),a.setRequestHeader("Accept","application/json"),a.send()}catch(t){console.log("mailchimp.get_email_by_hash.error",t)}}function mailchimpHandleBillingEmail(e){try{if(!mailchimp_public_data.allowed_to_set_cookies||mailchimp_public_data.disable_carts)return;var i=document.querySelector("#mailchimp_woocommerce_newsletter");i||(i=document.querySelector("#subscribe-to-newsletter")),e||(e="#billing_email");var a=document.querySelector(e),t=void 0!==a?a.value:"";if(!mailchimp_cart.valueEmail(t)||mailchimp_submitted_email===t)return!1;mailchimp_cart.setEmail(t),console.log(t),console.log(mailchimp_cart);var l=mailchimp_public_data.ajax_url+"?action=mailchimp_set_user_by_email",r=new XMLHttpRequest;return r.open("POST",l,!0),r.onload=function(){console.log(r);var e=r.status>=200&&r.status<400;e&&(mailchimp_submitted_email=t),console.log(e?"mailchimp.handle_billing_email.request.success":"mailchimp.handle_billing_email.request.error",r.responseText)},r.onerror=function(){console.log("mailchimp.handle_billing_email.request.error",r.responseText)},r.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),r.setRequestHeader("Accept","application/json"),r.send("email="+t+"&mc_language="+mailchimp_public_data.language+"&subscribed="+(i&&i.checked?"1":"0")),!0}catch(n){console.log("mailchimp.handle_billing_email.error",n),mailchimp_submitted_email=!1}}!function(){"use strict";var e,i,a,t;mailchimp={storage:(e=document,(a=function(e,i,t){return 1===arguments.length?a.get(e):a.set(e,i,t)}).get=function(i,t){return e.cookie!==a._cacheString&&a._populateCache(),void 0==a._cache[i]?t:a._cache[i]},a.defaults={path:"/",secure:!0,samesite:"strict"},a.set=function(t,l,r){switch(r={path:r&&r.path||a.defaults.path,domain:r&&r.domain||a.defaults.domain,expires:r&&r.expires||a.defaults.expires,secure:r&&r.secure!==i?r.secure:a.defaults.secure,samesite:r&&r.samesite||a.defaults.samesite},l===i&&(r.expires=-1),typeof r.expires){case"number":r.expires=new Date((new Date).getTime()+1e3*r.expires);break;case"string":r.expires=new Date(r.expires)}return t=encodeURIComponent(t)+"="+(l+"").replace(/[^!#-+\--:<-\[\]-~]/g,encodeURIComponent),t+=r.path?";path="+r.path:"",t+=r.domain?";domain="+r.domain:"",t+=r.expires?";expires="+r.expires.toGMTString():"",t+=r.secure?";secure":"",t+=r.samesite?";samesite="+r.samesite:"",e.cookie=t,a},a.expire=function(e,t){return a.set(e,i,t)},a._populateCache=function(){a._cache={};try{a._cacheString=e.cookie;for(var t=a._cacheString.split("; "),l=0;l<t.length;l++){var r=t[l].indexOf("="),n=decodeURIComponent(t[l].substr(0,r)),r=decodeURIComponent(t[l].substr(r+1));a._cache[n]===i&&(a._cache[n]=r)}}catch(m){console.log(m)}},a.enabled=(t="1"===a.set("cookies.js","1").get("cookies.js"),a.expire("cookies.js"),t),a),utils:{extend:function(e,i){for(var a in i||{})i.hasOwnProperty(a)&&(e[a]=i[a]);return e},getQueryStringVars:function(){var e=window.location.search||"",i=[],a={};if((e=e.substr(1)).length)for(var t in i=e.split("&")){var l=i[t];if("string"==typeof l){var r=l.split("="),n=r[0],m=r[1];n.length&&(void 0===a[n]&&(a[n]=[]),a[n].push(m))}}return a},unEscape:function(e){return decodeURIComponent(e)},escape:function(e){return encodeURIComponent(e)},createDate:function(e,i){e||(e=0);var a=new Date,t=i?a.getDate()-e:a.getDate()+e;return a.setDate(t),a},arrayUnique:function(e){for(var i=e.concat(),a=0;a<i.length;++a)for(var t=a+1;t<i.length;++t)i[a]===i[t]&&i.splice(t,1);return i},objectCombineUnique:function(e){for(var i=e[0],a=1;a<e.length;a++){var t=e[a];for(var l in t)i[l]=t[l]}return i}}},mailchimp_cart=new function e(){return this.email_types="input[type=email]",this.regex_email=/^([A-Za-z0-9_+\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/,this.current_email=null,this.previous_email=null,this.expireUser=function(){this.current_email=null,mailchimp_public_data.allowed_to_set_cookies&&mailchimp.storage.expire("mailchimp.cart.current_email")},this.expireSaved=function(){mailchimp_public_data.allowed_to_set_cookies&&mailchimp.storage.expire("mailchimp.cart.items")},this.setEmail=function(e){if(mailchimp_public_data.allowed_to_set_cookies){if(!this.valueEmail(e))return!1;this.setPreviousEmail(this.getEmail()),mailchimp.storage.set("mailchimp.cart.current_email",this.current_email=e)}},this.getEmail=function(){if(mailchimp_public_data.allowed_to_set_cookies){if(this.current_email)return this.current_email;var e=mailchimp.storage.get("mailchimp.cart.current_email",!1);return!!(e&&this.valueEmail(e))&&(this.current_email=e)}},this.setPreviousEmail=function(e){if(mailchimp_public_data.allowed_to_set_cookies){if(!this.valueEmail(e))return!1;mailchimp.storage.set("mailchimp.cart.previous_email",this.previous_email=e)}},this.valueEmail=function(e){return this.regex_email.test(e)},this}}(),mailchimpReady(function(){if(console.log("mailchimp ready"),mailchimp_public_data.allowed_to_set_cookies&&!mailchimp_public_data.disable_carts){if(void 0===e)var e={site_url:document.location.origin,defaulted:!0,ajax_url:document.location.origin+"/wp-admin?admin-ajax.php"};try{var i,a=mailchimp.utils.getQueryStringVars();void 0!==a.mc_cart_id&&mailchimpGetCurrentUserByHash(a.mc_cart_id);var t=document.querySelector("#mailchimp_woocommerce_newsletter"),l=document.querySelector("#subscribe-to-newsletter");t?t.onchange=function(){mailchimp_submitted_email=null,mailchimpHandleBillingEmail("#billing_email")}:l&&(l.onchange=function(){mailchimp_submitted_email=null,mailchimpHandleBillingEmail('#contact-fields input[type="email"]')}),mailchimp_username_email=document.querySelector("#username"),mailchimp_billing_email=document.querySelector("#billing_email"),mailchimp_registration_email=document.querySelector("#reg_email");var r=document.querySelector('#contact-fields input[type="email"]');mailchimp_billing_email&&(mailchimp_billing_email.onblur=function(){mailchimpHandleBillingEmail("#billing_email")},mailchimp_billing_email.onfocus=function(){mailchimpHandleBillingEmail("#billing_email")}),mailchimp_username_email&&(mailchimp_username_email.onblur=function(){mailchimpHandleBillingEmail("#username")},mailchimp_username_email.onfocus=function(){mailchimpHandleBillingEmail("#username")}),mailchimp_registration_email&&(mailchimp_registration_email.onblur=function(){mailchimpHandleBillingEmail("#reg_email")},mailchimp_registration_email.onfocus=function(){mailchimpHandleBillingEmail("#reg_email")}),r&&(r.onblur=function(){mailchimpHandleBillingEmail('#contact-fields input[type="email"]')},r.onfocus=function(){mailchimpHandleBillingEmail('#contact-fields input[type="email"]')},r.addEventListener("keyup",function(){i&&clearTimeout(i),i=setTimeout(function(){mailchimp_cart.valueEmail(r.value)&&mailchimpHandleBillingEmail('#contact-fields input[type="email"]')},2e3)}),r.addEventListener("keydown",function(){i&&clearTimeout(i)}))}catch(n){console.log("mailchimp ready error",n)}}});1 var mailchimp,mailchimp_cart,mailchimp_billing_email,mailchimp_username_email,mailchimp_registration_email,mailchimp_submitted_email=false,mailchimpReady=function(a){/in/.test(document.readyState)?setTimeout(()=>{mailchimpReady(a)},9):a()};function mailchimpGetCurrentUserByHash(a){try{if(!mailchimp_public_data.allowed_to_set_cookies)return;var b=mailchimp_public_data.ajax_url+"?action=mailchimp_get_user_by_hash&hash="+a,c=new XMLHttpRequest;c.open("POST",b,!0),c.onload=function(){if(c.status>=200&&c.status<400){var a=JSON.parse(c.responseText);if(!a)return;mailchimp_cart.valueEmail(a.email)&&mailchimp_cart.setEmail(a.email)}};c.onerror=function(){console.log("mailchimp.get_email_by_hash.request.error",c.responseText)};c.setRequestHeader("Content-Type","application/json");c.setRequestHeader("Accept","application/json");c.send()}catch(a){console.log("mailchimp.get_email_by_hash.error",a)}}function mailchimpHandleBillingEmail(selector){try{if(!mailchimp_public_data.allowed_to_set_cookies)return;if(mailchimp_public_data.disable_carts)return;var subscribed=document.querySelector("#mailchimp_woocommerce_newsletter");if(!subscribed)subscribed=document.querySelector("#subscribe-to-newsletter");if(!selector)selector="#billing_email";var a=document.querySelector(selector);var b=void 0!==a?a.value:"";if(!mailchimp_cart.valueEmail(b)||mailchimp_submitted_email===b){return false}mailchimp_cart.setEmail(b);var c=mailchimp_public_data.ajax_url+"?action=mailchimp_set_user_by_email";var d=new XMLHttpRequest;d.open("POST",c,!0);d.onload=function(){var successful=d.status>=200&&d.status<400;var msg=successful?"mailchimp.handle_billing_email.request.success":"mailchimp.handle_billing_email.request.error";if(successful){mailchimp_submitted_email=b}console.log(msg,d.responseText)};d.onerror=function(){console.log("mailchimp.handle_billing_email.request.error",d.responseText)};d.setRequestHeader("Content-Type","application/x-www-form-urlencoded");d.setRequestHeader("Accept","application/json");d.send("email="+b+"&mc_language="+mailchimp_public_data.language+"&subscribed="+(subscribed&&subscribed.checked?"1":"0"));return true}catch(a){console.log("mailchimp.handle_billing_email.error",a);mailchimp_submitted_email=!1}}!function(){"use strict";function mailchimpCart(){this.email_types="input[type=email]";this.regex_email=/^([A-Za-z0-9_+\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;this.current_email=null;this.previous_email=null;this.expireUser=function(){this.current_email=null;if(!mailchimp_public_data.allowed_to_set_cookies)return;mailchimp.storage.expire("mailchimp.cart.current_email")};this.expireSaved=function(){if(!mailchimp_public_data.allowed_to_set_cookies)return;mailchimp.storage.expire("mailchimp.cart.items")};this.setEmail=function(a){if(!mailchimp_public_data.allowed_to_set_cookies)return;if(!this.valueEmail(a))return false;this.setPreviousEmail(this.getEmail());mailchimp.storage.set("mailchimp.cart.current_email",this.current_email=a)};this.getEmail=function(){if(!mailchimp_public_data.allowed_to_set_cookies)return;if(this.current_email)return this.current_email;var a=mailchimp.storage.get("mailchimp.cart.current_email",!1);if(!a||!this.valueEmail(a))return false;return this.current_email=a};this.setPreviousEmail=function(a){if(!mailchimp_public_data.allowed_to_set_cookies)return;if(!this.valueEmail(a))return false;mailchimp.storage.set("mailchimp.cart.previous_email",this.previous_email=a)};this.valueEmail=function(a){return this.regex_email.test(a)};return this}var g={extend:function(a,b){for(var c in b||{})b.hasOwnProperty(c)&&(a[c]=b[c]);return a},getQueryStringVars:function(){var a=window.location.search||"",b=[],c={};if(a=a.substr(1),a.length){b=a.split("&");for(var d in b){var e=b[d];if("string"==typeof e){var f=e.split("="),g=f[0],h=f[1];g.length&&("undefined"==typeof c[g]&&(c[g]=[]),c[g].push(h))}}}return c},unEscape:function(a){return decodeURIComponent(a)},escape:function(a){return encodeURIComponent(a)},createDate:function(a,b){a||(a=0);var c=new Date,d=b?c.getDate()-a:c.getDate()+a;return c.setDate(d),c},arrayUnique:function(a){for(var b=a.concat(),c=0;c<b.length;++c)for(var d=c+1;d<b.length;++d)b[c]===b[d]&&b.splice(d,1);return b},objectCombineUnique:function(a){for(var b=a[0],c=1;c<a.length;c++){var d=a[c];for(var e in d)b[e]=d[e]}return b}},h=function(a,b){var c=function(a,b,d){return 1===arguments.length?c.get(a):c.set(a,b,d)};return c.get=function(b,d){return a.cookie!==c._cacheString&&c._populateCache(),void 0==c._cache[b]?d:c._cache[b]},c.defaults={path:"/",secure:true,samesite:"strict"},c.set=function(d,e,f){switch(f={path:f&&f.path||c.defaults.path,domain:f&&f.domain||c.defaults.domain,expires:f&&f.expires||c.defaults.expires,secure:f&&f.secure!==b?f.secure:c.defaults.secure,samesite:f&&f.samesite||c.defaults.samesite},e===b&&(f.expires=-1),typeof f.expires){case"number":f.expires=new Date((new Date).getTime()+1e3*f.expires);break;case"string":f.expires=new Date(f.expires)}return d=encodeURIComponent(d)+"="+(e+"").replace(/[^!#-+\--:<-\[\]-~]/g,encodeURIComponent),d+=f.path?";path="+f.path:"",d+=f.domain?";domain="+f.domain:"",d+=f.expires?";expires="+f.expires.toGMTString():"",d+=f.secure?";secure":"",d+=f.samesite?";samesite="+f.samesite:"",a.cookie=d,c},c.expire=function(a,d){return c.set(a,b,d)},c._populateCache=function(){c._cache={};try{c._cacheString=a.cookie;for(var d=c._cacheString.split("; "),e=0;e<d.length;e++){var f=d[e].indexOf("="),g=decodeURIComponent(d[e].substr(0,f)),f=decodeURIComponent(d[e].substr(f+1));c._cache[g]===b&&(c._cache[g]=f)}}catch(a){console.log(a)}},c.enabled=function(){var a="1"===c.set("cookies.js","1").get("cookies.js");return c.expire("cookies.js"),a}(),c}(document);mailchimp={storage:h,utils:g};mailchimp_cart=new mailchimpCart}();mailchimpReady(function(){if(!mailchimp_public_data.allowed_to_set_cookies)return;if(mailchimp_public_data.disable_carts)return;if(void 0===a){var a={site_url:document.location.origin,defaulted:!0,ajax_url:document.location.origin+"/wp-admin?admin-ajax.php"}}try{var b=mailchimp.utils.getQueryStringVars();void 0!==b.mc_cart_id&&mailchimpGetCurrentUserByHash(b.mc_cart_id);var subscribed=document.querySelector("#mailchimp_woocommerce_newsletter");var blockSubscribed=document.querySelector("#subscribe-to-newsletter");if(subscribed){subscribed.onchange=function(){mailchimp_submitted_email=null;mailchimpHandleBillingEmail("#billing_email")}}else if(blockSubscribed){blockSubscribed.onchange=function(){mailchimp_submitted_email=null;mailchimpHandleBillingEmail('#contact-fields input[type="email"]')}}mailchimp_username_email=document.querySelector("#username");mailchimp_billing_email=document.querySelector("#billing_email");mailchimp_registration_email=document.querySelector("#reg_email");var mailchimp_username_email_block=document.querySelector('#contact-fields input[type="email"]');if(mailchimp_billing_email){mailchimp_billing_email.onblur=function(){mailchimpHandleBillingEmail("#billing_email")};mailchimp_billing_email.onfocus=function(){mailchimpHandleBillingEmail("#billing_email")}}if(mailchimp_username_email){mailchimp_username_email.onblur=function(){mailchimpHandleBillingEmail("#username")};mailchimp_username_email.onfocus=function(){mailchimpHandleBillingEmail("#username")}}if(mailchimp_registration_email){mailchimp_registration_email.onblur=function(){mailchimpHandleBillingEmail("#reg_email")};mailchimp_registration_email.onfocus=function(){mailchimpHandleBillingEmail("#reg_email")}}if(mailchimp_username_email_block){mailchimp_username_email_block.onblur=function(){mailchimpHandleBillingEmail('#contact-fields input[type="email"]')};mailchimp_username_email_block.onfocus=function(){mailchimpHandleBillingEmail('#contact-fields input[type="email"]')};var typingTimer;mailchimp_username_email_block.addEventListener("keyup",function(){typingTimer&&clearTimeout(typingTimer);typingTimer=setTimeout(function(){if(mailchimp_cart.valueEmail(mailchimp_username_email_block.value)){mailchimpHandleBillingEmail('#contact-fields input[type="email"]')}},2e3)});mailchimp_username_email_block.addEventListener("keydown",function(){typingTimer&&clearTimeout(typingTimer)})}}catch(e){console.log("mailchimp ready error",e)}});
Note: See TracChangeset
for help on using the changeset viewer.